diff --git a/.env.example b/.env.example index be3163da5..b2dcabb16 100644 --- a/.env.example +++ b/.env.example @@ -69,7 +69,7 @@ LNBITS_EXTENSIONS_DEFAULT_INSTALL="tpos" # LNBITS_EXT_GITHUB_TOKEN=github_pat_xxxxxxxxxxxxxxxxxx # which fundingsources are allowed in the admin ui -# LNBITS_ALLOWED_FUNDING_SOURCES="VoidWallet, FakeWallet, CoreLightningWallet, CoreLightningRestWallet, LndRestWallet, EclairWallet, LndWallet, LnTipsWallet, LNPayWallet, LNbitsWallet, BlinkWallet, AlbyWallet, BarkWallet, ZBDWallet, PhoenixdWallet, OpenNodeWallet, NWCWallet, BreezSdkWallet, BoltzWallet, StrikeWallet, CLNRestWallet, SparkWallet, SparkL2Wallet" +# LNBITS_ALLOWED_FUNDING_SOURCES="VoidWallet, FakeWallet, CoreLightningWallet, CoreLightningRestWallet, LndRestWallet, EclairWallet, LndWallet, LnTipsWallet, LNPayWallet, LNbitsWallet, BlinkWallet, AlbyWallet, ZBDWallet, PhoenixdWallet, OpenNodeWallet, NWCWallet, BreezSdkWallet, BoltzWallet, StrikeWallet, CLNRestWallet, SparkWallet, SparkL2Wallet" # uvicorn variable, allow https behind a proxy # IMPORTANT: this also needs the webserver to be configured to forward the headers @@ -80,9 +80,6 @@ FORWARDED_ALLOW_IPS="*" # Inside this directory the `extensions` and `upgrades` sub-directories will be created. # LNBITS_EXTENSIONS_PATH="/path/to/some/dir" -# Path where WASM extensions will be installed (defaults to `LNBITS_DATA_FOLDER/wasm_extensions`). -# LNBITS_WASM_EXTENSIONS_PATH="/path/to/some/dir" - # ID of the super user. The user ID must exist. # SUPER_USER="" @@ -147,10 +144,6 @@ CLICHE_ENDPOINT=ws://127.0.0.1:12000 SPARK_URL=http://localhost:9737/rpc SPARK_TOKEN=myaccesstoken -# BarkWallet -BARK_API_ENDPOINT=http://localhost:3000 -BARK_API_TOKEN=auth_token - #CLNRest (using runes) CLNREST_URL=https://127.0.0.1:3010 CLNREST_CA=/home/lightningd/.lightning/bitcoin/ca.pem diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index 84e27eea0..f045d1910 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -7,6 +7,10 @@ on: description: 'The tag name for the release' required: true type: string + upload_url: + description: 'The upload URL for the release' + required: true + type: string workflow_dispatch: inputs: @@ -14,6 +18,10 @@ on: description: 'The tag name for the release' required: true type: string + upload_url: + description: 'The upload URL for the release' + required: true + type: string jobs: build-linux-package: @@ -105,6 +113,11 @@ jobs: shell: bash - name: Upload Linux Release Asset + uses: actions/upload-release-asset@v1 + with: + upload_url: ${{ inputs.upload_url }} + asset_path: ${{ env.APPIMAGE_NAME }} + asset_name: ${{ env.APPIMAGE_NAME }} + asset_content_type: application/octet-stream env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh release upload "${{ inputs.tag_name }}" "${{ env.APPIMAGE_NAME }}" --clobber diff --git a/.github/workflows/bundle.yml b/.github/workflows/bundle.yml index a67045f7f..6409d1ff9 100644 --- a/.github/workflows/bundle.yml +++ b/.github/workflows/bundle.yml @@ -10,16 +10,15 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.head_ref || github.event.pull_request.head.sha }} + ref: ${{ github.head_ref }} - uses: lnbits/lnbits/.github/actions/prepare@dev with: python-version: "3.10" node-version: "24.x" npm: true - - name: Build and commit bundle (same-repo PR) - if: github.event.pull_request.head.repo.full_name == github.repository + - run: make bundle + - name: Commit and push bundle changes run: | - make bundle git config user.name "alan" git config user.email "alan@lnbits.com" git add lnbits/static @@ -28,6 +27,3 @@ jobs: fi git commit -m "chore: make bundle [skip ci]" git push - - name: Check bundle is up-to-date (fork PR) - if: github.event.pull_request.head.repo.full_name != github.repository - run: make checkbundle diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8aa8bcc94..ea9af997c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,11 +64,6 @@ jobs: with: make: openapi - test-e2e: - if: ${{ false }} - needs: [ lint ] - uses: ./.github/workflows/e2e.yml - regtest: needs: [ lint ] uses: ./.github/workflows/regtest.yml diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml deleted file mode 100644 index 2cf395d1c..000000000 --- a/.github/workflows/e2e.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: e2e - -on: - workflow_call: - workflow_dispatch: - -jobs: - test-e2e: - name: test-e2e (${{ matrix.name }}) - runs-on: ubuntu-24.04 - strategy: - fail-fast: false - matrix: - include: - - name: bigpayment - spec: tests/e2e/bigpayment.spec.ts - - name: paysplit - spec: tests/e2e/paysplit.spec.ts - - name: pingpong - spec: tests/e2e/pingpong.spec.ts - - name: tips - spec: tests/e2e/tips.spec.ts - - steps: - - uses: actions/checkout@v4 - - uses: lnbits/lnbits/.github/actions/prepare@dev - with: - python-version: "3.12" - node-version: "24.x" - npm: true - - name: Install Playwright browser - run: npm exec playwright install chromium - - name: Run ${{ matrix.name }} e2e tests - run: npm run test:e2e -- "${{ matrix.spec }}" - - name: Upload Playwright report - if: always() - uses: actions/upload-artifact@v4 - with: - name: playwright-report-${{ matrix.name }} - path: test-reports - if-no-files-found: ignore diff --git a/.github/workflows/regtest.yml b/.github/workflows/regtest.yml index 53d0b95b6..17a03a453 100644 --- a/.github/workflows/regtest.yml +++ b/.github/workflows/regtest.yml @@ -66,7 +66,6 @@ jobs: BOLTZ_MNEMONIC: abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about LNBITS_MAX_OUTGOING_PAYMENT_AMOUNT_SATS: 1000000000 LNBITS_MAX_INCOMING_PAYMENT_AMOUNT_SATS: 1000000000 - LNBITS_FUNDING_SOURCE_PAY_INVOICE_WAIT_SECONDS: ${{ inputs.backend-wallet-class == 'CoreLightningRestWallet' && 60 || 5 }} ECLAIR_PASS: lnbits PYTHONUNBUFFERED: 1 DEBUG: true diff --git a/.github/workflows/release-rc.yml b/.github/workflows/release-rc.yml index 12fd0ffba..9bf71caac 100644 --- a/.github/workflows/release-rc.yml +++ b/.github/workflows/release-rc.yml @@ -12,6 +12,8 @@ jobs: release: runs-on: ubuntu-24.04 + outputs: + upload_url: ${{ steps.get_upload_url.outputs.upload_url }} steps: - uses: actions/checkout@v4 - name: Create github pre-release @@ -20,6 +22,14 @@ jobs: tag: ${{ github.ref_name }} run: | gh release create "$tag" --prerelease --generate-notes --draft + - id: get_upload_url + name: Get upload url of Github release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.ref_name }} + run: | + upload_url=$(gh release view "$tag" --json uploadUrl -q ".uploadUrl") + echo "upload_url=$upload_url" >> "$GITHUB_OUTPUT" docker: if: github.repository == 'lnbits/lnbits' @@ -64,3 +74,4 @@ jobs: uses: ./.github/workflows/appimage.yml with: tag_name: ${{ github.ref_name }} + upload_url: ${{ needs.release.outputs.upload_url }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index de16cd613..03b7a952a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,6 +13,8 @@ jobs: release: runs-on: ubuntu-24.04 + outputs: + upload_url: ${{ steps.get_upload_url.outputs.upload_url }} steps: - uses: actions/checkout@v4 - name: Create github release @@ -21,6 +23,14 @@ jobs: tag: ${{ github.ref_name }} run: | gh release create "$tag" --generate-notes --draft + - id: get_upload_url + name: Get upload url of Github release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.ref_name }} + run: | + upload_url=$(gh release view "$tag" --json uploadUrl -q ".uploadUrl") + echo "upload_url=$upload_url" >> "$GITHUB_OUTPUT" docker: if: github.repository == 'lnbits/lnbits' @@ -75,3 +85,4 @@ jobs: uses: ./.github/workflows/appimage.yml with: tag_name: ${{ github.ref_name }} + upload_url: ${{ needs.release.outputs.upload_url }} diff --git a/Dockerfile b/Dockerfile index a430c9bae..971b4c361 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,4 +43,4 @@ ENV LNBITS_HOST="0.0.0.0" EXPOSE 5000 -CMD ["sh", "-c", "uv --offline run --no-sync lnbits --port $LNBITS_PORT --host $LNBITS_HOST --forwarded-allow-ips='*'"] +CMD ["sh", "-c", "uv --offline run lnbits --port $LNBITS_PORT --host $LNBITS_HOST --forwarded-allow-ips='*'"] diff --git a/Makefile b/Makefile index 48b903281..283caf9db 100644 --- a/Makefile +++ b/Makefile @@ -62,10 +62,6 @@ test-api: DEBUG=true \ uv run pytest tests/api -test-e2e: - npm exec playwright install chromium - npm run test:e2e - test-regtest: LNBITS_DATA_FOLDER="./tests/data" \ PYTHONUNBUFFERED=1 \ @@ -93,36 +89,16 @@ migration: uv run python tools/conv.py openapi: - @OPENAPI_SPEC_FILE=$$(mktemp); \ - OPENAPI_DATA_DIR=$$(mktemp -d); \ LNBITS_ADMIN_UI=False \ LNBITS_BACKEND_WALLET_CLASS="FakeWallet" \ - LNBITS_DATA_FOLDER="$$OPENAPI_DATA_DIR" \ - LNBITS_EXTENSIONS_DEFAULT_INSTALL='[]' \ - LNBITS_EXTENSIONS_DEACTIVATE_ALL=true \ + LNBITS_DATA_FOLDER="./tests/data" \ PYTHONUNBUFFERED=1 \ - DEBUG=false \ HOST=0.0.0.0 \ PORT=5003 \ - uv run lnbits & \ - OPENAPI_SERVER_PID=$$!; \ - trap 'kill "$$OPENAPI_SERVER_PID" 2>/dev/null || true; wait "$$OPENAPI_SERVER_PID" 2>/dev/null || true; rm -f "$$OPENAPI_SPEC_FILE"; rm -rf "$$OPENAPI_DATA_DIR"' EXIT; \ - OPENAPI_ATTEMPT=0; \ - while [ "$$OPENAPI_ATTEMPT" -lt 60 ]; do \ - if curl --fail --silent --max-time 2 --output "$$OPENAPI_SPEC_FILE" \ - http://127.0.0.1:5003/openapi.json; then \ - uv run openapi-spec-validator --errors=all "$$OPENAPI_SPEC_FILE"; \ - exit $$?; \ - fi; \ - if ! kill -0 "$$OPENAPI_SERVER_PID" 2>/dev/null; then \ - echo "LNbits exited before serving the OpenAPI schema." >&2; \ - exit 1; \ - fi; \ - OPENAPI_ATTEMPT=$$((OPENAPI_ATTEMPT + 1)); \ - sleep 1; \ - done; \ - echo "LNbits did not serve the OpenAPI schema within 60 seconds." >&2; \ - exit 1 + uv run lnbits & + sleep 15 + curl -s http://0.0.0.0:5003/openapi.json | uv run openapi-spec-validator --errors=all - + # kill -9 %1 bak: # LNBITS_DATABASE_URL=postgres://postgres:postgres@0.0.0.0:5432/postgres diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 2d0d1b64b..000000000 --- a/SECURITY.md +++ /dev/null @@ -1,36 +0,0 @@ -# Security Policy - -## Supported Versions - -Security fixes are provided for the current released version of LNbits and the -`dev` branch. Older releases and release candidates are not supported unless a -maintainer explicitly states otherwise. - -| Version | Supported | -| ------------------ | --------- | -| Current release | Yes | -| `dev` branch | Yes | -| Older releases | No | -| Release candidates | No | - -## Reporting a Vulnerability - -Please report suspected vulnerabilities privately using [GitHub's private -vulnerability reporting](https://github.com/lnbits/lnbits/security/advisories/new). -Do not open a public issue, discussion, or pull request for a security -vulnerability. - -Include enough detail for maintainers to reproduce and assess the issue, such -as the affected version or commit, configuration, steps to reproduce, impact, -and any proof of concept. Do not include credentials, API keys, wallet data, or -other sensitive information unless it is necessary and can be shared safely. - -Maintainers will acknowledge the report, investigate it, and coordinate a fix -and disclosure timeline with you. Please allow time for a fix to be prepared -before publicly disclosing the vulnerability. - -## Scope - -This policy covers the LNbits core repository and LNbits extensions in the LNbits GitHub organisation. Vulnerabilities in third-party -funding sources, dependencies or hosted LNbits instances may need to be reported to their respective maintainers or -operators as well. diff --git a/docs/guide/admin_ui.md b/docs/guide/admin_ui.md index a1fa1c7c9..e3c0cf2b9 100644 --- a/docs/guide/admin_ui.md +++ b/docs/guide/admin_ui.md @@ -118,7 +118,7 @@ When set **at least one**, LNbits becomes private: only the listed users and Adm - **[Backend Wallets](./wallets.md)** — Explore options to fund your LNbits instance. - **[User Roles](./user_roles.md)** — Overview of existing roles in LNbits. - **[Funding sources](./funding-sources-table.md)** — What is available and how to configure each. -- **[Install LNbits](./installation.md)** — Choose your preferred way to install LNbits. +- **[Install LNBits](./installation.md)** — Choose your prefared way to install LNBits. ## Powered by LNbits diff --git a/docs/guide/funding-sources-table.md b/docs/guide/funding-sources-table.md index 420c791f5..f21127511 100644 --- a/docs/guide/funding-sources-table.md +++ b/docs/guide/funding-sources-table.md @@ -71,8 +71,8 @@ Spark L2 uses a local Node.js sidecar to expose an HTTP API that LNbits can use ## Additional Guides - **[Admin UI](./admin_ui.md)** — Manage server settings via a clean UI (avoid editing `.env` by hand). -- **[User Roles](./user_roles.md)** — Quick Overview of existing Roles in LNBits. -- **[Backend Wallets](./wallets.md)** — Explore options to fund your LNbits instance. +- **[User Roles](./User_Roles.md)** — Quick Overview of existing Roles in LNBits. +- **[Funding sources](./funding-sources_table.md)** — What’s available and how to enable/configure each. ## Powered by LNbits diff --git a/docs/guide/installation.md b/docs/guide/installation.md index 4ade1877e..bb351eafc 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -51,7 +51,7 @@ nav_order: 1 sudo apt-get install jq libfuse2 wget $(curl -s https://api.github.com/repos/lnbits/lnbits/releases/latest | jq -r '.assets[] | select(.name | endswith(".AppImage")) | .browser_download_url') -O LNbits-latest.AppImage chmod +x LNbits-latest.AppImage -LNBITS_ADMIN_UI=true HOST=0.0.0.0 PORT=5000 AUTH_HTTPS_ONLY=false ./LNbits-latest.AppImage # most system settings are now in the admin UI, but pass additional .env variables here +LNBITS_ADMIN_UI=true HOST=0.0.0.0 PORT=5000 ./LNbits-latest.AppImage # most system settings are now in the admin UI, but pass additional .env variables here ``` - LNbits will create a folder for DB and extension files **in the same directory** as the AppImage. @@ -285,7 +285,10 @@ but you can also set the env variables or pass command line arguments: ```sh # .env variables are currently passed when running, but LNbits can be managed with the admin UI. -LNBITS_ADMIN_UI=true AUTH_HTTPS_ONLY=false ./result/bin/lnbits --port 9000 --host 0.0.0.0 +LNBITS_ADMIN_UI=true ./result/bin/lnbits --port 9000 --host 0.0.0.0 + +# Once you have created a user, you can set as the super_user +SUPER_USER=be54db7f245346c8833eaa430e1e0405 LNBITS_ADMIN_UI=true ./result/bin/lnbits --port 9000 ``` > ![NOTE](https://img.shields.io/badge/NOTE-3b82f6?labelColor=494949) diff --git a/docs/guide/super_user.md b/docs/guide/super_user.md index 8aa8935c6..a6cef2d07 100644 --- a/docs/guide/super_user.md +++ b/docs/guide/super_user.md @@ -42,7 +42,7 @@ nav_order: 1 The **Super User** is the owner-operator account of an LNbits instance. Think of it as your “break glass” operator with a few capabilities that are intentionally reserved for the person ultimately responsible for the server and the funding rails. -The SU is created alongside the [Admin UI](./admin_ui.md) and is meant to keep environment operations pleasant in the UI while keeping the most sensitive knobs in trusted hands. +The SU is created alongside the [Admin UI](./admin_ui.md) and is meant to keep enviroment operations pleasant in the UI while keeping the most sensitive knobs in trusted hands. **Key SU capabilities** @@ -117,7 +117,7 @@ These are practical tips for running a safe and friendly instance. - **[Admin UI](./admin_ui.md)** — Manage server settings in the browser instead of editing `.env` or using the CLI for routine tasks. - **[User Roles](./user_roles.md)** — Overview of roles and what they can do. - **[Funding sources](./funding-sources-table.md)** — Available options and how to enable and configure them. -- **[Install LNbits](./installation.md)** — Choose your preferred way to install LNbits. +- **[Install LNBits](./installation.md)** — Choose your prefared way to install LNBits. ## Powered by LNbits diff --git a/docs/guide/wallets.md b/docs/guide/wallets.md index eb9bc4f6c..192389e48 100644 --- a/docs/guide/wallets.md +++ b/docs/guide/wallets.md @@ -41,7 +41,7 @@ A backend wallet is selected and configured entirely through LNbits environment | [CoreLightning REST](#corelightning-rest) | [LNbits](#lnbits) | [Alby](#alby) | | [Spark (Core Lightning)](#spark-core-lightning) | [LNPay](#lnpay) | [Boltz](#boltz) | | [Spark L2](#spark-l2) | [ZBD](#zbd) | [Phoenixd](#phoenixd) | -| [Cliche Wallet](#cliche-wallet) | [Bark](#bark) | | +| [Cliche Wallet](#cliche-wallet) | | | | [Breez SDK](#breez-sdk) | [Breez Liquid SDK](#breez-liquid-sdk) | [Nostr Wallet Connect](#nostr-wallet-connect-nwc) | | [Strike](#strike) | [Eclair (ACINQ)](#eclair-acinq) | [LN.tips](#lntips) | | [Fake Wallet](#fake-wallet) | | | @@ -127,22 +127,6 @@ Old REST interface using [RTL c-lightning-REST](https://github.com/Ride-The-Ligh - `SPARK_URL`: `http://10.147.17.230:9737/rpc` - `SPARK_TOKEN`: `secret_access_key` -## Bark - -This connects LNbits to an external [barkd](https://second.tech/docs/barkd) REST daemon. Initialize the Bark wallet before starting LNbits using `bark create`, then run `barkd` separately, keep its data directory persistent, and set `BARK_API_TOKEN` to the auth token from `~/.bark/auth_token`. - -**Required env vars** - -- `LNBITS_BACKEND_WALLET_CLASS`: `BarkWallet` -- `BARK_API_ENDPOINT`: `http://localhost:3000` -- `BARK_API_TOKEN`: `auth_token` - -Bark fee estimates can be higher than LNbits' default minimum routing fee reserve. If small outgoing payments fail with an error like `fee of 20000 msat exceeds limit of 5000 msat`, raise the minimum reserve fee under **Settings → Funding** or set: - -```bash -LNBITS_RESERVE_FEE_MIN=20000 -``` - ## Spark L2 Self-custodial funding source using the [Spark L2](https://docs.spark.money/start/overview) network. Requires a Node.js [sidecar](https://github.com/lnbits/spark_sidecar) that bridges lnbits talking to Spark. Works in addition with any Spark-compatible seed (Wallet of Satoshi, BuhoGO, BlitzWallet). @@ -213,7 +197,7 @@ uv run lnbits-cli encrypt macaroon ## LNPay -For the invoice listener to work you must have a publicly accessible URL in your LNbits and set up [LNPay webhooks](https://dashboard.lnpay.co/webhook/) pointing to `/wallet/webhook` with the event **Wallet Receive** and no secret. Example: `https://mylnbits.example/wallet/webhook`. +For the invoice listener to work you must have a publicly accessible URL in your LNbits and set up [LNPay webhooks](https://dashboard.lnpay.co/webhook/) pointing to `/wallet/webhook` with the event **Wallet Receive** and no secret. Example: [https://mylnbits/wallet/webhook](`https://mylnbits/wallet/webhook). **Required env vars** diff --git a/lnbits/app.py b/lnbits/app.py index d930caba5..a0c9abbef 100644 --- a/lnbits/app.py +++ b/lnbits/app.py @@ -23,44 +23,29 @@ from lnbits.core.crud import ( get_installed_extensions, update_installed_extension_state, ) -from lnbits.core.crud.audit import delete_expired_audit_entries from lnbits.core.crud.extensions import create_installed_extension from lnbits.core.helpers import migrate_extension_database from lnbits.core.models.notifications import NotificationType from lnbits.core.services.extensions import deactivate_extension, get_valid_extensions -from lnbits.core.services.funding_source import ( - check_balance_delta_changed, - check_server_balance_against_node, -) -from lnbits.core.services.notifications import ( - dispatch_payment_notification, - enqueue_admin_notification, - process_next_notification, -) -from lnbits.core.services.payments import ( - check_pending_payments, - fundingsource_invoice_producer, -) +from lnbits.core.services.notifications import enqueue_admin_notification +from lnbits.core.services.payments import check_pending_payments from lnbits.core.tasks import ( audit_queue, collect_exchange_rates_data, - notify_server_status, - process_next_audit_entry, - refresh_extension_cache, -) -from lnbits.core.wasm_ext.routes.register import ( - register_wasm_extension, - unregister_wasm_extension, -) -from lnbits.core.wasm_ext.wasm.events import dispatch_wasm_invoice_paid -from lnbits.core.wasm_ext.wasm.loader import ( - is_wasm_extension_dir, - is_wasm_extension_id, + purge_audit_data, + run_by_the_minute_tasks, + wait_for_audit_data, + wait_for_paid_invoices, + wait_notification_messages, ) from lnbits.exceptions import register_exception_handlers from lnbits.helpers import version_parse -from lnbits.llms_txt import create_llms_txt_route from lnbits.settings import settings +from lnbits.tasks import ( + cancel_all_tasks, + create_permanent_task, + register_invoice_listener, +) from lnbits.utils.cache import cache from lnbits.utils.logger import ( configure_logger, @@ -83,7 +68,7 @@ from .middleware import ( add_profiler_middleware, add_ratelimit_middleware, ) -from .task_manager import task_manager +from .tasks import internal_invoice_listener, invoice_listener, run_interval async def startup(app: FastAPI): @@ -117,9 +102,6 @@ async def startup(app: FastAPI): # register core routes init_core_routers(app) - # register llms.txt endpoint for AI agents - create_llms_txt_route(app) - # initialize tasks register_async_tasks() @@ -147,7 +129,7 @@ async def shutdown(): settings.lnbits_running = False # shutdown event - task_manager.cancel_all_tasks() + cancel_all_tasks() # wait a bit to allow them to finish, so that cleanup can run without problems await asyncio.sleep(0.1) @@ -180,8 +162,6 @@ def create_app() -> FastAPI: # Allow registering new extensions routes without direct access to the `app` object core_app_extra.register_new_ext_routes = register_new_ext_routes(app) - core_app_extra.register_new_wasm_ext_routes = register_new_wasm_ext_routes(app) - core_app_extra.unregister_wasm_ext_routes = unregister_wasm_ext_routes(app) core_app_extra.register_new_ratelimiter = register_new_ratelimiter(app) # register static files @@ -313,30 +293,7 @@ async def build_all_installed_extensions_list( # noqa: C901 installed_extensions = await get_installed_extensions() settings.lnbits_installed_extensions_ids = {e.id for e in installed_extensions} - settings.wasm_extensions_dir.mkdir(parents=True, exist_ok=True) - for ext_dir in settings.wasm_extensions_dir.iterdir(): - try: - if not ext_dir.is_dir() or not is_wasm_extension_dir(ext_dir): - continue - ext_id = ext_dir.name - if ext_id in settings.lnbits_installed_extensions_ids: - continue - ext_info = InstallableExtension.from_wasm_ext_dir(ext_id) - if not ext_info: - continue - - installed_extensions.append(ext_info) - settings.lnbits_installed_extensions_ids.add(ext_id) - await create_installed_extension(ext_info) - current_version = await get_db_version(ext_id) - await migrate_extension_database(ext_info, current_version) - - except Exception as e: - logger.warning(e) - - ext_dir_path = Path(settings.lnbits_extensions_path, "extensions") - existing_ext_dirs = ext_dir_path.iterdir() if ext_dir_path.is_dir() else [] - for ext_dir in existing_ext_dirs: + for ext_dir in Path(settings.lnbits_extensions_path, "extensions").iterdir(): try: if not ext_dir.is_dir(): continue @@ -391,18 +348,14 @@ async def build_all_installed_extensions_list( # noqa: C901 async def check_installed_extension_files(ext: InstallableExtension) -> bool: - if ext.is_wasm or ext.has_installed_version: + if ext.has_installed_version: return True zip_files = glob.glob(os.path.join(settings.lnbits_data_folder, "zips", "*.zip")) if f"./{ext.zip_path!s}" not in zip_files: await ext.download_archive() - archive_config = ext.load_archive_config() - if archive_config.get("extension_type") == "wasm": - ext.extract_wasm_archive() - else: - ext.extract_archive() + ext.extract_archive() return False @@ -424,6 +377,7 @@ def register_custom_extensions_path(): upgrades_dir = settings.lnbits_extensions_upgrade_path shutil.rmtree(upgrades_dir, True) Path(upgrades_dir).mkdir(parents=True, exist_ok=True) + sys.path.append(str(upgrades_dir)) if settings.has_default_extension_path: return @@ -442,7 +396,6 @@ def register_custom_extensions_path(): extensions_dir = Path(settings.lnbits_extensions_path, "extensions") Path(extensions_dir).mkdir(parents=True, exist_ok=True) sys.path.append(str(extensions_dir)) - settings.wasm_extensions_dir.mkdir(parents=True, exist_ok=True) def register_new_ext_routes(app: FastAPI) -> Callable: @@ -455,20 +408,6 @@ def register_new_ext_routes(app: FastAPI) -> Callable: return register_new_ext_routes_fn -def register_new_wasm_ext_routes(app: FastAPI) -> Callable: - def register_new_wasm_ext_routes_fn(ext_id: str): - register_wasm_extension(app, ext_id) - - return register_new_wasm_ext_routes_fn - - -def unregister_wasm_ext_routes(app: FastAPI) -> Callable: - def unregister_wasm_ext_routes_fn(ext_id: str): - unregister_wasm_extension(app, ext_id) - - return unregister_wasm_ext_routes_fn - - def register_new_ratelimiter(app: FastAPI) -> Callable: def register_new_ratelimiter_fn(): limiter = Limiter( @@ -493,54 +432,10 @@ def register_ext_tasks(ext: Extension) -> None: def register_ext_routes(app: FastAPI, ext: Extension) -> None: """Register FastAPI routes for extension.""" - module_name = ext.module_name - # Clear all cached sub-modules so a fresh import picks up new files from ext_dir. - # A simple reload() would reuse cached sub-modules (e.g. views_api) and serve - # stale code even after the extension files have been replaced on disk. - stale = [ - k for k in sys.modules if k == module_name or k.startswith(f"{module_name}.") - ] - for k in stale: - del sys.modules[k] - if stale: - # Pydantic v1 keeps a global _FUNCS set of validator qualnames to detect - # duplicates. Clear the extension's entries so reimport doesn't raise - # "duplicate validator" errors for validators with the same qualname. - try: - import pydantic.class_validators as _pydantic_cv - - _pydantic_cv._FUNCS = { - f for f in _pydantic_cv._FUNCS if not f.startswith(f"{module_name}.") - } - except (ImportError, AttributeError): - pass - ext_module = importlib.import_module(module_name) + ext_module = importlib.import_module(ext.module_name) ext_route = getattr(ext_module, f"{ext.code}_ext") - ext_redirects = ( - getattr(ext_module, f"{ext.code}_redirect_paths") - if hasattr(ext_module, f"{ext.code}_redirect_paths") - else [] - ) - - settings.activate_extension_paths(ext.code, ext_redirects) - - # Remove existing routes for this extension before re-registering so that - # an upgraded extension replaces the old one at the same paths (no prefix). - ext_prefix = f"/{ext.code}" - app.router.routes = [ - r - for r in app.router.routes - if not ( - getattr(r, "path", "") == ext_prefix - or getattr(r, "path", "").startswith(f"{ext_prefix}/") - ) - ] - # Invalidate FastAPI's cached OpenAPI schema so the next /openapi.json - # request reflects the updated routes. - app.openapi_schema = None - if hasattr(ext_module, f"{ext.code}_static_files"): ext_statics = getattr(ext_module, f"{ext.code}_static_files") for s in ext_statics: @@ -549,66 +444,54 @@ def register_ext_routes(app: FastAPI, ext: Extension) -> None: ) app.mount(s["path"], StaticFiles(directory=static_dir), s["name"]) + ext_redirects = ( + getattr(ext_module, f"{ext.code}_redirect_paths") + if hasattr(ext_module, f"{ext.code}_redirect_paths") + else [] + ) + + settings.activate_extension_paths(ext.code, ext.upgrade_hash, ext_redirects) + logger.trace(f"Adding route for extension {ext_module}.") - app.include_router(router=ext_route) + prefix = f"/upgrades/{ext.upgrade_hash}" if ext.upgrade_hash != "" else "" + app.include_router(router=ext_route, prefix=prefix) async def check_and_register_extensions(app: FastAPI) -> None: await check_installed_extensions(app) for ext in await get_valid_extensions(False): try: - if is_wasm_extension_id(ext.code): - register_wasm_extension(app, ext.code) - continue register_ext_routes(app, ext) register_ext_tasks(ext) except Exception as exc: logger.error(f"Could not load extension `{ext.code}`: {exc!s}") - await update_installed_extension_state(ext_id=ext.code, active=False) def register_async_tasks() -> None: - task_manager.init() - # listen to all incoming payments and dispatch payment notifications - # note: should be the first in task list for a bit quicker notifications - task_manager.register_invoice_listener(dispatch_payment_notification, "core") + create_permanent_task(wait_for_audit_data) + create_permanent_task(wait_notification_messages) - # periodic tasks - task_manager.create_permanent_task(cache.invalidate_cache, interval=10) - task_manager.create_permanent_task(delete_expired_audit_entries, interval=60 * 60) - task_manager.create_permanent_task( - check_pending_payments, - interval=settings.lnbits_funding_source_pending_interval_seconds, + create_permanent_task( + run_interval( + settings.lnbits_funding_source_pending_interval_seconds, + check_pending_payments, + ) ) - task_manager.create_permanent_task( - collect_exchange_rates_data, - interval=max(60, settings.lnbits_exchange_history_refresh_interval_seconds), - ) - task_manager.create_permanent_task(check_balance_delta_changed, interval=60) - task_manager.create_permanent_task( - check_server_balance_against_node, - interval=60 * settings.lnbits_watchdog_interval_minutes, - ) - task_manager.create_permanent_task( - notify_server_status, - interval=60 * 60 * settings.lnbits_notification_server_status_hours, - ) - task_manager.create_permanent_task(refresh_extension_cache, interval=60) + create_permanent_task(invoice_listener) + create_permanent_task(internal_invoice_listener) + create_permanent_task(cache.invalidate_forever) - # permanent tasks run in a loop, will be restarted if they fail - task_manager.create_permanent_task(fundingsource_invoice_producer) - task_manager.create_permanent_task(process_next_notification) - task_manager.create_permanent_task(process_next_audit_entry) + # core invoice listener + invoice_queue: asyncio.Queue = asyncio.Queue() + register_invoice_listener(invoice_queue, "core") + create_permanent_task(lambda: wait_for_paid_invoices(invoice_queue)) - async def dispatch_extension_invoice_paid(payment) -> None: - await dispatch_wasm_invoice_paid(payment) - - task_manager.register_invoice_listener(dispatch_extension_invoice_paid, "core_wasm") + create_permanent_task(run_by_the_minute_tasks) + create_permanent_task(purge_audit_data) + create_permanent_task(collect_exchange_rates_data) # server logs for websocket if settings.lnbits_admin_ui: server_log_task = initialize_server_websocket_logger() - task_manager.create_permanent_task( - server_log_task, name="server_websocket_logger" - ) + create_permanent_task(server_log_task) diff --git a/lnbits/commands.py b/lnbits/commands.py index 6070a003e..87c8ddff9 100644 --- a/lnbits/commands.py +++ b/lnbits/commands.py @@ -1,5 +1,6 @@ import asyncio import importlib +import sys import time from functools import wraps from getpass import getpass @@ -376,6 +377,10 @@ async def extensions_update( # noqa: C901 if not await _can_run_operation(url): return + upgrades_dir = settings.lnbits_extensions_upgrade_path + Path(upgrades_dir).mkdir(parents=True, exist_ok=True) + sys.path.append(str(upgrades_dir)) + if extension: await update_extension(extension, repo_index, source_repo, url, admin_user) return diff --git a/lnbits/core/__init__.py b/lnbits/core/__init__.py index a0804cb1e..ff2587aed 100644 --- a/lnbits/core/__init__.py +++ b/lnbits/core/__init__.py @@ -6,7 +6,6 @@ from .views.api import api_router from .views.asset_api import asset_router from .views.audit_api import audit_router from .views.auth_api import auth_router -from .views.blockexplorer_api import blockexplorer_router from .views.callback_api import callback_router from .views.extension_api import extension_router from .views.extensions_builder_api import extension_builder_router @@ -21,7 +20,7 @@ from .views.tinyurl_api import tinyurl_router from .views.user_api import users_router from .views.wallet_api import wallet_router from .views.webpush_api import webpush_router -from .views.websocket_api import extension_websocket_router, websocket_router +from .views.websocket_api import websocket_router # backwards compatibility for extensions core_app = APIRouter(tags=["Core"]) @@ -34,7 +33,6 @@ def init_core_routers(app: FastAPI): app.include_router(admin_router) app.include_router(node_router) app.include_router(extension_router) - app.include_router(extension_websocket_router) app.include_router(extension_builder_router) app.include_router(super_node_router) app.include_router(public_node_router) @@ -50,7 +48,6 @@ def init_core_routers(app: FastAPI): app.include_router(asset_router) app.include_router(fiat_router) app.include_router(lnurl_router) - app.include_router(blockexplorer_router) __all__ = ["core_app", "core_app_extra", "db"] diff --git a/lnbits/core/crud/__init__.py b/lnbits/core/crud/__init__.py index cb381dce2..f98c01c8c 100644 --- a/lnbits/core/crud/__init__.py +++ b/lnbits/core/crud/__init__.py @@ -18,13 +18,13 @@ from .extensions import ( get_user_extensions, update_installed_extension, update_installed_extension_state, - update_installed_extension_wasm_runtime_limits, update_user_extension, ) from .payments import ( DateTrunc, check_internal, create_payment, + delete_expired_invoices, delete_wallet_payment, get_latest_payments_by_extension, get_payment, @@ -102,6 +102,7 @@ __all__ = [ "delete_accounts_no_wallets", "delete_admin_settings", "delete_dbversion", + "delete_expired_invoices", "delete_installed_extension", "delete_tinyurl", "delete_unused_wallets", @@ -155,7 +156,6 @@ __all__ = [ "update_admin_settings", "update_installed_extension", "update_installed_extension_state", - "update_installed_extension_wasm_runtime_limits", "update_migration_version", "update_payment", "update_payment_checking_id", diff --git a/lnbits/core/crud/extensions.py b/lnbits/core/crud/extensions.py index 7348f7f3d..497183fc5 100644 --- a/lnbits/core/crud/extensions.py +++ b/lnbits/core/crud/extensions.py @@ -1,12 +1,7 @@ -import json -from datetime import datetime, timedelta, timezone - from lnbits.core.db import db from lnbits.core.models.extensions import ( InstallableExtension, UserExtension, - WasmInvocation, - WasmInvocationStats, ) from lnbits.db import Connection, Database @@ -16,11 +11,6 @@ async def create_installed_extension( conn: Connection | None = None, ) -> None: await (conn or db).insert("installed_extensions", ext) - await update_installed_extension_wasm_runtime_limits( - ext_id=ext.id, - limits=ext.wasm_runtime_limits, - conn=conn, - ) async def update_installed_extension( @@ -28,11 +18,6 @@ async def update_installed_extension( conn: Connection | None = None, ) -> None: await (conn or db).update("installed_extensions", ext) - await update_installed_extension_wasm_runtime_limits( - ext_id=ext.id, - limits=ext.wasm_runtime_limits, - conn=conn, - ) async def update_installed_extension_state( @@ -46,33 +31,6 @@ async def update_installed_extension_state( ) -async def update_installed_extension_wasm_runtime_limits( - *, ext_id: str, limits: dict, conn: Connection | None = None -) -> None: - if not await _has_installed_extension_wasm_runtime_limits_column(conn=conn): - return - - await (conn or db).execute( - """ - UPDATE installed_extensions - SET wasm_runtime_limits = :limits - WHERE id = :id - """, - {"id": ext_id, "limits": json.dumps(limits)}, - ) - - -async def _has_installed_extension_wasm_runtime_limits_column( - conn: Connection | None = None, -) -> bool: - row: dict | None = await (conn or db).fetchone( - "SELECT version FROM dbversions WHERE db = 'core'" - ) - if not row: - return False - return int(row["version"] or 0) >= 48 - - async def delete_installed_extension( *, ext_id: str, conn: Connection | None = None ) -> None: @@ -186,158 +144,3 @@ async def get_user_active_extensions_ids( UserExtension, ) return [ext.extension for ext in exts] - - -async def create_wasm_invocation( - invocation: WasmInvocation, - conn: Connection | None = None, -) -> None: - await (conn or db).insert("wasm_invocations", invocation) - - -async def update_wasm_invocation( - invocation: WasmInvocation, - conn: Connection | None = None, -) -> None: - await (conn or db).update("wasm_invocations", invocation) - - -async def get_wasm_invocation( - invocation_id: str, - conn: Connection | None = None, -) -> WasmInvocation | None: - return await (conn or db).fetchone( - "SELECT * FROM wasm_invocations WHERE id = :id", - {"id": invocation_id}, - model=WasmInvocation, - ) - - -async def get_wasm_invocations( - *, - extension_id: str | None = None, - status: str | None = None, - limit: int = 100, - offset: int = 0, - conn: Connection | None = None, -) -> list[WasmInvocation]: - where: list[str] = [] - values: dict = { - "limit": max(1, min(limit, 500)), - "offset": max(offset, 0), - } - if extension_id: - where.append("extension_id = :extension_id") - values["extension_id"] = extension_id - if status: - where.append("status = :status") - values["status"] = status - - query = "SELECT * FROM wasm_invocations" - if where: - query += f" WHERE {' AND '.join(where)}" - query += " ORDER BY started_at DESC LIMIT :limit OFFSET :offset" - - return await (conn or db).fetchall(query, values, model=WasmInvocation) - - -async def get_running_wasm_invocations( - conn: Connection | None = None, -) -> list[WasmInvocation]: - return await get_wasm_invocations(status="running", conn=conn) - - -async def get_wasm_invocation_stats( - *, - extension_id: str | None = None, - since: datetime | None = None, - conn: Connection | None = None, -) -> WasmInvocationStats: - database = conn or db - where: list[str] = [] - values: dict = {} - if extension_id: - where.append("extension_id = :extension_id") - values["extension_id"] = extension_id - if since: - where.append(f"started_at >= {database.timestamp_placeholder('since')}") - values["since"] = since - - query = """ - SELECT - COUNT(*) AS total, - COALESCE(SUM(CASE WHEN status = 'running' THEN 1 ELSE 0 END), 0) - AS running, - COALESCE(SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END), 0) - AS completed, - COALESCE(SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END), 0) - AS failed, - COALESCE(SUM(CASE WHEN status = 'stopped' THEN 1 ELSE 0 END), 0) - AS stopped, - COALESCE(SUM(CASE WHEN status = 'timeout' THEN 1 ELSE 0 END), 0) - AS timeout, - COALESCE(AVG(duration_ms), 0) AS avg_duration_ms, - COALESCE(MAX(duration_ms), 0) AS max_duration_ms, - COALESCE(SUM(host_call_count), 0) AS host_call_count, - COALESCE(SUM(http_call_count), 0) AS http_call_count, - COALESCE(SUM(storage_call_count), 0) AS storage_call_count, - COALESCE(SUM(wallet_call_count), 0) AS wallet_call_count - FROM wasm_invocations - """ - if where: - query += f" WHERE {' AND '.join(where)}" - - row: dict | None = await (conn or db).fetchone(query, values) - if not row: - return WasmInvocationStats() - - return WasmInvocationStats( - total=int(row["total"] or 0), - running=int(row["running"] or 0), - completed=int(row["completed"] or 0), - failed=int(row["failed"] or 0), - stopped=int(row["stopped"] or 0), - timeout=int(row["timeout"] or 0), - avg_duration_ms=float(row["avg_duration_ms"] or 0), - max_duration_ms=int(row["max_duration_ms"] or 0), - host_call_count=int(row["host_call_count"] or 0), - http_call_count=int(row["http_call_count"] or 0), - storage_call_count=int(row["storage_call_count"] or 0), - wallet_call_count=int(row["wallet_call_count"] or 0), - ) - - -async def delete_old_wasm_invocations( - retention_days: int, - conn: Connection | None = None, -) -> int: - if retention_days <= 0: - return 0 - - cutoff = datetime.now(timezone.utc) - timedelta(days=retention_days) - database = conn or db - result = await database.execute( - f""" - DELETE FROM wasm_invocations - WHERE status != 'running' - AND started_at < {database.timestamp_placeholder("cutoff")} - """, # noqa: S608 - {"cutoff": cutoff}, - ) - return int(result.rowcount or 0) - - -async def mark_stale_wasm_invocations( - conn: Connection | None = None, -) -> None: - database = conn or db - await database.execute( - f""" - UPDATE wasm_invocations - SET status = 'abandoned', - finished_at = {database.timestamp_placeholder("finished_at")}, - stop_reason = 'Server restarted before invocation finished.' - WHERE status = 'running' - """, # noqa: S608 - {"finished_at": datetime.now(timezone.utc)}, - ) diff --git a/lnbits/core/crud/payments.py b/lnbits/core/crud/payments.py index 6825ffbbc..05a9d341f 100644 --- a/lnbits/core/crud/payments.py +++ b/lnbits/core/crud/payments.py @@ -16,7 +16,6 @@ from ..models import ( PaymentFilters, PaymentHistoryPoint, PaymentsStatusCount, - PaymentTotalBreakdown, PaymentWalletStats, ) @@ -239,6 +238,32 @@ async def get_payments_status_count() -> PaymentsStatusCount: ) +async def delete_expired_invoices( + conn: Connection | None = None, +) -> None: + # first we delete all invoices older than one month + + await (conn or db).execute( + # Timestamp placeholder is safe from SQL injection (not user input) + f""" + DELETE FROM apipayments + WHERE status = :status AND amount > 0 + AND time < {db.timestamp_placeholder("delta")} + """, # noqa: S608 + {"status": f"{PaymentState.PENDING}", "delta": int(time() - 2592000)}, + ) + # then we delete all invoices whose expiry date is in the past + await (conn or db).execute( + # Timestamp placeholder is safe from SQL injection (not user input) + f""" + DELETE FROM apipayments + WHERE status = :status AND amount > 0 + AND expiry < {db.timestamp_placeholder("now")} + """, # noqa: S608 + {"status": f"{PaymentState.PENDING}", "now": int(time())}, + ) + + async def create_payment( checking_id: str, data: CreatePayment, @@ -265,7 +290,6 @@ async def create_payment( webhook=data.webhook, fee=-abs(data.fee), tag=extra.get("tag", None), - extension=data.extension, extra=extra, labels=data.labels or [], external_id=data.external_id, @@ -404,41 +428,6 @@ async def get_payment_count_stats( return data -async def get_wallet_payment_total_breakdown( - wallet_id: str, - conn: Connection | None = None, -) -> list[PaymentTotalBreakdown]: - wallet = await get_wallet(wallet_id, conn=conn) - if not wallet or not wallet.can_view_payments: - return [] - - values = {"wallet_id": wallet.source_wallet_id} - data = await (conn or db).fetchall( - query=f""" - SELECT tag, - CASE - WHEN fiat_provider IS NOT NULL - THEN true - ELSE false - END AS is_fiat, - COUNT(*) AS payments_count, - SUM(amount - ABS(fee)) AS total - FROM apipayments - WHERE wallet_id = :wallet_id - AND ( - status = '{PaymentState.SUCCESS}' - OR (amount < 0 AND status = '{PaymentState.PENDING}') - ) - GROUP BY tag, is_fiat - ORDER BY tag - """, # noqa: S608 - values=values, - model=PaymentTotalBreakdown, - ) - - return data - - async def get_daily_stats( filters: Filters[PaymentFilters] | None = None, user_id: str | None = None, diff --git a/lnbits/core/crud/settings.py b/lnbits/core/crud/settings.py index 79eb415d6..fd171dcd3 100644 --- a/lnbits/core/crud/settings.py +++ b/lnbits/core/crud/settings.py @@ -8,18 +8,11 @@ from lnbits.db import dict_to_model from lnbits.settings import ( AdminSettings, EditableSettings, - FundingSourcesSettings, SettingsField, SuperSettings, settings, ) -RESET_PRESERVED_SETTINGS = ( - "lnbits_webpush_pubkey", - "lnbits_webpush_privkey", - *FundingSourcesSettings.__fields__, -) - async def get_super_settings() -> SuperSettings | None: data = await get_settings_by_tag("core") @@ -76,14 +69,16 @@ async def delete_admin_settings(tag: str | None = "core") -> None: async def reset_core_settings() -> None: - core_settings = await get_settings_by_tag("core") or {} - super_user = await get_settings_field("super_user") - await delete_admin_settings() - if super_user: - await set_settings_field("super_user", super_user.value) - for field in RESET_PRESERVED_SETTINGS: - if field in core_settings: - await set_settings_field(field, core_settings[field]) + await db.execute( + """ + DELETE FROM system_settings WHERE tag = 'core' + AND id NOT IN ( + 'super_user', + 'lnbits_webpush_pubkey', + 'lnbits_webpush_privkey' + ) + """, + ) async def create_admin_settings(super_user: str, new_settings: dict) -> SuperSettings: diff --git a/lnbits/core/crud/wallets.py b/lnbits/core/crud/wallets.py index a88259515..4f080b82a 100644 --- a/lnbits/core/crud/wallets.py +++ b/lnbits/core/crud/wallets.py @@ -5,7 +5,6 @@ from uuid import uuid4 from lnbits.core.db import db from lnbits.core.models.wallets import BaseWallet, WalletsFilters, WalletType from lnbits.db import Connection, Filters, Page -from lnbits.helpers import generate_ln_address from lnbits.settings import settings from lnbits.utils.cache import cache @@ -31,8 +30,6 @@ async def create_wallet( inkey=uuid4().hex, currency=settings.lnbits_default_accounting_currency or "USD", ) - if settings.ln_address_creation_allowed and wallet.is_lightning_wallet: - wallet.lightning_address = await generate_lightning_address_local_part(conn) await (conn or db).insert("wallets", wallet) return wallet @@ -126,21 +123,11 @@ async def get_standalone_wallet( """ if deleted is not None: query += " AND deleted = :deleted " - wallet = await (conn or db).fetchone( + return await (conn or db).fetchone( query, {"wallet": wallet_id, "deleted": deleted}, Wallet, ) - if not wallet: - return None - if deleted is True: - return wallet - - if not wallet.lightning_address and settings.ln_address_creation_allowed: - wallet.lightning_address = await generate_lightning_address_local_part(conn) - await update_wallet(wallet, conn) - - return wallet async def get_wallet( @@ -233,30 +220,6 @@ async def get_wallets_count(): return row.get("count", 0) -async def generate_lightning_address_local_part( - conn: Connection | None = None, -) -> str: - for _ in range(100): - local_part = generate_ln_address() - if await get_wallet_id_by_ln_address(local_part, conn): - continue - return local_part - raise ValueError("Could not generate a unique wallet lightning address.") - - -async def get_wallet_id_by_ln_address( - local_part: str, conn: Connection | None = None -) -> str | None: - row: dict = await (conn or db).fetchone( - """ - SELECT id FROM wallets - WHERE lightning_address = :lightning_address - """, - {"lightning_address": local_part.lower()}, - ) - return row["id"] if row else None - - async def get_wallet_for_key( key: str, conn: Connection | None = None, diff --git a/lnbits/core/helpers.py b/lnbits/core/helpers.py index 35b92629a..1b1c24b1b 100644 --- a/lnbits/core/helpers.py +++ b/lnbits/core/helpers.py @@ -15,8 +15,6 @@ from lnbits.core.crud import ( from lnbits.core.db import db as core_db from lnbits.core.models import DbVersion from lnbits.core.models.extensions import InstallableExtension -from lnbits.core.wasm_ext.storage.crud import migrate_wasm_extension_database -from lnbits.core.wasm_ext.wasm.loader import is_wasm_extension_id from lnbits.db import COCKROACH, POSTGRES, SQLITE, Connection from lnbits.settings import settings @@ -24,16 +22,7 @@ from lnbits.settings import settings async def migrate_extension_database( ext: InstallableExtension, current_version: DbVersion | None = None ): - if is_wasm_extension_id(ext.id): - await migrate_wasm_extension_database(ext, current_version) - return - else: - await migrate_py_extension_database(ext, current_version) - -async def migrate_py_extension_database( - ext: InstallableExtension, current_version: DbVersion | None = None -): try: ext_migrations = importlib.import_module(f"{ext.module_name}.migrations") ext_db = importlib.import_module(ext.module_name).db diff --git a/lnbits/core/migrations.py b/lnbits/core/migrations.py index 8796f2e86..d39bf5932 100644 --- a/lnbits/core/migrations.py +++ b/lnbits/core/migrations.py @@ -815,90 +815,3 @@ async def m045_add_external_id_to_payments(db: Connection): CREATE INDEX IF NOT EXISTS idx_payments_external_id ON apipayments (external_id); """) - - -async def m046_add_permissions_to_installed_extensions(db: Connection): - """ - Adds granted permissions to installed extensions. - """ - await db.execute( - "ALTER TABLE installed_extensions ADD COLUMN permissions TEXT DEFAULT '[]'" - ) - - -async def m047_create_wasm_invocations_table(db: Connection): - """ - Tracks WASM extension invocations for runtime monitoring and controls. - """ - await db.execute(f""" - CREATE TABLE IF NOT EXISTS wasm_invocations ( - id TEXT PRIMARY KEY, - extension_id TEXT NOT NULL, - export_name TEXT NOT NULL, - trigger_type TEXT NOT NULL DEFAULT 'unknown', - status TEXT NOT NULL DEFAULT 'running', - started_at TIMESTAMP NOT NULL DEFAULT {db.timestamp_now}, - finished_at TIMESTAMP, - duration_ms INT, - user_id TEXT, - wallet_id TEXT, - request_id TEXT, - method TEXT, - path TEXT, - event_type TEXT, - payment_hash TEXT, - checking_id TEXT, - memory_peak_bytes INT, - request_bytes INT, - response_bytes INT, - host_call_count INT NOT NULL DEFAULT 0, - http_call_count INT NOT NULL DEFAULT 0, - storage_call_count INT NOT NULL DEFAULT 0, - wallet_call_count INT NOT NULL DEFAULT 0, - error_type TEXT, - error_message TEXT, - stop_reason TEXT, - "context" TEXT NOT NULL DEFAULT '{{}}' - ); - """) - await db.execute(""" - CREATE INDEX IF NOT EXISTS idx_wasm_invocations_extension_started - ON wasm_invocations (extension_id, started_at); - """) - await db.execute(""" - CREATE INDEX IF NOT EXISTS idx_wasm_invocations_status - ON wasm_invocations (status); - """) - await db.execute(""" - CREATE INDEX IF NOT EXISTS idx_wasm_invocations_started - ON wasm_invocations (started_at); - """) - - -async def m048_add_wasm_runtime_limits_to_installed_extensions(db: Connection): - """ - Adds per-extension WASM runtime limit overrides. - """ - await db.execute( - "ALTER TABLE installed_extensions " - "ADD COLUMN wasm_runtime_limits TEXT DEFAULT '{}'" - ) - - -async def m049_add_permissions_to_user_extensions(db: Connection): - """ - Adds user-level extension permission grants. - """ - await db.execute("ALTER TABLE extensions ADD COLUMN permissions TEXT DEFAULT '{}'") - - -async def m050_add_lightning_address_to_wallets(db: Connection): - """ - Adds a LUD-16 lightning address local-part to wallets. - """ - await db.execute("ALTER TABLE wallets ADD COLUMN lightning_address TEXT") - logger.debug("Creating index idx_wallets_lightning_address...") - await db.execute(""" - CREATE UNIQUE INDEX IF NOT EXISTS idx_wallets_lightning_address - ON wallets (lightning_address); - """) diff --git a/lnbits/core/models/__init__.py b/lnbits/core/models/__init__.py index eaf3f65e3..f845e5486 100644 --- a/lnbits/core/models/__init__.py +++ b/lnbits/core/models/__init__.py @@ -23,7 +23,6 @@ from .payments import ( PaymentHistoryPoint, PaymentsStatusCount, PaymentState, - PaymentTotalBreakdown, PaymentWalletStats, SettleInvoice, UpdatePaymentExtra, @@ -84,7 +83,6 @@ __all__ = [ "PaymentFilters", "PaymentHistoryPoint", "PaymentState", - "PaymentTotalBreakdown", "PaymentWalletStats", "PaymentsStatusCount", "RegisterUser", diff --git a/lnbits/core/models/extensions.py b/lnbits/core/models/extensions.py index ecc62421f..c0cfa3260 100644 --- a/lnbits/core/models/extensions.py +++ b/lnbits/core/models/extensions.py @@ -6,16 +6,13 @@ import json import os import shutil import zipfile -from collections.abc import Mapping -from datetime import datetime, timezone -from enum import Enum -from pathlib import Path, PurePosixPath +from asyncio.tasks import create_task +from pathlib import Path from typing import Any -from uuid import uuid4 import httpx from loguru import logger -from pydantic import BaseModel, Field, StrictStr +from pydantic import BaseModel, Field from lnbits.helpers import ( download_url, @@ -24,14 +21,9 @@ from lnbits.helpers import ( version_parse, ) from lnbits.settings import settings -from lnbits.task_manager import task_manager from lnbits.utils.cache import cache -class ExtensionArchiveValidationError(ValueError): - pass - - class ExplicitRelease(BaseModel): id: str name: str @@ -51,7 +43,6 @@ class ExplicitRelease(BaseModel): details_link: str | None paid_features: str | None pay_link: str | None - extension_type: str | None = None def is_version_compatible(self): return is_lnbits_version_ok(self.min_lnbits_version, self.max_lnbits_version) @@ -64,15 +55,9 @@ class GitHubRelease(BaseModel): class Manifest(BaseModel): + featured: list[str] = [] extensions: list[ExplicitRelease] = [] repos: list[GitHubRelease] = [] - featured: list[str] = [] - categories: dict[str, list[str]] = {} - - -class ExtensionManifestType(str, Enum): - PYTHON = "python" - WASM = "wasm" class GitHubRepoRelease(BaseModel): @@ -91,23 +76,6 @@ class GitHubRepo(BaseModel): default_branch: str -class ExtensionPermission(BaseModel): - id: StrictStr - description: StrictStr | None = None - policies: list[Any] | None = None - - class Config: - extra = "ignore" - - @staticmethod - def list_from_config(config_json: Mapping[str, Any]) -> list[ExtensionPermission]: - return [ - ExtensionPermission.parse_obj(permission) - for permission in config_json.get("permissions") or [] - if isinstance(permission, dict) and permission.get("id") - ] - - class ExtensionConfig(BaseModel): name: str short_description: str @@ -115,18 +83,10 @@ class ExtensionConfig(BaseModel): warning: str | None = "" min_lnbits_version: str | None max_lnbits_version: str | None - extension_type: str | None = None - permissions: list[ExtensionPermission] = [] def is_version_compatible(self) -> bool: return is_lnbits_version_ok(self.min_lnbits_version, self.max_lnbits_version) - @classmethod - async def fetch_release_config(cls, url: str) -> ExtensionConfig: - error_msg = "Cannot fetch extension release config" - config = await extension_metadata_get(url, error_msg) - return ExtensionConfig.parse_obj(config) - @classmethod async def fetch_github_release_config( cls, org: str, repo: str, tag_name: str @@ -134,7 +94,7 @@ class ExtensionConfig(BaseModel): config_url = ( f"https://raw.githubusercontent.com/{org}/{repo}/{tag_name}/config.json" ) - error_msg = "Cannot fetch extension release config" + error_msg = "Cannot fetch GitHub extension config" config = await github_api_get(config_url, error_msg) return ExtensionConfig.parse_obj(config) @@ -157,87 +117,11 @@ class UserExtensionInfo(BaseModel): payment_hash_to_enable: str | None = None -class ExtensionBackgroundPaymentDestinationPolicy(str, Enum): - OWN_WALLETS_ONLY = "own_wallets_only" - EXTERNAL_ALLOWED = "external_allowed" - - -class ExtensionBackgroundPaymentGrant(BaseModel): - id: StrictStr = Field(..., min_length=1, max_length=128) - wallet_id: str = Field(..., min_length=1, max_length=128) - enabled: bool = True - max_amount: int = Field(..., gt=0) - destination_policy: ExtensionBackgroundPaymentDestinationPolicy - - -class ExtensionBackgroundPaymentGrantRequest(BaseModel): - wallet_id: str = Field(..., min_length=1, max_length=128) - max_amount: int = Field(..., gt=0) - destination_policy: ExtensionBackgroundPaymentDestinationPolicy - - def to_grant(self, grant_id: str | None = None) -> ExtensionBackgroundPaymentGrant: - return ExtensionBackgroundPaymentGrant( - id=grant_id or str(uuid4()), - wallet_id=self.wallet_id, - enabled=True, - max_amount=self.max_amount, - destination_policy=self.destination_policy, - ) - - -class ExtensionWalletPaymentsWatchGrant(BaseModel): - id: StrictStr = Field(..., min_length=1, max_length=128) - wallet_id: str = Field(..., min_length=1, max_length=128) - enabled: bool = True - - -class ExtensionWalletPaymentsWatchGrantRequest(BaseModel): - wallet_id: str = Field(..., min_length=1, max_length=128) - - def to_grant( - self, grant_id: str | None = None - ) -> ExtensionWalletPaymentsWatchGrant: - return ExtensionWalletPaymentsWatchGrant( - id=grant_id or str(uuid4()), - wallet_id=self.wallet_id, - enabled=True, - ) - - -class ExtensionPermissionCheckItem(BaseModel): - id: StrictStr - grant: dict[str, Any] = Field(default_factory=dict) - - -class ExtensionPermissionCheckRequest(BaseModel): - permissions: list[ExtensionPermissionCheckItem] = Field(default_factory=list) - - -class ExtensionPermissionCheckResult(BaseModel): - id: StrictStr - approved: bool - grant: dict[str, Any] = Field(default_factory=dict) - - -class ExtensionPermissionCheckResponse(BaseModel): - permissions: list[ExtensionPermissionCheckResult] = Field(default_factory=list) - - -class ExtensionPermissionsResponse(BaseModel): - extension_permissions: list[ExtensionPermission] = Field(default_factory=list) - user_permissions: dict[str, list[dict[str, Any]]] = Field(default_factory=dict) - - -class ExtensionPermissionsUpdate(BaseModel): - permissions: list[ExtensionPermission] = Field(default_factory=list) - - class UserExtension(BaseModel): user: str extension: str active: bool extra: UserExtensionInfo | None = None - permissions: dict = Field(default_factory=dict) @property def is_paid(self) -> bool: @@ -259,86 +143,36 @@ class UserExtension(BaseModel): class Extension(BaseModel): code: str is_valid: bool - is_wasm: bool = False name: str | None = None short_description: str | None = None tile: str | None = None + upgrade_hash: str | None = "" @property def module_name(self) -> str: + if self.is_upgrade_extension: + return f"{self.code}-{self.upgrade_hash}" + if settings.has_default_extension_path: return f"lnbits.extensions.{self.code}" return self.code + @property + def is_upgrade_extension(self) -> bool: + return self.upgrade_hash != "" + @classmethod def from_installable_ext(cls, ext_info: InstallableExtension) -> Extension: return Extension( code=ext_info.id, is_valid=True, - is_wasm=ext_info.is_wasm, name=ext_info.name, short_description=ext_info.short_description, - tile=_extension_tile(ext_info), + tile=ext_info.icon, + upgrade_hash=ext_info.hash if ext_info.ext_upgrade_dir.is_dir() else "", ) -class WasmInvocation(BaseModel): - id: str - extension_id: str - export_name: str - trigger_type: str = "unknown" - status: str = "running" - started_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) - finished_at: datetime | None = None - duration_ms: int | None = None - user_id: str | None = None - wallet_id: str | None = None - request_id: str | None = None - method: str | None = None - path: str | None = None - event_type: str | None = None - payment_hash: str | None = None - checking_id: str | None = None - memory_peak_bytes: int | None = None - request_bytes: int | None = None - response_bytes: int | None = None - host_call_count: int = 0 - http_call_count: int = 0 - storage_call_count: int = 0 - wallet_call_count: int = 0 - error_type: str | None = None - error_message: str | None = None - stop_reason: str | None = None - context: dict = Field(default_factory=dict) - - -class WasmInvocationStats(BaseModel): - total: int = 0 - running: int = 0 - completed: int = 0 - failed: int = 0 - stopped: int = 0 - timeout: int = 0 - avg_duration_ms: float = 0 - max_duration_ms: int = 0 - host_call_count: int = 0 - http_call_count: int = 0 - storage_call_count: int = 0 - wallet_call_count: int = 0 - - -class WasmRuntimeLimitsUpdate(BaseModel): - limits: dict[str, Any] = Field(default_factory=dict) - - -class WasmRuntimeLimitsInfo(BaseModel): - id: str - name: str - active: bool | None = False - wasm_runtime_limits: dict[str, int] = Field(default_factory=dict) - effective_wasm_runtime_limits: dict[str, int] = Field(default_factory=dict) - - class ExtensionRelease(BaseModel): name: str version: str @@ -355,9 +189,6 @@ class ExtensionRelease(BaseModel): repo: str | None = None icon: str | None = None details_link: str | None = None - extension_type: str | None = None - manifest_type: ExtensionManifestType | None = Field(default=None, exclude=True) - permissions: list[ExtensionPermission] = [] paid_features: str | None = None pay_link: str | None = None @@ -365,14 +196,6 @@ class ExtensionRelease(BaseModel): paid_sats: int | None = 0 payment_hash: str | None = None - def apply_config(self, config: ExtensionConfig) -> None: - self.min_lnbits_version = config.min_lnbits_version - self.max_lnbits_version = config.max_lnbits_version - self.is_version_compatible = config.is_version_compatible() - self.warning = config.warning - self.extension_type = config.extension_type - self.permissions = config.permissions - @property def archive_url(self) -> str: if not self.pay_link: @@ -436,7 +259,6 @@ class ExtensionRelease(BaseModel): warning=e.warning, html_url=e.html_url, details_link=e.details_link, - extension_type=e.extension_type, pay_link=e.pay_link, paid_features=e.paid_features, repo=e.repo, @@ -464,7 +286,10 @@ class ExtensionRelease(BaseModel): if not config: continue - release.apply_config(config) + release.min_lnbits_version = config.min_lnbits_version + release.max_lnbits_version = config.max_lnbits_version + release.is_version_compatible = config.is_version_compatible() + release.icon = icon_to_github_url(f"{org}/{repo}", config.tile) return extension_releases @@ -483,6 +308,7 @@ class ExtensionRelease(BaseModel): @classmethod async def fetch_release_details(cls, details_link: str) -> dict | None: + try: async with httpx.AsyncClient() as client: resp = await client.get(details_link) @@ -507,7 +333,6 @@ class ExtensionMeta(BaseModel): dependencies: list[str] = [] archive: str | None = None featured: bool = False - categories: list[str] = [] paid_features: str | None = None has_paid_release: bool = False has_free_release: bool = False @@ -522,8 +347,6 @@ class InstallableExtension(BaseModel): icon: str | None = None stars: int = 0 meta: ExtensionMeta | None = None - permissions: list[ExtensionPermission] = [] - wasm_runtime_limits: dict = Field(default_factory=dict, no_database=True) @property def hash(self) -> str: @@ -545,16 +368,15 @@ class InstallableExtension(BaseModel): def ext_dir(self) -> Path: return Path(settings.lnbits_extensions_path, "extensions", self.id) - @property - def wasm_ext_dir(self) -> Path: - return Path(settings.wasm_extensions_dir, self.id) - @property def ext_upgrade_dir(self) -> Path: return Path(settings.lnbits_extensions_upgrade_path, f"{self.id}-{self.hash}") @property def module_name(self) -> str: + if self.ext_upgrade_dir.is_dir(): + return f"{self.id}-{self.hash}" + if settings.has_default_extension_path: return f"lnbits.extensions.{self.id}" return self.id @@ -577,18 +399,6 @@ class InstallableExtension(BaseModel): return False return self.meta.pay_to_enable.required is True - @property - def is_wasm(self) -> bool: - config_path = Path(self.wasm_ext_dir, "config.json") - if not config_path.is_file(): - return False - try: - with open(config_path, encoding="utf-8") as json_file: - config_json = json.load(json_file) - except Exception: - return False - return config_json.get("extension_type") == "wasm" - async def download_archive(self): logger.info(f"Downloading extension {self.name} ({self.installed_version}).") ext_zip_file = self.zip_path @@ -621,57 +431,6 @@ class InstallableExtension(BaseModel): os.remove(ext_zip_file) raise AssertionError("File hash missmatch. Will not install.") - def load_archive_config(self) -> dict[str, Any]: - if not self.zip_path.is_file(): - return {} - - try: - with zipfile.ZipFile(self.zip_path, "r") as archive: - config_name = _archive_config_name(archive.namelist()) - if not config_name: - return {} - with archive.open(config_name) as config_file: - config = json.load(config_file) - except Exception as exc: - raise ValueError(f"Cannot read extension config for '{self.id}'.") from exc - - return config if isinstance(config, dict) else {} - - def validate_archive(self, config: Mapping[str, Any]) -> None: - release = self.meta.installed_release if self.meta else None - manifest_type = release.manifest_type if release else None - is_wasm = config.get("extension_type") == "wasm" - - if manifest_type == ExtensionManifestType.PYTHON and is_wasm: - raise ExtensionArchiveValidationError( - f"Python extension manifest cannot install WASM extension '{self.id}'." - ) - if manifest_type == ExtensionManifestType.WASM and not is_wasm: - raise ExtensionArchiveValidationError( - "WASM extension manifest requires extension_type 'wasm' " - f"for extension '{self.id}'." - ) - if not is_wasm: - return - - with zipfile.ZipFile(self.zip_path, "r") as archive: - python_file = next( - ( - item.filename - for item in archive.infolist() - if not item.is_dir() - and PurePosixPath(item.filename).suffix.lower() - in {".py", ".pyc", ".pyo", ".so", ".pyd"} - ), - None, - ) - - if python_file: - raise ExtensionArchiveValidationError( - f"WASM extension '{self.id}' contains forbidden Python file " - f"'{python_file}'." - ) - def extract_archive(self): logger.info(f"Extracting extension {self.name} ({self.installed_version}).") Path(settings.lnbits_extensions_upgrade_path).mkdir(parents=True, exist_ok=True) @@ -708,38 +467,6 @@ class InstallableExtension(BaseModel): shutil.rmtree(self.ext_dir, True) shutil.copytree(Path(self.ext_upgrade_dir), Path(self.ext_dir)) - shutil.rmtree(self.ext_upgrade_dir, True) - logger.info(f"Extension {self.name} ({self.installed_version}) extracted.") - - def extract_wasm_archive(self): - logger.info(f"Extracting extension {self.name} ({self.installed_version}).") - - tmp_dir = Path(settings.lnbits_data_folder, "unzip-temp", self.hash) - shutil.rmtree(tmp_dir, True) - with zipfile.ZipFile(self.zip_path, "r") as zip_ref: - zip_ref.extractall(tmp_dir) - generated_dir_name = os.listdir(tmp_dir)[0] - extracted_dir = Path(tmp_dir, generated_dir_name) - - with open(Path(extracted_dir, "config.json"), "r+") as json_file: - config_json = json.load(json_file) - - self.name = config_json.get("name") - self.short_description = config_json.get("short_description") - - if ( - self.meta - and self.meta.installed_release - and self.meta.installed_release.is_github_release - and config_json.get("tile") - ): - self.icon = icon_to_github_url( - self.meta.installed_release.source_repo, config_json.get("tile") - ) - - shutil.rmtree(self.wasm_ext_dir, True) - shutil.copytree(extracted_dir, self.wasm_ext_dir) - shutil.rmtree(tmp_dir, True) logger.info(f"Extension {self.name} ({self.installed_version}) extracted.") def clean_extension_files(self): @@ -752,12 +479,6 @@ class InstallableExtension(BaseModel): shutil.rmtree(self.ext_upgrade_dir, True) - def clean_wasm_extension_files(self): - if self.zip_path.is_file(): - os.remove(self.zip_path) - - shutil.rmtree(self.wasm_ext_dir, True) - def check_release_updates(self, release: ExtensionRelease | None): self._check_latest_version(release) self._check_payment_link(release) @@ -888,42 +609,6 @@ class InstallableExtension(BaseModel): version=version, short_description=config_json.get("short_description"), icon=config_json.get("tile"), - permissions=ExtensionPermission.list_from_config(config_json), - meta=ExtensionMeta( - installed_release=ExtensionRelease( - name=ext_id, - version=version, - archive=f"{conf_path}", - source_repo=f"{conf_path}", - min_lnbits_version=config_json.get("min_lnbits_version"), - max_lnbits_version=config_json.get("max_lnbits_version"), - ) - ), - ) - - except Exception as e: - logger.warning(e) - - return None - - @classmethod - def from_wasm_ext_dir(cls, ext_id: str) -> InstallableExtension | None: - try: - conf_path = Path(settings.wasm_extensions_dir, ext_id, "config.json") - if not conf_path.is_file(): - return None - with open(conf_path, "r+") as json_file: - config_json = json.load(json_file) - version = config_json.get("version", "0.0") - - return InstallableExtension( - id=ext_id, - name=config_json.get("name", ext_id), - active=True, - version=version, - short_description=config_json.get("short_description"), - icon=config_json.get("tile"), - permissions=ExtensionPermission.list_from_config(config_json), meta=ExtensionMeta( installed_release=ExtensionRelease( name=ext_id, @@ -956,10 +641,7 @@ class InstallableExtension(BaseModel): if cache_value.older_than(10 * 60) or post_refresh_cache: # refresh cache in background if older than 10 minutes or requested - task_manager.create_task( - cls._refresh_installable_extensions_cache(), - "refresh_installable_extensions_cache", - ) + create_task(cls._refresh_installable_extensions_cache()) extension_list = cache_value.value # type: ignore return extension_list @@ -981,7 +663,7 @@ class InstallableExtension(BaseModel): ) -> list[InstallableExtension]: extension_list: list[InstallableExtension] = [] - for url, manifest_type in _extension_manifest_sources(): + for url in settings.lnbits_extensions_manifests: try: manifest = await cls.fetch_manifest(url) @@ -989,8 +671,6 @@ class InstallableExtension(BaseModel): ext = await InstallableExtension.from_github_release(r) if not ext: continue - if ext.meta and ext.meta.latest_release: - ext.meta.latest_release.manifest_type = manifest_type existing_ext = next( (ee for ee in extension_list if ee.id == r.id), None ) @@ -1000,17 +680,11 @@ class InstallableExtension(BaseModel): meta = ext.meta or ExtensionMeta() meta.featured = ext.id in manifest.featured - meta.categories = [ - category - for category, ext_ids in manifest.categories.items() - if ext.id in ext_ids - ] ext.meta = meta extension_list += [ext] for e in manifest.extensions: release = ExtensionRelease.from_explicit_release(url, e) - release.manifest_type = manifest_type existing_ext = next( (ee for ee in extension_list if ee.id == e.id), None ) @@ -1021,11 +695,6 @@ class InstallableExtension(BaseModel): ext.check_release_updates(release) meta = ext.meta or ExtensionMeta() meta.featured = ext.id in manifest.featured - meta.categories = [ - category - for category, ext_ids in manifest.categories.items() - if ext.id in ext_ids - ] ext.meta = meta extension_list += [ext] except Exception as e: @@ -1037,9 +706,11 @@ class InstallableExtension(BaseModel): @classmethod async def get_extension_releases(cls, ext_id: str) -> list[ExtensionRelease]: extension_releases: list[ExtensionRelease] = [] - for url, manifest_type in _extension_manifest_sources( - include_builder=True, deduplicate=False - ): + all_manifests = [ + *settings.lnbits_extensions_manifests, + settings.lnbits_extensions_builder_manifest_url, + ] + for url in all_manifests: try: manifest = await cls.fetch_manifest(url) for r in manifest.repos: @@ -1048,23 +719,12 @@ class InstallableExtension(BaseModel): repo_releases = await ExtensionRelease.get_github_releases( r.organisation, r.repository ) - for release in repo_releases: - release.manifest_type = manifest_type extension_releases += repo_releases for e in manifest.extensions: if e.id != ext_id: continue explicit_release = ExtensionRelease.from_explicit_release(url, e) - if ( - explicit_release.extension_type == "wasm" - and explicit_release.details_link - ): - config = await ExtensionConfig.fetch_release_config( - explicit_release.details_link - ) - explicit_release.apply_config(config) - explicit_release.manifest_type = manifest_type await explicit_release.check_payment_requirements() extension_releases.append(explicit_release) @@ -1118,7 +778,7 @@ class InstallableExtension(BaseModel): @classmethod async def fetch_manifest(cls, url) -> Manifest: error_msg = "Cannot fetch extensions manifest" - manifest = await extension_metadata_get(url, error_msg) + manifest = await github_api_get(url, error_msg) return Manifest.parse_obj(manifest) @@ -1129,7 +789,6 @@ class CreateExtension(BaseModel): version: str cost_sats: int | None = 0 payment_hash: str | None = None - permissions: list[ExtensionPermission] = [] class ExtensionDetailsRequest(BaseModel): @@ -1164,36 +823,11 @@ class ExtensionReview(BaseModel): comment: str | None = Field(default=None) -async def extension_metadata_get(url: str, error_msg: str | None) -> Any: - try: - parsed_url = httpx.URL(url) - except Exception as exc: - raise ValueError("Invalid extension metadata URL") from exc - if parsed_url.userinfo: - raise ValueError("Extension metadata URLs must not contain credentials") - if _is_github_token_url(url): - return await github_api_get(url, error_msg) - return await unauthenticated_json_get(url, error_msg) - - -async def unauthenticated_json_get(url: str, error_msg: str | None) -> Any: - headers = {"User-Agent": settings.user_agent} - async with httpx.AsyncClient(headers=headers, follow_redirects=False) as client: - resp = await client.get(url) - if resp.status_code != 200: - logger.warning(f"{error_msg} ({url}): {resp.text}") - resp.raise_for_status() - return resp.json() - - async def github_api_get(url: str, error_msg: str | None) -> Any: - if not _is_github_token_url(url): - raise ValueError("Refusing GitHub authentication for an untrusted origin") - headers = {"User-Agent": settings.user_agent} if settings.lnbits_ext_github_token: headers["Authorization"] = f"Bearer {settings.lnbits_ext_github_token}" - async with httpx.AsyncClient(headers=headers, follow_redirects=False) as client: + async with httpx.AsyncClient(headers=headers) as client: resp = await client.get(url) if resp.status_code != 200: logger.warning(f"{error_msg} ({url}): {resp.text}") @@ -1207,65 +841,3 @@ def icon_to_github_url(source_repo: str, path: str | None) -> str: _, _, *rest = path.split("/") tail = "/".join(rest) return f"https://github.com/{source_repo}/raw/main/{tail}" - - -def wasm_extension_icon_url(ext_id: str) -> str: - return f"/ext-assets/{ext_id}/assets/icon.png" - - -def _extension_tile(ext_info: InstallableExtension) -> str | None: - if ext_info.is_wasm: - return wasm_extension_icon_url(ext_info.id) - return ext_info.icon - - -def _archive_config_name(names: list[str]) -> str | None: - for name in names: - path = PurePosixPath(name) - if len(path.parts) == 2 and path.name == "config.json": - return name - return None - - -def _extension_manifest_sources( - *, include_builder: bool = False, deduplicate: bool = True -) -> list[tuple[str, ExtensionManifestType]]: - sources = [ - *( - (url, ExtensionManifestType.PYTHON) - for url in settings.lnbits_extensions_manifests - ), - *( - (url, ExtensionManifestType.WASM) - for url in settings.lnbits_wasm_extensions_manifests - ), - ] - if include_builder: - sources.append( - ( - settings.lnbits_extensions_builder_manifest_url, - ExtensionManifestType.PYTHON, - ) - ) - if not deduplicate: - return sources - unique_sources: dict[str, ExtensionManifestType] = {} - for url, manifest_type in sources: - unique_sources.setdefault(url, manifest_type) - return list(unique_sources.items()) - - -_GITHUB_TOKEN_HOSTS = frozenset({"api.github.com", "raw.githubusercontent.com"}) - - -def _is_github_token_url(url: str) -> bool: - try: - parsed_url = httpx.URL(url) - except Exception: - return False - return ( - parsed_url.scheme == "https" - and parsed_url.host in _GITHUB_TOKEN_HOSTS - and parsed_url.port is None - and not parsed_url.userinfo - ) diff --git a/lnbits/core/models/misc.py b/lnbits/core/models/misc.py index 8a7e8ced3..5aad3fdc9 100644 --- a/lnbits/core/models/misc.py +++ b/lnbits/core/models/misc.py @@ -1,8 +1,6 @@ from __future__ import annotations from collections.abc import Callable -from pathlib import Path -from typing import Any from pydantic import BaseModel @@ -13,45 +11,8 @@ def _do_nothing(*_): class CoreAppExtra: register_new_ext_routes: Callable = _do_nothing - register_new_wasm_ext_routes: Callable = _do_nothing - unregister_wasm_ext_routes: Callable = _do_nothing register_new_ratelimiter: Callable - def __init__(self) -> None: - self.wasm_extension_registry = WasmExtensionRegistry() - - -class WasmExtensionRegistry: - def __init__(self) -> None: - self._extensions: dict[str, Any] = {} - - def register(self, extension: Any) -> None: - self.require_available(extension) - self._extensions[extension.id] = extension - - def require_available(self, extension: Any) -> None: - existing = self._extensions.get(extension.id) - if existing and not _same_wasm_extension_registration(existing, extension): - raise ValueError( - f"WASM extension id '{extension.id}' is already registered." - ) - - def get(self, ext_id: str) -> Any | None: - return self._extensions.get(ext_id) - - def unregister(self, ext_id: str) -> None: - self._extensions.pop(ext_id, None) - - def list(self) -> list[Any]: - return list(self._extensions.values()) - - -def _same_wasm_extension_registration(left: Any, right: Any) -> bool: - try: - return Path(left.root_path).resolve() == Path(right.root_path).resolve() - except (AttributeError, TypeError): - return left is right - class ConversionData(BaseModel): from_: str = "sat" @@ -80,7 +41,6 @@ class SimpleStatus(BaseModel): class SimpleItem(BaseModel): id: str name: str - expires_at: int | None = None class DbVersion(BaseModel): diff --git a/lnbits/core/models/payments.py b/lnbits/core/models/payments.py index 4c3ebb4bb..b7c723066 100644 --- a/lnbits/core/models/payments.py +++ b/lnbits/core/models/payments.py @@ -54,7 +54,6 @@ class CreatePayment(BaseModel): amount_msat: int memo: str extra: dict | None = {} - extension: str | None = None preimage: str | None = None expiry: datetime | None = None webhook: str | None = None @@ -141,18 +140,22 @@ class Payment(BaseModel): ) # DEPRECATED: in v1.5.0, use service check_payment_status instead - async def check_status(self) -> PaymentStatus: + async def check_status( + self, skip_internal_payment_notifications: bool | None = False + ) -> PaymentStatus: logger.warning("payment.check_status() is deprecated.") from lnbits.core.services.payments import check_payment_status - return await check_payment_status(self) + return await check_payment_status(self, skip_internal_payment_notifications) # DEPRECATED: in v1.5.0, use service check_payment_status instead - async def check_fiat_status(self) -> FiatPaymentStatus: + async def check_fiat_status( + self, skip_internal_payment_notifications: bool | None = False + ) -> FiatPaymentStatus: logger.warning("payment.check_fiat_status() is deprecated.") from lnbits.core.services.fiat_providers import check_fiat_status - return await check_fiat_status(self) + return await check_fiat_status(self, skip_internal_payment_notifications) class PaymentFilters(FilterModel): @@ -221,13 +224,6 @@ class PaymentWalletStats(BaseModel): balance: float = 0 -class PaymentTotalBreakdown(BaseModel): - tag: str | None = None - is_fiat: bool = False - payments_count: int = 0 - total: int = 0 - - class PaymentDailyStats(BaseModel): date: datetime balance: float = 0 @@ -267,7 +263,6 @@ class CreateInvoice(BaseModel): ) expiry: int | None = None extra: dict | None = None - extension: str | None = None webhook: str | None = None bolt11: str | None = None lnurl_withdraw: LnurlWithdrawResponse | None = None @@ -275,9 +270,6 @@ class CreateInvoice(BaseModel): labels: list[str] = [] external_id: str | None = Query(default=None, max_length=256) - def is_fiat_subscription(self) -> bool: - return (self.extra or {}).get("fiat_method") == "subscription" - @validator("payment_hash") def check_hex(cls, v): if v: diff --git a/lnbits/core/models/wallets.py b/lnbits/core/models/wallets.py index 8e6241948..69cb61879 100644 --- a/lnbits/core/models/wallets.py +++ b/lnbits/core/models/wallets.py @@ -126,7 +126,6 @@ class Wallet(BaseWallet): created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) currency: str | None = None - lightning_address: str | None = None balance_msat: int = Field(default=0, no_database=True) extra: WalletExtra = WalletExtra() stored_paylinks: StoredPayLinks = StoredPayLinks() @@ -151,7 +150,6 @@ class Wallet(BaseWallet): if len(self.share_permissions): self.currency = shared_wallet.currency - self.lightning_address = shared_wallet.lightning_address self.balance_msat = shared_wallet.balance_msat self.stored_paylinks = shared_wallet.stored_paylinks @@ -242,18 +240,10 @@ class BaseWalletTypeInfo: class WalletsFilters(FilterModel): - __search_fields__ = ["id", "name", "currency", "lightning_address"] + __search_fields__ = ["id", "name", "currency"] - __sort_fields__ = [ - "id", - "name", - "currency", - "lightning_address", - "created_at", - "updated_at", - ] + __sort_fields__ = ["id", "name", "currency", "created_at", "updated_at"] id: str | None name: str | None currency: str | None - lightning_address: str | None diff --git a/lnbits/core/services/__init__.py b/lnbits/core/services/__init__.py index f95ef4a5c..82eabd3ae 100644 --- a/lnbits/core/services/__init__.py +++ b/lnbits/core/services/__init__.py @@ -1,10 +1,3 @@ -from .blockexplorer import ( - fetch_fee_estimates, - fetch_onchain_balance, - fetch_recent_blocks, - fetch_tip, - fetch_transaction, -) from .fiat_providers import check_fiat_status from .funding_source import ( get_balance_delta, @@ -63,12 +56,7 @@ __all__ = [ "enqueue_admin_notification", "fee_reserve", "fee_reserve_total", - "fetch_fee_estimates", "fetch_lnurl_pay_request", - "fetch_onchain_balance", - "fetch_recent_blocks", - "fetch_tip", - "fetch_transaction", "get_balance_delta", "get_payments_daily_stats", "get_pr_from_lnurl", diff --git a/lnbits/core/services/blockexplorer.py b/lnbits/core/services/blockexplorer.py deleted file mode 100644 index 31f03a862..000000000 --- a/lnbits/core/services/blockexplorer.py +++ /dev/null @@ -1,97 +0,0 @@ -import asyncio - -from lnbits.settings import settings -from lnbits.task_manager import OnchainAddressEvent -from lnbits.utils.electrum import ( - UTXO, - AddressResponse, - Balance, - BlockHeader, - BlockInfo, - ElectrumClient, - FeeResponse, - Transaction, - network_from_name, - parse_block_header, - parse_raw_tx, - scripthash_from_address, -) - - -def _client() -> ElectrumClient: - return ElectrumClient( - settings.lnbits_blockexplorer_electrum_url, - network=network_from_name(settings.lnbits_blockexplorer_network), - ) - - -async def fetch_recent_blocks(count: int = 5) -> list[BlockInfo]: - async with _client() as c: - tip = await c.get_tip() - start = max(0, tip.height - count + 1) - headers = await c.get_block_headers(start, tip.height - start + 1) - raw = bytes.fromhex(headers.hex) - blocks = [ - parse_block_header(raw[i * 80 : (i + 1) * 80].hex(), start + i) - for i in range(headers.count) - ] - return list(reversed(blocks)) - - -async def fetch_tip() -> BlockHeader: - async with _client() as c: - return await c.get_tip() - - -async def fetch_fee_estimates() -> FeeResponse: - async with _client() as c: - estimates_raw = await asyncio.gather( - c.estimate_fee(1), - c.estimate_fee(3), - c.estimate_fee(6), - c.estimate_fee(144), - ) - histogram = await c.fee_histogram() - estimates = { - str(blocks): fee - for blocks, fee in zip([1, 3, 6, 144], estimates_raw, strict=False) - if fee >= 0 - } - return FeeResponse(estimates=estimates, histogram=histogram) - - -async def fetch_transaction(txid: str) -> Transaction: - async with _client() as c: - raw_hex = await c.get_transaction(txid) - return parse_raw_tx(raw_hex, network=c.network) - - -async def fetch_onchain_balance(onchain_address: str) -> AddressResponse: - scripthash = scripthash_from_address(onchain_address) - async with _client() as client: - balance_res, history_res = await asyncio.gather( - client.get_balance(scripthash), - client.get_history(scripthash), - return_exceptions=True, - ) - if isinstance(balance_res, BaseException): - raise balance_res - history = [] if isinstance(history_res, BaseException) else history_res - history_error = str(history_res) if isinstance(history_res, BaseException) else None - return AddressResponse( - balance=balance_res, history=history, history_error=history_error - ) - - -async def fetch_utxos(onchain_address: str) -> list[UTXO]: - scripthash = scripthash_from_address(onchain_address) - async with _client() as client: - return await client.listunspent(scripthash) - - -def address_event_to_response(event: OnchainAddressEvent) -> AddressResponse: - return AddressResponse( - balance=Balance(confirmed=event.confirmed, unconfirmed=event.unconfirmed), - history=event.history, - history_error=event.history_error, - ) diff --git a/lnbits/core/services/extensions.py b/lnbits/core/services/extensions.py index 690eedcbd..411ed6cb5 100644 --- a/lnbits/core/services/extensions.py +++ b/lnbits/core/services/extensions.py @@ -1,12 +1,5 @@ import asyncio import importlib -import re -from collections.abc import Mapping -from dataclasses import dataclass -from datetime import datetime, timedelta, timezone -from threading import RLock -from typing import Any -from uuid import uuid4 from loguru import logger @@ -20,174 +13,18 @@ from lnbits.core.crud import ( update_installed_extension_state, ) from lnbits.core.crud.extensions import ( - create_wasm_invocation, - delete_old_wasm_invocations, get_installed_extensions, - get_wasm_invocation, - mark_stale_wasm_invocations, update_installed_extension, - update_installed_extension_wasm_runtime_limits, - update_wasm_invocation, -) -from lnbits.core.crud.extensions import ( - get_wasm_invocation_stats as get_wasm_invocation_stats_crud, -) -from lnbits.core.crud.extensions import ( - get_wasm_invocations as get_wasm_invocations_crud, ) from lnbits.core.helpers import migrate_extension_database -from lnbits.core.wasm_ext.api.permissions import validate_wasm_extension_permissions -from lnbits.core.wasm_ext.wasm.loader import is_wasm_extension_id from lnbits.db import Connection -from lnbits.settings import WasmRuntimeLimits, settings +from lnbits.settings import settings -from ..models.extensions import ( - Extension, - ExtensionMeta, - ExtensionPermission, - InstallableExtension, - WasmInvocation, - WasmInvocationStats, -) - -_WASM_INVOCATION_CLEANUP_INTERVAL = timedelta(hours=1) -WASM_RUNTIME_LIMIT_FIELDS = tuple(WasmRuntimeLimits.__fields__.keys()) - - -@dataclass -class WasmInvocationHandle: - invocation: WasmInvocation - engine: Any | None = None - store: Any | None = None - runtime_limits: dict[str, int] | None = None - stop_requested: bool = False - stop_reason: str | None = None - - -_wasm_invocation_lock = RLock() -_wasm_invocation_ready_lock = asyncio.Lock() -_wasm_invocation_handles: dict[str, WasmInvocationHandle] = {} -_wasm_invocations_marked_stale = False -_wasm_invocations_last_cleanup_at: datetime | None = None - - -def wasm_runtime_limit_defaults() -> dict[str, int]: - return {field: int(getattr(settings, field)) for field in WASM_RUNTIME_LIMIT_FIELDS} - - -def validate_wasm_runtime_limit_overrides( - limits: Mapping[str, Any] | None, - *, - strict: bool = True, -) -> dict[str, int]: - if not limits: - return {} - - validated: dict[str, int] = {} - for field, raw_value in limits.items(): - if field not in WASM_RUNTIME_LIMIT_FIELDS: - if strict: - raise ValueError(f"Unknown WASM runtime limit field '{field}'.") - continue - - value = _validate_wasm_runtime_limit_value(field, raw_value, strict=strict) - if value is None: - continue - validated[field] = value - - return validated - - -def _validate_wasm_runtime_limit_value( - field: str, - raw_value: Any, - *, - strict: bool, -) -> int | None: - if raw_value is None or raw_value == "": - return None - if isinstance(raw_value, bool): - return _invalid_wasm_runtime_limit(field, strict, "must be an integer") - if isinstance(raw_value, str): - raw_value = raw_value.strip() - if raw_value == "": - return None - if not raw_value.isdecimal(): - return _invalid_wasm_runtime_limit(field, strict, "must be an integer") - if isinstance(raw_value, float) and not raw_value.is_integer(): - return _invalid_wasm_runtime_limit(field, strict, "must be an integer") - - try: - value = int(raw_value) - except (TypeError, ValueError) as exc: - return _invalid_wasm_runtime_limit( - field, - strict, - "must be an integer", - exc=exc, - ) - if value < 0: - return _invalid_wasm_runtime_limit(field, strict, "cannot be negative") - return value - - -def _invalid_wasm_runtime_limit( - field: str, - strict: bool, - message: str, - *, - exc: Exception | None = None, -) -> int | None: - if not strict: - return None - error = ValueError(f"WASM runtime limit '{field}' {message}.") - if exc: - raise error from exc - raise error - - -def resolve_wasm_runtime_limits( - installed_extension: InstallableExtension | None = None, -) -> dict[str, int]: - limits = wasm_runtime_limit_defaults() - if installed_extension: - limits.update( - validate_wasm_runtime_limit_overrides( - installed_extension.wasm_runtime_limits, - strict=False, - ) - ) - return limits - - -async def get_wasm_runtime_limits_for_extension(ext_id: str) -> dict[str, int]: - installed_extension = await get_installed_extension(ext_id) - return resolve_wasm_runtime_limits(installed_extension) - - -async def update_wasm_extension_runtime_limits( - ext_id: str, - limits: Mapping[str, Any] | None, -) -> dict[str, int]: - installed_extension = await get_installed_extension(ext_id) - if not installed_extension: - raise ValueError(f"Extension '{ext_id}' is not installed.") - if not installed_extension.is_wasm: - raise ValueError(f"Extension '{ext_id}' is not a WASM extension.") - - validated_limits = validate_wasm_runtime_limit_overrides(limits) - await update_installed_extension_wasm_runtime_limits( - ext_id=ext_id, - limits=validated_limits, - ) - return validated_limits +from ..models.extensions import Extension, ExtensionMeta, InstallableExtension async def install_extension( - ext_info: InstallableExtension, - skip_download: bool | None = False, - granted_permissions: list[ExtensionPermission] | None = None, - allow_admin_policy_overrides: bool = False, + ext_info: InstallableExtension, skip_download: bool | None = False ) -> Extension: ext_info.meta = ext_info.meta or ExtensionMeta() @@ -201,27 +38,13 @@ async def install_extension( installed_ext = await get_installed_extension(ext_info.id) if installed_ext and installed_ext.meta: ext_info.meta.payments = installed_ext.meta.payments - if installed_ext: - ext_info.wasm_runtime_limits = installed_ext.wasm_runtime_limits await check_extensions_limit(installed_ext) if not skip_download: await ext_info.download_archive() - extension_config = ext_info.load_archive_config() - ext_info.validate_archive(extension_config) - ext_info.permissions = validate_wasm_extension_permissions( - ext_info, - granted_permissions, - extension_config, - allow_admin_policy_overrides=allow_admin_policy_overrides, - ) - - if extension_config.get("extension_type") == "wasm": - ext_info.extract_wasm_archive() - else: - ext_info.extract_archive() + ext_info.extract_archive() db_version = await get_db_version(ext_info.id) await migrate_extension_database(ext_info, db_version) @@ -233,10 +56,14 @@ async def install_extension( else: await update_installed_extension(ext_info) - if installed_ext: + extension = Extension.from_installable_ext(ext_info) + if extension.is_upgrade_extension: + # call stop while the old routes are still active await stop_extension_background_work(ext_info.id) - return Extension.from_installable_ext(ext_info) + await start_extension_background_work(ext_info.id) + + return extension async def check_extensions_limit(installed_ext: InstallableExtension | None = None): @@ -248,423 +75,24 @@ async def check_extensions_limit(installed_ext: InstallableExtension | None = No raise ValueError("Max amount of extensions have been installed") -async def ensure_wasm_invocation_monitoring_ready() -> None: - global _wasm_invocations_last_cleanup_at, _wasm_invocations_marked_stale - - async with _wasm_invocation_ready_lock: - now = _now() - if not _wasm_invocations_marked_stale: - await mark_stale_wasm_invocations() - _wasm_invocations_marked_stale = True - - if ( - _wasm_invocations_last_cleanup_at is None - or now - _wasm_invocations_last_cleanup_at - >= _WASM_INVOCATION_CLEANUP_INTERVAL - ): - _wasm_invocations_last_cleanup_at = now - await delete_old_wasm_invocations( - settings.lnbits_wasm_invocation_retention_days - ) - - -async def start_wasm_invocation( - *, - extension_id: str, - export_name: str, - trigger_type: str = "unknown", - user_id: str | None = None, - wallet_id: str | None = None, - request_id: str | None = None, - method: str | None = None, - path: str | None = None, - event_type: str | None = None, - payment_hash: str | None = None, - checking_id: str | None = None, - request_bytes: int | None = None, - context: dict | None = None, - runtime_limits: dict[str, int] | None = None, -) -> WasmInvocation: - await ensure_wasm_invocation_monitoring_ready() - _check_wasm_invocation_concurrency( - extension_id=extension_id, - user_id=user_id, - limits=runtime_limits, - ) - - invocation = WasmInvocation( - id=uuid4().hex, - extension_id=extension_id, - export_name=export_name, - trigger_type=trigger_type, - user_id=user_id, - wallet_id=wallet_id, - request_id=request_id, - method=method, - path=path, - event_type=event_type, - payment_hash=payment_hash, - checking_id=checking_id, - request_bytes=request_bytes, - context=_safe_wasm_invocation_context(context or {}), - ) - await create_wasm_invocation(invocation) - - with _wasm_invocation_lock: - _wasm_invocation_handles[invocation.id] = WasmInvocationHandle( - invocation, - runtime_limits=runtime_limits, - ) - - return invocation - - -def attach_wasm_invocation_runtime( - invocation_id: str, - *, - engine: Any, - store: Any, -) -> None: - with _wasm_invocation_lock: - handle = _wasm_invocation_handles.get(invocation_id) - if not handle: - return - handle.engine = engine - handle.store = store - if handle.stop_requested: - _interrupt_wasm_invocation(handle) - - -def record_wasm_invocation_host_call( - invocation_id: str | None, - method_id: str, -) -> None: - if not invocation_id: - return - - with _wasm_invocation_lock: - handle = _wasm_invocation_handles.get(invocation_id) - if not handle: - return - - invocation = handle.invocation - invocation.host_call_count += 1 - category = _wasm_host_call_category(method_id) - if category == "http": - invocation.http_call_count += 1 - elif category == "storage": - invocation.storage_call_count += 1 - elif category == "wallet": - invocation.wallet_call_count += 1 - - _check_wasm_host_call_limit(invocation, category, handle.runtime_limits) - - -async def stop_wasm_invocation( - invocation_id: str, - *, - reason: str = "Stopped by admin.", -) -> bool: - interrupted = False - with _wasm_invocation_lock: - handle = _wasm_invocation_handles.get(invocation_id) - if handle: - handle.stop_requested = True - handle.stop_reason = reason - handle.invocation.stop_reason = reason - interrupted = _interrupt_wasm_invocation(handle) - - invocation = await get_wasm_invocation(invocation_id) - if invocation and invocation.status == "running": - invocation.stop_reason = reason - await update_wasm_invocation(invocation) - - return interrupted - - -async def stop_wasm_extension_invocations( - extension_id: str, - *, - reason: str = "Extension deactivated.", -) -> int: - with _wasm_invocation_lock: - invocation_ids = [ - invocation_id - for invocation_id, handle in _wasm_invocation_handles.items() - if handle.invocation.extension_id == extension_id - ] - - for invocation_id in invocation_ids: - await stop_wasm_invocation(invocation_id, reason=reason) - - return len(invocation_ids) - - -def wasm_invocation_stop_requested(invocation_id: str) -> bool: - with _wasm_invocation_lock: - handle = _wasm_invocation_handles.get(invocation_id) - return bool(handle and handle.stop_requested) - - -def get_wasm_invocation_stop_reason(invocation_id: str) -> str | None: - with _wasm_invocation_lock: - handle = _wasm_invocation_handles.get(invocation_id) - return handle.stop_reason if handle else None - - -async def finish_wasm_invocation( - invocation_id: str, - *, - status: str, - response_bytes: int | None = None, - memory_peak_bytes: int | None = None, - error_type: str | None = None, - error_message: str | None = None, - stop_reason: str | None = None, -) -> None: - with _wasm_invocation_lock: - handle = _wasm_invocation_handles.pop(invocation_id, None) - - invocation = ( - handle.invocation if handle else await get_wasm_invocation(invocation_id) - ) - if not invocation: - return - - reason = stop_reason or (handle.stop_reason if handle else None) - if handle and handle.stop_requested and status == "failed": - status = "stopped" - reason = reason or "Stopped by admin." - - finished_at = _now() - invocation.status = status - invocation.finished_at = finished_at - invocation.duration_ms = max( - 0, int((finished_at - invocation.started_at).total_seconds() * 1000) - ) - invocation.response_bytes = response_bytes - invocation.memory_peak_bytes = memory_peak_bytes - invocation.error_type = error_type - invocation.error_message = _safe_wasm_error_message(error_message) - invocation.stop_reason = reason - - await update_wasm_invocation(invocation) - - -def get_current_wasm_invocations( - extension_id: str | None = None, -) -> list[WasmInvocation]: - with _wasm_invocation_lock: - invocations = [] - for handle in _wasm_invocation_handles.values(): - if extension_id and handle.invocation.extension_id != extension_id: - continue - invocation = handle.invocation.copy(deep=True) - if handle.stop_requested and invocation.status == "running": - invocation.status = "stopping" - invocation.stop_reason = handle.stop_reason - invocations.append(invocation) - - return sorted( - invocations, key=lambda invocation: invocation.started_at, reverse=True - ) - - -def _check_wasm_invocation_concurrency( - *, - extension_id: str, - user_id: str | None, - limits: dict[str, int] | None, -) -> None: - if not limits: - return - - with _wasm_invocation_lock: - handles = list(_wasm_invocation_handles.values()) - if _wasm_limit_exceeded( - limits["wasm_runtime_max_concurrent_invocations"], - len(handles) + 1, - ): - raise ValueError("WASM runtime has too many active invocations.") - - extension_invocations = sum( - 1 for handle in handles if handle.invocation.extension_id == extension_id - ) - if _wasm_limit_exceeded( - limits["wasm_runtime_max_concurrent_invocations_per_extension"], - extension_invocations + 1, - ): - raise ValueError( - f"WASM extension '{extension_id}' has too many active invocations." - ) - - if not user_id: - return - - user_invocations = sum( - 1 for handle in handles if handle.invocation.user_id == user_id - ) - if _wasm_limit_exceeded( - limits["wasm_runtime_max_concurrent_invocations_per_user"], - user_invocations + 1, - ): - raise ValueError("WASM user has too many active invocations.") - - -def _check_wasm_host_call_limit( - invocation: WasmInvocation, - category: str, - limits: dict[str, int] | None, -) -> None: - if not limits: - return - - if _wasm_limit_exceeded( - limits["wasm_runtime_max_host_calls"], - invocation.host_call_count, - ): - raise ValueError("WASM host call limit exceeded.") - - category_limits = { - "http": ( - limits["wasm_runtime_max_http_calls"], - invocation.http_call_count, - ), - "storage": ( - limits["wasm_runtime_max_storage_calls"], - invocation.storage_call_count, - ), - "wallet": ( - limits["wasm_runtime_max_wallet_calls"], - invocation.wallet_call_count, - ), - } - category_limit = category_limits.get(category) - if category_limit and _wasm_limit_exceeded(*category_limit): - raise ValueError(f"WASM {category} host call limit exceeded.") - - -def _wasm_limit_exceeded(limit: int, value: int) -> bool: - return limit > 0 and value > limit - - -async def get_wasm_invocation_history( - *, - extension_id: str | None = None, - status: str | None = None, - limit: int = 100, - offset: int = 0, -) -> list[WasmInvocation]: - await ensure_wasm_invocation_monitoring_ready() - return await get_wasm_invocations_crud( - extension_id=extension_id, - status=status, - limit=limit, - offset=offset, - ) - - -async def get_wasm_invocation_summary( - *, - extension_id: str | None = None, - hours: int = 24, -) -> WasmInvocationStats: - await ensure_wasm_invocation_monitoring_ready() - since = _now() - timedelta(hours=max(1, min(hours, 24 * 30))) - return await get_wasm_invocation_stats_crud( - extension_id=extension_id, - since=since, - ) - - -def _interrupt_wasm_invocation(handle: WasmInvocationHandle) -> bool: - if not handle.store or not handle.engine: - return False - try: - handle.store.set_epoch_deadline(1) - handle.engine.increment_epoch() - return True - except Exception as exc: - logger.warning( - f"Failed to interrupt WASM invocation '{handle.invocation.id}': {exc}" - ) - return False - - -def _wasm_host_call_category(method_id: str) -> str: - if method_id.startswith("http.") or method_id.startswith("extension.api."): - return "http" - if method_id.startswith("storage."): - return "storage" - if method_id.startswith("wallet."): - return "wallet" - return "host" - - -def _safe_wasm_invocation_context(context: dict) -> dict: - safe_context: dict = {} - for key, value in context.items(): - if not isinstance(key, str): - continue - if value is None or isinstance(value, (bool, int, float)): - safe_context[key[:64]] = value - elif isinstance(value, str): - safe_context[key[:64]] = value[:256] - return safe_context - - -def _safe_wasm_error_message(message: str | None) -> str | None: - if not message: - return None - - safe_message = message[:500] - redactions = [ - ( - r"(?i)(api[-_ ]?key|token|authorization|password|secret|preimage)" - r"\s*[:=]\s*[^\s,;]+", - r"\1=[redacted]", - ), - (r"(?i)bearer\s+[A-Za-z0-9._~+/=-]+", "Bearer [redacted]"), - (r"\b[a-fA-F0-9]{64}\b", "[redacted-hex]"), - ] - for pattern, replacement in redactions: - safe_message = re.sub(pattern, replacement, safe_message) - return safe_message - - -def _now() -> datetime: - return datetime.now(timezone.utc) - - async def uninstall_extension(ext_id: str): await stop_extension_background_work(ext_id) - core_app_extra.unregister_wasm_ext_routes(ext_id) settings.deactivate_extension_paths(ext_id) extension = await get_installed_extension(ext_id) if extension: - if extension.is_wasm: - extension.clean_wasm_extension_files() - else: - extension.clean_extension_files() + extension.clean_extension_files() await delete_installed_extension(ext_id=ext_id) async def activate_extension(ext: Extension): - if ext.is_wasm: - core_app_extra.register_new_wasm_ext_routes(ext.code) - await update_installed_extension_state(ext_id=ext.code, active=True) - return - core_app_extra.register_new_ext_routes(ext) await update_installed_extension_state(ext_id=ext.code, active=True) await start_extension_background_work(ext.code) async def deactivate_extension(ext_id: str): - if is_wasm_extension_id(ext_id): - await stop_wasm_extension_invocations(ext_id, reason="Extension deactivated.") settings.deactivate_extension_paths(ext_id) await update_installed_extension_state(ext_id=ext_id, active=False) await stop_extension_background_work(ext_id) @@ -675,19 +103,16 @@ async def stop_extension_background_work(ext_id: str) -> bool: Stop background work for extension (like asyncio.Tasks, WebSockets, etc). Extension must expose a `myextension_stop()` function if it is starting tasks. """ - if is_wasm_extension_id(ext_id): - return True - - ext = Extension(code=ext_id, is_valid=True) - module_name = ext.module_name + upgrade_hash = settings.extension_upgrade_hash(ext_id) + ext = Extension(code=ext_id, is_valid=True, upgrade_hash=upgrade_hash) try: - logger.info(f"Stopping background work for extension '{module_name}'.") - old_module = importlib.import_module(module_name) + logger.info(f"Stopping background work for extension '{ext.module_name}'.") + old_module = importlib.import_module(ext.module_name) stop_fn_name = f"{ext_id}_stop" if not hasattr(old_module, stop_fn_name): - raise ValueError(f"No stop function found for '{module_name}'.") + raise ValueError(f"No stop function found for '{ext.module_name}'.") stop_fn = getattr(old_module, stop_fn_name) if stop_fn: @@ -695,9 +120,9 @@ async def stop_extension_background_work(ext_id: str) -> bool: await stop_fn() else: stop_fn() - logger.info(f"Stopped background work for extension '{module_name}'.") + logger.info(f"Stopped background work for extension '{ext.module_name}'.") except Exception as ex: - logger.warning(f"Failed to stop background work for '{module_name}'.") + logger.warning(f"Failed to stop background work for '{ext.module_name}'.") logger.warning(ex) return False @@ -710,15 +135,12 @@ async def start_extension_background_work(ext_id: str) -> bool: Extension CAN expose a `myextension_start()` function if it is starting tasks. Extension MUST expose a `myextension_stop()` in that case. """ - if is_wasm_extension_id(ext_id): - return False - - ext = Extension(code=ext_id, is_valid=True) - module_name = ext.module_name + upgrade_hash = settings.extension_upgrade_hash(ext_id) + ext = Extension(code=ext_id, is_valid=True, upgrade_hash=upgrade_hash) try: - logger.info(f"Starting background work for extension '{module_name}'.") - new_module = importlib.import_module(module_name) + logger.info(f"Starting background work for extension '{ext.module_name}'.") + new_module = importlib.import_module(ext.module_name) start_fn_name = f"{ext_id}_start" # start function is optional, return False if not found @@ -731,10 +153,10 @@ async def start_extension_background_work(ext_id: str) -> bool: await start_fn() else: start_fn() - logger.info(f"Started background work for extension '{module_name}'.") + logger.info(f"Started background work for extension '{ext.module_name}'.") return True except Exception as ex: - logger.warning(f"Failed to start background work for '{module_name}'.") + logger.warning(f"Failed to start background work for '{ext.module_name}'.") logger.warning(ex) return False diff --git a/lnbits/core/services/fiat_providers.py b/lnbits/core/services/fiat_providers.py index 6f3c6fdcc..36ec233c3 100644 --- a/lnbits/core/services/fiat_providers.py +++ b/lnbits/core/services/fiat_providers.py @@ -8,7 +8,7 @@ import httpx from loguru import logger from lnbits.core.crud import get_wallet -from lnbits.core.crud.payments import create_payment, update_payment +from lnbits.core.crud.payments import create_payment from lnbits.core.models import CreatePayment, Payment, PaymentState from lnbits.core.models.misc import SimpleStatus from lnbits.db import Connection @@ -20,7 +20,6 @@ from lnbits.fiat.base import ( FiatPaymentSuccessStatus, ) from lnbits.settings import settings -from lnbits.task_manager import task_manager async def handle_fiat_payment_confirmation( @@ -37,7 +36,9 @@ async def handle_fiat_payment_confirmation( logger.warning(e) -async def check_fiat_status(payment: Payment) -> FiatPaymentStatus: +async def check_fiat_status( + payment: Payment, skip_internal_payment_notifications: bool | None = False +) -> FiatPaymentStatus: if not payment.is_internal: return FiatPaymentPendingStatus() if payment.success: @@ -57,11 +58,14 @@ async def check_fiat_status(payment: Payment) -> FiatPaymentStatus: return FiatPaymentPendingStatus() fiat_status = await fiat_provider.get_invoice_status(checking_id) + if skip_internal_payment_notifications: + return fiat_status + if fiat_status.success: - payment.status = PaymentState.SUCCESS.value - await update_payment(payment) - await handle_fiat_payment_confirmation(payment) - task_manager.internal_invoice_queue.put_nowait(payment) + # notify receivers asynchronously + from lnbits.tasks import internal_invoice_queue + + await internal_invoice_queue.put(payment.checking_id) return fiat_status diff --git a/lnbits/core/services/funding_source.py b/lnbits/core/services/funding_source.py index ce9437dc1..02caab058 100644 --- a/lnbits/core/services/funding_source.py +++ b/lnbits/core/services/funding_source.py @@ -66,8 +66,6 @@ async def check_server_balance_against_node(): async def check_balance_delta_changed(): - if settings.notification_balance_delta_threshold_sats <= 0: - return status = await get_balance_delta() if settings.latest_balance_delta_sats is None: settings.latest_balance_delta_sats = status.delta_sats diff --git a/lnbits/core/services/lightning_address.py b/lnbits/core/services/lightning_address.py deleted file mode 100644 index 421b33156..000000000 --- a/lnbits/core/services/lightning_address.py +++ /dev/null @@ -1,242 +0,0 @@ -import json -import re - -from fastapi import Query, Request -from lnurl import ( - CallbackUrl, - LightningInvoice, - LnurlErrorResponse, - LnurlPayActionResponse, - LnurlPayMetadata, - LnurlPayResponse, - MilliSatoshi, -) -from pydantic import parse_obj_as - -from lnbits.core.crud.wallets import ( - get_wallet, - get_wallet_id_by_ln_address, - update_wallet, -) -from lnbits.core.models.payments import CreateInvoice -from lnbits.core.models.wallets import Wallet -from lnbits.core.services.payments import ( - create_invoice, - create_wallet_invoice, - pay_invoice, -) -from lnbits.db import Connection -from lnbits.exceptions import PaymentError -from lnbits.settings import settings - -MAX_SENDABLE_MSAT = 2_100_000_000_000_000_000 -COMMENT_ALLOWED = 799 -LIGHTNING_ADDRESS_REGEX = re.compile(r"^[a-z0-9_.-]{1,210}$") - - -async def set_wallet_lightning_address( - *, - wallet: Wallet, - local_part: str, - allow_blacklisted: bool = False, - charge: bool = False, - conn: Connection | None = None, -) -> Wallet: - if not settings.ln_address_creation_allowed: - raise ValueError("Wallet Lightning Addresses are disabled.") - if not wallet.is_lightning_wallet or wallet.deleted: - raise ValueError("Lightning Address can only be set for active wallets.") - - local_part = await _validate_local_part( - local_part, wallet.id, allow_blacklisted, conn=conn - ) - if wallet.lightning_address == local_part: - return wallet - - if charge: - await _charge_for_lightning_address(wallet) - - wallet.lightning_address = local_part - return await update_wallet(wallet, conn=conn) - - -async def wallet_lightning_address_response( - username: str, request: Request -) -> LnurlPayResponse | LnurlErrorResponse: - local_part, tag = _split_tagged_local_part(username) - wallet_id = await get_wallet_id_by_ln_address(local_part) - if not wallet_id: - return LnurlErrorResponse(reason="Lightning address not found.") - - tagged_local_part = local_part - if tag: - tagged_local_part = f"{tagged_local_part}+{tag}" - - callback = request.url_for( - "lnurl.api_wallet_lightning_address_callback", - username=tagged_local_part, - ) - identifier = _lightning_address_for_request(request, tagged_local_part) - return LnurlPayResponse( - callback=parse_obj_as(CallbackUrl, str(callback)), - minSendable=MilliSatoshi(1000), - maxSendable=MilliSatoshi(MAX_SENDABLE_MSAT), - metadata=LnurlPayMetadata(json.dumps(_metadata(identifier, tag))), - commentAllowed=COMMENT_ALLOWED, - ) - - -async def wallet_lightning_address_callback( - username: str, - request: Request, - amount: int = Query(...), -) -> LnurlErrorResponse | LnurlPayActionResponse: - local_part, tag = _split_tagged_local_part(username) - wallet_id = await get_wallet_id_by_ln_address(local_part) - if not wallet_id: - return LnurlErrorResponse(reason="Lightning address not found.") - - if amount < 1000: - return LnurlErrorResponse(reason="Amount is smaller than minimum 1000.") - if amount > MAX_SENDABLE_MSAT: - return LnurlErrorResponse( - reason=f"Amount is greater than maximum {MAX_SENDABLE_MSAT}." - ) - - comment = request.query_params.get("comment") - if len(comment or "") > COMMENT_ALLOWED: - return LnurlErrorResponse( - reason=( - f"Got a comment with {len(comment or '')} characters, " - f"but can only accept {COMMENT_ALLOWED}" - ) - ) - - tagged_local_part = local_part - if tag: - tagged_local_part = f"{tagged_local_part}+{tag}" - identifier = _lightning_address_for_request(request, tagged_local_part) - extra = { - "tag": "wallet_lightning_address", - "lnaddress": identifier, - } - if tag: - extra["lnaddress_tag"] = tag - if comment: - extra["comment"] = comment - - metadata = LnurlPayMetadata(json.dumps(_metadata(identifier, tag))) - payment = await create_invoice( - wallet_id=wallet_id, - amount=int(amount / 1000), - memo=f"Payment to {identifier}", - unhashed_description=metadata.encode(), - extra=extra, - ) - invoice = parse_obj_as(LightningInvoice, LightningInvoice(payment.bolt11)) - return LnurlPayActionResponse(pr=invoice, disposable=False) - - -def _lightning_address_for_request(request: Request, local_part: str) -> str: - return f"{local_part}@{request.url.netloc}" - - -async def _validate_local_part( - local_part: str, - wallet_id: str, - allow_blacklisted: bool = False, - conn: Connection | None = None, -) -> str: - local_part = local_part.strip().lower() - if not local_part: - raise ValueError("Lightning Address is required.") - if "+" in local_part: - raise ValueError("Lightning Address cannot include tags.") - if "@" in local_part: - raise ValueError("Enter only the Lightning Address name before @.") - if not LIGHTNING_ADDRESS_REGEX.match(local_part): - raise ValueError( - "Lightning Address can only contain lowercase letters, numbers, " - "dash, underscore, and dot." - ) - if not allow_blacklisted and _uses_blacklisted_word(local_part): - raise ValueError("Lightning Address contains a reserved word.") - existing_wallet_id = await get_wallet_id_by_ln_address(local_part, conn=conn) - if existing_wallet_id and existing_wallet_id != wallet_id: - raise ValueError("Lightning Address is already taken.") - - return local_part - - -def _split_tagged_local_part(local_part: str) -> tuple[str, str | None]: - username, separator, tag = local_part.partition("+") - if not separator or not tag: - return username.lower(), None - return username.lower(), tag - - -def _metadata(identifier: str, tag: str | None = None) -> list[list[str]]: - metadata = [ - ["text/plain", f"Payment to {identifier}"], - ["text/identifier", identifier], - ] - if tag: - metadata.append(["text/tag", tag]) - return metadata - - -async def _charge_for_lightning_address(wallet: Wallet) -> None: - price_sats = settings.lnbits_wallet_lightning_address_price_sats - if not settings.lnbits_charge_wallet_lightning_addresses or price_sats <= 0: - return - if not settings.lnbits_service_fee_wallet: - raise ValueError("Lightning Address fee wallet is not configured.") - if settings.lnbits_service_fee_wallet == wallet.source_wallet_id: - raise ValueError("Lightning Address fee wallet cannot be the same wallet.") - - fee_wallet = await get_wallet(settings.lnbits_service_fee_wallet) - if not fee_wallet: - raise ValueError("Lightning Address fee wallet is not configured.") - - invoice = await create_wallet_invoice( - settings.lnbits_service_fee_wallet, - CreateInvoice( - out=False, - amount=price_sats, - memo="Lightning Address fee", - internal=True, - extra={ - "tag": "wallet_lightning_address_fee", - "wallet": wallet.source_wallet_id, - }, - ), - ) - try: - await pay_invoice( - wallet_id=wallet.source_wallet_id, - payment_request=invoice.bolt11, - description="Lightning Address fee", - tag="wallet_lightning_address_fee", - extra={ - "tag": "wallet_lightning_address_fee", - "fee_wallet": settings.lnbits_service_fee_wallet, - }, - ) - except PaymentError as exc: - raise ValueError(exc.message) from exc - - -def _blacklist_words() -> set[str]: - return { - word.strip().lower() - for word in settings.lnbits_wallet_lightning_address_blacklist - if word.strip() - } - - -def _uses_blacklisted_word(local_part: str) -> bool: - words = _blacklist_words() - if not words: - return False - segments = [segment for segment in re.split(r"[._-]+", local_part) if segment] - return local_part in words or any(segment in words for segment in segments) diff --git a/lnbits/core/services/notifications.py b/lnbits/core/services/notifications.py index bed83e842..8860fbd6a 100644 --- a/lnbits/core/services/notifications.py +++ b/lnbits/core/services/notifications.py @@ -74,7 +74,7 @@ async def send_admin_notification( message: str, message_type: str | None = None, ) -> None: - return await send_notification_in_background( + return await send_notification( settings.lnbits_telegram_notifications_chat_id, settings.lnbits_nostr_notifications_identifiers, settings.lnbits_email_notifications_to_emails, @@ -97,7 +97,7 @@ async def send_user_notification( if user_notifications.nostr_identifier else [] ) - return await send_notification_in_background( + return await send_notification( user_notifications.telegram_chat_id, nostr_identifiers, email_address, @@ -222,29 +222,12 @@ async def send_email( msg["Subject"] = subject msg.attach(MIMEText(message, "plain")) username = username if len(username) > 0 else from_email - - def _send() -> bool: - with smtplib.SMTP(server, port) as smtp_server: - smtp_server.starttls() - smtp_server.login(username, password) - smtp_server.sendmail(from_email, to_emails, msg.as_string()) + with smtplib.SMTP(server, port) as smtp_server: + smtp_server.starttls() + smtp_server.login(username, password) + smtp_server.sendmail(from_email, to_emails, msg.as_string()) return True - try: - return await asyncio.to_thread(_send) - except Exception as e: - logger.warning(f"Sending Email failed. {e!s}") - return False - - -async def dispatch_payment_notification(payment: Payment) -> None: - """ - This worker dispatches the payment notifications. - """ - wallet = await get_wallet(payment.wallet_id) - if wallet: - await send_payment_notification(wallet, payment) - async def dispatch_webhook(payment: Payment): """ @@ -311,27 +294,6 @@ def send_payment_notification_in_background(wallet: Wallet, payment: Payment): logger.warning(f"Error sending payment notification: {e}") -async def send_notification_in_background( - telegram_chat_id: str | None, - nostr_identifiers: list[str] | None, - email_addresses: list[str] | None, - message: str, - message_type: str | None = None, -): - try: - create_task( - send_notification( - telegram_chat_id, - nostr_identifiers, - email_addresses, - message, - message_type, - ) - ) - except Exception as e: - logger.warning(f"Error sending notification in background: {e}") - - async def send_ws_payment_notification(wallet: Wallet, payment: Payment): # TODO: websocket message should be a clean payment model # await websocket_manager.send(wallet.inkey, payment.json()) diff --git a/lnbits/core/services/payments.py b/lnbits/core/services/payments.py index 4987dd517..3374a0dd4 100644 --- a/lnbits/core/services/payments.py +++ b/lnbits/core/services/payments.py @@ -13,13 +13,13 @@ from lnbits.core.crud.payments import get_daily_stats from lnbits.core.db import db from lnbits.core.models import PaymentDailyStats, PaymentFilters from lnbits.core.models.payments import CreateInvoice +from lnbits.core.services.fiat_providers import handle_fiat_payment_confirmation from lnbits.db import Connection, Filters from lnbits.decorators import check_user_extension_access from lnbits.exceptions import InvoiceError, PaymentError, UnsupportedError from lnbits.fiat import get_fiat_provider -from lnbits.helpers import check_callback_url, daystart_timestamp +from lnbits.helpers import check_callback_url from lnbits.settings import settings -from lnbits.task_manager import task_manager from lnbits.utils.crypto import fake_privkey, random_secret_and_hash, verify_preimage from lnbits.utils.exchange_rates import fiat_amount_as_satoshis, satoshis_amount_as_fiat from lnbits.wallets import fake_wallet, get_funding_source @@ -118,8 +118,6 @@ async def create_payment_request( Create a lightning invoice or a fiat payment request. """ if invoice_data.fiat_provider: - if invoice_data.is_fiat_subscription(): - raise ValueError("Cannot create direct fiat subscription payments.") return await create_fiat_invoice(wallet_id, invoice_data) return await create_wallet_invoice(wallet_id, invoice_data) @@ -217,7 +215,6 @@ async def create_wallet_invoice(wallet_id: str, data: CreateInvoice) -> Payment: unhashed_description=unhashed_description, expiry=data.expiry, extra=data.extra, - extension=data.extension, webhook=data.webhook, internal=data.internal, payment_hash=data.payment_hash, @@ -263,7 +260,6 @@ async def create_invoice( webhook: str | None = None, internal: bool | None = False, payment_hash: str | None = None, - extension: str | None = None, labels: list[str] | None = None, external_id: str | None = None, conn: Connection | None = None, @@ -347,7 +343,6 @@ async def create_invoice( expiry=invoice.expiry_date, memo=memo, extra=extra, - extension=extension, webhook=webhook, fee=invoice_response.fee_msat or 0, labels=labels, @@ -376,13 +371,6 @@ async def update_pending_payments(wallet_id: str): async def update_pending_payment( payment: Payment, conn: Connection | None = None ) -> Payment: - if payment.is_in and payment.is_expired: - payment.status = PaymentState.FAILED - payment.labels.append("expired") - await update_payment(payment, conn=conn) - logger.info(f"invoice {payment.checking_id} expired, marked as failed") - return payment - status = await check_payment_status(payment) if status.failed: payment.status = PaymentState.FAILED @@ -526,7 +514,9 @@ async def update_wallet_balance( ) payment.status = PaymentState.SUCCESS await update_payment(payment, conn=conn) - task_manager.internal_invoice_queue.put_nowait(payment) + from lnbits.tasks import internal_invoice_queue_put + + await internal_invoice_queue_put(payment.checking_id) async def check_wallet_limits( @@ -566,9 +556,10 @@ async def check_wallet_daily_withdraw_limit( raise ValueError("It is not allowed to spend funds from this server.") payments = await get_payments( - since=daystart_timestamp(), + since=int(time.time()) - 60 * 60 * 24, outgoing=True, wallet_id=wallet_id, + limit=1, conn=conn, ) if len(payments) == 0: @@ -634,19 +625,23 @@ async def check_transaction_status( return PaymentPendingStatus() if payment.status == PaymentState.SUCCESS.value: - return PaymentSuccessStatus(fee_msat=payment.fee, preimage=payment.preimage) + return PaymentSuccessStatus(fee_msat=payment.fee) return await check_payment_status(payment) -async def check_payment_status(payment: Payment) -> PaymentStatus: +async def check_payment_status( + payment: Payment, skip_internal_payment_notifications: bool | None = False +) -> PaymentStatus: if payment.is_internal: if payment.success: - return PaymentSuccessStatus(fee_msat=payment.fee, preimage=payment.preimage) + return PaymentSuccessStatus() if payment.failed: return PaymentFailedStatus() if payment.is_in and payment.fiat_provider: - fiat_status = await check_fiat_status(payment) + fiat_status = await check_fiat_status( + payment, skip_internal_payment_notifications + ) return PaymentStatus(paid=fiat_status.paid) return PaymentPendingStatus() funding_source = get_funding_source() @@ -788,16 +783,13 @@ async def _pay_internal_invoice( await update_payment(internal_payment, conn=conn) logger.success(f"internal payment successful {internal_payment.checking_id}") - await _send_payment_notification_in_background( - wallet.id, payment, conn=conn - ) # notify the sender - await _send_payment_notification_in_background( - internal_payment.wallet_id, internal_payment, conn=conn - ) # notify the receiver + await _send_payment_notification_in_background(wallet.id, payment, conn=conn) + + # notify receiver asynchronously + from lnbits.tasks import internal_invoice_queue - # notify receiver asynchronously (extension listeners) logger.debug(f"enqueuing internal invoice {internal_payment.checking_id}") - task_manager.internal_invoice_queue.put_nowait(internal_payment) + await internal_invoice_queue.put(internal_payment.checking_id) return payment @@ -834,15 +826,16 @@ async def _pay_external_invoice( fee_reserve_msat = fee_reserve(amount_msat, internal=False) - task = task_manager.create_task( - _fundingsource_pay_invoice(checking_id, payment.bolt11, fee_reserve_msat), - f"fundingsource_pay_invoice_{checking_id}", + from lnbits.tasks import create_task + + task = create_task( + _fundingsource_pay_invoice(checking_id, payment.bolt11, fee_reserve_msat) ) # make sure a hold invoice or deferred payment is not blocking the server wait_time = max(1, settings.lnbits_funding_source_pay_invoice_wait_seconds) try: - payment_response = await asyncio.wait_for(task.task, timeout=wait_time) + payment_response = await asyncio.wait_for(task, timeout=wait_time) except asyncio.TimeoutError: # return pending payment on timeout logger.debug( @@ -850,46 +843,26 @@ async def _pay_external_invoice( ) return payment - # IMPORTANT PAYMENT RULES! - # True -> success - # False-> failed - # None -> pending (any ambigous payment responses MUST be set as pending) - # payment failed - if payment_response.failed: + if ( + payment_response.checking_id is None + or payment_response.ok is False + or payment_response.checking_id != checking_id + ): payment.status = PaymentState.FAILED await update_payment(payment, conn=conn) message = payment_response.error_message or "without an error message." raise PaymentError(f"Payment failed: {message}", status="failed") - # payment successful - elif payment_response.success: + if payment_response.success: payment = await update_payment_success_status( - payment, - payment_response, - conn=conn, - new_checking_id=payment_response.checking_id, + payment, payment_response, conn=conn ) await _send_payment_notification_in_background(wallet.id, payment, conn=conn) - logger.success(f"payment successful {payment.checking_id}") - - # payment pending - else: - if ( - payment_response.checking_id - and payment_response.checking_id != payment.checking_id - ): - payment = await update_payment( - payment, - new_checking_id=payment_response.checking_id, - conn=conn, - ) - logger.warning( - f"payment status unknown {payment.checking_id}: " - f"{payment_response.error_message or 'no error message'}" - ) + logger.success(f"payment successful {payment_response.checking_id}") + payment.checking_id = payment_response.checking_id return payment @@ -897,16 +870,13 @@ async def update_payment_success_status( payment: Payment, status: PaymentStatus, conn: Connection | None = None, - new_checking_id: str | None = None, ) -> Payment: if status.success: service_fee_msat = service_fee(payment.amount, internal=False) payment.status = PaymentState.SUCCESS payment.fee = -(abs(status.fee_msat or 0) + abs(service_fee_msat)) payment.preimage = payment.preimage or status.preimage - payment = await update_payment( - payment, new_checking_id=new_checking_id, conn=conn - ) + payment = await update_payment(payment, conn=conn) return payment @@ -1109,44 +1079,29 @@ async def _send_payment_notification_in_background( send_payment_notification_in_background(wallet, payment) -async def update_invoice_from_paid_invoices_stream(checking_id: str) -> Payment | None: +async def update_invoice_callback(checking_id: str) -> Payment | None: """ - Takes a checking_id of an incoming payment from paid_invoices_stream() - Checks its status, updates its status and returns it. - returns None if no incoming payment was found or the status is not successful + Takes a checking_id of an incoming payment, from either paid_invoices_stream() + or internal_invoice_queue. Checks its status, updates and returns it. + returns None if no payment was found or it not and incoming payment. """ payment = await get_standalone_payment(checking_id, incoming=True) if not payment: - logger.warning(f"No incoming payment found for '{checking_id}'.") - return None - - status = await check_payment_status(payment) - - if not status.success: - logger.error( - "Unexpected status response from paid_invoices_stream. Skipping update." - ) + logger.warning(f"No payment found for '{checking_id}'.") + return None + if not payment.is_in: + logger.warning(f"Payment '{checking_id}' is not incoming, skipping.") return None + status = await check_payment_status( + payment, skip_internal_payment_notifications=True + ) payment.fee = status.fee_msat or payment.fee # only overwrite preimage if status.preimage provides it payment.preimage = status.preimage or payment.preimage + payment.status = PaymentState.SUCCESS payment = await update_payment(payment) - + if payment.fiat_provider: + await handle_fiat_payment_confirmation(payment) return payment - - -async def fundingsource_invoice_producer() -> None: - """ - will collect all invoices that come directly from the backend wallet. - - Called registered in the app startup sequence and run by taskmanager. - """ - funding_source = get_funding_source() - async for checking_id in funding_source.paid_invoices_stream(): - logger.info(f"got a payment notification {checking_id}") - payment = await update_invoice_from_paid_invoices_stream(checking_id) - if payment: - logger.success(f"fundingsource invoice {checking_id} settled") - task_manager.invoice_queue.put_nowait(payment) diff --git a/lnbits/core/tasks.py b/lnbits/core/tasks.py index e11e205bf..a27756ce2 100644 --- a/lnbits/core/tasks.py +++ b/lnbits/core/tasks.py @@ -2,43 +2,76 @@ import asyncio from loguru import logger -from lnbits.core.crud import create_audit_entry +from lnbits.core.crud import ( + create_audit_entry, + get_wallet, +) +from lnbits.core.crud.audit import delete_expired_audit_entries from lnbits.core.crud.payments import get_payments_status_count from lnbits.core.crud.users import get_accounts from lnbits.core.crud.wallets import get_wallets_count from lnbits.core.models.audit import AuditEntry from lnbits.core.models.extensions import InstallableExtension from lnbits.core.models.notifications import NotificationType -from lnbits.core.services.funding_source import get_balance_delta +from lnbits.core.services.funding_source import ( + check_balance_delta_changed, + check_server_balance_against_node, + get_balance_delta, +) from lnbits.core.services.notifications import ( enqueue_admin_notification, + process_next_notification, + send_payment_notification, ) from lnbits.db import Filters from lnbits.settings import settings -from lnbits.utils.cache import cache -from lnbits.utils.exchange_rates import btc_price_from_aggregator, btc_rates +from lnbits.utils.exchange_rates import btc_rates audit_queue: asyncio.Queue[AuditEntry] = asyncio.Queue() -async def process_next_audit_entry() -> None: - """ - Waits for audit entries to be pushed to the queue. - Then it inserts the entries into the DB. - """ - data = await audit_queue.get() - await create_audit_entry(data) +async def run_by_the_minute_tasks() -> None: + minute_counter = 0 + while settings.lnbits_running: + status_minutes = settings.lnbits_notification_server_status_hours * 60 + + if settings.notification_balance_delta_threshold_sats > 0: + try: + # runs by default every minute, the delta should not change that often + await check_balance_delta_changed() + except Exception as ex: + logger.error(ex) + + if minute_counter % settings.lnbits_watchdog_interval_minutes == 0: + try: + await check_server_balance_against_node() + except Exception as ex: + logger.error(ex) + + if minute_counter % status_minutes == 0: + try: + await _notify_server_status() + except Exception as ex: + logger.error(ex) + + if minute_counter % 60 == 0: + try: + # initialize the list of all extensions + await InstallableExtension.get_installable_extensions( + post_refresh_cache=True + ) + except Exception as ex: + logger.error(ex) + + minute_counter += 1 + await asyncio.sleep(60) -async def refresh_extension_cache() -> None: - # only refreshes every 10 minutes - await InstallableExtension.get_installable_extensions() - - -async def notify_server_status() -> None: +async def _notify_server_status() -> None: accounts = await get_accounts(filters=Filters(limit=0)) wallets_count = await get_wallets_count() payments = await get_payments_status_count() + status = await get_balance_delta() values = { "up_time": settings.lnbits_server_up_time, @@ -55,38 +88,76 @@ async def notify_server_status() -> None: enqueue_admin_notification(NotificationType.server_status, values) +async def wait_for_paid_invoices(invoice_paid_queue: asyncio.Queue) -> None: + """ + This worker dispatches events to all extensions and dispatches webhooks. + """ + while settings.lnbits_running: + payment = await invoice_paid_queue.get() + logger.trace("received invoice paid event") + # payment notification + wallet = await get_wallet(payment.wallet_id) + if wallet: + await send_payment_notification(wallet, payment) + + +async def wait_for_audit_data() -> None: + """ + Waits for audit entries to be pushed to the queue. + Then it inserts the entries into the DB. + """ + while settings.lnbits_running: + data = await audit_queue.get() + try: + await create_audit_entry(data) + except Exception as ex: + logger.warning(ex) + await asyncio.sleep(3) + + +async def wait_notification_messages() -> None: + + while settings.lnbits_running: + try: + await process_next_notification() + except Exception as ex: + logger.warning("Payment notification error", ex) + await asyncio.sleep(3) + + +async def purge_audit_data() -> None: + """ + Remove audit entries which have passed their retention period. + """ + while settings.lnbits_running: + try: + await delete_expired_audit_entries() + except Exception as ex: + logger.warning(ex) + + # clean every hour + await asyncio.sleep(60 * 60) + + async def collect_exchange_rates_data() -> None: """ Collect exchange rates data. Used for monitoring only. """ - currency = settings.lnbits_default_accounting_currency or "USD" - max_history_size = settings.lnbits_exchange_history_size - try: - if ( - settings.lnbits_price_aggregator_enabled - and settings.lnbits_price_aggregator_url - ): - price = await btc_price_from_aggregator(currency) - if price: - cache.set( - f"btc-price-{currency}", - price, - expiry=settings.lnbits_exchange_rate_cache_seconds, - ) - settings.append_exchange_rate_datapoint( - {"Aggregator": price}, max_history_size - ) + while settings.lnbits_running: + currency = settings.lnbits_default_accounting_currency or "USD" + max_history_size = settings.lnbits_exchange_history_size + sleep_time = settings.lnbits_exchange_history_refresh_interval_seconds + + if sleep_time > 0: + try: + rates = await btc_rates(currency) + if rates: + rates_values = [r[1] for r in rates] + lnbits_rate = sum(rates_values) / len(rates_values) + rates.append(("LNbits", lnbits_rate)) + settings.append_exchange_rate_datapoint(dict(rates), max_history_size) + except Exception as ex: + logger.warning(ex) else: - rates = await btc_rates(currency) - if rates: - rates_values = [r[1] for r in rates] - lnbits_rate = sum(rates_values) / len(rates_values) - rates.append(("LNbits", lnbits_rate)) - cache.set( - f"btc-price-{currency}", - lnbits_rate, - expiry=settings.lnbits_exchange_rate_cache_seconds, - ) - settings.append_exchange_rate_datapoint(dict(rates), max_history_size) - except Exception as ex: - logger.warning(ex) + sleep_time = 60 + await asyncio.sleep(sleep_time) diff --git a/lnbits/core/views/admin_api.py b/lnbits/core/views/admin_api.py index c46498b70..6e69d07c8 100644 --- a/lnbits/core/views/admin_api.py +++ b/lnbits/core/views/admin_api.py @@ -20,7 +20,7 @@ from lnbits.core.services.settings import dict_to_settings from lnbits.decorators import check_admin, check_super_user from lnbits.server import server_restart from lnbits.settings import AdminSettings, Settings, UpdateSettings, settings -from lnbits.task_manager import PublicTask, task_manager +from lnbits.tasks import invoice_listeners from .. import core_app_extra from ..crud import get_admin_settings, reset_core_settings, update_admin_settings @@ -44,10 +44,11 @@ async def api_auditor(): name="Monitor", description="show the current listeners and other monitoring data", dependencies=[Depends(check_admin)], - response_model=list[PublicTask], ) -async def api_monitor() -> list[PublicTask]: - return task_manager.get_public_tasks() +async def api_monitor(): + return { + "invoice_listeners": list(invoice_listeners.keys()), + } @admin_router.get( diff --git a/lnbits/core/views/auth_api.py b/lnbits/core/views/auth_api.py index 5a88c257f..71a792a93 100644 --- a/lnbits/core/views/auth_api.py +++ b/lnbits/core/views/auth_api.py @@ -295,10 +295,7 @@ async def api_create_user_api_token( account.username, api_token_id, data.expiration_time_minutes ) - expires_at = int(time()) + data.expiration_time_minutes * 60 - acl.token_id_list.append( - SimpleItem(id=api_token_id, name=data.token_name, expires_at=expires_at) - ) + acl.token_id_list.append(SimpleItem(id=api_token_id, name=data.token_name)) await update_user_access_control_list(acls) return ApiTokenResponse(id=api_token_id, api_token=api_token) @@ -326,7 +323,7 @@ async def api_delete_user_api_token( async def login_with_sso_provider( request: Request, provider: str, - user_id: str | None = None, + user_id: str | None, auth_user_id: str | None = Depends(optional_user_id), ): provider_sso = _new_sso(provider) diff --git a/lnbits/core/views/blockexplorer_api.py b/lnbits/core/views/blockexplorer_api.py deleted file mode 100644 index e088988d3..000000000 --- a/lnbits/core/views/blockexplorer_api.py +++ /dev/null @@ -1,170 +0,0 @@ -import asyncio -from http import HTTPStatus -from typing import Annotated - -from fastapi import APIRouter, Depends, HTTPException, Request, WebSocket -from pydantic.types import UUID4 - -from lnbits.core.services.blockexplorer import ( - address_event_to_response, - fetch_fee_estimates, - fetch_onchain_balance, - fetch_recent_blocks, - fetch_tip, - fetch_transaction, - fetch_utxos, -) -from lnbits.decorators import check_access_token, check_user_exists -from lnbits.settings import settings -from lnbits.task_manager import ( - OnchainAddressEvent, - OnchainTxEvent, - relay_ws_queue, - task_manager, -) -from lnbits.utils.electrum import ( - UTXO, - AddressResponse, - BlockHeader, - BlockInfo, - ElectrumError, - FeeResponse, - Transaction, - scripthash_from_address, -) - -blockexplorer_router = APIRouter( - tags=["Block Explorer"], - prefix="/blockexplorer/api/v1", -) - - -def _check_enabled() -> None: - if not settings.lnbits_blockexplorer_enabled: - raise HTTPException( - status_code=HTTPStatus.SERVICE_UNAVAILABLE, - detail="Block explorer is not enabled.", - ) - - -async def _check_api_access( - r: Request, - access_token: Annotated[str | None, Depends(check_access_token)], - usr: UUID4 | None = None, -) -> None: - _check_enabled() - if not settings.lnbits_blockexplorer_public_api: - await check_user_exists(r, access_token, usr) - - -# ---- REST ---- - - -@blockexplorer_router.get("/blocks", dependencies=[Depends(_check_api_access)]) -async def api_blocks() -> list[BlockInfo]: - try: - return await fetch_recent_blocks() - except ElectrumError as e: - raise HTTPException(HTTPStatus.SERVICE_UNAVAILABLE, detail=str(e)) from e - - -@blockexplorer_router.get("/tip", dependencies=[Depends(_check_api_access)]) -async def api_tip() -> BlockHeader: - try: - return await fetch_tip() - except ElectrumError as e: - raise HTTPException(HTTPStatus.SERVICE_UNAVAILABLE, detail=str(e)) from e - - -@blockexplorer_router.get("/fees", dependencies=[Depends(_check_api_access)]) -async def api_fees() -> FeeResponse: - try: - return await fetch_fee_estimates() - except ElectrumError as e: - raise HTTPException(HTTPStatus.SERVICE_UNAVAILABLE, detail=str(e)) from e - - -@blockexplorer_router.get("/tx/{txid}", dependencies=[Depends(_check_api_access)]) -async def api_tx(txid: str) -> Transaction: - try: - return await fetch_transaction(txid) - except ElectrumError as e: - raise HTTPException(HTTPStatus.SERVICE_UNAVAILABLE, detail=str(e)) from e - - -@blockexplorer_router.get( - "/address/{address}", dependencies=[Depends(_check_api_access)] -) -async def api_address(address: str) -> AddressResponse: - try: - scripthash_from_address(address) - except ValueError as e: - raise HTTPException(HTTPStatus.BAD_REQUEST, detail=str(e)) from e - try: - return await fetch_onchain_balance(address) - except ElectrumError as e: - raise HTTPException(HTTPStatus.SERVICE_UNAVAILABLE, detail=str(e)) from e - - -@blockexplorer_router.get("/utxos/{address}", dependencies=[Depends(_check_api_access)]) -async def api_utxos(address: str) -> list[UTXO]: - try: - scripthash_from_address(address) - except ValueError as e: - raise HTTPException(HTTPStatus.BAD_REQUEST, detail=str(e)) from e - try: - return await fetch_utxos(address) - except ElectrumError as e: - raise HTTPException(HTTPStatus.SERVICE_UNAVAILABLE, detail=str(e)) from e - - -# ---- WebSocket ---- - - -@blockexplorer_router.websocket("/ws/blocks") -async def ws_blocks(websocket: WebSocket) -> None: - if not settings.lnbits_blockexplorer_enabled: - await websocket.close(code=1008) - return - await websocket.accept() - - queue: asyncio.Queue[BlockInfo] = asyncio.Queue() - task_manager.register_ws_block_queue(queue) - try: - await relay_ws_queue(websocket, queue) - finally: - task_manager.unregister_ws_block_queue(queue) - - -@blockexplorer_router.websocket("/ws/address/{address}") -async def ws_address(websocket: WebSocket, address: str) -> None: - if not settings.lnbits_blockexplorer_enabled: - await websocket.close(code=1008) - return - await websocket.accept() - - queue: asyncio.Queue[OnchainAddressEvent] = asyncio.Queue() - try: - task_manager.register_ws_address_queue(address, queue) - except ValueError as e: - await websocket.close(code=1008, reason=str(e)) - return - try: - await relay_ws_queue(websocket, queue, serialize=address_event_to_response) - finally: - task_manager.unregister_ws_address_queue(address, queue) - - -@blockexplorer_router.websocket("/ws/tx/{txid}") -async def ws_tx(websocket: WebSocket, txid: str) -> None: - if not settings.lnbits_blockexplorer_enabled: - await websocket.close(code=1008) - return - await websocket.accept() - - queue: asyncio.Queue[OnchainTxEvent] = asyncio.Queue() - task_manager.register_ws_tx_queue(txid, queue) - try: - await relay_ws_queue(websocket, queue, stop_after=lambda e: e.confirmed) - finally: - task_manager.unregister_ws_tx_queue(txid, queue) diff --git a/lnbits/core/views/callback_api.py b/lnbits/core/views/callback_api.py index 80b7ed4c4..9107bf0a4 100644 --- a/lnbits/core/views/callback_api.py +++ b/lnbits/core/views/callback_api.py @@ -439,7 +439,7 @@ async def _handle_revolut_subscription( extra = { **(reference.extra or {}), - "subscription_request_id": subscription_id, + "subscription_request_id": reference.subscription_request_id, "fiat_method": "subscription", "tag": reference.tag, "subscription": { diff --git a/lnbits/core/views/extension_api.py b/lnbits/core/views/extension_api.py index 8b2c6b1c1..46bf3b080 100644 --- a/lnbits/core/views/extension_api.py +++ b/lnbits/core/views/extension_api.py @@ -1,4 +1,3 @@ -import json import sys import traceback from http import HTTPStatus @@ -10,7 +9,7 @@ from fastapi.requests import Request from loguru import logger from lnbits.core.crud.extensions import get_user_extensions -from lnbits.core.crud.wallets import get_wallet, get_wallets_ids +from lnbits.core.crud.wallets import get_wallets_ids from lnbits.core.db import db from lnbits.core.models import ( SimpleStatus, @@ -19,54 +18,27 @@ from lnbits.core.models.extensions import ( CreateExtension, CreateExtensionReview, Extension, - ExtensionArchiveValidationError, - ExtensionBackgroundPaymentDestinationPolicy, - ExtensionBackgroundPaymentGrant, - ExtensionBackgroundPaymentGrantRequest, ExtensionConfig, ExtensionMeta, - ExtensionPermissionCheckRequest, - ExtensionPermissionCheckResponse, - ExtensionPermissionCheckResult, - ExtensionPermissionsResponse, - ExtensionPermissionsUpdate, ExtensionRelease, ExtensionReview, ExtensionReviewPaymentRequest, ExtensionReviewsStatus, - ExtensionWalletPaymentsWatchGrant, - ExtensionWalletPaymentsWatchGrantRequest, InstallableExtension, PayToEnableInfo, ReleasePaymentInfo, UserExtension, UserExtensionInfo, - WasmInvocation, - WasmInvocationStats, - WasmRuntimeLimitsInfo, - WasmRuntimeLimitsUpdate, - wasm_extension_icon_url, ) from lnbits.core.models.users import Account, AccountId from lnbits.core.services import check_transaction_status, create_invoice from lnbits.core.services.extensions import ( activate_extension, deactivate_extension, - get_current_wasm_invocations, get_valid_extension, get_valid_extensions, - get_wasm_invocation_history, - get_wasm_invocation_summary, install_extension, - resolve_wasm_runtime_limits, - stop_wasm_invocation, uninstall_extension, - update_wasm_extension_runtime_limits, - validate_wasm_runtime_limit_overrides, -) -from lnbits.core.wasm_ext.api.permissions import ( - validate_extension_permissions, - validate_wasm_extension_permissions, ) from lnbits.db import Page from lnbits.decorators import ( @@ -94,9 +66,6 @@ extension_router = APIRouter( prefix="/api/v1/extension", ) -WALLET_PAY_INVOICE_BACKGROUND_PERMISSION = "wallet.pay_invoice_background" -WALLET_PAYMENTS_WATCH_PERMISSION = "wallet.payments.watch" - @extension_router.post("", dependencies=[Depends(check_admin)]) async def api_install_extension(data: CreateExtension): @@ -120,27 +89,13 @@ async def api_install_extension(data: CreateExtension): ) try: - extension = await install_extension( - ext_info, - granted_permissions=data.permissions, - allow_admin_policy_overrides=True, - ) + extension = await install_extension(ext_info) except Exception as exc: logger.warning(exc) etype, _, tb = sys.exc_info() traceback.print_exception(etype, exc, tb) - if isinstance(exc, ExtensionArchiveValidationError): - ext_info.zip_path.unlink(missing_ok=True) - else: - try: - archive_config = ext_info.load_archive_config() - except ValueError: - archive_config = {} - if archive_config.get("extension_type") == "wasm": - ext_info.clean_wasm_extension_files() - else: - ext_info.clean_extension_files() + ext_info.clean_extension_files() detail = ( str(exc) if isinstance(exc, (AssertionError, ValueError)) @@ -173,106 +128,6 @@ async def api_install_extension(data: CreateExtension): ) from exc -@extension_router.get( - "/wasm/invocations/current", - dependencies=[Depends(check_admin)], -) -async def api_get_current_wasm_invocations( - extension_id: str | None = None, -) -> list[WasmInvocation]: - return get_current_wasm_invocations(extension_id=extension_id) - - -@extension_router.get( - "/wasm/invocations", - dependencies=[Depends(check_admin)], -) -async def api_get_wasm_invocations( - extension_id: str | None = None, - status: str | None = None, - limit: int = 100, - offset: int = 0, -) -> list[WasmInvocation]: - return await get_wasm_invocation_history( - extension_id=extension_id, - status=status, - limit=limit, - offset=offset, - ) - - -@extension_router.get( - "/wasm/invocations/stats", - dependencies=[Depends(check_admin)], -) -async def api_get_wasm_invocation_stats( - extension_id: str | None = None, - hours: int = 24, -) -> WasmInvocationStats: - return await get_wasm_invocation_summary(extension_id=extension_id, hours=hours) - - -@extension_router.post( - "/wasm/invocations/{invocation_id}/stop", - dependencies=[Depends(check_admin)], -) -async def api_stop_wasm_invocation(invocation_id: str) -> SimpleStatus: - await stop_wasm_invocation(invocation_id, reason="Stopped by admin.") - return SimpleStatus(success=True, message="WASM invocation stop requested.") - - -@extension_router.get( - "/wasm/runtime-limits/extensions", - dependencies=[Depends(check_admin)], -) -async def api_get_wasm_runtime_limit_extensions() -> list[WasmRuntimeLimitsInfo]: - installed_extensions = await get_installed_extensions() - return [ - WasmRuntimeLimitsInfo( - id=extension.id, - name=extension.name, - active=extension.active, - wasm_runtime_limits=validate_wasm_runtime_limit_overrides( - extension.wasm_runtime_limits, - strict=False, - ), - effective_wasm_runtime_limits=resolve_wasm_runtime_limits(extension), - ) - for extension in installed_extensions - if extension.is_wasm - ] - - -@extension_router.put( - "/wasm/runtime-limits/{ext_id}", - dependencies=[Depends(check_admin)], -) -async def api_update_wasm_runtime_limits( - ext_id: str, - data: WasmRuntimeLimitsUpdate, -) -> WasmRuntimeLimitsInfo: - try: - wasm_runtime_limits = await update_wasm_extension_runtime_limits( - ext_id, data.limits - ) - extension = await get_installed_extension(ext_id) - if not extension: - raise ValueError(f"Extension '{ext_id}' is not installed.") - extension.wasm_runtime_limits = wasm_runtime_limits - return WasmRuntimeLimitsInfo( - id=extension.id, - name=extension.name, - active=extension.active, - wasm_runtime_limits=wasm_runtime_limits, - effective_wasm_runtime_limits=resolve_wasm_runtime_limits(extension), - ) - except ValueError as exc: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, - detail=str(exc), - ) from exc - - @extension_router.get("/{ext_id}/details") async def api_extension_details( ext_id: str, @@ -396,250 +251,6 @@ async def api_disable_extension( return SimpleStatus(success=True, message=f"Extension '{ext_id}' disabled.") -@extension_router.post("/{ext_id}/permissions/background-payment") -async def api_grant_background_payment_permission( - ext_id: str, - data: ExtensionBackgroundPaymentGrantRequest, - account_id: AccountId = Depends(check_account_id_exists), -) -> dict: - installed_ext = await get_installed_extension(ext_id) - if not installed_ext or not installed_ext.active: - raise HTTPException( - HTTPStatus.NOT_FOUND, f"Extension '{ext_id}' is not active." - ) - - installed_permission_ids = { - permission.id for permission in installed_ext.permissions or [] - } - if WALLET_PAY_INVOICE_BACKGROUND_PERMISSION not in installed_permission_ids: - raise HTTPException( - HTTPStatus.FORBIDDEN, - f"Extension '{ext_id}' cannot request background payments.", - ) - - user_ext = await get_user_extension(account_id.id, ext_id) - if not user_ext or not user_ext.active: - raise HTTPException( - HTTPStatus.FORBIDDEN, - f"Extension '{ext_id}' is not enabled for this user.", - ) - - wallet = await get_wallet(data.wallet_id) - if not wallet or wallet.user != account_id.id: - raise HTTPException(HTTPStatus.FORBIDDEN, "Not your wallet.") - if wallet.is_lightning_shared_wallet: - raise HTTPException( - HTTPStatus.BAD_REQUEST, - "Background payments are not allowed from shared wallets.", - ) - if not wallet.can_send_payments: - raise HTTPException( - HTTPStatus.BAD_REQUEST, - "This wallet cannot send payments.", - ) - - permissions = user_ext.permissions or {} - grant = data.to_grant( - _user_permission_grant_id_for_wallet( - permissions, - WALLET_PAY_INVOICE_BACKGROUND_PERMISSION, - data.wallet_id, - ) - ) - background_grants = [ - existing - for existing in permissions.get(WALLET_PAY_INVOICE_BACKGROUND_PERMISSION, []) - if isinstance(existing, dict) and existing.get("wallet_id") != grant.wallet_id - ] - background_grants.append(json.loads(grant.json())) - permissions[WALLET_PAY_INVOICE_BACKGROUND_PERMISSION] = background_grants - user_ext.permissions = permissions - await update_user_extension(user_ext) - return {"permission": WALLET_PAY_INVOICE_BACKGROUND_PERMISSION, "grant": grant} - - -@extension_router.post("/{ext_id}/permissions/wallet-payments-watch") -async def api_grant_wallet_payments_watch_permission( - ext_id: str, - data: ExtensionWalletPaymentsWatchGrantRequest, - account_id: AccountId = Depends(check_account_id_exists), -) -> dict: - installed_ext = await get_installed_extension(ext_id) - if not installed_ext or not installed_ext.active: - raise HTTPException( - HTTPStatus.NOT_FOUND, f"Extension '{ext_id}' is not active." - ) - - installed_permission_ids = { - permission.id for permission in installed_ext.permissions or [] - } - if WALLET_PAYMENTS_WATCH_PERMISSION not in installed_permission_ids: - raise HTTPException( - HTTPStatus.FORBIDDEN, - f"Extension '{ext_id}' cannot request wallet payment watch access.", - ) - - user_ext = await get_user_extension(account_id.id, ext_id) - if not user_ext or not user_ext.active: - raise HTTPException( - HTTPStatus.FORBIDDEN, - f"Extension '{ext_id}' is not enabled for this user.", - ) - - wallet = await get_wallet(data.wallet_id) - if not wallet or wallet.user != account_id.id: - raise HTTPException(HTTPStatus.FORBIDDEN, "Not your wallet.") - - permissions = user_ext.permissions or {} - grant = data.to_grant( - _user_permission_grant_id_for_wallet( - permissions, - WALLET_PAYMENTS_WATCH_PERMISSION, - data.wallet_id, - ) - ) - watch_grants = [ - existing - for existing in permissions.get(WALLET_PAYMENTS_WATCH_PERMISSION, []) - if isinstance(existing, dict) and existing.get("wallet_id") != grant.wallet_id - ] - watch_grants.append(json.loads(grant.json())) - permissions[WALLET_PAYMENTS_WATCH_PERMISSION] = watch_grants - user_ext.permissions = permissions - await update_user_extension(user_ext) - return {"permission": WALLET_PAYMENTS_WATCH_PERMISSION, "grant": grant} - - -@extension_router.get("/{ext_id}/permissions") -async def api_get_extension_permissions( - ext_id: str, - account_id: AccountId = Depends(check_account_id_exists), -) -> ExtensionPermissionsResponse: - installed_ext = await _require_active_wasm_extension(ext_id) - extension_permissions = validate_extension_permissions( - installed_ext.id, installed_ext.permissions, strict=False - ) - user_ext = await get_user_extension(account_id.id, ext_id) - return ExtensionPermissionsResponse( - extension_permissions=extension_permissions, - user_permissions=_safe_user_extension_permissions( - user_ext.permissions if user_ext else {} - ), - ) - - -@extension_router.put("/{ext_id}/permissions", dependencies=[Depends(check_admin)]) -async def api_update_extension_permissions( - ext_id: str, - data: ExtensionPermissionsUpdate, -) -> ExtensionPermissionsResponse: - installed_ext = await get_installed_extension(ext_id) - if not installed_ext: - raise HTTPException( - HTTPStatus.NOT_FOUND, f"Extension '{ext_id}' is not installed." - ) - if not installed_ext.is_wasm: - raise HTTPException( - HTTPStatus.BAD_REQUEST, f"Extension '{ext_id}' is not a WASM extension." - ) - - try: - extension_config = _load_installed_extension_config(installed_ext) - installed_ext.permissions = validate_wasm_extension_permissions( - installed_ext, - data.permissions, - extension_config, - allow_admin_policy_overrides=True, - ) - await update_installed_extension(installed_ext) - except ValueError as exc: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, - detail=str(exc), - ) from exc - - return ExtensionPermissionsResponse( - extension_permissions=validate_extension_permissions( - installed_ext.id, installed_ext.permissions, strict=False - ) - ) - - -@extension_router.delete("/{ext_id}/permissions/user/{grant_id}") -async def api_delete_user_extension_permission( - ext_id: str, - grant_id: str, - account_id: AccountId = Depends(check_account_id_exists), -) -> SimpleStatus: - await _require_active_wasm_extension(ext_id) - - user_ext = await get_user_extension(account_id.id, ext_id) - if not user_ext: - return SimpleStatus(success=True, message="Permission grant removed.") - - user_ext.permissions = _remove_user_permission_grant( - user_ext.permissions or {}, grant_id - ) - await update_user_extension(user_ext) - return SimpleStatus(success=True, message="Permission grant removed.") - - -@extension_router.post("/{ext_id}/permissions/check") -async def api_check_extension_permissions( - ext_id: str, - data: ExtensionPermissionCheckRequest, - account_id: AccountId = Depends(check_account_id_exists), -) -> ExtensionPermissionCheckResponse: - installed_ext = await get_installed_extension(ext_id) - if not installed_ext or not installed_ext.active: - raise HTTPException( - HTTPStatus.NOT_FOUND, f"Extension '{ext_id}' is not active." - ) - - installed_permission_ids = { - permission.id for permission in installed_ext.permissions or [] - } - - user_ext = await get_user_extension(account_id.id, ext_id) - if not user_ext or not user_ext.active: - raise HTTPException( - HTTPStatus.FORBIDDEN, - f"Extension '{ext_id}' is not enabled for this user.", - ) - - results: list[ExtensionPermissionCheckResult] = [] - for permission in data.permissions: - if permission.id not in installed_permission_ids: - raise HTTPException( - HTTPStatus.FORBIDDEN, - f"Extension '{ext_id}' cannot request '{permission.id}'.", - ) - if permission.id == WALLET_PAY_INVOICE_BACKGROUND_PERMISSION: - results.append( - await _check_background_payment_permission( - account_id.id, - user_ext.permissions or {}, - permission.grant, - ) - ) - continue - if permission.id == WALLET_PAYMENTS_WATCH_PERMISSION: - results.append( - await _check_wallet_payments_watch_permission( - account_id.id, - user_ext.permissions or {}, - permission.grant, - ) - ) - continue - raise HTTPException( - HTTPStatus.BAD_REQUEST, - f"Unsupported permission check '{permission.id}'.", - ) - - return ExtensionPermissionCheckResponse(permissions=results) - - @extension_router.put("/{ext_id}/activate", dependencies=[Depends(check_admin)]) async def api_activate_extension(ext_id: str) -> SimpleStatus: try: @@ -681,6 +292,7 @@ async def api_deactivate_extension(ext_id: str) -> SimpleStatus: @extension_router.delete("/{ext_id}", dependencies=[Depends(check_admin)]) async def api_uninstall_extension(ext_id: str) -> SimpleStatus: + extension = await get_installed_extension(ext_id) if not extension: raise HTTPException( @@ -724,10 +336,6 @@ async def get_extension_releases(ext_id: str) -> list[ExtensionRelease]: extension_releases: list[ExtensionRelease] = ( await InstallableExtension.get_extension_releases(ext_id) ) - for release in extension_releases: - release.permissions = validate_extension_permissions( - ext_id, release.permissions - ) installed_ext = await get_installed_extension(ext_id) if not installed_ext: @@ -852,19 +460,11 @@ async def get_extension_release(org: str, repo: str, tag_name: str): if not config: return {} - permissions = validate_extension_permissions(config.name, config.permissions) - return { "min_lnbits_version": config.min_lnbits_version, "is_version_compatible": config.is_version_compatible(), "warning": config.warning, - "extension_type": config.extension_type, - "permissions": [dict(permission) for permission in permissions], } - except ValueError as exc: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, detail=str(exc) - ) from exc except Exception as exc: raise HTTPException( status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(exc) @@ -936,11 +536,9 @@ async def extensions(account_id: AccountId = Depends(check_account_id_exists)): ) installable_exts_ids = [e.id for e in installable_exts] installable_exts += [e for e in installed_exts if e.id not in installable_exts_ids] - installable_exts.sort(key=lambda e: e.id) - installed_exts_by_id = {e.id: e for e in installed_exts} for e in installable_exts: - installed_ext = installed_exts_by_id.get(e.id) + installed_ext = next((ie for ie in installed_exts if e.id == ie.id), None) if installed_ext and installed_ext.meta: installed_release = installed_ext.meta.installed_release if installed_ext.meta.pay_to_enable and not account_id.is_admin_id: @@ -961,60 +559,46 @@ async def extensions(account_id: AccountId = Depends(check_account_id_exists)): e.short_description = installed_ext.short_description e.icon = installed_ext.icon - extension_data = [] - for ext in installable_exts: - installed_ext = installed_exts_by_id.get(ext.id) - is_wasm = installed_ext.is_wasm if installed_ext else ext.is_wasm - icon = wasm_extension_icon_url(ext.id) if is_wasm else ext.icon - permissions = ( - validate_extension_permissions( - installed_ext.id, installed_ext.permissions, strict=False - ) - if installed_ext - else [] - ) - extension_data.append( - { - "id": ext.id, - "name": ext.name, - "icon": icon, - "shortDescription": ext.short_description, - "stars": ext.stars, - "isFeatured": ext.meta.featured if ext.meta else False, - "categories": ext.meta.categories if ext.meta else [], - "dependencies": ext.meta.dependencies if ext.meta else "", - "isInstalled": ext.id in installed_exts_ids, - "hasDatabaseTables": next( - (True for version in db_versions if version.db == ext.id), False - ), - "isAvailable": ext.id in all_ext_ids, - "isAdminOnly": ext.id in settings.lnbits_admin_extensions, - "isActive": ext.id not in inactive_extensions, - "latestRelease": ( - dict(ext.meta.latest_release) - if ext.meta and ext.meta.latest_release - else None - ), - "hasPaidRelease": ext.meta.has_paid_release if ext.meta else False, - "hasFreeRelease": ext.meta.has_free_release if ext.meta else False, - "paidFeatures": ext.meta.paid_features if ext.meta else False, - "installedRelease": ( - dict(ext.meta.installed_release) - if ext.meta and ext.meta.installed_release - else None - ), - "payToEnable": ( - dict(ext.meta.pay_to_enable) - if ext.meta and ext.meta.pay_to_enable - else {} - ), - "isPaymentRequired": ext.requires_payment, - "isWasm": is_wasm, - "permissions": [dict(permission) for permission in permissions], - "inProgress": False, - "selectedForUpdate": False, - } - ) + extension_data = [ + { + "id": ext.id, + "name": ext.name, + "icon": ext.icon, + "shortDescription": ext.short_description, + "stars": ext.stars, + "isFeatured": ext.meta.featured if ext.meta else False, + "dependencies": ext.meta.dependencies if ext.meta else "", + "isInstalled": ext.id in installed_exts_ids, + "hasDatabaseTables": next( + (True for version in db_versions if version.db == ext.id), False + ), + "isAvailable": ext.id in all_ext_ids, + "isAdminOnly": ext.id in settings.lnbits_admin_extensions, + "isActive": ext.id not in inactive_extensions, + "latestRelease": ( + dict(ext.meta.latest_release) + if ext.meta and ext.meta.latest_release + else None + ), + "hasPaidRelease": ext.meta.has_paid_release if ext.meta else False, + "hasFreeRelease": ext.meta.has_free_release if ext.meta else False, + "paidFeatures": ext.meta.paid_features if ext.meta else False, + "installedRelease": ( + dict(ext.meta.installed_release) + if ext.meta and ext.meta.installed_release + else None + ), + "payToEnable": ( + dict(ext.meta.pay_to_enable) + if ext.meta and ext.meta.pay_to_enable + else {} + ), + "isPaymentRequired": ext.requires_payment, + "inProgress": False, + "selectedForUpdate": False, + } + for ext in installable_exts + ] return extension_data @@ -1062,193 +646,3 @@ async def create_extension_review( resp.raise_for_status() payment_request = resp.json() return ExtensionReviewPaymentRequest(**payment_request) - - -def _load_installed_extension_config(extension: InstallableExtension) -> dict: - ext_dir = extension.wasm_ext_dir if extension.is_wasm else extension.ext_dir - config_path = ext_dir / "config.json" - if not config_path.is_file(): - raise ValueError(f"Extension '{extension.id}' config file is missing.") - try: - with open(config_path, encoding="utf-8") as config_file: - config = json.load(config_file) - except Exception as exc: - raise ValueError(f"Cannot read extension config for '{extension.id}'.") from exc - if not isinstance(config, dict): - raise ValueError(f"Extension '{extension.id}' config file is invalid.") - return config - - -async def _require_active_wasm_extension(ext_id: str) -> InstallableExtension: - installed_ext = await get_installed_extension(ext_id) - if not installed_ext or not installed_ext.active: - raise HTTPException( - HTTPStatus.NOT_FOUND, f"Extension '{ext_id}' is not active." - ) - if not installed_ext.is_wasm: - raise HTTPException( - HTTPStatus.BAD_REQUEST, f"Extension '{ext_id}' is not a WASM extension." - ) - return installed_ext - - -def _safe_user_extension_permissions(permissions: dict | None) -> dict: - safe_permissions: dict[str, list[dict]] = {} - for permission_id, grants in (permissions or {}).items(): - if not isinstance(permission_id, str) or not isinstance(grants, list): - continue - safe_grants = [ - grant - for grant in grants - if isinstance(grant, dict) and isinstance(grant.get("id"), str) - ] - if safe_grants: - safe_permissions[permission_id] = safe_grants - return safe_permissions - - -def _user_permission_grant_id_for_wallet( - permissions: dict, permission_id: str, wallet_id: str -) -> str | None: - grants = permissions.get(permission_id) - if not isinstance(grants, list): - return None - - for grant in grants: - if not isinstance(grant, dict) or grant.get("wallet_id") != wallet_id: - continue - grant_id = grant.get("id") - return grant_id if isinstance(grant_id, str) and grant_id else None - return None - - -def _remove_user_permission_grant(permissions: dict, grant_id: str) -> dict: - updated_permissions = dict(permissions or {}) - for permission_id, grants in list(updated_permissions.items()): - if not isinstance(grants, list): - continue - - remaining_grants = [ - grant - for grant in grants - if not isinstance(grant, dict) or grant.get("id") != grant_id - ] - if remaining_grants: - updated_permissions[permission_id] = remaining_grants - else: - updated_permissions.pop(permission_id, None) - return updated_permissions - - -async def _check_background_payment_permission( - account_id: str, - permissions: dict, - grant_data: dict, -) -> ExtensionPermissionCheckResult: - try: - data = ExtensionBackgroundPaymentGrantRequest.parse_obj(grant_data) - except ValueError as exc: - raise HTTPException(HTTPStatus.BAD_REQUEST, str(exc)) from exc - - wallet = await get_wallet(data.wallet_id) - if not wallet or wallet.user != account_id: - raise HTTPException(HTTPStatus.FORBIDDEN, "Not your wallet.") - if wallet.is_lightning_shared_wallet: - raise HTTPException( - HTTPStatus.BAD_REQUEST, - "Background payments are not allowed from shared wallets.", - ) - if not wallet.can_send_payments: - raise HTTPException( - HTTPStatus.BAD_REQUEST, - "This wallet cannot send payments.", - ) - - requested_grant = data.to_grant() - existing_grant = _find_background_payment_grant( - permissions, requested_grant.wallet_id - ) - covered = ( - existing_grant is not None - and existing_grant.enabled - and existing_grant.max_amount >= requested_grant.max_amount - and _background_destination_policy_covers( - existing_grant.destination_policy, requested_grant.destination_policy - ) - ) - grant = existing_grant if covered and existing_grant else requested_grant - return ExtensionPermissionCheckResult( - id=WALLET_PAY_INVOICE_BACKGROUND_PERMISSION, - approved=covered, - grant=json.loads(grant.json()), - ) - - -async def _check_wallet_payments_watch_permission( - account_id: str, - permissions: dict, - grant_data: dict, -) -> ExtensionPermissionCheckResult: - try: - data = ExtensionWalletPaymentsWatchGrantRequest.parse_obj(grant_data) - except ValueError as exc: - raise HTTPException(HTTPStatus.BAD_REQUEST, str(exc)) from exc - - wallet = await get_wallet(data.wallet_id) - if not wallet or wallet.user != account_id: - raise HTTPException(HTTPStatus.FORBIDDEN, "Not your wallet.") - - existing_grant = _find_wallet_payments_watch_grant(permissions, data.wallet_id) - covered = bool(existing_grant and existing_grant.enabled) - grant = existing_grant if covered and existing_grant else data.to_grant() - return ExtensionPermissionCheckResult( - id=WALLET_PAYMENTS_WATCH_PERMISSION, - approved=covered, - grant=json.loads(grant.json()), - ) - - -def _find_background_payment_grant( - permissions: dict, wallet_id: str -) -> ExtensionBackgroundPaymentGrant | None: - grants = permissions.get(WALLET_PAY_INVOICE_BACKGROUND_PERMISSION) - if not isinstance(grants, list): - return None - for grant_data in grants: - if not isinstance(grant_data, dict): - continue - try: - grant = ExtensionBackgroundPaymentGrant.parse_obj(grant_data) - except ValueError: - continue - if grant.wallet_id == wallet_id: - return grant - return None - - -def _find_wallet_payments_watch_grant( - permissions: dict, wallet_id: str -) -> ExtensionWalletPaymentsWatchGrant | None: - grants = permissions.get(WALLET_PAYMENTS_WATCH_PERMISSION) - if not isinstance(grants, list): - return None - for grant_data in grants: - if not isinstance(grant_data, dict): - continue - try: - grant = ExtensionWalletPaymentsWatchGrant.parse_obj(grant_data) - except ValueError: - continue - if grant.wallet_id == wallet_id: - return grant - return None - - -def _background_destination_policy_covers( - existing: ExtensionBackgroundPaymentDestinationPolicy, - requested: ExtensionBackgroundPaymentDestinationPolicy, -) -> bool: - return ( - existing == requested - or existing == ExtensionBackgroundPaymentDestinationPolicy.EXTERNAL_ALLOWED - ) diff --git a/lnbits/core/views/generic.py b/lnbits/core/views/generic.py index b0adee7c8..e073a5c4f 100644 --- a/lnbits/core/views/generic.py +++ b/lnbits/core/views/generic.py @@ -185,15 +185,10 @@ admin_ui_checks = [Depends(check_admin), Depends(check_admin_ui)] @generic_router.get("/wallets") @generic_router.get("/account") @generic_router.get("/extensions") -@generic_router.get("/blockexplorer") -@generic_router.get("/blockexplorer/{resource_type}/{resource}") @generic_router.get("/users", dependencies=admin_ui_checks) @generic_router.get("/audit", dependencies=admin_ui_checks) @generic_router.get("/node", dependencies=admin_ui_checks) @generic_router.get("/admin", dependencies=admin_ui_checks) -@generic_router.get("/admin/extensions/wasm", dependencies=admin_ui_checks) -@generic_router.get("/admin/extensions/wasm/limits", dependencies=admin_ui_checks) -@generic_router.get("/admin/extensions/wasm/{ext_id}", dependencies=admin_ui_checks) @generic_router.get( "/extensions/builder", dependencies=[Depends(check_extension_builder)] ) @@ -201,9 +196,7 @@ admin_ui_checks = [Depends(check_admin), Depends(check_admin_ui)] "/extensions/builder/preview", dependencies=[Depends(check_extension_builder)] ) async def index( - request: Request, - ext_id: str | None = None, - user: User = Depends(check_user_exists), + request: Request, user: User = Depends(check_user_exists) ) -> HTMLResponse: return template_renderer().TemplateResponse( request, diff --git a/lnbits/core/views/lnurl_api.py b/lnbits/core/views/lnurl_api.py index 23ca95f68..21d34abca 100644 --- a/lnbits/core/views/lnurl_api.py +++ b/lnbits/core/views/lnurl_api.py @@ -1,13 +1,10 @@ from http import HTTPStatus from typing import Any -import httpx from fastapi import ( APIRouter, Depends, HTTPException, - Query, - Request, ) from lnurl import ( LnurlAuthResponse, @@ -21,7 +18,6 @@ from lnurl import execute_login as lnurlauth from lnurl import handle as lnurl_handle from lnurl.models import LnurlResponseModel from loguru import logger -from pydantic import ValidationError from lnbits.core.models import Payment from lnbits.core.models.lnurl import CreateLnurlPayment, LnurlScan @@ -31,50 +27,13 @@ from lnbits.decorators import ( require_base_invoice_key, ) from lnbits.helpers import check_callback_url -from lnbits.settings import RedirectPath, settings +from lnbits.settings import settings from ..services import fetch_lnurl_pay_request, pay_invoice -from ..services.lightning_address import ( - wallet_lightning_address_callback, - wallet_lightning_address_response, -) lnurl_router = APIRouter(tags=["LNURL"]) -@lnurl_router.get( - "/.well-known/lnurlp/{username}", - name="lnurl.api_wallet_lightning_address_response", -) -async def api_wallet_lightning_address_response( - username: str, request: Request -) -> LnurlPayResponse | LnurlErrorResponse: - if settings.lnbits_ln_address_mode in ["extension_first", "extension_only"]: - req_headers = request["headers"] if "headers" in request else [] - redirect = settings.find_extension_redirect(request.url.path, req_headers) - if redirect: - resp = await _check_extension_well_known(redirect, request) - if resp and resp.ok: - return resp - - if settings.lnbits_ln_address_mode == "extension_only": - return LnurlErrorResponse( - reason="Lightning addresses are not supported on this instance." - ) - - return await wallet_lightning_address_response(username, request) - - -@lnurl_router.get( - "/api/v1/lnurl/wallet/{username}/cb", - name="lnurl.api_wallet_lightning_address_callback", -) -async def api_wallet_lightning_address_callback( - username: str, request: Request, amount: int = Query(...) -) -> LnurlErrorResponse | Any: - return await wallet_lightning_address_callback(username, request, amount) - - async def _handle(lnurl: str) -> LnurlResponseModel: try: if "@" in lnurl: # lower case lightning addresses @@ -178,32 +137,3 @@ async def api_payments_pay_lnurl( ) return payment - - -async def _check_extension_well_known( - redirect: RedirectPath, request: Request -) -> LnurlPayResponse | LnurlErrorResponse | None: - target_path = redirect.new_path_from(request.url.path) - - transport = httpx.ASGITransport(app=request.app) - try: - async with httpx.AsyncClient( - transport=transport, - base_url=str(request.base_url), - ) as client: - response = await client.get( - target_path, - headers={"accept": "application/json"}, - ) - - response.raise_for_status() - response_data = response.json() - try: - return LnurlPayResponse.parse_obj(response_data) - except ValidationError: - return LnurlErrorResponse.parse_obj(response_data) - except Exception as exc: - logger.warning( - f"Failed to fetch LNURL response Extension redirect {target_path}: {exc}" - ) - return None diff --git a/lnbits/core/views/payment_api.py b/lnbits/core/views/payment_api.py index 5239c7454..f9bcb4de2 100644 --- a/lnbits/core/views/payment_api.py +++ b/lnbits/core/views/payment_api.py @@ -1,6 +1,5 @@ from hashlib import sha256 from http import HTTPStatus -from secrets import token_hex from fastapi import ( APIRouter, @@ -15,7 +14,6 @@ from lnurl import url_decode from lnbits import bolt11 from lnbits.core.crud.payments import ( get_payment_count_stats, - get_wallet_payment_total_breakdown, get_wallets_stats, update_payment, ) @@ -33,16 +31,14 @@ from lnbits.core.models import ( PaymentDailyStats, PaymentFilters, PaymentHistoryPoint, - PaymentTotalBreakdown, PaymentWalletStats, SettleInvoice, SimpleStatus, UpdatePaymentExtra, ) from lnbits.core.models.payments import UpdatePaymentLabels -from lnbits.core.models.users import AccountId, UserLabel +from lnbits.core.models.users import AccountId from lnbits.core.models.wallets import BaseWalletTypeInfo -from lnbits.core.services.users import update_user_account from lnbits.db import Filters, Page from lnbits.decorators import ( WalletTypeInfo, @@ -55,7 +51,6 @@ from lnbits.decorators import ( from lnbits.helpers import ( filter_dict_keys, generate_filter_params_openapi, - is_valid_label, ) from lnbits.wallets.base import InvoiceResponse @@ -136,17 +131,6 @@ async def api_payments_counting_stats( return await get_payment_count_stats(count_by, filters=filters, user_id=for_user_id) -@payment_router.get( - "/stats/breakdown", - name="Get wallet payment total breakdown", - response_model=list[PaymentTotalBreakdown], -) -async def api_payments_total_breakdown( - key_info: BaseWalletTypeInfo = Depends(require_base_invoice_key), -): - return await get_wallet_payment_total_breakdown(key_info.wallet.id) - - @payment_router.get( "/stats/wallets", name="Get payments history for all users", @@ -307,24 +291,9 @@ async def api_update_payment_labels( if not account: raise HTTPException(HTTPStatus.NOT_FOUND, "Account does not exist.") + # only keep labels that belong to the user user_label_names = [label.name for label in account.extra.labels] - updated_account = False - for label_name in data.labels: - if label_name not in user_label_names: - if not is_valid_label(label_name): - raise HTTPException( - HTTPStatus.BAD_REQUEST, f"Invalid label name: '{label_name}'." - ) - account.extra.labels.append( - UserLabel(name=label_name, color=f"#{token_hex(3)}") - ) - user_label_names.append(label_name) - updated_account = True - - if updated_account: - await update_user_account(account) - - payment.labels = data.labels + payment.labels = [label for label in data.labels if label in user_label_names] await update_payment(payment) return SimpleStatus(success=True, message="Payment labels updated.") diff --git a/lnbits/core/views/user_api.py b/lnbits/core/views/user_api.py index 28ad4cddc..dd500766b 100644 --- a/lnbits/core/views/user_api.py +++ b/lnbits/core/views/user_api.py @@ -41,7 +41,6 @@ from lnbits.core.services import ( update_user_extensions, update_wallet_balance, ) -from lnbits.core.services.lightning_address import set_wallet_lightning_address from lnbits.db import Filters, Page from lnbits.decorators import check_admin, check_super_user, parse_filters from lnbits.helpers import ( @@ -159,6 +158,10 @@ async def api_update_user( async def api_users_delete_user( user_id: str, account: Account = Depends(check_admin) ) -> SimpleStatus: + wallets = await get_wallets(user_id, deleted=False) + for wallet in wallets: + await delete_wallet_by_id(wallet.id) + if user_id == settings.super_user: raise HTTPException( status_code=HTTPStatus.BAD_REQUEST, @@ -170,11 +173,6 @@ async def api_users_delete_user( status_code=HTTPStatus.BAD_REQUEST, detail="Only super_user can delete admin user.", ) - - wallets = await get_wallets(user_id, deleted=False) - for wallet in wallets: - await delete_wallet_by_id(wallet.id) - await delete_account(user_id) return SimpleStatus(success=True, message="User deleted.") @@ -281,34 +279,6 @@ async def api_users_create_user_wallet( return wallet -@users_router.put( - "/user/{user_id}/wallet/{wallet}/lightning-address", - name="Set wallet Lightning Address", -) -async def api_users_set_wallet_lightning_address( - user_id: str, - wallet: str, - lightning_address: str = Body(..., embed=True), -) -> Wallet: - wal = await get_wallet(wallet) - if not wal: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, - detail="Wallet does not exist.", - ) - if user_id != wal.user: - raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, - detail="Wallet does not belong to user.", - ) - return await set_wallet_lightning_address( - wallet=wal, - local_part=lightning_address, - allow_blacklisted=True, - charge=False, - ) - - @users_router.put( "/user/{user_id}/wallet/{wallet}/undelete", name="Reactivate deleted wallet" ) diff --git a/lnbits/core/views/wallet_api.py b/lnbits/core/views/wallet_api.py index 79636325a..3aa7b9934 100644 --- a/lnbits/core/views/wallet_api.py +++ b/lnbits/core/views/wallet_api.py @@ -22,7 +22,6 @@ from lnbits.core.models.wallets import ( WalletSharePermission, WalletType, ) -from lnbits.core.services.lightning_address import set_wallet_lightning_address from lnbits.core.services.wallets import ( create_lightning_shared_wallet, delete_wallet_share, @@ -39,7 +38,6 @@ from lnbits.decorators import ( require_invoice_key, ) from lnbits.helpers import generate_filter_params_openapi -from lnbits.settings import settings from ..crud import ( delete_wallet, @@ -166,7 +164,6 @@ async def api_update_wallet( color: str | None = Body(None), currency: str | None = Body(None), pinned: bool | None = Body(None), - lightning_address: str | None = Body(None), key_info: WalletTypeInfo = Depends(require_admin_key), ) -> Wallet: wallet = await get_wallet(key_info.wallet.id) @@ -178,20 +175,6 @@ async def api_update_wallet( wallet.extra.pinned = pinned if pinned is not None else wallet.extra.pinned wallet.currency = currency if currency is not None else wallet.currency - if lightning_address and lightning_address != wallet.lightning_address: - if not settings.lnbits_allow_custom_wallet_lightning_addresses: - raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, - detail="Users cannot specify Lightning Addresses.", - ) - # too much logic here - wallet = await set_wallet_lightning_address( - wallet=wallet, - local_part=lightning_address, - charge=True, - ) - return wallet - await update_wallet(wallet) return wallet diff --git a/lnbits/core/views/websocket_api.py b/lnbits/core/views/websocket_api.py index ee817641f..956e2cbda 100644 --- a/lnbits/core/views/websocket_api.py +++ b/lnbits/core/views/websocket_api.py @@ -1,15 +1,8 @@ -from fastapi import APIRouter, WebSocket, status - -from lnbits.core.crud import get_installed_extension -from lnbits.core.wasm_ext.api.websockets import wasm_extension_websocket_hub +from fastapi import APIRouter, WebSocket from ..services import websocket_manager websocket_router = APIRouter(prefix="/api/v1/ws", tags=["Websocket"]) -extension_websocket_router = APIRouter( - prefix="/api/v1/ext/ws", - tags=["Extension Websocket"], -) @websocket_router.websocket("/{item_id}") @@ -18,35 +11,6 @@ async def websocket_connect(websocket: WebSocket, item_id: str) -> None: await websocket_manager.listen(conn) -@extension_websocket_router.websocket("/{ext_id}/{item_id}") -async def extension_websocket_connect( - websocket: WebSocket, - ext_id: str, - item_id: str, -) -> None: - installed_ext = await get_installed_extension(ext_id) - installed_permission_ids = ( - {permission.id for permission in installed_ext.permissions or []} - if installed_ext - else set() - ) - if ( - not installed_ext - or not installed_ext.active - or not installed_ext.is_wasm - or "websocket.subscribe" not in installed_permission_ids - ): - await websocket.close(code=status.WS_1008_POLICY_VIOLATION) - return - - try: - conn = await wasm_extension_websocket_hub.connect(ext_id, item_id, websocket) - except ValueError: - await websocket.close(code=status.WS_1008_POLICY_VIOLATION) - return - await wasm_extension_websocket_hub.listen(conn) - - @websocket_router.post("/{item_id}") async def websocket_update_post(item_id: str, data: str): try: diff --git a/lnbits/core/wasm_ext/__init__.py b/lnbits/core/wasm_ext/__init__.py deleted file mode 100644 index 3ac850ed1..000000000 --- a/lnbits/core/wasm_ext/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -from .api.host import ExtensionHostAPI -from .api.models import ExtensionAPIMethod, ExtensionAPIMethodExport -from .api.registry import ( - extension_api_contract, - extension_api_method, - extension_api_permission_ids, - get_extension_api_method, - list_extension_api_methods, -) -from .api.runtime import ExtensionAPIHost -from .wasm.loader import WasmExtension - -__all__ = [ - "ExtensionAPIHost", - "ExtensionAPIMethod", - "ExtensionAPIMethodExport", - "ExtensionHostAPI", - "WasmExtension", - "extension_api_contract", - "extension_api_method", - "extension_api_permission_ids", - "get_extension_api_method", - "list_extension_api_methods", -] diff --git a/lnbits/core/wasm_ext/api/__init__.py b/lnbits/core/wasm_ext/api/__init__.py deleted file mode 100644 index 1ad668781..000000000 --- a/lnbits/core/wasm_ext/api/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -from .host import ExtensionHostAPI -from .models import ExtensionAPIMethod, ExtensionAPIMethodExport -from .registry import ( - extension_api_contract, - extension_api_method, - extension_api_permission_ids, - get_extension_api_method, - list_extension_api_methods, -) -from .runtime import ExtensionAPIHost - -__all__ = [ - "ExtensionAPIHost", - "ExtensionAPIMethod", - "ExtensionAPIMethodExport", - "ExtensionHostAPI", - "extension_api_contract", - "extension_api_method", - "extension_api_permission_ids", - "get_extension_api_method", - "list_extension_api_methods", -] diff --git a/lnbits/core/wasm_ext/api/background_payments.py b/lnbits/core/wasm_ext/api/background_payments.py deleted file mode 100644 index 640a3df52..000000000 --- a/lnbits/core/wasm_ext/api/background_payments.py +++ /dev/null @@ -1,124 +0,0 @@ -from __future__ import annotations - -from typing import Any, NoReturn - -from bolt11 import decode as bolt11_decode -from loguru import logger - -from lnbits.core.crud.extensions import get_user_extension -from lnbits.core.crud.payments import check_internal -from lnbits.core.crud.wallets import get_wallet -from lnbits.core.models.extensions import ( - ExtensionBackgroundPaymentDestinationPolicy, - ExtensionBackgroundPaymentGrant, -) -from lnbits.core.models.wallets import Wallet - -WALLET_PAY_INVOICE_BACKGROUND_PERMISSION = "wallet.pay_invoice_background" - - -async def background_payment_extra( - *, - extension_id: str, - wallet: Wallet, - payment_request: str, - amount_msat: int, -) -> dict[str, Any]: - grant = await _background_payment_grant(extension_id, wallet, amount_msat) - await _check_destination_policy(extension_id, wallet, grant, payment_request) - - return { - "tag": extension_id, - "extension": extension_id, - "background_payment": True, - "background_permission": WALLET_PAY_INVOICE_BACKGROUND_PERMISSION, - "background_wallet_id": wallet.source_wallet_id, - "background_destination_policy": grant.destination_policy.value, - } - - -def invoice_amount_msat(payment_request: str) -> int: - invoice = bolt11_decode(payment_request) - amount_msat = int(invoice.amount_msat or 0) - if amount_msat <= 0: - raise PermissionError("Background payments require an invoice amount.") - return amount_msat - - -async def _background_payment_grant( - extension_id: str, - wallet: Wallet, - amount_msat: int, -) -> ExtensionBackgroundPaymentGrant: - if wallet.is_lightning_shared_wallet: - _deny(extension_id, wallet, amount_msat, "shared wallet") - if not wallet.can_send_payments: - _deny(extension_id, wallet, amount_msat, "wallet cannot send payments") - - user_extension = await get_user_extension(wallet.user, extension_id) - if not user_extension or not user_extension.active: - _deny(extension_id, wallet, amount_msat, "extension disabled for user") - - permissions = user_extension.permissions or {} - grants = permissions.get(WALLET_PAY_INVOICE_BACKGROUND_PERMISSION) - if not isinstance(grants, list): - _deny(extension_id, wallet, amount_msat, "missing background payment grant") - - grant = _find_wallet_grant(grants, wallet.id) - if not grant: - _deny(extension_id, wallet, amount_msat, "missing wallet background grant") - if not grant.enabled: - _deny(extension_id, wallet, amount_msat, "background grant disabled") - if amount_msat > grant.max_amount * 1000: - _deny(extension_id, wallet, amount_msat, "payment exceeds max amount") - return grant - - -def _find_wallet_grant( - grants: list[Any], wallet_id: str -) -> ExtensionBackgroundPaymentGrant | None: - for grant_data in grants: - if not isinstance(grant_data, dict): - continue - try: - grant = ExtensionBackgroundPaymentGrant.parse_obj(grant_data) - except ValueError: - continue - if grant.wallet_id == wallet_id: - return grant - return None - - -async def _check_destination_policy( - extension_id: str, - wallet: Wallet, - grant: ExtensionBackgroundPaymentGrant, - payment_request: str, -) -> None: - if ( - grant.destination_policy - == ExtensionBackgroundPaymentDestinationPolicy.EXTERNAL_ALLOWED - ): - return - - payment_hash = bolt11_decode(payment_request).payment_hash - internal_payment = await check_internal(payment_hash) - if not internal_payment: - _deny(extension_id, wallet, 0, "external destination not allowed") - - destination_wallet = await get_wallet(internal_payment.wallet_id) - if not destination_wallet or destination_wallet.user != wallet.user: - _deny(extension_id, wallet, 0, "destination wallet is not owned by user") - - -def _deny(extension_id: str, wallet: Wallet, amount_msat: int, reason: str) -> NoReturn: - logger.warning( - "WASM extension '{}' denied background payment from wallet '{}', " - "user '{}', amount_msat '{}': {}.", - extension_id, - wallet.id, - wallet.user, - amount_msat, - reason, - ) - raise PermissionError(reason) diff --git a/lnbits/core/wasm_ext/api/host.py b/lnbits/core/wasm_ext/api/host.py deleted file mode 100644 index 0cdcd09a1..000000000 --- a/lnbits/core/wasm_ext/api/host.py +++ /dev/null @@ -1,1000 +0,0 @@ -from __future__ import annotations - -import json -import logging -import secrets -import time -from collections.abc import Iterable, Mapping -from typing import Any - -from lnbits.helpers import sha256s - -from ..client.extensions import send_extension_api_request -from ..storage.crud import ( - OWNER_ID_FIELD, - storage_append_public_row, - storage_count_rows, - storage_delete_row, - storage_get_paginated_rows, - storage_get_public_paginated_rows, - storage_get_public_row, - storage_get_row, - storage_get_row_owner_id, - storage_set_row, -) -from .background_payments import ( - WALLET_PAY_INVOICE_BACKGROUND_PERMISSION, - background_payment_extra, - invoice_amount_msat, -) -from .models import ( - CreateInvoicePublicRequest, - CreateInvoiceRequest, - CreateInvoiceResponse, - EmptyRequest, - ExtensionApiRequest, - HttpRequest, - HttpResponse, - ListUserWalletsResponse, - LogRequest, - LogResponse, - NowResponse, - PayInvoiceRequest, - PayInvoiceResponse, - PayLnurlRequest, - RandomIdRequest, - RandomIdResponse, - StorageAppendPublicRequest, - StorageAppendPublicResponse, - StorageDeleteRequest, - StorageDeleteResponse, - StorageGetRequest, - StorageGetResponse, - StoragePaginatedRequest, - StoragePaginatedResponse, - StoragePublicPaginatedRequest, - StorageSetRequest, - StorageSetResponse, - UserWalletSummary, - WalletBalanceRequest, - WalletBalanceResponse, - WebsocketPublishRequest, - WebsocketPublishResponse, -) -from .registry import extension_api_method -from .websockets import scoped_websocket_item_id, wasm_extension_websocket_hub - -logger = logging.getLogger("lnbits.extensions") -PUBLIC_APPEND_DEFAULT_MAX_ROWS_PER_SOURCE = 10_000 - - -class ExtensionHostAPI: - def __init__( - self, - extension_id: str, - permissions: Iterable[Any], - *, - user_id: str | None = None, - access_token: str | None = None, - context: str = "user", - owner_id: str | None = None, - invocation_id: str | None = None, - runtime_limits: dict[str, int] | None = None, - ) -> None: - self.extension_id = extension_id - self.permissions, self.permission_policies = self._permission_data(permissions) - self.user_id = user_id - self.access_token = access_token - self.context = context - self.owner_id = sha256s(user_id) if user_id else owner_id - self.invocation_id = invocation_id - self.runtime_limits = runtime_limits or {} - from .utils import ExtensionAPIUtils - - self.utils = ExtensionAPIUtils( - self.extension_id, - self.permissions, - authenticated=self.has_authenticated_context(), - ) - - @extension_api_method( - method_id="storage.get", - namespace="storage", - name="Get storage row", - host_name="storage_get", - sdk_name="get", - description="Read one row from an extension storage table.", - required_permission="ext.storage.read", - require_auth=True, - ) - async def storage_get(self, request: StorageGetRequest) -> StorageGetResponse: - row = await storage_get_row( - self.extension_id, - request.table, - request.id, - self._require_owner_id(), - ) - return StorageGetResponse(data_json=json.dumps(row) if row else None) - - @extension_api_method( - method_id="storage.get_public", - namespace="storage", - name="Get public storage row", - host_name="storage_get_public", - sdk_name="getPublic", - description="Read one public row from an extension storage table.", - required_permission="ext.storage.read_public", - require_auth=False, - ) - async def storage_get_public( - self, request: StorageGetRequest - ) -> StorageGetResponse: - public_fields = self._public_storage_policy(request.table)["public_fields"] - row = await storage_get_public_row(self.extension_id, request.table, request.id) - if not row: - return StorageGetResponse() - public_row = { - field_name: value - for field_name, value in row.items() - if field_name in public_fields - } - # todo: check public fields filtering - return StorageGetResponse(data_json=json.dumps(public_row)) - - @extension_api_method( - method_id="storage.append_public", - namespace="storage", - name="Append public storage row", - host_name="storage_append_public", - sdk_name="appendPublic", - description="Append one public row to an extension storage table.", - required_permission="ext.storage.append_public", - require_auth=False, - ) - async def storage_append_public( - self, request: StorageAppendPublicRequest - ) -> StorageAppendPublicResponse: - policy, owner_id = await self._public_storage_append_policy( - request.table, request.source_id - ) - data = dict(request.data) - self._validate_public_append_data(policy, data) - - source_id_field = policy["source_id_field"] - current_rows = await storage_count_rows( - self.extension_id, - request.table, - {source_id_field: request.source_id}, - owner_id=owner_id, - ) - if current_rows >= policy["max_rows_per_source"]: - raise PermissionError( - f"Public storage append limit reached for '{request.table}'." - ) - - row_id = await storage_append_public_row( - self.extension_id, - request.table, - {**data, source_id_field: request.source_id}, - owner_id, - ) - return StorageAppendPublicResponse(id=row_id) - - @extension_api_method( - method_id="storage.set", - namespace="storage", - name="Set storage row", - host_name="storage_set", - sdk_name="set", - description="Create or update one row in an extension storage table.", - required_permission="ext.storage.write", - require_auth=True, - ) - async def storage_set(self, request: StorageSetRequest) -> StorageSetResponse: - await storage_set_row( - self.extension_id, - request.table, - request.data, - self._require_owner_id(), - ) - return StorageSetResponse() - - @extension_api_method( - method_id="storage.get_paginated", - namespace="storage", - name="Get paginated storage rows", - host_name="storage_get_paginated", - sdk_name="getPaginated", - description="Get filtered, searched, sorted, paginated storage rows.", - required_permission="ext.storage.read", - require_auth=True, - ) - async def storage_get_paginated( - self, request: StoragePaginatedRequest - ) -> StoragePaginatedResponse: - page = await storage_get_paginated_rows( - self.extension_id, - request.table, - request.filters, - owner_id=self._require_owner_id(), - search=request.search, - search_fields=request.search_fields, - sort_by=request.sort_by, - descending=request.descending, - limit=request.limit, - offset=request.offset, - ) - return StoragePaginatedResponse( - rows_json=json.dumps(page["data"]), - total=page["total"], - ) - - @extension_api_method( - method_id="storage.get_public_paginated", - namespace="storage", - name="Get paginated public storage rows", - host_name="storage_get_public_paginated", - sdk_name="getPublicPaginated", - description="Get filtered, searched, sorted, paginated public storage rows.", - required_permission="ext.storage.read_public", - require_auth=False, - ) - async def storage_get_public_paginated( - self, request: StoragePublicPaginatedRequest - ) -> StoragePaginatedResponse: - policy = self._public_storage_policy(request.table) - public_fields = policy["public_fields"] - source_id_field = policy["source_id_field"] - if not isinstance(source_id_field, str) or not source_id_field: - raise PermissionError( - "Public paginated storage reads require a source ID field policy." - ) - - filters = self._public_storage_paginated_filters( - request, public_fields, source_id_field - ) - page = await storage_get_public_paginated_rows( - self.extension_id, - request.table, - filters, - search=request.search, - search_fields=request.search_fields, - sort_by=request.sort_by, - descending=request.descending, - limit=request.limit, - offset=request.offset, - ) - return StoragePaginatedResponse( - rows_json=json.dumps( - [ - { - field_name: value - for field_name, value in row.items() - if field_name in public_fields - } - for row in page["data"] - ] - ), - total=page["total"], - ) - - @extension_api_method( - method_id="storage.delete", - namespace="storage", - name="Delete storage row", - host_name="storage_delete", - sdk_name="delete", - description="Delete one row from an extension storage table.", - required_permission="ext.storage.write", - require_auth=True, - ) - async def storage_delete( - self, request: StorageDeleteRequest - ) -> StorageDeleteResponse: - await storage_delete_row( - self.extension_id, - request.table, - request.id, - self._require_owner_id(), - ) - return StorageDeleteResponse() - - @extension_api_method( - method_id="websocket.publish", - namespace="websocket", - name="Publish websocket message", - host_name="websocket_publish", - sdk_name="publish", - description="Publish a JSON message on an extension-local websocket channel.", - required_permission="websocket.publish", - require_auth=False, - ) - async def websocket_publish( - self, request: WebsocketPublishRequest - ) -> WebsocketPublishResponse: - scoped_websocket_item_id(self.extension_id, request.item_id) - await wasm_extension_websocket_hub.publish( - self.extension_id, - request.item_id, - request.data_json, - max_messages_per_second=(self._websocket_publish_max_messages_per_second()), - ) - return WebsocketPublishResponse() - - @extension_api_method( - method_id="wallet.create_invoice", - namespace="wallet", - name="Create invoice", - host_name="create_invoice", - sdk_name="createInvoice", - description="Create an incoming Lightning invoice for an allowed wallet.", - required_permission="wallet.create_invoice", - require_auth=True, - ) - async def wallet_create_invoice( - self, request: CreateInvoiceRequest - ) -> CreateInvoiceResponse: - from lnbits.core.crud.wallets import get_wallet - from lnbits.core.models.payments import CreateInvoice - from lnbits.core.services.payments import create_payment_request - - if not self.user_id: - raise PermissionError( - "Creating an invoice for this wallet requires an " - "authenticated user context." - ) - wallet = await get_wallet(request.wallet_id) - if wallet is None or wallet.user != self.user_id: - raise PermissionError("Not your wallet.") - - payment = await create_payment_request( - request.wallet_id, - CreateInvoice( - amount=request.amount, - unit=request.currency, - memo=request.memo, - extra=request.extra, - extension=self.extension_id, - ), - ) - return CreateInvoiceResponse( - payment_hash=payment.payment_hash, - payment_request=payment.payment_request or payment.bolt11, - checking_id=payment.checking_id, - ) - - @extension_api_method( - method_id="wallet.create_invoice_public", - namespace="wallet", - name="Create public invoice", - host_name="create_invoice_public", - sdk_name="createInvoicePublic", - description="Create a public incoming Lightning invoice.", - required_permission="wallet.create_invoice_public", - require_auth=False, - ) - async def wallet_create_invoice_public( - self, request: CreateInvoicePublicRequest - ) -> CreateInvoiceResponse: - from lnbits.core.models.payments import CreateInvoice - from lnbits.core.services.payments import create_payment_request - - row: dict[str, Any] | None = None - wallet_field = "" - for policy in self._public_invoice_wallet_sources(): - row = await storage_get_public_row( - self.extension_id, - policy["table"], - request.source_id, - ) - if row: - wallet_field = policy["wallet_field"] - break - - if not row: - raise PermissionError("Public invoice source was not found.") - - wallet_id = row.get(wallet_field) - if not isinstance(wallet_id, str) or not wallet_id: - raise PermissionError("Public invoice source has no valid wallet.") - - payment = await create_payment_request( - wallet_id, - CreateInvoice( - amount=request.amount, - unit=request.currency, - memo=request.memo, - extra={ - "tag": self.extension_id, - "source_id": request.source_id, - f"extra_{self.extension_id}": request.extra, - }, - extension=self.extension_id, - ), - ) - return CreateInvoiceResponse( - payment_hash=payment.payment_hash, - payment_request=payment.payment_request or payment.bolt11, - checking_id=payment.checking_id, - ) - - @extension_api_method( - method_id="wallet.list_user_wallets", - namespace="wallet", - name="List user wallets", - host_name="list_user_wallets", - sdk_name="listUserWallets", - description="List wallets available to the authenticated extension user.", - required_permission="wallet.list", - ) - async def wallet_list_user_wallets( - self, request: EmptyRequest - ) -> ListUserWalletsResponse: - if not self.user_id: - raise PermissionError( - "Listing user wallets requires an authenticated user context." - ) - - from lnbits.core.crud.wallets import get_wallets - - user_wallets = await get_wallets(self.user_id) - if user_wallets is None: - raise PermissionError( - "Listing user wallets requires an authenticated user context." - ) - return ListUserWalletsResponse( - wallets=[ - UserWalletSummary(id=w.id, name=w.name, currency=w.currency) - for w in user_wallets - ] - ) - - @extension_api_method( - method_id="wallet.balance", - namespace="wallet", - name="Read wallet balance", - host_name="wallet_balance", - sdk_name="balance", - description="Read the balance of a wallet available to the user.", - required_permission="wallet.balance.read", - ) - async def wallet_balance( - self, request: WalletBalanceRequest - ) -> WalletBalanceResponse: - from lnbits.core.crud.wallets import get_wallet - - if not self.user_id: - raise PermissionError( - "Reading a wallet balance requires an authenticated user context." - ) - - wallet = await get_wallet(request.wallet_id) - if wallet is None or wallet.user != self.user_id: - raise PermissionError("Reading this wallet balance is not allowed.") - - withdrawable_msat = max(wallet.withdrawable_balance, 0) - fee_reserve_msat = max(wallet.balance_msat - withdrawable_msat, 0) - return WalletBalanceResponse( - wallet_id=wallet.id, - name=wallet.name, - currency=wallet.currency, - balance_msat=wallet.balance_msat, - balance_sat=wallet.balance, - withdrawable_msat=withdrawable_msat, - withdrawable_sat=withdrawable_msat // 1000, - fee_reserve_msat=fee_reserve_msat, - fee_reserve_sat=fee_reserve_msat // 1000, - can_send_payments=wallet.can_send_payments, - ) - - @extension_api_method( - method_id="wallet.pay_invoice", - namespace="wallet", - name="Pay invoice", - host_name="pay_invoice", - sdk_name="payInvoice", - description="Pay a Lightning invoice from a wallet available to the user.", - ) - async def wallet_pay_invoice( - self, request: PayInvoiceRequest - ) -> PayInvoiceResponse: - from lnbits.core.crud.wallets import get_wallet - from lnbits.core.services.payments import pay_invoice - from lnbits.exceptions import PaymentError - - wallet = await get_wallet(request.wallet_id) - if wallet is None: - raise PermissionError("Paying invoices from this wallet is not allowed.") - - try: - if self.user_id: - self.require_permission("wallet.pay_invoice") - if wallet.user != self.user_id: - raise PermissionError( - "Paying invoices from this wallet is not allowed." - ) - payment = await pay_invoice( - wallet_id=request.wallet_id, - payment_request=request.payment_request, - max_sat=request.max_sat, - extra={"tag": self.extension_id, **request.extra}, - description=request.description, - tag=self.extension_id, - ) - else: - self.require_permission(WALLET_PAY_INVOICE_BACKGROUND_PERMISSION) - amount_msat = invoice_amount_msat(request.payment_request) - extra = await background_payment_extra( - extension_id=self.extension_id, - wallet=wallet, - payment_request=request.payment_request, - amount_msat=amount_msat, - ) - payment = await pay_invoice( - wallet_id=request.wallet_id, - payment_request=request.payment_request, - max_sat=request.max_sat, - extra={**request.extra, **extra}, - description=request.description, - tag=self.extension_id, - ) - except (PaymentError, PermissionError, ValueError) as exc: - return PayInvoiceResponse(ok=False, error=str(exc)) - - return _pay_invoice_response(payment) - - @extension_api_method( - method_id="wallet.pay_lnurl", - namespace="wallet", - name="Pay LNURL", - host_name="pay_lnurl", - sdk_name="payLnurl", - description="Pay a Lightning Address or LNURL-pay request from a wallet.", - ) - async def wallet_pay_lnurl(self, request: PayLnurlRequest) -> PayInvoiceResponse: - from lnurl import LnAddressError, LnurlResponseException - - from lnbits.core.crud.wallets import get_wallet - from lnbits.core.models.lnurl import CreateLnurlPayment - from lnbits.core.services.lnurl import fetch_lnurl_pay_request - from lnbits.core.services.payments import pay_invoice - from lnbits.exceptions import PaymentError - - from .lnurl import ( - lnurl_for_core, - lnurl_pay_response_text, - lnurl_payment_amount_for_core, - lnurl_payment_unit_for_core, - ) - - wallet = await get_wallet(request.wallet_id) - if wallet is None: - raise PermissionError("Paying from this wallet is not allowed.") - - try: - if self.user_id: - self.require_permission("wallet.pay_invoice") - if wallet.user != self.user_id: - raise PermissionError("Paying from this wallet is not allowed.") - else: - self.require_permission(WALLET_PAY_INVOICE_BACKGROUND_PERMISSION) - - unit = lnurl_payment_unit_for_core(request.currency) - res, action = await fetch_lnurl_pay_request( - data=CreateLnurlPayment( - lnurl=lnurl_for_core(request.lnurl), - amount=lnurl_payment_amount_for_core(request.amount), - unit=unit, - comment=request.comment, - internal_memo=request.description or None, - ), - wallet=None, - ) - extra = {"tag": self.extension_id, **request.extra} - if action.successAction: - extra["success_action"] = action.successAction.json() - if request.comment: - extra["comment"] = request.comment - if unit != "sat": - extra["fiat_currency"] = unit - extra["fiat_amount"] = str(request.amount) - - if not self.user_id: - amount_msat = invoice_amount_msat(str(action.pr)) - extra = { - **extra, - **( - await background_payment_extra( - extension_id=self.extension_id, - wallet=wallet, - payment_request=str(action.pr), - amount_msat=amount_msat, - ) - ), - } - - payment = await pay_invoice( - wallet_id=request.wallet_id, - payment_request=str(action.pr), - max_sat=request.max_sat, - extra=extra, - description=request.description or lnurl_pay_response_text(res), - tag=self.extension_id, - ) - except ( - LnAddressError, - LnurlResponseException, - PaymentError, - PermissionError, - ValueError, - ) as exc: - return PayInvoiceResponse(ok=False, error=str(exc)) - - return _pay_invoice_response(payment) - - @extension_api_method( - method_id="http.request", - namespace="http", - name="HTTP request", - host_name="http_request", - sdk_name="request", - description="Make an outbound HTTP request to an allowed host.", - required_permission="http.request", - require_auth=True, - ) - async def http_request(self, request: HttpRequest) -> HttpResponse: - from ..client.http import send_extension_http_request - - policies = self.permission_policies.get("http.request") or [] - return await send_extension_http_request( - self.extension_id, - policies, - request, - timeout_ms=self.runtime_limits.get("wasm_runtime_http_timeout_ms"), - max_response_bytes=self.runtime_limits.get( - "wasm_runtime_max_http_response_bytes" - ), - ) - - @extension_api_method( - method_id="extension.api.request", - namespace="extension", - name="Extension API request", - host_name="extension_api_request", - sdk_name="request", - description="Call an allowed installed extension API.", - required_permission="extension.api.request", - require_auth=True, - ) - async def extension_api_request(self, request: ExtensionApiRequest) -> HttpResponse: - - policies = self.permission_policies.get("extension.api.request") or [] - return await send_extension_api_request( - self.extension_id, - policies, - self.user_id, - self.access_token, - request, - timeout_ms=self.runtime_limits.get("wasm_runtime_http_timeout_ms"), - max_response_bytes=self.runtime_limits.get( - "wasm_runtime_max_http_response_bytes" - ), - ) - - @extension_api_method( - method_id="system.random_id", - namespace="system", - name="Random ID", - host_name="random_id", - sdk_name="id", - description="Create a random extension-local identifier.", - require_auth=False, - ) - async def system_random_id(self, request: RandomIdRequest) -> RandomIdResponse: - return RandomIdResponse( - id=f"{request.prefix}_{secrets.token_urlsafe(12).replace('-', '_')}" - ) - - @extension_api_method( - method_id="system.now", - namespace="system", - name="Current timestamp", - host_name="now", - sdk_name="now", - description="Return the current Unix timestamp.", - require_auth=False, - ) - async def system_now(self, request: EmptyRequest) -> NowResponse: - return NowResponse(timestamp=int(time.time())) - - @extension_api_method( - method_id="system.log", - namespace="system", - name="Log message", - host_name="log", - sdk_name="log", - description="Write a bounded message to the extension log.", - require_auth=False, - ) - async def system_log(self, request: LogRequest) -> LogResponse: - log = getattr(logger, request.level) - log("extension:%s %s", self.extension_id, request.message) - return LogResponse() - - @staticmethod - def _permission_data( - permissions: Iterable[Any], - ) -> tuple[set[str], dict[str, list[Any]]]: - permission_ids: set[str] = set() - policies: dict[str, list[Any]] = {} - - for permission in permissions: - if isinstance(permission, str): - permission_ids.add(permission) - continue - - permission_id: str | None = None - permission_policies: Any = None - if isinstance(permission, Mapping): - permission_id = permission.get("id") # type: ignore[assignment] - permission_policies = permission.get("policies") - else: - permission_id = getattr(permission, "id", None) - permission_policies = getattr(permission, "policies", None) - - if not permission_id: - continue - permission_ids.add(permission_id) - if isinstance(permission_policies, list): - policies[permission_id] = permission_policies - - return permission_ids, policies - - def _public_storage_policy(self, table: str) -> dict[str, Any]: - tables = self.permission_policies.get("ext.storage.read_public") - if not isinstance(tables, list) or not tables: - raise PermissionError( - "Public storage reads require policies for " - "'ext.storage.read_public'." - ) - - for table_policy in tables: - if not isinstance(table_policy, dict): - continue - if table_policy.get("table_name") != table: - continue - public_fields = table_policy.get("public_fields") - if not isinstance(public_fields, list) or not all( - isinstance(field, str) and field for field in public_fields - ): - raise PermissionError( - f"Public storage table '{table}' has no valid public fields." - ) - source_id_field = table_policy.get("source_id_field") - if source_id_field is not None and ( - not isinstance(source_id_field, str) or not source_id_field - ): - raise PermissionError( - f"Public storage table '{table}' has no valid source ID field." - ) - return { - "public_fields": set(public_fields), - "source_id_field": source_id_field, - } - - raise PermissionError(f"Storage table '{table}' is not publicly readable.") - - def _validate_public_storage_query_fields( - self, - request: StoragePaginatedRequest, - public_fields: set[str], - allowed_private_fields: set[str] | None = None, - ) -> None: - allowed_private_fields = allowed_private_fields or set() - query_fields = set(request.filters) - query_fields.update(request.search_fields) - if request.sort_by: - query_fields.add(request.sort_by) - private_fields = sorted(query_fields - public_fields - allowed_private_fields) - if private_fields: - raise PermissionError( - "Public storage query uses non-public fields: " - + ", ".join(private_fields) - ) - - def _public_storage_paginated_filters( - self, - request: StoragePublicPaginatedRequest, - public_fields: set[str], - source_id_field: str, - ) -> dict[str, Any]: - self._validate_public_storage_query_fields( - request, public_fields, {source_id_field} - ) - filters = dict(request.filters) - requested_source_id = filters.get(source_id_field) - if requested_source_id is not None and requested_source_id != request.source_id: - raise PermissionError( - "Public storage source filter does not match source_id." - ) - filters[source_id_field] = request.source_id - return filters - - async def _public_storage_append_policy( - self, table: str, source_id: str - ) -> tuple[dict[str, Any], str]: - policies = self.permission_policies.get("ext.storage.append_public") - if not isinstance(policies, list) or not policies: - raise PermissionError( - "Public storage appends require policies for " - "'ext.storage.append_public'." - ) - - source_not_found = False - for raw_policy in policies: - policy = self._normalize_public_storage_append_policy(raw_policy) - if policy["table"] != table: - continue - owner_id = await storage_get_row_owner_id( - self.extension_id, - policy["source_table"], - source_id, - ) - if not owner_id: - source_not_found = True - continue - return policy, owner_id - - if source_not_found: - raise PermissionError("Public storage append source was not found.") - raise PermissionError(f"Storage table '{table}' is not publicly appendable.") - - def _normalize_public_storage_append_policy(self, policy: Any) -> dict[str, Any]: - if not isinstance(policy, dict): - raise PermissionError("Public storage append policies must be objects.") - - table = policy.get("table") - source_table = policy.get("source_table") - source_id_field = policy.get("source_id_field") - allowed_fields = policy.get("allowed_fields") - max_rows_per_source = policy.get( - "max_rows_per_source", PUBLIC_APPEND_DEFAULT_MAX_ROWS_PER_SOURCE - ) - - if not isinstance(table, str) or not table: - raise PermissionError("Public storage append requires a table policy.") - if not isinstance(source_table, str) or not source_table: - raise PermissionError( - "Public storage append requires a source table policy." - ) - if not isinstance(source_id_field, str) or not source_id_field: - raise PermissionError( - "Public storage append requires a source ID field policy." - ) - if source_id_field == "id": - raise PermissionError("Public storage append source field cannot be 'id'.") - if ( - not isinstance(allowed_fields, list) - or not all(isinstance(field, str) and field for field in allowed_fields) - or "id" in allowed_fields - or OWNER_ID_FIELD in allowed_fields - or source_id_field in allowed_fields - ): - raise PermissionError( - "Public storage append requires valid allowed fields." - ) - if ( - isinstance(max_rows_per_source, bool) - or not isinstance(max_rows_per_source, int) - or max_rows_per_source <= 0 - ): - raise PermissionError( - "Public storage append requires a positive row limit." - ) - - return { - "table": table, - "source_table": source_table, - "source_id_field": source_id_field, - "allowed_fields": set(allowed_fields), - "max_rows_per_source": max_rows_per_source, - } - - def _validate_public_append_data( - self, policy: dict[str, Any], data: dict[str, Any] - ) -> None: - if not isinstance(data, dict): - raise PermissionError("Public storage append data must be an object.") - unknown_fields = sorted(set(data) - policy["allowed_fields"]) - if unknown_fields: - raise PermissionError( - "Public storage append contains disallowed fields: " - + ", ".join(unknown_fields) - ) - - def _public_invoice_wallet_sources(self) -> list[dict[str, str]]: - policies = self.permission_policies.get("wallet.create_invoice_public") - if not isinstance(policies, list) or not policies: - raise PermissionError("Public invoice creation requires a policies list.") - - sources: list[dict[str, str]] = [] - for source_policy in policies: - if not isinstance(source_policy, dict): - raise PermissionError( - "Public invoice creation policies must be objects." - ) - table = source_policy.get("table") - wallet_field = source_policy.get("wallet_field") - if not isinstance(table, str) or not table: - raise PermissionError( - "Public invoice creation requires a storage table policy." - ) - if not isinstance(wallet_field, str) or not wallet_field: - raise PermissionError( - "Public invoice creation requires a wallet field policy." - ) - sources.append({"table": table, "wallet_field": wallet_field}) - - if not sources: - raise PermissionError( - "Public invoice creation requires at least one valid policy." - ) - return sources - - def _websocket_publish_max_messages_per_second(self) -> int: - policies = self.permission_policies.get("websocket.publish") - if not isinstance(policies, list) or len(policies) != 1: - raise PermissionError( - "Websocket publishing requires a max messages per second policy." - ) - policy = policies[0] - if not isinstance(policy, dict): - raise PermissionError( - "Websocket publishing requires a max messages per second policy." - ) - max_messages_per_second = policy.get("max_messages_per_second") - if ( - isinstance(max_messages_per_second, bool) - or not isinstance(max_messages_per_second, int) - or max_messages_per_second <= 0 - ): - raise PermissionError( - "Websocket publishing requires a valid max messages per second policy." - ) - return max_messages_per_second - - def require_permission(self, permission: str | None) -> None: - if permission and permission not in self.permissions: - raise PermissionError( - f"Extension '{self.extension_id}' is missing permission '{permission}'." - ) - - def has_authenticated_context(self) -> bool: - return bool(self.user_id) or self.context == "event" - - def _require_owner_id(self) -> str: - if not self.owner_id: - raise PermissionError("Extension API method requires an owner context.") - return self.owner_id - - def __repr__(self) -> str: - return ( - "ExtensionHostAPI(" - f"extension_id={self.extension_id!r}, " - f"context={self.context!r}, " - f"owner_id={self.owner_id!r}" - ")" - ) - - -def _pay_invoice_response(payment: Any) -> PayInvoiceResponse: - return PayInvoiceResponse( - ok=True, - checking_id=payment.checking_id, - payment_hash=payment.payment_hash, - status=payment.status, - amount_msat=abs(payment.amount), - fee_msat=abs(payment.fee), - pending=payment.pending, - success=payment.success, - ) diff --git a/lnbits/core/wasm_ext/api/lnurl.py b/lnbits/core/wasm_ext/api/lnurl.py deleted file mode 100644 index 22f78f829..000000000 --- a/lnbits/core/wasm_ext/api/lnurl.py +++ /dev/null @@ -1,70 +0,0 @@ -from __future__ import annotations - -import json -from typing import Any - -from lnurl import LnAddress, Lnurl - - -def normalize_lnurl(value: str) -> str: - normalized = value.strip() - if normalized.lower().startswith("lightning:"): - normalized = normalized[len("lightning:") :] - if "@" in normalized: - normalized = normalized.lower() - if not normalized: - raise ValueError("LNURL is required.") - return normalized - - -def lnurl_for_core(value: str) -> Lnurl | LnAddress: - normalized = normalize_lnurl(value) - if "@" in normalized: - return LnAddress(normalized) - return Lnurl(normalized) - - -def lnurl_payment_amount_for_core(amount: float) -> int: - if amount <= 0: - raise ValueError("Amount must be greater than zero.") - return round(amount * 1000) - - -def lnurl_payment_unit_for_core(currency: str) -> str: - unit = currency.strip().lower() - if not unit: - raise ValueError("Currency is required.") - if unit in {"sat", "sats"}: - return "sat" - return unit.upper() - - -def lnurl_pay_response_metadata_json(response: Any) -> str: - metadata = getattr(response, "metadata", None) - if metadata is None: - return "[]" - - metadata_list = getattr(metadata, "list", None) - try: - if callable(metadata_list): - return json.dumps(metadata_list()) - return json.dumps(metadata) - except TypeError: - return json.dumps(str(metadata)) - - -def lnurl_pay_response_text(response: Any) -> str: - description = getattr(response, "description", None) - if description is not None: - return str(description) - - metadata = getattr(response, "metadata", None) - text = getattr(metadata, "text", None) - return str(text) if text is not None else "" - - -def lnurl_pay_response_int(response: Any, snake_name: str, camel_name: str) -> int: - value = getattr(response, snake_name, None) - if value is None: - value = getattr(response, camel_name, 0) - return int(value or 0) diff --git a/lnbits/core/wasm_ext/api/models.py b/lnbits/core/wasm_ext/api/models.py deleted file mode 100644 index de518af11..000000000 --- a/lnbits/core/wasm_ext/api/models.py +++ /dev/null @@ -1,440 +0,0 @@ -import json -from dataclasses import dataclass -from typing import Any, Literal - -from pydantic import BaseModel, Field, root_validator - - -@dataclass(frozen=True) -class ExtensionAPIMethodExport: - method_id: str - namespace: str - name: str - host_interface: str - host_name: str - sdk_name: str - description: str - required_permission: str | None = None - require_auth: bool = True - - -@dataclass(frozen=True) -class ExtensionAPIMethod: - method_id: str - namespace: str - name: str - python_name: str - host_interface: str - host_name: str - sdk_name: str - description: str - request_model: type[BaseModel] - response_model: type[BaseModel] - required_permission: str | None = None - require_auth: bool = True - - @property - def sdk_qualified_name(self) -> str: - return f"{self.namespace}.{self.sdk_name}" - - -class EmptyRequest(BaseModel): - pass - - -class StorageGetRequest(BaseModel): - table: str = Field(..., min_length=1, max_length=128) - id: str = Field(..., min_length=1, max_length=512) - - -class StorageGetResponse(BaseModel): - data_json: str | None = None - - -class StorageSetRequest(BaseModel): - table: str = Field(..., min_length=1, max_length=128) - data: dict[str, Any] = Field(default_factory=dict) - - @root_validator(pre=True) - def parse_data_json(cls, values: dict[str, Any]) -> dict[str, Any]: - data_json = values.get("data_json") - if data_json is not None and "data" not in values: - values["data"] = json.loads(data_json) - return values - - -class StorageSetResponse(BaseModel): - ok: bool = True - - -class StorageAppendPublicRequest(BaseModel): - table: str = Field(..., min_length=1, max_length=128) - source_id: str = Field(..., min_length=1, max_length=512) - data: dict[str, Any] = Field(default_factory=dict) - - @root_validator(pre=True) - def parse_data_json(cls, values: dict[str, Any]) -> dict[str, Any]: - data_json = values.get("data_json") - if data_json is not None and "data" not in values: - values["data"] = json.loads(data_json) - return values - - -class StorageAppendPublicResponse(BaseModel): - id: str - - -class StoragePaginatedRequest(BaseModel): - table: str = Field(..., min_length=1, max_length=128) - filters: dict[str, Any] = Field(default_factory=dict) - search: str | None = Field(None, max_length=256) - search_fields: list[str] = Field(default_factory=list) - sort_by: str | None = Field(None, min_length=1, max_length=128) - descending: bool = False - limit: int = Field(25, ge=1, le=1000) - offset: int = Field(0, ge=0) - - @root_validator(pre=True) - def parse_json_fields(cls, values: dict[str, Any]) -> dict[str, Any]: - filters_json = values.get("filters_json") - if filters_json is not None and "filters" not in values: - values["filters"] = json.loads(filters_json) - - search_fields_json = values.get("search_fields_json") - if search_fields_json is not None and "search_fields" not in values: - values["search_fields"] = json.loads(search_fields_json) - - if values.get("sort_by") == "": - values["sort_by"] = None - return values - - -class StoragePublicPaginatedRequest(StoragePaginatedRequest): - source_id: str = Field(..., min_length=1, max_length=512) - - -class StoragePaginatedResponse(BaseModel): - rows_json: str = "[]" - total: int = 0 - - -class WebsocketPublishRequest(BaseModel): - item_id: str = Field(..., min_length=1, max_length=128) - data: Any = Field(default_factory=dict) - - @root_validator(pre=True) - def parse_data_json(cls, values: dict[str, Any]) -> dict[str, Any]: - data_json = values.get("data_json") - if data_json is not None and "data" not in values: - values["data"] = json.loads(data_json) - return values - - @root_validator - def validate_data_size(cls, values: dict[str, Any]) -> dict[str, Any]: - data = values.get("data") - try: - encoded = json.dumps(data, separators=(",", ":")) - except TypeError as exc: - raise ValueError("websocket data must be JSON serializable.") from exc - if len(encoded.encode()) > 65536: - raise ValueError("websocket data must not exceed 65536 bytes.") - values["data"] = data - return values - - @property - def data_json(self) -> str: - return json.dumps(self.data, separators=(",", ":")) - - -class WebsocketPublishResponse(BaseModel): - sent: bool = True - - -class StorageDeleteRequest(BaseModel): - table: str = Field(..., min_length=1, max_length=128) - id: str = Field(..., min_length=1, max_length=512) - - -class StorageDeleteResponse(BaseModel): - ok: bool = True - - -class CreateInvoiceRequest(BaseModel): - wallet_id: str = Field(..., min_length=1, max_length=128) - amount: float = Field(..., gt=0) - currency: str = Field("sat", min_length=1, max_length=8) - memo: str = Field(..., max_length=512) - tag: str = Field(..., min_length=1, max_length=64) - extra: dict[str, str] = Field(default_factory=dict) - - -class CreateInvoicePublicRequest(BaseModel): - source_id: str = Field( - ..., - min_length=1, - max_length=512, - description="The source ID (entry id) of the wallet to create the invoice for.", - ) - amount: float = Field(..., gt=0) - currency: str = Field(..., min_length=1, max_length=8) - memo: str = Field("", max_length=512) - extra: dict[str, Any] = Field(default_factory=dict) - - @root_validator - def validate_extra_size(cls, values: dict[str, Any]) -> dict[str, Any]: - extra = values.get("extra") or {} - try: - encoded = json.dumps(extra, separators=(",", ":")) - except TypeError as exc: - raise ValueError("extra must be JSON serializable.") from exc - if len(encoded.encode()) > 4096: - raise ValueError("extra must not exceed 4096 bytes.") - values["extra"] = extra - return values - - -class CreateInvoiceResponse(BaseModel): - payment_hash: str - payment_request: str - checking_id: str - - -class UserWalletSummary(BaseModel): - id: str - name: str - currency: str | None = None - - -class ListUserWalletsResponse(BaseModel): - wallets: list[UserWalletSummary] = Field(default_factory=list) - - -class WalletBalanceRequest(BaseModel): - wallet_id: str = Field(..., min_length=1, max_length=128) - - -class WalletBalanceResponse(BaseModel): - wallet_id: str - name: str - currency: str | None = None - balance_msat: int - balance_sat: int - withdrawable_msat: int - withdrawable_sat: int - fee_reserve_msat: int - fee_reserve_sat: int - can_send_payments: bool - - -class PayInvoiceRequest(BaseModel): - wallet_id: str = Field(..., min_length=1, max_length=128) - payment_request: str = Field(..., min_length=1, max_length=8192) - max_sat: int | None = Field(None, gt=0) - description: str = Field("", max_length=512) - extra: dict[str, str] = Field(default_factory=dict) - - -class PayLnurlRequest(BaseModel): - wallet_id: str = Field(..., min_length=1, max_length=128) - lnurl: str = Field(..., min_length=1, max_length=2048) - amount: float = Field(..., gt=0) - currency: str = Field("sat", min_length=1, max_length=8) - comment: str | None = Field(None, max_length=512) - description: str = Field("", max_length=512) - max_sat: int | None = Field(None, gt=0) - extra: dict[str, str] = Field(default_factory=dict) - - -class PayInvoiceResponse(BaseModel): - ok: bool = True - error: str | None = None - checking_id: str | None = None - payment_hash: str | None = None - status: str | None = None - amount_msat: int = 0 - fee_msat: int = 0 - pending: bool = False - success: bool = False - - -class HttpRequest(BaseModel): - method: Literal["DELETE", "GET", "HEAD", "PATCH", "POST", "PUT"] = "GET" - url: str = Field(..., min_length=1, max_length=2048) - headers: dict[str, str] = Field(default_factory=dict) - body: str | None = Field(None, max_length=65536) - - @root_validator(pre=True) - def normalize_method(cls, values: dict[str, Any]) -> dict[str, Any]: - method = values.get("method") - if isinstance(method, str): - values["method"] = method.upper() - return values - - @root_validator - def validate_headers_size(cls, values: dict[str, Any]) -> dict[str, Any]: - headers = values.get("headers") or {} - if len(headers) > 32: - raise ValueError("headers must not contain more than 32 entries.") - for key, value in headers.items(): - if len(key) > 128 or len(value) > 4096: - raise ValueError("headers are too large.") - values["headers"] = headers - return values - - -class HttpResponse(BaseModel): - status_code: int - headers: dict[str, str] = Field(default_factory=dict) - body: str = "" - - -class ExtensionApiRequest(BaseModel): - extension_id: str = Field(..., min_length=1, max_length=128) - method: Literal["DELETE", "GET", "HEAD", "PATCH", "POST", "PUT"] = "GET" - path: str = Field(..., min_length=1, max_length=2048) - body: str | None = Field(None, max_length=65536) - - @root_validator(pre=True) - def normalize_method(cls, values: dict[str, Any]) -> dict[str, Any]: - method = values.get("method") - if isinstance(method, str): - values["method"] = method.upper() - return values - - -class CurrencyListResponse(BaseModel): - currencies: list[str] = Field(default_factory=list) - - -class CurrencyRateRequest(BaseModel): - currency: str = Field(..., min_length=1, max_length=8) - - -class CurrencyRateResponse(BaseModel): - rate: float - price: float - - -class CurrencyConvertRequest(BaseModel): - amount: float = Field(..., gt=0) - from_currency: str = Field(..., alias="from", min_length=1, max_length=8) - to: str = Field(..., min_length=1, max_length=256) - - class Config: - allow_population_by_field_name = True - - -class CurrencyConvertResponse(BaseModel): - amounts: list[tuple[str, float]] = Field(default_factory=list) - - -class FiatToSatsRequest(BaseModel): - amount: float = Field(..., gt=0) - currency: str = Field(..., min_length=1, max_length=8) - - -class FiatToSatsResponse(BaseModel): - amount_sat: int - - -class SatsToFiatRequest(BaseModel): - amount: float = Field(..., gt=0) - currency: str = Field(..., min_length=1, max_length=8) - - -class SatsToFiatResponse(BaseModel): - amount: float - - -class LnurlResolveRequest(BaseModel): - lnurl: str = Field(..., min_length=1, max_length=2048) - - -class LnurlResolveResponse(BaseModel): - lnurl: str - domain: str | None = None - description: str = "" - min_sendable_msat: int - max_sendable_msat: int - comment_allowed: int = 0 - fixed: bool = False - image: str | None = None - metadata_json: str = "[]" - - -class ServerHealthResponse(BaseModel): - server_time: int - up_time: str - - -class Bolt11Request(BaseModel): - bolt11: str = Field(..., min_length=1, max_length=8192) - - -class DecodeInvoiceResponse(BaseModel): - valid: bool = True - payment_hash: str | None = None - amount_msat: int | None = None - expiry: int | None = None - expires_at: int | None = None - memo: str | None = None - - -class ValidateInvoiceResponse(BaseModel): - valid: bool - error: str | None = None - - -class InvoicePaymentHashResponse(BaseModel): - payment_hash: str - - -class InvoiceAmountMsatResponse(BaseModel): - amount_msat: int | None = None - - -class InvoiceExpiryResponse(BaseModel): - expires_at: int | None = None - - -class InvoiceMemoResponse(BaseModel): - memo: str | None = None - - -class VerifyPreimageRequest(BaseModel): - preimage: str = Field(..., min_length=64, max_length=64) - payment_hash: str = Field(..., min_length=64, max_length=64) - - -class VerifyPreimageResponse(BaseModel): - valid: bool - - -class RandomSecretAndHashRequest(BaseModel): - length: int = Field(32, ge=16, le=64) - - -class RandomSecretAndHashResponse(BaseModel): - secret: str - hash: str - - -class RandomIdRequest(BaseModel): - prefix: str = Field(..., min_length=1, max_length=32) - - -class RandomIdResponse(BaseModel): - id: str - - -class NowResponse(BaseModel): - timestamp: int - - -class LogRequest(BaseModel): - level: Literal["debug", "info", "warning", "error"] = "info" - message: str = Field(..., min_length=1, max_length=2048) - - -class LogResponse(BaseModel): - ok: bool = True diff --git a/lnbits/core/wasm_ext/api/permissions.py b/lnbits/core/wasm_ext/api/permissions.py deleted file mode 100644 index 837e77954..000000000 --- a/lnbits/core/wasm_ext/api/permissions.py +++ /dev/null @@ -1,412 +0,0 @@ -from collections.abc import Iterable -from typing import Any - -from lnbits.core.models.extensions import ExtensionPermission, InstallableExtension -from lnbits.core.wasm_ext.api.registry import extension_api_permission_ids -from lnbits.core.wasm_ext.api.websockets import ( - WEBSOCKET_PUBLISH_MAX_MESSAGES_PER_SECOND_LIMIT, -) -from lnbits.core.wasm_ext.client.http import _request_origin -from lnbits.core.wasm_ext.wasm.config import ( - WasmExtensionConfig, - parse_wasm_extension_config, -) - -_POLICY_AWARE_PERMISSION_IDS = { - "ext.storage.append_public", - "ext.storage.read_public", - "extension.api.request", - "http.request", - "wallet.create_invoice_public", - "websocket.publish", -} -_OWNER_ID_FIELD = "__lnbits_owner_id__" -_PUBLIC_APPEND_DEFAULT_MAX_ROWS_PER_SOURCE = 10_000 -PUBLIC_APPEND_MAX_ROWS_PER_SOURCE_LIMIT = 1_000_000 - - -def validate_extension_permissions( - ext_id: str, - permissions: Iterable[ExtensionPermission], - *, - strict: bool = True, -) -> list[ExtensionPermission]: - known_permission_ids = extension_api_permission_ids() - normalized_permissions: list[ExtensionPermission] = [] - unknown_ids: list[str] = [] - - for permission in permissions: - if permission.id not in known_permission_ids: - unknown_ids.append(permission.id) - if strict: - continue - normalized_permissions.append(permission.copy()) - - if unknown_ids and strict: - raise ValueError( - f"Extension '{ext_id}' requests unknown permissions: " - + ", ".join(sorted(set(unknown_ids))) - ) - - return normalized_permissions - - -def validate_wasm_extension_permissions( - ext_info: InstallableExtension, - granted_permissions: list[ExtensionPermission] | None, - extension_config: dict[str, Any] | WasmExtensionConfig, - *, - allow_admin_policy_overrides: bool = False, -) -> list[ExtensionPermission]: - if isinstance(extension_config, WasmExtensionConfig): - config = extension_config - elif extension_config.get("extension_type") != "wasm": - return [] - else: - config = parse_wasm_extension_config(ext_info.id, extension_config) - - requested_permissions = validate_extension_permissions( - ext_info.id, config.permissions - ) - _validate_requested_permission_policies(ext_info.id, requested_permissions) - if not requested_permissions: - return [] - - if granted_permissions is None: - raise ValueError(f"Extension '{ext_info.id}' requires permission approval.") - - granted_permissions = validate_extension_permissions( - ext_info.id, - granted_permissions, - ) - requested_by_id = _permission_index(ext_info.id, requested_permissions, "requested") - granted_by_id = _permission_index(ext_info.id, granted_permissions, "granted") - - extra_granted_ids = sorted(set(granted_by_id) - set(requested_by_id)) - if extra_granted_ids: - raise ValueError( - f"Extension '{ext_info.id}' was granted unrequested permissions: " - + ", ".join(extra_granted_ids) - ) - - effective_permissions: list[ExtensionPermission] = [] - for permission_id, granted_permission in granted_by_id.items(): - requested_permission = requested_by_id[permission_id] - if not _permission_grant_is_subset( - requested_permission, - granted_permission, - allow_admin_policy_overrides=allow_admin_policy_overrides, - ): - raise ValueError( - f"Extension '{ext_info.id}' was granted broader policies for " - f"permission '{permission_id}'." - ) - effective_permissions.append( - requested_permission.copy(update={"policies": granted_permission.policies}) - ) - - return effective_permissions - - -def _permission_index( - ext_id: str, - permissions: Iterable[ExtensionPermission], - source: str, -) -> dict[str, ExtensionPermission]: - indexed: dict[str, ExtensionPermission] = {} - duplicate_ids: list[str] = [] - - for permission in permissions: - if permission.id in indexed: - duplicate_ids.append(permission.id) - continue - indexed[permission.id] = permission - - if duplicate_ids: - raise ValueError( - f"Extension '{ext_id}' has duplicate {source} permissions: " - + ", ".join(sorted(set(duplicate_ids))) - ) - return indexed - - -def _permission_grant_is_subset( - requested: ExtensionPermission, - granted: ExtensionPermission, - *, - allow_admin_policy_overrides: bool = False, -) -> bool: - if requested.id != granted.id: - return False - if requested.id not in _POLICY_AWARE_PERMISSION_IDS: - return True - if requested.id == "http.request": - return _http_request_grant_is_subset(requested.policies, granted.policies) - if requested.id == "extension.api.request": - return _extension_api_grant_is_subset(requested.policies, granted.policies) - if requested.id == "ext.storage.append_public": - return _public_storage_append_grant_is_subset( - requested.policies, - granted.policies, - allow_max_rows_per_source_override=allow_admin_policy_overrides, - ) - if requested.id == "ext.storage.read_public": - return _public_storage_grant_is_subset(requested.policies, granted.policies) - if requested.id == "wallet.create_invoice_public": - return _public_invoice_grant_is_subset(requested.policies, granted.policies) - if requested.id == "websocket.publish": - return _websocket_publish_grant_is_subset( - requested.policies, - granted.policies, - allow_max_messages_per_second_override=allow_admin_policy_overrides, - ) - return False - - -def _validate_requested_permission_policies( - ext_id: str, - permissions: Iterable[ExtensionPermission], -) -> None: - for permission in permissions: - if permission.id != "websocket.publish": - continue - if _websocket_publish_policy(permission.policies) is None: - raise ValueError( - f"Extension '{ext_id}' requests invalid policies for permission " - "'websocket.publish'." - ) - - -def _policy_list(policies: list[Any] | None) -> list[Any]: - return policies if isinstance(policies, list) else [] - - -def _http_request_grant_is_subset( - requested_policies: list[Any] | None, - granted_policies: list[Any] | None, -) -> bool: - return _http_origins(granted_policies).issubset(_http_origins(requested_policies)) - - -def _http_origins(policies: list[Any] | None) -> set[str]: - origins: set[str] = set() - for policy in _policy_list(policies): - host = policy.get("host") if isinstance(policy, dict) else policy - if not isinstance(host, str) or not host: - continue - try: - origins.add(_request_origin(host)) - except PermissionError: - continue - return origins - - -def _extension_api_grant_is_subset( - requested_policies: list[Any] | None, - granted_policies: list[Any] | None, -) -> bool: - requested_targets = _extension_api_targets(requested_policies) - granted_targets = _extension_api_targets(granted_policies) - for extension_id, granted_access in granted_targets.items(): - requested_access = requested_targets.get(extension_id) - if requested_access is None or not granted_access.issubset(requested_access): - return False - return True - - -def _extension_api_targets(policies: list[Any] | None) -> dict[str, set[str]]: - targets: dict[str, set[str]] = {} - for policy in _policy_list(policies): - extension_id: str | None = None - access: list[Any] = [] - if isinstance(policy, str): - extension_id = policy - access = ["read"] - elif isinstance(policy, dict): - raw_extension_id = policy.get("id") - raw_access = policy.get("access") - if isinstance(raw_extension_id, str) and isinstance(raw_access, list): - extension_id = raw_extension_id - access = raw_access - if not extension_id or extension_id in targets: - continue - clean_access = { - item - for item in access - if isinstance(item, str) and item in {"read", "write"} - } - if clean_access: - targets[extension_id] = clean_access - return targets - - -def _public_storage_grant_is_subset( - requested_policies: list[Any] | None, - granted_policies: list[Any] | None, -) -> bool: - requested_tables = _public_storage_tables(requested_policies) - granted_tables = _public_storage_tables(granted_policies) - for table_name, granted_policy in granted_tables.items(): - requested_policy = requested_tables.get(table_name) - if requested_policy is None: - return False - if not granted_policy["public_fields"].issubset( - requested_policy["public_fields"] - ): - return False - requested_source_id_field = requested_policy["source_id_field"] - if ( - requested_source_id_field - and granted_policy["source_id_field"] != requested_source_id_field - ): - return False - return True - - -def _public_storage_tables(policies: list[Any] | None) -> dict[str, dict[str, Any]]: - tables: dict[str, dict[str, Any]] = {} - for policy in _policy_list(policies): - if not isinstance(policy, dict): - continue - table_name = policy.get("table_name") - public_fields = policy.get("public_fields") - source_id_field = policy.get("source_id_field") - if ( - not isinstance(table_name, str) - or table_name in tables - or not isinstance(public_fields, list) - or ( - source_id_field is not None - and (not isinstance(source_id_field, str) or not source_id_field) - ) - ): - continue - fields = {field for field in public_fields if isinstance(field, str) and field} - if fields: - tables[table_name] = { - "public_fields": fields, - "source_id_field": source_id_field, - } - return tables - - -def _public_storage_append_grant_is_subset( - requested_policies: list[Any] | None, - granted_policies: list[Any] | None, - *, - allow_max_rows_per_source_override: bool = False, -) -> bool: - requested_targets = _public_storage_append_targets(requested_policies) - granted_targets = _public_storage_append_targets(granted_policies) - if len(granted_targets) != len(_policy_list(granted_policies)): - return False - for target, granted_policy in granted_targets.items(): - requested_policy = requested_targets.get(target) - if requested_policy is None: - return False - if not granted_policy["allowed_fields"].issubset( - requested_policy["allowed_fields"] - ): - return False - if ( - granted_policy["max_rows_per_source"] - > requested_policy["max_rows_per_source"] - and not allow_max_rows_per_source_override - ): - return False - return True - - -def _public_storage_append_targets(policies: list[Any] | None) -> dict[Any, dict]: - targets: dict[Any, dict] = {} - for policy in _policy_list(policies): - if not isinstance(policy, dict): - continue - table = policy.get("table") - source_table = policy.get("source_table") - source_id_field = policy.get("source_id_field") - allowed_fields = policy.get("allowed_fields") - max_rows_per_source = policy.get( - "max_rows_per_source", _PUBLIC_APPEND_DEFAULT_MAX_ROWS_PER_SOURCE - ) - if ( - not isinstance(table, str) - or not table - or not isinstance(source_table, str) - or not source_table - or not isinstance(source_id_field, str) - or not source_id_field - or source_id_field == "id" - or not isinstance(allowed_fields, list) - or isinstance(max_rows_per_source, bool) - or not isinstance(max_rows_per_source, int) - or max_rows_per_source <= 0 - or max_rows_per_source > PUBLIC_APPEND_MAX_ROWS_PER_SOURCE_LIMIT - ): - continue - fields = {field for field in allowed_fields if isinstance(field, str) and field} - if "id" in fields or _OWNER_ID_FIELD in fields or source_id_field in fields: - continue - targets[(table, source_table, source_id_field)] = { - "allowed_fields": fields, - "max_rows_per_source": max_rows_per_source, - } - return targets - - -def _public_invoice_grant_is_subset( - requested_policies: list[Any] | None, - granted_policies: list[Any] | None, -) -> bool: - return _public_invoice_sources(granted_policies).issubset( - _public_invoice_sources(requested_policies) - ) - - -def _public_invoice_sources(policies: list[Any] | None) -> set[tuple[str, str]]: - sources: set[tuple[str, str]] = set() - for policy in _policy_list(policies): - if not isinstance(policy, dict): - continue - table = policy.get("table") - wallet_field = policy.get("wallet_field") - if isinstance(table, str) and table and isinstance(wallet_field, str): - sources.add((table, wallet_field)) - return sources - - -def _websocket_publish_grant_is_subset( - requested_policies: list[Any] | None, - granted_policies: list[Any] | None, - *, - allow_max_messages_per_second_override: bool = False, -) -> bool: - requested_policy = _websocket_publish_policy(requested_policies) - granted_policy = _websocket_publish_policy(granted_policies) - if requested_policy is None or granted_policy is None: - return False - if ( - granted_policy["max_messages_per_second"] - > requested_policy["max_messages_per_second"] - and not allow_max_messages_per_second_override - ): - return False - return True - - -def _websocket_publish_policy(policies: list[Any] | None) -> dict[str, int] | None: - policy_list = _policy_list(policies) - if len(policy_list) != 1: - return None - policy = policy_list[0] - if not isinstance(policy, dict): - return None - max_messages_per_second = policy.get("max_messages_per_second") - if ( - isinstance(max_messages_per_second, bool) - or not isinstance(max_messages_per_second, int) - or max_messages_per_second <= 0 - or max_messages_per_second > WEBSOCKET_PUBLISH_MAX_MESSAGES_PER_SECOND_LIMIT - ): - return None - return {"max_messages_per_second": max_messages_per_second} diff --git a/lnbits/core/wasm_ext/api/registry.py b/lnbits/core/wasm_ext/api/registry.py deleted file mode 100644 index 2dcddc55f..000000000 --- a/lnbits/core/wasm_ext/api/registry.py +++ /dev/null @@ -1,205 +0,0 @@ -from __future__ import annotations - -import inspect -from collections.abc import Awaitable, Callable -from functools import wraps -from typing import Any, TypeVar, cast, get_type_hints - -from pydantic import BaseModel - -from .models import ExtensionAPIMethod, ExtensionAPIMethodExport - -_EXTENSION_API_METHOD_ATTR = "__lnbits_extension_api_method__" -_EXTENSION_RUNTIME_PERMISSION_IDS = { - "ui.camera.scan_qr", - "wallet.pay_invoice", - "wallet.pay_invoice_background", - "wallet.payments.watch", - "websocket.subscribe", -} -_RequestModel = TypeVar("_RequestModel", bound=BaseModel) -_ResponseModel = TypeVar("_ResponseModel", bound=BaseModel) - - -def extension_api_method( - *, - method_id: str, - namespace: str, - name: str, - host_name: str, - sdk_name: str, - description: str, - host_interface: str = "host", - required_permission: str | None = None, - require_auth: bool = True, -) -> Callable[ - [Callable[[Any, _RequestModel], Awaitable[_ResponseModel]]], - Callable[[Any, _RequestModel], Awaitable[_ResponseModel]], -]: - export = ExtensionAPIMethodExport( - method_id=method_id, - namespace=namespace, - name=name, - host_interface=host_interface, - host_name=host_name, - sdk_name=sdk_name, - description=description, - required_permission=required_permission, - require_auth=require_auth, - ) - - def decorator( - function: Callable[[Any, _RequestModel], Awaitable[_ResponseModel]], - ) -> Callable[[Any, _RequestModel], Awaitable[_ResponseModel]]: - @wraps(function) - async def wrapper(self: Any, request: _RequestModel) -> _ResponseModel: - api = getattr(self, "api", self) - if require_auth and not api.has_authenticated_context(): - raise PermissionError( - f"Extension API method '{method_id}' requires authentication." - ) - api.require_permission(required_permission) - return await function(self, request) - - setattr(wrapper, _EXTENSION_API_METHOD_ATTR, export) - return wrapper - - return decorator - - -def list_extension_api_methods( - api_cls: type[Any] | None = None, -) -> list[ExtensionAPIMethod]: - api_cls = _default_api_cls(api_cls) - methods: list[ExtensionAPIMethod] = [] - - for prefix, method_cls in _extension_api_method_sources(api_cls): - for python_name, function in inspect.getmembers(method_cls, inspect.isfunction): - export = getattr(function, _EXTENSION_API_METHOD_ATTR, None) - if not export: - continue - - request_model, response_model = _get_method_models(function) - methods.append( - ExtensionAPIMethod( - method_id=export.method_id, - namespace=export.namespace, - name=export.name, - python_name=f"{prefix}.{python_name}" if prefix else python_name, - host_interface=export.host_interface, - host_name=export.host_name, - sdk_name=export.sdk_name, - description=export.description, - request_model=request_model, - response_model=response_model, - required_permission=export.required_permission, - require_auth=export.require_auth, - ) - ) - - return sorted(methods, key=lambda method: method.method_id) - - -def extension_api_permission_ids(api_cls: type[Any] | None = None) -> set[str]: - permissions = { - method.required_permission - for method in list_extension_api_methods(api_cls) - if method.required_permission - } - permissions.update(_EXTENSION_RUNTIME_PERMISSION_IDS) - return permissions - - -def get_extension_api_method( - method_id: str, - api_cls: type[Any] | None = None, -) -> ExtensionAPIMethod: - for method in list_extension_api_methods(api_cls): - if method.method_id == method_id: - return method - raise KeyError(f"Unknown extension API method '{method_id}'.") - - -def extension_api_contract(api_cls: type[Any] | None = None) -> dict[str, object]: - return { - "version": 1, - "methods": [ - { - "id": method.method_id, - "namespace": method.namespace, - "name": method.name, - "python_name": method.python_name, - "host_interface": method.host_interface, - "host_name": method.host_name, - "sdk_name": method.sdk_name, - "sdk_qualified_name": method.sdk_qualified_name, - "description": method.description, - "required_permission": method.required_permission, - "require_auth": method.require_auth, - "request_schema": method.request_model.schema( - ref_template="#/definitions/{model}" - ), - "response_schema": method.response_model.schema( - ref_template="#/definitions/{model}" - ), - } - for method in list_extension_api_methods(api_cls) - ], - } - - -def _default_api_cls(api_cls: type[Any] | None) -> type[Any]: - if api_cls is not None: - return api_cls - - from .host import ExtensionHostAPI - - return ExtensionHostAPI - - -def _extension_api_method_sources( - api_cls: type[Any], -) -> list[tuple[str, type[Any]]]: - sources: list[tuple[str, type[Any]]] = [("", api_cls)] - - from .host import ExtensionHostAPI - - if issubclass(api_cls, ExtensionHostAPI): - from .utils import extension_api_utils_method_classes - - sources.extend(extension_api_utils_method_classes().items()) - return sources - - -def _get_method_models( - function: Callable[..., object], -) -> tuple[type[BaseModel], type[BaseModel]]: - signature = inspect.signature(function) - request_parameters = [ - parameter - for parameter in signature.parameters.values() - if parameter.name != "self" - ] - if len(request_parameters) != 1: - raise TypeError( - f"Extension API method '{function.__name__}' must accept one request model." - ) - - hints = get_type_hints(function) - request_model = hints.get(request_parameters[0].name) - response_model = hints.get("return") - - if not _is_pydantic_model(request_model): - raise TypeError( - f"Extension API method '{function.__name__}' request must be a BaseModel." - ) - if not _is_pydantic_model(response_model): - raise TypeError( - f"Extension API method '{function.__name__}' response must be a BaseModel." - ) - - return cast(type[BaseModel], request_model), cast(type[BaseModel], response_model) - - -def _is_pydantic_model(value: object) -> bool: - return isinstance(value, type) and issubclass(value, BaseModel) diff --git a/lnbits/core/wasm_ext/api/runtime.py b/lnbits/core/wasm_ext/api/runtime.py deleted file mode 100644 index e4a62a666..000000000 --- a/lnbits/core/wasm_ext/api/runtime.py +++ /dev/null @@ -1,141 +0,0 @@ -from __future__ import annotations - -import inspect -import re -from collections.abc import Awaitable, Callable, Mapping -from typing import Any - -from pydantic import BaseModel - -from .host import ExtensionHostAPI -from .models import ExtensionAPIMethod -from .registry import list_extension_api_methods - -HostImport = Callable[..., Awaitable[dict[str, Any]]] - - -class ExtensionAPIHost: - def __init__( - self, - api: ExtensionHostAPI, - *, - api_cls: type[ExtensionHostAPI] = ExtensionHostAPI, - ) -> None: - self.api = api - self.methods = list_extension_api_methods(api_cls) - self._methods_by_host_name = self._index_methods(self.methods) - - async def invoke( - self, - host_name: str, - payload: Mapping[str, Any] | BaseModel | None = None, - ) -> dict[str, Any]: - method = self._require_method(host_name) - from lnbits.core.services.extensions import record_wasm_invocation_host_call - - record_wasm_invocation_host_call(self.api.invocation_id, method.method_id) - request = self._request_model(method, payload) - handler = _resolve_attr_path(self.api, method.python_name) - response = handler(request) - if inspect.isawaitable(response): - response = await response - return self._response_payload(method, response) - - def imports(self) -> dict[str, HostImport]: - return self.imports_for_interface("host") - - def import_object(self) -> dict[str, dict[str, HostImport]]: - interfaces = sorted({method.host_interface for method in self.methods}) - return { - f"lnbits:extension/{interface}": self.imports_for_interface(interface) - for interface in interfaces - } - - def imports_for_interface(self, host_interface: str) -> dict[str, HostImport]: - return { - _snake_to_camel(method.host_name): self._make_import(method) - for method in self.methods - if method.host_interface == host_interface - } - - def _make_import(self, method: ExtensionAPIMethod) -> HostImport: - async def host_import( - payload: Mapping[str, Any] | BaseModel | None = None, - ) -> dict[str, Any]: - return await self.invoke(method.method_id, payload) - - return host_import - - def _require_method(self, host_name: str) -> ExtensionAPIMethod: - method = self._methods_by_host_name.get(host_name) - if not method: - raise KeyError(f"Unknown extension host function '{host_name}'.") - return method - - @staticmethod - def _index_methods( - methods: list[ExtensionAPIMethod], - ) -> dict[str, ExtensionAPIMethod]: - index: dict[str, ExtensionAPIMethod] = {} - for method in methods: - for host_name in { - method.method_id, - f"{method.host_interface}:{method.host_name}", - method.host_name, - _snake_to_camel(method.host_name), - method.host_name.replace("_", "-"), - }: - index[host_name] = method - return index - - @staticmethod - def _request_model( - method: ExtensionAPIMethod, - payload: Mapping[str, Any] | BaseModel | None, - ) -> BaseModel: - if isinstance(payload, method.request_model): - return payload - if isinstance(payload, BaseModel): - payload = payload.dict() - if payload is None: - payload = {} - if not isinstance(payload, Mapping): - raise TypeError( - f"Host function '{method.host_name}' expects an object payload." - ) - data = {_to_snake(key): value for key, value in payload.items()} - if isinstance(data.get("extra"), list): - data["extra"] = dict(data["extra"]) - if isinstance(data.get("headers"), list): - data["headers"] = dict(data["headers"]) - return method.request_model.parse_obj(data) - - @staticmethod - def _response_payload( - method: ExtensionAPIMethod, - response: Any, - ) -> dict[str, Any]: - if not isinstance(response, method.response_model): - response = method.response_model.parse_obj(response) - payload = response.dict() - if method.method_id in {"http.request", "extension.api.request"} and isinstance( - payload.get("headers"), Mapping - ): - payload["headers"] = list(payload["headers"].items()) - return {_snake_to_camel(key): value for key, value in payload.items()} - - -def _snake_to_camel(value: str) -> str: - head, *tail = value.split("_") - return head + "".join(part.capitalize() for part in tail) - - -def _to_snake(value: str) -> str: - value = value.replace("-", "_") - return re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", value).lower() - - -def _resolve_attr_path(value: Any, path: str) -> Any: - for part in path.split("."): - value = getattr(value, part) - return value diff --git a/lnbits/core/wasm_ext/api/utils.py b/lnbits/core/wasm_ext/api/utils.py deleted file mode 100644 index bb664b168..000000000 --- a/lnbits/core/wasm_ext/api/utils.py +++ /dev/null @@ -1,475 +0,0 @@ -from __future__ import annotations - -import time -from collections.abc import Iterable -from datetime import datetime -from typing import Any - -from lnurl import LnurlErrorResponse, LnurlPayResponse, LnurlResponseException -from lnurl import handle as lnurl_handle - -from lnbits import bolt11 -from lnbits.settings import settings -from lnbits.utils.crypto import random_secret_and_hash, verify_preimage -from lnbits.utils.exchange_rates import ( - allowed_currencies, - fiat_amount_as_satoshis, - get_fiat_rate_and_price_satoshis, - satoshis_amount_as_fiat, -) - -from .lnurl import ( - lnurl_pay_response_int, - lnurl_pay_response_metadata_json, - lnurl_pay_response_text, - normalize_lnurl, -) -from .models import ( - Bolt11Request, - CurrencyConvertRequest, - CurrencyConvertResponse, - CurrencyListResponse, - CurrencyRateRequest, - CurrencyRateResponse, - DecodeInvoiceResponse, - EmptyRequest, - FiatToSatsRequest, - FiatToSatsResponse, - InvoiceAmountMsatResponse, - InvoiceExpiryResponse, - InvoiceMemoResponse, - InvoicePaymentHashResponse, - LnurlResolveRequest, - LnurlResolveResponse, - RandomSecretAndHashRequest, - RandomSecretAndHashResponse, - SatsToFiatRequest, - SatsToFiatResponse, - ServerHealthResponse, - ValidateInvoiceResponse, - VerifyPreimageRequest, - VerifyPreimageResponse, -) -from .registry import extension_api_method - - -class ExtensionAPIUtils: - def __init__( - self, - extension_id: str, - permissions: Iterable[str], - *, - authenticated: bool = False, - ) -> None: - permission_set = set(permissions) - self.currencies = ExtensionCurrencyUtils( - extension_id, permission_set, authenticated=authenticated - ) - self.server = ExtensionServerUtils( - extension_id, permission_set, authenticated=authenticated - ) - self.lightning = ExtensionLightningUtils( - extension_id, permission_set, authenticated=authenticated - ) - self.lnurl = ExtensionLnurlUtils( - extension_id, permission_set, authenticated=authenticated - ) - - -class _ExtensionAPIUtilsGroup: - def __init__( - self, - extension_id: str, - permissions: Iterable[str], - *, - authenticated: bool = False, - ) -> None: - self.extension_id = extension_id - self.permissions = set(permissions) - self.authenticated = authenticated - - def require_permission(self, permission: str | None) -> None: - if permission and permission not in self.permissions: - raise PermissionError( - f"Extension '{self.extension_id}' is missing permission '{permission}'." - ) - - def has_authenticated_context(self) -> bool: - return self.authenticated - - -class ExtensionCurrencyUtils(_ExtensionAPIUtilsGroup): - @extension_api_method( - method_id="utils.currencies.list", - namespace="utils.currencies", - name="List currencies", - host_interface="utils-currencies", - host_name="list_currencies", - sdk_name="list", - description="List currencies supported by LNbits exchange-rate conversion.", - required_permission="utils.basic", - require_auth=False, - ) - async def list(self, request: EmptyRequest) -> CurrencyListResponse: - - return CurrencyListResponse(currencies=allowed_currencies()) - - @extension_api_method( - method_id="utils.currencies.rate", - namespace="utils.currencies", - name="Get currency rate", - host_interface="utils-currencies", - host_name="rate", - sdk_name="rate", - description="Get sats-per-fiat and BTC price for a currency.", - required_permission="utils.basic", - require_auth=False, - ) - async def rate(self, request: CurrencyRateRequest) -> CurrencyRateResponse: - - rate, price = await get_fiat_rate_and_price_satoshis(request.currency) - return CurrencyRateResponse(rate=rate, price=price) - - @extension_api_method( - method_id="utils.currencies.convert", - namespace="utils.currencies", - name="Convert currency amount", - host_interface="utils-currencies", - host_name="convert", - sdk_name="convert", - description="Convert between sats, BTC, and supported fiat currencies.", - required_permission="utils.basic", - require_auth=False, - ) - async def convert(self, request: CurrencyConvertRequest) -> CurrencyConvertResponse: - - from_currency = request.from_currency - if from_currency == "sats": - from_currency = "sat" - - amounts: list[tuple[str, float]] = [] - if from_currency == "sat": - sats = int(request.amount) - amounts.append(("BTC", sats / 100_000_000)) - amounts.append(("sats", sats)) - for currency in request.to.split(","): - currency = currency.strip() - if currency: - amounts.append( - ( - currency.upper(), - await satoshis_amount_as_fiat(sats, currency), - ) - ) - else: - sats = await fiat_amount_as_satoshis(request.amount, from_currency) - amounts.append((from_currency.upper(), request.amount)) - amounts.append(("sats", sats)) - amounts.append(("BTC", sats / 100_000_000)) - return CurrencyConvertResponse(amounts=amounts) - - @extension_api_method( - method_id="utils.currencies.fiat_to_sats", - namespace="utils.currencies", - name="Convert fiat to sats", - host_interface="utils-currencies", - host_name="fiat_to_sats", - sdk_name="fiatToSats", - description="Convert a fiat amount to sats.", - required_permission="utils.basic", - require_auth=False, - ) - async def fiat_to_sats(self, request: FiatToSatsRequest) -> FiatToSatsResponse: - - return FiatToSatsResponse( - amount_sat=await fiat_amount_as_satoshis( - request.amount, - request.currency, - ) - ) - - @extension_api_method( - method_id="utils.currencies.sats_to_fiat", - namespace="utils.currencies", - name="Convert sats to fiat", - host_interface="utils-currencies", - host_name="sats_to_fiat", - sdk_name="satsToFiat", - description="Convert a sats amount to fiat.", - required_permission="utils.basic", - require_auth=False, - ) - async def sats_to_fiat(self, request: SatsToFiatRequest) -> SatsToFiatResponse: - - return SatsToFiatResponse( - amount=await satoshis_amount_as_fiat(request.amount, request.currency) - ) - - -class ExtensionServerUtils(_ExtensionAPIUtilsGroup): - @extension_api_method( - method_id="utils.server.health", - namespace="utils.server", - name="Server health", - host_interface="utils-server", - host_name="health", - sdk_name="health", - description="Return basic public LNbits server health data.", - required_permission="utils.basic", - require_auth=False, - ) - async def health(self, request: EmptyRequest) -> ServerHealthResponse: - - return ServerHealthResponse( - server_time=int(time.time()), - up_time=settings.lnbits_server_up_time, - ) - - -class ExtensionLnurlUtils(_ExtensionAPIUtilsGroup): - @extension_api_method( - method_id="utils.lnurl.resolve", - namespace="utils.lnurl", - name="Resolve LNURL-pay", - host_interface="utils-lnurl", - host_name="resolve", - sdk_name="resolve", - description="Resolve a Lightning Address or LNURL-pay request.", - required_permission="wallet.pay_invoice", - require_auth=True, - ) - async def resolve(self, request: LnurlResolveRequest) -> LnurlResolveResponse: - normalized_lnurl = normalize_lnurl(request.lnurl) - response = await lnurl_handle( - normalized_lnurl, - user_agent=settings.user_agent, - timeout=5, - ) - if isinstance(response, LnurlErrorResponse): - raise LnurlResponseException(response.reason) - if not isinstance(response, LnurlPayResponse): - raise LnurlResponseException( - "Invalid LNURL response. Expected LnurlPayResponse." - ) - - min_sendable_msat = lnurl_pay_response_int( - response, "min_sendable", "minSendable" - ) - max_sendable_msat = lnurl_pay_response_int( - response, "max_sendable", "maxSendable" - ) - image = getattr(response, "image", None) - return LnurlResolveResponse( - lnurl=normalized_lnurl, - domain=getattr(response, "domain", None), - description=lnurl_pay_response_text(response), - min_sendable_msat=min_sendable_msat, - max_sendable_msat=max_sendable_msat, - comment_allowed=lnurl_pay_response_int( - response, "comment_allowed", "commentAllowed" - ), - fixed=bool( - getattr( - response, - "fixed", - min_sendable_msat == max_sendable_msat, - ) - ), - image=str(image) if image is not None else None, - metadata_json=lnurl_pay_response_metadata_json(response), - ) - - -class ExtensionLightningUtils(_ExtensionAPIUtilsGroup): - @extension_api_method( - method_id="utils.lightning.decode_invoice", - namespace="utils.lightning", - name="Decode Lightning invoice", - host_interface="utils-lightning", - host_name="decode_invoice", - sdk_name="decodeInvoice", - description="Decode a BOLT11 Lightning invoice.", - required_permission="utils.basic", - require_auth=False, - ) - async def decode_invoice(self, request: Bolt11Request) -> DecodeInvoiceResponse: - invoice = _decode_bolt11(request.bolt11) - return _decoded_invoice_response(invoice) - - @extension_api_method( - method_id="utils.lightning.validate_invoice", - namespace="utils.lightning", - name="Validate Lightning invoice", - host_interface="utils-lightning", - host_name="validate_invoice", - sdk_name="validateInvoice", - description="Validate whether a string is a BOLT11 Lightning invoice.", - required_permission="utils.basic", - require_auth=False, - ) - async def validate_invoice(self, request: Bolt11Request) -> ValidateInvoiceResponse: - try: - _decode_bolt11(request.bolt11) - return ValidateInvoiceResponse(valid=True) - except Exception as exc: - return ValidateInvoiceResponse(valid=False, error=str(exc)) - - @extension_api_method( - method_id="utils.lightning.invoice_payment_hash", - namespace="utils.lightning", - name="Get Lightning invoice payment hash", - host_interface="utils-lightning", - host_name="invoice_payment_hash", - sdk_name="invoicePaymentHash", - description="Get the payment hash from a BOLT11 Lightning invoice.", - required_permission="utils.basic", - require_auth=False, - ) - async def invoice_payment_hash( - self, request: Bolt11Request - ) -> InvoicePaymentHashResponse: - return InvoicePaymentHashResponse( - payment_hash=str(_decode_bolt11(request.bolt11).payment_hash) - ) - - @extension_api_method( - method_id="utils.lightning.invoice_amount_msat", - namespace="utils.lightning", - name="Get Lightning invoice amount", - host_interface="utils-lightning", - host_name="invoice_amount_msat", - sdk_name="invoiceAmountMsat", - description="Get the amount in msat from a BOLT11 Lightning invoice.", - required_permission="utils.basic", - require_auth=False, - ) - async def invoice_amount_msat( - self, request: Bolt11Request - ) -> InvoiceAmountMsatResponse: - return InvoiceAmountMsatResponse( - amount_msat=_invoice_amount_msat(_decode_bolt11(request.bolt11)) - ) - - @extension_api_method( - method_id="utils.lightning.invoice_expiry", - namespace="utils.lightning", - name="Get Lightning invoice expiry", - host_interface="utils-lightning", - host_name="invoice_expiry", - sdk_name="invoiceExpiry", - description="Get the expiry timestamp from a BOLT11 Lightning invoice.", - required_permission="utils.basic", - require_auth=False, - ) - async def invoice_expiry(self, request: Bolt11Request) -> InvoiceExpiryResponse: - return InvoiceExpiryResponse( - expires_at=_invoice_expires_at(_decode_bolt11(request.bolt11)) - ) - - @extension_api_method( - method_id="utils.lightning.invoice_memo", - namespace="utils.lightning", - name="Get Lightning invoice memo", - host_interface="utils-lightning", - host_name="invoice_memo", - sdk_name="invoiceMemo", - description="Get the memo from a BOLT11 Lightning invoice.", - required_permission="utils.basic", - require_auth=False, - ) - async def invoice_memo(self, request: Bolt11Request) -> InvoiceMemoResponse: - return InvoiceMemoResponse(memo=_invoice_memo(_decode_bolt11(request.bolt11))) - - @extension_api_method( - method_id="utils.lightning.verify_preimage", - namespace="utils.lightning", - name="Verify Lightning preimage", - host_interface="utils-lightning", - host_name="verify_preimage", - sdk_name="verifyPreimage", - description="Verify that a preimage matches a payment hash.", - required_permission="utils.basic", - require_auth=False, - ) - async def verify_preimage( - self, request: VerifyPreimageRequest - ) -> VerifyPreimageResponse: - - return VerifyPreimageResponse( - valid=verify_preimage(request.preimage, request.payment_hash) - ) - - @extension_api_method( - method_id="utils.lightning.random_secret_and_hash", - namespace="utils.lightning", - name="Random Lightning secret and hash", - host_interface="utils-lightning", - host_name="random_secret_and_hash", - sdk_name="randomSecretAndHash", - description="Create a random secret and matching SHA256 hash.", - required_permission="utils.basic", - require_auth=False, - ) - async def random_secret_and_hash( - self, request: RandomSecretAndHashRequest - ) -> RandomSecretAndHashResponse: - - secret, payment_hash = random_secret_and_hash(request.length) - return RandomSecretAndHashResponse(secret=secret, hash=payment_hash) - - -def extension_api_utils_method_classes() -> dict[str, type[_ExtensionAPIUtilsGroup]]: - return { - "utils.currencies": ExtensionCurrencyUtils, - "utils.server": ExtensionServerUtils, - "utils.lnurl": ExtensionLnurlUtils, - "utils.lightning": ExtensionLightningUtils, - } - - -def _decode_bolt11(payment_request: str) -> Any: - - return bolt11.decode(payment_request) - - -def _decoded_invoice_response(invoice: Any) -> DecodeInvoiceResponse: - return DecodeInvoiceResponse( - payment_hash=str(getattr(invoice, "payment_hash", "")) or None, - amount_msat=_invoice_amount_msat(invoice), - expiry=_invoice_expiry(invoice), - expires_at=_invoice_expires_at(invoice), - memo=_invoice_memo(invoice), - ) - - -def _invoice_amount_msat(invoice: Any) -> int | None: - amount_msat = getattr(invoice, "amount_msat", None) - if amount_msat is None: - return None - return int(amount_msat) - - -def _invoice_expiry(invoice: Any) -> int | None: - expiry = getattr(invoice, "expiry", None) - if expiry is None: - return None - return int(expiry) - - -def _invoice_expires_at(invoice: Any) -> int | None: - expiry_date = getattr(invoice, "expiry_date", None) - if isinstance(expiry_date, datetime): - return int(expiry_date.timestamp()) - - date = getattr(invoice, "date", None) - expiry = getattr(invoice, "expiry", None) - if isinstance(date, datetime) and expiry is not None: - return int(date.timestamp() + int(expiry)) - if isinstance(date, (int, float)) and expiry is not None: - return int(date + int(expiry)) - return None - - -def _invoice_memo(invoice: Any) -> str | None: - memo = getattr(invoice, "description", None) - return str(memo) if memo is not None else None diff --git a/lnbits/core/wasm_ext/api/websockets.py b/lnbits/core/wasm_ext/api/websockets.py deleted file mode 100644 index a53c9943c..000000000 --- a/lnbits/core/wasm_ext/api/websockets.py +++ /dev/null @@ -1,176 +0,0 @@ -from __future__ import annotations - -import re -import time -from collections import deque -from dataclasses import dataclass - -from fastapi import WebSocket, WebSocketDisconnect -from loguru import logger - -from lnbits.settings import settings - -_EXTENSION_ID_RE = re.compile(r"^[A-Za-z0-9_-]{1,128}$") -_LOCAL_ITEM_ID_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9:_-]{0,127}$") -WEBSOCKET_PUBLISH_MAX_MESSAGES_PER_SECOND_LIMIT = 100 -WEBSOCKET_CLIENT_MAX_MESSAGES_PER_SECOND = 60 -WEBSOCKET_CLIENT_MAX_MESSAGE_BYTES = 8192 - - -@dataclass -class WasmExtensionWebsocketConnection: - extension_id: str - item_id: str - websocket: WebSocket - - -class WasmExtensionWebsocketRateLimitError(PermissionError): - pass - - -def scoped_websocket_item_id(extension_id: str, item_id: str) -> str: - if not _EXTENSION_ID_RE.fullmatch(extension_id): - raise ValueError("Extension websocket namespace is invalid.") - if not _LOCAL_ITEM_ID_RE.fullmatch(item_id): - raise ValueError( - "Extension websocket item ID must be 1-128 characters and contain " - "only letters, numbers, colon, underscore, or dash." - ) - return f"ext:{extension_id}:{item_id}" - - -class WasmExtensionWebsocketHub: - def __init__(self) -> None: - self.active_connections: list[WasmExtensionWebsocketConnection] = [] - self.publish_timestamps: dict[tuple[str, str], deque[float]] = {} - self.client_timestamps: dict[int, deque[float]] = {} - - async def connect( - self, extension_id: str, item_id: str, websocket: WebSocket - ) -> WasmExtensionWebsocketConnection: - scoped_websocket_item_id(extension_id, item_id) - logger.debug(f"WASM websocket connected to {extension_id}:{item_id}") - await websocket.accept() - conn = WasmExtensionWebsocketConnection( - extension_id=extension_id, - item_id=item_id, - websocket=websocket, - ) - self.active_connections.append(conn) - return conn - - async def listen(self, conn: WasmExtensionWebsocketConnection) -> None: - while settings.lnbits_running: - try: - data = await conn.websocket.receive_text() - if len(data.encode()) > WEBSOCKET_CLIENT_MAX_MESSAGE_BYTES: - await conn.websocket.close(code=1009) - self.disconnect(conn) - break - self._check_client_rate(conn) - await self._broadcast_client_message(conn, data) - except WebSocketDisconnect: - self.disconnect(conn) - break - except WasmExtensionWebsocketRateLimitError: - await conn.websocket.close(code=1008) - self.disconnect(conn) - break - - def disconnect(self, conn: WasmExtensionWebsocketConnection) -> None: - self.active_connections = [ - active_conn - for active_conn in self.active_connections - if active_conn.websocket != conn.websocket - ] - self.client_timestamps.pop(id(conn.websocket), None) - logger.debug( - f"WASM websocket disconnected from {conn.extension_id}:{conn.item_id}" - ) - - def get_connections( - self, extension_id: str, item_id: str - ) -> list[WasmExtensionWebsocketConnection]: - return [ - conn - for conn in self.active_connections - if conn.extension_id == extension_id and conn.item_id == item_id - ] - - async def publish( - self, - extension_id: str, - item_id: str, - data: str, - *, - max_messages_per_second: int, - ) -> None: - scoped_websocket_item_id(extension_id, item_id) - self._check_publish_rate( - extension_id, - item_id, - max_messages_per_second=max_messages_per_second, - ) - for conn in self.get_connections(extension_id, item_id): - await self._send_to_connection(conn, data) - - def _check_publish_rate( - self, - extension_id: str, - item_id: str, - *, - max_messages_per_second: int, - ) -> None: - if ( - isinstance(max_messages_per_second, bool) - or not isinstance(max_messages_per_second, int) - or max_messages_per_second <= 0 - or max_messages_per_second > WEBSOCKET_PUBLISH_MAX_MESSAGES_PER_SECOND_LIMIT - ): - raise ValueError("Invalid websocket publish rate limit.") - - now = time.monotonic() - channel = (extension_id, item_id) - timestamps = self.publish_timestamps.setdefault(channel, deque()) - while timestamps and now - timestamps[0] >= 1: - timestamps.popleft() - if len(timestamps) >= max_messages_per_second: - raise WasmExtensionWebsocketRateLimitError( - "WASM websocket publish rate limit exceeded." - ) - timestamps.append(now) - - def _check_client_rate(self, conn: WasmExtensionWebsocketConnection) -> None: - now = time.monotonic() - key = id(conn.websocket) - timestamps = self.client_timestamps.setdefault(key, deque()) - while timestamps and now - timestamps[0] >= 1: - timestamps.popleft() - if len(timestamps) >= WEBSOCKET_CLIENT_MAX_MESSAGES_PER_SECOND: - raise WasmExtensionWebsocketRateLimitError( - "WASM websocket client rate limit exceeded." - ) - timestamps.append(now) - - async def _broadcast_client_message( - self, - conn: WasmExtensionWebsocketConnection, - data: str, - ) -> None: - for active_conn in self.get_connections(conn.extension_id, conn.item_id): - if active_conn.websocket == conn.websocket: - continue - await self._send_to_connection(active_conn, data) - - async def _send_to_connection( - self, - conn: WasmExtensionWebsocketConnection, - data: str, - ) -> None: - try: - await conn.websocket.send_text(data) - except (RuntimeError, WebSocketDisconnect): - self.disconnect(conn) - - -wasm_extension_websocket_hub = WasmExtensionWebsocketHub() diff --git a/lnbits/core/wasm_ext/client/__init__.py b/lnbits/core/wasm_ext/client/__init__.py deleted file mode 100644 index 42d836d84..000000000 --- a/lnbits/core/wasm_ext/client/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .extensions import send_extension_api_request -from .http import send_extension_http_request - -__all__ = ["send_extension_api_request", "send_extension_http_request"] diff --git a/lnbits/core/wasm_ext/client/extensions.py b/lnbits/core/wasm_ext/client/extensions.py deleted file mode 100644 index b40484f14..000000000 --- a/lnbits/core/wasm_ext/client/extensions.py +++ /dev/null @@ -1,219 +0,0 @@ -from __future__ import annotations - -import posixpath -import re -from typing import Any -from urllib.parse import unquote, urlsplit, urlunsplit - -import httpx - -from lnbits.core.crud.extensions import ( - get_installed_extension, - get_user_active_extensions_ids, -) -from lnbits.settings import settings - -from ..api.models import ExtensionApiRequest, HttpResponse - -EXTENSION_API_TIMEOUT_SECONDS = 10.0 -EXTENSION_API_MAX_RESPONSE_BYTES = 262_144 - -_READ_METHODS = {"GET", "HEAD"} -_WRITE_METHODS = {"DELETE", "PATCH", "POST", "PUT"} -_EXTENSION_ID_RE = re.compile(r"^[A-Za-z0-9_-]+$") -_FORBIDDEN_RESPONSE_HEADERS = { - "connection", - "content-length", - "set-cookie", - "transfer-encoding", -} - - -async def send_extension_api_request( - caller_extension_id: str, - policies: list[Any], - user_id: str | None, - access_token: str | None, - request: ExtensionApiRequest, - *, - timeout_ms: int | None = None, - max_response_bytes: int | None = None, -) -> HttpResponse: - if not user_id: - raise PermissionError("Extension API requests require authentication.") - if not access_token: - raise PermissionError("Extension API requests require an account access token.") - - target_extension_id = _target_extension_id(request.extension_id) - access = _target_extension_access(policies, target_extension_id) - _require_method_access(caller_extension_id, target_extension_id, access, request) - await _require_enabled_extension(target_extension_id, user_id) - - path = _extension_api_path(request.path) - body = request.body.encode() if request.body is not None else b"" - if len(body) > 65_536: - raise ValueError("Extension API request body is too large.") - - url = f"http://{settings.host}:{settings.port}/{target_extension_id}{path}" - try: - async with httpx.AsyncClient( - follow_redirects=False, - timeout=_timeout_seconds(timeout_ms, EXTENSION_API_TIMEOUT_SECONDS), - trust_env=False, - ) as client: - async with client.stream( - request.method, - url, - headers={"Authorization": f"Bearer {access_token}"}, - content=body, - ) as response: - response_body = await _read_limited_response( - response, - max_response_bytes=max_response_bytes, - ) - return HttpResponse( - status_code=response.status_code, - headers=_response_headers(dict(response.headers)), - body=response_body.decode(response.encoding or "utf-8", "replace"), - ) - except httpx.RequestError as exc: - raise ValueError("Extension API request failed.") from exc - - -def _target_extension_id(extension_id: str) -> str: - target = extension_id.strip() - if not target or not _EXTENSION_ID_RE.match(target): - raise PermissionError("Extension API request has an invalid target extension.") - return target - - -def _target_extension_access(policies: list[Any], target_extension_id: str) -> set[str]: - if not isinstance(policies, list) or not policies: - raise PermissionError( - "Extension API requests require a non-empty extensions policy." - ) - - for extension in policies: - if isinstance(extension, str): - extension_id = extension - access = ["read"] - elif isinstance(extension, dict): - raw_extension_id = extension.get("id") - raw_access = extension.get("access") - if not isinstance(raw_extension_id, str): - continue - if not isinstance(raw_access, list): - raise PermissionError( - f"Extension API target '{target_extension_id}' " - "has no access policy." - ) - extension_id = raw_extension_id - access = raw_access - else: - continue - - if extension_id != target_extension_id: - continue - clean_access = { - item - for item in access - if isinstance(item, str) and item in {"read", "write"} - } - if clean_access: - return clean_access - break - - raise PermissionError( - f"Extension API target '{target_extension_id}' is not allowed." - ) - - -def _require_method_access( - caller_extension_id: str, - target_extension_id: str, - access: set[str], - request: ExtensionApiRequest, -) -> None: - if request.method in _READ_METHODS: - required_access = "read" - elif request.method in _WRITE_METHODS: - required_access = "write" - else: - raise PermissionError("Extension API request method is not allowed.") - - if required_access not in access: - raise PermissionError( - f"Extension '{caller_extension_id}' cannot {required_access} " - f"extension '{target_extension_id}'." - ) - - -async def _require_enabled_extension(target_extension_id: str, user_id: str) -> None: - extension = await get_installed_extension(target_extension_id) - if not extension or not extension.active: - raise PermissionError( - f"Target extension '{target_extension_id}' is not installed or enabled." - ) - - active_extensions = await get_user_active_extensions_ids(user_id) - if target_extension_id not in active_extensions: - raise PermissionError( - f"Target extension '{target_extension_id}' is not active for this user." - ) - - -def _extension_api_path(path: str) -> str: - parts = urlsplit(path) - if parts.scheme or parts.netloc: - raise PermissionError("Extension API request path must be relative.") - if parts.fragment: - raise PermissionError("Extension API request path cannot include a fragment.") - if not parts.path.startswith("/api/"): - raise PermissionError("Extension API request path must start with '/api/'.") - - decoded_path = unquote(parts.path) - path_parts = decoded_path.split("/") - if any(part == ".." for part in path_parts): - raise PermissionError("Extension API request path cannot traverse directories.") - - normalized = posixpath.normpath(decoded_path) - if normalized != decoded_path.rstrip("/") or not normalized.startswith("/api/"): - raise PermissionError("Extension API request path is invalid.") - - return urlunsplit(("", "", parts.path, parts.query, "")) - - -async def _read_limited_response( - response: httpx.Response, - *, - max_response_bytes: int | None = None, -) -> bytes: - limit = ( - EXTENSION_API_MAX_RESPONSE_BYTES - if max_response_bytes is None - else max_response_bytes - ) - chunks: list[bytes] = [] - size = 0 - async for chunk in response.aiter_bytes(): - size += len(chunk) - if limit > 0 and size > limit: - raise ValueError("Extension API response is too large.") - chunks.append(chunk) - return b"".join(chunks) - - -def _timeout_seconds(timeout_ms: int | None, default: float) -> float | None: - if timeout_ms is None: - return default - if timeout_ms <= 0: - return None - return timeout_ms / 1000 - - -def _response_headers(headers: dict[str, str]) -> dict[str, str]: - return { - key: value - for key, value in headers.items() - if key.lower() not in _FORBIDDEN_RESPONSE_HEADERS - } diff --git a/lnbits/core/wasm_ext/client/http.py b/lnbits/core/wasm_ext/client/http.py deleted file mode 100644 index e3876d9b6..000000000 --- a/lnbits/core/wasm_ext/client/http.py +++ /dev/null @@ -1,204 +0,0 @@ -from __future__ import annotations - -import ipaddress -import socket -from typing import Any -from urllib.parse import urlparse - -import httpx - -from ..api.models import HttpRequest, HttpResponse - -HTTP_REQUEST_TIMEOUT_SECONDS = 10.0 -HTTP_MAX_RESPONSE_BYTES = 262_144 - -_FORBIDDEN_REQUEST_HEADERS = { - "connection", - "content-length", - "cookie", - "host", - "proxy-authorization", - "transfer-encoding", -} -_FORBIDDEN_RESPONSE_HEADERS = { - "connection", - "content-length", - "set-cookie", - "transfer-encoding", -} - - -async def send_extension_http_request( - extension_id: str, - policies: list[Any], - request: HttpRequest, - *, - timeout_ms: int | None = None, - max_response_bytes: int | None = None, -) -> HttpResponse: - allowed_origins = _allowed_origins(policies) - origin = _request_origin(request.url) - if origin not in allowed_origins: - raise PermissionError( - f"Extension '{extension_id}' is not allowed to request '{origin}'." - ) - - await _reject_internal_host(request.url) - headers = _request_headers(request.headers) - body = request.body.encode() if request.body is not None else b"" - if len(body) > 65_536: - raise ValueError("HTTP request body is too large.") - - try: - async with httpx.AsyncClient( - follow_redirects=False, - timeout=_timeout_seconds(timeout_ms, HTTP_REQUEST_TIMEOUT_SECONDS), - trust_env=False, - ) as client: - async with client.stream( - request.method, - request.url, - headers=headers, - content=body, - ) as response: - response_body = await _read_limited_response( - response, - max_response_bytes=max_response_bytes, - ) - return HttpResponse( - status_code=response.status_code, - headers=_response_headers(dict(response.headers)), - body=response_body.decode(response.encoding or "utf-8", "replace"), - ) - except httpx.RequestError as exc: - raise ValueError("HTTP request failed.") from exc - - -def _allowed_origins(policies: list[Any]) -> set[str]: - if not isinstance(policies, list) or not policies: - raise PermissionError("HTTP requests require a non-empty hosts policy.") - - origins: set[str] = set() - for policy in policies: - host = policy.get("host") if isinstance(policy, dict) else policy - if not isinstance(host, str) or not host: - continue - origins.add(_request_origin(host)) - if not origins: - raise PermissionError("HTTP requests require at least one valid host.") - return origins - - -def _request_origin(url: str) -> str: - parsed = urlparse(url) - if parsed.scheme != "https": - raise PermissionError("HTTP requests require https URLs.") - if parsed.username or parsed.password: - raise PermissionError("HTTP requests cannot include credentials in URLs.") - if not parsed.hostname: - raise PermissionError("HTTP requests require a hostname.") - - hostname = parsed.hostname.lower() - port = _url_port(parsed) - if port is None or port == 443: - return f"https://{hostname}" - return f"https://{hostname}:{port}" - - -def _url_port(parsed: Any) -> int | None: - try: - return parsed.port - except ValueError as exc: - raise PermissionError("HTTP request URL has an invalid port.") from exc - - -async def _reject_internal_host(url: str) -> None: - parsed = urlparse(url) - hostname = parsed.hostname - if not hostname: - raise PermissionError("HTTP requests require a hostname.") - if hostname == "localhost" or hostname.endswith(".localhost"): - raise PermissionError("HTTP requests cannot target localhost.") - - try: - address = ipaddress.ip_address(hostname) - _reject_internal_address(address) - return - except ValueError: - pass - - for address in await _resolve_host(hostname): - _reject_internal_address(address) - - -async def _resolve_host( - hostname: str, -) -> list[ipaddress.IPv4Address | ipaddress.IPv6Address]: - import asyncio - - def resolve() -> list[ipaddress.IPv4Address | ipaddress.IPv6Address]: - try: - infos = socket.getaddrinfo(hostname, None, type=socket.SOCK_STREAM) - except socket.gaierror as exc: - raise PermissionError("HTTP request host could not be resolved.") from exc - - addresses: list[ipaddress.IPv4Address | ipaddress.IPv6Address] = [] - for info in infos: - sockaddr = info[4] - addresses.append(ipaddress.ip_address(sockaddr[0])) - return addresses - - return await asyncio.to_thread(resolve) - - -def _reject_internal_address( - address: ipaddress.IPv4Address | ipaddress.IPv6Address, -) -> None: - if not address.is_global: - raise PermissionError("HTTP requests cannot target internal network addresses.") - - -def _request_headers(headers: dict[str, str]) -> dict[str, str]: - clean: dict[str, str] = {} - for key, value in headers.items(): - header = key.strip() - if not header: - continue - if header.lower() in _FORBIDDEN_REQUEST_HEADERS: - continue - clean[header] = value - return clean - - -async def _read_limited_response( - response: httpx.Response, - *, - max_response_bytes: int | None = None, -) -> bytes: - limit = ( - HTTP_MAX_RESPONSE_BYTES if max_response_bytes is None else max_response_bytes - ) - chunks: list[bytes] = [] - size = 0 - async for chunk in response.aiter_bytes(): - size += len(chunk) - if limit > 0 and size > limit: - raise ValueError("HTTP response is too large.") - chunks.append(chunk) - return b"".join(chunks) - - -def _timeout_seconds(timeout_ms: int | None, default: float) -> float | None: - if timeout_ms is None: - return default - if timeout_ms <= 0: - return None - return timeout_ms / 1000 - - -def _response_headers(headers: dict[str, str]) -> dict[str, str]: - return { - key: value - for key, value in headers.items() - if key.lower() not in _FORBIDDEN_RESPONSE_HEADERS - } diff --git a/lnbits/core/wasm_ext/routes/__init__.py b/lnbits/core/wasm_ext/routes/__init__.py deleted file mode 100644 index c2b8497dd..000000000 --- a/lnbits/core/wasm_ext/routes/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .register import register_wasm_extension, unregister_wasm_extension - -__all__ = ["register_wasm_extension", "unregister_wasm_extension"] diff --git a/lnbits/core/wasm_ext/routes/api.py b/lnbits/core/wasm_ext/routes/api.py deleted file mode 100644 index df695e9ec..000000000 --- a/lnbits/core/wasm_ext/routes/api.py +++ /dev/null @@ -1,396 +0,0 @@ -from __future__ import annotations - -import json -import re -from dataclasses import dataclass -from typing import Annotated, Any - -from fastapi import Depends, FastAPI, HTTPException, Request - -from lnbits.core.models import Account -from lnbits.core.services.extensions import get_wasm_runtime_limits_for_extension -from lnbits.core.wasm_ext.storage.crud import storage_get_row_owner_id -from lnbits.decorators import check_access_token, check_account_exists -from lnbits.settings import settings - -from ..wasm.config import WasmAPIRouteConfig -from ..wasm.invoke import invoke_wasm_extension_export -from ..wasm.loader import WasmExtension -from .open_api import wasm_extension_api_openapi_metadata, wasm_extension_api_tag - -_WASM_EXTENSION_API_METHODS = {"GET", "POST", "PUT", "PATCH", "DELETE"} - - -class WasmRequestBodyTooLargeError(ValueError): - pass - - -@dataclass(frozen=True) -class WasmRoutePayload: - data: dict[str, Any] - request_bytes: int | None - - -@dataclass(frozen=True) -class WasmAPIRouteRegistration: - route_config: WasmAPIRouteConfig - method: str - route_path: str - export_name: str - path_params: dict[str, str] - auth: str - route_name: str - - -def register_wasm_extension_api_routes(app: FastAPI, extension: WasmExtension) -> None: - route_registrations = [ - _wasm_extension_api_route_registration(extension, route_config) - for route_config in extension.config.api_routes - ] - - openapi_schema_changed = _remove_wasm_extension_api_routes(app, extension.id) - for route_registration in route_registrations: - if _add_wasm_extension_api_route(app, extension, route_registration): - openapi_schema_changed = True - if openapi_schema_changed: - app.openapi_schema = None - - -def unregister_wasm_extension_api_routes(app: FastAPI, ext_id: str) -> bool: - openapi_schema_changed = _remove_wasm_extension_api_routes(app, ext_id) - if openapi_schema_changed: - app.openapi_schema = None - return openapi_schema_changed - - -def _add_wasm_extension_api_route( - app: FastAPI, - extension: WasmExtension, - route_registration: WasmAPIRouteRegistration, -) -> bool: - method = route_registration.method - route_path = route_registration.route_path - export_name = route_registration.export_name - path_params = route_registration.path_params - auth = route_registration.auth - route_name = route_registration.route_name - route_config = route_registration.route_config - openapi = wasm_extension_api_openapi_metadata(extension, route_config, method) - - if not _prepare_wasm_extension_api_route(app, route_path, method, route_name): - return False - - async def invoke_wasm_api_request( - request: Request, - account: Account | None = None, - access_token: str | None = None, - ) -> dict[str, Any]: - try: - limits = await get_wasm_runtime_limits_for_extension(extension.id) - payload = await _read_api_payload( - request, - path_params, - max_body_bytes=limits["wasm_runtime_max_request_bytes"], - ) - owner_id = await _wasm_route_owner_id(extension, route_config, payload) - return await invoke_wasm_extension_export( - extension.id, - export_name, - payload.data, - user=account, - access_token=access_token, - context="event" if owner_id else "user", - owner_id=owner_id, - trigger_type="http", - method=request.method, - path=request.url.path, - request_id=request.headers.get("x-request-id"), - request_bytes=payload.request_bytes, - context_data={"origin": _request_origin(request)}, - ) - except WasmRequestBodyTooLargeError as exc: - raise HTTPException(status_code=413, detail=str(exc)) from exc - except KeyError as exc: - raise HTTPException(status_code=404, detail=str(exc)) from exc - except PermissionError as exc: - raise HTTPException(status_code=403, detail=str(exc)) from exc - except (TypeError, ValueError) as exc: - raise HTTPException(status_code=400, detail=str(exc)) from exc - - async def invoke_private_wasm_extension_export( - request: Request, - access_token: Annotated[str | None, Depends(check_access_token)], - account: Account = Depends(check_account_exists), - ) -> dict[str, Any]: - return await invoke_wasm_api_request(request, account, access_token) - - async def invoke_public_wasm_extension_export(request: Request) -> dict[str, Any]: - return await invoke_wasm_api_request(request) - - app.add_api_route( - route_path, - ( - invoke_public_wasm_extension_export - if auth == "public" - else invoke_private_wasm_extension_export - ), - methods=[method], - name=route_name, - tags=[wasm_extension_api_tag(extension)], - summary=openapi.summary, - description=openapi.description, - operation_id=openapi.operation_id, - openapi_extra=openapi.openapi_extra, - include_in_schema=True, - ) - return True - - -async def _read_api_payload( - request: Request, - path_params: dict[str, str], - *, - max_body_bytes: int, -) -> WasmRoutePayload: - payload = _read_api_path_params(request, path_params) - payload.update(_read_api_query_params(request)) - request_bytes: int | None = None - if request.method in {"POST", "PUT", "PATCH"}: - body, request_bytes = await _read_json_object_with_size( - request, - max_body_bytes=max_body_bytes, - ) - payload.update(body) - return WasmRoutePayload(payload, request_bytes) - - -async def _wasm_route_owner_id( - extension: WasmExtension, - route_config: WasmAPIRouteConfig, - payload: WasmRoutePayload, -) -> str | None: - owner_context = route_config.owner_context - if not owner_context: - return None - source_id = payload.data.get(owner_context.id_param) - if not isinstance(source_id, str) or not source_id: - raise PermissionError("WASM owner-context route source is missing.") - owner_id = await storage_get_row_owner_id( - extension.id, - owner_context.table, - source_id, - ) - if not owner_id: - raise PermissionError("WASM owner-context route source was not found.") - return owner_id - - -async def _read_json_object( - request: Request, - *, - max_body_bytes: int | None = None, -) -> dict[str, Any]: - body, _ = await _read_json_object_with_size( - request, - max_body_bytes=( - settings.wasm_runtime_max_request_bytes - if max_body_bytes is None - else max_body_bytes - ), - ) - return body - - -async def _read_json_object_with_size( - request: Request, - *, - max_body_bytes: int, -) -> tuple[dict[str, Any], int]: - body = await _read_limited_body(request, max_body_bytes=max_body_bytes) - if not body: - return {}, 0 - value = json.loads(body) - if not isinstance(value, dict): - raise TypeError("WASM extension API payload must be a JSON object.") - return value, len(body) - - -async def _read_limited_body(request: Request, *, max_body_bytes: int) -> bytes: - content_length = _request_content_length(request) - if _wasm_request_too_large(content_length, max_body_bytes): - raise WasmRequestBodyTooLargeError( - f"WASM extension request is too large: {content_length} bytes." - ) - - chunks: list[bytes] = [] - size = 0 - async for chunk in request.stream(): - if not chunk: - continue - size += len(chunk) - if _wasm_request_too_large(size, max_body_bytes): - raise WasmRequestBodyTooLargeError( - f"WASM extension request is too large: {size} bytes." - ) - chunks.append(chunk) - return b"".join(chunks) - - -def _read_api_path_params( - request: Request, - path_params: dict[str, str], -) -> dict[str, Any]: - payload: dict[str, Any] = {} - for key, value in request.path_params.items(): - target = path_params.get(key) or _snake_to_camel(key) - payload[target] = value - return payload - - -def _read_api_query_params(request: Request) -> dict[str, Any]: - return {_snake_to_camel(key): value for key, value in request.query_params.items()} - - -def _request_content_length(request: Request) -> int | None: - content_length = request.headers.get("content-length") - if content_length and content_length.isdigit(): - return int(content_length) - return None - - -def _wasm_request_too_large(size: int | None, max_body_bytes: int) -> bool: - return size is not None and max_body_bytes > 0 and size > max_body_bytes - - -def _request_origin(request: Request) -> str | None: - origin = request.headers.get("origin") - if not origin: - return None - return origin[:256] - - -def _wasm_extension_api_export(extension: WasmExtension, export_name: Any) -> str: - if not isinstance(export_name, str) or not export_name: - raise ValueError(f"Invalid API export for WASM extension '{extension.id}'.") - - for export in extension.exports: - if export.name != export_name: - continue - if export.visibility in {"public", "authenticated"}: - return export_name - raise PermissionError(f"WASM export '{export_name}' is not callable over HTTP.") - raise KeyError(f"WASM extension '{extension.id}' has no export '{export_name}'.") - - -def _wasm_extension_api_method(extension: WasmExtension, method: Any) -> str: - if not isinstance(method, str): - raise ValueError(f"Invalid API method for WASM extension '{extension.id}'.") - method = method.upper() - if method not in _WASM_EXTENSION_API_METHODS: - raise ValueError(f"Unsupported API method for WASM extension '{extension.id}'.") - return method - - -def _wasm_extension_api_path(extension: WasmExtension, path: Any) -> str: - if not isinstance(path, str) or not path.startswith("/"): - raise ValueError(f"Invalid API path for WASM extension '{extension.id}'.") - if path == "/": - return f"/api/v1/ext/{extension.id}" - return f"/api/v1/ext/{extension.id}{path}" - - -def _wasm_extension_route_auth(extension: WasmExtension, auth: Any) -> str: - if auth in {"public", "user"}: - return auth - raise ValueError(f"Invalid route auth for WASM extension '{extension.id}'.") - - -def _has_route(app: FastAPI, route_path: str, method: str) -> bool: - for route in app.routes: - if getattr(route, "path", None) != route_path: - continue - methods = getattr(route, "methods", set()) or set() - if method in methods: - return True - return False - - -def _wasm_extension_api_route_registration( - extension: WasmExtension, - route_config: WasmAPIRouteConfig, -) -> WasmAPIRouteRegistration: - method = _wasm_extension_api_method(extension, route_config.method) - route_path = _wasm_extension_api_path(extension, route_config.path) - return WasmAPIRouteRegistration( - route_config=route_config, - method=method, - route_path=route_path, - export_name=_wasm_extension_api_export(extension, route_config.export), - path_params=route_config.path_params, - auth=_wasm_extension_route_auth(extension, route_config.auth), - route_name=_wasm_extension_api_route_name(extension.id, method, route_path), - ) - - -def _remove_wasm_extension_api_routes(app: FastAPI, ext_id: str) -> bool: - removed = False - for route in list(app.router.routes): - if not _is_wasm_extension_api_route(route, ext_id): - continue - app.router.routes.remove(route) - removed = True - return removed - - -def _is_wasm_extension_api_route(route: Any, ext_id: str) -> bool: - route_name = getattr(route, "name", None) - if not isinstance(route_name, str) or not route_name.startswith(f"{ext_id}:"): - return False - route_name_parts = route_name.split(":", 2) - if len(route_name_parts) != 3: - return False - _, route_method, named_route_path = route_name_parts - if route_method not in _WASM_EXTENSION_API_METHODS: - return False - - route_path = getattr(route, "path", None) - if not isinstance(route_path, str): - return False - - route_prefix = f"/api/v1/ext/{ext_id}" - if route_path != route_prefix and not route_path.startswith(f"{route_prefix}/"): - return False - return named_route_path == route_path - - -def _prepare_wasm_extension_api_route( - app: FastAPI, - route_path: str, - method: str, - route_name: str, -) -> bool: - for route in list(app.router.routes): - if getattr(route, "path", None) != route_path: - continue - methods = getattr(route, "methods", set()) or set() - if method not in methods: - continue - if getattr(route, "name", None) != route_name: - return False - app.router.routes.remove(route) - return True - return True - - -def _wasm_extension_api_route_name(ext_id: str, method: str, route_path: str) -> str: - return f"{ext_id}:{method}:{route_path}" - - -def _snake_to_camel(value: str) -> str: - head, *tail = value.split("_") - return head + "".join(part.capitalize() for part in tail) - - -def _path_template_pattern(path: str) -> str: - pattern = re.sub(r"\\{[^/{}]+\\}", r"[^/]+", re.escape(path)) - return f"^{pattern}$" diff --git a/lnbits/core/wasm_ext/routes/assets.py b/lnbits/core/wasm_ext/routes/assets.py deleted file mode 100644 index 709786718..000000000 --- a/lnbits/core/wasm_ext/routes/assets.py +++ /dev/null @@ -1,140 +0,0 @@ -from __future__ import annotations - -import os -from pathlib import Path - -from fastapi import FastAPI, HTTPException -from fastapi.responses import FileResponse, Response -from fastapi.staticfiles import StaticFiles -from starlette.staticfiles import PathLike as StaticFilesPathLike -from starlette.types import Scope - -from lnbits.settings import settings - -from ..wasm.loader import WasmExtension - -WASM_EXTENSION_CORE_ASSET_PREFIX = "_lnbits" -WASM_EXTENSION_CORE_STATIC_ASSETS = { - "bundle.min.css": ("static/bundle.min.css", "text/css; charset=utf-8"), - "material-icons-v50.woff2": ( - "static/fonts/material-icons-v50.woff2", - "font/woff2", - ), - "quasar.css": ("static/vendor/quasar.css", "text/css; charset=utf-8"), - "quasar.umd.prod.js": ( - "static/vendor/quasar.umd.prod.js", - "text/javascript; charset=utf-8", - ), - "qrcode.vue.browser.js": ( - "static/vendor/qrcode.vue.browser.js", - "text/javascript; charset=utf-8", - ), - "vue.global.prod.js": ( - "static/vendor/vue.global.prod.js", - "text/javascript; charset=utf-8", - ), -} -WASM_EXTENSION_GENERATED_CORE_ASSETS = { - "material-icons.css": ( - """ - @font-face { - font-family: 'Material Icons'; - font-style: normal; - font-weight: 400; - src: url('./material-icons-v50.woff2') format('woff2'); - } - """, - "text/css; charset=utf-8", - ) -} -WASM_EXTENSION_STATIC_MIME_TYPES = { - ".css": "text/css; charset=utf-8", - ".gif": "image/gif", - ".ico": "image/x-icon", - ".jpeg": "image/jpeg", - ".jpg": "image/jpeg", - ".js": "text/javascript; charset=utf-8", - ".ogg": "audio/ogg", - ".png": "image/png", - ".webp": "image/webp", - ".woff": "font/woff", - ".woff2": "font/woff2", -} -WASM_EXTENSION_TEXT_STATIC_EXTENSIONS = {".css", ".js"} -WASM_EXTENSION_HTML_PREFIXES = (b" Response: - if path.startswith(f"{WASM_EXTENSION_CORE_ASSET_PREFIX}/"): - return _wasm_extension_core_asset_response(path) - if Path(path).suffix.lower() not in WASM_EXTENSION_STATIC_MIME_TYPES: - raise HTTPException(status_code=404) - return await super().get_response(path, scope) - - def file_response( - self, - full_path: StaticFilesPathLike, - stat_result: os.stat_result, - scope: Scope, - status_code: int = 200, - ) -> Response: - suffix = Path(full_path).suffix.lower() - if suffix in WASM_EXTENSION_TEXT_STATIC_EXTENSIONS: - _reject_html_like_wasm_static_asset(Path(full_path)) - - response = super().file_response(full_path, stat_result, scope, status_code) - response.headers["Content-Type"] = WASM_EXTENSION_STATIC_MIME_TYPES[suffix] - response.headers["X-Content-Type-Options"] = "nosniff" - response.headers["Cache-Control"] = "no-store" - return response - - -def mount_wasm_extension_static(app: FastAPI, extension: WasmExtension) -> None: - static_path = extension.root_path / "static" - - mount_path = f"/ext-assets/{extension.id}" - if any(getattr(route, "path", None) == mount_path for route in app.routes): - return - - app.mount( - mount_path, - GuardedWasmExtensionStaticFiles(directory=static_path, check_dir=False), - name=f"{extension.id}-static", - ) - - -def _reject_html_like_wasm_static_asset(path: Path) -> None: - with path.open("rb") as asset_file: - prefix = asset_file.read(512).lstrip().lower() - if prefix.startswith(WASM_EXTENSION_HTML_PREFIXES): - raise HTTPException(status_code=404) - - -def _wasm_extension_core_asset_response(path: str) -> Response: - asset_name = path.removeprefix(f"{WASM_EXTENSION_CORE_ASSET_PREFIX}/") - if not asset_name or "/" in asset_name or "\\" in asset_name: - raise HTTPException(status_code=404) - - generated_asset = WASM_EXTENSION_GENERATED_CORE_ASSETS.get(asset_name) - if generated_asset: - content, content_type = generated_asset - response = Response(content=content, media_type=content_type) - response.headers["X-Content-Type-Options"] = "nosniff" - response.headers["Cache-Control"] = "no-store" - return response - - asset_config = WASM_EXTENSION_CORE_STATIC_ASSETS.get(asset_name) - if not asset_config: - raise HTTPException(status_code=404) - - relative_path, content_type = asset_config - asset_path = Path(settings.lnbits_path, relative_path) - if not asset_path.is_file(): - raise HTTPException(status_code=404) - - response = FileResponse(asset_path) - response.headers["Content-Type"] = content_type - response.headers["X-Content-Type-Options"] = "nosniff" - response.headers["Cache-Control"] = "no-store" - return response diff --git a/lnbits/core/wasm_ext/routes/open_api.py b/lnbits/core/wasm_ext/routes/open_api.py deleted file mode 100644 index d3c0da8af..000000000 --- a/lnbits/core/wasm_ext/routes/open_api.py +++ /dev/null @@ -1,356 +0,0 @@ -from __future__ import annotations - -import json -import re -from copy import deepcopy -from dataclasses import dataclass -from typing import Any - -from loguru import logger - -from ..wasm.config import WasmAPIRouteConfig -from ..wasm.loader import WasmExtension - - -@dataclass(frozen=True) -class WasmOpenAPIMetadata: - summary: str - description: str | None - operation_id: str - openapi_extra: dict[str, Any] | None - - -_MISSING_OPENAPI_EXAMPLE = object() - - -def wasm_extension_api_tag(extension: WasmExtension) -> str: - return extension.name.strip() or extension.id - - -def wasm_extension_api_openapi_metadata( - extension: WasmExtension, - route_config: WasmAPIRouteConfig, - method: str, -) -> WasmOpenAPIMetadata: - operation = _load_wasm_extension_openapi_operation( - extension, - route_config, - ) - summary = _openapi_string(operation.pop("summary", None)) or ( - f"{method} {route_config.path}" - ) - description = _openapi_string(operation.pop("description", None)) - operation_id = ( - _openapi_string(operation.pop("operationId", None)) - or _openapi_string(operation.pop("operation_id", None)) - or _wasm_extension_default_operation_id(extension, route_config, method) - ) - operation.pop("tags", None) - _add_wasm_openapi_success_examples(operation) - return WasmOpenAPIMetadata( - summary=summary, - description=description, - operation_id=operation_id, - openapi_extra=operation or None, - ) - - -def _load_wasm_extension_openapi_operation( - extension: WasmExtension, - route_config: WasmAPIRouteConfig, -) -> dict[str, Any]: - try: - openapi_refs = _wasm_extension_openapi_refs(extension, route_config) - except Exception as exc: - logger.warning( - f"Ignoring OpenAPI metadata for WASM extension '{extension.id}' " - f"route '{route_config.path}': {exc}" - ) - return {} - if not openapi_refs: - return {} - - errors: list[Exception] = [] - for openapi_ref in openapi_refs: - try: - document_path, pointer = _wasm_openapi_ref_parts(openapi_ref) - document = _load_wasm_openapi_document(extension, document_path) - operation = _resolve_json_pointer(document, pointer) - if not isinstance(operation, dict): - raise TypeError("OpenAPI route fragment must resolve to an object.") - return _inline_wasm_openapi_refs(deepcopy(operation), document) - except Exception as exc: - errors.append(exc) - - logger.warning( - f"Ignoring OpenAPI metadata for WASM extension '{extension.id}' " - f"route '{route_config.path}': {errors[-1]}" - ) - return {} - - -def _wasm_extension_openapi_refs( - extension: WasmExtension, - route_config: WasmAPIRouteConfig, -) -> list[str]: - if route_config.openapi: - return [ - _wasm_openapi_resolved_ref( - extension.config.openapi, - route_config.openapi, - ) - ] - - document_path = extension.config.openapi - if not document_path: - return [] - - document_path = _wasm_openapi_document_path(document_path) - route_keys = [route_config.export, _wasm_openapi_route_key(route_config.export)] - return [ - f"{document_path}#/routes/{_json_pointer_token(route_key)}" - for route_key in dict.fromkeys(route_keys) - ] - - -def _wasm_openapi_resolved_ref( - base_ref: str | None, - route_ref: str, -) -> str: - if not route_ref.startswith("#"): - return route_ref - if not base_ref: - raise ValueError("OpenAPI metadata reference must include a JSON file path.") - return f"{_wasm_openapi_document_path(base_ref)}{route_ref}" - - -def _wasm_openapi_document_path(openapi_ref: str) -> str: - document_path, _, _ = openapi_ref.partition("#") - if not document_path: - raise ValueError("OpenAPI metadata reference must include a JSON file path.") - return document_path - - -def _wasm_openapi_route_key(export_name: str) -> str: - return re.sub(r"[^A-Za-z0-9]+", "_", export_name).strip("_").lower() - - -def _json_pointer_token(value: str) -> str: - return value.replace("~", "~0").replace("/", "~1") - - -def _wasm_openapi_ref_parts(openapi_ref: str) -> tuple[str, str]: - document_path, _, pointer = openapi_ref.partition("#") - if not document_path: - raise ValueError("OpenAPI metadata reference must include a JSON file path.") - return document_path, pointer - - -def _load_wasm_openapi_document( - extension: WasmExtension, - document_path: str, -) -> dict[str, Any]: - if "://" in document_path or document_path.startswith(("/", "\\")): - raise ValueError("OpenAPI metadata reference must be a local relative path.") - if not document_path.lower().endswith(".json"): - raise ValueError("OpenAPI metadata reference must point to a JSON file.") - - extension_root = extension.root_path.resolve() - path = (extension_root / document_path).resolve() - if not path.is_relative_to(extension_root): - raise ValueError("OpenAPI metadata reference escapes the extension root.") - if not path.is_file(): - raise FileNotFoundError(f"OpenAPI metadata file not found: {document_path}") - - with path.open("r", encoding="utf-8") as openapi_file: - document = json.load(openapi_file) - if not isinstance(document, dict): - raise TypeError("OpenAPI metadata file must contain a JSON object.") - return document - - -def _resolve_json_pointer(document: Any, pointer: str) -> Any: - if not pointer: - return document - if not pointer.startswith("/"): - raise ValueError("OpenAPI metadata reference must use a JSON pointer.") - - value = document - for raw_token in pointer[1:].split("/"): - token = raw_token.replace("~1", "/").replace("~0", "~") - if isinstance(value, dict): - value = value[token] - elif isinstance(value, list): - value = value[int(token)] - else: - raise KeyError(token) - return value - - -def _inline_wasm_openapi_refs( - value: Any, - document: dict[str, Any], - seen_refs: tuple[str, ...] = (), -) -> Any: - if isinstance(value, list): - return [_inline_wasm_openapi_refs(item, document, seen_refs) for item in value] - if not isinstance(value, dict): - return value - - ref = value.get("$ref") - if isinstance(ref, str) and ref.startswith("#/") and ref not in seen_refs: - try: - resolved = _inline_wasm_openapi_refs( - deepcopy(_resolve_json_pointer(document, ref[1:])), - document, - (*seen_refs, ref), - ) - except Exception: - resolved = None - - if resolved is not None: - overrides = { - key: _inline_wasm_openapi_refs(item, document, seen_refs) - for key, item in value.items() - if key != "$ref" - } - if isinstance(resolved, dict): - return {**resolved, **overrides} - if not overrides: - return resolved - - return { - key: _inline_wasm_openapi_refs(item, document, seen_refs) - for key, item in value.items() - } - - -def _add_wasm_openapi_success_examples(operation: dict[str, Any]) -> None: - responses = operation.get("responses") - if not isinstance(responses, dict): - return - - for response in responses.values(): - if not isinstance(response, dict): - continue - content = response.get("content") - if not isinstance(content, dict): - continue - json_content = content.get("application/json") - if not isinstance(json_content, dict): - continue - if "example" in json_content or "examples" in json_content: - continue - - schema = json_content.get("schema") - example = _wasm_openapi_success_example(schema) - if example is not None: - json_content["example"] = example - - -def _wasm_openapi_success_example(schema: Any) -> Any | None: - if not isinstance(schema, dict): - return None - - for keyword in ("oneOf", "anyOf"): - variants = schema.get(keyword) - if not isinstance(variants, list): - continue - for variant in variants: - if _wasm_openapi_schema_has_ok_value(variant, True): - return _wasm_openapi_schema_example(variant) - return None - - -def _wasm_openapi_schema_has_ok_value(schema: Any, ok_value: bool) -> bool: - if not isinstance(schema, dict): - return False - properties = schema.get("properties") - if isinstance(properties, dict): - ok_schema = properties.get("ok") - if isinstance(ok_schema, dict): - enum = ok_schema.get("enum") - return isinstance(enum, list) and ok_value in enum - all_of = schema.get("allOf") - return isinstance(all_of, list) and any( - _wasm_openapi_schema_has_ok_value(item, ok_value) for item in all_of - ) - - -def _wasm_openapi_schema_example(schema: Any) -> Any: - if not isinstance(schema, dict): - return None - - explicit_example = _wasm_openapi_explicit_schema_example(schema) - if explicit_example is not _MISSING_OPENAPI_EXAMPLE: - return explicit_example - - composed_example = _wasm_openapi_composed_schema_example(schema) - if composed_example is not _MISSING_OPENAPI_EXAMPLE: - return composed_example - - return _wasm_openapi_type_schema_example(schema) - - -def _wasm_openapi_explicit_schema_example(schema: dict[str, Any]) -> Any: - if "example" in schema: - return schema["example"] - enum = schema.get("enum") - if isinstance(enum, list) and enum: - return enum[0] - return _MISSING_OPENAPI_EXAMPLE - - -def _wasm_openapi_composed_schema_example(schema: dict[str, Any]) -> Any: - all_of = schema.get("allOf") - if isinstance(all_of, list): - example: dict[str, Any] = {} - for item in all_of: - item_example = _wasm_openapi_schema_example(item) - if isinstance(item_example, dict): - example.update(item_example) - return example - - for keyword in ("oneOf", "anyOf"): - variants = schema.get(keyword) - if isinstance(variants, list) and variants: - return _wasm_openapi_schema_example(variants[0]) - return _MISSING_OPENAPI_EXAMPLE - - -def _wasm_openapi_type_schema_example(schema: dict[str, Any]) -> Any: - schema_type = schema.get("type") - if schema_type == "object" or isinstance(schema.get("properties"), dict): - properties = schema.get("properties") - if not isinstance(properties, dict): - return {} - return { - name: _wasm_openapi_schema_example(property_schema) - for name, property_schema in properties.items() - } - if schema_type == "array": - return [_wasm_openapi_schema_example(schema.get("items"))] - if schema_type == "integer": - return 0 - if schema_type == "number": - return 0 - if schema_type == "boolean": - return True - return "string" - - -def _openapi_string(value: Any) -> str | None: - if not isinstance(value, str): - return None - value = value.strip() - return value or None - - -def _wasm_extension_default_operation_id( - extension: WasmExtension, - route_config: WasmAPIRouteConfig, - method: str, -) -> str: - value = f"{extension.id}_{method}_{route_config.path}" - value = re.sub(r"[^A-Za-z0-9]+", "_", value).strip("_").lower() - return value or f"{extension.id}_{method.lower()}" diff --git a/lnbits/core/wasm_ext/routes/register.py b/lnbits/core/wasm_ext/routes/register.py deleted file mode 100644 index a6c43b6ba..000000000 --- a/lnbits/core/wasm_ext/routes/register.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import annotations - -from time import perf_counter - -from fastapi import FastAPI -from loguru import logger - -from lnbits.core.db import core_app_extra -from lnbits.settings import settings - -from ..wasm.component import warm_wasm_extension -from ..wasm.loader import WasmExtension, load_wasm_extension -from .api import ( - register_wasm_extension_api_routes, - unregister_wasm_extension_api_routes, -) -from .assets import mount_wasm_extension_static -from .ui import register_wasm_extension_ui_routes - - -def register_wasm_extension(app: FastAPI, ext_id: str) -> WasmExtension: - load_started_at = perf_counter() - loaded = load_wasm_extension(ext_id) - core_app_extra.wasm_extension_registry.require_available(loaded) - - warm_wasm_extension(loaded) - mount_wasm_extension_static(app, loaded) - register_wasm_extension_ui_routes(app, loaded) - register_wasm_extension_api_routes(app, loaded) - - core_app_extra.wasm_extension_registry.register(loaded) - - settings.activate_extension_paths(ext_id, []) - module_size = _format_wasm_extension_size(loaded.module_path.stat().st_size) - load_seconds = perf_counter() - load_started_at - logger.info( - f"Loaded WASM extension '{loaded.id}' " - f"({module_size}) in {load_seconds:.2f} s." - ) - return loaded - - -def unregister_wasm_extension(app: FastAPI, ext_id: str) -> None: - routes_removed = unregister_wasm_extension_api_routes(app, ext_id) - core_app_extra.wasm_extension_registry.unregister(ext_id) - if routes_removed: - logger.info(f"Unloaded WASM extension API routes for '{ext_id}'.") - - -def _format_wasm_extension_size(size_bytes: int) -> str: - if size_bytes >= 1_000_000: - return f"{size_bytes / 1_000_000:,.2f} MB" - return f"{size_bytes / 1_000:,.2f} KB" diff --git a/lnbits/core/wasm_ext/routes/security.py b/lnbits/core/wasm_ext/routes/security.py deleted file mode 100644 index 016f37faf..000000000 --- a/lnbits/core/wasm_ext/routes/security.py +++ /dev/null @@ -1,127 +0,0 @@ -from __future__ import annotations - -from typing import Any, NoReturn -from uuid import uuid4 - -from fastapi import HTTPException, Request -from loguru import logger - -from lnbits.helpers import template_renderer -from lnbits.utils.cache import cache - -from ..wasm.loader import WasmExtension - -WASM_FRAME_TOKEN_EXPIRY_SECONDS = 60 - - -def wasm_extension_wrapper_response( - request: Request, - extension: WasmExtension, - auth: str, - user_json: str | None, -) -> Any: - public = auth == "public" - response = template_renderer().TemplateResponse( - request, - "wasm_extension.html", - { - "extension": extension, - "public": public, - "user": user_json, - }, - ) - response.headers["Content-Security-Policy"] = "frame-ancestors 'self'" - response.headers["X-Frame-Options"] = "SAMEORIGIN" - return response - - -def wasm_extension_frame_csp(request: Request, extension: WasmExtension) -> str: - origin = str(request.base_url).rstrip("/") - extension_assets = f"{origin}/ext-assets/{extension.id}/" - return ( - "sandbox allow-scripts allow-pointer-lock; " - "default-src 'none'; " - f"script-src {extension_assets}; " - "script-src-attr 'none'; " - f"style-src {extension_assets}; " - "style-src-attr 'none'; " - f"img-src {extension_assets} data:; " - f"font-src {extension_assets}; " - "connect-src 'none'; " - "form-action 'none'; " - "object-src 'none'; " - "base-uri 'none'; " - "frame-src 'none'; " - "worker-src 'none'; " - f"media-src {extension_assets}; " - "manifest-src 'none'; " - "frame-ancestors 'self'" - ) - - -def wasm_extension_frame_url( - extension: WasmExtension, frame_path: str, user_id: str | None -) -> str: - token = _create_wasm_extension_frame_token(extension, frame_path, user_id) - return f"{frame_path}?frame_token={token}" - - -def consume_wasm_extension_frame_token( - request: Request, - extension: WasmExtension, - frame_path: str, - user_id: str | None, -) -> None: - token = request.query_params.get("frame_token") - if not token: - _raise_wasm_extension_frame_not_found(extension, frame_path, "missing") - - cache_key = _wasm_extension_frame_token_cache_key(token) - token_data = cache.get(cache_key) - if ( - not isinstance(token_data, dict) - or token_data.get("extension_id") != extension.id - or token_data.get("frame_path") != frame_path - ): - _raise_wasm_extension_frame_not_found( - extension, frame_path, "unknown or expired" - ) - - token_user_id = token_data.get("user_id") - if token_user_id and token_user_id != user_id: - _raise_wasm_extension_frame_not_found(extension, frame_path, "wrong user") - - cache.pop(cache_key) - - -def _create_wasm_extension_frame_token( - extension: WasmExtension, - frame_path: str, - user_id: str | None, -) -> str: - token = uuid4().hex - cache.set( - _wasm_extension_frame_token_cache_key(token), - { - "extension_id": extension.id, - "frame_path": frame_path, - "user_id": user_id, - }, - expiry=WASM_FRAME_TOKEN_EXPIRY_SECONDS, - ) - return token - - -def _wasm_extension_frame_token_cache_key(token: str) -> str: - return f"wasm-frame-token:{token}" - - -def _raise_wasm_extension_frame_not_found( - extension: WasmExtension, - frame_path: str, - reason: str, -) -> NoReturn: - logger.warning( - f"WASM frame token {reason} for extension '{extension.id}' at '{frame_path}'." - ) - raise HTTPException(status_code=404, detail="Not found") diff --git a/lnbits/core/wasm_ext/routes/ui.py b/lnbits/core/wasm_ext/routes/ui.py deleted file mode 100644 index d0d4362f1..000000000 --- a/lnbits/core/wasm_ext/routes/ui.py +++ /dev/null @@ -1,369 +0,0 @@ -from __future__ import annotations - -from pathlib import Path -from typing import Annotated, Any - -from fastapi import Depends, FastAPI, HTTPException, Request -from fastapi.responses import FileResponse -from pydantic import UUID4 - -from lnbits.core.crud import get_installed_extension, get_user_from_account -from lnbits.core.models import Account -from lnbits.decorators import ( - check_access_token, - check_account_exists, - optional_user_id, -) - -from ..wasm.loader import WasmExtension -from .api import ( - WasmRequestBodyTooLargeError, - _has_route, - _path_template_pattern, - _read_json_object, - _snake_to_camel, - _wasm_extension_api_export, - _wasm_extension_api_method, - _wasm_extension_api_path, - _wasm_extension_route_auth, -) -from .security import ( - consume_wasm_extension_frame_token, - wasm_extension_frame_csp, - wasm_extension_frame_url, - wasm_extension_wrapper_response, -) - - -def register_wasm_extension_ui_routes(app: FastAPI, extension: WasmExtension) -> None: - _add_wasm_extension_frame_config_route(app, extension) - - for route_index, route_config in enumerate(extension.config.ui_routes): - route_path = _wasm_extension_ui_route_path(extension, route_config.path) - entrypoint = _wasm_extension_entrypoint(extension, route_config.entrypoint) - frame_path = f"/ext-frame/{extension.id}/{route_index}" - auth = _wasm_extension_route_auth(extension, route_config.auth) - _add_wasm_extension_frame_route(app, extension, frame_path, entrypoint) - _add_wasm_extension_wrapper_route( - app, - extension, - route_path, - auth, - ) - - -def _add_wasm_extension_frame_config_route( - app: FastAPI, - extension: WasmExtension, -) -> None: - route_path = _wasm_extension_frame_config_path(extension) - if _has_route(app, route_path, "POST"): - return - - async def create_wasm_extension_frame_config( - request: Request, - access_token: Annotated[str | None, Depends(check_access_token)], - usr: UUID4 | None = None, - ) -> dict[str, Any]: - try: - body = await _read_json_object(request) - except WasmRequestBodyTooLargeError as exc: - raise HTTPException(status_code=413, detail=str(exc)) from exc - except (TypeError, ValueError) as exc: - raise HTTPException(status_code=400, detail=str(exc)) from exc - - ui_route = _match_wasm_extension_ui_route(extension, body.get("path")) - auth = ui_route["auth"] - - if auth == "user": - account = await check_account_exists(request, access_token, usr) - user_id: str | None = account.id - else: - user_id = await _optional_wasm_user_id(request, access_token, usr) - - granted_permission_ids = await _wasm_extension_granted_permission_ids(extension) - - return _wasm_extension_frame_config( - extension, - ui_route["frame_path"], - auth, - ui_route["path_params"], - ui_route["route_params"], - _read_wasm_extension_route_query(body.get("query")), - user_id, - granted_permission_ids, - ) - - app.add_api_route( - route_path, - create_wasm_extension_frame_config, - methods=["POST"], - name=f"{extension.id}:frame-config", - include_in_schema=False, - ) - - -def _add_wasm_extension_wrapper_route( - app: FastAPI, - extension: WasmExtension, - route_path: str, - auth: str, -) -> None: - if _has_route(app, route_path, "GET"): - return - - async def serve_private_wasm_extension_page( - request: Request, - account: Account = Depends(check_account_exists), - ) -> Any: - user = await get_user_from_account(account) - return wasm_extension_wrapper_response( - request, - extension, - auth, - user.json() if user else None, - ) - - async def serve_public_wasm_extension_page(request: Request) -> Any: - return wasm_extension_wrapper_response( - request, - extension, - auth, - None, - ) - - app.add_api_route( - route_path, - ( - serve_public_wasm_extension_page - if auth == "public" - else serve_private_wasm_extension_page - ), - methods=["GET"], - name=f"{extension.id}:{route_path}", - include_in_schema=False, - ) - - -def _add_wasm_extension_frame_route( - app: FastAPI, - extension: WasmExtension, - frame_path: str, - entrypoint: Path, -) -> None: - if _has_route(app, frame_path, "GET"): - return - - async def serve_wasm_extension_frame( - request: Request, - user_id: str | None = Depends(_optional_wasm_user_id), - ) -> FileResponse: - consume_wasm_extension_frame_token(request, extension, frame_path, user_id) - response = FileResponse(entrypoint) - response.headers["Content-Security-Policy"] = wasm_extension_frame_csp( - request, extension - ) - response.headers["Cache-Control"] = "no-store" - response.headers["Cross-Origin-Opener-Policy"] = "same-origin" - response.headers["Cross-Origin-Resource-Policy"] = "same-origin" - # Extension access goes through the parent bridge. - response.headers["Permissions-Policy"] = ( - "camera=(), microphone=(), geolocation=(), payment=(), " - "clipboard-read=(), usb=()" - ) - response.headers["Referrer-Policy"] = "no-referrer" - response.headers["X-Content-Type-Options"] = "nosniff" - return response - - app.add_api_route( - frame_path, - serve_wasm_extension_frame, - methods=["GET"], - name=f"{extension.id}:frame:{frame_path}", - include_in_schema=False, - ) - - -def _wasm_extension_bridge_api_routes( - extension: WasmExtension, - public: bool, -) -> list[dict[str, str]]: - routes: list[dict[str, str]] = [] - for route_config in extension.config.api_routes: - auth = _wasm_extension_route_auth(extension, route_config.auth) - if public and auth != "public": - continue - method = _wasm_extension_api_method(extension, route_config.method) - path = _wasm_extension_api_path(extension, route_config.path) - _wasm_extension_api_export(extension, route_config.export) - routes.append( - { - "method": method, - "path": path, - "pattern": _path_template_pattern(path), - } - ) - return routes - - -def _wasm_extension_frame_config_path(extension: WasmExtension) -> str: - return f"/api/v1/ext/{extension.id}/_ui/frame" - - -def _match_wasm_extension_ui_route( - extension: WasmExtension, - path: Any, -) -> dict[str, Any]: - if not isinstance(path, str) or not path.startswith("/"): - raise HTTPException(status_code=404, detail="Not found") - - for route_index, route_config in enumerate(extension.config.ui_routes): - route_path = _wasm_extension_ui_route_path(extension, route_config.path) - route_params = _path_template_params(route_path, path) - if route_params is None: - continue - - return { - "frame_path": f"/ext-frame/{extension.id}/{route_index}", - "auth": _wasm_extension_route_auth(extension, route_config.auth), - "path_params": route_config.path_params, - "route_params": route_params, - } - - raise HTTPException(status_code=404, detail="Not found") - - -def _path_template_params(template: str, path: str) -> dict[str, str] | None: - template_parts = _path_parts(template) - path_parts = _path_parts(path) - if len(template_parts) != len(path_parts): - return None - - params: dict[str, str] = {} - for template_part, path_part in zip(template_parts, path_parts, strict=False): - if template_part.startswith("{") and template_part.endswith("}"): - param_name = template_part[1:-1] - if not param_name: - return None - params[param_name] = path_part - continue - - if template_part != path_part: - return None - - return params - - -def _path_parts(path: str) -> list[str]: - return [part for part in path.strip("/").split("/") if part] - - -def _wasm_extension_frame_config( - extension: WasmExtension, - frame_path: str, - auth: str, - path_params: dict[str, str], - route_params: dict[str, str], - query: dict[str, Any], - user_id: str | None, - permissions: set[str], -) -> dict[str, Any]: - public = auth == "public" - return { - "extension": { - "id": extension.id, - "name": extension.name, - }, - "frameUrl": wasm_extension_frame_url(extension, frame_path, user_id), - "bridge": { - "extensionId": extension.id, - "public": public, - "routeParams": _map_wasm_extension_route_params(route_params, path_params), - "query": query, - "permissions": sorted(permissions), - "apiRoutes": _wasm_extension_bridge_api_routes(extension, public), - }, - } - - -async def _wasm_extension_granted_permission_ids( - extension: WasmExtension, -) -> set[str]: - installed_extension = await get_installed_extension(extension.id) - if not installed_extension: - return set() - return {permission.id for permission in installed_extension.permissions} - - -def _map_wasm_extension_route_params( - route_params: dict[str, str], - path_params: dict[str, str], -) -> dict[str, str]: - payload: dict[str, str] = {} - for key, value in route_params.items(): - target = path_params.get(key) or _snake_to_camel(key) - payload[target] = value - return payload - - -def _read_wasm_extension_route_query(query: Any) -> dict[str, Any]: - if not isinstance(query, dict): - return {} - - payload: dict[str, Any] = {} - for key, value in query.items(): - if value is None: - continue - payload[_snake_to_camel(str(key))] = value - return payload - - -async def _optional_wasm_user_id( - request: Request, - access_token: Annotated[str | None, Depends(check_access_token)], - usr: UUID4 | None = None, -) -> str | None: - try: - return await optional_user_id(request, access_token, usr) - except HTTPException: - return None - - -def _wasm_extension_ui_route_path(extension: WasmExtension, path: Any) -> str: - if not isinstance(path, str) or not path.startswith("/"): - raise ValueError(f"Invalid route path for WASM extension '{extension.id}'.") - if path == "/": - return "/ext" - return f"/ext{path}" - - -def _wasm_extension_entrypoint(extension: WasmExtension, entrypoint: Any) -> Path: - if not isinstance(entrypoint, str) or not entrypoint: - raise ValueError( - f"Invalid route entrypoint for WASM extension '{extension.id}'." - ) - if entrypoint.startswith("/"): - raise ValueError( - f"Route entrypoint for WASM extension '{extension.id}' must be a " - "relative extension path." - ) - - path = (extension.root_path / entrypoint).resolve() - root_path = extension.root_path.resolve() - if path != root_path and root_path not in path.parents: - raise ValueError(f"Route entrypoint escapes extension root: {entrypoint}") - - static_path = (extension.root_path / "static").resolve() - if path == static_path or static_path in path.parents: - raise ValueError( - f"Route entrypoint for WASM extension '{extension.id}' must not be " - "inside the static asset directory." - ) - if path.suffix.lower() != ".html": - raise ValueError( - f"Route entrypoint for WASM extension '{extension.id}' must be " - "an HTML file." - ) - if not path.is_file(): - raise FileNotFoundError(f"Route entrypoint not found: {path}") - return path diff --git a/lnbits/core/wasm_ext/storage/__init__.py b/lnbits/core/wasm_ext/storage/__init__.py deleted file mode 100644 index 031dfd3d3..000000000 --- a/lnbits/core/wasm_ext/storage/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from .crud import ( - migrate_wasm_extension_database, - storage_append_public_row, - storage_count_rows, - storage_delete_row, - storage_get_paginated_rows, - storage_get_public_paginated_rows, - storage_get_public_row, - storage_get_row, - storage_get_row_owner_id, - storage_set_row, -) - -__all__ = [ - "migrate_wasm_extension_database", - "storage_append_public_row", - "storage_count_rows", - "storage_delete_row", - "storage_get_paginated_rows", - "storage_get_public_paginated_rows", - "storage_get_public_row", - "storage_get_row", - "storage_get_row_owner_id", - "storage_set_row", -] diff --git a/lnbits/core/wasm_ext/storage/crud.py b/lnbits/core/wasm_ext/storage/crud.py deleted file mode 100644 index 4c17f5c35..000000000 --- a/lnbits/core/wasm_ext/storage/crud.py +++ /dev/null @@ -1,720 +0,0 @@ -from __future__ import annotations - -import json -import re -from datetime import datetime, timezone -from pathlib import Path -from typing import Any -from uuid import uuid4 - -from loguru import logger - -from lnbits.core.crud import update_migration_version -from lnbits.core.db import db as core_db -from lnbits.core.models import DbVersion -from lnbits.core.models.extensions import InstallableExtension -from lnbits.db import POSTGRES, SQLITE, Compat, Connection, Database -from lnbits.settings import settings - -_MIGRATION_FILE_RE = re.compile(r"^(\d+)_.*\.json$") -_SQL_IDENTIFIER_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$") -OWNER_ID_FIELD = "__lnbits_owner_id__" - - -async def storage_get_row( - ext_id: str, - table: str, - row_id: str, - owner_id: str, -) -> dict[str, Any] | None: - table_schema = _load_table_schema(ext_id, table) - query = f""" - SELECT * FROM {_table_ref_for_schema(ext_id, table)} - WHERE id = :id AND {OWNER_ID_FIELD} = :owner_id - """ # noqa: S608 - async with Database(f"ext_{ext_id}").connect() as conn: - row = await conn.fetchone(query, {"id": row_id, "owner_id": owner_id}) - return _row_from_db(table_schema, row) if row else None - - -async def storage_get_public_row( - ext_id: str, - table: str, - row_id: str, -) -> dict[str, Any] | None: - table_schema = _load_table_schema(ext_id, table) - query = f""" - SELECT * FROM {_table_ref_for_schema(ext_id, table)} - WHERE id = :id - """ # noqa: S608 - async with Database(f"ext_{ext_id}").connect() as conn: - row = await conn.fetchone(query, {"id": row_id}) - return _row_from_db(table_schema, row) if row else None - - -async def storage_get_row_owner_id( - ext_id: str, - table: str, - row_id: str, -) -> str | None: - _load_table_schema(ext_id, table) - query = f""" - SELECT {OWNER_ID_FIELD} FROM {_table_ref_for_schema(ext_id, table)} - WHERE id = :id - """ # noqa: S608 - async with Database(f"ext_{ext_id}").connect() as conn: - row = await conn.fetchone(query, {"id": row_id}) - - owner_id = row[OWNER_ID_FIELD] if row else None - return owner_id if isinstance(owner_id, str) and owner_id else None - - -async def storage_set_row( - ext_id: str, - table: str, - data: dict[str, Any], - owner_id: str, -) -> None: - table_schema = _load_table_schema(ext_id, table) - clean_data = _data_to_db(table_schema, data, require_id=True) - columns = list(clean_data.keys()) - database = Database(f"ext_{ext_id}") - fields = _fields_by_name(table_schema) - placeholders = [ - _value_placeholder(database, fields[column], column) for column in columns - ] - - clean_data[OWNER_ID_FIELD] = owner_id - columns.append(OWNER_ID_FIELD) - placeholders.append(f":{OWNER_ID_FIELD}") - updates = [ - f"{column} = excluded.{column}" - for column in columns - if column not in ("id", OWNER_ID_FIELD) - ] - conflict_sql = ( - "DO UPDATE SET " - + ", ".join(updates) - + f" WHERE storage_row.{OWNER_ID_FIELD} = :{OWNER_ID_FIELD}" - if updates - else "DO NOTHING" - ) - query = f""" - INSERT INTO {_table_ref_for_schema(ext_id, table)} AS storage_row - ({", ".join(columns)}) - VALUES - ({", ".join(placeholders)}) - ON CONFLICT (id) {conflict_sql} - """ # noqa: S608 - - async with database.connect() as conn: - await conn.execute(query, clean_data) - - -async def storage_append_public_row( - ext_id: str, - table: str, - data: dict[str, Any], - owner_id: str, -) -> str: - row_id = uuid4().hex - await storage_set_row(ext_id, table, {**data, "id": row_id}, owner_id) - return row_id - - -async def storage_count_rows( - ext_id: str, - table: str, - filters: dict[str, Any], - *, - owner_id: str, -) -> int: - table_schema = _load_table_schema(ext_id, table) - database = Database(f"ext_{ext_id}") - where_sql, values = _where_sql(database, table_schema, filters, None, []) - where_sql = _append_owner_where_sql(where_sql) - values[OWNER_ID_FIELD] = owner_id - - query = f""" - SELECT COUNT(*) AS count FROM {_table_ref_for_schema(ext_id, table)} - {where_sql} - """ # noqa: S608 - async with database.connect() as conn: - row = await conn.fetchone(query, values) - return int(row["count"]) if row else 0 - - -async def storage_get_paginated_rows( - ext_id: str, - table: str, - filters: dict[str, Any], - *, - owner_id: str, - search: str | None, - search_fields: list[str], - sort_by: str | None, - descending: bool, - limit: int, - offset: int, -) -> dict[str, Any]: - table_schema = _load_table_schema(ext_id, table) - database = Database(f"ext_{ext_id}") - where_sql, values = _where_sql( - database, table_schema, filters, search, search_fields - ) - where_sql = _append_owner_where_sql(where_sql) - values[OWNER_ID_FIELD] = owner_id - order_sql = _order_sql(table_schema, sort_by, descending) - count_values = dict(values) - values.update({"limit": min(limit, 1000), "offset": offset}) - - table_ref = _table_ref_for_schema(ext_id, table) - rows_query = f""" - SELECT * FROM {table_ref} - {where_sql} - {order_sql} - LIMIT :limit - OFFSET :offset - """ # noqa: S608 - count_query = f""" - SELECT COUNT(*) AS count FROM {table_ref} - {where_sql} - """ # noqa: S608 - - async with database.connect() as conn: - rows = await conn.fetchall(rows_query, values) - count_row = await conn.fetchone(count_query, count_values) - - return { - "data": [_row_from_db(table_schema, row) for row in rows], - "total": int(count_row["count"]) if count_row else 0, - } - - -async def storage_get_public_paginated_rows( - ext_id: str, - table: str, - filters: dict[str, Any], - *, - search: str | None, - search_fields: list[str], - sort_by: str | None, - descending: bool, - limit: int, - offset: int, -) -> dict[str, Any]: - table_schema = _load_table_schema(ext_id, table) - database = Database(f"ext_{ext_id}") - where_sql, values = _where_sql( - database, table_schema, filters, search, search_fields - ) - order_sql = _order_sql(table_schema, sort_by, descending) - count_values = dict(values) - values.update({"limit": min(limit, 1000), "offset": offset}) - - table_ref = _table_ref_for_schema(ext_id, table) - rows_query = f""" - SELECT * FROM {table_ref} - {where_sql} - {order_sql} - LIMIT :limit - OFFSET :offset - """ # noqa: S608 - count_query = f""" - SELECT COUNT(*) AS count FROM {table_ref} - {where_sql} - """ # noqa: S608 - - async with database.connect() as conn: - rows = await conn.fetchall(rows_query, values) - count_row = await conn.fetchone(count_query, count_values) - - return { - "data": [_row_from_db(table_schema, row) for row in rows], - "total": int(count_row["count"]) if count_row else 0, - } - - -async def storage_delete_row( - ext_id: str, - table: str, - row_id: str, - owner_id: str, -) -> None: - _load_table_schema(ext_id, table) - query = f""" - DELETE FROM {_table_ref_for_schema(ext_id, table)} - WHERE id = :id AND {OWNER_ID_FIELD} = :owner_id - """ # noqa: S608 - async with Database(f"ext_{ext_id}").connect() as conn: - await conn.execute(query, {"id": row_id, "owner_id": owner_id}) - - -async def migrate_wasm_extension_database( - ext: InstallableExtension, - current_version: DbVersion | None = None, -) -> None: - migrations_dir = ext.wasm_ext_dir / "storage" / "migrations" - migration_files = _migration_files(migrations_dir) - if not migration_files: - logger.debug(f"No storage migrations for WASM extension '{ext.id}'.") - return - - ext_db = Database(f"ext_{ext.id}") - async with ext_db.connect() as conn: - for version, path in migration_files: - if current_version and version <= current_version.version: - continue - logger.debug(f"running WASM storage migration {ext.id}.{version}") - print(f"running migration {ext.id}.{version}") - await _run_storage_migration(conn, path) - await _update_wasm_migration_version(conn, ext.id, version) - - -def _migration_files(migrations_dir: Path) -> list[tuple[int, Path]]: - if not migrations_dir.is_dir(): - return [] - - files: list[tuple[int, Path]] = [] - for path in migrations_dir.glob("*.json"): - match = _MIGRATION_FILE_RE.match(path.name) - if not match: - raise ValueError(f"Invalid WASM storage migration filename: {path.name}") - files.append((int(match.group(1)), path)) - return sorted(files) - - -async def _run_storage_migration(db: Connection, path: Path) -> None: - migration = _load_json(path) - operations = migration.get("operations") - if not isinstance(operations, list): - raise ValueError(f"WASM storage migration '{path}' has no operations list.") - - for operation in operations: - if not isinstance(operation, dict): - raise ValueError(f"WASM storage migration '{path}' has invalid operation.") - sql = _operation_sql(db, operation) - await db.execute(sql) - - -def _operation_sql(db: Connection, operation: dict[str, Any]) -> str: - op = operation.get("op") - if op == "create_table": - return _create_table_sql(db, operation) - if op == "add_field": - return _add_field_sql(db, operation) - if op == "create_index": - return _create_index_sql(db, operation) - raise ValueError(f"Unsupported WASM storage migration operation: {op}") - - -def _create_table_sql(db: Connection, operation: dict[str, Any]) -> str: - table = _require_identifier(operation, "table") - fields = _require_fields(operation) - if not any(field.get("name") == "id" for field in fields): - raise ValueError(f"WASM storage table '{table}' must define an id field.") - if any(field.get("name") == OWNER_ID_FIELD for field in fields): - raise ValueError( - f"WASM storage table '{table}' defines reserved field '{OWNER_ID_FIELD}'." - ) - - columns = [ - _column_sql(db, field, primary_key=field.get("name") == "id") - for field in fields - ] - columns.append(f"{OWNER_ID_FIELD} TEXT NOT NULL") - return f""" - CREATE TABLE IF NOT EXISTS {_table_ref(db, table)} ( - {", ".join(columns)} - ); - """ - - -def _add_field_sql(db: Connection, operation: dict[str, Any]) -> str: - table = _require_identifier(operation, "table") - field = _field_from_add_field_operation(operation) - if field["name"] == OWNER_ID_FIELD: - raise ValueError( - f"WASM storage table '{table}' cannot add reserved field " - f"'{OWNER_ID_FIELD}'." - ) - return f""" - ALTER TABLE {_table_ref(db, table)} - ADD COLUMN {_column_sql(db, field)}; - """ - - -def _create_index_sql(db: Connection, operation: dict[str, Any]) -> str: - table = _require_identifier(operation, "table") - name = _require_identifier(operation, "name") - field = _require_identifier(operation, "field") - if field == OWNER_ID_FIELD: - raise ValueError( - f"WASM storage table '{table}' cannot index reserved field " - f"'{OWNER_ID_FIELD}'." - ) - - if db.type == SQLITE and db.schema: - return f""" - CREATE INDEX IF NOT EXISTS {_schema_ref(db, name)} - ON {table} ({field}); - """ - - return f""" - CREATE INDEX IF NOT EXISTS {name} - ON {_table_ref(db, table)} ({field}); - """ - - -def _column_sql( - db: Connection, - field: dict[str, Any], - *, - primary_key: bool = False, -) -> str: - name = _require_identifier(field, "name") - column_type = _field_type_sql(db, field) - parts = [name, column_type] - - if primary_key: - parts.append("PRIMARY KEY") - elif not field.get("nullable", False): - parts.append("NOT NULL") - - if "default" in field: - parts.append(f"DEFAULT {_default_sql(field['default'])}") - - return " ".join(parts) - - -def _field_type_sql(db: Connection, field: dict[str, Any]) -> str: - if field.get("list") is True: - return "TEXT" - - field_type = field.get("type") - if field_type == "string": - return "TEXT" - if field_type == "integer": - return db.big_int - if field_type == "number": - return "DOUBLE PRECISION" if db.type == POSTGRES else "REAL" - if field_type == "boolean": - return "BOOLEAN" - if field_type == "datetime": - return "TIMESTAMP" - raise ValueError(f"Unsupported WASM storage field type: {field_type}") - - -def _load_table_schema(ext_id: str, table: str) -> dict[str, Any]: - schema = _load_storage_schema(ext_id) - tables = schema.get("tables") - if not isinstance(tables, dict): - raise ValueError(f"WASM extension '{ext_id}' has no storage tables schema.") - - _require_identifier({"table": table}, "table") - table_schema = tables.get(table) - if not isinstance(table_schema, dict): - raise ValueError(f"WASM extension '{ext_id}' has no storage table '{table}'.") - - fields = table_schema.get("fields") - if not isinstance(fields, list) or not fields: - raise ValueError(f"WASM storage table '{table}' has no fields schema.") - - for field in fields: - if not isinstance(field, dict): - raise ValueError(f"WASM storage table '{table}' has invalid field schema.") - _require_identifier(field, "name") - if field["name"] == OWNER_ID_FIELD: - raise ValueError( - f"WASM storage table '{table}' defines reserved field " - f"'{OWNER_ID_FIELD}'." - ) - return table_schema - - -def _load_storage_schema(ext_id: str) -> dict[str, Any]: - schema_path = settings.wasm_extensions_dir / ext_id / "storage" / "schema.json" - if not schema_path.is_file(): - raise ValueError(f"WASM extension '{ext_id}' has no storage schema.") - return _load_json(schema_path) - - -def _data_to_db( - table_schema: dict[str, Any], - data: dict[str, Any], - *, - require_id: bool, -) -> dict[str, Any]: - if not isinstance(data, dict): - raise ValueError("WASM storage row data must be an object.") - if require_id and not data.get("id"): - raise ValueError("WASM storage row data must include an id.") - _reject_reserved_owner_field(data, "row") - - fields = _fields_by_name(table_schema) - unknown_fields = sorted(set(data) - set(fields)) - if unknown_fields: - raise ValueError( - "WASM storage row has unknown fields: " + ", ".join(unknown_fields) - ) - - return { - field_name: _value_to_db(fields[field_name], value) - for field_name, value in data.items() - } - - -def _filters_to_db( - table_schema: dict[str, Any], - filters: dict[str, Any], -) -> dict[str, Any]: - if not isinstance(filters, dict): - raise ValueError("WASM storage filters must be an object.") - _reject_reserved_owner_field(filters, "filters") - - fields = _fields_by_name(table_schema) - unknown_fields = sorted(set(filters) - set(fields)) - if unknown_fields: - raise ValueError( - "WASM storage filters have unknown fields: " + ", ".join(unknown_fields) - ) - - return { - field_name: _value_to_db(fields[field_name], value) - for field_name, value in filters.items() - } - - -def _value_placeholder(db: Compat, field: dict[str, Any], key: str) -> str: - if field.get("type") == "datetime" and not field.get("list"): - return db.timestamp_placeholder(key) - return f":{key}" - - -def _where_sql( - db: Compat, - table_schema: dict[str, Any], - filters: dict[str, Any], - search: str | None, - search_fields: list[str], -) -> tuple[str, dict[str, Any]]: - clean_filters = _filters_to_db(table_schema, filters) - fields = _fields_by_name(table_schema) - clauses = [ - f"{field} = {_value_placeholder(db, fields[field], f'filter_{field}')}" - for field in clean_filters - ] - values = {f"filter_{field}": value for field, value in clean_filters.items()} - - clean_search = search.strip().lower() if search else "" - if clean_search: - fields = _fields_by_name(table_schema) - invalid_fields = sorted(set(search_fields) - set(fields)) - if invalid_fields: - raise ValueError( - "WASM storage search has unknown fields: " + ", ".join(invalid_fields) - ) - if search_fields: - search_clause = " OR ".join( - f"LOWER(CAST({field} AS TEXT)) LIKE :search" for field in search_fields - ) - clauses.append(f"({search_clause})") - values["search"] = f"%{clean_search}%" - - return ("WHERE " + " AND ".join(clauses), values) if clauses else ("", values) - - -def _append_owner_where_sql(where_sql: str) -> str: - owner_clause = f"{OWNER_ID_FIELD} = :{OWNER_ID_FIELD}" - if where_sql: - return f"{where_sql} AND {owner_clause}" - return f"WHERE {owner_clause}" - - -def _order_sql( - table_schema: dict[str, Any], - sort_by: str | None, - descending: bool, -) -> str: - if not sort_by: - return "" - fields = _fields_by_name(table_schema) - if sort_by not in fields: - raise ValueError(f"WASM storage sort field is unknown: {sort_by}") - direction = "DESC" if descending else "ASC" - return f"ORDER BY {sort_by} {direction}" - - -def _row_from_db( - table_schema: dict[str, Any], - row: dict[str, Any], -) -> dict[str, Any]: - fields = _fields_by_name(table_schema) - return { - field_name: _value_from_db(fields[field_name], value) - for field_name, value in dict(row).items() - if field_name in fields - } - - -def _fields_by_name(table_schema: dict[str, Any]) -> dict[str, dict[str, Any]]: - fields = table_schema.get("fields") - if not isinstance(fields, list): - raise ValueError("WASM storage table schema fields must be a list.") - return {field["name"]: field for field in fields} - - -def _reject_reserved_owner_field(data: dict[str, Any], value_name: str) -> None: - if OWNER_ID_FIELD in data: - raise ValueError(f"WASM storage {value_name} includes a reserved owner field.") - - -def _value_to_db(field: dict[str, Any], value: Any) -> Any: # noqa: C901 - if value is None: - if field.get("nullable", False): - return None - raise ValueError(f"WASM storage field '{field['name']}' cannot be null.") - - if field.get("list") is True: - if not isinstance(value, list): - raise ValueError(f"WASM storage field '{field['name']}' must be a list.") - return json.dumps(value) - - field_type = field.get("type") - if field_type == "string": - if not isinstance(value, str): - raise ValueError(f"WASM storage field '{field['name']}' must be a string.") - return value - if field_type == "integer": - if isinstance(value, bool) or not isinstance(value, int): - raise ValueError( - f"WASM storage field '{field['name']}' must be an integer." - ) - return value - if field_type == "number": - if isinstance(value, bool) or not isinstance(value, int | float): - raise ValueError(f"WASM storage field '{field['name']}' must be a number.") - return value - if field_type == "boolean": - if not isinstance(value, bool): - raise ValueError(f"WASM storage field '{field['name']}' must be a boolean.") - return value - if field_type == "datetime": - if isinstance(value, int | float): - return datetime.fromtimestamp(value, tz=timezone.utc) - if isinstance(value, datetime): - return value - raise ValueError( - f"WASM storage field '{field['name']}' must be a Unix timestamp." - ) - raise ValueError(f"Unsupported WASM storage field type: {field_type}") - - -def _value_from_db(field: dict[str, Any], value: Any) -> Any: - if value is None: - return None - - if field.get("list") is True: - if isinstance(value, str): - return json.loads(value) - return value - - field_type = field.get("type") - if field_type == "boolean": - return bool(value) - if field_type == "datetime": - if isinstance(value, datetime): - return int(value.replace(tzinfo=timezone.utc).timestamp()) - if isinstance(value, int | float): - return int(value) - if isinstance(value, str): - try: - return int(datetime.fromisoformat(value).timestamp()) - except ValueError: - return value - return value - - -def _default_sql(value: Any) -> str: - if value is None: - return "NULL" - if isinstance(value, bool): - return "true" if value else "false" - if isinstance(value, int | float): - return str(value) - if isinstance(value, str): - return _quote_sql_string(value) - if isinstance(value, list | dict): - return _quote_sql_string(json.dumps(value)) - raise ValueError(f"Unsupported WASM storage default value: {value}") - - -def _field_from_add_field_operation(operation: dict[str, Any]) -> dict[str, Any]: - field = { - "name": operation.get("field"), - "type": operation.get("type"), - } - for key in ("default", "list", "nullable"): - if key in operation: - field[key] = operation[key] - return field - - -def _require_fields(operation: dict[str, Any]) -> list[dict[str, Any]]: - fields = operation.get("fields") - if not isinstance(fields, list) or not fields: - raise ValueError("WASM storage create_table operation requires fields.") - if not all(isinstance(field, dict) for field in fields): - raise ValueError("WASM storage fields must be objects.") - return fields - - -def _require_identifier(data: dict[str, Any], key: str) -> str: - value = data.get(key) - if not isinstance(value, str) or not _SQL_IDENTIFIER_RE.match(value): - raise ValueError(f"Invalid WASM storage SQL identifier for '{key}': {value}") - return value - - -def _table_ref(db: Connection, table: str) -> str: - if db.schema: - return f"{_schema_ref(db, table)}" - return table - - -def _table_ref_for_schema(ext_id: str, table: str) -> str: - _require_identifier({"schema": ext_id}, "schema") - _require_identifier({"table": table}, "table") - return f"{ext_id}.{table}" - - -def _schema_ref(db: Connection, name: str) -> str: - if not db.schema: - return name - if not _SQL_IDENTIFIER_RE.match(db.schema): - raise ValueError(f"Invalid WASM extension storage schema: {db.schema}") - return f"{db.schema}.{name}" - - -def _quote_sql_string(value: str) -> str: - return "'" + value.replace("'", "''") + "'" - - -def _load_json(path: Path) -> dict[str, Any]: - with open(path, encoding="utf-8") as json_file: - data = json.load(json_file) - if not isinstance(data, dict): - raise ValueError(f"WASM storage migration '{path}' must be a JSON object.") - return data - - -async def _update_wasm_migration_version( - db: Connection, - ext_id: str, - version: int, -) -> None: - if db.schema is None: - await update_migration_version(db, ext_id, version) - else: - async with core_db.connect() as conn: - await update_migration_version(conn, ext_id, version) diff --git a/lnbits/core/wasm_ext/wasm/__init__.py b/lnbits/core/wasm_ext/wasm/__init__.py deleted file mode 100644 index 9d61f30d0..000000000 --- a/lnbits/core/wasm_ext/wasm/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from .component import warm_wasm_extension -from .events import dispatch_wasm_invoice_paid -from .invoke import invoke_wasm_extension_export -from .loader import WasmExtension, is_wasm_extension_dir, is_wasm_extension_id - -__all__ = [ - "WasmExtension", - "dispatch_wasm_invoice_paid", - "invoke_wasm_extension_export", - "is_wasm_extension_dir", - "is_wasm_extension_id", - "warm_wasm_extension", -] diff --git a/lnbits/core/wasm_ext/wasm/component.py b/lnbits/core/wasm_ext/wasm/component.py deleted file mode 100644 index e95ec9fe2..000000000 --- a/lnbits/core/wasm_ext/wasm/component.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import annotations - -from functools import lru_cache -from typing import Any - -from wasmtime import Config, Engine - -from lnbits.settings import settings - -from .loader import WasmExtension - - -def warm_wasm_extension(extension: WasmExtension) -> None: - _wasm_component(extension) - - -@lru_cache(maxsize=8) -def _wasm_engine(max_wasm_stack_bytes: int | None = None) -> Any: - config = Config() - config.wasm_component_model = True - config.epoch_interruption = True - config.consume_fuel = True - stack_limit = ( - settings.wasm_runtime_max_wasm_stack_bytes - if max_wasm_stack_bytes is None - else max_wasm_stack_bytes - ) - if stack_limit > 0: - config.max_wasm_stack = stack_limit - return Engine(config) - - -def _wasm_component( - extension: WasmExtension, - limits: dict[str, int] | None = None, -) -> Any: - stat = extension.module_path.stat() - max_wasm_stack_bytes = ( - limits["wasm_runtime_max_wasm_stack_bytes"] - if limits - else settings.wasm_runtime_max_wasm_stack_bytes - ) - return _cached_wasm_component( - str(extension.module_path), - stat.st_mtime_ns, - stat.st_size, - max_wasm_stack_bytes, - ) - - -@lru_cache(maxsize=32) -def _cached_wasm_component( - module_path: str, - mtime_ns: int, - size: int, - max_wasm_stack_bytes: int, -) -> Any: - from wasmtime import component - - return component.Component.from_file( - _wasm_engine(max_wasm_stack_bytes), module_path - ) diff --git a/lnbits/core/wasm_ext/wasm/config.py b/lnbits/core/wasm_ext/wasm/config.py deleted file mode 100644 index 947b3a513..000000000 --- a/lnbits/core/wasm_ext/wasm/config.py +++ /dev/null @@ -1,123 +0,0 @@ -from __future__ import annotations - -import re -from typing import Any, Literal - -from pydantic import ( - BaseModel, - Field, - StrictBool, - StrictStr, - ValidationError, -) - -from lnbits.core.models.extensions import ExtensionPermission - -_EXTENSION_ID_RE = re.compile(r"^[A-Za-z0-9_-]+$") - - -class _StrictWasmModel(BaseModel): - class Config: - extra = "ignore" - allow_population_by_field_name = True - - -class WasmExtensionExport(_StrictWasmModel): - name: StrictStr - visibility: Literal["authenticated", "event", "public"] - - -class WasmRuntimeConfig(_StrictWasmModel): - module: StrictStr - wit: StrictStr | None = None - world: StrictStr = "" - exports: list[WasmExtensionExport] = Field(default_factory=list) - - -class WasmUIConfig(_StrictWasmModel): - entrypoint: StrictStr | None = None - sandbox: StrictBool | None = None - - -class WasmSDKConfig(_StrictWasmModel): - frontend_js: StrictStr | None = None - - -class WasmUIRouteConfig(_StrictWasmModel): - path: StrictStr - entrypoint: StrictStr - auth: Literal["public", "user"] - path_params: dict[str, StrictStr] = Field(default_factory=dict) - - -class WasmRouteOwnerContext(_StrictWasmModel): - table: StrictStr - id_param: StrictStr = Field(..., alias="idParam") - - -class WasmAPIRouteConfig(_StrictWasmModel): - method: Literal["DELETE", "GET", "PATCH", "POST", "PUT"] - path: StrictStr - export: StrictStr - auth: Literal["public", "user"] - path_params: dict[str, StrictStr] = Field(default_factory=dict) - owner_context: WasmRouteOwnerContext | None = Field(None, alias="ownerContext") - openapi: StrictStr | None = None - - -class WasmEventsConfig(_StrictWasmModel): - on_invoice_paid: StrictStr | None = Field(None, alias="onInvoicePaid") - - -class WasmExtensionConfig(_StrictWasmModel): - id: StrictStr - name: StrictStr - short_description: StrictStr - tile: StrictStr | None = None - version: StrictStr - min_lnbits_version: StrictStr | None = None - max_lnbits_version: StrictStr | None = None - extension_type: Literal["wasm"] - wasm: WasmRuntimeConfig - events: WasmEventsConfig = Field( - default_factory=lambda: WasmEventsConfig.parse_obj({}) - ) - ui: WasmUIConfig | None = None - sdk: WasmSDKConfig | None = None - openapi: StrictStr | None = None - ui_routes: list[WasmUIRouteConfig] = Field(default_factory=list) - api_routes: list[WasmAPIRouteConfig] = Field(default_factory=list) - permissions: list[ExtensionPermission] = Field(default_factory=list) - - -def parse_wasm_extension_config( - ext_id: str, - config: dict[str, Any], -) -> WasmExtensionConfig: - validate_wasm_extension_config_id(ext_id, config) - try: - return WasmExtensionConfig.parse_obj(config) - except ValidationError as exc: - raise ValueError( - f"Invalid WASM extension config for '{ext_id}': {exc}" - ) from exc - - -def validate_wasm_extension_config_id( - ext_id: str, - config: dict[str, Any] | WasmExtensionConfig, -) -> str: - if not _EXTENSION_ID_RE.fullmatch(ext_id): - raise ValueError(f"Invalid WASM extension id '{ext_id}'.") - - config_id = ( - config.id if isinstance(config, WasmExtensionConfig) else config.get("id") - ) - if not isinstance(config_id, str) or not config_id: - raise ValueError(f"WASM extension '{ext_id}' config must define id.") - if config_id != ext_id: - raise ValueError( - f"WASM extension id mismatch: installed as '{ext_id}' " - f"but config declares '{config_id}'." - ) - return config_id diff --git a/lnbits/core/wasm_ext/wasm/events.py b/lnbits/core/wasm_ext/wasm/events.py deleted file mode 100644 index 6a86b1dee..000000000 --- a/lnbits/core/wasm_ext/wasm/events.py +++ /dev/null @@ -1,256 +0,0 @@ -import json -from collections.abc import Iterable -from typing import Any - -from loguru import logger - -from lnbits.core.crud.extensions import get_installed_extension, get_user_extensions -from lnbits.core.crud.wallets import get_wallet -from lnbits.core.db import core_app_extra -from lnbits.core.models.extensions import ExtensionWalletPaymentsWatchGrant -from lnbits.core.wasm_ext.storage.crud import storage_get_row_owner_id -from lnbits.core.wasm_ext.wasm.invoke import invoke_wasm_extension_export -from lnbits.helpers import sha256s - -WALLET_PAYMENTS_WATCH_PERMISSION = "wallet.payments.watch" - - -async def dispatch_wasm_invoice_paid(payment: Any) -> None: - targets: dict[str, tuple[Any, str | None]] = {} - extension_id = _payment_extension_id(payment) - if extension_id: - extension = core_app_extra.wasm_extension_registry.get(extension_id) - if extension: - targets[extension_id] = ( - extension, - await _wasm_invoice_paid_owner_id(extension, payment), - ) - - wallet = await _payment_wallet(payment) - if wallet: - wallet_owner_id = sha256s(wallet.user) - for watch_extension_id in await _wallet_watch_extension_ids( - wallet.user, wallet.id - ): - extension = core_app_extra.wasm_extension_registry.get(watch_extension_id) - if not extension: - continue - if watch_extension_id in targets: - existing_extension, existing_owner_id = targets[watch_extension_id] - targets[watch_extension_id] = ( - existing_extension, - existing_owner_id or wallet_owner_id, - ) - continue - targets[watch_extension_id] = (extension, wallet_owner_id) - - for extension, owner_id in targets.values(): - await _dispatch_wasm_invoice_paid_to_extension(extension, payment, owner_id) - - -async def _dispatch_wasm_invoice_paid_to_extension( - extension: Any, payment: Any, owner_id: str | None -) -> None: - export_name = _wasm_invoice_paid_export(extension.config) - if not export_name: - return - - if not _is_wasm_event_export(extension, export_name): - logger.warning( - f"WASM extension '{extension.id}' declares invalid onInvoicePaid " - f"export '{export_name}'." - ) - return - - try: - await invoke_wasm_extension_export( - extension.id, - export_name, - _wasm_invoice_paid_payload(payment), - context="event", - owner_id=owner_id, - trigger_type="event", - event_type="invoice_paid", - wallet_id=payment.wallet_id, - payment_hash=payment.payment_hash, - checking_id=payment.checking_id, - ) - except Exception as exc: - logger.warning( - f"WASM extension '{extension.id}' failed to handle paid invoice " - f"'{payment.payment_hash}': {exc!s}" - ) - - -async def _payment_wallet(payment: Any) -> Any | None: - wallet_id = getattr(payment, "wallet_id", None) - if not isinstance(wallet_id, str) or not wallet_id: - return None - try: - return await get_wallet(wallet_id) - except Exception as exc: - logger.warning(f"Could not fetch wallet '{wallet_id}' for WASM event: {exc!s}") - return None - - -async def _wallet_watch_extension_ids(user_id: str, wallet_id: str) -> list[str]: - try: - user_extensions = await get_user_extensions(user_id) - except Exception as exc: - logger.warning( - f"Could not fetch extensions for wallet payment watch user " - f"'{user_id}': {exc!s}" - ) - return [] - extension_ids: list[str] = [] - - for user_extension in user_extensions: - if not user_extension.active: - continue - if not _has_wallet_watch_grant(user_extension, wallet_id): - continue - if not core_app_extra.wasm_extension_registry.get(user_extension.extension): - continue - try: - installed_extension = await get_installed_extension( - user_extension.extension - ) - except Exception as exc: - logger.warning( - f"Could not fetch installed extension '{user_extension.extension}' " - f"for wallet payment watch: {exc!s}" - ) - continue - if not installed_extension or not installed_extension.active: - continue - if not _extension_has_permission( - installed_extension, WALLET_PAYMENTS_WATCH_PERMISSION - ): - continue - extension_ids.append(user_extension.extension) - - return extension_ids - - -def _has_wallet_watch_grant(user_extension: Any, wallet_id: str) -> bool: - permissions = user_extension.permissions or {} - grants = permissions.get(WALLET_PAYMENTS_WATCH_PERMISSION) - if not isinstance(grants, list): - return False - - for grant_data in grants: - if not isinstance(grant_data, dict): - continue - try: - grant = ExtensionWalletPaymentsWatchGrant.parse_obj(grant_data) - except ValueError: - continue - if grant.enabled and grant.wallet_id == wallet_id: - return True - return False - - -def _extension_has_permission(extension: Any, permission_id: str) -> bool: - return any( - ( - permission.get("id") - if isinstance(permission, dict) - else getattr(permission, "id", None) - ) - == permission_id - for permission in (extension.permissions or []) - ) - - -def _payment_extension_id(payment: Any) -> str | None: - if isinstance(payment.extension, str) and payment.extension: - return payment.extension - - extra = payment.extra or {} - tag = extra.get("tag") or payment.tag - return tag if isinstance(tag, str) and tag else None - - -async def _wasm_invoice_paid_owner_id(extension: Any, payment: Any) -> str | None: - source_id = _payment_source_id(payment) - source_tables = await _wasm_public_invoice_source_tables(extension.id) - if not source_id or not source_tables: - return None - - for source_table in source_tables: - owner_id = await storage_get_row_owner_id(extension.id, source_table, source_id) - if owner_id: - return owner_id - return None - - -def _payment_source_id(payment: Any) -> str | None: - extra = payment.extra or {} - source_id = extra.get("source_id") - return source_id if isinstance(source_id, str) and source_id else None - - -async def _wasm_public_invoice_source_tables(extension_id: str) -> list[str]: - installed_extension = await get_installed_extension(extension_id) - if not installed_extension: - return [] - return _wasm_public_invoice_source_tables_from_permissions( - installed_extension.permissions - ) - - -def _wasm_public_invoice_source_tables_from_permissions( - permissions: Iterable[Any], -) -> list[str]: - for permission in permissions: - permission_id = ( - permission.get("id") - if isinstance(permission, dict) - else getattr(permission, "id", None) - ) - if permission_id != "wallet.create_invoice_public": - continue - policies = ( - permission.get("policies") - if isinstance(permission, dict) - else getattr(permission, "policies", None) - ) - if not isinstance(policies, list): - return [] - return [ - source_policy["table"] - for source_policy in policies - if isinstance(source_policy, dict) - and isinstance(source_policy.get("table"), str) - and source_policy["table"] - ] - return [] - - -def _wasm_invoice_paid_export(config: Any) -> str | None: - return config.events.on_invoice_paid - - -def _is_wasm_event_export(extension: Any, export_name: str) -> bool: - for export in extension.exports: - if export.name == export_name: - return export.visibility == "event" - return False - - -def _wasm_invoice_paid_payload(payment: Any) -> dict[str, Any]: - return { - "checkingId": payment.checking_id, - "paymentHash": payment.payment_hash, - "walletId": payment.wallet_id, - "amount": payment.amount, - "fee": payment.fee, - "bolt11": payment.bolt11, - "memo": payment.memo, - "pending": payment.pending, - "status": payment.status, - "tag": payment.tag, - "extension": payment.extension, - "extra": payment.extra or {}, - "payment": json.loads(payment.json()), - } diff --git a/lnbits/core/wasm_ext/wasm/host.py b/lnbits/core/wasm_ext/wasm/host.py deleted file mode 100644 index e89779a70..000000000 --- a/lnbits/core/wasm_ext/wasm/host.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import annotations - -import asyncio -import re -from collections.abc import Mapping -from typing import Any - -from wasmtime import component - -from ..api.models import EmptyRequest -from ..api.registry import list_extension_api_methods -from ..api.runtime import ExtensionAPIHost - - -def add_extension_host_imports( - linker: Any, - api_host: ExtensionAPIHost, - event_loop: asyncio.AbstractEventLoop, -) -> None: - with linker.root() as root: - methods_by_interface: dict[str, list[Any]] = {} - for method in list_extension_api_methods(): - methods_by_interface.setdefault(method.host_interface, []).append(method) - - for host_interface, methods in methods_by_interface.items(): - with root.add_instance(f"lnbits:extension/{host_interface}") as host: - for method in methods: - host.add_func( - method.host_name.replace("_", "-"), - _make_host_import( - api_host, - method.method_id, - method.request_model is EmptyRequest, - event_loop, - ), - ) - - -def _make_host_import( - api_host: ExtensionAPIHost, - host_name: str, - empty_request: bool, - event_loop: asyncio.AbstractEventLoop, -) -> Any: - if empty_request: - - def empty_host_import(_store: Any) -> Any: - future = asyncio.run_coroutine_threadsafe( - api_host.invoke(host_name), event_loop - ) - response = future.result() - return _dict_to_component_record(response) - - return empty_host_import - - def host_import(_store: Any, request: Any = None) -> Any: - payload = _component_payload_to_dict(request) - future = asyncio.run_coroutine_threadsafe( - api_host.invoke(host_name, payload), event_loop - ) - response = future.result() - return _dict_to_component_record(response) - - return host_import - - -def _component_payload_to_dict(value: Any) -> dict[str, Any]: - if value is None: - return {} - if hasattr(value, "__dict__"): - return dict(value.__dict__) - if isinstance(value, Mapping): - return dict(value) - raise TypeError("WASM host function payload must be a record.") - - -def _dict_to_component_record(value: Mapping[str, Any]) -> Any: - - record = component.Record() - for key, item in value.items(): - setattr(record, _camel_to_kebab(key), _to_component_value(item)) - return record - - -def _to_component_value(value: Any) -> Any: - if isinstance(value, Mapping): - return _dict_to_component_record(value) - if isinstance(value, list): - return [_to_component_value(item) for item in value] - return value - - -def _camel_to_kebab(value: str) -> str: - return re.sub(r"([a-z0-9])([A-Z])", r"\1-\2", value).replace("_", "-").lower() diff --git a/lnbits/core/wasm_ext/wasm/invoke.py b/lnbits/core/wasm_ext/wasm/invoke.py deleted file mode 100644 index a13c968be..000000000 --- a/lnbits/core/wasm_ext/wasm/invoke.py +++ /dev/null @@ -1,279 +0,0 @@ -from __future__ import annotations - -import asyncio -import json -from collections.abc import Mapping -from typing import Any - -from wasmtime import Store, WasiConfig, component - -from lnbits.core.crud.extensions import get_installed_extension -from lnbits.core.db import core_app_extra -from lnbits.settings import settings - -from ..api.host import ExtensionHostAPI -from ..api.runtime import ExtensionAPIHost -from .component import _wasm_component, _wasm_engine -from .host import add_extension_host_imports -from .loader import WasmExtension - -_WASM_EPOCH_DEADLINE_TICKS = 1_000_000_000 -_WASM_UNLIMITED_FUEL = 2**63 - 1 - - -async def invoke_wasm_extension_export( - ext_id: str, - export_name: str, - payload: Mapping[str, Any] | None = None, - *, - user: Any | None = None, - access_token: str | None = None, - context: str = "user", - owner_id: str | None = None, - trigger_type: str = "unknown", - request_id: str | None = None, - method: str | None = None, - path: str | None = None, - event_type: str | None = None, - wallet_id: str | None = None, - payment_hash: str | None = None, - checking_id: str | None = None, - request_bytes: int | None = None, - context_data: dict | None = None, -) -> dict[str, Any]: - from lnbits.core.services.extensions import ( - finish_wasm_invocation, - get_wasm_invocation_stop_reason, - resolve_wasm_runtime_limits, - start_wasm_invocation, - stop_wasm_invocation, - wasm_invocation_stop_requested, - ) - - extension = _get_registered_extension(ext_id) - installed_extension = await _active_installed_extension(extension) - permissions = installed_extension.permissions - limits = resolve_wasm_runtime_limits(installed_extension) - payload = payload or {} - payload_size = _json_size(payload) - effective_request_bytes = ( - request_bytes if request_bytes is not None else payload_size - ) - _check_wasm_request_size(effective_request_bytes, limits) - invocation = await start_wasm_invocation( - extension_id=extension.id, - export_name=export_name, - trigger_type=trigger_type, - user_id=_user_id(user) or owner_id, - wallet_id=wallet_id, - request_id=request_id, - method=method, - path=path, - event_type=event_type, - payment_hash=payment_hash, - checking_id=checking_id, - request_bytes=effective_request_bytes, - context={"host_context": context, **(context_data or {})}, - runtime_limits=limits, - ) - api = ExtensionHostAPI( - extension.id, - permissions, - user_id=_user_id(user), - access_token=access_token, - context=context, - owner_id=owner_id, - invocation_id=invocation.id, - runtime_limits=limits, - ) - event_loop = asyncio.get_running_loop() - thread_task = asyncio.create_task( - asyncio.to_thread( - _invoke_wasm_extension_export_sync, - extension, - export_name, - payload, - api, - event_loop, - invocation.id, - limits, - ) - ) - max_execution_ms = limits["wasm_runtime_max_execution_ms"] - timed_out = False - finished = False - - try: - try: - if max_execution_ms > 0: - result = await asyncio.wait_for( - asyncio.shield(thread_task), - timeout=max_execution_ms / 1000, - ) - else: - result = await thread_task - except asyncio.TimeoutError as exc: - timed_out = True - stop_reason = "WASM execution time limit exceeded." - await stop_wasm_invocation(invocation.id, reason=stop_reason) - try: - result = await asyncio.wait_for( - asyncio.shield(thread_task), - timeout=2, - ) - except asyncio.TimeoutError: - await finish_wasm_invocation( - invocation.id, - status="timeout", - error_type="TimeoutError", - error_message=stop_reason, - stop_reason=stop_reason, - ) - finished = True - raise TimeoutError(stop_reason) from exc - - status = ( - "timeout" - if timed_out - else ( - "stopped" - if wasm_invocation_stop_requested(invocation.id) - else "completed" - ) - ) - await finish_wasm_invocation( - invocation.id, - status=status, - response_bytes=_json_size(result), - stop_reason=get_wasm_invocation_stop_reason(invocation.id), - ) - finished = True - return result - except Exception as exc: - if not finished: - await finish_wasm_invocation( - invocation.id, - status=( - "timeout" - if timed_out - else ( - "stopped" - if wasm_invocation_stop_requested(invocation.id) - else "failed" - ) - ), - error_type=exc.__class__.__name__, - error_message=str(exc), - stop_reason=get_wasm_invocation_stop_reason(invocation.id), - ) - raise - - -def _invoke_wasm_extension_export_sync( - extension: WasmExtension, - export_name: str, - payload: Mapping[str, Any], - api: ExtensionHostAPI, - event_loop: asyncio.AbstractEventLoop, - invocation_id: str, - limits: dict[str, int], -) -> dict[str, Any]: - from lnbits.core.services.extensions import attach_wasm_invocation_runtime - - engine = _wasm_engine(limits["wasm_runtime_max_wasm_stack_bytes"]) - store = Store(engine) - _set_store_limits(store, limits) - _set_store_fuel(store, limits) - store.set_epoch_deadline(_WASM_EPOCH_DEADLINE_TICKS) - attach_wasm_invocation_runtime(invocation_id, engine=engine, store=store) - store.set_wasi(WasiConfig()) - - linker = component.Linker(engine) - linker.add_wasip2() - add_extension_host_imports(linker, ExtensionAPIHost(api), event_loop) - - wasm_component = _wasm_component(extension, limits) - instance = linker.instantiate(store, wasm_component) - function = instance.get_func(store, export_name) - if not function: - raise KeyError( - f"WASM extension '{extension.id}' has no export '{export_name}'." - ) - - result = function(store, json.dumps(payload)) - function.post_return(store) - return _parse_wasm_export_result(result, limits) - - -def _parse_wasm_export_result(value: Any, limits: dict[str, int]) -> dict[str, Any]: - if isinstance(value, bytes): - value = value.decode() - if not isinstance(value, str): - return {"ok": True, "data": value} - - max_response_bytes = limits["wasm_runtime_max_response_bytes"] - if max_response_bytes > 0: - response_size = len(value.encode()) - if response_size > max_response_bytes: - raise ValueError( - f"WASM extension response is too large: {response_size} bytes." - ) - - parsed = json.loads(value) - if isinstance(parsed, dict): - return parsed - return {"ok": True, "data": parsed} - - -def _get_registered_extension(ext_id: str) -> WasmExtension: - extension = core_app_extra.wasm_extension_registry.get(ext_id) - if extension: - return extension - raise RuntimeError(f"WASM extension '{ext_id}' is not registered.") - - -async def _active_installed_extension(extension: WasmExtension) -> Any: - installed_extension = await get_installed_extension(extension.id) - if ( - not installed_extension - or settings.lnbits_extensions_deactivate_all - or not installed_extension.active - ): - raise PermissionError(f"WASM extension '{extension.id}' is deactivated.") - return installed_extension - - -def _user_id(user: Any | None) -> str | None: - return getattr(user, "id", None) if user else None - - -def _set_store_limits(store: Any, limits: dict[str, int]) -> None: - store.set_limits( - memory_size=_wasm_limit(limits["wasm_runtime_max_memory_bytes"]), - table_elements=_wasm_limit(limits["wasm_runtime_max_table_elements"]), - instances=_wasm_limit(limits["wasm_runtime_max_instances"]), - tables=_wasm_limit(limits["wasm_runtime_max_tables"]), - memories=_wasm_limit(limits["wasm_runtime_max_memories"]), - ) - - -def _set_store_fuel(store: Any, limits: dict[str, int]) -> None: - store.set_fuel( - limits["wasm_runtime_max_fuel"] - if limits["wasm_runtime_max_fuel"] > 0 - else _WASM_UNLIMITED_FUEL - ) - - -def _check_wasm_request_size(request_bytes: int, limits: dict[str, int]) -> None: - max_request_bytes = limits["wasm_runtime_max_request_bytes"] - if max_request_bytes > 0 and request_bytes > max_request_bytes: - raise ValueError(f"WASM extension request is too large: {request_bytes} bytes.") - - -def _wasm_limit(value: int) -> int: - return value if value > 0 else -1 - - -def _json_size(value: Any) -> int: - return len(json.dumps(value, default=str).encode()) diff --git a/lnbits/core/wasm_ext/wasm/loader.py b/lnbits/core/wasm_ext/wasm/loader.py deleted file mode 100644 index c62f03a06..000000000 --- a/lnbits/core/wasm_ext/wasm/loader.py +++ /dev/null @@ -1,107 +0,0 @@ -from __future__ import annotations - -import json -from dataclasses import dataclass -from pathlib import Path -from typing import Any - -from lnbits.core.wasm_ext.wasm.config import ( - WasmExtensionConfig, - WasmExtensionExport, - parse_wasm_extension_config, -) -from lnbits.settings import settings - - -@dataclass(frozen=True) -class WasmExtension: - id: str - name: str - version: str - root_path: Path - module_path: Path - wit_path: Path | None - world: str - exports: list[WasmExtensionExport] - config: WasmExtensionConfig - - -def is_wasm_extension_id(ext_id: str) -> bool: - ext_dir = Path(settings.wasm_extensions_dir, ext_id) - config = _load_json(ext_dir / "config.json") - return bool(config and config.get("extension_type") == "wasm") - - -def is_wasm_extension_dir(ext_dir: Path) -> bool: - config = _load_json(ext_dir / "config.json") - return bool(config and config.get("extension_type") == "wasm") - - -def load_wasm_extension_config(ext_id: str) -> WasmExtensionConfig | None: - ext_dir = Path(settings.wasm_extensions_dir, ext_id) - config = _load_json(ext_dir / "config.json") - if not config or config.get("extension_type") != "wasm": - return None - return parse_wasm_extension_config(ext_id, config) - - -def load_wasm_extension(ext_id: str) -> WasmExtension: - ext_dir = Path(settings.wasm_extensions_dir, ext_id) - raw_config = _load_json(ext_dir / "config.json") - if not raw_config: - raise FileNotFoundError(f"Missing WASM extension config for '{ext_id}'.") - if raw_config.get("extension_type") != "wasm": - raise ValueError(f"Extension '{ext_id}' is not a WASM extension.") - config = parse_wasm_extension_config(ext_id, raw_config) - - module_path = _extension_path(ext_dir, config.wasm.module) - wit_path = _optional_extension_path(ext_dir, config.wasm.wit) - _check_wasm_module(module_path) - if wit_path and not wit_path.is_file(): - raise FileNotFoundError(f"WIT file not found: {wit_path}") - - return WasmExtension( - id=config.id, - name=config.name, - version=config.version, - root_path=ext_dir, - module_path=module_path, - wit_path=wit_path, - world=config.wasm.world, - exports=config.wasm.exports, - config=config, - ) - - -def _load_json(path: Path) -> dict[str, Any] | None: - if not path.is_file(): - return None - with path.open("r", encoding="utf-8") as config_file: - value = json.load(config_file) - if not isinstance(value, dict): - raise ValueError(f"Expected JSON object in '{path}'.") - return value - - -def _extension_path(ext_dir: Path, value: Any) -> Path: - if not isinstance(value, str) or not value: - raise ValueError(f"Missing relative path for extension '{ext_dir.name}'.") - path = (ext_dir / value).resolve() - if ext_dir.resolve() not in path.parents: - raise ValueError(f"Extension path escapes extension root: {value}") - return path - - -def _optional_extension_path(ext_dir: Path, value: Any) -> Path | None: - if value is None: - return None - return _extension_path(ext_dir, value) - - -def _check_wasm_module(path: Path) -> None: - if not path.is_file(): - raise FileNotFoundError(f"WASM module not found: {path}") - with path.open("rb") as wasm_file: - magic = wasm_file.read(4) - if magic != b"\0asm": - raise ValueError(f"Invalid WASM module: {path}") diff --git a/lnbits/db.py b/lnbits/db.py index dc50b36ce..55c98ab9a 100644 --- a/lnbits/db.py +++ b/lnbits/db.py @@ -497,7 +497,7 @@ class Filter(BaseModel, Generic[TFilterModel]): validated, errors = compare_field.validate(raw_value, {}, loc="none") if errors: raise ValidationError(errors=[errors], model=model) - values[f"{field}__{i}_{index}"] = validated + values[f"{field}__{index}"] = validated else: raise ValueError("Unknown filter field") @@ -510,12 +510,11 @@ class Filter(BaseModel, Generic[TFilterModel]): for key in self.values.keys() if self.values else []: if self.model and self.model.__fields__[self.field].type_ == datetime: placeholder = compat_timestamp_placeholder(key) - else: - placeholder = f":{key}" - if self.op in {Operator.INCLUDE, Operator.EXCLUDE}: - stmt.append(placeholder) - else: stmt.append(f"{prefix}{self.field} {self.op.as_sql} {placeholder}") + if self.op in {Operator.INCLUDE, Operator.EXCLUDE}: + stmt.append(f":{key}") + else: + stmt.append(f"{prefix}{self.field} {self.op.as_sql} :{key}") if self.op in {Operator.INCLUDE, Operator.EXCLUDE}: statement = f"{prefix}{self.field} {self.op.as_sql} ({', '.join(stmt)})" @@ -726,20 +725,20 @@ def dict_to_model(_row: dict, model: type[TModel]) -> TModel: # noqa: C901 if get_origin(outertype_) is list: _items = _safe_load_json(value) if isinstance(value, str) else value _dict[key] = [ - dict_to_submodel(type_, v) if _is_subclass(type_, BaseModel) else v + dict_to_submodel(type_, v) if issubclass(type_, BaseModel) else v for v in _items ] continue - if _is_subclass(type_, bool): + if issubclass(type_, bool): _dict[key] = bool(value) continue - if _is_subclass(type_, datetime): + if issubclass(type_, datetime): if DB_TYPE == SQLITE: _dict[key] = datetime.fromtimestamp(value, timezone.utc) else: _dict[key] = value.replace(tzinfo=timezone.utc) continue - if _is_subclass(type_, BaseModel): + if issubclass(type_, BaseModel): _dict[key] = dict_to_submodel(type_, value) continue # TODO: remove this when all sub models are migrated to Pydantic @@ -764,13 +763,6 @@ def _safe_load_json(value: str) -> dict: return {} -def _is_subclass(type_: Any, class_or_tuple: type | tuple[type, ...]) -> bool: - try: - return issubclass(type_, class_or_tuple) - except TypeError: - return False - - def _valid_sql_name(name: str) -> bool: """Check if a SQL name is valid (alphanumeric and underscores only)""" return ( diff --git a/lnbits/decorators.py b/lnbits/decorators.py index a8b82d49c..1673b860f 100644 --- a/lnbits/decorators.py +++ b/lnbits/decorators.py @@ -448,7 +448,7 @@ async def _check_user_access(r: Request, user_id: str, conn: Connection | None = async def _check_user_extension_access( user_id: str, path: str, conn: Connection | None = None ): - ext_id = _extension_id_from_request_path(path) + ext_id = path_segments(path)[0] status = await check_user_extension_access(user_id, ext_id, conn=conn) if not status.success: raise HTTPException( @@ -457,15 +457,6 @@ async def _check_user_extension_access( ) -def _extension_id_from_request_path(path: str) -> str: - segments = path_segments(path) - if len(segments) >= 2 and segments[0] == "ext": - return segments[1] - if len(segments) >= 4 and segments[:3] == ["api", "v1", "ext"]: - return segments[3] - return segments[0] - - async def _get_account_from_token( access_token: str, path: str, method: str, conn: Connection | None = None ) -> Account | None: diff --git a/lnbits/fiat/revolut.py b/lnbits/fiat/revolut.py index fd3454f07..f8d54b6bd 100644 --- a/lnbits/fiat/revolut.py +++ b/lnbits/fiat/revolut.py @@ -283,7 +283,7 @@ class RevolutWallet(FiatProvider): return FiatSubscriptionResponse( ok=True, checkout_session_url=checkout_url, - subscription_request_id=revolut_subscription_id, + subscription_request_id=payment_options.subscription_request_id, ) except json.JSONDecodeError: return FiatSubscriptionResponse( @@ -302,15 +302,6 @@ class RevolutWallet(FiatProvider): **kwargs, ) -> FiatSubscriptionResponse: try: - subscription = await self.get_subscription(subscription_id) - reference = self.deserialize_subscription_reference( - subscription.get("external_reference") - ) - if not reference or reference.wallet_id != correlation_id: - return FiatSubscriptionResponse( - ok=False, error_message="Subscription not found." - ) - r = await self.client.post( f"/api/subscriptions/{subscription_id}/cancel", timeout=REVOLUT_REQUEST_TIMEOUT, diff --git a/lnbits/helpers.py b/lnbits/helpers.py index 1dc5b7aa3..88a001b34 100644 --- a/lnbits/helpers.py +++ b/lnbits/helpers.py @@ -13,7 +13,6 @@ from fastapi.routing import APIRoute from loguru import logger from packaging import version from pydantic.schema import field_schema -from random_username.generate import generate_username # type: ignore[import-untyped] from starlette.templating import Jinja2Templates from lnbits.settings import settings @@ -23,10 +22,6 @@ from lnbits.utils.exchange_rates import currencies from .db import FilterModel -def generate_ln_address() -> str: - return generate_username(1)[0].lower() - - def get_db_vendor_name(): db_url = settings.lnbits_database_url return ( @@ -315,7 +310,12 @@ def get_api_routes(routes: list) -> dict[str, str]: def path_segments(path: str) -> list[str]: path = path.strip("/") - return path.split("/") + segments = path.split("/") + if len(segments) < 2: + return segments + if segments[0] == "upgrades": + return segments[2:] + return segments[0:] def normalize_path(path: str | None) -> str: @@ -372,13 +372,3 @@ def sha256s(value: str) -> str: Returns the hex as a string. """ return hashlib.sha256(value.encode("utf-8")).hexdigest() - - -def daystart_timestamp(dt: datetime | None = None) -> int: - """ - Returns the timestamp of the start of the day for the given - datetime (or now in UTC if not provided). - """ - dt = dt or datetime.now(timezone.utc) - day_start = dt.replace(hour=0, minute=0, second=0, microsecond=0) - return int(day_start.timestamp()) diff --git a/lnbits/llms_txt.py b/lnbits/llms_txt.py deleted file mode 100644 index 13816c4b5..000000000 --- a/lnbits/llms_txt.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Generate llms.txt markdown from FastAPI OpenAPI schema for AI agents.""" - -from typing import Any - -from fastapi import FastAPI -from fastapi.responses import PlainTextResponse - - -def generate_llms_txt(app: FastAPI) -> str: - """Convert an OpenAPI schema to llms.txt markdown format.""" - openapi_schema = app.openapi() - lines: list[str] = [] - - # H1: API Title - info = openapi_schema.get("info", {}) - title = info.get("title", "API") - lines.append(f"# {title}") - lines.append("") - - # Blockquote: Description - description = info.get("description") - if description: - for line in description.strip().split("\n"): - lines.append(f"> {line}") - lines.append("") - - # Group endpoints by tag - paths = openapi_schema.get("paths", {}) - endpoints_by_tag: dict[str, list[dict[str, Any]]] = {} - - for path, path_item in paths.items(): - for method in ["get", "post", "put", "patch", "delete", "head", "options"]: - if method not in path_item: - continue - operation = path_item[method] - tags = operation.get("tags", ["Endpoints"]) - tag = tags[0] if tags else "Endpoints" - if tag not in endpoints_by_tag: - endpoints_by_tag[tag] = [] - endpoints_by_tag[tag].append( - { - "path": path, - "method": method.upper(), - "operation": operation, - } - ) - - # Generate sections by tag - for tag, endpoints in endpoints_by_tag.items(): - lines.append(f"## {tag}") - lines.append("") - for endpoint in endpoints: - method = endpoint["method"] - path = endpoint["path"] - operation = endpoint["operation"] - summary = operation.get("summary", "") - if summary: - lines.append(f"### `{method} {path}` - {summary}") - else: - lines.append(f"### `{method} {path}`") - lines.append("") - lines.append("") - - return "\n".join(lines).strip() + "\n" - - -def create_llms_txt_route(app: FastAPI) -> None: - """Add a /llms.txt endpoint to the app.""" - - @app.get( - "/llms.txt", - response_class=PlainTextResponse, - include_in_schema=False, - summary="Get LLM-friendly API documentation", - ) - async def get_llms_txt() -> str: - """Return the API documentation in llms.txt markdown format.""" - return generate_llms_txt(app) diff --git a/lnbits/middleware.py b/lnbits/middleware.py index d216786ac..dfa077885 100644 --- a/lnbits/middleware.py +++ b/lnbits/middleware.py @@ -51,6 +51,14 @@ class InstalledExtensionMiddleware: await self.app(scope, receive, send) return + # re-route all trafic if the extension has been upgraded + if top_path in settings.lnbits_upgraded_extensions: + upgrade_path = ( + f"""{settings.lnbits_upgraded_extensions[top_path]}/{top_path}""" + ) + tail = "/".join(rest) + scope["path"] = f"/upgrades/{upgrade_path}/{tail}" + await self.app(scope, receive, send) def _response_by_accepted_type( @@ -104,7 +112,7 @@ class ExtensionsRedirectMiddleware: req_headers = scope["headers"] if "headers" in scope else [] redirect = settings.find_extension_redirect(scope["path"], req_headers) - if redirect and not redirect.is_duplicate_well_known(): + if redirect: scope["path"] = redirect.new_path_from(scope["path"]) await self.app(scope, receive, send) diff --git a/lnbits/server.py b/lnbits/server.py index 6fbf078c7..51a26d3eb 100644 --- a/lnbits/server.py +++ b/lnbits/server.py @@ -27,8 +27,6 @@ from lnbits.settings import set_cli_settings, settings @click.option( "--reload", is_flag=True, default=False, help="Enable auto-reload for development" ) -@click.option("--ws-max-queue", default=128, help="Websocket max queue size") -@click.option("--ws-ping-timeout", default=60.0, help="Websocket ping timeout") def main( port: int, host: str, @@ -36,8 +34,6 @@ def main( ssl_keyfile: str, ssl_certfile: str, reload: bool, - ws_max_queue: int, - ws_ping_timeout: float, ): """Launched with `uv run lnbits` at root level""" @@ -49,7 +45,6 @@ def main( Path(settings.lnbits_extensions_path, "extensions").mkdir( parents=True, exist_ok=True ) - settings.wasm_extensions_dir.mkdir(parents=True, exist_ok=True) set_cli_settings(host=host, port=port, forwarded_allow_ips=forwarded_allow_ips) @@ -63,8 +58,6 @@ def main( ssl_keyfile=ssl_keyfile, ssl_certfile=ssl_certfile, reload=reload or False, - ws_ping_timeout=ws_ping_timeout, - ws_max_queue=ws_max_queue, ) server = uvicorn.Server(config=config) diff --git a/lnbits/settings.py b/lnbits/settings.py index 7727d0c11..49e9eb5c6 100644 --- a/lnbits/settings.py +++ b/lnbits/settings.py @@ -11,16 +11,12 @@ from enum import Enum from os import path from pathlib import Path from time import gmtime, strftime, time -from typing import Any, Literal +from typing import Any from uuid import uuid4 from loguru import logger from pydantic import BaseModel, BaseSettings, Extra, Field, validator -DEFAULT_WASM_MANIFESTS = [ - "https://raw.githubusercontent.com/lnbits/lnbits-extensions-wasm/refs/heads/main/extensions.json" -] - def list_parse_fallback(v: str): v = v.replace(" ", "") @@ -45,16 +41,6 @@ class UsersSettings(LNbitsSettings): lnbits_admin_users: list[str] = Field(default=[]) lnbits_allowed_users: list[str] = Field(default=[]) lnbits_allow_new_accounts: bool = Field(default=True) - - lnbits_ln_address_mode: Literal[ - "core_first", "extension_first", "extension_only" - ] = Field(default="extension_first") - lnbits_allow_custom_wallet_lightning_addresses: bool = Field(default=False) - lnbits_charge_wallet_lightning_addresses: bool = Field(default=False) - lnbits_wallet_lightning_address_price_sats: int = Field(default=1000, ge=0) - lnbits_wallet_lightning_address_blacklist: list[str] = Field( - default=["admin", "info", "support", "help", "security"] - ) lnbits_require_user_activation: bool = Field(default=False) lnbits_user_activation_by_email: bool = Field(default=False) @@ -68,17 +54,12 @@ class UsersSettings(LNbitsSettings): def new_accounts_allowed(self) -> bool: return self.lnbits_allow_new_accounts and len(self.lnbits_allowed_users) == 0 - @property - def ln_address_creation_allowed(self) -> bool: - return self.lnbits_ln_address_mode != "extension_only" - class ExtensionsSettings(LNbitsSettings): lnbits_admin_extensions: list[str] = Field(default=[]) lnbits_user_default_extensions: list[str] = Field(default=[]) lnbits_extensions_deactivate_all: bool = Field(default=False) lnbits_extensions_builder_activate_non_admins: bool = Field(default=False) - lnbits_wasm_invocation_retention_days: int = Field(default=7, ge=0) lnbits_extensions_reviews_url: str = Field( default="https://demo.lnbits.com/paidreviews/api/v1/AdFzLjzuKFLsdk4Bcnff6r", description=""" @@ -91,7 +72,6 @@ class ExtensionsSettings(LNbitsSettings): "https://raw.githubusercontent.com/lnbits/lnbits-extensions/main/extensions.json" ] ) - lnbits_wasm_extensions_manifests: list[str] = Field(default=DEFAULT_WASM_MANIFESTS) lnbits_extensions_builder_manifest_url: str = Field( default="https://raw.githubusercontent.com/lnbits/extension_builder_stub/refs/heads/main/manifest.json" ) @@ -101,33 +81,6 @@ class ExtensionsSettings(LNbitsSettings): return Path(settings.lnbits_data_folder, "extensions_builder") -class WasmRuntimeLimits(LNbitsSettings): - # 0 disables the limit. Installed WASM extensions may override these defaults. - wasm_runtime_max_memory_bytes: int = Field(default=64 * 1024 * 1024, ge=0) - wasm_runtime_max_execution_ms: int = Field(default=5_000, ge=0) - wasm_runtime_max_fuel: int = Field(default=100_000_000, ge=0) - wasm_runtime_max_response_bytes: int = Field(default=1024 * 1024, ge=0) - wasm_runtime_max_request_bytes: int = Field(default=1024 * 1024, ge=0) - wasm_runtime_max_wasm_stack_bytes: int = Field(default=1024 * 1024, ge=0) - - wasm_runtime_max_table_elements: int = Field(default=10_000, ge=0) - wasm_runtime_max_instances: int = Field(default=8, ge=0) - wasm_runtime_max_tables: int = Field(default=10, ge=0) - wasm_runtime_max_memories: int = Field(default=1, ge=0) - - wasm_runtime_max_concurrent_invocations: int = Field(default=16, ge=0) - wasm_runtime_max_concurrent_invocations_per_extension: int = Field(default=4, ge=0) - wasm_runtime_max_concurrent_invocations_per_user: int = Field(default=4, ge=0) - - wasm_runtime_max_host_calls: int = Field(default=1_000, ge=0) - wasm_runtime_max_http_calls: int = Field(default=20, ge=0) - wasm_runtime_max_storage_calls: int = Field(default=100, ge=0) - wasm_runtime_max_wallet_calls: int = Field(default=20, ge=0) - - wasm_runtime_http_timeout_ms: int = Field(default=5_000, ge=0) - wasm_runtime_max_http_response_bytes: int = Field(default=1024 * 1024, ge=0) - - class ExtensionsInstallSettings(LNbitsSettings): lnbits_extensions_default_install: list[str] = Field(default=[]) # required due to GitHUb rate-limit @@ -140,9 +93,6 @@ class RedirectPath(BaseModel): redirect_to_path: str header_filters: dict = {} - def is_duplicate_well_known(self) -> bool: - return self.from_path in ["/.well-known/lnurlp"] - def in_conflict(self, other: RedirectPath) -> bool: if self.ext_id == other.ext_id: return False @@ -216,6 +166,8 @@ class ExchangeRateProvider(BaseModel): class InstalledExtensionsSettings(LNbitsSettings): # installed extensions that have been deactivated lnbits_deactivated_extensions: set[str] = Field(default=set()) + # upgraded extensions that require API redirects + lnbits_upgraded_extensions: dict[str, str] = Field(default={}) # list of redirects that extensions want to perform lnbits_extensions_redirects: list[RedirectPath] = Field(default=[]) @@ -238,10 +190,18 @@ class InstalledExtensionsSettings(LNbitsSettings): def activate_extension_paths( self, ext_id: str, + upgrade_hash: str | None = None, ext_redirects: list[dict] | None = None, ): self.lnbits_deactivated_extensions.discard(ext_id) + """ + Update the list of upgraded extensions. The middleware will perform + redirects based on this + """ + if upgrade_hash: + self.lnbits_upgraded_extensions[ext_id] = upgrade_hash + if ext_redirects: self._activate_extension_redirects(ext_id, ext_redirects) @@ -251,6 +211,9 @@ class InstalledExtensionsSettings(LNbitsSettings): self.lnbits_deactivated_extensions.add(ext_id) self._remove_extension_redirects(ext_id) + def extension_upgrade_hash(self, ext_id: str) -> str: + return settings.lnbits_upgraded_extensions.get(ext_id, "") + def _activate_extension_redirects(self, ext_id: str, ext_redirects: list[dict]): ext_redirect_paths = [ RedirectPath(**{"ext_id": ext_id, **er}) for er in ext_redirects @@ -396,11 +359,9 @@ class FeeSettings(LNbitsSettings): class ExchangeProvidersSettings(LNbitsSettings): - lnbits_exchange_rate_cache_seconds: int = Field(default=60, ge=0) + lnbits_exchange_rate_cache_seconds: int = Field(default=30, ge=0) lnbits_exchange_history_size: int = Field(default=60, ge=0) lnbits_exchange_history_refresh_interval_seconds: int = Field(default=300, ge=0) - lnbits_price_aggregator_enabled: bool = Field(default=True) - lnbits_price_aggregator_url: str = Field(default="https://price.lnbits.com") lnbits_exchange_rate_providers: list[ExchangeRateProvider] = Field( default=[ @@ -533,11 +494,6 @@ class NotificationsSettings(LNbitsSettings): and self.lnbits_telegram_notifications_access_token is not None ) - def is_email_notifications_configured(self) -> bool: - return self.lnbits_email_notifications_enabled and bool( - self.lnbits_email_notifications_email - ) - class FakeWalletFundingSource(LNbitsSettings): fake_wallet_secret: str = Field(default="ToTheMoon1") @@ -606,7 +562,6 @@ class LndGrpcFundingSource(LNbitsSettings): lnd_grpc_invoice_macaroon: str | None = Field(default=None) lnd_grpc_macaroon: str | None = Field(default=None) lnd_grpc_macaroon_encrypted: str | None = Field(default=None) - lnd_grpc_allow_self_payment: bool = Field(default=False) class LnPayFundingSource(LNbitsSettings): @@ -620,10 +575,6 @@ class BlinkFundingSource(LNbitsSettings): blink_api_endpoint: str | None = Field(default="https://api.blink.sv/graphql") blink_ws_endpoint: str | None = Field(default="wss://ws.blink.sv/graphql") blink_token: str | None = Field(default=None) - # If probing fails or is unsupported by the destination (e.g. fedimints), - # send the payment anyway. Blink reserves its max fee and reconciles any - # excess separately. If disabled, payments that cannot be probed will fail. - blink_send_without_probe: bool = Field(default=True) class ZBDFundingSource(LNbitsSettings): @@ -636,7 +587,6 @@ class PhoenixdFundingSource(LNbitsSettings): phoenixd_api_password: str | None = Field(default=None) phoenixd_data_dir: str | None = Field(default=None) phoenixd_mnemonic: str | None = Field(default=None) - phoenixd_mnemonic_backup_confirmed: bool = Field(default=False) class AlbyFundingSource(LNbitsSettings): @@ -656,17 +606,11 @@ class SparkFundingSource(LNbitsSettings): spark_token: str | None = Field(default=None) -class BarkFundingSource(LNbitsSettings): - bark_api_endpoint: str | None = Field(default="http://localhost:3000") - bark_api_token: str | None = Field(default=None) - - class SparkL2FundingSource(LNbitsSettings): spark_l2_network: str = Field(default="MAINNET") spark_l2_external_endpoint: str | None = Field(default="http://localhost:8765") spark_l2_external_api_key: str | None = Field(default=None) spark_l2_mnemonic: str | None = Field(default=None) - spark_l2_mnemonic_backup_confirmed: bool = Field(default=False) spark_l2_pay_wait_ms: int = Field(default=4000, ge=0) spark_l2_pay_poll_ms: int = Field(default=500, ge=0) spark_l2_stream_keepalive_ms: int = Field(default=15000, ge=0) @@ -704,7 +648,6 @@ class BoltzFundingSource(LNbitsSettings): boltz_client_password: str = Field(default="") boltz_client_cert: str | None = Field(default=None) boltz_mnemonic: str | None = Field(default=None) - boltz_mnemonic_backup_confirmed: bool = Field(default=False) class StrikeFundingSource(LNbitsSettings): @@ -807,7 +750,6 @@ class FundingSourcesSettings( PhoenixdFundingSource, OpenNodeFundingSource, SparkFundingSource, - BarkFundingSource, SparkL2FundingSource, LnTipsFundingSource, NWCFundingSource, @@ -898,16 +840,6 @@ class NodeUISettings(LNbitsSettings): lnbits_node_ui_transactions: bool = Field(default=False) -class BlockExplorerSettings(LNbitsSettings): - lnbits_blockexplorer_enabled: bool = Field(default=False) - lnbits_blockexplorer_public_api: bool = Field(default=False) - lnbits_blockexplorer_electrum_url: str = Field( - default="ssl://electrum.blockstream.info:50002" - ) - # one of: main, test, regtest, signet (see embit.networks.NETWORKS) - lnbits_blockexplorer_network: str = Field(default="main") - - class AuthMethods(Enum): user_id_only = "user-id-only" username_and_password = "username-password" # noqa: S105 @@ -1069,7 +1001,6 @@ class AuditSettings(LNbitsSettings): class EditableSettings( UsersSettings, ExtensionsSettings, - WasmRuntimeLimits, ThemesSettings, OpsSettings, AssetSettings, @@ -1082,7 +1013,6 @@ class EditableSettings( LightningSettings, WebPushSettings, NodeUISettings, - BlockExplorerSettings, AuditSettings, AuthSettings, NostrAuthSettings, @@ -1094,11 +1024,8 @@ class EditableSettings( @validator( "lnbits_admin_users", "lnbits_allowed_users", - "lnbits_wallet_lightning_address_blacklist", "lnbits_theme_options", "lnbits_admin_extensions", - "lnbits_extensions_manifests", - "lnbits_wasm_extensions_manifests", pre=True, ) @classmethod @@ -1145,12 +1072,11 @@ class EnvSettings(LNbitsSettings): log_rotation: str = Field(default="100 MB") log_retention: str = Field(default="3 months") first_install_token: str | None = Field(default=None) + cleanup_wallets_days: int = Field(default=90, ge=0) funding_source_max_retries: int = Field(default=4, ge=0) lnbits_max_users: int = Field(default=0, ge=0) lnbits_max_extensions: int = Field(default=0, ge=0) - task_heart_beat_verbose: bool = Field(default=False) - task_heart_beat_interval: int = Field(default=30) @property def has_default_extension_path(self) -> bool: @@ -1181,39 +1107,12 @@ class EnvSettings(LNbitsSettings): class PersistenceSettings(LNbitsSettings): lnbits_data_folder: str = Field(default="./data") lnbits_database_url: str | None = Field(default=None) - lnbits_wasm_extensions_path: str = Field(default="") - - @validator("lnbits_wasm_extensions_path", pre=True, always=True) - @classmethod - def validate_wasm_extensions_path(cls, value, values) -> str: - if value: - return str(value) - return str(Path(values.get("lnbits_data_folder", "./data"), "wasm_extensions")) - - @property - def wasm_extensions_dir(self) -> Path: - wasm_dir = Path(self.lnbits_wasm_extensions_path) - importable_dirs = ( - Path(getattr(self, "lnbits_extensions_path", "lnbits"), "extensions"), - Path(self.lnbits_data_folder, "upgrades"), - ) - resolved_wasm_dir = wasm_dir.resolve() - if any( - resolved_dir == resolved_wasm_dir - or resolved_dir in resolved_wasm_dir.parents - for resolved_dir in (path.resolve() for path in importable_dirs) - ): - raise ValueError( - "WASM extensions path must be outside importable extension directories." - ) - return wasm_dir class SuperUserSettings(LNbitsSettings): lnbits_allowed_funding_sources: list[str] = Field( default=[ "AlbyWallet", - "BarkWallet", "BoltzWallet", "BlinkWallet", "BreezSdkWallet", @@ -1363,7 +1262,6 @@ class PublicSettings(BaseModel): webpush_pubkey: str | None = Field(alias="webpushPubkey") show_extensions: bool = Field(alias="showExtensions") show_audit: bool = Field(alias="showAudit") - show_block_explorer: bool = Field(alias="showBlockExplorer") show_admin: bool = Field(alias="showAdmin") ad_space: list[list[str]] = Field(alias="adSpace") ad_space_title: str = Field(alias="adSpaceTitle") @@ -1391,23 +1289,10 @@ class PublicSettings(BaseModel): extensions_reviews_url: str = Field(alias="extensionsReviewsUrl") ext_builder: bool = Field(alias="extBuilder") nostr_configured: bool = Field(alias="nostrConfigured") - email_configured: bool = Field(alias="emailConfigured") telegram_configured: bool = Field(alias="telegramConfigured") wallet_featured_button_label: str | None = Field(alias="walletFeaturedButtonLabel") wallet_featured_button_url: str | None = Field(alias="walletFeaturedButtonUrl") wallet_featured_button_icon: str | None = Field(alias="walletFeaturedButtonIcon") - enable_wallet_lightning_addresses: bool = Field( - alias="enableWalletLightningAddresses" - ) - allow_custom_wallet_lightning_addresses: bool = Field( - alias="allowCustomWalletLightningAddresses" - ) - charge_wallet_lightning_addresses: bool = Field( - alias="chargeWalletLightningAddresses" - ) - wallet_lightning_address_price_sats: int = Field( - alias="walletLightningAddressPriceSats" - ) lnbits_user_activation_by_email: bool = Field(alias="userActivationByEmail") lnbits_user_activation_by_payment: bool = Field(alias="userActivationByPayment") lnbits_user_activation_by_invitation_code: bool = Field( @@ -1444,7 +1329,6 @@ class PublicSettings(BaseModel): webpushPubkey=settings.lnbits_webpush_pubkey, showExtensions=not settings.lnbits_extensions_deactivate_all, showAudit=settings.lnbits_audit_enabled, - showBlockExplorer=settings.lnbits_blockexplorer_enabled, showAdmin=settings.lnbits_admin_ui, customImage=settings.lnbits_custom_image, customBadge=settings.lnbits_custom_badge, @@ -1469,21 +1353,10 @@ class PublicSettings(BaseModel): extensionsReviewsUrl=settings.lnbits_extensions_reviews_url, extBuilder=settings.lnbits_extensions_builder_activate_non_admins, nostrConfigured=settings.is_nostr_notifications_configured(), - emailConfigured=settings.is_email_notifications_configured(), telegramConfigured=settings.is_telegram_notifications_configured(), walletFeaturedButtonLabel=settings.lnbits_wallet_featured_button_label, walletFeaturedButtonUrl=settings.lnbits_wallet_featured_button_url, walletFeaturedButtonIcon=settings.lnbits_wallet_featured_button_icon, - enableWalletLightningAddresses=settings.ln_address_creation_allowed, - allowCustomWalletLightningAddresses=( - settings.lnbits_allow_custom_wallet_lightning_addresses - ), - chargeWalletLightningAddresses=( - settings.lnbits_charge_wallet_lightning_addresses - ), - walletLightningAddressPriceSats=( - settings.lnbits_wallet_lightning_address_price_sats - ), userActivationByEmail=settings.lnbits_user_activation_by_email, userActivationByPayment=settings.lnbits_user_activation_by_payment, userActivationByInvitationCode=settings.lnbits_user_activation_by_invitation_code, diff --git a/lnbits/static/bundle-components.min.js b/lnbits/static/bundle-components.min.js index 5c38feff2..dba2f14a3 100644 --- a/lnbits/static/bundle-components.min.js +++ b/lnbits/static/bundle-components.min.js @@ -1 +1 @@ -window.PageError={template:"#page-error"},window.PageHome={template:"#page-home",data:()=>({lnurl:"",authAction:"login",authMethod:"username-password",usr:"",username:"",reset_key:"",email:"",password:"",passwordRepeat:"",invitationCode:"",walletName:"",signup:!1}),computed:{showClaimLnurl(){return""!==this.lnurl&&this.g.settings.allowRegister&&this.g.settings.authMethods.includes("user-id-only")},formatDescription(){return LNbits.utils.convertMarkdown(this.g.settings.siteDescription)},isAccessTokenExpired(){return this.$q.cookies.get("is_access_token_expired")}},methods:{showLogin(e){this.authAction="login",this.authMethod=e},showRegister(e){this.user="",this.username=null,this.password=null,this.passwordRepeat=null,this.invitationCode=null,this.authAction="register",this.authMethod=e},async register(){try{await LNbits.api.register(this.username,this.email,this.password,this.passwordRepeat,this.invitationCode),this.refreshAuthUser()}catch(e){LNbits.utils.notifyApiError(e)}},async reset(){try{await LNbits.api.reset(this.reset_key,this.password,this.passwordRepeat),this.refreshAuthUser()}catch(e){LNbits.utils.notifyApiError(e)}},async login(){try{await LNbits.api.login(this.username,this.password),this.refreshAuthUser()}catch(e){LNbits.utils.notifyApiError(e)}},async loginUsr(){try{await LNbits.api.loginUsr(this.usr),this.refreshAuthUser()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async refreshAuthUser(){try{const e=await LNbits.api.getAuthUser();this.g.user=LNbits.map.user(e.data),this.g.isPublicPage=!1,this.$router.push(`/wallet/${this.g.user.wallets[0].id}`)}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},createWallet(){LNbits.api.createAccount(this.walletName).then(e=>{this.$router.push(`/wallet/${e.data.id}`)})},processing(){Quasar.Notify.create({timeout:0,message:"Processing...",icon:null})}},created(){if(this.g.isUserAuthorized)return this.refreshAuthUser();const e=new URLSearchParams(window.location.search);this.reset_key=e.get("reset_key"),this.reset_key&&(this.authAction="reset"),e.has("lightning")&&(this.lnurl=e.get("lightning"))}},window.PageExtensionBuilder={template:"#page-extension-builder",data:()=>({step:1,previewStepNames:{2:"settings",3:"owner_data",4:"client_data",5:"public_page"},extensionDataCleanString:"",extensionData:{id:"",name:"",stub_version:"",short_description:"",description:"",public_page:{has_public_page:!0,owner_data_fields:{name:"",description:""},client_data_fields:{public_inputs:[]},action_fields:{generate_action:!0,generate_payment_logic:!1,wallet_id:"",currency:"",amount:"",paid_flag:""}},preview_action:{is_preview_mode:!1,is_settings_preview:!1,is_owner_data_preview:!1,is_client_data_preview:!1,is_public_page_preview:!1},settings_data:{name:"Settings",enabled:!0,type:"user",fields:[]},owner_data:{name:"OwnerData",fields:[]},client_data:{enabled:!0,name:"ClientData",fields:[]}},sampleField:{name:"name",type:"str",label:"Name",hint:"",optional:!0,editable:!0,searchable:!0,sortable:!0},settingsTypes:[{label:"User Settings",value:"user"},{label:"Admin Settings",value:"admin"}],amountSource:[{label:"Client Data",value:"client_data"},{label:"Owner Data",value:"owner_data"}],extensionStubVersions:[]}),watch:{"extensionData.public_page.action_fields.amount_source":function(e,t){t&&e!==t&&(this.extensionData.public_page.action_fields.amount="")}},computed:{paymentActionAmountFields(){const e=this.extensionData.public_page.action_fields.amount_source;return e?"owner_data"===e?[""].concat(this.extensionData.owner_data.fields.filter(e=>"int"===e.type||"float"===e.type).map(e=>e.name)):"client_data"===e?[""].concat(this.extensionData.client_data.fields.filter(e=>"int"===e.type||"float"===e.type).map(e=>e.name)):void 0:[""]}},methods:{saveState(){this.$q.localStorage.set("lnbits.extension.builder.data",JSON.stringify(this.extensionData)),this.$q.localStorage.set("lnbits.extension.builder.step",this.step)},nextStep(){this.saveState(),this.$refs.stepper.next(),this.refreshPreview()},previousStep(){this.saveState(),this.$refs.stepper.previous(),this.refreshPreview()},onStepChange(){this.saveState(),this.refreshPreview()},clearAllData(){LNbits.utils.confirmDialog("Are you sure you want to clear all data? This action cannot be undone.").onOk(()=>{this.extensionData=JSON.parse(this.extensionDataCleanString),this.$q.localStorage.remove("lnbits.extension.builder.data"),this.$refs.stepper.set(1)})},exportJsonData(){!0!==Quasar.exportFile(`${this.extensionData.id||"data-export"}.json`,JSON.stringify(this.extensionData,null,2),"text/json")?Quasar.Notify.create({message:"Browser denied file download...",color:"negative",icon:null}):Quasar.Notify.create({message:"File downloaded!",color:"positive",icon:"file_download"})},onJsonDataInput(e){const t=e.target.files[0],s=new FileReader;s.onload=e=>{this.extensionData={...this.extensionData,...JSON.parse(e.target.result)},this.$refs.extensionDataInput.value=null,Quasar.Notify.create({message:"File loaded!",color:"positive",icon:"file_upload"})},s.readAsText(t)},async buildExtension(){try{const e={responseType:"blob"},t=await LNbits.api.request("POST","/api/v1/extension/builder/zip",null,this.extensionData,e),s=window.URL.createObjectURL(new Blob([t.data])),a=document.createElement("a");a.href=s,a.download=`${this.extensionData.id||"lnbits-extension"}.zip`,document.body.appendChild(a),a.click(),a.remove(),window.URL.revokeObjectURL(s)}catch(e){LNbits.utils.notifyApiError(e)}},async buildExtensionAndDeploy(){try{const{data:e}=await LNbits.api.request("POST","/api/v1/extension/builder/deploy",null,this.extensionData);Quasar.Notify.create({message:e.message||"Extension deployed!",color:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}},async cleanCacheData(){LNbits.utils.confirmDialog("Are you sure you want to clean the cache data? This action cannot be undone.","Clean Cache Data").onOk(async()=>{try{const{data:e}=await LNbits.api.request("DELETE","/api/v1/extension/builder",null,{});Quasar.Notify.create({message:e.message||"Cache data cleaned!",color:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}})},async previewExtension(e){this.saveState();try{await LNbits.api.request("POST","/api/v1/extension/builder/preview",null,{...this.extensionData,preview_action:{is_preview_mode:!!e,is_settings_preview:"settings"===e,is_owner_data_preview:"owner_data"===e,is_client_data_preview:"client_data"===e,is_public_page_preview:"public_page"===e}}),this.refreshIframe(e)}catch(e){LNbits.utils.notifyApiError(e)}},async refreshPreview(){setTimeout(()=>{const e=this.previewStepNames[`${this.step}`]||"";e&&this.previewExtension(e)},100)},async getStubExtensionReleases(){try{const e="extension_builder_stub",{data:t}=await LNbits.api.request("GET",`/api/v1/extension/${e}/releases`);this.extensionStubVersions=t;const s=t.filter(e=>e.is_version_compatible);this.extensionData.stub_version=s[0]?s[0].version:""}catch(e){LNbits.utils.notifyApiError(e)}},refreshIframe(e=""){const t=this.$refs[`iframeStep${this.step}`];if(!t)return void console.warn("Extension Builder Preview iframe not loaded yet.");t.onload=()=>{const e=t.contentDocument||t.contentWindow.document;e.body.style.transform="scale(0.8)",e.body.style.transformOrigin="center top"};let s="Page"+this.extensionData.id.toLowerCase().split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("");"public_page"===e&&(s+="Public"),t.src=`/extensions/builder/preview?ext_id=${this.extensionData.id}&page=${e}&component=${s}`},initBasicData(){this.extensionData.owner_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionData.client_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionData.settings_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionDataCleanString=JSON.stringify(this.extensionData)}},created(){this.initBasicData();const e=this.$q.localStorage.getItem("lnbits.extension.builder.data");e&&(this.extensionData={...this.extensionData,...JSON.parse(e)});const t=+this.$q.localStorage.getItem("lnbits.extension.builder.step");t&&(this.step=t),this.g.user.admin&&this.getStubExtensionReleases(),setTimeout(()=>{this.refreshIframe()},1e3)}},window.PageExtensionBuilder={template:"#page-extension-builder",data:()=>({step:1,previewStepNames:{2:"settings",3:"owner_data",4:"client_data",5:"public_page"},extensionDataCleanString:"",extensionData:{id:"",name:"",stub_version:"",short_description:"",description:"",public_page:{has_public_page:!0,owner_data_fields:{name:"",description:""},client_data_fields:{public_inputs:[]},action_fields:{generate_action:!0,generate_payment_logic:!1,wallet_id:"",currency:"",amount:"",paid_flag:""}},preview_action:{is_preview_mode:!1,is_settings_preview:!1,is_owner_data_preview:!1,is_client_data_preview:!1,is_public_page_preview:!1},settings_data:{name:"Settings",enabled:!0,type:"user",fields:[]},owner_data:{name:"OwnerData",fields:[]},client_data:{enabled:!0,name:"ClientData",fields:[]}},sampleField:{name:"name",type:"str",label:"Name",hint:"",optional:!0,editable:!0,searchable:!0,sortable:!0},settingsTypes:[{label:"User Settings",value:"user"},{label:"Admin Settings",value:"admin"}],amountSource:[{label:"Client Data",value:"client_data"},{label:"Owner Data",value:"owner_data"}],extensionStubVersions:[]}),watch:{"extensionData.public_page.action_fields.amount_source":function(e,t){t&&e!==t&&(this.extensionData.public_page.action_fields.amount="")}},computed:{paymentActionAmountFields(){const e=this.extensionData.public_page.action_fields.amount_source;return e?"owner_data"===e?[""].concat(this.extensionData.owner_data.fields.filter(e=>"int"===e.type||"float"===e.type).map(e=>e.name)):"client_data"===e?[""].concat(this.extensionData.client_data.fields.filter(e=>"int"===e.type||"float"===e.type).map(e=>e.name)):void 0:[""]}},methods:{saveState(){this.$q.localStorage.set("lnbits.extension.builder.data",JSON.stringify(this.extensionData)),this.$q.localStorage.set("lnbits.extension.builder.step",this.step)},nextStep(){this.saveState(),this.$refs.stepper.next(),this.refreshPreview()},previousStep(){this.saveState(),this.$refs.stepper.previous(),this.refreshPreview()},onStepChange(){this.saveState(),this.refreshPreview()},clearAllData(){LNbits.utils.confirmDialog("Are you sure you want to clear all data? This action cannot be undone.").onOk(()=>{this.extensionData=JSON.parse(this.extensionDataCleanString),this.$q.localStorage.remove("lnbits.extension.builder.data"),this.$refs.stepper.set(1)})},exportJsonData(){!0!==Quasar.exportFile(`${this.extensionData.id||"data-export"}.json`,JSON.stringify(this.extensionData,null,2),"text/json")?Quasar.Notify.create({message:"Browser denied file download...",color:"negative",icon:null}):Quasar.Notify.create({message:"File downloaded!",color:"positive",icon:"file_download"})},onJsonDataInput(e){const t=e.target.files[0],s=new FileReader;s.onload=e=>{this.extensionData={...this.extensionData,...JSON.parse(e.target.result)},this.$refs.extensionDataInput.value=null,Quasar.Notify.create({message:"File loaded!",color:"positive",icon:"file_upload"})},s.readAsText(t)},async buildExtension(){try{const e={responseType:"blob"},t=await LNbits.api.request("POST","/api/v1/extension/builder/zip",null,this.extensionData,e),s=window.URL.createObjectURL(new Blob([t.data])),a=document.createElement("a");a.href=s,a.download=`${this.extensionData.id||"lnbits-extension"}.zip`,document.body.appendChild(a),a.click(),a.remove(),window.URL.revokeObjectURL(s)}catch(e){LNbits.utils.notifyApiError(e)}},async buildExtensionAndDeploy(){try{const{data:e}=await LNbits.api.request("POST","/api/v1/extension/builder/deploy",null,this.extensionData);Quasar.Notify.create({message:e.message||"Extension deployed!",color:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}},async cleanCacheData(){LNbits.utils.confirmDialog("Are you sure you want to clean the cache data? This action cannot be undone.","Clean Cache Data").onOk(async()=>{try{const{data:e}=await LNbits.api.request("DELETE","/api/v1/extension/builder",null,{});Quasar.Notify.create({message:e.message||"Cache data cleaned!",color:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}})},async previewExtension(e){this.saveState();try{await LNbits.api.request("POST","/api/v1/extension/builder/preview",null,{...this.extensionData,preview_action:{is_preview_mode:!!e,is_settings_preview:"settings"===e,is_owner_data_preview:"owner_data"===e,is_client_data_preview:"client_data"===e,is_public_page_preview:"public_page"===e}}),this.refreshIframe(e)}catch(e){LNbits.utils.notifyApiError(e)}},async refreshPreview(){setTimeout(()=>{const e=this.previewStepNames[`${this.step}`]||"";e&&this.previewExtension(e)},100)},async getStubExtensionReleases(){try{const e="extension_builder_stub",{data:t}=await LNbits.api.request("GET",`/api/v1/extension/${e}/releases`);this.extensionStubVersions=t;const s=t.filter(e=>e.is_version_compatible);this.extensionData.stub_version=s[0]?s[0].version:""}catch(e){LNbits.utils.notifyApiError(e)}},refreshIframe(e=""){const t=this.$refs[`iframeStep${this.step}`];if(!t)return void console.warn("Extension Builder Preview iframe not loaded yet.");t.onload=()=>{const e=t.contentDocument||t.contentWindow.document;e.body.style.transform="scale(0.8)",e.body.style.transformOrigin="center top"};let s="Page"+this.extensionData.id.toLowerCase().split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("");"public_page"===e&&(s+="Public"),t.src=`/extensions/builder/preview?ext_id=${this.extensionData.id}&page=${e}&component=${s}`},initBasicData(){this.extensionData.owner_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionData.client_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionData.settings_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionDataCleanString=JSON.stringify(this.extensionData)}},created(){this.initBasicData();const e=this.$q.localStorage.getItem("lnbits.extension.builder.data");e&&(this.extensionData={...this.extensionData,...JSON.parse(e)});const t=+this.$q.localStorage.getItem("lnbits.extension.builder.step");t&&(this.step=t),this.g.user.admin&&this.getStubExtensionReleases(),setTimeout(()=>{this.refreshIframe()},1e3)}},window.PageExtensionBuilderPreview={template:"#page-extension-builder-preview",mixins:[windowMixin],watch:{name:"reload"},data:()=>({extId:"",pageName:"",componentName:null}),methods:{async reload(){await LNbits.utils.loadTemplate(`/extensions/builder/preview/${this.extId}/template?page_name=${this.pageName}`),await LNbits.utils.loadScript(`/extensions/builder/preview/${this.extId}/component?page_name=${this.pageName}`),this._component=window[this.componentName],console.log("LNbits preview reloaded componentName:",this.componentName,!!this._component),this.$forceUpdate()}},async created(){const e=new URLSearchParams(window.location.search);this.extId=e.get("ext_id")||"",this.pageName=e.get("page")||"",this.componentName=e.get("component")||"",await this.reload()},render(){return this._component?Vue.h(this._component):Vue.h("div","Loading...")}};const EXTENSION_PERMISSION_DEFAULT_MAX_ROWS_PER_SOURCE=1e4,EXTENSION_PERMISSION_MAX_ROWS_PER_SOURCE_LIMIT=1e6,EXTENSION_PERMISSION_MAX_MESSAGES_PER_SECOND_LIMIT=100;window.PageExtensions={template:"#page-extensions",data(){return{extbuilderEnabled:!1,slide:0,fullscreen:!1,autoplay:!0,searchTerm:"",tab:"installed",manageExtensionTab:"releases",filteredExtensions:[],categories:new Set,updatableExtensions:[],showUninstallDialog:!1,showManageExtensionDialog:!1,showExtensionDetailsDialog:!1,showDropDbDialog:!1,showPayToEnableDialog:!1,showUpdateAllDialog:!1,dropDbExtensionId:"",selectedExtension:null,selectedImage:null,selectedExtensionDetails:null,selectedExtensionDetailsDescription:"",selectedExtensionRepos:null,selectedRelease:null,permissionGrant:{show:!1,permissions:[],resolve:null},extensionPermissionMaxRowsPerSourceLimit:1e6,extensionPermissionMaxMessagesPerSecondLimit:100,managedExtensionPermissions:{loading:!1,extensionPermissions:[],userPermissions:{},savingExtensionPermissions:!1,savingKey:"",deletingKey:""},backgroundPaymentDestinationOptions:[{label:"Only transfers to my wallets",value:"own_wallets_only"},{label:"Allow external payments",value:"external_allowed"}],uninstallAndDropDb:!1,maxStars:5,paylinkWebsocket:null,searchToggle:!1,reviewsUrl:null,reviewsDialog:{show:!1,extension:null,loading:!1,submitting:!1,form:{name:"",rating:0,comment:""},error:null},reviews:[],reviewsTable:{loading:!1,columns:[{name:"name",align:"left",label:this.$t("Name"),field:"name",sortable:!0},{name:"comment",align:"left",label:this.$t("Comment"),field:"comment"},{name:"created_at",align:"left",label:this.$t("Date"),field:"created_at"},{name:"rating",align:"right",label:"Rating",field:"rating"}],pagination:{rowsPerPage:5,sortBy:"created_at",descending:!0,page:1}},paymentDialog:{show:!1,invoice:"",hash:""}}},watch:{searchTerm(e){this.filterExtensions(e,this.tab)},tab(e){this.filterExtensions(this.searchTerm,e)}},computed:{managedUserPermissionRows(){const e=[],t=this.managedExtensionPermissions.userPermissions||{};return Object.entries(t).forEach(([t,s])=>{Array.isArray(s)&&s.forEach(s=>{if(!s||"object"!=typeof s)return;const a=String(s.id||""),i=String(s.wallet_id||"");a&&i&&e.push({key:a,permissionId:t,label:this.permissionLabelById(t),grantId:a,walletId:i,walletName:this.walletName(i),grant:s})})}),e}},methods:{filterExtensions(e,t){const s=!["installed","all","featured"].includes(t);var a;this.filteredExtensions=this.extensions.filter(e=>"all"!==t||!e.isInstalled).filter(e=>"installed"!==t||e.isInstalled).filter(e=>"installed"!==t||(!!e.isActive||!!this.g.user.admin)).filter(e=>"featured"!==t||e.isFeatured).filter(e=>!s||(e=>e.categories?.includes(t)??!1)(e)).filter((a=e,function(e){return e.name.toLowerCase().includes(a.toLowerCase())||e.shortDescription?.toLowerCase().includes(a.toLowerCase())})).map(e=>({...e,details_link:e.installedRelease?.details_link||e.latestRelease?.details_link}))},async installExtension(e){this.unsubscribeFromPaylinkWs();const t=await this.resolveExtensionPermissionGrant(e);null!==t&&(this.selectedExtension.inProgress=!0,this.showManageExtensionDialog=!1,e.payment_hash=e.payment_hash||this.getPaylinkHash(e.pay_link),LNbits.api.request("POST","/api/v1/extension",this.g.user.wallets[0].adminkey,{ext_id:this.selectedExtension.id,archive:e.archive,source_repo:e.source_repo,payment_hash:e.payment_hash,version:e.version,permissions:t}).then(t=>{this.selectedExtension.inProgress=!1;const s=this.extensions.find(e=>e.id===this.selectedExtension.id);s.isAvailable=!0,s.isInstalled=!0,s.isWasm=!0===t.data.is_wasm||!0===t.data.isWasm||"wasm"===e.extension_type||!0===s.isWasm,s.icon=t.data.icon||s.icon,s.installedRelease=e,this.toggleExtension(s),s.inProgress=!1,this.selectedExtension=s,this.extensions=this.extensions.concat([]),this.tab="installed"}).catch(e=>{console.warn(e),this.selectedExtension.inProgress=!1,LNbits.utils.notifyApiError(e)}))},async uninstallExtension(){this.showManageExtensionDialog=!1,this.showUninstallDialog=!1,this.selectedExtension.inProgress=!0,LNbits.api.request("DELETE",`/api/v1/extension/${this.selectedExtension.id}`,this.g.user.wallets[0].adminkey).then(e=>{const t=this.extensions.find(e=>e.id===this.selectedExtension.id);t.isAvailable=!1,t.isInstalled=!1,t.inProgress=!1,t.installedRelease=null,this.filteredExtensions=this.filteredExtensions.filter(e=>e.id!==t.id),Quasar.Notify.create({type:"positive",message:"Extension uninstalled!"}),this.uninstallAndDropDb&&this.showDropDb()}).catch(e=>{LNbits.utils.notifyApiError(e),extension.inProgress=!1})},async dropExtensionDb(){const e=this.selectedExtension;this.showManageExtensionDialog=!1,this.showDropDbDialog=!1,this.dropDbExtensionId="",e.inProgress=!0,LNbits.api.request("DELETE",`/api/v1/extension/${e.id}/db`,this.g.user.wallets[0].adminkey).then(t=>{e.installedRelease=null,e.inProgress=!1,e.hasDatabaseTables=!1,Quasar.Notify.create({type:"positive",message:"Extension DB deleted!"})}).catch(t=>{LNbits.utils.notifyApiError(t),e.inProgress=!1})},toggleExtension(e){const t=e.isActive?"activate":"deactivate";LNbits.api.request("PUT",`/api/v1/extension/${e.id}/${t}`,this.g.user.wallets[0].adminkey).then(s=>{Quasar.Notify.create({timeout:2e3,type:"positive",message:`Extension '${e.id}' ${t}d!`})}).catch(t=>{LNbits.utils.notifyApiError(t),e.isActive=!1,e.inProgress=!1})},async enableExtensionForUser(e){e.isPaymentRequired?this.showPayToEnable(e):this.enableExtension(e)},async enableExtension(e){LNbits.api.request("PUT",`/api/v1/extension/${e.id}/enable`,this.g.user.wallets[0].adminkey).then(t=>{this.g.user.extensions=this.g.user.extensions.concat([e.id]),Quasar.Notify.create({type:"positive",message:"Extension enabled!"})}).catch(e=>{console.warn(e),LNbits.utils.notifyApiError(e)})},disableExtension(e){LNbits.api.request("PUT",`/api/v1/extension/${e.id}/disable`,this.g.user.wallets[0].adminkey).then(t=>{this.g.user.extensions=this.g.user.extensions.filter(t=>t!==e.id),Quasar.Notify.create({type:"positive",message:"Extension disabled!"})}).catch(e=>{console.warn(error),LNbits.utils.notifyApiError(e)})},showPayToEnable(e){this.selectedExtension=e,this.selectedExtension.payToEnable.paidAmount=e.payToEnable.amount,this.selectedExtension.payToEnable.showQRCode=!1,this.showPayToEnableDialog=!0},updatePayToInstallData(e){LNbits.api.request("PUT",`/api/v1/extension/${e.id}/sell`,this.g.user.wallets[0].adminkey,{required:e.payToEnable.required,amount:e.payToEnable.amount,wallet:e.payToEnable.wallet}).then(e=>{Quasar.Notify.create({type:"positive",message:"Payment info updated!"}),this.showManageExtensionDialog=!1}).catch(t=>{LNbits.utils.notifyApiError(t),e.inProgress=!1})},showUninstall(){this.showManageExtensionDialog=!1,this.showUninstallDialog=!0,this.uninstallAndDropDb=!1},showDropDb(){this.showDropDbDialog=!0},async showManageExtension(e){if(this.selectedExtension=e,this.selectedRelease=null,this.selectedExtensionRepos=null,this.resetManagedExtensionPermissions(),this.manageExtensionTab=this.g.user.admin?"releases":"extension-permissions",this.showManageExtensionDialog=!0,this.canManageExtensionPermissions(e)&&this.loadManagedExtensionPermissions(e),this.g.user.admin)try{const{data:t}=await LNbits.api.request("GET",`/api/v1/extension/${e.id}/releases`);this.selectedExtensionRepos=t.reduce((e,t)=>(e[t.source_repo]=e[t.source_repo]||{releases:[],isInstalled:!1,repo:t.repo},t.inProgress=!1,t.error=null,t.loaded=!1,t.isInstalled=this.isInstalledVersion(this.selectedExtension,t),t.isInstalled&&(e[t.source_repo].isInstalled=!0),t.pay_link&&(t.requiresPayment=!0,t.paidAmount=t.cost_sats,t.payment_hash=this.getPaylinkHash(t.pay_link)),e[t.source_repo].releases.push(t),e),{})}catch(t){LNbits.utils.notifyApiError(t),e.inProgress=!1}},canShowManageExtensionButton(e){return this.g.user.admin||!0===e?.isWasm&&!0===e?.isInstalled},canManageExtensionPermissions(e=this.selectedExtension){return!0===e?.isWasm&&!0===e?.isInstalled},canShowAdminManageTabs(){return!0===this.g.user.admin},resetManagedExtensionPermissions(){this.managedExtensionPermissions={loading:!1,extensionPermissions:[],userPermissions:{},savingExtensionPermissions:!1,savingKey:"",deletingKey:""}},async loadManagedExtensionPermissions(e=this.selectedExtension){if(this.canManageExtensionPermissions(e)){this.managedExtensionPermissions.loading=!0;try{const{data:t}=await LNbits.api.request("GET",`/api/v1/extension/${e.id}/permissions`);this.managedExtensionPermissions.extensionPermissions=this.cloneEditableExtensionPermissions(t.extension_permissions||[]),this.managedExtensionPermissions.userPermissions=this.cloneUserPermissions(t.user_permissions||{})}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}finally{this.managedExtensionPermissions.loading=!1}}},cloneEditableExtensionPermissions(e){return(e||[]).filter(e=>e&&"object"==typeof e).map(e=>({...e,policies:Array.isArray(e.policies)?e.policies.map(t=>this.cloneEditablePermissionPolicy(e.id,t)):e.policies}))},cloneEditablePermissionPolicy(e,t){if(!t||"object"!=typeof t||Array.isArray(t))return t;const s=Object.entries(t).reduce((e,[t,s])=>({...e,[t]:Array.isArray(s)?s.slice():s}),{});return"ext.storage.append_public"===e&&(s.max_rows_per_source=this.maxRowsPerSourceValue(s.max_rows_per_source,1e4)),"websocket.publish"===e&&(s.max_messages_per_second=Number(s.max_messages_per_second)),s},maxRowsPerSourceValue(e,t){const s=Number(e);return!Number.isInteger(s)||s<=0?t:Math.min(s,1e6)},extensionPermissionLimitError(e){const t=(e||[]).find(e=>"ext.storage.append_public"===e?.id);if(!t||!Array.isArray(t.policies))return this.websocketPublishLimitError(e);for(const e of t.policies){if(!e||"object"!=typeof e)continue;const t=Number(e.max_rows_per_source);if(!Number.isInteger(t)||t<=0)return"Max rows per source must be a positive integer.";if(t>1e6)return"Max rows per source cannot exceed 1000000."}return this.websocketPublishLimitError(e)},websocketPublishLimitError(e){const t=(e||[]).find(e=>"websocket.publish"===e?.id);if(!t)return"";if(!Array.isArray(t.policies)||1!==t.policies.length)return"Websocket publish requires a max messages per second policy.";const s=t.policies[0];if(!s||"object"!=typeof s)return"Websocket publish requires a max messages per second policy.";const a=Number(s.max_messages_per_second);return!Number.isInteger(a)||a<=0?"Max messages per second must be a positive integer.":a>100?"Max messages per second cannot exceed 100.":""},validateExtensionPermissionLimits(e){const t=this.extensionPermissionLimitError(e);return!t||(Quasar.Notify.create({type:"negative",message:t}),!1)},extensionPermissionsHaveEditableLimits:e=>(e||[]).some(e=>"ext.storage.append_public"===e?.id&&Array.isArray(e.policies)&&e.policies.length>0||"websocket.publish"===e?.id),async saveManagedExtensionPermissions(){const e=this.managedExtensionPermissions.extensionPermissions;if(this.validateExtensionPermissionLimits(e)){this.managedExtensionPermissions.savingExtensionPermissions=!0;try{const{data:t}=await LNbits.api.request("PUT",`/api/v1/extension/${this.selectedExtension.id}/permissions`,this.g.user.wallets[0].adminkey,{permissions:this.cloneEditableExtensionPermissions(e)});this.managedExtensionPermissions.extensionPermissions=this.cloneEditableExtensionPermissions(t.extension_permissions||[]),Quasar.Notify.create({type:"positive",message:"Permission updated."})}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}finally{this.managedExtensionPermissions.savingExtensionPermissions=!1}}},cloneUserPermissions(e){const t={};return Object.entries(e||{}).forEach(([e,s])=>{Array.isArray(s)&&(t[e]=s.filter(e=>e&&"object"==typeof e).map(e=>({...e,_original:{...e}})))}),t},async showExtensionDetails(e,t){if(t){this.selectedExtension=this.extensions.find(t=>t.id===e)||this.selectedExtension,this.selectedExtensionDetails=null,this.selectedExtensionDetailsDescription="",this.showExtensionDetailsDialog=!0,this.slide=0,this.fullscreen=!1;try{const{data:s}=await LNbits.api.request("GET",`/api/v1/extension/${e}/details?details_link=${t}`);this.selectedExtensionDetails=s,this.selectedExtensionDetailsDescription=this.extensionDescriptionDocument(s.description_md)}catch(e){console.warn(e)}}},extensionDescriptionDocument(e){const t="string"==typeof e?e:"",s=LNbits.utils.convertMarkdown(t),a=(new DOMParser).parseFromString(s,"text/html");a.body.querySelectorAll("applet, base, embed, form, frame, iframe, link, meta, object, portal, script").forEach(e=>e.remove()),a.body.querySelectorAll("*").forEach(e=>{for(const t of[...e.attributes]){const s=t.name.toLowerCase();(s.startsWith("on")||"srcdoc"===s||"xlink:href"===s)&&e.removeAttribute(t.name)}}),a.body.querySelectorAll("a[href], area[href]").forEach(e=>{try{const t=new URL(e.getAttribute("href"),window.location.origin);if(!["http:","https:"].includes(t.protocol)||t.username||t.password)return void e.removeAttribute("href");e.setAttribute("href",t.href),e.setAttribute("target","_blank"),e.setAttribute("rel","noopener noreferrer")}catch(t){e.removeAttribute("href")}});return`\n \n \n \n \n \n \n \n \n \n ${a.body.innerHTML}\n \n `},async payAndInstall(e){try{if(null===await this.resolveExtensionPermissionGrant(e))return;this.selectedExtension.inProgress=!0,this.showManageExtensionDialog=!1;const t=await this.requestPaymentForInstall(this.selectedExtension.id,e);this.rememberPaylinkHash(e.pay_link,t.payment_hash);const s=this.g.user.wallets.find(t=>t.id===e.wallet),{data:a}=await LNbits.api.payInvoice(s,t.payment_request);e.payment_hash=a.payment_hash,await this.installExtension(e)}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}finally{this.selectedExtension.inProgress=!1}},async payAndEnable(e){try{const t=await this.requestPaymentForEnable(e.id,e.payToEnable.paidAmount),s=this.g.user.wallets.find(t=>t.id===e.payToEnable.paymentWallet),{data:a}=await LNbits.api.payInvoice(s,t.payment_request);this.enableExtension(e),this.showPayToEnableDialog=!1}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async showInstallQRCode(e){if(null!==await this.resolveExtensionPermissionGrant(e)){this.selectedRelease=e;try{const t=await this.requestPaymentForInstall(this.selectedExtension.id,e);this.selectedRelease.paymentRequest=t.payment_request,this.selectedRelease.payment_hash=t.payment_hash,this.selectedRelease=_.clone(this.selectedRelease),this.rememberPaylinkHash(this.selectedRelease.pay_link,this.selectedRelease.payment_hash),this.subscribeToPaylinkWs(this.selectedRelease.pay_link,t.payment_hash)}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}}},async showEnableQRCode(e){try{e.payToEnable.showQRCode=!0,this.selectedExtension=_.clone(e);const t=await this.requestPaymentForEnable(e.id,e.payToEnable.paidAmount);e.payToEnable.paymentRequest=t.payment_request,this.selectedExtension=_.clone(e);const s=new URL(window.location);s.protocol="https:"===s.protocol?"wss":"ws",s.pathname=`/api/v1/ws/${t.payment_hash}`;const a=new WebSocket(s);a.addEventListener("message",async({data:t})=>{!1===JSON.parse(t).pending&&(Quasar.Notify.create({type:"positive",message:"Invoice Paid!"}),this.enableExtension(e),a.close())})}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async requestPaymentForInstall(e,t){const{data:s}=await LNbits.api.request("PUT",`/api/v1/extension/${e}/invoice/install`,null,{ext_id:e,archive:t.archive,source_repo:t.source_repo,cost_sats:t.paidAmount,version:t.version});return s},async requestPaymentForEnable(e,t){const{data:s}=await LNbits.api.request("PUT",`/api/v1/extension/${e}/invoice/enable`,null,{amount:t});return s},clearHangingInvoice(e){this.forgetPaylinkHash(e.pay_link),e.payment_hash=null},rememberPaylinkHash(e,t){this.$q.localStorage.set(`lnbits.extensions.paylink.${e}`,t)},getPaylinkHash(e){return this.$q.localStorage.getItem(`lnbits.extensions.paylink.${e}`)},forgetPaylinkHash(e){this.$q.localStorage.remove(`lnbits.extensions.paylink.${e}`)},subscribeToPaylinkWs(e,t){const s=new URL(`${e}/${t}`);s.protocol="https:"===s.protocol?"wss":"ws",this.paylinkWebsocket=new WebSocket(s),this.paylinkWebsocket.addEventListener("message",async({data:e})=>{JSON.parse(e).paid?(Quasar.Notify.create({type:"positive",message:"Invoice Paid!"}),this.installExtension(this.selectedRelease)):Quasar.Notify.create({type:"warning",message:"Invoice tracking lost!"})})},unsubscribeFromPaylinkWs(){try{this.paylinkWebsocket&&this.paylinkWebsocket.close()}catch(e){console.warn(e)}},hasNewVersion(e){if(e.installedRelease&&e.latestRelease)return e.installedRelease.version!==e.latestRelease.version},isInstalledVersion(e,t){if(e.installedRelease)return e.installedRelease.source_repo===t.source_repo&&e.installedRelease.version===t.version},getReleaseIcon:e=>e.is_version_compatible?e.isInstalled?"download_done":"download":"block",getReleaseIconColor:e=>e.is_version_compatible?e.isInstalled?"text-green":"":"text-red",extensionOpenUrl:e=>e.isWasm?`/ext/${e.id}`:`/${e.id}`,permissionLabelById(e){const t=`extension_permission_${String(e).replace(/[^A-Za-z0-9]/g,"_")}`,s=this.$t(t);return s===t?e:s},walletName(e){const t=(this.g.user.wallets||[]).find(t=>t.id===e);return t?t.name||t.id:e},userPermissionRowCaption:e=>`${e.walletName} (${e.walletId.slice(0,8)}...)`,isBackgroundPaymentPermission:e=>"wallet.pay_invoice_background"===e.permissionId,userPermissionGrantPayload(e){return{wallet_id:e.walletId,max_amount:this.positiveInteger(e.grant.max_amount,0),destination_policy:this.backgroundPaymentDestinationPolicy(e.grant.destination_policy)}},positiveInteger(e,t){const s=Number(e);return!Number.isFinite(s)||s<=0?t:Math.floor(s)},backgroundPaymentDestinationPolicy:e=>"external_allowed"===e?"external_allowed":"own_wallets_only",backgroundPaymentGrantIncreased(e,t){const s=e.grant._original||{},a=this.positiveInteger(s.max_amount,0),i=this.backgroundPaymentDestinationPolicy(s.destination_policy);return t.max_amount>a||"own_wallets_only"===i&&"external_allowed"===t.destination_policy},confirmUserPermissionIncrease:()=>new Promise(e=>{let t=!1;const s=s=>{t||(t=!0,e(s))};LNbits.utils.confirmDialog("This increases what the extension can do with this wallet. Continue?").onOk(()=>s(!0)).onCancel(()=>s(!1)).onDismiss(()=>s(!1))}),async saveUserPermissionGrant(e){if(!this.isBackgroundPaymentPermission(e))return;const t=this.userPermissionGrantPayload(e);if(t.max_amount){if(!this.backgroundPaymentGrantIncreased(e,t)||await this.confirmUserPermissionIncrease()){this.managedExtensionPermissions.savingKey=e.key;try{await LNbits.api.request("POST",`/api/v1/extension/${this.selectedExtension.id}/permissions/background-payment`,null,t),Quasar.Notify.create({type:"positive",message:"Permission updated."}),await this.loadManagedExtensionPermissions()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}finally{this.managedExtensionPermissions.savingKey=""}}}else Quasar.Notify.create({type:"negative",message:"Max payment amount must be greater than zero."})},deleteUserPermissionGrant(e){LNbits.utils.confirmDialog("Remove this permission grant?").onOk(async()=>{this.managedExtensionPermissions.deletingKey=e.key;try{const t=encodeURIComponent(e.grantId);await LNbits.api.request("DELETE",`/api/v1/extension/${this.selectedExtension.id}/permissions/user/${t}`),Quasar.Notify.create({type:"positive",message:"Permission removed."}),await this.loadManagedExtensionPermissions()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}finally{this.managedExtensionPermissions.deletingKey=""}})},async getGitHubReleaseDetails(e){if(!e.is_github_release||e.loaded)return;const[t,s]=e.source_repo.split("/");e.inProgress=!0;try{const{data:a}=await LNbits.api.request("GET",`/api/v1/extension/release/${t}/${s}/${e.version}`);e.loaded=!0,e.is_version_compatible=a.is_version_compatible,e.min_lnbits_version=a.min_lnbits_version,e.warning=a.warning,e.extension_type=a.extension_type,e.permissions=a.permissions||[]}catch(t){console.warn(t),e.error=t,LNbits.utils.notifyApiError(t)}finally{e.inProgress=!1}},async resolveExtensionPermissionGrant(e){const t=this.extensionPermissionsForRelease(e);if(!this.releaseRequiresPermissionGrant(e)||!t.length)return[];if(e.grantedPermissions)return e.grantedPermissions;const s=await this.confirmExtensionPermissions(t);return s?(e.grantedPermissions=s,s):null},extensionPermissionsForRelease(e){return e.permissions||this.selectedExtension?.permissions||[]},releaseRequiresPermissionGrant(e){return"wasm"===e.extension_type||!0===this.selectedExtension?.isWasm},confirmExtensionPermissions(e){return new Promise(t=>{this.selectedRelease=null,this.permissionGrant={show:!0,permissions:this.cloneEditableExtensionPermissions(e),resolve:t},this.showManageExtensionDialog=!0})},grantExtensionPermissions(){this.validateExtensionPermissionLimits(this.permissionGrant.permissions)&&this.resolveExtensionPermissionDialog(this.cloneEditableExtensionPermissions(this.permissionGrant.permissions))},cancelExtensionPermissions(){this.resolveExtensionPermissionDialog(null)},onManageExtensionDialogHide(){this.permissionGrant.show&&this.resolveExtensionPermissionDialog(null)},resolveExtensionPermissionDialog(e){const t=this.permissionGrant.resolve;this.permissionGrant={show:!1,permissions:[],resolve:null},this.showManageExtensionDialog=!1,t&&t(e)},permissionGrantHasHighRisk(){return window.LNbitsExtensionPermissions.hasHighRisk({permissions:this.permissionGrant.permissions,extensions:this.extensions,translate:e=>this.$t(e)})},async selectAllUpdatableExtensionss(){this.updatableExtensions.forEach(e=>e.selectedForUpdate=!0)},async updateSelectedExtensions(){let e=0;for(const t of this.updatableExtensions)try{if(!t.selectedForUpdate)continue;if(t.isWasm){Quasar.Notify.create({type:"warning",message:`Skipping ${t.id}; this extension update requires permission approval.`});continue}t.inProgress=!0,await LNbits.api.request("POST","/api/v1/extension",null,{ext_id:t.id,archive:t.latestRelease.archive,source_repo:t.latestRelease.source_repo,payment_hash:t.latestRelease.payment_hash,version:t.latestRelease.version}),e++,t.isAvailable=!0,t.isInstalled=!0,t.isUpgraded=!0,t.inProgress=!1,t.installedRelease=t.latestRelease,t.isActive=!0,this.toggleExtension(t)}catch(e){console.warn(e),Quasar.Notify.create({type:"negative",message:`Failed to update ${t.id}!`})}finally{t.inProgress=!1}Quasar.Notify.create({type:e?"positive":"warning",message:`${e||"No"} extensions updated!`}),this.showUpdateAllDialog=!1},formatAvg(e){const t=Number(e||0);return Math.round(t/2/100*2)/2},async loadReviewStats(){if(this.reviewsUrl)try{const{data:e}=await LNbits.api.request("GET","/api/v1/extension/reviews/tags"),t={};e.forEach(e=>{t[e.tag]=e}),this.extensions.forEach(e=>{e.reviewStats=t[e.id]||null}),this.filterExtensions(this.searchTerm,this.tab)}catch(e){console.warn(e)}else console.info("Extension reviews are not configured")},async openReviews(e){const t=e||(this.selectedExtensionDetails?this.extensions.find(e=>e.id===this.selectedExtensionDetails.id):null);t&&(this.reviewsUrl?(this.reviewsDialog.extension=t,this.selectedExtension=e,this.reviewsDialog.show=!0,await this.getTagReviews()):Quasar.Notify.create({type:"warning",message:this.$t("reviews_url_not_configured")}))},async getTagReviews(e){if(this.reviewsUrl)try{this.reviewsTable.loading=!0;const t=LNbits.utils.prepareFilterQuery(this.reviewsTable,e),{data:s}=await LNbits.api.request("GET",`/api/v1/extension/reviews/${this.selectedExtension.id}?${t}`);this.reviews=s.data,this.reviewsTable.pagination.rowsNumber=s.total}catch(e){LNbits.utils.notifyApiError(e)}finally{this.reviewsTable.loading=!1}else Quasar.Notify.create({type:"warning",message:this.$t("reviews_url_not_configured")})},formatReviewDate(e){if(!e)return"";const t=Number(e);return Number.isNaN(t)?this.utils.formatDate(e):this.utils.formatTimestamp(t)},async submitReview(){if(this.reviewsDialog.extension&&this.reviewsUrl){this.reviewsDialog.submitting=!0;try{const e={tag:this.reviewsDialog.extension.id,name:this.reviewsDialog.form.name,rating:100*this.reviewsDialog.form.rating,comment:this.reviewsDialog.form.comment},{data:t}=await LNbits.api.request("PUT","/api/v1/extension/reviews",null,e);t.payment_request?this.openInvoiceDialog(t.payment_request,t.payment_hash):(Quasar.Notify.create({type:"positive",message:"Review submitted"}),this.resetReviewForm(),await this.getTagReviews(),await this.loadReviewStats())}catch(e){LNbits.utils.notifyApiError(e)}finally{this.reviewsDialog.submitting=!1}}},openInvoiceDialog(e,t){this.paymentDialog.invoice=e,this.paymentDialog.hash=t,this.paymentDialog.show=!0,this.listenForPayment(t)},resetReviewForm(){this.reviewsDialog.form={name:"",rating:0,comment:""},this.paymentDialog={show:!1,invoice:"",hash:""}},listenForPayment(e){try{const t=new URL(this.reviewsUrl);t.protocol="https:"===t.protocol?"wss:":"ws:",t.pathname=`/api/v1/ws/${e}`;const s=new WebSocket(t);s.addEventListener("message",async()=>{Quasar.Notify.create({type:"positive",message:this.$t("reviews_invoice_paid")}),this.paymentDialog.show=!1,this.resetReviewForm(),setTimeout(async()=>{await this.getTagReviews()},1e3),await this.loadReviewStats(),s.close()})}catch(e){console.warn(e)}},async fetchAllExtensions(){try{const{data:e}=await LNbits.api.request("GET","/api/v1/extension/all");return e.forEach(e=>{e.categories?.forEach(e=>this.categories.add(e))}),e}catch(e){return console.warn(e),LNbits.utils.notifyApiError(e),[]}}},async created(){this.extensions=await this.fetchAllExtensions(),this.extbuilderEnabled=this.g.user.admin||this.g.settings.extBuilder,this.reviewsUrl=this.g.settings.extensionsReviewsUrl,0===this.g.user.extensions.length&&(this.tab="all");const e=window.location.hash.replace("#",""),t=this.extensions.find(t=>t.id===e);t&&(this.searchTerm=t.id,t.isInstalled&&(this.tab="installed")),this.updatableExtensions=this.extensions.filter(e=>this.hasNewVersion(e)),await this.loadReviewStats(),this.filterExtensions(this.searchTerm,this.tab)}},window.PageFirstInstall={template:"#page-first-install",data:()=>({loginData:{isPwd:!0,isPwdRepeat:!0,username:"",password:"",passwordRepeat:"",firstInstallToken:""}}),computed:{checkPasswordsMatch(){return this.loginData.password!==this.loginData.passwordRepeat}},methods:{setPassword(){LNbits.api.request("PUT","/api/v1/auth/first_install",null,{username:this.loginData.username,password:this.loginData.password,password_repeat:this.loginData.passwordRepeat,first_install_token:this.loginData.firstInstallToken}).then(async()=>{const e=await LNbits.api.getAuthUser();this.g.user=LNbits.map.user(e.data),this.g.isPublicPage=!1,this.$router.push("/admin")}).catch(this.utils.notifyApiError)}},created(){const e=new URLSearchParams(window.location.search);this.loginData.firstInstallToken=e.get("token")||""}},window.PagePayments={template:"#page-payments",data:()=>({payments:[],dailyChartData:[],searchDate:{from:null,to:null},searchData:{wallet_id:null,payment_hash:null,memo:null,internal_memo:null},statusFilters:{success:!0,pending:!0,failed:!0,incoming:!0,outgoing:!0},chartData:{showPaymentStatus:!0,showPaymentTags:!0,showBalance:!0,showWalletsSize:!1,showBalanceInOut:!1,showPaymentCountInOut:!1},searchOptions:{status:[]},paymentsTable:{columns:[{name:"status",align:"left",label:"Status",field:"status",sortable:!1},{name:"created_at",align:"left",label:"Created At",field:"created_at",sortable:!0},{name:"amount",align:"right",label:"Amount",field:"amount",sortable:!0},{name:"amountFiat",align:"right",label:"Fiat",field:"amountFiat",sortable:!1},{name:"fee_sats",align:"left",label:"Fee",field:"fee_sats",sortable:!0},{name:"tag",align:"left",label:"Tag",field:"tag",sortable:!1},{name:"memo",align:"left",label:"Memo",field:"memo",sortable:!1,max_length:20},{name:"internal_memo",align:"left",label:"Internal Memo",field:"internal_memo",sortable:!1,max_length:20},{name:"wallet_id",align:"left",label:"Wallet (ID)",field:"wallet_id",sortable:!1},{name:"payment_hash",align:"left",label:"Payment Hash",field:"payment_hash",sortable:!1}],pagination:{sortBy:"created_at",rowsPerPage:25,page:1,descending:!0,rowsNumber:10},search:null,hideEmpty:!0,loading:!1},chartsReady:!1,showDetails:!1,paymentDetails:null,lnbitsBalance:0}),async mounted(){this.chartsReady=!0,await this.$nextTick(),this.initCharts(),await this.fetchPayments()},computed:{},methods:{async fetchPayments(e){const t=Object.entries(this.searchData).reduce((e,[t,s])=>s?(e[t]=s,e):e,{});delete t["time[ge]"],delete t["time[le]"],this.searchDate.from&&(t["time[ge]"]=this.searchDate.from+"T00:00:00"),this.searchDate.to&&(t["time[le]"]=this.searchDate.to+"T23:59:59"),this.paymentsTable.filter=t;try{const t=LNbits.utils.prepareFilterQuery(this.paymentsTable,e),{data:s}=await LNbits.api.request("GET",`/api/v1/payments/all/paginated?${t}`);this.paymentsTable.pagination.rowsNumber=s.total,this.payments=s.data.map(e=>(e.extra&&e.extra.tag&&(e.tag=e.extra.tag),e.timeFrom=moment.utc(e.created_at).local().fromNow(),e.outgoing=e.amount<0,e.amount=new Intl.NumberFormat(this.g.locale).format(e.amount/1e3)+" sats",e.extra?.wallet_fiat_amount&&(e.amountFiat=this.formatCurrency(e.extra.wallet_fiat_amount,e.extra.wallet_fiat_currency)),e.extra?.internal_memo&&(e.internal_memo=e.extra.internal_memo),e.fee_sats=new Intl.NumberFormat(this.g.locale).format(e.fee/1e3)+" sats",e))}catch(e){console.error(e),LNbits.utils.notifyApiError(e)}finally{this.updateCharts(e)}},async searchPaymentsBy(e,t){e&&(this.searchData[e]=t),await this.fetchPayments()},clearDateSeach(){this.searchDate={from:null,to:null},delete this.paymentsTable.filter["time[ge]"],delete this.paymentsTable.filter["time[le]"],this.fetchPayments()},searchByDate(){"string"==typeof this.searchDate&&(this.searchDate={from:this.searchDate,to:this.searchDate}),this.searchDate.from&&(this.paymentsTable.filter["time[ge]"]=this.searchDate.from+"T00:00:00"),this.searchDate.to&&(this.paymentsTable.filter["time[le]"]=this.searchDate.to+"T23:59:59"),this.fetchPayments()},handleFilterChanged(){const{success:e,pending:t,failed:s,incoming:a,outgoing:i}=this.statusFilters;delete this.searchData["status[ne]"],delete this.searchData["status[eq]"],e&&t&&s||(e&&t?this.searchData["status[ne]"]="failed":e&&s?this.searchData["status[ne]"]="pending":s&&t?this.searchData["status[ne]"]="success":e?this.searchData["status[eq]"]="success":t?this.searchData["status[eq]"]="pending":s&&(this.searchData["status[eq]"]="failed")),delete this.searchData["amount[ge]"],delete this.searchData["amount[le]"],a&&i||(a?this.searchData["amount[ge]"]="0":i&&(this.searchData["amount[le]"]="0")),this.fetchPayments()},showDetailsToggle(e){return this.paymentDetails=e,this.showDetails=!this.showDetails},formatCurrency(e,t){try{return LNbits.utils.formatCurrency(e,t)}catch(t){return console.error(t),`${e} ???`}},shortify:(e,t=10)=>(valueLength=(e||"").length,valueLength<=t?e:`${e.substring(0,5)}...${e.substring(valueLength-5,valueLength)}`),async updateCharts(e){let t=LNbits.utils.prepareFilterQuery(this.paymentsTable,e);try{const{data:e}=await LNbits.api.request("GET",`/api/v1/payments/stats/count?${t}&count_by=status`);e.sort((e,t)=>e.field-t.field).reverse(),this.searchOptions.status=e.map(e=>e.field),this.paymentsStatusChart.data.datasets[0].data=e.map(e=>e.total),this.paymentsStatusChart.data.labels=[...this.searchOptions.status],this.paymentsStatusChart.update()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}try{const{data:e}=await LNbits.api.request("GET",`/api/v1/payments/stats/wallets?${t}`),s=e.map(e=>e.balance/e.payments_count),a=Math.min(...s),i=Math.max(...s),n=e=>Math.floor(3+22*(e-a)/(i-a)),o=this.randomColors(20),r=e.map((e,t)=>({data:[{x:e.payments_count,y:e.balance,r:n(Math.max(e.balance/e.payments_count,5))}],label:e.wallet_name,wallet_id:e.wallet_id,backgroundColor:o[t%100],hoverOffset:4}));this.paymentsWalletsChart.data.datasets=r,this.paymentsWalletsChart.update()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}try{const{data:e}=await LNbits.api.request("GET",`/api/v1/payments/stats/count?${t}&count_by=tag`);this.searchOptions.tag=e.map(e=>e.field),this.searchOptions.status.sort(),this.paymentsTagsChart.data.datasets[0].data=e.map(e=>e.total),this.paymentsTagsChart.data.labels=e.map(e=>e.field||"core"),this.paymentsTagsChart.update()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}try{const t=Object.entries(this.searchData).reduce((e,[t,s])=>s?(e[t]=s,e):e,{}),s={...this.paymentsTable,filter:t},a=LNbits.utils.prepareFilterQuery(s,e);let{data:i}=await LNbits.api.request("GET",`/api/v1/payments/stats/daily?${a}`);const n=this.searchDate.from+"T00:00:00",o=this.searchDate.to+"T23:59:59";this.lnbitsBalance=i.length?i[i.length-1].balance:0,i=i.filter(e=>this.searchDate.from&&this.searchDate.to?e.date>=n&&e.date<=o:this.searchDate.from?e.date>=n:!this.searchDate.to||e.date<=o),this.paymentsDailyChart.data.datasets=[{label:"Balance",data:i.map(e=>e.balance),pointStyle:!1,borderWidth:2,tension:.7,fill:1},{label:"Fees",data:i.map(e=>e.fee),pointStyle:!1,borderWidth:1,tension:.4,fill:1}],this.paymentsDailyChart.data.labels=i.map(e=>e.date.substring(0,10)),this.paymentsDailyChart.update(),this.paymentsBalanceInOutChart.data.datasets=[{label:"Incoming Payments Balance",data:i.map(e=>e.balance_in)},{label:"Outgoing Payments Balance",data:i.map(e=>e.balance_out)}],this.paymentsBalanceInOutChart.data.labels=i.map(e=>e.date.substring(0,10)),this.paymentsBalanceInOutChart.update(),this.paymentsCountInOutChart.data.datasets=[{label:"Incoming Payments Count",data:i.map(e=>e.count_in)},{label:"Outgoing Payments Count",data:i.map(e=>-e.count_out)}],this.paymentsCountInOutChart.data.labels=i.map(e=>e.date.substring(0,10)),this.paymentsCountInOutChart.update()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async initCharts(){const e=this.$q.localStorage.getItem("lnbits.payments.chartData")||{};this.chartData={...this.chartData,...e},this.chartsReady?(this.paymentsStatusChart=new Chart(this.$refs.paymentsStatusChart.getContext("2d"),{type:"doughnut",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1}},onClick:(e,t,s)=>{if(t[0]){const e=t[0].index;this.searchPaymentsBy("status",s.data.labels[e])}}},data:{datasets:[{label:"",data:[],backgroundColor:["rgb(0, 205, 86)","rgb(64, 72, 78)","rgb(255, 99, 132)"],hoverOffset:4}]}}),this.paymentsWalletsChart=new Chart(this.$refs.paymentsWalletsChart.getContext("2d"),{type:"bubble",options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},title:{display:!1}},onClick:(e,t,s)=>{if(t[0]){const e=t[0].datasetIndex;this.searchPaymentsBy("wallet_id",s.data.datasets[e].wallet_id)}}},data:{datasets:[{label:"",data:[],backgroundColor:this.randomColors(20),hoverOffset:4}]}}),this.paymentsTagsChart=new Chart(this.$refs.paymentsTagsChart.getContext("2d"),{type:"pie",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1},legend:{display:!1,title:{display:!1,text:"Tags"}}},onClick:(e,t,s)=>{if(t[0]){const e=t[0].index;this.searchPaymentsBy("tag",s.data.labels[e])}}},data:{datasets:[{label:"",data:[],backgroundColor:this.randomColors(10),hoverOffset:4}]}}),this.paymentsDailyChart=new Chart(this.$refs.paymentsDailyChart.getContext("2d"),{type:"line",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1},legend:{display:!0,title:{display:!1,text:"Tags"}}}},data:{datasets:[{label:"",data:[],backgroundColor:this.randomColors(10),hoverOffset:4}]}}),this.paymentsBalanceInOutChart=new Chart(this.$refs.paymentsBalanceInOutChart.getContext("2d"),{type:"bar",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1},legend:{display:!0,title:{display:!1,text:"Tags"}}},scales:{x:{stacked:!0},y:{stacked:!0}}},data:{datasets:[{label:"",data:[],backgroundColor:this.randomColors(50),hoverOffset:4}]}}),this.paymentsCountInOutChart=new Chart(this.$refs.paymentsCountInOutChart.getContext("2d"),{type:"bar",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1},legend:{display:!0,title:{display:!1,text:""}}},scales:{x:{stacked:!0},y:{stacked:!0}}},data:{datasets:[{label:"",data:[],backgroundColor:this.randomColors(80),hoverOffset:4}]}})):console.warn("Charts are not ready yet. Initialization delayed.")},saveChartsPreferences(){this.$q.localStorage.set("lnbits.payments.chartData",this.chartData)},randomColors(e=1){const t=[];for(let s=1;s<=10;s++)for(let a=1;a<=10;a++)t.push(`rgb(${a*e*33%200}, ${71*(s+a+e)%255}, ${(s+30*e)%255})`);return t}}},window.PageNode={template:"#page-node",config:{globalProperties:{LNbits:LNbits,msg:"hello"}},data(){return{isSuperUser:!1,wallet:{},tab:"dashboard",payments:1e3,info:{},channel_stats:{},channels:{data:[],filter:""},activeBalance:{},ranks:{},peers:{data:[],filter:""},connectPeerDialog:{show:!1,data:{}},setFeeDialog:{show:!1,data:{fee_ppm:0,fee_base_msat:0}},openChannelDialog:{show:!1,data:{}},closeChannelDialog:{show:!1,data:{}},nodeInfoDialog:{show:!1,data:{}},transactionDetailsDialog:{show:!1,data:{}},states:[{label:"Active",value:"active",color:"green"},{label:"Pending",value:"pending",color:"orange"},{label:"Inactive",value:"inactive",color:"grey"},{label:"Closed",value:"closed",color:"red"}],stateFilters:[{label:"Active",value:"active"},{label:"Pending",value:"pending"}],paymentsTable:{data:[],columns:[{name:"pending",label:""},{name:"date",align:"left",label:this.$t("date"),field:"date",sortable:!0},{name:"sat",align:"right",label:this.$t("amount"),field:e=>this.formatMsat(e.amount),sortable:!0},{name:"fee",align:"right",label:this.$t("fee"),field:"fee"},{name:"destination",align:"right",label:"Destination",field:"destination"},{name:"memo",align:"left",label:this.$t("memo"),field:"memo"}],pagination:{rowsPerPage:10,page:1,rowsNumber:10},filter:null},invoiceTable:{data:[],columns:[{name:"pending",label:""},{name:"paid_at",field:"paid_at",align:"left",label:"Paid at",sortable:!0},{name:"expiry",label:this.$t("expiry"),field:"expiry",align:"left",sortable:!0},{name:"amount",label:this.$t("amount"),field:e=>this.formatMsat(e.amount),sortable:!0},{name:"memo",align:"left",label:this.$t("memo"),field:"memo"}],pagination:{rowsPerPage:10,page:1,rowsNumber:10},filter:null}}},created(){this.getInfo(),this.get1MLStats()},watch:{tab(e){"transactions"!==e||this.paymentsTable.data.length?"channels"!==e||this.channels.data.length||(this.getChannels(),this.getPeers()):(this.getPayments(),this.getInvoices())}},computed:{checkChanges(){return!_.isEqual(this.settings,this.formData)},filteredChannels(){return this.stateFilters?this.channels.data.filter(e=>this.stateFilters.find(({value:t})=>t==e.state)):this.channels.data},totalBalance(){return this.filteredChannels.reduce((e,t)=>(e.local_msat+=t.balance.local_msat,e.remote_msat+=t.balance.remote_msat,e.total_msat+=t.balance.total_msat,e),{local_msat:0,remote_msat:0,total_msat:0})}},methods:{formatMsat:e=>LNbits.utils.formatMsat(e),nodeApi(e,t,s){const a=new URLSearchParams(s?.query);return LNbits.api.request(e,`/node/api/v1${t}?${a}`,{},s?.data).catch(e=>{LNbits.utils.notifyApiError(e)})},getChannel(e){return this.nodeApi("GET",`/channels/${e}`).then(e=>{this.setFeeDialog.data.fee_ppm=e.data.fee_ppm,this.setFeeDialog.data.fee_base_msat=e.data.fee_base_msat})},getChannels(){return this.nodeApi("GET","/channels").then(e=>{this.channels.data=e.data})},getInfo(){return this.nodeApi("GET","/info").then(e=>{this.info=e.data,this.channel_stats=e.data.channel_stats}).catch(()=>{this.info={},this.channel_stats={}})},get1MLStats(){return this.nodeApi("GET","/rank").then(e=>{this.ranks=e.data}).catch(()=>{this.ranks={}})},getPayments(e){e&&(this.paymentsTable.pagination=e.pagination);let t=this.paymentsTable.pagination;const s={limit:t.rowsPerPage,offset:(t.page-1)*t.rowsPerPage??0};return this.nodeApi("GET","/payments",{query:s}).then(e=>{this.paymentsTable.data=e.data.data,this.paymentsTable.pagination.rowsNumber=e.data.total})},getInvoices(e){e&&(this.invoiceTable.pagination=e.pagination);let t=this.invoiceTable.pagination;const s={limit:t.rowsPerPage,offset:(t.page-1)*t.rowsPerPage??0};return this.nodeApi("GET","/invoices",{query:s}).then(e=>{this.invoiceTable.data=e.data.data,this.invoiceTable.pagination.rowsNumber=e.data.total})},getPeers(){return this.nodeApi("GET","/peers").then(e=>{this.peers.data=e.data})},connectPeer(){this.nodeApi("POST","/peers",{data:this.connectPeerDialog.data}).then(()=>{this.connectPeerDialog.show=!1,this.getPeers()})},disconnectPeer(e){LNbits.utils.confirmDialog("Do you really wanna disconnect this peer?").onOk(()=>{this.nodeApi("DELETE",`/peers/${e}`).then(e=>{Quasar.Notify.create({message:"Disconnected",icon:null}),this.needsRestart=!0,this.getPeers()})})},setChannelFee(e){this.nodeApi("PUT",`/channels/${e}`,{data:this.setFeeDialog.data}).then(e=>{this.setFeeDialog.show=!1,this.getChannels()}).catch(LNbits.utils.notifyApiError)},openChannel(){this.nodeApi("POST","/channels",{data:this.openChannelDialog.data}).then(e=>{this.openChannelDialog.show=!1,this.getChannels()}).catch(e=>{console.log(e)})},showCloseChannelDialog(e){this.closeChannelDialog.show=!0,this.closeChannelDialog.data={force:!1,short_id:e.short_id,...e.point}},closeChannel(){this.nodeApi("DELETE","/channels",{query:this.closeChannelDialog.data}).then(e=>{this.closeChannelDialog.show=!1,this.getChannels()})},showSetFeeDialog(e){this.setFeeDialog.show=!0,this.setFeeDialog.channel_id=e,this.getChannel(e)},showOpenChannelDialog(e){this.openChannelDialog.show=!0,this.openChannelDialog.data={peer_id:e,funding_amount:0}},showNodeInfoDialog(e){this.nodeInfoDialog.show=!0,this.nodeInfoDialog.data=e},showTransactionDetailsDialog(e){this.transactionDetailsDialog.show=!0,this.transactionDetailsDialog.data=e},shortenNodeId:e=>e?e.substring(0,5)+"..."+e.substring(e.length-5):"..."}},window.PageNodePublic={template:"#page-node-public",data:()=>({enabled:!1,isSuperUser:!1,wallet:{},tab:"dashboard",payments:1e3,info:{},channel_stats:{},channels:[],activeBalance:{},ranks:{},peers:[],connectPeerDialog:{show:!1,data:{}},openChannelDialog:{show:!1,data:{}},closeChannelDialog:{show:!1,data:{}},nodeInfoDialog:{show:!1,data:{}},states:[{label:"Active",value:"active",color:"green"},{label:"Pending",value:"pending",color:"orange"},{label:"Inactive",value:"inactive",color:"grey"},{label:"Closed",value:"closed",color:"red"}]}),created(){this.getInfo(),this.get1MLStats()},methods:{formatMsat:e=>LNbits.utils.formatMsat(e),api:(e,t,s)=>LNbits.api.request(e,"/node/public/api/v1"+t,{},s),getInfo(){this.api("GET","/info",{}).then(e=>{this.info=e.data,this.channel_stats=e.data.channel_stats,this.enabled=!0}).catch(()=>{this.info={},this.channel_stats={}})},get1MLStats(){this.api("GET","/rank",{}).then(e=>{this.ranks=e.data}).catch(()=>{this.ranks={}})}}},window.PageAudit={template:"#page-audit",data:()=>({chartsReady:!1,auditEntries:[],searchData:{user_id:"",ip_address:"",request_type:"",component:"",request_method:"",response_code:"",path:""},searchOptions:{component:[],request_method:[],response_code:[]},auditTable:{columns:[{name:"created_at",align:"center",label:"Date",field:"created_at",sortable:!0},{name:"duration",align:"left",label:"Duration (sec)",field:"duration",sortable:!0},{name:"component",align:"left",label:"Component",field:"component",sortable:!1},{name:"request_method",align:"left",label:"Method",field:"request_method",sortable:!1},{name:"response_code",align:"left",label:"Code",field:"response_code",sortable:!1},{name:"user_id",align:"left",label:"User Id",field:"user_id",sortable:!1},{name:"ip_address",align:"left",label:"IP Address",field:"ip_address",sortable:!1},{name:"path",align:"left",label:"Path",field:"path",sortable:!1}],pagination:{sortBy:"created_at",rowsPerPage:10,page:1,descending:!0,rowsNumber:10},search:null,hideEmpty:!0,loading:!1},auditDetailsDialog:{data:null,show:!1}}),async created(){},async mounted(){this.chartsReady=!0,await this.$nextTick(),this.initCharts(),await this.fetchAudit()},methods:{async fetchAudit(e){try{const t=LNbits.utils.prepareFilterQuery(this.auditTable,e),{data:s}=await LNbits.api.request("GET",`/audit/api/v1?${t}`);this.auditTable.pagination.rowsNumber=s.total,this.auditEntries=s.data,await this.fetchAuditStats(e)}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}finally{this.auditTable.loading=!1}},async fetchAuditStats(e){try{const t=LNbits.utils.prepareFilterQuery(this.auditTable,e),{data:s}=await LNbits.api.request("GET",`/audit/api/v1/stats?${t}`),a=s.request_method.map(e=>e.field);this.searchOptions.request_method=[...new Set(this.searchOptions.request_method.concat(a))],this.requestMethodChart.data.labels=a,this.requestMethodChart.data.datasets[0].data=s.request_method.map(e=>e.total),this.requestMethodChart.update();const i=s.response_code.map(e=>e.field);this.searchOptions.response_code=[...new Set(this.searchOptions.response_code.concat(i))],this.responseCodeChart.data.labels=i,this.responseCodeChart.data.datasets[0].data=s.response_code.map(e=>e.total),this.responseCodeChart.update();const n=s.component.map(e=>e.field);this.searchOptions.component=[...new Set(this.searchOptions.component.concat(n))],this.componentUseChart.data.labels=n,this.componentUseChart.data.datasets[0].data=s.component.map(e=>e.total),this.componentUseChart.update(),this.longDurationChart.data.labels=s.long_duration.map(e=>e.field),this.longDurationChart.data.datasets[0].data=s.long_duration.map(e=>e.total),this.longDurationChart.update()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async searchAuditBy(e,t){e&&(this.searchData[e]=t),this.auditTable.filter=Object.entries(this.searchData).reduce((e,[t,s])=>s?(e[t]=s,e):e,{}),await this.fetchAudit()},showDetailsDialog(e){const t=JSON.parse(e?.request_details||"");try{t.body&&(t.body=JSON.parse(t.body))}catch(e){}this.auditDetailsDialog.data=JSON.stringify(t,null,4),this.auditDetailsDialog.show=!0},shortify:e=>(valueLength=(e||"").length,valueLength<=10?e:`${e.substring(0,5)}...${e.substring(valueLength-5,valueLength)}`),async initCharts(){this.chartsReady?(this.responseCodeChart=new Chart(this.$refs.responseCodeChart.getContext("2d"),{type:"doughnut",options:{responsive:!0,plugins:{legend:{position:"bottom"},title:{display:!1,text:"HTTP Response Codes"}},onClick:(e,t,s)=>{if(t[0]){const e=t[0].index;this.searchAuditBy("response_code",s.data.labels[e])}}},data:{datasets:[{label:"",data:[20,10],backgroundColor:["rgb(100, 99, 200)","rgb(54, 162, 235)","rgb(255, 205, 86)","rgb(255, 5, 86)","rgb(25, 205, 86)","rgb(255, 205, 250)"]}],labels:[]}}),this.requestMethodChart=new Chart(this.$refs.requestMethodChart.getContext("2d"),{type:"bar",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1}},onClick:(e,t,s)=>{if(t[0]){const e=t[0].index;this.searchAuditBy("request_method",s.data.labels[e])}}},data:{datasets:[{label:"",data:[],backgroundColor:["rgb(255, 99, 132)","rgb(54, 162, 235)","rgb(255, 205, 86)","rgb(255, 5, 86)","rgb(25, 205, 86)","rgb(255, 205, 250)"],hoverOffset:4}]}}),this.componentUseChart=new Chart(this.$refs.componentUseChart.getContext("2d"),{type:"pie",options:{responsive:!0,plugins:{legend:{position:"xxx"},title:{display:!1,text:"Components"}},onClick:(e,t,s)=>{if(t[0]){const e=t[0].index;this.searchAuditBy("component",s.data.labels[e])}}},data:{datasets:[{data:[],backgroundColor:["rgb(255, 99, 132)","rgb(54, 162, 235)","rgb(255, 205, 86)","rgb(255, 5, 86)","rgb(25, 205, 86)","rgb(255, 205, 250)","rgb(100, 205, 250)","rgb(120, 205, 250)","rgb(140, 205, 250)","rgb(160, 205, 250)"],hoverOffset:4}]}}),this.longDurationChart=new Chart(this.$refs.longDurationChart.getContext("2d"),{type:"bar",options:{responsive:!0,indexAxis:"y",maintainAspectRatio:!1,plugins:{legend:{title:{display:!1,text:"Long Duration"}}},onClick:(e,t,s)=>{if(t[0]){const e=t[0].index;this.searchAuditBy("path",s.data.labels[e])}}},data:{datasets:[{label:"",data:[],backgroundColor:["rgb(255, 99, 132)","rgb(54, 162, 235)","rgb(255, 205, 86)","rgb(255, 5, 86)","rgb(25, 205, 86)","rgb(255, 205, 250)","rgb(100, 205, 250)","rgb(120, 205, 250)","rgb(140, 205, 250)","rgb(160, 205, 250)"],hoverOffset:4}]}})):console.warn("Charts are not ready yet. Initialization delayed.")}}},window.PageWallet={template:"#page-wallet",data:()=>({parse:{show:!1,invoice:null,lnurlpay:null,lnurlauth:null,sending:!1,data:{request:"",amount:0,comment:"",internalMemo:null,unit:"sat"},paymentChecker:null,copy:{show:!1},camera:{show:!1,camera:"auto"}},receive:{show:!1,status:"pending",paymentReq:null,paymentHash:null,amountMsat:null,minMax:[0,21e14],lnurl:null,units:[],unit:"sat",fiatProvider:"",data:{amount:null,memo:"",internalMemo:null,payment_hash:null}},update:{name:null,currency:null},hasNfc:!1,nfcReaderAbortController:null,formattedFiatAmount:0,totalBreakdown:{show:!1,loading:!1,rows:[],selectedTypes:["bitcoin","fiat"],selectedTags:[]},paymentFilter:{"status[ne]":"failed"},chartConfig:Quasar.LocalStorage.getItem("lnbits.wallets.chartConfig")||{showPaymentInOutChart:!0,showBalanceChart:!0,showBalanceInOutChart:!0}}),computed:{canPay(){return!!this.parse.invoice&&(this.parse.invoice.expired?(Quasar.Notify.create({message:"Invoice has expired",color:"negative"}),!1):this.parse.invoice.sat<=this.g.wallet.sat)},formattedAmount(){return"sat"==this.receive.unit&&this.g.isSatsDenomination?LNbits.utils.formatMsat(this.receive.amountMsat)+" sat":LNbits.utils.formatCurrency(Number(this.receive.data.amount).toFixed(2),this.g.isSatsDenomination?this.receive.unit:this.g.denomination)},formattedSatAmount(){return LNbits.utils.formatMsat(this.receive.amountMsat)+" sat"},totalBreakdownTags(){const e=this.totalBreakdown.rows.map(e=>e.tag||null);return[...new Set(e)].sort((e,t)=>this.totalBreakdownTagLabel(e).localeCompare(this.totalBreakdownTagLabel(t)))},hasFiatTotalBreakdown(){return this.totalBreakdown.rows.some(e=>e.is_fiat)},selectedTotalBreakdownRows(){return this.totalBreakdown.rows.filter(e=>{const t=e.is_fiat?"fiat":"bitcoin";return this.totalBreakdown.selectedTypes.includes(t)&&this.totalBreakdown.selectedTags.includes(this.totalBreakdownTagKey(e.tag))})},selectedTotalBreakdownMsat(){return this.selectedTotalBreakdownRows.reduce((e,t)=>e+t.total,0)},selectedTotalBreakdownSat(){return Math.round(this.selectedTotalBreakdownMsat/1e3)},selectedTotalBreakdownCount(){return this.selectedTotalBreakdownRows.reduce((e,t)=>e+t.payments_count,0)},formattedTotalBreakdown(){return this.utils.formatBalance(this.selectedTotalBreakdownSat,this.g.denomination)},formattedTotalBreakdownFiat(){if(!this.g.fiatTracking)return null;const e=this.selectedTotalBreakdownSat/1e8*this.g.exchangeRate;return LNbits.utils.formatCurrency(e,this.g.wallet.currency)},primaryTotalBreakdownValue(){return this.g.isFiatPriority&&this.g.fiatTracking&&this.formattedTotalBreakdownFiat||this.formattedTotalBreakdown},secondaryTotalBreakdownValue(){return this.g.fiatTracking?this.g.isFiatPriority?this.formattedTotalBreakdown:this.formattedTotalBreakdownFiat:null}},methods:{showWalletTotalBreakdown(){this.totalBreakdown.show=!0,this.totalBreakdown.rows.length||this.fetchTotalBreakdown()},fetchTotalBreakdown(){this.totalBreakdown.loading=!0,LNbits.api.getPaymentTotalBreakdown(this.g.wallet).then(e=>{this.totalBreakdown.rows=e.data,this.totalBreakdown.selectedTypes=["bitcoin","fiat"],this.totalBreakdown.selectedTags=this.totalBreakdownTags.map(this.totalBreakdownTagKey),this.totalBreakdown.loading=!1}).catch(e=>{this.totalBreakdown.loading=!1,LNbits.utils.notifyApiError(e)})},totalBreakdownTagLabel:e=>e||"No tag",totalBreakdownTagKey:e=>e||"__untagged__",totalBreakdownTagCount(e){return this.totalBreakdown.rows.filter(t=>(t.tag||null)===e).reduce((e,t)=>e+t.payments_count,0)},totalBreakdownTagMsat(e){return this.totalBreakdown.rows.filter(t=>(t.tag||null)===e).reduce((e,t)=>e+t.total,0)},formatTotalBreakdownMsat(e){return this.utils.formatBalance(Math.round(e/1e3),this.g.denomination)},handleSendLnurl(e){this.parse.data.request=e,this.parse.show=!0,this.lnurlScan()},msatoshiFormat:e=>LNbits.utils.formatSat(e/1e3),showReceiveDialog(){this.receive.show=!0,this.receive.status="pending",this.receive.paymentReq=null,this.receive.paymentHash=null,this.receive.data.amount=null,this.receive.data.memo=null,this.receive.data.internalMemo=null,this.receive.data.payment_hash=null,this.receive.units=["sat",...this.g.allowedCurrencies.length>0?this.g.allowedCurrencies:this.g.currencies],this.receive.unit=this.g.isFiatPriority&&this.g.wallet.currency||"sat",this.receive.minMax=[0,21e14],this.receive.lnurl=null},onReceiveDialogHide(){this.hasNfc&&this.nfcReaderAbortController.abort()},showParseDialog(){this.parse.show=!0,this.parse.invoice=null,this.parse.lnurlpay=null,this.parse.lnurlauth=null,this.parse.copy.show=window.isSecureContext&&void 0!==navigator.clipboard?.readText,this.parse.data.request="",this.parse.data.comment="",this.parse.data.internalMemo=null,this.parse.sending=!1,this.parse.data.paymentChecker=null,this.parse.camera.show=!1},closeParseDialog(){setTimeout(()=>{clearInterval(this.parse.paymentChecker)},1e4)},handleBalanceUpdate(e){this.g.wallet.sat=this.g.wallet.sat+e},createInvoice(){this.receive.status="loading",this.g.isSatsDenomination||(this.receive.data.amount=100*this.receive.data.amount),LNbits.api.createInvoice(this.g.wallet,this.receive.data.amount,this.receive.data.memo,this.receive.unit,this.receive.lnurlWithdraw,this.receive.fiatProvider,this.receive.data.internalMemo,this.receive.data.payment_hash).then(e=>{if(this.g.updatePayments=!this.g.updatePayments,this.receive.status="success",this.receive.paymentReq=e.data.bolt11,this.receive.fiatPaymentReq=e.data.extra?.fiat_payment_request,this.receive.amountMsat=e.data.amount,this.receive.paymentHash=e.data.payment_hash,this.receive.lnurl||this.readNfcTag(),this.receive.lnurl&&null!==e.data.extra?.lnurl_response){!1===e.data.extra.lnurl_response&&(e.data.extra.lnurl_response="Unable to connect");const t=this.receive.lnurl.callback.split("/")[2];if("string"==typeof e.data.extra.lnurl_response)return void Quasar.Notify.create({timeout:5e3,type:"warning",message:`${t} lnurl-withdraw call failed.`,caption:e.data.extra.lnurl_response});!0===e.data.extra.lnurl_response&&Quasar.Notify.create({timeout:3e3,message:`Invoice sent to ${t}!`,spinner:!0})}}).catch(e=>{LNbits.utils.notifyApiError(e),this.receive.status="pending"})},lnurlScan(){LNbits.api.request("POST","/api/v1/lnurlscan",this.g.wallet.adminkey,{lnurl:this.parse.data.request}).then(e=>{const t=e.data;if("ERROR"!==t.status){if("payRequest"===t.tag)this.parse.lnurlpay=Object.freeze(t),this.parse.data.amount=t.minSendable/1e3,this.receive.units=["sats",...this.g.allowedCurrencies.length>0?this.g.allowedCurrencies:this.g.currencies];else if("login"===t.tag)this.parse.lnurlauth=Object.freeze(t);else if("withdrawRequest"===t.tag){this.parse.show=!1,this.receive.show=!0,this.receive.lnurlWithdraw=Object.freeze(t),this.receive.status="pending",this.receive.paymentReq=null,this.receive.paymentHash=null,this.receive.data.amount=t.maxWithdrawable/1e3,this.receive.data.memo=t.defaultDescription,this.receive.minMax=[t.minWithdrawable/1e3,t.maxWithdrawable/1e3];const e=t.callback.split("/")[2];this.receive.lnurl={domain:e,callback:t.callback,fixed:t.fixed}}}else Quasar.Notify.create({timeout:5e3,type:"warning",message:"lnurl scan failed.",caption:t.reason})}).catch(e=>{LNbits.utils.notifyApiError(e)})},decodeQR(e){this.parse.data.request=e,this.decodeRequest(),this.parse.camera.show=!1},isLnurl:e=>e.toLowerCase().startsWith("lnurl1")||e.startsWith("lnurlp://")||e.startsWith("lnurlw://")||e.startsWith("lnurlauth://")||e.match(/[\w.+-~_]+@[\w.+-~_]/),decodeRequest(){this.parse.show=!0,this.parse.data.request=this.parse.data.request.trim();const e=this.parse.data.request.toLowerCase();if(e.startsWith("lightning:")?this.parse.data.request=this.parse.data.request.slice(10):e.startsWith("lnurl:")?this.parse.data.request=this.parse.data.request.slice(6):e.includes("lightning=lnurl1")&&(this.parse.data.request=this.parse.data.request.split("lightning=")[1].split("&")[0]),this.isLnurl(this.parse.data.request))return void this.lnurlScan();let t;this.parse.data.request.toLowerCase().includes("lightning")&&(this.parse.data.request=this.parse.data.request.split("lightning=")[1],this.parse.data.request.includes("&")&&(this.parse.data.request=this.parse.data.request.split("&")[0]));try{t=decode(this.parse.data.request)}catch(e){return Quasar.Notify.create({timeout:3e3,type:"warning",message:e+".",caption:"400 BAD REQUEST"}),void(this.parse.show=!1)}let s={msat:t.human_readable_part.amount,sat:t.human_readable_part.amount/1e3,fsat:LNbits.utils.formatSat(t.human_readable_part.amount/1e3),bolt11:this.parse.data.request};_.each(t.data.tags,e=>{if(_.isObject(e)&&_.has(e,"description"))if("payment_hash"===e.description)s.hash=e.value;else if("description"===e.description)s.description=e.value;else if("expiry"===e.description){const a=new Date(1e3*(t.data.time_stamp+e.value)),i=new Date(1e3*t.data.time_stamp);s.expireDate=Quasar.date.formatDate(a,"YYYY-MM-DDTHH:mm:ss.SSSZ"),s.createdDate=Quasar.date.formatDate(i,"YYYY-MM-DDTHH:mm:ss.SSSZ"),s.expireDateFrom=moment.utc(a).local().fromNow(),s.createdDateFrom=moment.utc(i).local().fromNow(),s.expired=!1}}),this.g.wallet.currency&&(s.fiatAmount=LNbits.utils.formatCurrency((s.sat/1e8*this.g.exchangeRate).toFixed(2),this.g.wallet.currency)),this.parse.invoice=Object.freeze(s)},payInvoice(){if(this.parse.sending)return;this.parse.sending=!0;const e=Quasar.Notify.create({timeout:0,message:this.$t("payment_processing")});LNbits.api.payInvoice(this.g.wallet,this.parse.data.request,this.parse.data.internalMemo).then(t=>{this.parse.sending=!1,e(),this.g.updatePayments=!this.g.updatePayments,this.parse.show=!1,"success"==t.data.status&&Quasar.Notify.create({type:"positive",message:this.$t("payment_successful")}),"pending"==t.data.status&&Quasar.Notify.create({type:"info",message:this.$t("payment_pending")})}).catch(t=>{this.parse.sending=!1,e(),LNbits.utils.notifyApiError(t),this.g.updatePayments=!this.g.updatePayments})},payLnurl(){this.parse.sending||(this.parse.sending=!0,LNbits.api.request("post","/api/v1/payments/lnurl",this.g.wallet.adminkey,{res:this.parse.lnurlpay,lnurl:this.parse.data.request,unit:this.parse.data.unit,amount:1e3*this.parse.data.amount,comment:this.parse.data.comment,internalMemo:this.parse.data.internalMemo}).then(e=>{if(this.parse.sending=!1,this.parse.show=!1,e.data.extra.success_action){const t=JSON.parse(e.data.extra.success_action);switch(t.tag){case"url":Quasar.Notify.create({message:t.url,caption:t.description,html:!1,type:"positive",timeout:0,closeBtn:!0,actions:[{label:"Open link",color:"white",handler:()=>this.utils.openUrlInNewTab(t.url)}]});break;case"message":Quasar.Notify.create({message:t.message,type:"positive",timeout:0,closeBtn:!0});break;case"aes":this.utils.decryptLnurlPayAES(t,e.data.preimage).then(e=>{Quasar.Notify.create({message:e,caption:t.description,html:!1,type:"positive",timeout:0,closeBtn:!0})}).catch(e=>{Quasar.Notify.create({message:t.description||"Payment successful.",caption:"Could not decrypt success action.",html:!1,type:"warning",timeout:0,closeBtn:!0})})}}}).catch(e=>{this.parse.sending=!1,LNbits.utils.notifyApiError(e)}))},authLnurl(){const e=Quasar.Notify.create({timeout:10,message:"Performing authentication..."});LNbits.api.request("post","/api/v1/lnurlauth",wallet.adminkey,this.parse.lnurlauth).then(t=>{e(),Quasar.Notify.create({message:"Authentication successful.",type:"positive",timeout:3500}),this.parse.show=!1}).catch(e=>{e.response.data.reason?Quasar.Notify.create({message:`Authentication failed. ${this.parse.lnurlauth.callback} says:`,caption:e.response.data.reason,type:"warning",timeout:5e3}):LNbits.utils.notifyApiError(e)})},updateWallet(e){LNbits.api.request("PATCH","/api/v1/wallet",this.g.wallet.adminkey,e).then(e=>{const t={...e.data};t.lightning_address&&(t.lightningAddress=t.lightning_address,t.lightningAddressFull=`${t.lightning_address}@${window.location.host}`),this.g.wallet={...this.g.wallet,...t};const s=this.g.user.wallets.findIndex(t=>t.id===e.data.id);-1!==s&&(this.g.user.wallets[s]={...this.g.user.wallets[s],...t}),Quasar.Notify.create({message:"Wallet updated.",type:"positive",timeout:3500})}).catch(e=>{LNbits.utils.notifyApiError(e)})},pasteToTextArea(){this.$refs.textArea.focus(),navigator.clipboard.readText().then(e=>{this.parse.data.request=e.trim()})},readNfcTag(){try{if("undefined"==typeof NDEFReader)return void console.debug("NFC not supported on this device or browser.");const e=new NDEFReader;this.nfcReaderAbortController=new AbortController,this.nfcReaderAbortController.signal.onabort=e=>{console.debug("All NFC Read operations have been aborted.")},this.hasNfc=!0;const t=Quasar.Notify.create({message:"Tap your NFC tag to pay this invoice with LNURLw."});return e.scan({signal:this.nfcReaderAbortController.signal}).then(()=>{e.onreadingerror=()=>{Quasar.Notify.create({type:"negative",message:"There was an error reading this NFC tag."})},e.onreading=({message:e})=>{const s=new TextDecoder("utf-8"),a=e.records.find(e=>-1!==s.decode(e.data).toUpperCase().indexOf("LNURLW"));if(a){t(),Quasar.Notify.create({type:"positive",message:"NFC tag read successfully."});const e=s.decode(a.data);this.payInvoiceWithNfc(e)}else Quasar.Notify.create({type:"warning",message:"NFC tag does not have LNURLw record."})}})}catch(e){Quasar.Notify.create({type:"negative",message:e?e.toString():"An unexpected error has occurred."})}},payInvoiceWithNfc(e){const t=Quasar.Notify.create({timeout:0,spinner:!0,message:this.$t("payment_processing")});LNbits.api.request("POST",`/api/v1/payments/${this.receive.paymentReq}/pay-with-nfc`,this.g.wallet.adminkey,{lnurl_w:e}).then(e=>{t(),e.data.success?Quasar.Notify.create({type:"positive",message:"Payment successful"}):Quasar.Notify.create({type:"negative",message:e.data.detail||"Payment failed"})}).catch(e=>{t(),LNbits.utils.notifyApiError(e)})}},created(){const e=new URLSearchParams(window.location.search);(e.has("lightning")||e.has("lnurl"))&&(this.parse.data.request=e.get("lightning")||e.get("lnurl"),this.decodeRequest(),this.parse.show=!0);const t=this.g.user.wallets.find(e=>e.id===this.$route.params.id);t?(this.g.wallet=t,this.g.lastActiveWallet=t.id,this.$q.localStorage.setItem("lnbits.lastActiveWallet",t.id),this.$router.replace(`/wallet/${t.id}`)):(this.g.errorCode=404,this.g.errorMessage="Wallet not found.",this.$router.push("/error"))},watch:{"g.updatePaymentsHash"(){this.receive.show=!1},"g.updatePayments"(){this.parse.show=!1,this.g.wallet.currency&&this.$q.localStorage.getItem("lnbits.exchangeRate."+this.g.wallet.currency)&&(this.g.exchangeRate=this.$q.localStorage.getItem("lnbits.exchangeRate."+this.g.wallet.currency),this.g.fiatBalance=this.g.exchangeRate/1e8*this.g.wallet.sat)},"g.wallet"(){this.g.wallet.currency?(this.g.fiatTracking=!0,this.g.fiatBalance=this.g.exchangeRate/1e8*this.g.wallet.sat):(this.g.fiatBalance=0,this.g.fiatTracking=!1)},"g.isFiatPriority"(){this.receive.unit=this.g.isFiatPriority?this.g.wallet.currency:"sat"},"g.fiatBalance"(){this.formattedFiatAmount=LNbits.utils.formatCurrency(this.g.fiatBalance.toFixed(2),this.g.wallet.currency)},"g.exchangeRate"(){this.g.fiatTracking&&this.g.wallet.currency&&(this.g.fiatBalance=this.g.exchangeRate/1e8*this.g.wallet.sat)}}},window.PageWallets={template:"#page-wallets",data:()=>({user:null,tab:"wallets",wallets:[],addWalletDialog:{show:!1},walletsTable:{columns:[{name:"name",align:"left",label:"Name",field:"name",sortable:!0},{name:"currency",align:"center",label:"Currency",field:"currency",sortable:!0},{name:"updated_at",align:"right",label:"Last Updated",field:"updated_at",sortable:!0}],pagination:{sortBy:"updated_at",rowsPerPage:12,page:1,descending:!0,rowsNumber:10},search:"",hideEmpty:!0,loading:!1}}),watch:{"walletsTable.search":{handler(){const e={};this.walletsTable.search&&(e.search=this.walletsTable.search),this.getUserWallets()}}},methods:{async getUserWallets(e){try{this.walletsTable.loading=!0;const t=LNbits.utils.prepareFilterQuery(this.walletsTable,e),{data:s}=await LNbits.api.request("GET",`/api/v1/wallet/paginated?${t}`,null);this.wallets=s.data,this.walletsTable.pagination.rowsNumber=s.total}catch(e){LNbits.utils.notifyApiError(e)}finally{this.walletsTable.loading=!1}},goToWallet(e){this.$router.push({path:"/wallet",query:{wal:e}})},formattedFiatAmount:(e,t)=>LNbits.utils.formatCurrency(Number(e).toFixed(2),t),formattedSatAmount:e=>LNbits.utils.formatMsat(e)+" sat"},async created(){await this.getUserWallets()}},window.PageUsers={template:"#page-users",data(){return{paymentsWallet:{},cancel:{},users:[],wallets:[],searchData:{user:"",username:"",email:"",pubkey:""},paymentPage:{show:!1},activeWallet:{userId:null,show:!1},activeUser:{data:null,showUserId:!1,show:!1},createWalletDialog:{data:{},show:!1},lightningAddressDialog:{wallet:null,lightningAddress:"",show:!1},walletTable:{columns:[{name:"name",align:"left",label:"Name",field:"name"},{name:"id",align:"left",label:"Wallet Id",field:"id"},{name:"currency",align:"left",label:"Currency",field:"currency"},{name:"balance_msat",align:"left",label:"Balance",field:"balance_msat"}],pagination:{sortBy:"name",rowsPerPage:10,page:1,descending:!0,rowsNumber:10},search:null,hideEmpty:!0,loading:!1},usersTable:{columns:[{name:"activated",align:"left",label:this.$t("activated"),field:"activated",sortable:!1},{name:"wallet_id",align:"left",label:"Wallets",field:"wallet_id",sortable:!1},{name:"id",align:"left",label:"User Id",field:"id",sortable:!1},{name:"username",align:"left",label:"Username",field:"username",sortable:!1},{name:"email",align:"left",label:"Email",field:"email",sortable:!1},{name:"pubkey",align:"left",label:"Public Key",field:"pubkey",sortable:!1},{name:"balance_msat",align:"left",label:"Balance",field:"balance_msat",sortable:!1},{name:"transaction_count",align:"left",label:"Payments",field:"transaction_count",sortable:!1},{name:"last_payment",align:"left",label:"Last Payment",field:"last_payment",sortable:!1}],pagination:{sortBy:"created_at",rowsPerPage:10,page:1,descending:!0,rowsNumber:10},sortFields:[{name:"id",label:"User ID"},{name:"username",label:"Username"},{name:"email",label:"Email"},{name:"pubkey",label:"Public Key"},{name:"created_at",label:"Creation Date"},{name:"updated_at",label:"Last Updated"}],search:null,hideEmpty:!0,loading:!1}}},watch:{"usersTable.hideEmpty":function(e,t){this.usersTable.filter=e?{"transaction_count[gt]":0}:{},this.fetchUsers()}},created(){this.fetchUsers()},computed:{lightningAddressSuffix:()=>`@${window.location.host}`},methods:{formatSat:e=>LNbits.utils.formatSat(Math.floor(e/1e3)),backToUsersPage(){this.activeUser.show=!1,this.paymentPage.show=!1,this.activeWallet.show=!1,this.fetchUsers()},handleBalanceUpdate(){this.fetchWallets(this.activeWallet.userId)},resetPassword(e){return LNbits.api.request("PUT",`/users/api/v1/user/${e}/reset_password`).then(e=>{LNbits.utils.confirmDialog(this.$t("reset_key_generated")+" "+this.$t("reset_key_copy")).onOk(()=>{const t=window.location.origin+"?reset_key="+e.data;this.utils.copyText(t)})}).catch(LNbits.utils.notifyApiError)},sortByColumn(e){this.usersTable.pagination.sortBy===e?this.usersTable.pagination.descending=!this.usersTable.pagination.descending:(this.usersTable.pagination.sortBy=e,this.usersTable.pagination.descending=!1),this.fetchUsers()},createUser(){LNbits.api.request("POST","/users/api/v1/user",null,this.activeUser.data).then(e=>{Quasar.Notify.create({type:"positive",message:"User created!",icon:null}),this.activeUser.setPassword=!0,this.activeUser.data=e.data,this.fetchUsers()}).catch(LNbits.utils.notifyApiError)},updateUser(){LNbits.api.request("PUT",`/users/api/v1/user/${this.activeUser.data.id}`,null,this.activeUser.data).then(()=>{Quasar.Notify.create({type:"positive",message:"User updated!",icon:null}),this.activeUser.data=null,this.activeUser.show=!1,this.fetchUsers()}).catch(LNbits.utils.notifyApiError)},createWallet(){const e=this.activeWallet.userId;e?LNbits.api.request("POST",`/users/api/v1/user/${e}/wallet`,null,this.createWalletDialog.data).then(()=>{this.fetchWallets(e),Quasar.Notify.create({type:"positive",message:"Wallet created!"})}).catch(LNbits.utils.notifyApiError):Quasar.Notify.create({type:"warning",message:"No user selected!",icon:null})},deleteUser(e){LNbits.utils.confirmDialog("Are you sure you want to delete this user?").onOk(()=>{LNbits.api.request("DELETE",`/users/api/v1/user/${e}`).then(()=>{this.fetchUsers(),Quasar.Notify.create({type:"positive",message:"User deleted!",icon:null}),this.activeUser.data=null,this.activeUser.show=!1}).catch(LNbits.utils.notifyApiError)})},undeleteUserWallet(e,t){LNbits.api.request("PUT",`/users/api/v1/user/${e}/wallet/${t}/undelete`).then(()=>{this.fetchWallets(e),Quasar.Notify.create({type:"positive",message:"Undeleted user wallet!",icon:null})}).catch(LNbits.utils.notifyApiError)},deleteUserWallet(e,t,s){const a=s?"Wallet is already deleted, are you sure you want to permanently delete this user wallet?":"Are you sure you want to delete this user wallet?";LNbits.utils.confirmDialog(a).onOk(()=>{LNbits.api.request("DELETE",`/users/api/v1/user/${e}/wallet/${t}`).then(()=>{this.fetchWallets(e),Quasar.Notify.create({type:"positive",message:"User wallet deleted!",icon:null})}).catch(LNbits.utils.notifyApiError)})},deleteAllUserWallets(e){LNbits.utils.confirmDialog(this.$t("confirm_delete_all_wallets")).onOk(()=>{LNbits.api.request("DELETE",`/users/api/v1/user/${e}/wallets`).then(t=>{Quasar.Notify.create({type:"positive",message:t.data.message,icon:null}),this.fetchWallets(e)}).catch(LNbits.utils.notifyApiError)})},copyWalletLink(e){const t=`${window.location.origin}/wallet?usr=${this.activeWallet.userId}&wal=${e}`;this.utils.copyText(t)},showLightningAddressDialog(e){this.lightningAddressDialog.wallet=e,this.lightningAddressDialog.lightningAddress=e.lightning_address||"",this.lightningAddressDialog.show=!0},saveLightningAddress(){const e=this.lightningAddressDialog.wallet;e&&LNbits.api.request("PUT",`/users/api/v1/user/${e.user}/wallet/${e.id}/lightning-address`,null,{lightning_address:this.lightningAddressDialog.lightningAddress}).then(t=>{Object.assign(e,t.data),this.lightningAddressDialog.show=!1,Quasar.Notify.create({type:"positive",message:this.$t("lightning_address_updated"),icon:null})}).catch(LNbits.utils.notifyApiError)},fetchUsers(e){this.relaxFilterForFields(["username","email"]);const t=LNbits.utils.prepareFilterQuery(this.usersTable,e);LNbits.api.request("GET",`/users/api/v1/user?${t}`).then(e=>{this.usersTable.loading=!1,this.usersTable.pagination.rowsNumber=e.data.total,this.users=e.data.data}).catch(LNbits.utils.notifyApiError)},fetchWallets(e){return LNbits.api.request("GET",`/users/api/v1/user/${e}/wallet`).then(t=>{this.wallets=t.data,this.activeWallet.userId=e,this.activeWallet.show=!0}).catch(LNbits.utils.notifyApiError)},relaxFilterForFields(e=[]){e.forEach(e=>{const t=this.usersTable?.filter?.[e];t&&this.usersTable.filter[e]&&(this.usersTable.filter[`${e}[like]`]=t,delete this.usersTable.filter[e])})},updateWallet(e){LNbits.api.request("PATCH","/api/v1/wallet",e.adminkey,{name:e.name}).then(()=>{e.editable=!1,Quasar.Notify.create({message:"Wallet name updated.",type:"positive",timeout:3500})}).catch(e=>{LNbits.utils.notifyApiError(e)})},toggleAdmin(e){LNbits.api.request("PUT",`/users/api/v1/user/${e}/admin`).then(()=>{this.fetchUsers(),Quasar.Notify.create({type:"positive",message:"Toggled admin!",icon:null})}).catch(LNbits.utils.notifyApiError)},toggleUserActivated(e){LNbits.api.request("PUT",`/users/api/v1/user/${e}/activate`).then(e=>{this.fetchUsers(),Quasar.Notify.create({type:"positive",message:e.data.message,icon:null})}).catch(LNbits.utils.notifyApiError)},async showAccountPage(e){if(this.activeUser.showPassword=!1,this.activeUser.showUserId=!1,this.activeUser.setPassword=!1,!e)return this.activeUser.data={extra:{}},void(this.activeUser.show=!0);try{const{data:t}=await LNbits.api.request("GET",`/users/api/v1/user/${e}`);this.activeUser.data=t,this.activeUser.show=!0}catch(e){console.warn(e),Quasar.Notify.create({type:"warning",message:"Failed to get user!"}),this.activeUser.show=!1}},async impersonateUser(e){try{await LNbits.api.impersonateUser(e),LNbits.utils.backupLocalStorage("impersonation",!0),this.$q.localStorage.setItem("lnbits.disclaimerShown",!0),window.location="/wallet"}catch(e){console.warn(e),Quasar.Notify.create({type:"warning",message:"Failed to impersonate user!"})}},async showWalletPayments(e){this.activeUser.show=!1,await this.fetchWallets(this.users[0].id),await this.showPayments(e)},showPayments(e){this.paymentsWallet=this.wallets.find(t=>t.id===e),this.paymentPage.show=!0},searchUserBy(e){const t=this.searchData[e];this.usersTable.filter={},t&&(this.usersTable.filter[e]=t),this.fetchUsers()},shortify:e=>(valueLength=(e||"").length,valueLength<=10?e:`${e.substring(0,5)}...${e.substring(valueLength-5,valueLength)}`)}},window.PageAccount={template:"#page-account",data(){return{untouchedUser:null,hasUsername:!1,showUserId:!1,themeOptions:[{name:"bitcoin",color:"deep-orange"},{name:"classic",color:"purple"},{name:"mint",color:"green"},{name:"autumn",color:"brown"},{name:"monochrome",color:"grey"},{name:"salvador",color:"blue-10"},{name:"freedom",color:"pink-13"},{name:"cyber",color:"light-green-9"},{name:"flamingo",color:"pink-3"}],defaultSiteCustomisation:{locale:"en"},reactionOptions:["None","confettiBothSides","confettiFireworks","confettiStars","confettiTop","lightningStrike"],borderOptions:["retro-border","hard-border","neon-border","no-border"],tab:"user",credentialsData:{show:!1,oldPassword:null,newPassword:null,newPasswordRepeat:null,username:null,pubkey:null},apiAcl:{showNewAclDialog:!1,showPasswordDialog:!1,showNewTokenDialog:!1,data:[],passwordGuardedFunction:null,newAclName:"",newTokenName:"",password:"",apiToken:null,selectedTokenId:null,columns:[{name:"Name",align:"left",label:this.$t("Name"),field:"Name",sortable:!1},{name:"path",align:"left",label:this.$t("path"),field:"path",sortable:!1},{name:"read",align:"left",label:this.$t("read"),field:"read",sortable:!1},{name:"write",align:"left",label:this.$t("write"),field:"write",sortable:!1}],pagination:{rowsPerPage:100,page:1}},selectedApiAcl:{id:null,name:null,endpoints:[],token_id_list:[],allRead:!1,allWrite:!1},assets:[],assetsTable:{loading:!1,columns:[{name:"name",align:"left",label:this.$t("Name"),field:"name",sortable:!0},{name:"created_at",align:"left",label:this.$t("created_at"),field:"created_at",sortable:!0}],pagination:{rowsPerPage:6,page:1}},assetsUploadToPublic:!1,notifications:{nostr:{identifier:""}},labels:[],labelsDialog:{show:!1,data:{name:"",description:"",color:"#000000"}},labelsTable:{loading:!1,columns:[{name:"actions",align:"left"},{name:"name",align:"left",label:this.$t("Name"),field:"name",sortable:!0},{name:"description",align:"left",label:this.$t("description"),field:"description"},{name:"color",align:"left",label:this.$t("color"),field:"color"}],pagination:{rowsPerPage:6,page:1}}}},watch:{tab(e){this.$router.push(`/account#${e}`)},$route(e){e.hash.length>1&&(this.tab=e.hash.replace("#",""))},"assetsTable.search":{handler(){const e={};this.assetsTable.search&&(e.search=this.assetsTable.search),this.getUserAssets()}}},computed:{isUserTouched(){return!_.isEqual(this.g.user,this.untouchedUser)},selectedApiToken(){return this.selectedApiAcl.token_id_list.find(e=>e.id===this.apiAcl.selectedTokenId)},expiryAt(){return this.selectedApiToken.expires_at?`${this.$t("expiry")}: ${LNbits.utils.formatTimestamp(this.selectedApiToken.expires_at)}`:""},tokenStatus(){if(this.selectedApiToken.expires_at){const e=new Date;let t="",s="positive";return new Date(1e3*this.selectedApiToken.expires_at){const t=this.apiAcl.data.find(t=>t.id===e);this.selectedApiAcl&&(this.selectedApiAcl={...t},this.selectedApiAcl.allRead=this.selectedApiAcl.endpoints.every(e=>e.read),this.selectedApiAcl.allWrite=this.selectedApiAcl.endpoints.every(e=>e.write))})},handleAllEndpointsReadAccess(){this.selectedApiAcl.endpoints.forEach(e=>e.read=this.selectedApiAcl.allRead)},handleAllEndpointsWriteAccess(){this.selectedApiAcl.endpoints.forEach(e=>e.write=this.selectedApiAcl.allWrite)},async getApiACLs(){try{const{data:e}=await LNbits.api.request("GET","/api/v1/auth/acl",null);this.apiAcl.data=e.access_control_list}catch(e){LNbits.utils.notifyApiError(e)}},askPasswordAndRunFunction(e){this.apiAcl.passwordGuardedFunction=e,this.apiAcl.showPasswordDialog=!0},runPasswordGuardedFunction(){this.apiAcl.showPasswordDialog=!1;const e=this.apiAcl.passwordGuardedFunction;e&&this[e]()},async addApiACL(){if(this.apiAcl.newAclName){try{const{data:e}=await LNbits.api.request("PUT","/api/v1/auth/acl",null,{id:this.apiAcl.newAclName,name:this.apiAcl.newAclName,password:this.apiAcl.password});this.apiAcl.data=e.access_control_list;const t=this.apiAcl.data.find(e=>e.name===this.apiAcl.newAclName);this.handleApiACLSelected(t.id),this.apiAcl.showNewAclDialog=!1,this.$q.notify({type:"positive",message:"Access Control List created."})}catch(e){LNbits.utils.notifyApiError(e)}finally{this.apiAcl.name="",this.apiAcl.password=""}this.apiAcl.showNewAclDialog=!1}else this.$q.notify({type:"warning",message:"Name is required."})},async updateApiACLs(){try{const{data:e}=await LNbits.api.request("PUT","/api/v1/auth/acl",null,{id:this.g.user.id,password:this.apiAcl.password,...this.selectedApiAcl});this.apiAcl.data=e.access_control_list}catch(e){LNbits.utils.notifyApiError(e)}finally{this.apiAcl.password=""}},async deleteApiACL(){if(this.selectedApiAcl.id){try{await LNbits.api.request("DELETE","/api/v1/auth/acl",null,{id:this.selectedApiAcl.id,password:this.apiAcl.password}),this.$q.notify({type:"positive",message:"Access Control List deleted."})}catch(e){LNbits.utils.notifyApiError(e)}finally{this.apiAcl.password=""}this.apiAcl.data=this.apiAcl.data.filter(e=>e.id!==this.selectedApiAcl.id),this.handleApiACLSelected(this.apiAcl.data[0]?.id)}},async generateApiToken(){if(!this.selectedApiAcl.id)return;const e=new Date(this.apiAcl.newTokenExpiry)-new Date;try{const{data:t}=await LNbits.api.request("POST","/api/v1/auth/acl/token",null,{acl_id:this.selectedApiAcl.id,token_name:this.apiAcl.newTokenName,password:this.apiAcl.password,expiration_time_minutes:Math.trunc(e/6e4)});this.apiAcl.apiToken=t.api_token,this.apiAcl.selectedTokenId=t.id,Quasar.Notify.create({type:"positive",message:"Token Generated."}),await this.getApiACLs(),this.handleApiACLSelected(this.selectedApiAcl.id),this.apiAcl.showNewTokenDialog=!1}catch(e){LNbits.utils.notifyApiError(e)}finally{this.apiAcl.password=""}},async deleteToken(){if(this.apiAcl.selectedTokenId)try{await LNbits.api.request("DELETE","/api/v1/auth/acl/token",null,{id:this.apiAcl.selectedTokenId,acl_id:this.selectedApiAcl.id,password:this.apiAcl.password}),this.$q.notify({type:"positive",message:"Token deleted."}),this.selectedApiAcl.token_id_list=this.selectedApiAcl.token_id_list.filter(e=>e.id!==this.apiAcl.selectedTokenId),this.apiAcl.selectedTokenId=null}catch(e){LNbits.utils.notifyApiError(e)}finally{this.apiAcl.password=""}},async getUserAssets(e){try{this.assetsTable.loading=!0;const t=LNbits.utils.prepareFilterQuery(this.assetsTable,e),{data:s}=await LNbits.api.request("GET",`/api/v1/assets/paginated?${t}`,null);this.assets=s.data,this.assetsTable.pagination.rowsNumber=s.total}catch(e){LNbits.utils.notifyApiError(e)}finally{this.assetsTable.loading=!1}},onImageInput(e){const t=e.target.files[0];t&&this.uploadAsset(t),e.target.value=null},onBackgroundImageInput(e){const t=e.target.files[0];t&&this.uploadBackgroundImage(t),e.target.value=null},async uploadAsset(e,{isPublic:t=this.assetsUploadToPublic,notifySuccess:s=!0}={}){const a=new FormData;a.append("file",e);try{const{data:e}=await LNbits.api.request("POST",`/api/v1/assets?public_asset=${t}`,null,a,{headers:{"Content-Type":"multipart/form-data"}});return s&&this.$q.notify({type:"positive",message:"Upload successful!",icon:null}),await this.getUserAssets(),e}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async uploadBackgroundImage(e){const t=await this.uploadAsset(e,{isPublic:!1,notifySuccess:!1});if(!t)return;const s=`${window.location.origin}/api/v1/assets/${t.id}/thumbnail`;await this.siteCustomisationChanged({bgimageChoice:s})},async deleteAsset(e){LNbits.utils.confirmDialog("Are you sure you want to delete this asset?").onOk(async()=>{try{await LNbits.api.request("DELETE",`/api/v1/assets/${e.id}`,null),this.$q.notify({type:"positive",message:"Asset deleted."}),await this.getUserAssets()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}})},async toggleAssetPublicAccess(e){try{await LNbits.api.request("PUT",`/api/v1/assets/${e.id}`,null,{is_public:!e.is_public}),this.$q.notify({type:"positive",message:"Update successful!",icon:null}),await this.getUserAssets()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},copyAssetLinkToClipboard(e){const t=`${window.location.origin}/api/v1/assets/${e.id}/data`;this.utils.copyText(t)},addUserLabel(){if(!this.labelsDialog.data.name)return void this.$q.notify({type:"warning",message:"Name is required."});if(!this.labelsDialog.data.color)return void this.$q.notify({type:"warning",message:"Color is required."});this.g.user.extra.labels=this.g.user.extra.labels||[];if(!this.g.user.extra.labels.find(e=>e.name===this.labelsDialog.data.name))return this.g.user.extra.labels.unshift({...this.labelsDialog.data}),this.labelsDialog.show=!1,!0;this.$q.notify({type:"warning",message:"A label with this name already exists."})},openAddLabelDialog(){this.labelsDialog.data={name:"",description:"",color:"#000000"},this.labelsDialog.show=!0},openEditLabelDialog(e){this.labelsDialog.data={name:e.name,description:e.description,color:e.color},this.labelsDialog.show=!0},updateUserLabel(){const e=this.labelsDialog.data,t=JSON.parse(JSON.stringify(this.g.user.extra.labels));this.g.user.extra.labels=this.g.user.extra.labels.filter(t=>t.name!==e.name);this.addUserLabel()||(this.g.user.extra.labels=t),this.labelsDialog.show=!1},deleteUserLabel(e){LNbits.utils.confirmDialog("Are you sure you want to delete this label?").onOk(()=>{this.g.user.extra.labels=this.g.user.extra.labels.filter(t=>t.name!==e.name)})},async siteCustomisationChanged(e={}){try{Object.entries(e||{}).forEach(([e,t])=>{e in this.g&&(this.g[e]=t)}),await LNbits.api.updateUiCustomization(e),this.$q.notify({type:"positive",message:"UI Customization updated."})}catch(e){LNbits.utils.notifyApiError(e)}},resetThemeDefaults(){const e={themeChoice:this.g.settings.defaultTheme,borderChoice:this.g.settings.defaultBorder,gradientChoice:this.g.settings.defaultGradient,bgimageChoice:this.g.settings.defaultBgimage||"",reactionChoice:this.g.settings.defaultReaction,darkChoice:this.g.settings.defaultDark,cardRoundedChoice:this.g.settings.defaultCardRounded,cardGradientChoice:this.g.settings.defaultCardGradient,cardShadowChoice:this.g.settings.defaultCardShadow,burgerMenuChoice:this.g.settings.defaultBurgerMenuBackground};this.siteCustomisationChanged(e)}},async created(){this.untouchedUser=JSON.parse(JSON.stringify(this.g.user)),this.hasUsername=!!this.g.user.username,this.$route.hash.length>1&&(this.tab=this.$route.hash.replace("#","")),await this.getApiACLs(),await this.getUserAssets(),this.themeOptions=this.themeOptions.filter(e=>this.g.settings.themeOptions.includes(e.name))}},window.PageAdmin={template:"#page-admin",data:()=>({tab:"funding",settings:{},formData:{lnbits_exchange_rate_providers:[],lnbits_audit_exclude_paths:[],lnbits_audit_include_paths:[],lnbits_audit_http_response_codes:[]},isSuperUser:!1,needsRestart:!1}),watch:{tab(e){if(["wasm-runtime","wasm-limit-config"].includes(e)&&this.$route.path.startsWith("/admin/extensions/wasm"))return;const t=this.adminRouteForTab(e);this.$route.fullPath!==t&&this.$router.push(t)},$route(e){const t=this.adminTabFromRoute(e);this.tab!==t&&(this.tab=t)}},async created(){this.tab=this.adminTabFromRoute(this.$route),await this.getSettings()},computed:{checkChanges(){return!_.isEqual(this.settings,this.formData)}},methods:{adminTabFromRoute:e=>e.path.startsWith("/admin/extensions/wasm/limits")?"wasm-limit-config":e.path.startsWith("/admin/extensions/wasm")?"wasm-runtime":e.hash.length>1?e.hash.replace("#",""):"funding",adminRouteForTab:e=>"wasm-runtime"===e?"/admin/extensions/wasm":"wasm-limit-config"===e?"/admin/extensions/wasm/limits":`/admin#${e}`,getDefaultSetting(e){LNbits.api.getDefaultSetting(e).then(t=>{this.formData[e]=t.data.default_value})},restartServer(){LNbits.api.request("GET","/admin/api/v1/restart/").then(e=>{this.$q.notify({type:"positive",message:"Success! Restarted Server",icon:null}),this.needsRestart=!1}).catch(LNbits.utils.notifyApiError)},async getSettings(){await LNbits.api.request("GET","/admin/api/v1/settings",this.g.user.wallets[0].adminkey).then(e=>{this.isSuperUser=e.data.is_super_user||!1,this.settings=e.data,this.formData={...this.settings}}).catch(LNbits.utils.notifyApiError)},updateSettings(){const e=_.omit(this.formData,["is_super_user","lnbits_allowed_funding_sources","touch"]);LNbits.api.request("PUT","/admin/api/v1/settings",this.g.user.wallets[0].adminkey,e).then(e=>{this.needsRestart=this.settings.lnbits_backend_wallet_class!==this.formData.lnbits_backend_wallet_class,this.settings=this.formData,this.formData=_.clone(this.settings),Quasar.Notify.create({type:"positive",message:"Success! Settings changed! "+(this.needsRestart?"Restart required!":""),icon:null})}).catch(LNbits.utils.notifyApiError)},deleteSettings(){LNbits.utils.confirmDialog("Are you sure you want to restore settings to default?").onOk(()=>{LNbits.api.request("DELETE","/admin/api/v1/settings").then(e=>{Quasar.Notify.create({type:"positive",message:"Success! Restored settings to defaults. Restarting...",icon:null}),this.$q.localStorage.clear()}).catch(LNbits.utils.notifyApiError)})},downloadBackup(){window.open("/admin/api/v1/backup","_blank")}}},window.app.component("lnbits-admin-funding-seed-backup",{props:["active","is-super-user","form-data","settings"],template:"#lnbits-admin-funding-seed-backup",data:()=>({dialog:{show:!1,step:1,seed:"",visible:!1,challenge:[],answers:{},error:"",confirmField:""}}),watch:{active(e){e&&this.openIfRequired()},"formData.lnbits_backend_wallet_class"(e,t){const s=this.seedBackupSource(e);t&&s&&this.formData[s.seedField]&&(this.formData[s.confirmField]=!1),this.openIfRequired()},"formData.boltz_mnemonic"(){this.formData.boltz_mnemonic_backup_confirmed=this.formData.boltz_mnemonic===this.settings.boltz_mnemonic&&this.settings.boltz_mnemonic_backup_confirmed,this.openIfRequired()},"formData.phoenixd_mnemonic"(){this.formData.phoenixd_mnemonic_backup_confirmed=this.formData.phoenixd_mnemonic===this.settings.phoenixd_mnemonic&&this.settings.phoenixd_mnemonic_backup_confirmed,this.openIfRequired()},"formData.spark_l2_mnemonic"(){this.formData.spark_l2_mnemonic_backup_confirmed=this.formData.spark_l2_mnemonic===this.settings.spark_l2_mnemonic&&this.settings.spark_l2_mnemonic_backup_confirmed,this.openIfRequired()}},computed:{seedWords(){return this.dialog.seed.split(/\s+/).filter(Boolean).map((e,t)=>({index:t,word:e}))}},created(){this.openIfRequired()},methods:{seedBackupSource(e=this.formData.lnbits_backend_wallet_class){return"BoltzWallet"===e?{seedField:"boltz_mnemonic",confirmField:"boltz_mnemonic_backup_confirmed"}:"PhoenixdWallet"===e?{seedField:"phoenixd_mnemonic",confirmField:"phoenixd_mnemonic_backup_confirmed"}:"SparkL2Wallet"===e?{seedField:"spark_l2_mnemonic",confirmField:"spark_l2_mnemonic_backup_confirmed"}:void 0},openIfRequired(){if(!this.active||!this.isSuperUser)return;const e=this.seedBackupSource();if(!e)return;const t=(this.formData[e.seedField]||"").trim(),s=this.formData[e.confirmField];!t||s||this.dialog.show||(this.dialog={show:!0,step:1,seed:t,visible:!1,challenge:[],answers:{},error:"",confirmField:e.confirmField})},prepareChallenge(){const e=this.dialog.seed.split(/\s+/).filter(Boolean),t=Math.min(4,e.length),s=_.shuffle([...Array(e.length).keys()]).slice(0,t);this.dialog.challenge=s.sort((e,t)=>e-t).map(t=>({index:t,word:e[t]})),this.dialog.answers={},this.dialog.error="",this.dialog.step=2},submitChallenge(){if(!this.dialog.challenge.every(({index:e,word:t})=>(this.dialog.answers[e]||"").trim().toLowerCase()===t.toLowerCase()))return void(this.dialog.error="One or more words are incorrect. Check your backup and try again.");const e=this.dialog.confirmField;LNbits.api.request("PATCH","/admin/api/v1/settings",this.g.user.wallets[0].adminkey,{[e]:!0}).then(()=>{this.formData[e]=!0,this.settings[e]=!0,this.dialog.show=!1,Quasar.Notify.create({type:"positive",message:"Seed backup confirmed",icon:"check"})}).catch(LNbits.utils.notifyApiError)}}}),window.app.component("lnbits-admin-funding",{props:["active","is-super-user","form-data","settings"],template:"#lnbits-admin-funding",data:()=>({auditData:[]}),created(){this.getAudit()},methods:{getAudit(){LNbits.api.request("GET","/admin/api/v1/audit",this.g.user.wallets[0].adminkey).then(e=>{this.auditData=e.data}).catch(LNbits.utils.notifyApiError)}}}),window.app.component("lnbits-admin-funding-sources",{template:"#lnbits-admin-funding-sources",props:["form-data","allowed-funding-sources"],methods:{getFundingSourceLabel(e){const t=this.rawFundingSources.find(t=>t[0]===e);return t?t[1]:e},showQRValue(e){this.qrValue=e,this.showQRDialog=!0}},computed:{fundingSources(){let e=[];for(const[t,s,a]of this.rawFundingSources){const s={};if(null!==a)for(let[e,t]of Object.entries(a))s[e]="string"==typeof t?{label:t,value:null}:t||{};e.push([t,s])}return new Map(e)},sortedAllowedFundingSources(){return this.allowedFundingSources.sort()}},data:()=>({hideInput:!0,showQRDialog:!1,qrValue:"",rawFundingSources:[["VoidWallet","Void Wallet",null],["FakeWallet","Fake Wallet",{fake_wallet_secret:"Secret",lnbits_denomination:'"sats" or 3 Letter Custom Denomination'}],["CLNRestWallet","Core Lightning Rest (plugin)",{clnrest_url:"Endpoint",clnrest_ca:"ca.pem",clnrest_cert:"server.pem",clnrest_readonly_rune:"Rune used for readonly requests",clnrest_invoice_rune:"Rune used for creating invoices",clnrest_pay_rune:"Rune used for paying invoices using pay",clnrest_renepay_rune:"Rune used for paying invoices using renepay",clnrest_last_pay_index:"Ignores any invoices paid prior to or including this index. 0 is equivalent to not specifying and negative value is invalid.",clnrest_nodeid:"Node id"}],["CoreLightningWallet","Core Lightning",{corelightning_rpc:"Endpoint",corelightning_pay_command:"Custom Pay Command"}],["CoreLightningRestWallet","Core Lightning Rest (legacy)",{corelightning_rest_url:"Endpoint",corelightning_rest_cert:"Certificate",corelightning_rest_macaroon:"Macaroon"}],["LndRestWallet","Lightning Network Daemon (LND Rest)",{lnd_rest_endpoint:"Endpoint",lnd_rest_cert:"Certificate",lnd_rest_macaroon:"Macaroon",lnd_rest_macaroon_encrypted:"Encrypted Macaroon",lnd_rest_route_hints:{advanced:!0,label:"Enable Route Hints"},lnd_rest_allow_self_payment:{advanced:!0,label:"Allow Self Payment"}}],["LndWallet","Lightning Network Daemon (LND)",{lnd_grpc_endpoint:"Endpoint",lnd_grpc_cert:"Certificate",lnd_grpc_port:"Port",lnd_grpc_macaroon:"GRPC Macaroon",lnd_grpc_invoice_macaroon:"GRPC Invoice Macaroon",lnd_grpc_admin_macaroon:"GRPC Admin Macaroon",lnd_grpc_macaroon_encrypted:"Encrypted Macaroon",lnd_grpc_allow_self_payment:{advanced:!0,label:"Allow Self Payment"}}],["LnTipsWallet","LN.Tips",{lntips_api_endpoint:"Endpoint",lntips_api_key:"API Key"}],["LNPayWallet","LN Pay",{lnpay_api_endpoint:"Endpoint",lnpay_api_key:"API Key",lnpay_wallet_key:"Wallet Key"}],["EclairWallet","Eclair (ACINQ)",{eclair_url:"URL",eclair_pass:"Password"}],["LNbitsWallet","LNbits",{lnbits_endpoint:"Endpoint",lnbits_key:"Admin Key"}],["BlinkWallet","Blink",{blink_api_endpoint:"Endpoint",blink_ws_endpoint:"WebSocket",blink_token:"Key",blink_send_without_probe:{advanced:!0,label:"Send payment if fee probe fails",hint:"If enabled (default), payments to destinations that cannot be probed (e.g. fedimints) are still sent. If disabled, such payments fail."}}],["AlbyWallet","Alby",{alby_api_endpoint:"Endpoint",alby_access_token:"Key"}],["BarkWallet","Bark",{bark_api_endpoint:{label:"Endpoint",value:"http://localhost:3000"},bark_api_token:"auth_token"}],["BoltzWallet","Boltz",{boltz_client_endpoint:{label:"Boltz client endpoint",value:"127.0.0.1:9002"},boltz_client_macaroon:{label:"Admin Macaroon path or hex",value:"/home/ubuntu/.boltz/macaroons/admin.macaroon"},boltz_client_cert:{label:"Certificate path or hex",value:"/home/ubuntu/.boltz/tls.cert"},boltz_mnemonic:{label:"Liquid seed phrase",hint:"Boltz will fetch once connected, but you can change later (can be opened in a liquid wallet) ",copy:!0,qrcode:!0},boltz_client_password:{label:"Wallet Password (optional)",advanced:!0}}],["ZBDWallet","ZBD",{zbd_api_endpoint:"Endpoint",zbd_api_key:"Key"}],["PhoenixdWallet","Phoenixd",{phoenixd_api_endpoint:"Endpoint",phoenixd_api_password:"Key",phoenixd_data_dir:{label:"Data Directory",hint:"Directory where phoenixd stores its data, including the seed phrase."},phoenixd_mnemonic:{label:"Phoenixd Seed Phrase",hint:"Only available if phoenixd data-dir is specified",readonly:!0,copy:!0,qrcode:!0}}],["OpenNodeWallet","OpenNode",{opennode_api_endpoint:"Endpoint",opennode_key:"Key"}],["ClicheWallet","Cliche (NBD)",{cliche_endpoint:"Endpoint"}],["SparkWallet","Spark",{spark_url:"Endpoint",spark_token:"Token"}],["SparkL2Wallet","Spark (L2)",{spark_l2_external_endpoint:{label:"External Sidecar Endpoint",hint:"Make sure to also specify the API key if your sidecar requires authentication.",value:""},spark_l2_mnemonic:{label:"External Sidecar Mnemonic",hint:"Mnemonic for the Spark wallet on the external sidecar. Required if the side car does not have its own mnemonic.",value:""},spark_l2_external_api_key:{label:"External Sidecar API Key",hint:"API key for authenticating with the external sidecar if it requires authentication.",value:""},spark_l2_network:{label:"Network",value:"MAINNET",hint:"The network to use for the Spark wallet.",advanced:!0},spark_l2_pay_wait_ms:{label:"Payment Wait Time (ms)",hint:"The time to wait for a payment to be processed before considering it failed.",advanced:!0},spark_l2_pay_poll_ms:{label:"Payment Poll Time (ms)",hint:"The time to wait between polling for payment status updates.",advanced:!0},spark_l2_stream_keepalive_ms:{label:"Stream Keepalive Time (ms)",hint:"The time to wait between sending keepalive messages to the Spark sidecar to keep the connection open.",advanced:!0}}],["NWCWallet","Nostr Wallet Connect",{nwc_pairing_url:"Pairing URL"}],["BreezSdkWallet","Breez SDK",{breez_api_key:"Breez API Key",breez_greenlight_seed:"Greenlight Seed",breez_greenlight_device_key:"Greenlight Device Key",breez_greenlight_device_cert:"Greenlight Device Cert",breez_greenlight_invite_code:"Greenlight Invite Code"}],["StrikeWallet","Strike (alpha)",{strike_api_endpoint:"API Endpoint",strike_api_key:"API Key"}],["BreezLiquidSdkWallet","Breez Liquid SDK",{breez_liquid_api_key:"Breez API Key (can be empty)",breez_liquid_seed:"Liquid seed phrase",breez_liquid_fee_offset_sat:"Offset amount in sats to increase fee limit"}]]})}),window.app.component("lnbits-admin-fiat-providers",{props:["form-data"],template:"#lnbits-admin-fiat-providers",data:()=>({formAddStripeUser:"",formAddPaypalUser:"",formAddSquareUser:"",formAddRevolutUser:"",creatingRevolutWebhook:!1,hideInputToggle:!0}),computed:{stripeWebhookUrl(){return this.formData?.stripe_payment_webhook_url||this.calculateWebhookUrl("stripe")},paypalWebhookUrl(){return this.formData?.paypal_payment_webhook_url||this.calculateWebhookUrl("paypal")},revolutWebhookUrl(){return this.formData?.revolut_payment_webhook_url||this.calculateWebhookUrl("revolut")}},watch:{formData:{handler(){this.syncWebhookUrls()},immediate:!0}},methods:{basePathFromLocation(){if("undefined"==typeof window)return"";const e=window.location.pathname.replace(/\/+$/,""),t=e.lastIndexOf("/admin");return(t>=0?e.slice(0,t):e||"")||""},calculateWebhookUrl(e){if("undefined"==typeof window)return"";const t=`${this.basePathFromLocation()}/api/v1/callback/${e}`.replace(/\/+/g,"/"),s=t.startsWith("/")?t:`/${t}`;return`${window.location.origin}${s}`},syncWebhookUrls(){this.maybeSetWebhookUrl("stripe_payment_webhook_url","stripe"),this.maybeSetWebhookUrl("paypal_payment_webhook_url","paypal"),this.maybeSetWebhookUrl("square_payment_webhook_url","square"),this.maybeSetWebhookUrl("revolut_payment_webhook_url","revolut")},maybeSetWebhookUrl(e,t){if(!this.formData)return;const s=this.calculateWebhookUrl(t),a=this.formData[e];(!a||a.includes("your-lnbits-domain-here.com"))&&s&&(this.formData[e]=s)},copyWebhookUrl(e){e&&this.copyText(e)},isClearnetWebhookUrl(e){let t;try{t=new URL(e)}catch(e){return!1}const s=t.hostname.toLowerCase();return!!["http:","https:"].includes(t.protocol)&&(!("localhost"===s||s.endsWith(".localhost")||s.endsWith(".local")||s.endsWith(".onion"))&&!(/^127\./.test(s)||/^10\./.test(s)||/^192\.168\./.test(s)||/^169\.254\./.test(s)||/^172\.(1[6-9]|2\d|3[0-1])\./.test(s)||"0.0.0.0"===s||"::1"===s))},notifyRevolutWebhookWarning(e){Quasar.Notify.create({type:"warning",message:e,icon:null,closeBtn:!0})},addStripeAllowedUser(){const e=this.formAddStripeUser||"";e.length&&!this.formData.stripe_limits.allowed_users.includes(e)&&(this.formData.stripe_limits.allowed_users=[...this.formData.stripe_limits.allowed_users,e],this.formAddStripeUser="")},removeStripeAllowedUser(e){this.formData.stripe_limits.allowed_users=this.formData.stripe_limits.allowed_users.filter(t=>t!==e)},addPaypalAllowedUser(){const e=this.formAddPaypalUser||"";e.length&&!this.formData.paypal_limits.allowed_users.includes(e)&&(this.formData.paypal_limits.allowed_users=[...this.formData.paypal_limits.allowed_users,e],this.formAddPaypalUser="")},removePaypalAllowedUser(e){this.formData.paypal_limits.allowed_users=this.formData.paypal_limits.allowed_users.filter(t=>t!==e)},addSquareAllowedUser(){const e=this.formAddSquareUser||"";e.length&&!this.formData.square_limits.allowed_users.includes(e)&&(this.formData.square_limits.allowed_users=[...this.formData.square_limits.allowed_users,e],this.formAddSquareUser="")},removeSquareAllowedUser(e){this.formData.square_limits.allowed_users=this.formData.square_limits.allowed_users.filter(t=>t!==e)},addRevolutAllowedUser(){const e=this.formAddRevolutUser||"";e.length&&!this.formData.revolut_limits.allowed_users.includes(e)&&(this.formData.revolut_limits.allowed_users=[...this.formData.revolut_limits.allowed_users,e],this.formAddRevolutUser="")},removeRevolutAllowedUser(e){this.formData.revolut_limits.allowed_users=this.formData.revolut_limits.allowed_users.filter(t=>t!==e)},checkFiatProvider(e){LNbits.api.request("PUT",`/api/v1/fiat/check/${e}`).then(e=>{const t=e.data;Quasar.Notify.create({type:t.success?"positive":"warning",message:t.message,icon:null})}).catch(LNbits.utils.notifyApiError)},createRevolutWebhook(){const e=this.calculateWebhookUrl("revolut");this.formData.revolut_payment_webhook_url=e,this.formData.revolut_api_secret_key?this.isClearnetWebhookUrl(e)?(this.creatingRevolutWebhook=!0,LNbits.api.request("POST","/api/v1/fiat/revolut/webhook",null,{url:e,endpoint:this.formData.revolut_api_endpoint,api_secret_key:this.formData.revolut_api_secret_key,api_version:this.formData.revolut_api_version}).then(e=>{const t=e.data;this.formData.revolut_payment_webhook_url=t.url,this.formData.revolut_webhook_signing_secret=t.signing_secret,Quasar.Notify.create({type:"positive",message:`Revolut webhook ${t.already_exists?"already exists":"created"}${t.id?`: ${t.id}`:""}.`,icon:null})}).catch(LNbits.utils.notifyApiError).finally(()=>{this.creatingRevolutWebhook=!1})):this.notifyRevolutWebhookWarning("Revolut webhook URL must be a clearnet URL."):this.notifyRevolutWebhookWarning("Add your Revolut API secret key before creating a webhook.")}}}),window.app.component("lnbits-admin-exchange-providers",{props:["form-data"],template:"#lnbits-admin-exchange-providers",data:()=>({exchangeData:{selectedProvider:null,showTickerConversion:!1,convertFromTicker:null,convertToTicker:null},exchangesTable:{columns:[{name:"name",align:"left",label:"Exchange Name",field:"name",sortable:!0},{name:"api_url",align:"left",label:"URL",field:"api_url",sortable:!1},{name:"path",align:"left",label:"JSON Path",field:"path",sortable:!1},{name:"exclude_to",align:"left",label:"Exclude Currencies",field:"exclude_to",sortable:!1},{name:"ticker_conversion",align:"left",label:"Ticker Conversion",field:"ticker_conversion",sortable:!1}],pagination:{sortBy:"name",rowsPerPage:100,page:1,rowsNumber:100},search:null,hideEmpty:!0}}),mounted(){this.getExchangeRateHistory()},methods:{getDefaultSetting(e){LNbits.api.getDefaultSetting(e).then(t=>{this.formData[e]=t.data.default_value})},getExchangeRateHistory(){LNbits.api.request("GET","/api/v1/rate/history",this.g.user.wallets[0].inkey).then(e=>{this.initExchangeChart(e.data)}).catch(function(e){LNbits.utils.notifyApiError(e)})},showExchangeProvidersTab(e){"exchange_providers"===e&&this.getExchangeRateHistory()},addExchangeProvider(){this.formData.lnbits_exchange_rate_providers=[{name:"",api_url:"",path:"",exclude_to:[]},...this.formData.lnbits_exchange_rate_providers]},removeExchangeProvider(e){this.formData.lnbits_exchange_rate_providers=this.formData.lnbits_exchange_rate_providers.filter(t=>t!==e)},removeExchangeTickerConversion(e,t){e.ticker_conversion=e.ticker_conversion.filter(e=>e!==t),this.formData.touch=null},addExchangeTickerConversion(){this.exchangeData.selectedProvider&&(this.exchangeData.selectedProvider.ticker_conversion.push(`${this.exchangeData.convertFromTicker}:${this.exchangeData.convertToTicker}`),this.formData.touch=null,this.exchangeData.showTickerConversion=!1)},showTickerConversionDialog(e){this.exchangeData.convertFromTicker=null,this.exchangeData.convertToTicker=null,this.exchangeData.selectedProvider=e,this.exchangeData.showTickerConversion=!0},initExchangeChart(e){this.exchangeRatesChart&&(this.exchangeRatesChart.destroy(),this.exchangeRatesChart=null);const t=e.map(e=>this.utils.formatTimestamp(e.timestamp,"HH:mm")),s=(this.formData.lnbits_price_aggregator_enabled?[{name:"Aggregator"}]:[...this.formData.lnbits_exchange_rate_providers,{name:"LNbits"}]).map(t=>({label:t.name,data:e.map(e=>e.rates[t.name]),pointStyle:!0,borderWidth:"LNbits"===t.name?4:2,tension:.4}));this.exchangeRatesChart=new Chart(this.$refs.exchangeRatesChart.getContext("2d"),{type:"line",options:{plugins:{legend:{display:!0},title:{display:!0,text:"Bitcoin Price History"}}},data:{labels:t,datasets:s}})}}}),window.app.component("lnbits-admin-security",{props:["form-data"],template:"#lnbits-admin-security",data:()=>({logs:[],formBlockedIPs:"",serverlogEnabled:!1,nostrAcceptedUrl:"",formAllowedIPs:"",formCallbackUrlRule:""}),created(){},methods:{addAllowedIPs(){const e=this.formAllowedIPs.trim(),t=this.formData.lnbits_allowed_ips;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_allowed_ips=[...t,e],this.formAllowedIPs="")},removeAllowedIPs(e){const t=this.formData.lnbits_allowed_ips;this.formData.lnbits_allowed_ips=t.filter(t=>t!==e)},addBlockedIPs(){const e=this.formBlockedIPs.trim(),t=this.formData.lnbits_blocked_ips;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_blocked_ips=[...t,e],this.formBlockedIPs="")},removeBlockedIPs(e){const t=this.formData.lnbits_blocked_ips;this.formData.lnbits_blocked_ips=t.filter(t=>t!==e)},addCallbackUrlRule(){const e=this.formCallbackUrlRule.trim(),t=this.formData.lnbits_callback_url_rules;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_callback_url_rules=[...t,e],this.formCallbackUrlRule="")},removeCallbackUrlRule(e){const t=this.formData.lnbits_callback_url_rules;this.formData.lnbits_callback_url_rules=t.filter(t=>t!==e)},addNostrUrl(){const e=this.nostrAcceptedUrl.trim();this.removeNostrUrl(e),this.formData.nostr_absolute_request_urls.push(e),this.nostrAcceptedUrl=""},removeNostrUrl(e){this.formData.nostr_absolute_request_urls=this.formData.nostr_absolute_request_urls.filter(t=>t!==e)},async toggleServerLog(){if(this.serverlogEnabled=!this.serverlogEnabled,this.serverlogEnabled){const e="http:"!==location.protocol?"wss://":"ws://",t=await LNbits.utils.digestMessage(this.g.user.id),s=e+document.domain+":"+location.port+"/api/v1/ws/"+t;this.ws=new WebSocket(s),this.ws.addEventListener("message",async({data:e})=>{this.logs.push(e.toString());const t=this.$refs.logScroll;if(t){const e=t.getScrollTarget(),s=0;t.setScrollPosition(e.scrollHeight,s)}})}else this.ws.close()}}}),window.app.component("lnbits-admin-users",{props:["form-data"],template:"#lnbits-admin-users",data:()=>({formAddUser:"",formAddAdmin:"",formAddActivationCode:"",showReusableActivationCode:!1}),methods:{addAllowedUser(){let e=this.formAddUser,t=this.formData.lnbits_allowed_users;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_allowed_users=[...t,e],this.formAddUser="")},removeAllowedUser(e){let t=this.formData.lnbits_allowed_users;this.formData.lnbits_allowed_users=t.filter(t=>t!==e)},addAdminUser(){let e=this.formAddAdmin,t=this.formData.lnbits_admin_users;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_admin_users=[...t,e],this.formAddAdmin="")},removeAdminUser(e){let t=this.formData.lnbits_admin_users;this.formData.lnbits_admin_users=t.filter(t=>t!==e)},addOneTimeActivationCode(){const e=this.formAddActivationCode,t=this.formData.lnbits_register_one_time_activation_codes;e?.length&&!t.includes(e)&&(this.formData.lnbits_register_one_time_activation_codes=[...t,e],this.formAddActivationCode="")},removeOneTimeActivationCode(e){const t=this.formData.lnbits_register_one_time_activation_codes;this.formData.lnbits_register_one_time_activation_codes=t.filter(t=>t!==e)}}}),window.app.component("lnbits-admin-server",{props:["form-data"],template:"#lnbits-admin-server",computed:{lightningAddressBlacklistText:{get(){const e=this.formData.lnbits_wallet_lightning_address_blacklist;return Array.isArray(e)?e.join("\n"):e||""},set(e){this.formData.lnbits_wallet_lightning_address_blacklist=e.split(/[\n,]/).map(e=>e.trim().toLowerCase()).filter(e=>e.length)}}}}),window.app.component("lnbits-admin-extensions",{props:["form-data"],template:"#lnbits-admin-extensions",data:()=>({formAddExtensionsManifest:"",formAddWasmManifest:""}),methods:{addExtensionsManifest(){this.addManifest("lnbits_extensions_manifests","formAddExtensionsManifest")},addWasmManifest(){this.addManifest("lnbits_wasm_extensions_manifests","formAddWasmManifest")},addManifest(e,t){const s=this[t].trim(),a=this.formData[e]||[];s&&s.length&&!a.includes(s)&&(this.formData[e]=[...a,s],this[t]="")},removeExtensionsManifest(e){this.removeManifest("lnbits_extensions_manifests",e)},removeWasmManifest(e){this.removeManifest("lnbits_wasm_extensions_manifests",e)},removeManifest(e,t){const s=this.formData[e]||[];this.formData[e]=s.filter(e=>e!==t)}}}),window.app.component("lnbits-admin-wasm-runtime",{props:["form-data"],template:"#lnbits-admin-wasm-runtime",data(){return{wasmRuntimeLoading:!1,wasmHistoryLoading:!1,wasmRuntimeTimer:null,wasmStats:{},wasmCurrentInvocations:[],wasmInvocationHistory:[],wasmStatItems:[{key:"total",label:"Total",icon:"data_usage",color:"primary"},{key:"running",label:"Running",icon:"play_circle",color:"green"},{key:"completed",label:"Completed",icon:"task_alt",color:"teal"},{key:"failed",label:"Failed",icon:"error",color:"red"},{key:"stopped",label:"Stopped",icon:"stop_circle",color:"orange"},{key:"timeout",label:"Timeouts",icon:"timer_off",color:"purple"}],wasmCurrentColumns:[{name:"extension_id",label:"Extension",field:"extension_id",align:"left",sortable:!0},{name:"export_name",label:"Export",field:"export_name",align:"left",sortable:!0},{name:"trigger_type",label:"Trigger",field:"trigger_type",align:"left",sortable:!0},{name:"status",label:"Status",field:"status",align:"left",sortable:!0},{name:"user_id",label:"User",field:"user_id",align:"left",sortable:!0},{name:"started_at",label:"Started",field:"started_at",align:"left",sortable:!0},{name:"duration_ms",label:"Duration",field:e=>e.duration_ms||0,align:"right",sortable:!0},{name:"context",label:"Context",field:e=>this.wasmContextValue(e),align:"left",sortable:!0},{name:"actions",label:"",field:"actions",align:"right"}],wasmHistoryColumns:[{name:"extension_id",label:"Extension",field:"extension_id",align:"left",sortable:!0},{name:"export_name",label:"Export",field:"export_name",align:"left",sortable:!0},{name:"trigger_type",label:"Trigger",field:"trigger_type",align:"left",sortable:!0},{name:"status",label:"Status",field:"status",align:"left",sortable:!0},{name:"user_id",label:"User",field:"user_id",align:"left",sortable:!0},{name:"started_at",label:"Started",field:"started_at",align:"left",sortable:!0},{name:"duration_ms",label:"Duration",field:e=>e.duration_ms||0,align:"right",sortable:!0},{name:"calls",label:"Calls",field:e=>this.wasmCallCount(e),align:"left",sortable:!0},{name:"context",label:"Context",field:e=>this.wasmContextValue(e),align:"left",sortable:!0},{name:"error_message",label:"Error/Stop Reason",field:e=>e.error_message||e.stop_reason||"",align:"left",sortable:!0}]}},computed:{adminKey(){return this.g.user.wallets[0].adminkey},wasmExtensionId(){return this.$route.params.extId||null},wasmExtensionQuery(){return this.wasmExtensionId?`extension_id=${encodeURIComponent(this.wasmExtensionId)}`:""}},watch:{wasmExtensionId(){this.fetchWasmRuntime()}},methods:{async fetchWasmRuntime(){await Promise.all([this.fetchWasmCurrentInvocations(),this.fetchWasmInvocationHistory(),this.fetchWasmInvocationStats()])},async fetchWasmCurrentInvocations(){this.wasmRuntimeLoading=!0;try{const e=this.wasmExtensionQuery?`?${this.wasmExtensionQuery}`:"",{data:t}=await LNbits.api.request("GET",`/api/v1/extension/wasm/invocations/current${e}`,this.adminKey);this.wasmCurrentInvocations=t||[]}catch(e){LNbits.utils.notifyApiError(e)}finally{this.wasmRuntimeLoading=!1}},async fetchWasmInvocationHistory(){this.wasmHistoryLoading=!0;try{const e=["limit=50"];this.wasmExtensionQuery&&e.push(this.wasmExtensionQuery);const{data:t}=await LNbits.api.request("GET",`/api/v1/extension/wasm/invocations?${e.join("&")}`,this.adminKey);this.wasmInvocationHistory=t||[]}catch(e){LNbits.utils.notifyApiError(e)}finally{this.wasmHistoryLoading=!1}},async fetchWasmInvocationStats(){try{const e=["hours=24"];this.wasmExtensionQuery&&e.push(this.wasmExtensionQuery);const{data:t}=await LNbits.api.request("GET",`/api/v1/extension/wasm/invocations/stats?${e.join("&")}`,this.adminKey);this.wasmStats=t||{}}catch(e){LNbits.utils.notifyApiError(e)}},async stopWasmInvocation(e){try{await LNbits.api.request("POST",`/api/v1/extension/wasm/invocations/${encodeURIComponent(e)}/stop`,this.adminKey),Quasar.Notify.create({type:"positive",message:"WASM invocation stop requested."}),await this.fetchWasmRuntime()}catch(e){LNbits.utils.notifyApiError(e)}},deactivateWasmExtension(e){LNbits.utils.confirmDialog(`Deactivate extension '${e}'?`,"Deactivate Extension").onOk(async()=>{try{await LNbits.api.request("PUT",`/api/v1/extension/${encodeURIComponent(e)}/deactivate`,this.adminKey),Quasar.Notify.create({type:"positive",message:`Extension '${e}' deactivated.`}),await this.fetchWasmRuntime()}catch(e){LNbits.utils.notifyApiError(e)}})},formatWasmStat(e){const t=this.wasmStats[e];return null==t?"0":String(t)},formatWasmDate(e){return e?this.utils.formatDate(e):""},wasmStatusColor:e=>({running:"green",stopping:"orange",completed:"teal",failed:"red",stopped:"orange",timeout:"purple",abandoned:"grey"}[e]||"grey"),wasmTriggerColor:e=>({http:"primary",event:"purple"}[e]||"grey"),formatWasmDuration(e){let t=e.duration_ms;return"running"!==e.status&&"stopping"!==e.status||!e.started_at||(t=Date.now()-new Date(e.started_at).getTime()),null==t?"":t>=1e3?`${(t/1e3).toFixed(1)}s`:`${t}ms`},formatWasmCalls:e=>[`host ${e.host_call_count||0}`,`http ${e.http_call_count||0}`,`storage ${e.storage_call_count||0}`,`wallet ${e.wallet_call_count||0}`].join(" / "),wasmCallCount:e=>(e.host_call_count||0)+(e.http_call_count||0)+(e.storage_call_count||0)+(e.wallet_call_count||0),wasmContextValue:e=>[e.method,e.path,e.event_type,e.wallet_id,e.payment_hash].filter(Boolean).join(" "),formatWasmContext:e=>[e.method,e.path,e.event_type,e.wallet_id?`wallet ${e.wallet_id}`:"",e.payment_hash?`payment ${e.payment_hash.slice(0,12)}...`:""].filter(Boolean).join(" | "),formatWasmUserId(e){if(!e)return"-";const t=String(e);return t.length<=12?t:`${t.slice(0,3)}...${t.slice(-3)}`}},created(){this.fetchWasmRuntime(),this.wasmRuntimeTimer=setInterval(()=>{this.fetchWasmCurrentInvocations()},5e3)},unmounted(){this.wasmRuntimeTimer&&clearInterval(this.wasmRuntimeTimer)}}),window.app.component("lnbits-admin-wasm-limit-config",{props:["form-data"],template:"#lnbits-admin-wasm-limit-config",data:()=>({selectedWasmExtensionId:null,wasmExtensionLimitDraft:{},wasmExtensionLimitsSaving:!1,wasmRuntimeLimitExtensions:[],wasmRuntimeLimitExtensionsLoading:!1,wasmLimitInfoDialog:{show:!1,title:"",details:""},wasmRuntimeLimitGroups:[{title:"Execution",fields:[{name:"wasm_runtime_max_execution_ms",label:"Max execution time (ms)",description:"Maximum wall-clock time allowed for one WASM invocation.",details:"This is the elapsed time from starting the invocation until the export returns. When the limit is reached LNbits requests an interrupt and records the invocation as timed out if it cannot finish quickly. Use this to stop long sleeps, slow host calls, and CPU loops that run for too long."},{name:"wasm_runtime_max_fuel",label:"Max fuel",description:"Maximum Wasmtime instruction budget for one invocation.",details:"Fuel is Wasmtime instruction budgeting. It is more deterministic than wall-clock time for CPU-heavy loops because each executed instruction consumes budget. Set this low enough to stop busy loops, but high enough for legitimate extension startup and JSON processing."},{name:"wasm_runtime_max_wasm_stack_bytes",label:"Max WASM stack (bytes)",description:"Maximum stack space for WASM calls and recursion.",details:"This limits stack used by WebAssembly function calls. It protects the server from deep recursion or very large call chains in extension code. If legitimate extensions fail with stack overflow traps, raise this carefully."}]},{title:"Memory and Data Size",fields:[{name:"wasm_runtime_max_memory_bytes",label:"Max memory (bytes)",description:"Maximum WASM linear memory per invocation.",details:"This caps the linear memory visible to the WASM module. It limits memory.grow and can make instantiation fail if the module asks for too much memory up front. This does not include every byte used by the Python process or Wasmtime engine internals."},{name:"wasm_runtime_max_request_bytes",label:"Max request size (bytes)",description:"Maximum serialized input payload accepted before execution.",details:"This caps the serialized payload passed into a WASM export before execution starts. It protects against huge HTTP bodies, oversized event data, and expensive JSON parsing. Requests above this limit should be rejected before invoking the extension."},{name:"wasm_runtime_max_response_bytes",label:"Max response size (bytes)",description:"Maximum serialized response returned by a WASM export.",details:"This caps the JSON or string response returned by the WASM export. It prevents extensions from returning huge responses that consume memory, slow down API calls, or overload the browser. Responses above this limit are treated as invalid."}]},{title:"Wasmtime Objects",fields:[{name:"wasm_runtime_max_table_elements",label:"Max table elements",description:"Maximum total elements allowed in WASM tables.",details:"Tables store references used by WebAssembly, commonly function references. Limiting table elements prevents a module from allocating very large reference tables. Each table element also has host memory overhead."},{name:"wasm_runtime_max_instances",label:"Max instances",description:"Maximum WebAssembly instances allowed inside one store.",details:"This limits how many WebAssembly instances can be created inside one Wasmtime store. LNbits normally needs one instance per invocation, so a low value is expected. Raising it should only be needed if the runtime starts supporting modules that instantiate other modules."},{name:"wasm_runtime_max_tables",label:"Max tables",description:"Maximum WebAssembly tables allowed inside one store.",details:"This limits the number of WebAssembly tables in the store. It is separate from table elements: one setting limits the number of tables, the other limits their total size. Keep this small unless a component model module legitimately needs more tables."},{name:"wasm_runtime_max_memories",label:"Max memories",description:"Maximum WebAssembly linear memories allowed inside one store.",details:"This limits how many separate linear memories a module can create. Most extensions should need only one memory. Keep this small to reduce memory accounting complexity and prevent multi-memory abuse."}]},{title:"Concurrency",fields:[{name:"wasm_runtime_max_concurrent_invocations",label:"Max concurrent invocations",description:"Maximum running WASM invocations across the server.",details:"This is the global cap for running WASM invocations across all extensions and users. It protects the LNbits process from thread exhaustion, CPU pressure, and too many simultaneous stores. New invocations should be rejected or queued once this is reached."},{name:"wasm_runtime_max_concurrent_invocations_per_extension",label:"Max concurrent per extension",description:"Maximum running WASM invocations for one extension.",details:"This caps how many invocations a single extension can run at once. It prevents one malicious or buggy extension from consuming the whole global concurrency budget. Set it lower than the global limit."},{name:"wasm_runtime_max_concurrent_invocations_per_user",label:"Max concurrent per user",description:"Maximum running WASM invocations for one user.",details:"This caps concurrent invocations attributed to one user. It helps protect against a user repeatedly clicking, refreshing, or scripting extension calls. Invocations without a user can still be governed by the global and per-extension limits."}]},{title:"Host Calls",fields:[{name:"wasm_runtime_max_host_calls",label:"Max host calls",description:"Maximum total calls from WASM into LNbits host APIs.",details:"This is the total budget for calls from the WASM module into LNbits host APIs during one invocation. It should count all categories together. It limits chatty extensions and prevents tight loops that repeatedly call back into Python."},{name:"wasm_runtime_max_http_calls",label:"Max HTTP calls",description:"Maximum outbound HTTP host calls per invocation.",details:"This caps outbound HTTP requests made through the host API during one invocation. It reduces SSRF blast radius, protects network resources, and limits slow external dependencies. It should be enforced together with HTTP timeout and response-size limits."},{name:"wasm_runtime_max_storage_calls",label:"Max storage calls",description:"Maximum storage host calls per invocation.",details:"This caps extension storage operations during one invocation. It protects the database from excessive reads and writes triggered by malicious loops. Use it with storage payload-size limits if those are added later."},{name:"wasm_runtime_max_wallet_calls",label:"Max wallet calls",description:"Maximum wallet/payment host calls per invocation.",details:"This caps wallet and payment-related host calls during one invocation. These calls are security-sensitive and may touch balances, invoices, or payments. Keep this conservative and rely on explicit permissions for what the extension is allowed to do."}]},{title:"HTTP",fields:[{name:"wasm_runtime_http_timeout_ms",label:"HTTP timeout (ms)",description:"Maximum time allowed for one WASM HTTP request.",details:"This is the per-request timeout for HTTP calls made through the WASM host API. It prevents a slow remote server from holding an invocation open indefinitely. The total invocation timeout still applies across all work."},{name:"wasm_runtime_max_http_response_bytes",label:"Max HTTP response size (bytes)",description:"Maximum response body size accepted from one WASM HTTP request.",details:"This caps the response body accepted from each HTTP call made by an extension. It protects memory and parsing time when a remote server returns a very large body. Responses above the limit should fail the host call."}]}]}),computed:{adminKey(){return this.g.user.wallets[0].adminkey},isExtensionLimitRoute(){return this.$route.path.startsWith("/admin/extensions/wasm/limits/")},routeWasmExtensionId(){return this.isExtensionLimitRoute?this.$route.params.extId:null},backRoute(){return this.isExtensionLimitRoute?"/admin/extensions/wasm/limits":"/admin#extensions"},backTooltip(){return this.isExtensionLimitRoute?"Wasm Limit Config":"Extensions Settings"},pageDescription(){return this.isExtensionLimitRoute?"Customize limits for one installed WASM extension.":"These values are global defaults. Use 0 to disable a global limit."},wasmRuntimeLimitExtensionOptions(){return this.wasmRuntimeLimitExtensions.map(e=>({label:`${e.name||e.id} (${e.id})`,value:e.id}))},selectedWasmRuntimeLimitExtension(){return this.wasmRuntimeLimitExtensions.find(e=>e.id===this.selectedWasmExtensionId)||null},customWasmLimitCount(){const e=this.selectedWasmRuntimeLimitExtension;return e&&e.wasm_runtime_limits?Object.keys(e.wasm_runtime_limits).length:0}},watch:{selectedWasmExtensionId(){this.loadSelectedWasmRuntimeLimitExtension()},routeWasmExtensionId(){this.syncWasmExtensionLimitRoute()}},created(){this.fetchWasmRuntimeLimitExtensions()},methods:{async fetchWasmRuntimeLimitExtensions(){this.wasmRuntimeLimitExtensionsLoading=!0;try{const{data:e}=await LNbits.api.request("GET","/api/v1/extension/wasm/runtime-limits/extensions",this.adminKey);this.wasmRuntimeLimitExtensions=e||[],this.selectedWasmExtensionId&&!this.wasmRuntimeLimitExtensions.some(e=>e.id===this.selectedWasmExtensionId)&&(this.selectedWasmExtensionId=null),this.syncWasmExtensionLimitRoute()}catch(e){LNbits.utils.notifyApiError(e)}finally{this.wasmRuntimeLimitExtensionsLoading=!1}},syncWasmExtensionLimitRoute(){this.selectedWasmExtensionId=this.routeWasmExtensionId,this.loadSelectedWasmRuntimeLimitExtension()},openWasmExtensionLimit(e){this.$router.push(`/admin/extensions/wasm/limits/${encodeURIComponent(e)}`)},loadSelectedWasmRuntimeLimitExtension(){const e=this.selectedWasmRuntimeLimitExtension;this.wasmExtensionLimitDraft=e?{...e.wasm_runtime_limits||{}}:{}},wasmExtensionLimitHint(e){return`Inherited global value: ${this.formData[e.name]}. ${e.description}`},wasmExtensionLimitPlaceholder(e){const t=this.formData[e.name];return null==t?"":String(t)},normalizedWasmExtensionLimitDraft(){const e={};return this.wasmRuntimeLimitGroups.forEach(t=>{t.fields.forEach(t=>{const s=this.wasmExtensionLimitDraft[t.name],a="string"==typeof s?s.trim():s;if(""===a||null==a)return;const i=Number(a);if(!Number.isFinite(i)||!Number.isInteger(i)||i<0)throw new Error(`${t.label} must be a non-negative integer.`);e[t.name]=i})}),e},async clearWasmExtensionLimits(){this.wasmExtensionLimitDraft={},await this.saveWasmExtensionLimits()},async saveWasmExtensionLimits(){if(this.selectedWasmExtensionId){this.wasmExtensionLimitsSaving=!0;try{const{data:e}=await LNbits.api.request("PUT",`/api/v1/extension/wasm/runtime-limits/${encodeURIComponent(this.selectedWasmExtensionId)}`,this.adminKey,{limits:this.normalizedWasmExtensionLimitDraft()}),t=this.wasmRuntimeLimitExtensions.findIndex(t=>t.id===e.id);t>=0&&this.wasmRuntimeLimitExtensions.splice(t,1,e),this.loadSelectedWasmRuntimeLimitExtension(),Quasar.Notify.create({type:"positive",message:"WASM extension limits saved."})}catch(e){e instanceof Error&&!e.response?Quasar.Notify.create({type:"negative",message:e.message}):LNbits.utils.notifyApiError(e)}finally{this.wasmExtensionLimitsSaving=!1}}},showWasmLimitInfo(e){this.wasmLimitInfoDialog={show:!0,title:e.label,details:e.details}}}}),window.app.component("lnbits-admin-notifications",{props:["form-data"],template:"#lnbits-admin-notifications",data:()=>({nostrNotificationIdentifier:"",emailNotificationAddress:""}),methods:{sendTestEmail(){LNbits.api.request("GET","/admin/api/v1/testemail",this.g.user.wallets[0].adminkey).then(e=>{if("error"===e.data.status)throw new Error(e.data.message);this.$q.notify({message:"Test email sent!",color:"positive"})}).catch(e=>{this.$q.notify({message:e.message,color:"negative"})})},addNostrNotificationIdentifier(){const e=this.nostrNotificationIdentifier.trim(),t=this.formData.lnbits_nostr_notifications_identifiers;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_nostr_notifications_identifiers=[...t,e],this.nostrNotificationIdentifier="")},removeNostrNotificationIdentifier(e){const t=this.formData.lnbits_nostr_notifications_identifiers;this.formData.lnbits_nostr_notifications_identifiers=t.filter(t=>t!==e)},addEmailNotificationAddress(){const e=this.emailNotificationAddress.trim(),t=this.formData.lnbits_email_notifications_to_emails;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_email_notifications_to_emails=[...t,e],this.emailNotificationAddress="")},removeEmailNotificationAddress(e){const t=this.formData.lnbits_email_notifications_to_emails;this.formData.lnbits_email_notifications_to_emails=t.filter(t=>t!==e)}}}),window.app.component("lnbits-admin-site-customisation",{props:["form-data"],template:"#lnbits-admin-site-customisation",data:()=>({lnbits_theme_options:["classic","bitcoin","flamingo","cyber","freedom","mint","autumn","monochrome","salvador"],colors:["primary","secondary","accent","positive","negative","info","warning","red","yellow","orange"],reactionOptions:["none","confettiBothSides","confettiFireworks","confettiStars","confettiTop","lightningStrike"],globalBorderOptions:["retro-border","hard-border","neon-border","no-border"]}),methods:{onBackgroundImageInput(e){const t=e.target.files[0];t&&this.uploadBackgroundImage(t),e.target.value=null},async uploadBackgroundImage(e){const t=new FormData;t.append("file",e);try{const{data:e}=await LNbits.api.request("POST","/api/v1/assets?public_asset=true",null,t,{headers:{"Content-Type":"multipart/form-data"}}),s=`${window.location.origin}/api/v1/assets/${e.id}/thumbnail`;this.formData.lnbits_default_bgimage=s,Quasar.Notify.create({type:"positive",message:"Background image uploaded.",icon:null})}catch(e){LNbits.utils.notifyApiError(e)}}}}),window.app.component("lnbits-admin-assets-config",{props:["form-data"],template:"#lnbits-admin-assets-config",data:()=>({newAllowedAssetMimeType:"",newNoLimitUser:""}),async created(){},methods:{addAllowedAssetMimeType(){this.newAllowedAssetMimeType&&(this.removeAllowedAssetMimeType(this.newAllowedAssetMimeType),this.formData.lnbits_assets_allowed_mime_types.push(this.newAllowedAssetMimeType),this.newAllowedAssetMimeType="",this.formData.touch=null)},removeAllowedAssetMimeType(e){const t=this.formData.lnbits_assets_allowed_mime_types.indexOf(e);-1!==t&&this.formData.lnbits_assets_allowed_mime_types.splice(t,1),this.formData.touch=null},addNewNoLimitUser(){this.newNoLimitUser&&(this.removeNoLimitUser(this.newNoLimitUser),this.formData.lnbits_assets_no_limit_users.push(this.newNoLimitUser),this.newNoLimitUser="",this.formData.touch=null)},removeNoLimitUser(e){e&&(this.formData.lnbits_assets_no_limit_users=this.formData.lnbits_assets_no_limit_users.filter(t=>t!==e),this.formData.touch=null)}}}),window.app.component("lnbits-admin-audit",{props:["form-data"],template:"#lnbits-admin-audit",data:()=>({formAddIncludePath:"",formAddExcludePath:"",formAddIncludeResponseCode:""}),methods:{addIncludePath(){if(""===this.formAddIncludePath)return;const e=this.formData.lnbits_audit_include_paths;e.includes(this.formAddIncludePath)||(this.formData.lnbits_audit_include_paths=[...e,this.formAddIncludePath]),this.formAddIncludePath=""},removeIncludePath(e){this.formData.lnbits_audit_include_paths=this.formData.lnbits_audit_include_paths.filter(t=>t!==e)},addExcludePath(){if(""===this.formAddExcludePath)return;const e=this.formData.lnbits_audit_exclude_paths;e.includes(this.formAddExcludePath)||(this.formData.lnbits_audit_exclude_paths=[...e,this.formAddExcludePath]),this.formAddExcludePath=""},removeExcludePath(e){this.formData.lnbits_audit_exclude_paths=this.formData.lnbits_audit_exclude_paths.filter(t=>t!==e)},addIncludeResponseCode(){if(""===this.formAddIncludeResponseCode)return;const e=this.formData.lnbits_audit_http_response_codes;e.includes(this.formAddIncludeResponseCode)||(this.formData.lnbits_audit_http_response_codes=[...e,this.formAddIncludeResponseCode]),this.formAddIncludeResponseCode=""},removeIncludeResponseCode(e){this.formData.lnbits_audit_http_response_codes=this.formData.lnbits_audit_http_response_codes.filter(t=>t!==e)}}}),window.app.component("lnbits-admin-blockexplorer",{props:["form-data"],template:"#lnbits-admin-blockexplorer",data:()=>({electrumServers:["ssl://fulcrum.lnbits.com:50002","ssl://mainnet.nunchuk.io:52002","ssl://fulcrum.grey.pw:50002","ssl://electrum2.bluewallet.io:443","ssl://electrum.acinq.co:50002","ssl://electrum.blockstream.info:50002","ssl://bitcoin.mullvad.net:5010"]}),computed:{electrumServerOptions(){return[...this.electrumServers,"Custom"]},electrumServerPreset:{get(){return this.electrumServers.includes(this.formData.lnbits_blockexplorer_electrum_url)?this.formData.lnbits_blockexplorer_electrum_url:"Custom"},set(e){"Custom"!==e?this.formData.lnbits_blockexplorer_electrum_url=e:"Custom"!==this.electrumServerPreset&&(this.formData.lnbits_blockexplorer_electrum_url="")}}}}),window.PageBlockExplorer={template:"#page-blockexplorer",data:()=>({query:"",loading:!1,tip:null,fees:null,blocks:[],selectedBlock:null,blockDialog:!1,txResult:null,txStatus:null,addressResult:null,currentAddress:""}),computed:{feeList(){return this.fees&&this.fees.estimates?Object.entries(this.fees.estimates).map(([e,t])=>({label:this.$t("n_block_fee",{n:e}),rate:(1e5*t).toFixed(1)+" sat/vB"})):[]},formattedBlocks(){const e=Math.floor(Date.now()/1e3);return this.blocks.map(t=>({...t,shortHash:t.hash.slice(0,8)+"..."+t.hash.slice(-4),timeAgo:this._timeAgo(e-t.timestamp),utcTime:new Date(1e3*t.timestamp).toUTCString(),difficulty:this._difficulty(t.bits)}))}},async created(){await Promise.all([this.loadTip(),this.loadFees(),this.loadBlocks()]),this._blockWsActive=!0,this._connectBlocksWs(),this._loadFromRoute()},beforeUnmount(){this._blockWsActive=!1,this._blockWs&&this._blockWs.close(),this._searchWs&&this._searchWs.close()},watch:{$route(e){this._loadFromRoute(e)},blockDialog(e){e||"block"!==this.$route.params.type||this.$router.push("/blockexplorer")}},methods:{_loadFromRoute(e){e=e||this.$route;const{type:t,id:s}=e.params;"tx"===t?(this.query=s,this._fetchTx(s)):"address"===t?(this.query=s,this._fetchAddress(s)):"block"===t?this._openBlockByHeight(s):(this._resetResults(),this.blockDialog=!1)},_openBlockByHeight(e){const t=parseInt(e,10),s=this.formattedBlocks.find(e=>e.height===t)||this.blocks.find(e=>e.height===t);s?(this.selectedBlock=s,this.blockDialog=!0):(this.selectedBlock=null,this.blockDialog=!1)},_resetResults(){this.txResult=null,this.txStatus=null,this.addressResult=null,this._searchWs&&(this._searchWs.close(),this._searchWs=null)},_wsUrl:e=>`${"https:"===window.location.protocol?"wss:":"ws:"}//${window.location.host}/blockexplorer/api/v1${e}`,_connectBlocksWs(){const e=new WebSocket(this._wsUrl("/ws/blocks"));e.onmessage=e=>{const t=JSON.parse(e.data),s=this.blocks.filter(e=>e.height!==t.height);this.blocks=[t,...s].slice(0,5)},e.onerror=()=>e.close(),e.onclose=()=>{this._blockWsActive&&setTimeout(()=>this._connectBlocksWs(),5e3)},this._blockWs=e},_connectSearchWs(e,t){this._searchWs&&(this._searchWs.close(),this._searchWs=null);const s=new WebSocket(this._wsUrl(e));s.onmessage=e=>{try{t(JSON.parse(e.data))}catch(e){}},s.onerror=()=>s.close(),this._searchWs=s},_timeAgo:e=>e<60?e+"s ago":e<3600?Math.floor(e/60)+"m ago":Math.floor(e/3600)+"h ago",_difficulty(e){const t=parseInt(e.slice(0,2),16),s=parseInt(e.slice(2),16),a=65535*Math.pow(2,208)/(s*Math.pow(2,8*(t-3)));return a>=1e12?(a/1e12).toFixed(2)+"T":a>=1e9?(a/1e9).toFixed(2)+"G":a>=1e6?(a/1e6).toFixed(2)+"M":a.toFixed(0)},openBlock(e){this.$router.push(`/blockexplorer/block/${e.height}`)},async loadBlocks(){try{const e=await LNbits.api.request("GET","/blockexplorer/api/v1/blocks");this.blocks=e.data}catch(e){}},async loadTip(){try{const e=await LNbits.api.request("GET","/blockexplorer/api/v1/tip");this.tip=e.data}catch(e){LNbits.utils.notifyApiError(e)}},async loadFees(){try{const e=await LNbits.api.request("GET","/blockexplorer/api/v1/fees");this.fees=e.data}catch(e){}},clearResult(){this.query="","/blockexplorer"!==this.$route.path?this.$router.push("/blockexplorer"):this._resetResults()},search(){const e=this.query.trim();e&&(/^[0-9a-fA-F]{64}$/.test(e)?this.loadTx(e):this.loadAddress(e))},loadTx(e){this.$router.push(`/blockexplorer/tx/${e}`)},loadAddress(e){this.$router.push(`/blockexplorer/address/${e}`)},async _fetchTx(e){this.loading=!0;try{const t=await LNbits.api.request("GET","/blockexplorer/api/v1/tx/"+e);this.txResult=t.data,this.txStatus=null,this.addressResult=null,this._connectSearchWs(`/ws/tx/${e}`,e=>{e.error||(this.txStatus=e)})}catch(e){LNbits.utils.notifyApiError(e)}finally{this.loading=!1}},async _fetchAddress(e){this.loading=!0;try{const t=await LNbits.api.request("GET","/blockexplorer/api/v1/address/"+e);this.addressResult=t.data,this.txResult=null,this.txStatus=null,this.currentAddress=e,this._connectSearchWs(`/ws/address/${e}`,e=>{e.error||(this.addressResult=e)})}catch(e){LNbits.utils.notifyApiError(e)}finally{this.loading=!1}}}},window.app.component("lnbits-wallet-charts",{template:"#lnbits-wallet-charts",props:["paymentFilter","chartConfig"],data:()=>({debounceTimeoutValue:1337,debounceTimeout:null,chartData:[],chartDataPointCount:0,walletBalanceChart:null,walletBalanceInOut:null,walletPaymentInOut:null,colorPrimary:Quasar.colors.changeAlpha(Quasar.colors.getPaletteColor("primary"),.3),colorSecondary:Quasar.colors.changeAlpha(Quasar.colors.getPaletteColor("secondary"),.3),barOptions:{responsive:!0,maintainAspectRatio:!1,scales:{x:{stacked:!0},y:{stacked:!0}}}}),watch:{paymentFilter:{deep:!0,handler(){this.changeCharts()}},chartConfig:{deep:!0,handler(e){this.$q.localStorage.setItem("lnbits.wallets.chartConfig",e),this.changeCharts()}}},methods:{changeCharts(){this.debounceTimeout&&clearTimeout(this.debounceTimeout),this.debounceTimeout=setTimeout(async()=>{await this.fetchChartData(),this.drawCharts()},this.debounceTimeoutValue)},filterChartData(){const e=this.paymentFilter["time[ge]"]+"T00:00:00",t=this.paymentFilter["time[le]"]+"T23:59:59";let s=0,a=this.chartData.map(e=>void 0!==this.paymentFilter["amount[ge]"]?(s+=e.balance_in,{...e,balance:s,balance_out:0,count_out:0}):void 0!==this.paymentFilter["amount[le]"]?(s-=e.balance_out,{...e,balance:s,balance_in:0,count_in:0}):{...e});a=a.filter(s=>this.paymentFilter["time[ge]"]&&this.paymentFilter["time[le]"]?s.date>=e&&s.date<=t:this.paymentFilter["time[ge]"]?s.date>=e:!this.paymentFilter["time[le]"]||s.date<=t);const i=a.map(e=>new Date(e.date).toLocaleString("default",{month:"short",day:"numeric"}));return this.chartDataPointCount=a.length,{data:a,labels:i}},drawBalanceInOutChart(e,t){this.walletBalanceInOut&&this.walletBalanceInOut.destroy();const s=this.$refs.walletBalanceInOut;s&&(this.walletBalanceInOut=new Chart(s.getContext("2d"),{type:"bar",options:this.barOptions,data:{labels:t,datasets:[{label:"Balance In",borderRadius:5,data:e.map(e=>e.balance_in),backgroundColor:this.colorPrimary},{label:"Balance Out",borderRadius:5,data:e.map(e=>e.balance_out),backgroundColor:this.colorSecondary}]}}))},drawPaymentInOut(e,t){this.walletPaymentInOut&&this.walletPaymentInOut.destroy();const s=this.$refs.walletPaymentInOut;s&&(this.walletPaymentInOut=new Chart(s.getContext("2d"),{type:"bar",options:this.barOptions,data:{labels:t,datasets:[{label:"Payments In",data:e.map(e=>e.count_in),backgroundColor:this.colorPrimary},{label:"Payments Out",data:e.map(e=>-e.count_out),backgroundColor:this.colorSecondary}]}}))},drawBalanceChart(e,t){this.walletBalanceChart&&this.walletBalanceChart.destroy();const s=this.$refs.walletBalanceChart;s&&(this.walletBalanceChart=new Chart(s.getContext("2d"),{type:"line",options:{responsive:!0,maintainAspectRatio:!1},data:{labels:t,datasets:[{label:"Balance",data:e.map(e=>e.balance),pointStyle:!1,backgroundColor:this.colorPrimary,borderColor:this.colorPrimary,borderWidth:2,fill:!0,tension:.7,fill:1},{label:"Fees",data:e.map(e=>e.fee),pointStyle:!1,backgroundColor:this.colorSecondary,borderColor:this.colorSecondary,borderWidth:1,fill:!0,tension:.7,fill:1}]}}))},drawCharts(){const{data:e,labels:t}=this.filterChartData();this.chartConfig.showBalanceChart&&this.drawBalanceChart(e,t),this.chartConfig.showBalanceInOutChart&&this.drawBalanceInOutChart(e,t),this.chartConfig.showPaymentInOutChart&&this.drawPaymentInOut(e,t)},async fetchChartData(){try{const{data:e}=await LNbits.api.request("GET",`/api/v1/payments/stats/daily?wallet_id=${this.g.wallet.id}`);this.chartData=e}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}}},async created(){await this.fetchChartData(),this.drawCharts()}}),window.app.component("lnbits-wallet-api-docs",{template:"#lnbits-wallet-api-docs",methods:{copyAdminKey(){LNbits.utils.confirmDialog(this.$t("admin_key_warning")).onOk(()=>LNbits.utils.copyText(this.g.wallet.adminkey))},resetKeys(){LNbits.utils.confirmDialog("Are you sure you want to reset your API keys?").onOk(()=>{LNbits.api.resetWalletKeys(this.g.wallet).then(e=>{const{id:t,adminkey:s,inkey:a}=e;this.g.wallet={...this.g.wallet,inkey:a,adminkey:s};const i=this.g.user.wallets.findIndex(e=>e.id===t);-1!==i&&(this.g.user.wallets[i]={...this.g.user.wallets[i],inkey:a,adminkey:s}),Quasar.Notify.create({timeout:3500,type:"positive",message:"API keys reset!"})}).catch(e=>{LNbits.utils.notifyApiError(e)})})}},data:()=>({origin:window.location.origin,inkeyHidden:!0,adminkeyHidden:!0,walletIdHidden:!0})}),window.app.component("lnbits-wallet-icon",{template:"#lnbits-wallet-icon",data:()=>({icon:{show:!1,data:{},colorOptions:["primary","purple","orange","green","brown","blue","red","pink"],options:["home","star","bolt","paid","savings","store","videocam","music_note","flight","train","directions_car","school","construction","science","sports_esports","sports_tennis","theaters","water","headset_mic","videogame_asset","person","group","pets","sunny","elderly","verified","snooze","mail","forum","shopping_cart","shopping_bag","attach_money","print_connect","dark_mode","light_mode","android","network_wifi","shield","fitness_center","lunch_dining"]}}),methods:{setSelectedIcon(e){this.icon.data.icon=e},setSelectedColor(e){this.icon.data.color=e},setIcon(){this.$emit("update-wallet",this.icon.data),this.icon.show=!1}}}),window.app.component("lnbits-wallet-new",{template:"#lnbits-wallet-new",data:()=>({walletTypes:[{label:"Lightning Wallet",value:"lightning"}],wallet:{name:"",sharedWalletId:""},showNewWalletDialog:!1}),watch:{"g.newWalletType"(e){null!==e&&(this.showNewWalletDialog=!0)},showNewWalletDialog(e){!0!==e&&this.reset()}},computed:{isLightning(){return"lightning"===this.g.newWalletType},isLightningShared(){return"lightning-shared"===this.g.newWalletType},inviteWalletOptions(){return(this.g.user?.extra?.wallet_invite_requests||[]).map(e=>({label:`${e.to_wallet_name} (from ${e.from_user_name})`,value:e.to_wallet_id}))}},methods:{reset(){this.showNewWalletDialog=!1,this.g.newWalletType=null,this.wallet={name:"",sharedWalletId:""}},async submitRejectWalletInvitation(){try{const e=this.g.user.extra.wallet_invite_requests||[],t=e.find(e=>e.to_wallet_id===this.wallet.sharedWalletId);if(!t)return void Quasar.Notify.create({message:"Cannot find invitation for the selected wallet.",type:"warning"});await LNbits.api.request("DELETE",`/api/v1/wallet/share/invite/${t.request_id}`,this.g.wallet.adminkey),Quasar.Notify.create({message:"Invitation rejected.",type:"positive"}),this.g.user.extra.wallet_invite_requests=e.filter(e=>e.request_id!==t.request_id)}catch(e){LNbits.utils.notifyApiError(e)}},submitAddWallet(){const e=this.wallet;"lightning"!==this.g.newWalletType||e.name?"lightning-shared"!==this.g.newWalletType||e.sharedWalletId?LNbits.api.createWallet(e.name,this.g.newWalletType,{shared_wallet_id:e.sharedWalletId}).then(e=>{this.$q.notify({message:"Wallet created successfully",color:"positive"}),this.reset(),this.g.user.wallets.push(LNbits.map.wallet(e.data)),this.g.lastWalletId=e.data.id,this.$router.push(`/wallet/${e.data.id}`)}).catch(LNbits.utils.notifyApiError):this.$q.notify({message:"Missing a shared wallet ID",color:"warning"}):this.$q.notify({message:"Please enter a name for the wallet",color:"warning"})}},created(){this.g.user?.extra?.wallet_invite_requests?.length&&this.walletTypes.push({label:`Lightning Wallet (Share Invite: ${this.g.user.extra.wallet_invite_requests.length})`,value:"lightning-shared"})}}),window.app.component("lnbits-wallet-share",{template:"#lnbits-wallet-share",computed:{walletApprovedShares(){return this.g.wallet.extra.shared_with.filter(e=>"approved"===e.status)},walletPendingRequests(){return this.g.wallet.extra.shared_with.filter(e=>"request_access"===e.status)},walletPendingInvites(){return this.g.wallet.extra.shared_with.filter(e=>"invite_sent"===e.status)}},data:()=>({permissionOptions:[{label:"View",value:"view-payments"},{label:"Receive",value:"receive-payments"},{label:"Send",value:"send-payments"}],walletShareInvite:{username:"",permissions:[]}}),methods:{async updateSharePermissions(e){try{const{data:t}=await LNbits.api.request("PUT","/api/v1/wallet/share",this.g.wallet.adminkey,e);Object.assign(e,t),Quasar.Notify.create({message:"Wallet permission updated.",type:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}},async inviteUserToWallet(){try{const{data:e}=await LNbits.api.request("PUT","/api/v1/wallet/share/invite",this.g.wallet.adminkey,{...this.walletShareInvite,status:"invite_sent",wallet_id:this.g.wallet.id});this.g.wallet.extra.shared_with.push(e),this.walletShareInvite={username:"",permissions:[]},Quasar.Notify.create({message:"User invited to wallet.",type:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}},deleteSharePermission(e){LNbits.utils.confirmDialog("Are you sure you want to remove this share permission?").onOk(async()=>{try{await LNbits.api.request("DELETE",`/api/v1/wallet/share/${e.request_id}`,this.g.wallet.adminkey),this.g.wallet.extra.shared_with=this.g.wallet.extra.shared_with.filter(t=>t.wallet_id!==e.wallet_id),Quasar.Notify.create({message:"Wallet permission deleted.",type:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}})}}}),window.app.component("lnbits-wallet-paylinks",{template:"#lnbits-wallet-paylinks",data:()=>({storedPaylinks:[]}),watch:{"g.wallet"(e){this.storedPaylinks=e.storedPaylinks??[]}},created(){this.storedPaylinks=this.g.wallet.storedPaylinks},methods:{updatePaylinks(){LNbits.api.request("PUT",`/api/v1/wallet/stored_paylinks/${this.g.wallet.id}`,this.g.wallet.adminkey,{links:this.storedPaylinks}).then(()=>{this.$q.notify({message:"Paylinks updated.",type:"positive",timeout:3500})}).catch(e=>{LNbits.utils.notifyApiError(e)})},sendToPaylink(e){this.$emit("send-lnurl",e)},editPaylink(){this.$nextTick(()=>{this.updatePaylinks()})},deletePaylink(e){const t=[];this.storedPaylinks.forEach(s=>{s.lnurl!==e&&t.push(s)}),this.storedPaylinks=t,this.updatePaylinks()}}}),window.app.component("lnbits-wallet-extra",{template:"#lnbits-wallet-extra",props:["chartConfig"],data:()=>({lightningAddressInput:""}),computed:{exportUrl(){return`${window.location.origin}/wallet?usr=${this.g.user.id}&wal=${this.g.wallet.id}`},canEditLightningAddress(){return this.g.settings.enableWalletLightningAddresses&&this.g.settings.allowCustomWalletLightningAddresses&&"lightning"===this.g.wallet.walletType},lightningAddressSuffix:()=>`@${window.location.host}`,lightningAddressChanged(){return this.lightningAddressInput!==(this.g.wallet.lightningAddress||"")},lightningAddressFeeHint(){return this.g.settings.chargeWalletLightningAddresses?`Fee: ${this.g.settings.walletLightningAddressPriceSats} sats`:""}},watch:{"g.wallet.id":"resetLightningAddressInput","g.wallet.lightningAddress":"resetLightningAddressInput"},methods:{resetLightningAddressInput(){this.lightningAddressInput=this.g.wallet.lightningAddress||""},saveLightningAddress(){this.updateWallet({lightning_address:this.lightningAddressInput})},handleSendLnurl(e){this.$emit("send-lnurl",e)},updateWallet(e){this.$emit("update-wallet",e)},handleFiatTracking(){this.g.fiatTracking=!this.g.fiatTracking,this.g.fiatTracking?(this.updateWallet({currency:this.g.wallet.currency}),this.updateFiatBalance()):(this.g.isFiatPriority=!1,this.g.wallet.currency="",this.updateWallet({currency:""}))},deleteWallet(){LNbits.utils.confirmDialog("Are you sure you want to delete this wallet?").onOk(()=>{LNbits.api.deleteWallet(this.g.wallet).then(()=>{this.g.user.wallets=this.g.user.wallets.filter(e=>e.id!==this.g.wallet.id),this.g.lastActiveWallet=this.g.user.wallets[0].id,this.$router.push(`/wallet/${this.g.lastActiveWallet}`),Quasar.Notify.create({timeout:3e3,message:"Wallet deleted!",spinner:!0})}).catch(e=>{LNbits.utils.notifyApiError(e)})})},updateFiatBalance(){this.$q.localStorage.getItem("lnbits.exchangeRate."+this.g.wallet.currency)&&(this.g.exchangeRate=this.$q.localStorage.getItem("lnbits.exchangeRate."+this.g.wallet.currency),this.g.fiatBalance=this.g.exchangeRate/1e8*this.g.wallet.sat),LNbits.api.request("GET","/api/v1/rate/"+this.g.wallet.currency,null).then(e=>{this.g.fiatBalance=e.data.price/1e8*this.g.wallet.sat,this.g.exchangeRate=e.data.price.toFixed(2),this.g.fiatTracking=!0,this.$q.localStorage.set("lnbits.exchangeRate."+this.g.wallet.currency,this.g.exchangeRate),this.g.exchangeRate<=0&&(this.g.fiatTracking=!1,this.g.isFiatPriority=!1)}).catch(e=>console.error(e))}},created(){this.resetLightningAddressInput(),""!==this.g.wallet.currency&&this.g.isSatsDenomination?(this.g.fiatTracking=!0,this.updateFiatBalance()):this.g.fiatTracking=!1}}),window.app.component("lnbits-home-logos",{template:"#lnbits-home-logos",data:()=>({logos:[{href:"https://github.com/ElementsProject/lightning",lightSrc:"/static/images/clnl.png",darkSrc:"/static/images/cln.png"},{href:"https://github.com/lightningnetwork/lnd",lightSrc:"/static/images/lnd.png",darkSrc:"/static/images/lnd.png"},{href:"https://opennode.com",lightSrc:"/static/images/opennodel.png",darkSrc:"/static/images/opennode.png"},{href:"https://lnpay.co/",lightSrc:"/static/images/lnpayl.png",darkSrc:"/static/images/lnpay.png"},{href:"https://github.com/rootzoll/raspiblitz",lightSrc:"/static/images/blitzl.png",darkSrc:"/static/images/blitz.png"},{href:"https://start9.com/",lightSrc:"/static/images/start9l.png",darkSrc:"/static/images/start9.png"},{href:"https://getumbrel.com/",lightSrc:"/static/images/umbrell.png",darkSrc:"/static/images/umbrel.png"},{href:"https://mynodebtc.com",lightSrc:"/static/images/mynodel.png",darkSrc:"/static/images/mynode.png"},{href:"https://github.com/shesek/spark-wallet",lightSrc:"/static/images/sparkl.png",darkSrc:"/static/images/spark.png"},{href:"https://voltage.cloud",lightSrc:"/static/images/voltagel.png",darkSrc:"/static/images/voltage.png"},{href:"https://breez.technology/sdk/",lightSrc:"/static/images/breezl.png",darkSrc:"/static/images/breez.png"},{href:"https://blockstream.com/lightning/greenlight/",lightSrc:"/static/images/greenlightl.png",darkSrc:"/static/images/greenlight.png"},{href:"https://getalby.com",lightSrc:"/static/images/albyl.png",darkSrc:"/static/images/alby.png"},{href:"https://zbd.gg",lightSrc:"/static/images/zbdl.png",darkSrc:"/static/images/zbd.png"},{href:"https://phoenix.acinq.co/server",lightSrc:"/static/images/phoenixdl.png",darkSrc:"/static/images/phoenixd.png"},{href:"https://boltz.exchange/",lightSrc:"/static/images/boltzl.svg",darkSrc:"/static/images/boltz.svg"},{href:"https://www.blink.sv/",lightSrc:"/static/images/blink_logol.png",darkSrc:"/static/images/blink_logo.png"}]}),computed:{showLogos(){return this.g.isSatsDenomination&&"LNbits"==this.g.settings.siteTitle&&1==this.g.settings.showHomePageElements}}}),window.app.component("lnbits-error",{template:"#lnbits-error",props:["dynamic","code","message"],computed:{isExtension(){return 403==this.code&&(!!this.message.startsWith("Extension ")||void 0)}},methods:{goBack(){window.history.back()},goHome(){window.location="/"},goToWallet(){this.dynamic?this.$router.push("/wallet"):window.location="/wallet"},goToExtension(){const e=`/extensions#${this.message.match(/'([^']+)'/)[1]}`;this.dynamic?this.$router.push(e):window.location=e},async logOut(){try{await LNbits.api.logout(),window.location="/"}catch(e){LNbits.utils.notifyApiError(e)}}},async created(){if(!this.dynamic&&401==this.code)return console.warn(`Unauthorized: ${this.errorMessage}`),void this.logOut()}}),window.app.component("lnbits-qrcode",{template:"#lnbits-qrcode",components:{QrcodeVue:QrcodeVue.default},props:{value:{type:String,required:!0},nfc:{type:Boolean,default:!1},print:{type:Boolean,default:!1},showButtons:{type:Boolean,default:!0},href:{type:String,default:""},margin:{type:Number,default:3},maxWidth:{type:Number,default:450},logo:{type:String,default:window.g.settings.qrLogo||null}},data:()=>({nfcTagWriting:!1,nfcSupported:"undefined"!=typeof NDEFReader}),methods:{printQrCode(){const e=this.$refs.qrCode.$el.outerHTML,t=window.open("","_blank");t.document.write(`\n \n \n Print QR Code\n \n \n ${e}\n \n `),t.document.close(),t.focus(),t.print(),t.close()},clickQrCode(e){if(""===this.href)return this.utils.copyText(this.value),e.preventDefault(),e.stopPropagation(),!1;this.href&&this.href.startsWith("http")&&(window.open(this.href,"_blank"),e.preventDefault())},async writeNfcTag(){try{if(!this.nfcSupported)throw{toString:function(){return"NFC not supported on this device or browser."}};const e=new NDEFReader;this.nfcTagWriting=!0,this.$q.notify({message:"Tap your NFC tag to write the LNURL-withdraw link to it."}),await e.write({records:[{recordType:"url",data:this.value,lang:"en"}]}),this.nfcTagWriting=!1,this.$q.notify({type:"positive",message:"NFC tag written successfully."})}catch(e){this.nfcTagWriting=!1,this.$q.notify({type:"negative",message:e?e.toString():"An unexpected error has occurred."})}},downloadSVG(){const e=this.$refs.qrCode.$el;if(!e)return void console.error("SVG element not found");let t=(new XMLSerializer).serializeToString(e);t.match(/^]+xmlns="http:\/\/www\.w3\.org\/2000\/svg"/)||(t=t.replace(/^({tab:"bech32",lnurl:""}),methods:{setLnurl(){if("bech32"==this.tab){const e=(new TextEncoder).encode(this.url),t=NostrTools.nip19.encodeBytes("lnurl",e);this.lnurl=this.href&&""!==this.href.trim()?`${this.href}?lightning=${t.toUpperCase()}`:`lightning:${t.toUpperCase()}`}else"lud17"==this.tab&&(this.url.startsWith("http://")?this.lnurl=this.url.replace("http://",this.prefix+"://"):this.lnurl=this.url.replace("https://",this.prefix+"://"));this.$emit("update:lnurl",this.lnurl)}},watch:{url(){this.setLnurl()},tab(){this.setLnurl()}},created(){this.setLnurl()}}),window.app.component("lnbits-disclaimer",{template:"#lnbits-disclaimer",computed:{showDisclaimer:()=>!g.disclaimerShown&&g.isUserAuthorized}}),window.app.component("lnbits-footer",{template:"#lnbits-footer",computed:{title(){return`${this.g.settings.siteTitle}, ${this.g.settings.siteTagline}`},version(){return this.$t("lnbits_version")+": "+this.g.settings.version}}}),window.app.component("lnbits-header",{template:"#lnbits-header",computed:{showAdmin(){return this.g.user&&(this.g.user.super_user||this.g.user.admin)},displayName(){return this.g.user?.extra?.display_name||this.g.user.username||this.g.user?.extra?.first_name||"Anon"},displayRole(){return this.g.user?.super_user?"Super User":this.g.user?.admin?"Admin":"User"}},methods:{async stopImpersonation(){try{await LNbits.api.stopImpersonation(),LNbits.utils.restoreLocalStorage("impersonation"),window.location="/users"}catch(e){console.warn(e)}},async handleLanguageChanged(e){try{await LNbits.api.updateUiCustomization({locale:e.locale}),this.$q.notify({type:"positive",message:"Language Updated",caption:e.locale})}catch(e){LNbits.utils.notifyApiError(e)}}}}),window.app.component("lnbits-header-wallets",{template:"#lnbits-header-wallets"}),window.app.component("lnbits-drawer",{template:"#lnbits-drawer"}),window.app.component("lnbits-theme",{watch:{"g.walletFlip"(e){this.$q.localStorage.setItem("lnbits.walletFlip",e),!0===e&&this.$q.screen.lt.md&&(this.g.visibleDrawer=!1)},"g.disclaimerShown"(e){this.$q.localStorage.setItem("lnbits.disclaimerShown",e)},"g.locale"(e){this.$q.localStorage.setItem("lnbits.lang",e),window.i18n.global.locale=e},"g.isFiatPriority"(e){this.$q.localStorage.setItem("lnbits.isFiatPriority",e)},"g.reactionChoice"(e){this.$q.localStorage.set("lnbits.reactions",e)},"g.themeChoice"(e){document.body.setAttribute("data-theme",e),this.$q.localStorage.set("lnbits.theme",e)},"g.darkChoice"(e){this.$q.dark.set(e),this.$q.localStorage.set("lnbits.darkMode",e),Chart.defaults.color=this.$q.dark.isActive?"#fff":"#000"},"g.borderChoice"(e){document.body.classList.forEach(e=>{e.endsWith("-border")&&document.body.classList.remove(e)}),this.$q.localStorage.setItem("lnbits.border",e),document.body.classList.add(e)},"g.gradientChoice"(e){this.$q.localStorage.set("lnbits.gradientBg",e),!0===e?document.body.classList.add("gradient-bg"):document.body.classList.remove("gradient-bg")},"g.cardRoundedChoice"(e){this.$q.localStorage.set("lnbits.cardRounded",e),!0===e?document.body.classList.add("rounded-ui"):document.body.classList.remove("rounded-ui")},"g.cardGradientChoice"(e){this.$q.localStorage.set("lnbits.cardGradient",e),!0===e?document.body.classList.add("card-gradient"):document.body.classList.remove("card-gradient")},"g.cardShadowChoice"(e){this.$q.localStorage.set("lnbits.cardShadow",e),!0===e?document.body.classList.add("card-shadow"):document.body.classList.remove("card-shadow")},"g.burgerMenuChoice"(e){this.$q.localStorage.set("lnbits.burgerMenu",e),!0===e?document.body.classList.remove("no-burger-background"):document.body.classList.add("no-burger-background")},"g.mobileSimple"(e){this.$q.localStorage.set("lnbits.mobileSimple",e),!0===e?document.body.classList.add("mobile-simple"):document.body.classList.remove("mobile-simple")},"g.bgimageChoice"(e){this.$q.localStorage.set("lnbits.backgroundImage",e),""===e?document.body.classList.remove("bg-image"):(document.body.classList.add("bg-image"),document.body.style.setProperty("--background",`url(${e})`))}},methods:{async checkUrlParams(){const e=new URLSearchParams(window.location.search);if(0===e.length)return;if(e.has("theme")){const t=e.get("theme").trim().toLowerCase();this.g.themeChoice=t,e.delete("theme")}if(e.has("border")){const t=e.get("border").trim().toLowerCase();this.g.borderChoice=t,e.delete("border")}if(e.has("gradient")){const t=e.get("gradient").toLowerCase();this.g.gradientChoice="1"===t||"true"===t,e.delete("gradient")}if(e.has("dark")){const t=e.get("dark").trim().toLowerCase();this.g.darkChoice="1"===t||"true"===t,e.delete("dark")}if(e.has("usr")){try{await LNbits.api.loginUsr(e.get("usr")),window.location.href="/wallet"}catch(e){LNbits.utils.notifyApiError(e)}e.delete("usr")}const t=e.size?`?${e.toString()}`:"",s=window.location.pathname+t;window.history.replaceState(null,null,s)}},created(){this.$q.dark.set(this.g.darkChoice),document.body.setAttribute("data-theme",this.g.themeChoice),Chart.defaults.color=this.$q.dark.isActive?"#fff":"#000",document.body.classList.add(this.g.borderChoice),!0===this.g.gradientChoice&&document.body.classList.add("gradient-bg"),!0===this.g.cardRoundedChoice&&document.body.classList.add("rounded-ui"),!0===this.g.cardGradientChoice&&document.body.classList.add("card-gradient"),!0===this.g.cardShadowChoice&&document.body.classList.add("card-shadow"),!0!==this.g.burgerMenuChoice&&document.body.classList.add("no-burger-background"),""!==this.g.bgimageChoice&&(document.body.classList.add("bg-image"),document.body.style.setProperty("--background",`url(${this.g.bgimageChoice})`)),!0===this.g.mobileSimple&&document.body.classList.add("mobile-simple"),Object.entries(this.g.user?.uiCustomization||{}).forEach(([e,t])=>{e in this.g&&(this.g[e]=t)}),this.checkUrlParams()}}),window.app.component("lnbits-qrcode-scanner",{template:"#lnbits-qrcode-scanner",props:["callback"],data:()=>({showScanner:!1}),watch:{callback(e){return null===e?this.reset():"function"!=typeof e?(Quasar.Notify.create({message:"QR code scanner callback is not a function.",type:"negative"}),this.reset()):!1===this.g.hasCamera?(Quasar.Notify.create({message:"No camera found on this device.",type:"negative"}),this.reset()):void(this.showScanner=!0)}},methods:{reset(){this.showScanner=!1,this.g.scanner=null},detect(e){const t=e[0].rawValue;console.log("Detected QR code value:",t),this.callback(t),this.$emit("detect",t),this.reset()},async onInitQR(e){try{await e}catch(e){const t={NotAllowedError:"ERROR: you need to grant camera access permission",NotFoundError:"ERROR: no camera on this device",NotSupportedError:"ERROR: secure context required (HTTPS, localhost)",NotReadableError:"ERROR: is the camera already in use?",OverconstrainedError:"ERROR: installed cameras are not suitable",StreamApiNotSupportedError:"ERROR: Stream API is not supported in this browser",InsecureContextError:"ERROR: Camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP."},s=Object.keys(t).filter(t=>e.name===t),a=s?t[s]:`ERROR: Camera error (${e.name})`;Quasar.Notify.create({message:a,type:"negative"}),this.g.hasCamera=!1,this.reset()}}}}),window.app.component("lnbits-manage-extension-list",{template:"#lnbits-manage-extension-list",data:()=>({extensions:[],userExtensions:[],searchTerm:""}),watch:{"g.user.extensions"(){this.loadExtensions()},searchTerm(){this.filterUserExtensionsByTerm()}},methods:{async loadExtensions(){try{res=await LNbits.api.request("GET","/api/v1/extension"),this.extensions=res.data.sort((e,t)=>e.name.localeCompare(t.name)),this.filterUserExtensionsByTerm()}catch(e){LNbits.utils.notifyApiError(e)}},filterUserExtensionsByTerm(){const e=this.g.user.extensions;this.userExtensions=this.extensions.filter(t=>e.includes(t.code)).filter(e=>""===this.searchTerm||`${e.code} ${e.name} ${e.short_description} ${e.url}`.toLocaleLowerCase().includes(this.searchTerm.toLocaleLowerCase()))},extensionUrl:e=>e.is_wasm?`/ext/${e.code}`:`/${e.code}/`,extensionActive(e){const t=e.is_wasm?`/ext/${e.code}`:`/${e.code}`;return this.$route.path.startsWith(t)}},async created(){await this.loadExtensions()}}),function(){function e(e,t){return e?e(t):t}function t(t,s){const a=function(e){return`extension_permission_${e.id.replace(/[^A-Za-z0-9]/g,"_")}`}(t),i=e(s,a);return i===a?t.id:i}function s(t){return{level:"low",color:"grey-6",label:e(t,"extension_permission_risk_low"),warning:""}}function a(t,s){return{level:"medium",color:"warning",label:e(t,"extension_permission_risk_medium"),warning:s?e(t,s):""}}function i(t,s){return{level:"high",color:"negative",label:e(t,"extension_permission_risk_high"),warning:e(t,s)}}function n(e,t){const s=(e||[]).find(e=>e.id===t);return s?.name||t}function o(e,t){const s=e.policies;return Array.isArray(s)?s.map(e=>{const s="string"==typeof e?e:e?.id;if(!s)return null;const a="string"==typeof e?["read"]:Array.isArray(e.access)&&e.access.length?e.access:["read"];return{id:s,name:n(t,s),access:a}}).filter(Boolean):[]}function r(e,t,n){const r=e.map(e=>function(e,t,n){if(["wallet.pay_invoice","wallet.pay_invoice_background"].includes(e.id))return i(n,"wallet.pay_invoice_background"===e.id?"extension_permission_warning_wallet_pay_invoice_background":"extension_permission_warning_wallet_pay_invoice");if("extension.api.request"===e.id)return o(e,t).some(e=>e.access.includes("write"))?i(n,"extension_permission_warning_extension_api_request_write"):a(n);return"http.request"===e.id?a(n):"wallet.payments.watch"===e.id?a(n,"extension_permission_warning_wallet_payments_watch"):["websocket.publish","websocket.subscribe"].includes(e.id)||["wallet.list","wallet.balance.read","wallet.create_invoice_public","ext.storage.append_public","ext.storage.read_public"].includes(e.id)?a(n):s(n)}(e,t,n)),l=r.find(e=>"high"===e.level);return l||(r.find(e=>"medium"===e.level)||s(n))}function l(e){const t=["wallet.pay_invoice","wallet.pay_invoice_background","wallet.payments.watch","wallet.list","wallet.balance.read","extension.api.request","http.request","ui.camera.scan_qr","websocket","websocket.publish","websocket.subscribe","ext.storage.read","ext.storage.write","ext.storage.read_public","ext.storage.append_public","wallet.create_invoice_public","wallet.create_invoice","utils.basic"],s=t.indexOf(e);return-1===s?t.length:s}function c(s,a,i){const n=s[0],l=2===s.length&&s.some(e=>"ext.storage.read"===e.id)&&s.some(e=>"ext.storage.write"===e.id),c=s.every(e=>["websocket.publish","websocket.subscribe"].includes(e.id))&&s.some(e=>"websocket.publish"===e.id)&&s.some(e=>"websocket.subscribe"===e.id),d=s.map(e=>function(e){return"string"==typeof e.description?e.description:""}(e)).filter(Boolean),h={id:l?"ext.storage.read_write":c?"websocket":n.id,label:l?e(i,"extension_permission_ext_storage_read_write"):c?e(i,"extension_permission_websocket"):t(n,i),risk:r(s,a,i),badges:[],descriptions:d,fieldGroups:[],appendPolicies:[],websocketPublishPolicies:[],invoicePolicies:[],extensionAccess:[],httpHosts:[]};"ext.storage.read_public"===n.id&&(h.fieldGroups=function(e){const t=e.policies;return Array.isArray(t)?t.map(e=>{const t="string"==typeof e?e:e?.table_name||"",s="string"!=typeof e&&Array.isArray(e?.public_fields)?e.public_fields.filter(e=>"string"==typeof e&&e):[],a="string"==typeof e||"string"!=typeof e?.source_id_field?"":e.source_id_field;return t?{table:t,fields:s,sourceIdField:a}:null}).filter(Boolean):[]}(n),h.badges=h.fieldGroups.map(e=>({key:e.table,label:e.table}))),"extension.api.request"===n.id&&(h.extensionAccess=o(n,a),h.badges=h.extensionAccess.map(e=>({key:e.id,label:e.name}))),"http.request"===n.id&&(h.httpHosts=function(e){const t=e.policies;return Array.isArray(t)?t.map(e=>"string"==typeof e?e:e?.host||"").filter(e=>"string"==typeof e&&e):[]}(n)),"wallet.create_invoice_public"===n.id&&(h.invoicePolicies=function(e){const t=e.policies;return Array.isArray(t)?t.map(e=>{if(!e||"object"!=typeof e)return null;const t=e.table,s=e.wallet_field;return"string"==typeof t&&t&&"string"==typeof s&&s?{table:t,walletField:s}:null}).filter(Boolean):[]}(n)),"ext.storage.append_public"===n.id&&(h.appendPolicies=function(e){const t=e.policies;return Array.isArray(t)?t.map(e=>{if(!e||"object"!=typeof e)return null;const t=e.table,s=e.source_table,a=e.source_id_field,i=Array.isArray(e.allowed_fields)?e.allowed_fields.filter(e=>"string"==typeof e&&e):[],n=Number.isInteger(e.max_rows_per_source)?e.max_rows_per_source:1e4;return"string"==typeof t&&t&&"string"==typeof s&&s&&"string"==typeof a&&a?{table:t,sourceTable:s,sourceIdField:a,allowedFields:i,maxRowsPerSource:n,rawPolicy:e}:null}).filter(Boolean):[]}(n),h.badges=h.appendPolicies.map(e=>({key:e.table+":"+e.sourceTable+":"+e.sourceIdField,label:e.table})));const m=s.find(e=>"websocket.publish"===e.id);return m&&(h.websocketPublishPolicies=function(e){const t=e.policies;return Array.isArray(t)?t.map(e=>e&&"object"==typeof e?{maxMessagesPerSecond:Number.isInteger(e.max_messages_per_second)?e.max_messages_per_second:0,rawPolicy:e}:null).filter(Boolean):[]}(m)),h}function d({permissions:e,extensions:t,translate:s}){const a=e||[],i=new Map(a.map(e=>[e.id,e])),n=i.has("ext.storage.read")&&i.has("ext.storage.write"),o=i.has("websocket.publish")&&i.has("websocket.subscribe");let r=!1,d=!1;return a.map((e,t)=>n&&["ext.storage.read","ext.storage.write"].includes(e.id)?r?null:(r=!0,{index:t,orderId:"ext.storage.read",permissions:[i.get("ext.storage.read"),i.get("ext.storage.write")]}):o&&["websocket.publish","websocket.subscribe"].includes(e.id)?d?null:(d=!0,{index:t,orderId:"websocket",permissions:[i.get("websocket.publish"),i.get("websocket.subscribe")]}):{index:t,orderId:e.id,permissions:[e]}).filter(Boolean).sort((e,t)=>{const s=l(e.orderId),a=l(t.orderId);return s===a?e.index-t.index:s-a}).map(e=>c(e.permissions,t||[],s))}window.LNbitsExtensionPermissions={displayItems:d,hasHighRisk:({permissions:e,extensions:t,translate:s})=>d({permissions:e,extensions:t,translate:s}).some(e=>"high"===e.risk.level)},window.app.component("lnbits-extension-permissions",{template:"#lnbits-extension-permissions",props:{permissions:{type:Array,default:()=>[]},extensions:{type:Array,default:()=>[]},editableAppendPublicLimits:{type:Boolean,default:!1},maxRowsPerSourceLimit:{type:Number,default:1e6},editableWebsocketPublishLimits:{type:Boolean,default:!1},maxMessagesPerSecondLimit:{type:Number,default:100}},computed:{displayItems(){return window.LNbitsExtensionPermissions.displayItems({permissions:this.permissions,extensions:this.extensions,translate:e=>this.$t(e)})}},methods:{publicInvoicePolicySentence:e=>`Invoices will be created using ${e.walletField} from ${e.table}.`,publicAppendPolicySentence:e=>`${e.table} rows can be appended for ${e.sourceTable} using ${e.sourceIdField}. Limit: ${e.maxRowsPerSource} rows per source.`,websocketPublishPolicySentence:e=>`Limit: ${e.maxMessagesPerSecond} messages per second.`,permissionAccessLabel(e){const t=`extension_permission_access_${e}`,s=this.$t(t);return s===t?e:s}}})}(),window.app.component("lnbits-manage-wallet-list",{template:"#lnbits-manage-wallet-list",data:()=>({activeWalletId:null}),computed:{maxWallets(){return this.g.user?.extra?.visible_wallet_count||10}},watch:{$route(e){e.path.startsWith("/wallet/")?this.activeWalletId=e.params.id:this.activeWalletId=null},"g.user.wallets":{handler(){this.paymentEvents()},deep:!0,immediate:!0}},created(){this.g.user&&0===this.g.walletEventListeners.length&&this.paymentEvents()},methods:{openNewWalletDialog(){this.g.user.walletInvitesCount?this.g.newWalletType="lightning-shared":this.g.newWalletType="lightning"},onWebsocketMessage(e){const t=JSON.parse(e.data);t.payment?(this.g.user.wallets.forEach(e=>{e.id===t.payment.wallet_id&&(e.sat=t.wallet_balance)}),this.g.wallet.id===t.payment.wallet_id&&(this.g.wallet.sat=t.wallet_balance,this.g.updatePayments=!this.g.updatePayments,this.g.updatePaymentsHash=!this.g.updatePaymentsHash),t.payment.amount>0&&eventReaction(1e3*t.wallet_balance)):console.error("ws message no payment",t)},paymentEvents(){if(!this.g.user)return;let e;this.g.user.wallets.slice(0,this.maxWallets).forEach(t=>{if(!this.g.walletEventListeners.includes(t.id)){this.g.walletEventListeners.push(t.id);const s=new WebSocket(`${websocketUrl}/${t.inkey}`);s.onmessage=this.onWebsocketMessage,s.onopen=()=>console.log("ws connected for wallet",t.id),s.onclose=()=>{console.log("ws closed, reconnecting...",t.id),this.g.walletEventListeners=this.g.walletEventListeners.filter(e=>e!==t.id),clearTimeout(e),e=setTimeout(this.paymentEvents,5e3)},s.onerror=()=>{console.warn("ws error, reconnecting...",t.id),this.g.walletEventListeners=this.g.walletEventListeners.filter(e=>e!==t.id),clearTimeout(e),e=setTimeout(this.paymentEvents,5e3)}}})}}}),window.app.component("lnbits-language-dropdown",{template:"#lnbits-language-dropdown",computed:{currentLanguage(){return this.langs.find(e=>e.value===window.i18n.global.locale)||{value:"en",label:"English",display:"🇬🇧 EN"}}},methods:{activeLanguage:e=>window.i18n.global.locale===e,changeLanguage(e){this.g.locale=e,window.i18n.global.locale=e,this.$q.localStorage.set("lnbits.lang",e),this.$emit("language-changed",e)}},data:()=>({langs:[{value:"en",label:"English",display:"🇬🇧 EN"},{value:"de",label:"Deutsch",display:"🇩🇪 DE"},{value:"es",label:"Español",display:"🇪🇸 ES"},{value:"jp",label:"日本語",display:"🇯🇵 JP"},{value:"cn",label:"中文",display:"🇨🇳 CN"},{value:"fr",label:"Français",display:"🇫🇷 FR"},{value:"it",label:"Italiano",display:"🇮🇹 IT"},{value:"pi",label:"Pirate",display:"🏴‍☠️ PI"},{value:"nl",label:"Nederlands",display:"🇳🇱 NL"},{value:"we",label:"Cymraeg",display:"🏴󠁧󠁢󠁷󠁬󠁳󠁿 CY"},{value:"pl",label:"Polski",display:"🇵🇱 PL"},{value:"pt",label:"Português",display:"🇵🇹 PT"},{value:"br",label:"Português do Brasil",display:"🇧🇷 BR"},{value:"cs",label:"Česky",display:"🇨🇿 CS"},{value:"sk",label:"Slovensky",display:"🇸🇰 SK"},{value:"kr",label:"한국어",display:"🇰🇷 KR"},{value:"fi",label:"Suomi",display:"🇫🇮 FI"},{value:"fo",label:"Føroyskt",display:"🇫🇴 FO"}]})}),window.app.component("lnbits-payment-list",{template:"#lnbits-payment-list",props:["wallet","paymentFilter"],data(){return{payments:[],paymentsTable:{columns:[{name:"time",align:"left",label:this.$t("memo")+"/"+this.$t("date"),field:"date",sortable:!0},{name:"amount",align:"right",label:this.$t("amount"),field:"sat",sortable:!0}],pagination:{rowsPerPage:10,page:1,sortBy:"time",descending:!0,rowsNumber:10},sortFields:[{name:"amount",label:"Amount"},{name:"fee",label:"Fee"},{name:"memo",label:"Memo"},{name:"time",label:"Creation Date"},{name:"updated_at",label:"Last Updated"}],search:"",loading:!1},searchDate:{from:null,to:null},searchStatus:{success:!0,pending:!0,failed:!1,incoming:!0,outgoing:!0},exportTagName:"",exportPaymentTagList:[],paymentsCSV:{columns:[{name:"status",align:"right",label:this.$t("status"),field:"status"},{name:"memo",align:"left",label:this.$t("memo"),field:"memo"},{name:"time",align:"left",label:this.$t("date"),field:"date",sortable:!0},{name:"amount",align:"right",label:this.$t("amount"),field:"sat",sortable:!0},{name:"fee",align:"right",label:this.$t("fee"),field:"fee"},{name:"tag",align:"right",label:this.$t("tag"),field:"tag"},{name:"payment_hash",align:"right",label:this.$t("payment_hash"),field:"payment_hash"},{name:"payment_proof",align:"right",label:this.$t("payment_proof"),field:"payment_proof"},{name:"webhook",align:"right",label:this.$t("webhook"),field:"webhook"},{name:"fiat_currency",align:"right",label:"Fiat Currency",field:e=>e.extra.wallet_fiat_currency},{name:"fiat_amount",align:"right",label:"Fiat Amount",field:e=>e.extra.wallet_fiat_amount}],preimage:null,loading:!1},hodlInvoice:{show:!1,payment:null,preimage:null},selectedPayment:null,filterLabels:[]}},computed:{filteredPayments(){const e=this.paymentsTable.search;return e&&""!==e?LNbits.utils.search(this.payments,e):this.payments},paymentsOmitter(){return this.$q.screen.lt.md&&this.g.mobileSimple?this.payments.length>0?[this.payments[0]]:[]:this.payments},pendingPaymentsExist(){return-1!==this.payments.findIndex(e=>e.pending)}},methods:{mapPayment(e){const t={checking_id:e.checking_id,status:e.status,amount:e.amount,fee:e.fee,memo:e.memo,time:e.time,bolt11:e.bolt11,preimage:e.preimage,payment_hash:e.payment_hash,expiry:e.expiry,extra:e.extra??{},wallet_id:e.wallet_id,webhook:e.webhook,webhook_status:e.webhook_status,fiat_amount:e.fiat_amount,fiat_currency:e.fiat_currency,labels:e.labels};t.date=this.utils.formatDate(e.created_at),t.dateFrom=this.utils.formatDateFrom(e.created_at),t.expirydate=this.utils.formatDate(e.expiry),t.expirydateFrom=this.utils.formatDateFrom(e.expiry),t.msat=t.amount,t.sat=t.msat/1e3,t.tag=t.extra?.tag,t.fsat=this.utils.formatSat(t.sat),t.isIn=t.amount>0,t.isOut=t.amount<0,t.isPending="pending"===t.status,t.isPaid="success"===t.status,t.isFailed="failed"===t.status,t._q=[t.memo,t.sat].join(" ").toLowerCase();try{t.details=JSON.parse(e.extra?.details||"{}")}catch{t.details={extraDetails:e.extra?.details}}return t},searchByDate(){"string"==typeof this.searchDate&&(this.searchDate={from:this.searchDate,to:this.searchDate}),this.searchDate.from&&(this.paymentFilter["time[ge]"]=this.searchDate.from+"T00:00:00"),this.searchDate.to&&(this.paymentFilter["time[le]"]=this.searchDate.to+"T23:59:59"),this.fetchPayments()},searchByLabels(e){e&&0!==e.length?(this.filterLabels=e,this.paymentsTable.filter["labels[every]"]=e,this.fetchPayments()):this.clearLabelSeach()},clearDateSeach(){this.searchDate={from:null,to:null},delete this.paymentFilter["time[ge]"],delete this.paymentFilter["time[le]"],this.fetchPayments()},clearLabelSeach(){this.filterLabels=[],delete this.paymentsTable.filter["labels[every]"],this.fetchPayments()},fetchPayments(e){this.paymentsTable.loading=!0;const t=LNbits.utils.prepareFilterQuery(this.paymentsTable,e,this.paymentFilter);return LNbits.api.getPayments(this.wallet,t).then(e=>{this.paymentsTable.pagination.rowsNumber=e.data.total,this.payments=e.data.data.map(this.mapPayment),this.paymentsTable.loading=!1,this.recheckPendingPayments()}).catch(e=>{this.paymentsTable.loading=!1,g.user.admin?this.fetchPaymentsAsAdmin(this.wallet.id,t):LNbits.utils.notifyApiError(e)})},sortByColumn(e){this.paymentsTable.pagination.sortBy===e?this.paymentsTable.pagination.descending=!this.paymentsTable.pagination.descending:(this.paymentsTable.pagination.sortBy=e,this.paymentsTable.pagination.descending=!1),this.fetchPayments()},fetchPaymentsAsAdmin(e,t){return t=(t||"")+"&wallet_id="+e,LNbits.api.request("GET","/api/v1/payments/all/paginated?"+t).then(e=>{this.paymentsTable.loading=!1,this.paymentsTable.pagination.rowsNumber=e.data.total,this.payments=e.data.data.map(this.mapPayment)}).catch(e=>{this.paymentsTable.loading=!1,LNbits.utils.notifyApiError(e)})},checkPayment(e){LNbits.api.getPayment(this.wallet,e).then(e=>{this.update=!this.update,"success"==e.data.status&&Quasar.Notify.create({type:"positive",message:this.$t("payment_successful")}),"pending"==e.data.status&&Quasar.Notify.create({type:"info",message:this.$t("payment_pending")})}).catch(LNbits.utils.notifyApiError)},recheckPendingPayments(){const e=this.payments.filter(e=>"pending"===e.status);if(0===e.length)return;const t=["recheck_pending=true","checking_id[in]="+e.map(e=>e.checking_id).join(",")].join("&");LNbits.api.getPayments(this.wallet,t).then(e=>{let t=0;e.data.data.forEach(e=>{if("pending"!==e.status){const s=this.payments.findIndex(t=>t.checking_id===e.checking_id);-1!==s&&(this.payments.splice(s,1,this.mapPayment(e)),t+=1)}}),t>0&&Quasar.Notify.create({type:"positive",message:this.$t("payment_successful")})}).catch(e=>{console.warn(e)})},showHoldInvoiceDialog(e){this.hodlInvoice.show=!0,this.hodlInvoice.preimage="",this.hodlInvoice.payment=e},cancelHoldInvoice(e){LNbits.api.cancelInvoice(this.wallet,e).then(()=>{this.update=!this.update,Quasar.Notify.create({type:"positive",message:this.$t("invoice_cancelled")})}).catch(LNbits.utils.notifyApiError)},settleHoldInvoice(e){LNbits.api.settleInvoice(this.wallet,e).then(()=>{this.update=!this.update,Quasar.Notify.create({type:"positive",message:this.$t("invoice_settled")})}).catch(LNbits.utils.notifyApiError)},paymentTableRowKey:e=>e.payment_hash+e.amount,async exportCSV(e=!1){const t=this.paymentsTable.pagination,s=1e3;let a=[];this.paymentsCSV.loading=!0;try{for(let e=0;e<100;e++){const i={sortby:t.sortBy??"time",direction:t.descending?"desc":"asc",limit:s,offset:e*s},n=new URLSearchParams(i),o=await LNbits.api.getPayments(this.wallet,n),r=o.data.data||[];if(a=a.concat(r.map(this.mapPayment)),r.length=o.data.total)break}let i=this.paymentsCSV.columns;if(e){this.exportPaymentTagList.length&&(a=a.filter(e=>this.exportPaymentTagList.includes(e.tag)));const e=Object.keys(a.reduce((e,t)=>({...e,...t.details}),{})).map(e=>({name:e,align:"right",label:e.charAt(0).toUpperCase()+e.slice(1).replace(/([A-Z])/g," $1"),field:t=>t.details[e],format:e=>"object"==typeof e?JSON.stringify(e):e}));i=this.paymentsCSV.columns.concat(e)}LNbits.utils.exportCSV(i,a,this.wallet.name+"-payments")}catch(e){LNbits.utils.notifyApiError(e)}finally{this.paymentsCSV.loading=!1}},addFilterTag(){if(!this.exportTagName)return;const e=this.exportTagName.trim();this.exportPaymentTagList=this.exportPaymentTagList.filter(t=>t!==e),this.exportPaymentTagList.push(e),this.exportTagName=""},removeExportTag(e){this.exportPaymentTagList=this.exportPaymentTagList.filter(t=>t!==e)},formatCurrency(e,t){try{return LNbits.utils.formatCurrency(e,t)}catch(t){return console.error(t),`${e} ???`}},handleFilterChanged(){const{success:e,pending:t,failed:s,incoming:a,outgoing:i}=this.searchStatus;let n=this.paymentFilter||{};delete n["status[ne]"],delete n["status[eq]"],e&&t&&s||(e&&t?n["status[ne]"]="failed":e&&s?n["status[ne]"]="pending":s&&t?n["status[ne]"]="success":!e||t||s?!t||e||s?!s||e||t||(n["status[eq]"]="failed"):n["status[eq]"]="pending":n["status[eq]"]="success"),delete n["amount[ge]"],delete n["amount[le]"],a&&i||!a&&!i||(a&&!i?n["amount[ge]"]=0:i&&!a&&(n["amount[le]"]=0)),this.paymentFilter=n},async savePaymentLabels(e){if(this.selectedPayment)try{await LNbits.api.request("PUT",`/api/v1/payments/${this.selectedPayment.payment_hash}/labels`,this.wallet.adminkey,{labels:e});const t=this.payments.find(e=>e.checking_id===this.selectedPayment.checking_id);t&&(t.labels=[...e]),Quasar.Notify.create({type:"positive",message:this.$t("payment_labels_updated")})}catch(e){LNbits.utils.notifyApiError(e)}else Quasar.Notify.create({type:"warning",message:"No payment selected"})},isLightColor(e){try{return Quasar.colors.luminosity(e)>.5}catch(e){return console.warning(e),!1}}},watch:{"paymentsTable.search":{handler(){const e={};this.paymentsTable.search&&(e.search=this.paymentsTable.search),this.fetchPayments()}},"g.updatePayments"(){this.fetchPayments()}},created(){this.fetchPayments()}}),window.app.component("lnbits-label-selector",{template:"#lnbits-label-selector",props:["labels"],data:()=>({labelFilter:"",localLabels:[]}),methods:{toggleLabel(e){if(this.localLabels.includes(e.name)){const t=this.localLabels.indexOf(e.name);-1!==t&&this.localLabels.splice(t,1)}else this.localLabels.push(e.name)},saveLabels(){this.$emit("update:labels",this.localLabels)},clearLabels(){this.localLabels=[],this.saveLabels()}},created(){this.localLabels=[...this.labels]}}),window.app.component("lnbits-extension-settings-form",{name:"lnbits-extension-settings-form",template:"#lnbits-extension-settings-form",props:["options","adminkey","endpoint"],methods:{async updateSettings(){if(!this.settings)return Quasar.Notify.create({message:"No settings to update",type:"negative"});try{const{data:e}=await LNbits.api.request("PUT",this.endpoint,this.adminkey,this.settings);this.settings=e}catch(e){LNbits.utils.notifyApiError(e)}},async getSettings(){try{const{data:e}=await LNbits.api.request("GET",this.endpoint,this.adminkey);this.settings=e}catch(e){LNbits.utils.notifyApiError(e)}},async resetSettings(){LNbits.utils.confirmDialog("Are you sure you want to reset the settings?").onOk(async()=>{try{await LNbits.api.request("DELETE",this.endpoint,this.adminkey),await this.getSettings()}catch(e){LNbits.utils.notifyApiError(e)}})}},async created(){await this.getSettings()},data:()=>({settings:void 0})}),window.app.component("lnbits-extension-settings-btn-dialog",{template:"#lnbits-extension-settings-btn-dialog",name:"lnbits-extension-settings-btn-dialog",props:["options","adminkey","endpoint"],data:()=>({show:!1})}),window.app.component("lnbits-data-fields",{name:"lnbits-data-fields",template:"#lnbits-data-fields",props:["fields","hide-advanced"],data:()=>({fieldTypes:[{label:"Text",value:"str"},{label:"Integer",value:"int"},{label:"Float",value:"float"},{label:"Boolean",value:"bool"},{label:"Date Time",value:"datetime"},{label:"JSON",value:"json"},{label:"Wallet Select",value:"wallet"},{label:"Currency Select",value:"currency"}],fieldsTable:{columns:[{name:"name",align:"left",label:"Field Name",field:"name",sortable:!0},{name:"type",align:"left",label:"Type",field:"type",sortable:!1},{name:"label",align:"left",label:"UI Label",field:"label",sortable:!0},{name:"hint",align:"left",label:"UI Hint",field:"hint",sortable:!1},{name:"optional",align:"left",label:"Optional",field:"optional",sortable:!1}],pagination:{sortBy:"name",rowsPerPage:100,page:1,rowsNumber:100},search:null,hideEmpty:!0}}),methods:{addField:function(){this.fields.push({name:"field_name_"+(this.fields.length+1),type:"text",label:"",hint:"",optional:!0,sortable:!0,searchable:!0,editable:!0,fields:[]})},removeField:function(e){const t=this.fields.indexOf(e);t>-1&&this.fields.splice(t,1)}},async created(){this.hideAdvanced||this.fieldsTable.columns.push({name:"editable",align:"left",label:"UI Editable",field:"editable",sortable:!1},{name:"sortable",align:"left",label:"Sortable",field:"sortable",sortable:!1},{name:"searchable",align:"left",label:"Searchable",field:"searchable",sortable:!1})}}),window.app.component(QrcodeVue),window.app.component("lnbits-extension-rating",{template:"#lnbits-extension-rating",name:"lnbits-extension-rating",props:{rating:{type:Number,default:0},count:{type:Number,default:null},clickable:{type:Boolean,default:!1}},computed:{displayRating(){return Math.round(2*(this.rating||0))/2},hasData(){return null!==this.count&&void 0!==this.count}},methods:{handleClick(){this.clickable&&this.$emit("click")}}}),window.app.component("lnbits-manage",{template:"#lnbits-manage",methods:{isActive:e=>window.location.pathname===e},data:()=>({extensions:[]})}),window.app.component("lnbits-payment-details",{template:"#lnbits-payment-details",props:["payment"],computed:{hasPreimage(){return this.payment.preimage&&"0000000000000000000000000000000000000000000000000000000000000000"!==this.payment.preimage},hasExpiry(){return!!this.payment.expiry},hasSuccessAction(){return this.hasPreimage&&this.payment.extra&&this.payment.extra.success_action},webhookStatusColor(){return this.payment.webhook_status>=300||this.payment.webhook_status<0?"red-10":this.payment.webhook_status?"green-10":"cyan-7"},webhookStatusText(){return this.payment.webhook_status?this.payment.webhook_status:"not sent yet"},hasTag(){return this.payment.extra&&!!this.payment.extra.tag},extras(){if(!this.payment.extra)return[];let e=_.omit(this.payment.extra,["tag","success_action"]);return Object.keys(e).map(t=>({key:t,value:e[t]}))}}}),window.app.component("lnbits-lnurlpay-success-action",{template:"#lnbits-lnurlpay-success-action",props:["payment","success_action"],data(){return{decryptedValue:this.success_action.ciphertext}},mounted(){if("aes"!==this.success_action.tag)return null;this.utils.decryptLnurlPayAES(this.success_action,this.payment.preimage).then(e=>{this.decryptedValue=e})}}),window.app.component("lnbits-notifications-btn",{template:"#lnbits-notifications-btn",props:["pubkey"],data:()=>({isSupported:!1,isSubscribed:!1,isPermissionGranted:!1,isPermissionDenied:!1}),methods:{urlB64ToUint8Array(e){const t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),s=atob(t),a=new Uint8Array(s.length);for(let e=0;et!==e),this.$q.localStorage.set("lnbits.webpush.subscribedUsers",JSON.stringify(t))},isUserSubscribed(e){return(JSON.parse(this.$q.localStorage.getItem("lnbits.webpush.subscribedUsers"))||[]).includes(e)},subscribe(){this.isSupported&&!this.isPermissionDenied&&(Notification.requestPermission().then(e=>{this.isPermissionGranted="granted"===e,this.isPermissionDenied="denied"===e}).catch(console.log),navigator.serviceWorker.ready.then(e=>{navigator.serviceWorker.getRegistration().then(e=>{e.pushManager.getSubscription().then(t=>{if(null===t||!this.isUserSubscribed(this.g.user.id)){const t={applicationServerKey:this.urlB64ToUint8Array(this.pubkey),userVisibleOnly:!0};e.pushManager.subscribe(t).then(e=>{LNbits.api.request("POST","/api/v1/webpush",null,{subscription:JSON.stringify(e)}).then(e=>{this.saveUserSubscribed(e.data.user),this.isSubscribed=!0}).catch(LNbits.utils.notifyApiError)})}}).catch(console.log)})}))},unsubscribe(){navigator.serviceWorker.ready.then(e=>{e.pushManager.getSubscription().then(e=>{e&&LNbits.api.request("DELETE","/api/v1/webpush?endpoint="+btoa(e.endpoint),null).then(()=>{this.removeUserSubscribed(this.g.user.id),this.isSubscribed=!1}).catch(LNbits.utils.notifyApiError)})}).catch(console.log)},checkSupported(){let e="https:"===window.location.protocol,t="serviceWorker"in navigator,s="Notification"in window,a="PushManager"in window;return this.isSupported=e&&t&&s&&a,this.isSupported||console.log("Notifications disabled because requirements are not met:",{HTTPS:e,"Service Worker API":t,"Notification API":s,"Push API":a}),this.isSupported},async updateSubscriptionStatus(){await navigator.serviceWorker.ready.then(e=>{e.pushManager.getSubscription().then(e=>{this.isSubscribed=!!e&&this.isUserSubscribed(this.g.user.id)})}).catch(console.log)}},created(){this.isPermissionDenied="denied"===Notification.permission,this.checkSupported()&&this.updateSubscriptionStatus()}}),window.app.component("lnbits-dynamic-fields",{template:"#lnbits-dynamic-fields",props:["options","modelValue"],data:()=>({formData:null,rules:[e=>!!e||"Field is required"]}),methods:{applyRules(e){return e?this.rules:[]},buildData(e,t={}){return e.reduce((e,s)=>(s.options?.length?e[s.name]=this.buildData(s.options,t[s.name]):e[s.name]=t[s.name]??s.default,e),{})},handleValueChanged(){this.$emit("update:model-value",this.formData)}},created(){this.formData=this.buildData(this.options,this.modelValue)}}),window.app.component("lnbits-dynamic-chips",{template:"#lnbits-dynamic-chips",props:["modelValue"],data:()=>({chip:"",chips:[]}),methods:{addChip(){this.chip&&(this.chips.push(this.chip),this.chip="",this.$emit("update:model-value",this.chips.join(",")))},removeChip(e){this.chips.splice(e,1),this.$emit("update:model-value",this.chips.join(","))}},created(){"string"==typeof this.modelValue?this.chips=this.modelValue.split(","):this.chips=[...this.modelValue]}}),window.app.component("lnbits-update-balance",{template:"#lnbits-update-balance",props:["wallet_id","small_btn"],computed:{admin(){return!0===this.g.user?.super_user}},data:()=>({credit:0}),methods:{updateBalance(e){LNbits.api.updateBalance(e.value,this.wallet_id).then(t=>{if(!0!==t.data.success)throw new Error(t.data);credit=parseInt(e.value),Quasar.Notify.create({type:"positive",message:this.$t("credit_ok",{amount:credit}),icon:null}),this.credit=0,e.value=0,e.set()}).catch(LNbits.utils.notifyApiError)}}}),window.app.component("user-id-only",{template:"#user-id-only",props:{allowed_new_users:Boolean,authAction:String,authMethod:String,usr:String,wallet:String},data(){return{user:this.usr,walletName:this.wallet}},methods:{showLogin(e){this.$emit("show-login",e)},showRegister(e){this.$emit("show-register",e)},loginUsr(){this.$emit("update:usr",this.user),this.$emit("login-usr")},createWallet(){this.$emit("update:wallet",this.walletName),this.$emit("create-wallet")}},computed:{showInstantLogin(){return"username-password"!==this.authMethod||"register"!==this.authAction}},created(){}}),window.app.component("username-password",{template:"#username-password",props:{allowed_new_users:Boolean,authMethods:Array,authAction:String,username:String,password_1:String,password_2:String,invitationCode:String,resetKey:String},data(){return{oauth:["nostr-auth-nip98","google-auth","github-auth","keycloak-auth","oidc-auth"],username:this.userName,password:this.password_1,passwordRepeat:this.password_2,reset_key:this.resetKey,confirmationMethod:"code",confirmationEmail:"",confirmationCode:this.invitationCode||"",showConfirmationCode:!1,showPwd:!1,showPwdRepeat:!1}},methods:{login(){this.$emit("update:userName",this.username),this.$emit("update:password_1",this.password),this.$emit("login")},register(){this.$emit("update:userName",this.username),this.$emit("update:password_1",this.password),this.$emit("update:password_2",this.passwordRepeat),this.$emit("update:invitationCode",this.confirmationCode),this.$emit("register")},reset(){this.$emit("update:resetKey",this.reset_key),this.$emit("update:password_1",this.password),this.$emit("update:password_2",this.passwordRepeat),this.$emit("reset")},validateUsername:e=>new RegExp("^(?=[a-zA-Z0-9._]{2,20}$)(?!.*[_.]{2})[^_.].*[^_.]$").test(e),async signInWithNostr(){try{const e=await this.createNostrToken();if(!e)return;resp=await LNbits.api.loginByProvider("nostr",{Authorization:e},{}),window.location.href="/wallet"}catch(e){console.warn(e);const t=e?.response?.data?.detail||`${e}`;Quasar.Notify.create({type:"negative",message:"Failed to sign in with Nostr.",caption:t})}},async createNostrToken(){try{if(!window.nostr?.signEvent)return void Quasar.Notify.create({type:"negative",message:"No Nostr signing app detected.",caption:'Is "window.nostr" present?'});const e=`${window.location}nostr`,t="POST",s=await NostrTools.nip98.getToken(e,t,e=>async function(e){try{const{data:t}=await LNbits.api.getServerHealth();return e.created_at=t.server_time,await window.nostr.signEvent(e)}catch(e){console.error(e),Quasar.Notify.create({type:"negative",message:"Failed to sign nostr event.",caption:`${e}`})}}(e),!0);if(!await NostrTools.nip98.validateToken(s,e,t))throw new Error("Invalid signed token!");return s}catch(e){console.warn(e),Quasar.Notify.create({type:"negative",message:"Failed create Nostr event.",caption:`${e}`})}}},computed:{showOauth(){return this.oauth.some(e=>this.authMethods.includes(e))},disableRegister(){const e=!!this.username,t=!!this.password&&this.password.length>=8,s=this.password===this.passwordRepeat,a=0===this.confirmationMethodsCount||"code"!==this.confirmationMethod||this.confirmationCode.length>0;return!(e&&t&&s&&a)},confirmationMethodsCount(){return[this.g.settings.userActivationByEmail,this.g.settings.userActivationByPayment,this.g.settings.userActivationByInvitationCode].filter(Boolean).length}},created(){}}),window.app.component("separator-text",{template:"#separator-text",props:{text:String,uppercase:{type:Boolean,default:!1},color:{type:String,default:"grey"}}}),window.app.component("lnbits-node-ranks",{props:["ranks"],data:()=>({stats:[{label:"Capacity",key:"capacity"},{label:"Channels",key:"channelcount"},{label:"Age",key:"age"},{label:"Growth",key:"growth"},{label:"Availability",key:"availability"}]}),template:"\n \n
\n
1ml Node Rank
\n
\n
\n
{{ stat.label }}
\n
\n {{ (ranks && ranks[stat.key]) ?? '-' }}\n
\n
\n
\n
\n \n "}),window.app.component("lnbits-channel-stats",{props:["stats"],data:()=>({states:[{label:"Active",value:"active",color:"green"},{label:"Pending",value:"pending",color:"orange"},{label:"Inactive",value:"inactive",color:"grey"},{label:"Closed",value:"closed",color:"red"}]}),template:"\n \n
\n
Channels
\n
\n
\n
\n {{ state.label }}\n
\n
\n {{ (stats?.counts && stats.counts[state.value]) ?? \"-\" }}\n
\n
\n
\n
\n
\n "}),window.app.component("lnbits-stat",{props:["title","amount","msat","btc"],computed:{value(){return this.amount??(this.btc?LNbits.utils.formatSat(this.btc):LNbits.utils.formatMsat(this.msat))}},template:"\n \n \n
\n {{ title }}\n
\n
\n {{ value }}\n sats\n BTC\n
\n
\n
\n "}),window.app.component("lnbits-node-qrcode",{props:["info"],template:'\n \n \n
\n
\n \n
\n No addresses available\n
\n
\n
\n
\n \n Public Key Click to copy \n \n \n
\n '}),window.app.component("lnbits-channel-balance",{props:["balance","color"],methods:{formatMsat:e=>LNbits.utils.formatMsat(e)},template:'\n
\n
\n \n Local: {{ formatMsat(balance.local_msat) }}\n sats\n \n \n Remote: {{ formatMsat(balance.remote_msat) }}\n sats\n \n
\n\n \n
\n \n {{ balance.alias }}\n \n
\n \n
\n '}),window.app.component("lnbits-node-info",{props:["info"],data:()=>({showDialog:!1}),methods:{shortenNodeId:e=>e?e.substring(0,5)+"..."+e.substring(e.length-5):"..."},template:"\n
\n
{{ this.info.alias }}
\n
\n
{{ this.info.backend_name }}
\n \n #{{ this.info.color }}\n \n
{{ shortenNodeId(this.info.id) }}
\n \n \n
\n \n \n \n
\n "}),window.app.component("lnbits-stat",{props:["title","amount","msat","btc"],computed:{value(){return this.amount??(this.btc?LNbits.utils.formatSat(this.btc):LNbits.utils.formatMsat(this.msat))}},template:"\n \n \n
\n {{ title }}\n
\n
\n {{ value }}\n sats\n BTC\n
\n
\n
\n "}),window.WasmExtensionComponent={template:'\n
\n \n \n \n \n {{ error }}\n \n \n \n \n \n
Camera access
\n
\n \n {{ cameraPrompt.extensionName }} wants to access the camera to scan a QR code.\n \n \n \n \n \n \n
\n
\n \n \n \n
Background payments
\n
\n \n
\n {{ backgroundPaymentPrompt.extensionName }} wants permission to make\n background payments from\n {{ backgroundPaymentPrompt.walletName }}.\n
\n \n This permission can move funds later without an active click.\n \n \n \n
\n \n \n \n \n
\n
\n \n \n \n
Watch wallet payments
\n
\n \n
\n {{ walletPaymentWatchPrompt.extensionName }} wants permission to receive\n payment notifications for\n {{ walletPaymentWatchPrompt.walletName }}.\n
\n \n This permission exposes payment metadata for this wallet to the extension.\n \n
\n \n \n \n \n
\n
\n \n \n \n
Open link
\n
\n \n
\n {{ newTabPrompt.extensionName }} wants to open this link in a new\n tab.\n
\n \n {{ newTabPrompt.url }}\n
\n \n This link is not on the same domain as this LNbits page.\n \n \n \n \n \n \n \n \n \n \n ',data:()=>({allowedPaymentHashes:new Set,bridge:{apiRoutes:[],extensionId:"",permissions:[],public:!1,query:{},routeParams:{}},bridgePort:null,cameraPrompt:{extensionName:"",reject:null,resolve:null,show:!1},backgroundPaymentDestinationOptions:[{label:"Only transfers to my wallets",value:"own_wallets_only"},{label:"Allow external payments",value:"external_allowed"}],backgroundPaymentPrompt:{extensionName:"",form:{destinationPolicy:"own_wallets_only",maxAmount:0},reject:null,resolve:null,show:!1,walletId:"",walletName:""},walletPaymentWatchPrompt:{extensionName:"",reject:null,resolve:null,show:!1,walletId:"",walletName:""},newTabPrompt:{extensionName:"",external:!1,reject:null,resolve:null,show:!1,url:""},error:"",extensionName:"",frameUrl:"",handleWindowMessage:null,loading:!1,loadId:0,paymentSubscriptions:new Map,websocketSubscriptions:new Map}),created(){this.handleWindowMessage=e=>this.onWindowMessage(e),window.addEventListener("message",this.handleWindowMessage)},unmounted(){window.removeEventListener("message",this.handleWindowMessage),this.rejectCameraPrompt("Camera scan cancelled."),this.rejectBackgroundPaymentPrompt("Background payment permission cancelled."),this.rejectWalletPaymentWatchPrompt("Wallet payment watch permission cancelled."),this.rejectNewTabPrompt("Open link cancelled."),this.closeBridgePort()},watch:{"$route.fullPath":{immediate:!0,handler(){this.loadFrameConfig()}}},methods:{emptyBridge:()=>({apiRoutes:[],extensionId:"",permissions:[],public:!1,query:{},routeParams:{}}),plainBridgeContext(){return{extensionId:String(this.bridge.extensionId||""),public:Boolean(this.bridge.public),routeParams:this.plainValue(this.bridge.routeParams||{}),query:this.plainValue(this.bridge.query||{})}},hasBridgePermission(e){return(this.bridge.permissions||[]).includes(e)},cameraPromptStorageKey(){return`lnbits.ext.permissions.${this.bridge.extensionId}.ui.camera.scan_qr`},emptyBackgroundPaymentPrompt:()=>({extensionName:"",form:{destinationPolicy:"own_wallets_only",maxAmount:0},reject:null,resolve:null,show:!1,walletId:"",walletName:""}),emptyCameraPrompt:()=>({extensionName:"",reject:null,resolve:null,show:!1}),emptyWalletPaymentWatchPrompt:()=>({extensionName:"",reject:null,resolve:null,show:!1,walletId:"",walletName:""}),emptyNewTabPrompt:()=>({extensionName:"",external:!1,reject:null,resolve:null,show:!1,url:""}),plainValue(e){try{return JSON.parse(JSON.stringify(e))}catch(e){return{}}},async loadFrameConfig(){const e=String(this.$route.params.extId||""),t=++this.loadId;this.loading=!0,this.error="",this.frameUrl="",this.bridge=this.emptyBridge(),this.allowedPaymentHashes.clear(),this.rejectCameraPrompt("Camera scan cancelled."),this.rejectBackgroundPaymentPrompt("Background payment permission cancelled."),this.rejectWalletPaymentWatchPrompt("Wallet payment watch permission cancelled."),this.rejectNewTabPrompt("Open link cancelled."),this.closeBridgePort();try{const s=await fetch(`/api/v1/ext/${encodeURIComponent(e)}/_ui/frame`,{method:"POST",headers:{"content-type":"application/json"},credentials:"same-origin",body:JSON.stringify({path:this.$route.path,query:this.$route.query||{}})}),a=await s.text();let i={};if(a)try{i=JSON.parse(a)}catch(e){i={detail:a}}if(!s.ok)throw new Error(i?.detail||"Failed to load extension page.");if(t!==this.loadId)return;this.bridge=i.bridge||this.emptyBridge(),this.extensionName=i.extension?.name||e,this.frameUrl=i.frameUrl}catch(e){if(t!==this.loadId)return;console.error("[lnbits wasm extension] Failed to load frame.",e),this.error=e instanceof Error?e.message:String(e)}finally{t===this.loadId&&(this.loading=!1)}},extensionFrameWindow(){return this.$refs.frame?.contentWindow},sendResponse(e,t,s){e({type:"lnbits-extension:response",id:t,...s})},allowedApiRoute(e,t){let s;try{s=new URL(t,window.location.origin)}catch(e){return!1}return s.origin===window.location.origin&&(e=String(e||"GET").toUpperCase(),(this.bridge.apiRoutes||[]).some(t=>t.method===e&&new RegExp(t.pattern).test(s.pathname)))},extensionRoute(e){let t;try{t=new URL(String(e||""),window.location.origin)}catch(e){throw new Error("Invalid extension route.")}if(t.origin!==window.location.origin)throw new Error("Extension route must stay on this server.");const s=`/ext/${encodeURIComponent(this.bridge.extensionId)}`;if(t.pathname!==s&&!t.pathname.startsWith(`${s}/`))throw new Error("Extension route must stay inside this extension.");return`${t.pathname}${t.search}${t.hash}`},replaceExtensionRoute(e){return this.$router.replace(this.extensionRoute(e.path))},newTabUrl(e){const t=String(e||"").trim();if(!t)throw new Error("Open link needs a URL.");let s;try{s=new URL(t,window.location.href)}catch(e){throw new Error("Invalid open link URL.")}if(!["http:","https:"].includes(s.protocol))throw new Error("Only HTTP and HTTPS links can be opened.");if(s.username||s.password)throw new Error("Links with embedded credentials cannot be opened.");return{external:s.origin!==window.location.origin,url:s.href}},openNewTab(e){return this.promptNewTabOpen(this.newTabUrl(e.url||e.href))},promptNewTabOpen(e){if(this.newTabPrompt.show)throw new Error("Open link prompt is already open.");return new Promise((t,s)=>{this.newTabPrompt={extensionName:this.extensionName||this.bridge.extensionId||"This extension",external:e.external,reject:s,resolve:t,show:!0,url:e.url}})},resolveNewTabPrompt(e){const t=this.newTabPrompt;if(t.show)if(this.newTabPrompt=this.emptyNewTabPrompt(),e)try{window.open(t.url,"_blank","noopener,noreferrer"),t.resolve?.({external:t.external,opened:!0,url:t.url})}catch(e){t.reject?.(e)}else t.reject?.(new Error("Open link denied by user."))},rejectNewTabPrompt(e){const t=this.newTabPrompt.reject;this.newTabPrompt=this.emptyNewTabPrompt(),t?.(new Error(e))},async copyNewTabLink(){const e=this.newTabPrompt;if(e.show&&e.url)try{await navigator.clipboard.writeText(e.url),this.notify({level:"positive",message:"Link copied."})}catch(e){this.notify({level:"negative",message:"Could not copy link."})}},bridgeSessionStorageKey(e){const t=String(e||"").trim();if(!t||t.length>128||!/^[A-Za-z0-9._:-]+$/.test(t))throw new Error("Invalid extension session key.");return`lnbits.ext.session.${this.bridge.extensionId}.${t}`},getBridgeSessionValue(e){const t=this.bridgeSessionStorageKey(e.key);return{value:window.sessionStorage.getItem(t)||""}},setBridgeSessionValue(e){const t=this.bridgeSessionStorageKey(e.key),s=String(e.value||"");if(s.length>4096)throw new Error("Extension session value is too large.");return window.sessionStorage.setItem(t,s),{ok:!0}},async callApi(e){const t=String(e.method||"GET").toUpperCase(),s=String(e.path||"");if(!this.allowedApiRoute(t,s))throw new Error("Extension API route is not allowed.");const a={method:t,headers:{},credentials:"same-origin"};void 0!==e.body&&null!==e.body&&(a.headers["content-type"]="application/json",a.body=JSON.stringify(e.body));const i=await fetch(s,a),n=await i.text();let o=n;if(n)try{o=JSON.parse(n)}catch(e){o=n}if(!i.ok)throw new Error("object"==typeof o&&o.detail?o.detail:n);return this.rememberPaymentHashes(o),o},notify(e){const t=["positive","negative","warning","info"].includes(e.level)?e.level:"info";window.Quasar?.Notify&&window.Quasar.Notify.create({color:t,message:String(e.message||"")})},async scanQrCode(){if(!this.hasBridgePermission("ui.camera.scan_qr"))throw new Error("Extension is missing scanner permission.");if(!this.g)throw new Error("LNbits scanner is not available.");if(this.g.scanner)throw new Error("A scanner is already active.");if(await this.requireCameraScanApproval(),this.g.scanner)throw new Error("A scanner is already active.");return new Promise((e,t)=>{let s=!1;const a=()=>{window.clearTimeout(o),window.clearInterval(r),this.g.scanner===n&&(this.g.scanner=null)},i=e=>t=>{s||(s=!0,a(),e(t))},n=t=>{i(e)({value:String(t||"")})},o=window.setTimeout(()=>{i(t)(new Error("QR scan timed out."))},12e4),r=window.setInterval(()=>{s||this.g.scanner===n||i(t)(new Error("QR scan cancelled."))},250);this.g.scanner=n})},async requestBackgroundPaymentPermission(e){const t=await this.requestExtensionPermissions({forcePrompt:!0===e?.forcePrompt,permissions:[{id:"wallet.pay_invoice_background",grant:e?.grant||{}}]});return t.permissions?.[0]||t},async requestWalletPaymentWatchPermission(e){const t=await this.requestExtensionPermissions({permissions:[{id:"wallet.payments.watch",grant:e?.grant||{}}]});return t.permissions?.[0]||t},async requestExtensionPermissions(e){if(this.bridge.public)throw new Error("Public pages cannot request permissions.");const t=Array.isArray(e.permissions)?e.permissions:[];if(!t.length)throw new Error("No permissions requested.");const s=!0===e.forcePrompt,a=t.map(e=>this.normalizePermissionRequest(e)),i=await this.checkExtensionPermissions(a.map(e=>({id:e.id,grant:e.grant}))),n=Array.isArray(i?.permissions)?i.permissions:[],o=[],r=[];for(const[e,t]of a.entries()){const a=n[e]||{};if(a.id&&a.id!==t.id)throw new Error("Permission check response did not match request.");if(a.approved&&!s){o.push(t.label),r.push({id:t.id,approved:!0,grant:a.grant||t.grant});continue}const i=a.grant?{...t,grant:a.grant}:t,l=await this.promptExtensionPermission(i);r.push({id:t.id,approved:!0,grant:l?.grant||t.grant})}return this.notifyApprovedPermissionUse(o),{permissions:r}},normalizePermissionRequest(e){const t=String(e?.id||""),s=e?.grant||{};if("wallet.pay_invoice_background"===t)return this.normalizeBackgroundPaymentPermission(s);if("wallet.payments.watch"===t)return this.normalizeWalletPaymentWatchPermission(s);throw new Error(`Unsupported permission request: ${t}.`)},normalizeBackgroundPaymentPermission(e){if(!this.hasBridgePermission("wallet.pay_invoice_background"))throw new Error("Extension is missing background payment permission.");const t=String(e.walletId||e.wallet_id||""),s=this.walletById(t);if(!s)throw new Error("Selected wallet is not available.");if("lightning-shared"===s.walletType)throw new Error("Background payments are not allowed from shared wallets.");const a={wallet_id:t,max_amount:this.positiveInteger(e.maxAmount||e.max_amount,1e3),destination_policy:this.backgroundPaymentDestinationPolicy(e.destinationPolicy||e.destination_policy)};if(!a.max_amount)throw new Error("Max payment amount must be greater than zero.");return{id:"wallet.pay_invoice_background",grant:a,label:`Background payments from ${s.name||t}`,wallet:s}},normalizeWalletPaymentWatchPermission(e){if(!this.hasBridgePermission("wallet.payments.watch"))throw new Error("Extension is missing wallet payment watch permission.");const t=String(e.walletId||e.wallet_id||""),s=this.walletById(t);if(!s)throw new Error("Selected wallet is not available.");return{id:"wallet.payments.watch",grant:{wallet_id:t},label:`Watch wallet payments for ${s.name||t}`,wallet:s}},walletById(e){return(this.g?.user?.wallets||[]).find(t=>t.id===e)||null},async checkExtensionPermissions(e){return await this.postExtensionPermission("check",{permissions:e},"Could not check extension permissions.")},promptExtensionPermission(e){if("wallet.pay_invoice_background"===e.id)return this.promptBackgroundPaymentPermission(e);if("wallet.payments.watch"===e.id)return this.promptWalletPaymentWatchPermission(e);throw new Error(`Unsupported permission request: ${e.id}.`)},promptBackgroundPaymentPermission(e){if(this.backgroundPaymentPrompt.show)throw new Error("Background payment prompt is already open.");return new Promise((t,s)=>{this.backgroundPaymentPrompt={extensionName:this.extensionName||this.bridge.extensionId||"This extension",form:{destinationPolicy:e.grant.destination_policy,maxAmount:e.grant.max_amount},reject:s,resolve:t,show:!0,walletId:e.grant.wallet_id,walletName:e.wallet.name||e.grant.wallet_id}})},async resolveBackgroundPaymentPrompt(e){const t=this.backgroundPaymentPrompt;if(t.show){if(!e)return this.backgroundPaymentPrompt=this.emptyBackgroundPaymentPrompt(),void t.reject?.(new Error("Background payment permission denied."));try{const e={wallet_id:t.walletId,max_amount:this.positiveInteger(t.form.maxAmount,0),destination_policy:this.backgroundPaymentDestinationPolicy(t.form.destinationPolicy)};if(!e.max_amount)throw new Error("Max payment amount must be greater than zero.");const s=await this.postExtensionPermission("background-payment",e,"Could not save permission.");this.backgroundPaymentPrompt=this.emptyBackgroundPaymentPrompt(),t.resolve?.(s)}catch(e){t.reject?.(e),this.backgroundPaymentPrompt=this.emptyBackgroundPaymentPrompt()}}},rejectBackgroundPaymentPrompt(e){const t=this.backgroundPaymentPrompt.reject;this.backgroundPaymentPrompt=this.emptyBackgroundPaymentPrompt(),t?.(new Error(e))},promptWalletPaymentWatchPermission(e){if(this.walletPaymentWatchPrompt.show)throw new Error("Wallet payment watch prompt is already open.");return new Promise((t,s)=>{this.walletPaymentWatchPrompt={extensionName:this.extensionName||this.bridge.extensionId||"This extension",reject:s,resolve:t,show:!0,walletId:e.grant.wallet_id,walletName:e.wallet.name||e.grant.wallet_id}})},async resolveWalletPaymentWatchPrompt(e){const t=this.walletPaymentWatchPrompt;if(t.show){if(!e)return this.walletPaymentWatchPrompt=this.emptyWalletPaymentWatchPrompt(),void t.reject?.(new Error("Wallet payment watch permission denied."));try{const e=await this.postExtensionPermission("wallet-payments-watch",{wallet_id:t.walletId},"Could not save permission.");this.walletPaymentWatchPrompt=this.emptyWalletPaymentWatchPrompt(),t.resolve?.(e)}catch(e){t.reject?.(e),this.walletPaymentWatchPrompt=this.emptyWalletPaymentWatchPrompt()}}},rejectWalletPaymentWatchPrompt(e){const t=this.walletPaymentWatchPrompt.reject;this.walletPaymentWatchPrompt=this.emptyWalletPaymentWatchPrompt(),t?.(new Error(e))},positiveInteger(e,t){const s=Number(e);return!Number.isFinite(s)||s<=0?t:Math.floor(s)},backgroundPaymentDestinationPolicy:e=>"external_allowed"===e?"external_allowed":"own_wallets_only",async postExtensionPermission(e,t,s){const a=await fetch(`/api/v1/extension/${encodeURIComponent(this.bridge.extensionId)}/permissions/${e}`,{method:"POST",headers:{"content-type":"application/json"},credentials:"same-origin",body:JSON.stringify(t)}),i=await a.text();let n={};if(i)try{n=JSON.parse(i)}catch(e){n={detail:i}}if(!a.ok)throw new Error(n?.detail||s);return n},notifyApprovedPermissionUse(e){const t=e.filter(Boolean).join(", ");t&&this.notify({level:"info",message:`Using approved permissions: ${t}.`})},requireCameraScanApproval(){return this.isCameraScanRemembered()?Promise.resolve():this.cameraPrompt.show?Promise.reject(new Error("Camera access prompt is already open.")):new Promise((e,t)=>{this.cameraPrompt={extensionName:this.extensionName||this.bridge.extensionId||"This extension",reject:t,resolve:e,show:!0}})},isCameraScanRemembered(){try{return"allow"===this.$q.localStorage.getItem(this.cameraPromptStorageKey())}catch(e){return!1}},rememberCameraScanApproval(){try{this.$q.localStorage.set(this.cameraPromptStorageKey(),"allow")}catch(e){}},resolveCameraPrompt(e){const t=this.cameraPrompt.resolve,s=this.cameraPrompt.reject;if(this.cameraPrompt=this.emptyCameraPrompt(),"allow_remember"===e)return this.rememberCameraScanApproval(),void t?.();"allow"!==e?s?.(new Error("Camera scan denied by user.")):t?.()},rejectCameraPrompt(e){const t=this.cameraPrompt.reject;this.cameraPrompt=this.emptyCameraPrompt(),t?.(new Error(e))},rememberPaymentHashes(e){if(e&&"object"==typeof e)if(Array.isArray(e))e.forEach(e=>this.rememberPaymentHashes(e));else for(const[t,s]of Object.entries(e))["paymentHash","payment_hash"].includes(t)&&this.isPaymentHash(s)&&this.allowedPaymentHashes.add(s),this.rememberPaymentHashes(s)},isPaymentHash:e=>"string"==typeof e&&/^[a-f0-9]{64}$/i.test(e),isWebsocketItemId:e=>"string"==typeof e&&/^[A-Za-z0-9][A-Za-z0-9:_-]{0,127}$/.test(e),websocketUrl(e){const t=new URL(window.location.href);return t.protocol="https:"===t.protocol?"wss:":"ws:",t.pathname=e,t.search="",t.hash="",t.toString()},sendBridgeEvent(e){this.bridgePort&&this.bridgePort.postMessage({type:"lnbits-extension:event",...e})},closePaymentSubscription(e){const t=this.paymentSubscriptions.get(e);if(t){this.paymentSubscriptions.delete(e);try{t.socket.close()}catch(e){}}},closePaymentSubscriptions(){for(const e of Array.from(this.paymentSubscriptions.keys()))this.closePaymentSubscription(e)},closeWebsocketSubscription(e){const t=this.websocketSubscriptions.get(e);if(t){this.websocketSubscriptions.delete(e);try{t.socket.close()}catch(e){}}},closeWebsocketSubscriptions(){for(const e of Array.from(this.websocketSubscriptions.keys()))this.closeWebsocketSubscription(e)},closeBridgePort(){this.closePaymentSubscriptions(),this.closeWebsocketSubscriptions(),this.bridgePort?.close(),this.bridgePort=null},subscribePayment(e){const t=String(e.subscriptionId||""),s=String(e.paymentHash||"");if(!t||!this.isPaymentHash(s))throw new Error("Invalid payment subscription.");if(!this.allowedPaymentHashes.has(s))throw new Error("Payment subscription is not allowed.");this.closePaymentSubscription(t);const a=new WebSocket(this.websocketUrl(`/api/v1/ws/${encodeURIComponent(s)}`));this.paymentSubscriptions.set(t,{paymentHash:s,socket:a}),a.addEventListener("message",e=>{let a=e.data;try{a=JSON.parse(e.data)}catch(e){}this.sendBridgeEvent({event:"payment.update",subscriptionId:t,paymentHash:s,data:a}),a&&"object"==typeof a&&(!1===a.pending||["success","settled","paid"].includes(String(a.status||"")))&&(this.sendBridgeEvent({event:"payment.settled",subscriptionId:t,paymentHash:s,data:a}),this.closePaymentSubscription(t))}),a.addEventListener("error",()=>{this.sendBridgeEvent({event:"payment.error",subscriptionId:t,paymentHash:s}),this.closePaymentSubscription(t)}),a.addEventListener("close",()=>{this.paymentSubscriptions.delete(t)})},subscribeWebsocket(e){if(!this.hasBridgePermission("websocket.subscribe"))throw new Error("Extension is missing websocket subscribe permission.");const t=String(e.subscriptionId||""),s=String(e.itemId||"");if(!t||t.length>128||!this.isWebsocketItemId(s))throw new Error("Invalid websocket subscription.");this.closeWebsocketSubscription(t);const a=new WebSocket(this.websocketUrl(`/api/v1/ext/ws/${encodeURIComponent(this.bridge.extensionId)}/${encodeURIComponent(s)}`));this.websocketSubscriptions.set(t,{itemId:s,socket:a}),a.addEventListener("message",e=>{let a=e.data;try{a=JSON.parse(e.data)}catch(e){}this.sendBridgeEvent({event:"websocket.message",subscriptionId:t,itemId:s,data:a})}),a.addEventListener("error",()=>{this.sendBridgeEvent({event:"websocket.error",subscriptionId:t,itemId:s}),this.closeWebsocketSubscription(t)}),a.addEventListener("close",()=>{this.websocketSubscriptions.delete(t)})},sendWebsocket(e){if(!this.hasBridgePermission("websocket.subscribe"))throw new Error("Extension is missing websocket subscribe permission.");const t=String(e.subscriptionId||"");if(!t)throw new Error("Invalid websocket subscription.");const s=this.websocketSubscriptions.get(t);if(!s)return;if(s.socket.readyState!==WebSocket.OPEN)return void(s.socket.readyState!==WebSocket.CLOSING&&s.socket.readyState!==WebSocket.CLOSED||this.closeWebsocketSubscription(t));const a="string"==typeof e.data?e.data:JSON.stringify(e.data??{});s.socket.send(a)},async handleBridgeRequest(e,t){if(e&&"lnbits-extension:request"===e.type)try{if("context"===e.action)return void this.sendResponse(t,e.id,{ok:!0,data:this.plainBridgeContext()});if("api"===e.action)return void this.sendResponse(t,e.id,{ok:!0,data:await this.callApi(e)});if("ui.notify"===e.action)return this.notify(e),void this.sendResponse(t,e.id,{ok:!0,data:{ok:!0}});if("navigation.replace"===e.action)return await this.replaceExtensionRoute(e),void this.sendResponse(t,e.id,{ok:!0,data:{ok:!0}});if("navigation.open_new_tab"===e.action)return void this.sendResponse(t,e.id,{ok:!0,data:await this.openNewTab(e)});if("storage.session.get"===e.action)return void this.sendResponse(t,e.id,{ok:!0,data:this.getBridgeSessionValue(e)});if("storage.session.set"===e.action)return void this.sendResponse(t,e.id,{ok:!0,data:this.setBridgeSessionValue(e)});if("ui.scan_qr"===e.action)return void this.sendResponse(t,e.id,{ok:!0,data:await this.scanQrCode()});if("permissions.request"===e.action)return void this.sendResponse(t,e.id,{ok:!0,data:await this.requestExtensionPermissions(e)});if("permissions.request_background_payment"===e.action)return void this.sendResponse(t,e.id,{ok:!0,data:await this.requestBackgroundPaymentPermission(e)});if("permissions.request_wallet_payment_watch"===e.action)return void this.sendResponse(t,e.id,{ok:!0,data:await this.requestWalletPaymentWatchPermission(e)});if("payment.subscribe"===e.action)return this.subscribePayment(e),void this.sendResponse(t,e.id,{ok:!0,data:{ok:!0}});if("payment.unsubscribe"===e.action)return this.closePaymentSubscription(String(e.subscriptionId||"")),void this.sendResponse(t,e.id,{ok:!0,data:{ok:!0}});if("websocket.subscribe"===e.action)return this.subscribeWebsocket(e),void this.sendResponse(t,e.id,{ok:!0,data:{ok:!0}});if("websocket.unsubscribe"===e.action)return this.closeWebsocketSubscription(String(e.subscriptionId||"")),void this.sendResponse(t,e.id,{ok:!0,data:{ok:!0}});if("websocket.send"===e.action)return this.sendWebsocket(e),void this.sendResponse(t,e.id,{ok:!0,data:{ok:!0}});throw new Error("Unknown extension bridge action.")}catch(s){this.sendResponse(t,e.id,{ok:!1,error:s instanceof Error?s.message:String(s)})}},onWindowMessage(e){if(e.source!==this.extensionFrameWindow())return;const t=e.data;if(!t||"lnbits-extension:connect"!==t.type)return;const s=e.ports?.[0];s&&(this.closeBridgePort(),this.bridgePort=s,this.bridgePort.addEventListener("message",e=>{this.handleBridgeRequest(e.data,e=>{s.postMessage(e)})}),this.bridgePort.start(),this.bridgePort.postMessage({type:"lnbits-extension:connected",id:t.id}))}}};const quasarConfig={config:{loading:{spinner:Quasar.QSpinnerBars},table:{rowsPerPageOptions:[5,10,20,50,100,200,500,0]}}},DynamicComponent={async created(){const e=this.$route.path.split("/")[1],t=`/${e}/`,s=`/${e}/static/routes.json`;this.$router.getRoutes().some(e=>e.path===t)||this.$route.fullPath.startsWith("/extensions/builder/preview")||fetch(s).then(async e=>{if(!e.ok)throw new Error("No dynamic routes found");(await e.json()).forEach(e=>{console.log("Adding dynamic route:",e.path),window.router.addRoute({path:e.path,name:e.name,component:async()=>{if(await LNbits.utils.loadTemplate(e.template),e.i18n){const t=window.i18n?.global?.locale?.value??window.i18n?.global?.locale??window.g.locale??"en";await LNbits.utils.loadExtI18n(e.i18n,t)}return await LNbits.utils.loadScript(e.component),window[e.name]}}),window.router.push(this.$route.fullPath)})}).catch(()=>{let e=RENDERED_ROUTE;if(2===e.split("/").length&&(e+="/"),e!==this.$route.path)return console.log("Redirecting to non-vue route:",this.$route.fullPath),void(window.location=this.$route.fullPath)})}},routes=[{path:"/node",name:"Node",component:PageNode},{path:"/node/public",name:"NodePublic",component:PageNodePublic},{path:"/blockexplorer/:type(tx|address|block)?/:id?",name:"BlockExplorer",component:PageBlockExplorer,meta:{stableKey:!0}},{path:"/payments",name:"Payments",component:PagePayments},{path:"/audit",name:"Audit",component:PageAudit},{path:"/wallet",redirect:e=>{const t=window.g?.lastActiveWallet||window.g?.user?.wallets[0].id;return`/wallet/${e.query.wal||t||"default"}`}},{path:"/wallet/:id",name:"Wallet",component:PageWallet},{path:"/wallets",name:"Wallets",component:PageWallets},{path:"/users",name:"Users",component:PageUsers},{path:"/admin/extensions/wasm",name:"AdminWasmRuntime",component:PageAdmin},{path:"/admin/extensions/wasm/limits",name:"AdminWasmLimitConfig",component:PageAdmin},{path:"/admin/extensions/wasm/limits/:extId",name:"AdminWasmLimitConfigDetail",component:PageAdmin},{path:"/admin/extensions/wasm/:extId",name:"AdminWasmRuntimeDetail",component:PageAdmin},{path:"/admin",name:"Admin",component:PageAdmin},{path:"/account",name:"Account",component:PageAccount},{path:"/extensions/builder",name:"ExtensionsBuilder",component:PageExtensionBuilder},{path:"/extensions/builder/preview",name:"ExtensionsBuilderPreview",component:PageExtensionBuilderPreview},{path:"/extensions",name:"Extensions",component:PageExtensions},{path:"/first_install",name:"FirstInstall",component:PageFirstInstall},{path:"/",name:"PageHome",component:PageHome},{path:"/error",name:"PageError",component:PageError},{path:"/ext/:extId",name:"WasmExtensionRoot",component:window.WasmExtensionComponent},{path:"/ext/:extId/:pathMatch(.*)*",name:"WasmExtension",component:window.WasmExtensionComponent},{path:"/:pathMatch(.*)*",name:"DynamicComponent",component:DynamicComponent}];window.router=VueRouter.createRouter({history:VueRouter.createWebHistory(),routes:routes}),window.LOCALE=window.g.locale,window.i18n=new VueI18n.createI18n({locale:window.g.locale,fallbackLocale:"en",messages:window.localisation}),function(){let e=!1,t=null;Vue.watch(()=>window.i18n.global.locale,async(s,a)=>{!e&&LNbits.utils._extI18nDirs.size&&(t=s,e=!0,window.i18n.global.locale=a,e=!1,await Promise.all([...LNbits.utils._extI18nDirs].map(e=>LNbits.utils.loadExtI18n(e,s))),t===s&&(e=!0,window.i18n.global.locale=s,e=!1))},{flush:"sync"})}(),window.app.mixin({data:()=>({api:window._lnbitsApi,utils:window._lnbitsUtils,g:window.g}),methods:{copyText:window._lnbitsUtils.copyText,formatBalance:window._lnbitsUtils.formatBalance}}),window.app.use(VueQrcodeReader),window.app.use(Quasar,quasarConfig),window.app.use(window.i18n),window.app.use(window.router),window.app.mount("#vue"); \ No newline at end of file +window.PageError={template:"#page-error"},window.PageHome={template:"#page-home",data:()=>({lnurl:"",authAction:"login",authMethod:"username-password",usr:"",username:"",reset_key:"",email:"",password:"",passwordRepeat:"",invitationCode:"",walletName:"",signup:!1}),computed:{showClaimLnurl(){return""!==this.lnurl&&this.g.settings.allowRegister&&this.g.settings.authMethods.includes("user-id-only")},formatDescription(){return LNbits.utils.convertMarkdown(this.g.settings.siteDescription)},isAccessTokenExpired(){return this.$q.cookies.get("is_access_token_expired")}},methods:{showLogin(e){this.authAction="login",this.authMethod=e},showRegister(e){this.user="",this.username=null,this.password=null,this.passwordRepeat=null,this.invitationCode=null,this.authAction="register",this.authMethod=e},async register(){try{await LNbits.api.register(this.username,this.email,this.password,this.passwordRepeat,this.invitationCode),this.refreshAuthUser()}catch(e){LNbits.utils.notifyApiError(e)}},async reset(){try{await LNbits.api.reset(this.reset_key,this.password,this.passwordRepeat),this.refreshAuthUser()}catch(e){LNbits.utils.notifyApiError(e)}},async login(){try{await LNbits.api.login(this.username,this.password),this.refreshAuthUser()}catch(e){LNbits.utils.notifyApiError(e)}},async loginUsr(){try{await LNbits.api.loginUsr(this.usr),this.refreshAuthUser()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async refreshAuthUser(){try{const e=await LNbits.api.getAuthUser();this.g.user=LNbits.map.user(e.data),this.g.isPublicPage=!1,this.$router.push(`/wallet/${this.g.user.wallets[0].id}`)}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},createWallet(){LNbits.api.createAccount(this.walletName).then(e=>{this.$router.push(`/wallet/${e.data.id}`)})},processing(){Quasar.Notify.create({timeout:0,message:"Processing...",icon:null})}},created(){if(this.g.isUserAuthorized)return this.refreshAuthUser();const e=new URLSearchParams(window.location.search);this.reset_key=e.get("reset_key"),this.reset_key&&(this.authAction="reset"),e.has("lightning")&&(this.lnurl=e.get("lightning"))}},window.PageExtensionBuilder={template:"#page-extension-builder",data:()=>({step:1,previewStepNames:{2:"settings",3:"owner_data",4:"client_data",5:"public_page"},extensionDataCleanString:"",extensionData:{id:"",name:"",stub_version:"",short_description:"",description:"",public_page:{has_public_page:!0,owner_data_fields:{name:"",description:""},client_data_fields:{public_inputs:[]},action_fields:{generate_action:!0,generate_payment_logic:!1,wallet_id:"",currency:"",amount:"",paid_flag:""}},preview_action:{is_preview_mode:!1,is_settings_preview:!1,is_owner_data_preview:!1,is_client_data_preview:!1,is_public_page_preview:!1},settings_data:{name:"Settings",enabled:!0,type:"user",fields:[]},owner_data:{name:"OwnerData",fields:[]},client_data:{enabled:!0,name:"ClientData",fields:[]}},sampleField:{name:"name",type:"str",label:"Name",hint:"",optional:!0,editable:!0,searchable:!0,sortable:!0},settingsTypes:[{label:"User Settings",value:"user"},{label:"Admin Settings",value:"admin"}],amountSource:[{label:"Client Data",value:"client_data"},{label:"Owner Data",value:"owner_data"}],extensionStubVersions:[]}),watch:{"extensionData.public_page.action_fields.amount_source":function(e,t){t&&e!==t&&(this.extensionData.public_page.action_fields.amount="")}},computed:{paymentActionAmountFields(){const e=this.extensionData.public_page.action_fields.amount_source;return e?"owner_data"===e?[""].concat(this.extensionData.owner_data.fields.filter(e=>"int"===e.type||"float"===e.type).map(e=>e.name)):"client_data"===e?[""].concat(this.extensionData.client_data.fields.filter(e=>"int"===e.type||"float"===e.type).map(e=>e.name)):void 0:[""]}},methods:{saveState(){this.$q.localStorage.set("lnbits.extension.builder.data",JSON.stringify(this.extensionData)),this.$q.localStorage.set("lnbits.extension.builder.step",this.step)},nextStep(){this.saveState(),this.$refs.stepper.next(),this.refreshPreview()},previousStep(){this.saveState(),this.$refs.stepper.previous(),this.refreshPreview()},onStepChange(){this.saveState(),this.refreshPreview()},clearAllData(){LNbits.utils.confirmDialog("Are you sure you want to clear all data? This action cannot be undone.").onOk(()=>{this.extensionData=JSON.parse(this.extensionDataCleanString),this.$q.localStorage.remove("lnbits.extension.builder.data"),this.$refs.stepper.set(1)})},exportJsonData(){!0!==Quasar.exportFile(`${this.extensionData.id||"data-export"}.json`,JSON.stringify(this.extensionData,null,2),"text/json")?Quasar.Notify.create({message:"Browser denied file download...",color:"negative",icon:null}):Quasar.Notify.create({message:"File downloaded!",color:"positive",icon:"file_download"})},onJsonDataInput(e){const t=e.target.files[0],a=new FileReader;a.onload=e=>{this.extensionData={...this.extensionData,...JSON.parse(e.target.result)},this.$refs.extensionDataInput.value=null,Quasar.Notify.create({message:"File loaded!",color:"positive",icon:"file_upload"})},a.readAsText(t)},async buildExtension(){try{const e={responseType:"blob"},t=await LNbits.api.request("POST","/api/v1/extension/builder/zip",null,this.extensionData,e),a=window.URL.createObjectURL(new Blob([t.data])),s=document.createElement("a");s.href=a,s.download=`${this.extensionData.id||"lnbits-extension"}.zip`,document.body.appendChild(s),s.click(),s.remove(),window.URL.revokeObjectURL(a)}catch(e){LNbits.utils.notifyApiError(e)}},async buildExtensionAndDeploy(){try{const{data:e}=await LNbits.api.request("POST","/api/v1/extension/builder/deploy",null,this.extensionData);Quasar.Notify.create({message:e.message||"Extension deployed!",color:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}},async cleanCacheData(){LNbits.utils.confirmDialog("Are you sure you want to clean the cache data? This action cannot be undone.","Clean Cache Data").onOk(async()=>{try{const{data:e}=await LNbits.api.request("DELETE","/api/v1/extension/builder",null,{});Quasar.Notify.create({message:e.message||"Cache data cleaned!",color:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}})},async previewExtension(e){this.saveState();try{await LNbits.api.request("POST","/api/v1/extension/builder/preview",null,{...this.extensionData,preview_action:{is_preview_mode:!!e,is_settings_preview:"settings"===e,is_owner_data_preview:"owner_data"===e,is_client_data_preview:"client_data"===e,is_public_page_preview:"public_page"===e}}),this.refreshIframe(e)}catch(e){LNbits.utils.notifyApiError(e)}},async refreshPreview(){setTimeout(()=>{const e=this.previewStepNames[`${this.step}`]||"";e&&this.previewExtension(e)},100)},async getStubExtensionReleases(){try{const e="extension_builder_stub",{data:t}=await LNbits.api.request("GET",`/api/v1/extension/${e}/releases`);this.extensionStubVersions=t;const a=t.filter(e=>e.is_version_compatible);this.extensionData.stub_version=a[0]?a[0].version:""}catch(e){LNbits.utils.notifyApiError(e)}},refreshIframe(e=""){const t=this.$refs[`iframeStep${this.step}`];if(!t)return void console.warn("Extension Builder Preview iframe not loaded yet.");t.onload=()=>{const e=t.contentDocument||t.contentWindow.document;e.body.style.transform="scale(0.8)",e.body.style.transformOrigin="center top"};let a="Page"+this.extensionData.id.toLowerCase().split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("");"public_page"===e&&(a+="Public"),t.src=`/extensions/builder/preview?ext_id=${this.extensionData.id}&page=${e}&component=${a}`},initBasicData(){this.extensionData.owner_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionData.client_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionData.settings_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionDataCleanString=JSON.stringify(this.extensionData)}},created(){this.initBasicData();const e=this.$q.localStorage.getItem("lnbits.extension.builder.data");e&&(this.extensionData={...this.extensionData,...JSON.parse(e)});const t=+this.$q.localStorage.getItem("lnbits.extension.builder.step");t&&(this.step=t),this.g.user.admin&&this.getStubExtensionReleases(),setTimeout(()=>{this.refreshIframe()},1e3)}},window.PageExtensionBuilder={template:"#page-extension-builder",data:()=>({step:1,previewStepNames:{2:"settings",3:"owner_data",4:"client_data",5:"public_page"},extensionDataCleanString:"",extensionData:{id:"",name:"",stub_version:"",short_description:"",description:"",public_page:{has_public_page:!0,owner_data_fields:{name:"",description:""},client_data_fields:{public_inputs:[]},action_fields:{generate_action:!0,generate_payment_logic:!1,wallet_id:"",currency:"",amount:"",paid_flag:""}},preview_action:{is_preview_mode:!1,is_settings_preview:!1,is_owner_data_preview:!1,is_client_data_preview:!1,is_public_page_preview:!1},settings_data:{name:"Settings",enabled:!0,type:"user",fields:[]},owner_data:{name:"OwnerData",fields:[]},client_data:{enabled:!0,name:"ClientData",fields:[]}},sampleField:{name:"name",type:"str",label:"Name",hint:"",optional:!0,editable:!0,searchable:!0,sortable:!0},settingsTypes:[{label:"User Settings",value:"user"},{label:"Admin Settings",value:"admin"}],amountSource:[{label:"Client Data",value:"client_data"},{label:"Owner Data",value:"owner_data"}],extensionStubVersions:[]}),watch:{"extensionData.public_page.action_fields.amount_source":function(e,t){t&&e!==t&&(this.extensionData.public_page.action_fields.amount="")}},computed:{paymentActionAmountFields(){const e=this.extensionData.public_page.action_fields.amount_source;return e?"owner_data"===e?[""].concat(this.extensionData.owner_data.fields.filter(e=>"int"===e.type||"float"===e.type).map(e=>e.name)):"client_data"===e?[""].concat(this.extensionData.client_data.fields.filter(e=>"int"===e.type||"float"===e.type).map(e=>e.name)):void 0:[""]}},methods:{saveState(){this.$q.localStorage.set("lnbits.extension.builder.data",JSON.stringify(this.extensionData)),this.$q.localStorage.set("lnbits.extension.builder.step",this.step)},nextStep(){this.saveState(),this.$refs.stepper.next(),this.refreshPreview()},previousStep(){this.saveState(),this.$refs.stepper.previous(),this.refreshPreview()},onStepChange(){this.saveState(),this.refreshPreview()},clearAllData(){LNbits.utils.confirmDialog("Are you sure you want to clear all data? This action cannot be undone.").onOk(()=>{this.extensionData=JSON.parse(this.extensionDataCleanString),this.$q.localStorage.remove("lnbits.extension.builder.data"),this.$refs.stepper.set(1)})},exportJsonData(){!0!==Quasar.exportFile(`${this.extensionData.id||"data-export"}.json`,JSON.stringify(this.extensionData,null,2),"text/json")?Quasar.Notify.create({message:"Browser denied file download...",color:"negative",icon:null}):Quasar.Notify.create({message:"File downloaded!",color:"positive",icon:"file_download"})},onJsonDataInput(e){const t=e.target.files[0],a=new FileReader;a.onload=e=>{this.extensionData={...this.extensionData,...JSON.parse(e.target.result)},this.$refs.extensionDataInput.value=null,Quasar.Notify.create({message:"File loaded!",color:"positive",icon:"file_upload"})},a.readAsText(t)},async buildExtension(){try{const e={responseType:"blob"},t=await LNbits.api.request("POST","/api/v1/extension/builder/zip",null,this.extensionData,e),a=window.URL.createObjectURL(new Blob([t.data])),s=document.createElement("a");s.href=a,s.download=`${this.extensionData.id||"lnbits-extension"}.zip`,document.body.appendChild(s),s.click(),s.remove(),window.URL.revokeObjectURL(a)}catch(e){LNbits.utils.notifyApiError(e)}},async buildExtensionAndDeploy(){try{const{data:e}=await LNbits.api.request("POST","/api/v1/extension/builder/deploy",null,this.extensionData);Quasar.Notify.create({message:e.message||"Extension deployed!",color:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}},async cleanCacheData(){LNbits.utils.confirmDialog("Are you sure you want to clean the cache data? This action cannot be undone.","Clean Cache Data").onOk(async()=>{try{const{data:e}=await LNbits.api.request("DELETE","/api/v1/extension/builder",null,{});Quasar.Notify.create({message:e.message||"Cache data cleaned!",color:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}})},async previewExtension(e){this.saveState();try{await LNbits.api.request("POST","/api/v1/extension/builder/preview",null,{...this.extensionData,preview_action:{is_preview_mode:!!e,is_settings_preview:"settings"===e,is_owner_data_preview:"owner_data"===e,is_client_data_preview:"client_data"===e,is_public_page_preview:"public_page"===e}}),this.refreshIframe(e)}catch(e){LNbits.utils.notifyApiError(e)}},async refreshPreview(){setTimeout(()=>{const e=this.previewStepNames[`${this.step}`]||"";e&&this.previewExtension(e)},100)},async getStubExtensionReleases(){try{const e="extension_builder_stub",{data:t}=await LNbits.api.request("GET",`/api/v1/extension/${e}/releases`);this.extensionStubVersions=t;const a=t.filter(e=>e.is_version_compatible);this.extensionData.stub_version=a[0]?a[0].version:""}catch(e){LNbits.utils.notifyApiError(e)}},refreshIframe(e=""){const t=this.$refs[`iframeStep${this.step}`];if(!t)return void console.warn("Extension Builder Preview iframe not loaded yet.");t.onload=()=>{const e=t.contentDocument||t.contentWindow.document;e.body.style.transform="scale(0.8)",e.body.style.transformOrigin="center top"};let a="Page"+this.extensionData.id.toLowerCase().split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("");"public_page"===e&&(a+="Public"),t.src=`/extensions/builder/preview?ext_id=${this.extensionData.id}&page=${e}&component=${a}`},initBasicData(){this.extensionData.owner_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionData.client_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionData.settings_data.fields=[JSON.parse(JSON.stringify(this.sampleField))],this.extensionDataCleanString=JSON.stringify(this.extensionData)}},created(){this.initBasicData();const e=this.$q.localStorage.getItem("lnbits.extension.builder.data");e&&(this.extensionData={...this.extensionData,...JSON.parse(e)});const t=+this.$q.localStorage.getItem("lnbits.extension.builder.step");t&&(this.step=t),this.g.user.admin&&this.getStubExtensionReleases(),setTimeout(()=>{this.refreshIframe()},1e3)}},window.PageExtensionBuilderPreview={template:"#page-extension-builder-preview",mixins:[windowMixin],watch:{name:"reload"},data:()=>({extId:"",pageName:"",componentName:null}),methods:{async reload(){await LNbits.utils.loadTemplate(`/extensions/builder/preview/${this.extId}/template?page_name=${this.pageName}`),await LNbits.utils.loadScript(`/extensions/builder/preview/${this.extId}/component?page_name=${this.pageName}`),this._component=window[this.componentName],console.log("LNbits preview reloaded componentName:",this.componentName,!!this._component),this.$forceUpdate()}},async created(){const e=new URLSearchParams(window.location.search);this.extId=e.get("ext_id")||"",this.pageName=e.get("page")||"",this.componentName=e.get("component")||"",await this.reload()},render(){return this._component?Vue.h(this._component):Vue.h("div","Loading...")}},window.PageExtensions={template:"#page-extensions",data(){return{extbuilderEnabled:!1,slide:0,fullscreen:!1,autoplay:!0,searchTerm:"",tab:"installed",manageExtensionTab:"releases",filteredExtensions:[],updatableExtensions:[],showUninstallDialog:!1,showManageExtensionDialog:!1,showExtensionDetailsDialog:!1,showDropDbDialog:!1,showPayToEnableDialog:!1,showUpdateAllDialog:!1,dropDbExtensionId:"",selectedExtension:null,selectedImage:null,selectedExtensionDetails:null,selectedExtensionRepos:null,selectedRelease:null,uninstallAndDropDb:!1,maxStars:5,paylinkWebsocket:null,searchToggle:!1,reviewsUrl:null,reviewsDialog:{show:!1,extension:null,loading:!1,submitting:!1,form:{name:"",rating:0,comment:""},error:null},reviews:[],reviewsTable:{loading:!1,columns:[{name:"name",align:"left",label:this.$t("Name"),field:"name",sortable:!0},{name:"comment",align:"left",label:this.$t("Comment"),field:"comment"},{name:"created_at",align:"left",label:this.$t("Date"),field:"created_at"},{name:"rating",align:"right",label:"Rating",field:"rating"}],pagination:{rowsPerPage:5,sortBy:"created_at",descending:!0,page:1}},paymentDialog:{show:!1,invoice:"",hash:""}}},watch:{searchTerm(e){this.filterExtensions(e,this.tab)},tab(e){this.filterExtensions(this.searchTerm,e)}},methods:{filterExtensions(e,t){var a;this.filteredExtensions=this.extensions.filter(e=>"all"!==t||!e.isInstalled).filter(e=>"installed"!==t||e.isInstalled).filter(e=>"installed"!==t||(!!e.isActive||!!this.g.user.admin)).filter(e=>"featured"!==t||e.isFeatured).filter((a=e,function(e){return e.name.toLowerCase().includes(a.toLowerCase())||e.shortDescription?.toLowerCase().includes(a.toLowerCase())})).map(e=>({...e,details_link:e.installedRelease?.details_link||e.latestRelease?.details_link}))},async installExtension(e){this.unsubscribeFromPaylinkWs(),this.selectedExtension.inProgress=!0,this.showManageExtensionDialog=!1,e.payment_hash=e.payment_hash||this.getPaylinkHash(e.pay_link),LNbits.api.request("POST","/api/v1/extension",this.g.user.wallets[0].adminkey,{ext_id:this.selectedExtension.id,archive:e.archive,source_repo:e.source_repo,payment_hash:e.payment_hash,version:e.version}).then(t=>{this.selectedExtension.inProgress=!1;const a=this.extensions.find(e=>e.id===this.selectedExtension.id);a.isAvailable=!0,a.isInstalled=!0,a.installedRelease=e,this.toggleExtension(a),a.inProgress=!1,this.selectedExtension=a,this.extensions=this.extensions.concat([]),this.tab="installed"}).catch(e=>{console.warn(e),this.selectedExtension.inProgress=!1,LNbits.utils.notifyApiError(e)})},async uninstallExtension(){this.showManageExtensionDialog=!1,this.showUninstallDialog=!1,this.selectedExtension.inProgress=!0,LNbits.api.request("DELETE",`/api/v1/extension/${this.selectedExtension.id}`,this.g.user.wallets[0].adminkey).then(e=>{const t=this.extensions.find(e=>e.id===this.selectedExtension.id);t.isAvailable=!1,t.isInstalled=!1,t.inProgress=!1,t.installedRelease=null,this.filteredExtensions=this.filteredExtensions.filter(e=>e.id!==t.id),Quasar.Notify.create({type:"positive",message:"Extension uninstalled!"}),this.uninstallAndDropDb&&this.showDropDb()}).catch(e=>{LNbits.utils.notifyApiError(e),extension.inProgress=!1})},async dropExtensionDb(){const e=this.selectedExtension;this.showManageExtensionDialog=!1,this.showDropDbDialog=!1,this.dropDbExtensionId="",e.inProgress=!0,LNbits.api.request("DELETE",`/api/v1/extension/${e.id}/db`,this.g.user.wallets[0].adminkey).then(t=>{e.installedRelease=null,e.inProgress=!1,e.hasDatabaseTables=!1,Quasar.Notify.create({type:"positive",message:"Extension DB deleted!"})}).catch(t=>{LNbits.utils.notifyApiError(t),e.inProgress=!1})},toggleExtension(e){const t=e.isActive?"activate":"deactivate";LNbits.api.request("PUT",`/api/v1/extension/${e.id}/${t}`,this.g.user.wallets[0].adminkey).then(a=>{Quasar.Notify.create({timeout:2e3,type:"positive",message:`Extension '${e.id}' ${t}d!`})}).catch(t=>{LNbits.utils.notifyApiError(t),e.isActive=!1,e.inProgress=!1})},async enableExtensionForUser(e){e.isPaymentRequired?this.showPayToEnable(e):this.enableExtension(e)},async enableExtension(e){LNbits.api.request("PUT",`/api/v1/extension/${e.id}/enable`,this.g.user.wallets[0].adminkey).then(t=>{this.g.user.extensions=this.g.user.extensions.concat([e.id]),Quasar.Notify.create({type:"positive",message:"Extension enabled!"})}).catch(e=>{console.warn(e),LNbits.utils.notifyApiError(e)})},disableExtension(e){LNbits.api.request("PUT",`/api/v1/extension/${e.id}/disable`,this.g.user.wallets[0].adminkey).then(t=>{this.g.user.extensions=this.g.user.extensions.filter(t=>t!==e.id),Quasar.Notify.create({type:"positive",message:"Extension disabled!"})}).catch(e=>{console.warn(error),LNbits.utils.notifyApiError(e)})},showPayToEnable(e){this.selectedExtension=e,this.selectedExtension.payToEnable.paidAmount=e.payToEnable.amount,this.selectedExtension.payToEnable.showQRCode=!1,this.showPayToEnableDialog=!0},updatePayToInstallData(e){LNbits.api.request("PUT",`/api/v1/extension/${e.id}/sell`,this.g.user.wallets[0].adminkey,{required:e.payToEnable.required,amount:e.payToEnable.amount,wallet:e.payToEnable.wallet}).then(e=>{Quasar.Notify.create({type:"positive",message:"Payment info updated!"}),this.showManageExtensionDialog=!1}).catch(t=>{LNbits.utils.notifyApiError(t),e.inProgress=!1})},showUninstall(){this.showManageExtensionDialog=!1,this.showUninstallDialog=!0,this.uninstallAndDropDb=!1},showDropDb(){this.showDropDbDialog=!0},async showManageExtension(e){this.selectedExtension=e,this.selectedRelease=null,this.selectedExtensionRepos=null,this.manageExtensionTab="releases",this.showManageExtensionDialog=!0;try{const{data:t}=await LNbits.api.request("GET",`/api/v1/extension/${e.id}/releases`);this.selectedExtensionRepos=t.reduce((e,t)=>(e[t.source_repo]=e[t.source_repo]||{releases:[],isInstalled:!1,repo:t.repo},t.inProgress=!1,t.error=null,t.loaded=!1,t.isInstalled=this.isInstalledVersion(this.selectedExtension,t),t.isInstalled&&(e[t.source_repo].isInstalled=!0),t.pay_link&&(t.requiresPayment=!0,t.paidAmount=t.cost_sats,t.payment_hash=this.getPaylinkHash(t.pay_link)),e[t.source_repo].releases.push(t),e),{})}catch(t){LNbits.utils.notifyApiError(t),e.inProgress=!1}},async showExtensionDetails(e,t){if(t){this.selectedExtension=this.extensions.find(t=>t.id===e)||this.selectedExtension,this.selectedExtensionDetails=null,this.showExtensionDetailsDialog=!0,this.slide=0,this.fullscreen=!1;try{const{data:a}=await LNbits.api.request("GET",`/api/v1/extension/${e}/details?details_link=${t}`);this.selectedExtensionDetails=a,this.selectedExtensionDetails.description_md=LNbits.utils.convertMarkdown(a.description_md)}catch(e){console.warn(e)}}},async payAndInstall(e){try{this.selectedExtension.inProgress=!0,this.showManageExtensionDialog=!1;const t=await this.requestPaymentForInstall(this.selectedExtension.id,e);this.rememberPaylinkHash(e.pay_link,t.payment_hash);const a=this.g.user.wallets.find(t=>t.id===e.wallet),{data:s}=await LNbits.api.payInvoice(a,t.payment_request);e.payment_hash=s.payment_hash,await this.installExtension(e)}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}finally{this.selectedExtension.inProgress=!1}},async payAndEnable(e){try{const t=await this.requestPaymentForEnable(e.id,e.payToEnable.paidAmount),a=this.g.user.wallets.find(t=>t.id===e.payToEnable.paymentWallet),{data:s}=await LNbits.api.payInvoice(a,t.payment_request);this.enableExtension(e),this.showPayToEnableDialog=!1}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async showInstallQRCode(e){this.selectedRelease=e;try{const t=await this.requestPaymentForInstall(this.selectedExtension.id,e);this.selectedRelease.paymentRequest=t.payment_request,this.selectedRelease.payment_hash=t.payment_hash,this.selectedRelease=_.clone(this.selectedRelease),this.rememberPaylinkHash(this.selectedRelease.pay_link,this.selectedRelease.payment_hash),this.subscribeToPaylinkWs(this.selectedRelease.pay_link,t.payment_hash)}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async showEnableQRCode(e){try{e.payToEnable.showQRCode=!0,this.selectedExtension=_.clone(e);const t=await this.requestPaymentForEnable(e.id,e.payToEnable.paidAmount);e.payToEnable.paymentRequest=t.payment_request,this.selectedExtension=_.clone(e);const a=new URL(window.location);a.protocol="https:"===a.protocol?"wss":"ws",a.pathname=`/api/v1/ws/${t.payment_hash}`;const s=new WebSocket(a);s.addEventListener("message",async({data:t})=>{!1===JSON.parse(t).pending&&(Quasar.Notify.create({type:"positive",message:"Invoice Paid!"}),this.enableExtension(e),s.close())})}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async requestPaymentForInstall(e,t){const{data:a}=await LNbits.api.request("PUT",`/api/v1/extension/${e}/invoice/install`,null,{ext_id:e,archive:t.archive,source_repo:t.source_repo,cost_sats:t.paidAmount,version:t.version});return a},async requestPaymentForEnable(e,t){const{data:a}=await LNbits.api.request("PUT",`/api/v1/extension/${e}/invoice/enable`,null,{amount:t});return a},clearHangingInvoice(e){this.forgetPaylinkHash(e.pay_link),e.payment_hash=null},rememberPaylinkHash(e,t){this.$q.localStorage.set(`lnbits.extensions.paylink.${e}`,t)},getPaylinkHash(e){return this.$q.localStorage.getItem(`lnbits.extensions.paylink.${e}`)},forgetPaylinkHash(e){this.$q.localStorage.remove(`lnbits.extensions.paylink.${e}`)},subscribeToPaylinkWs(e,t){const a=new URL(`${e}/${t}`);a.protocol="https:"===a.protocol?"wss":"ws",this.paylinkWebsocket=new WebSocket(a),this.paylinkWebsocket.addEventListener("message",async({data:e})=>{JSON.parse(e).paid?(Quasar.Notify.create({type:"positive",message:"Invoice Paid!"}),this.installExtension(this.selectedRelease)):Quasar.Notify.create({type:"warning",message:"Invoice tracking lost!"})})},unsubscribeFromPaylinkWs(){try{this.paylinkWebsocket&&this.paylinkWebsocket.close()}catch(e){console.warn(e)}},hasNewVersion(e){if(e.installedRelease&&e.latestRelease)return e.installedRelease.version!==e.latestRelease.version},isInstalledVersion(e,t){if(e.installedRelease)return e.installedRelease.source_repo===t.source_repo&&e.installedRelease.version===t.version},getReleaseIcon:e=>e.is_version_compatible?e.isInstalled?"download_done":"download":"block",getReleaseIconColor:e=>e.is_version_compatible?e.isInstalled?"text-green":"":"text-red",async getGitHubReleaseDetails(e){if(!e.is_github_release||e.loaded)return;const[t,a]=e.source_repo.split("/");e.inProgress=!0;try{const{data:s}=await LNbits.api.request("GET",`/api/v1/extension/release/${t}/${a}/${e.version}`);e.loaded=!0,e.is_version_compatible=s.is_version_compatible,e.min_lnbits_version=s.min_lnbits_version,e.warning=s.warning}catch(t){console.warn(t),e.error=t,LNbits.utils.notifyApiError(t)}finally{e.inProgress=!1}},async selectAllUpdatableExtensionss(){this.updatableExtensions.forEach(e=>e.selectedForUpdate=!0)},async updateSelectedExtensions(){let e=0;for(const t of this.updatableExtensions)try{if(!t.selectedForUpdate)continue;t.inProgress=!0,await LNbits.api.request("POST","/api/v1/extension",null,{ext_id:t.id,archive:t.latestRelease.archive,source_repo:t.latestRelease.source_repo,payment_hash:t.latestRelease.payment_hash,version:t.latestRelease.version}),e++,t.isAvailable=!0,t.isInstalled=!0,t.isUpgraded=!0,t.inProgress=!1,t.installedRelease=t.latestRelease,t.isActive=!0,this.toggleExtension(t)}catch(e){console.warn(e),Quasar.Notify.create({type:"negative",message:`Failed to update ${t.id}!`})}finally{t.inProgress=!1}Quasar.Notify.create({type:e?"positive":"warning",message:`${e||"No"} extensions updated!`}),this.showUpdateAllDialog=!1},formatAvg(e){const t=Number(e||0);return Math.round(t/2/100*2)/2},async loadReviewStats(){if(this.reviewsUrl)try{const{data:e}=await LNbits.api.request("GET","/api/v1/extension/reviews/tags"),t={};e.forEach(e=>{t[e.tag]=e}),this.extensions.forEach(e=>{e.reviewStats=t[e.id]||null}),this.filterExtensions(this.searchTerm,this.tab)}catch(e){console.warn(e)}else console.info("Extension reviews are not configured")},async openReviews(e){const t=e||(this.selectedExtensionDetails?this.extensions.find(e=>e.id===this.selectedExtensionDetails.id):null);t&&(this.reviewsUrl?(this.reviewsDialog.extension=t,this.selectedExtension=e,this.reviewsDialog.show=!0,await this.getTagReviews()):Quasar.Notify.create({type:"warning",message:this.$t("reviews_url_not_configured")}))},async getTagReviews(e){if(this.reviewsUrl)try{this.reviewsTable.loading=!0;const t=LNbits.utils.prepareFilterQuery(this.reviewsTable,e),{data:a}=await LNbits.api.request("GET",`/api/v1/extension/reviews/${this.selectedExtension.id}?${t}`);this.reviews=a.data,this.reviewsTable.pagination.rowsNumber=a.total}catch(e){LNbits.utils.notifyApiError(e)}finally{this.reviewsTable.loading=!1}else Quasar.Notify.create({type:"warning",message:this.$t("reviews_url_not_configured")})},formatReviewDate(e){if(!e)return"";const t=Number(e);return Number.isNaN(t)?this.utils.formatDate(e):this.utils.formatTimestamp(t)},async submitReview(){if(this.reviewsDialog.extension&&this.reviewsUrl){this.reviewsDialog.submitting=!0;try{const e={tag:this.reviewsDialog.extension.id,name:this.reviewsDialog.form.name,rating:100*this.reviewsDialog.form.rating,comment:this.reviewsDialog.form.comment},{data:t}=await LNbits.api.request("PUT","/api/v1/extension/reviews",null,e);t.payment_request?this.openInvoiceDialog(t.payment_request,t.payment_hash):(Quasar.Notify.create({type:"positive",message:"Review submitted"}),this.resetReviewForm(),await this.getTagReviews(),await this.loadReviewStats())}catch(e){LNbits.utils.notifyApiError(e)}finally{this.reviewsDialog.submitting=!1}}},openInvoiceDialog(e,t){this.paymentDialog.invoice=e,this.paymentDialog.hash=t,this.paymentDialog.show=!0,this.listenForPayment(t)},resetReviewForm(){this.reviewsDialog.form={name:"",rating:0,comment:""},this.paymentDialog={show:!1,invoice:"",hash:""}},listenForPayment(e){try{const t=new URL(this.reviewsUrl);t.protocol="https:"===t.protocol?"wss:":"ws:",t.pathname=`/api/v1/ws/${e}`;const a=new WebSocket(t);a.addEventListener("message",async()=>{Quasar.Notify.create({type:"positive",message:this.$t("reviews_invoice_paid")}),this.paymentDialog.show=!1,this.resetReviewForm(),setTimeout(async()=>{await this.getTagReviews()},1e3),await this.loadReviewStats(),a.close()})}catch(e){console.warn(e)}},async fetchAllExtensions(){try{const{data:e}=await LNbits.api.request("GET","/api/v1/extension/all");return e}catch(e){return console.warn(e),LNbits.utils.notifyApiError(e),[]}}},async created(){this.extensions=await this.fetchAllExtensions(),this.extbuilderEnabled=this.g.user.admin||this.g.settings.extBuilder,this.reviewsUrl=this.g.settings.extensionsReviewsUrl,0===this.g.user.extensions.length&&(this.tab="all");const e=window.location.hash.replace("#",""),t=this.extensions.find(t=>t.id===e);t&&(this.searchTerm=t.id,t.isInstalled&&(this.tab="installed")),this.updatableExtensions=this.extensions.filter(e=>this.hasNewVersion(e)),await this.loadReviewStats(),this.filterExtensions(this.searchTerm,this.tab)}},window.PageFirstInstall={template:"#page-first-install",data:()=>({loginData:{isPwd:!0,isPwdRepeat:!0,username:"",password:"",passwordRepeat:"",firstInstallToken:""}}),computed:{checkPasswordsMatch(){return this.loginData.password!==this.loginData.passwordRepeat}},methods:{setPassword(){LNbits.api.request("PUT","/api/v1/auth/first_install",null,{username:this.loginData.username,password:this.loginData.password,password_repeat:this.loginData.passwordRepeat,first_install_token:this.loginData.firstInstallToken}).then(async()=>{const e=await LNbits.api.getAuthUser();this.g.user=LNbits.map.user(e.data),this.g.isPublicPage=!1,this.$router.push("/admin")}).catch(this.utils.notifyApiError)}},created(){const e=new URLSearchParams(window.location.search);this.loginData.firstInstallToken=e.get("token")||""}},window.PagePayments={template:"#page-payments",data:()=>({payments:[],dailyChartData:[],searchDate:{from:null,to:null},searchData:{wallet_id:null,payment_hash:null,memo:null,internal_memo:null},statusFilters:{success:!0,pending:!0,failed:!0,incoming:!0,outgoing:!0},chartData:{showPaymentStatus:!0,showPaymentTags:!0,showBalance:!0,showWalletsSize:!1,showBalanceInOut:!1,showPaymentCountInOut:!1},searchOptions:{status:[]},paymentsTable:{columns:[{name:"status",align:"left",label:"Status",field:"status",sortable:!1},{name:"created_at",align:"left",label:"Created At",field:"created_at",sortable:!0},{name:"amount",align:"right",label:"Amount",field:"amount",sortable:!0},{name:"amountFiat",align:"right",label:"Fiat",field:"amountFiat",sortable:!1},{name:"fee_sats",align:"left",label:"Fee",field:"fee_sats",sortable:!0},{name:"tag",align:"left",label:"Tag",field:"tag",sortable:!1},{name:"memo",align:"left",label:"Memo",field:"memo",sortable:!1,max_length:20},{name:"internal_memo",align:"left",label:"Internal Memo",field:"internal_memo",sortable:!1,max_length:20},{name:"wallet_id",align:"left",label:"Wallet (ID)",field:"wallet_id",sortable:!1},{name:"payment_hash",align:"left",label:"Payment Hash",field:"payment_hash",sortable:!1}],pagination:{sortBy:"created_at",rowsPerPage:25,page:1,descending:!0,rowsNumber:10},search:null,hideEmpty:!0,loading:!1},chartsReady:!1,showDetails:!1,paymentDetails:null,lnbitsBalance:0}),async mounted(){this.chartsReady=!0,await this.$nextTick(),this.initCharts(),await this.fetchPayments()},computed:{},methods:{async fetchPayments(e){const t=Object.entries(this.searchData).reduce((e,[t,a])=>a?(e[t]=a,e):e,{});delete t["time[ge]"],delete t["time[le]"],this.searchDate.from&&(t["time[ge]"]=this.searchDate.from+"T00:00:00"),this.searchDate.to&&(t["time[le]"]=this.searchDate.to+"T23:59:59"),this.paymentsTable.filter=t;try{const t=LNbits.utils.prepareFilterQuery(this.paymentsTable,e),{data:a}=await LNbits.api.request("GET",`/api/v1/payments/all/paginated?${t}`);this.paymentsTable.pagination.rowsNumber=a.total,this.payments=a.data.map(e=>(e.extra&&e.extra.tag&&(e.tag=e.extra.tag),e.timeFrom=moment.utc(e.created_at).local().fromNow(),e.outgoing=e.amount<0,e.amount=new Intl.NumberFormat(this.g.locale).format(e.amount/1e3)+" sats",e.extra?.wallet_fiat_amount&&(e.amountFiat=this.formatCurrency(e.extra.wallet_fiat_amount,e.extra.wallet_fiat_currency)),e.extra?.internal_memo&&(e.internal_memo=e.extra.internal_memo),e.fee_sats=new Intl.NumberFormat(this.g.locale).format(e.fee/1e3)+" sats",e))}catch(e){console.error(e),LNbits.utils.notifyApiError(e)}finally{this.updateCharts(e)}},async searchPaymentsBy(e,t){e&&(this.searchData[e]=t),await this.fetchPayments()},clearDateSeach(){this.searchDate={from:null,to:null},delete this.paymentsTable.filter["time[ge]"],delete this.paymentsTable.filter["time[le]"],this.fetchPayments()},searchByDate(){"string"==typeof this.searchDate&&(this.searchDate={from:this.searchDate,to:this.searchDate}),this.searchDate.from&&(this.paymentsTable.filter["time[ge]"]=this.searchDate.from+"T00:00:00"),this.searchDate.to&&(this.paymentsTable.filter["time[le]"]=this.searchDate.to+"T23:59:59"),this.fetchPayments()},handleFilterChanged(){const{success:e,pending:t,failed:a,incoming:s,outgoing:i}=this.statusFilters;delete this.searchData["status[ne]"],delete this.searchData["status[eq]"],e&&t&&a||(e&&t?this.searchData["status[ne]"]="failed":e&&a?this.searchData["status[ne]"]="pending":a&&t?this.searchData["status[ne]"]="success":e?this.searchData["status[eq]"]="success":t?this.searchData["status[eq]"]="pending":a&&(this.searchData["status[eq]"]="failed")),delete this.searchData["amount[ge]"],delete this.searchData["amount[le]"],s&&i||(s?this.searchData["amount[ge]"]="0":i&&(this.searchData["amount[le]"]="0")),this.fetchPayments()},showDetailsToggle(e){return this.paymentDetails=e,this.showDetails=!this.showDetails},formatCurrency(e,t){try{return LNbits.utils.formatCurrency(e,t)}catch(t){return console.error(t),`${e} ???`}},shortify:(e,t=10)=>(valueLength=(e||"").length,valueLength<=t?e:`${e.substring(0,5)}...${e.substring(valueLength-5,valueLength)}`),async updateCharts(e){let t=LNbits.utils.prepareFilterQuery(this.paymentsTable,e);try{const{data:e}=await LNbits.api.request("GET",`/api/v1/payments/stats/count?${t}&count_by=status`);e.sort((e,t)=>e.field-t.field).reverse(),this.searchOptions.status=e.map(e=>e.field),this.paymentsStatusChart.data.datasets[0].data=e.map(e=>e.total),this.paymentsStatusChart.data.labels=[...this.searchOptions.status],this.paymentsStatusChart.update()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}try{const{data:e}=await LNbits.api.request("GET",`/api/v1/payments/stats/wallets?${t}`),a=e.map(e=>e.balance/e.payments_count),s=Math.min(...a),i=Math.max(...a),n=e=>Math.floor(3+22*(e-s)/(i-s)),l=this.randomColors(20),o=e.map((e,t)=>({data:[{x:e.payments_count,y:e.balance,r:n(Math.max(e.balance/e.payments_count,5))}],label:e.wallet_name,wallet_id:e.wallet_id,backgroundColor:l[t%100],hoverOffset:4}));this.paymentsWalletsChart.data.datasets=o,this.paymentsWalletsChart.update()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}try{const{data:e}=await LNbits.api.request("GET",`/api/v1/payments/stats/count?${t}&count_by=tag`);this.searchOptions.tag=e.map(e=>e.field),this.searchOptions.status.sort(),this.paymentsTagsChart.data.datasets[0].data=e.map(e=>e.total),this.paymentsTagsChart.data.labels=e.map(e=>e.field||"core"),this.paymentsTagsChart.update()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}try{const t=Object.entries(this.searchData).reduce((e,[t,a])=>a?(e[t]=a,e):e,{}),a={...this.paymentsTable,filter:t},s=LNbits.utils.prepareFilterQuery(a,e);let{data:i}=await LNbits.api.request("GET",`/api/v1/payments/stats/daily?${s}`);const n=this.searchDate.from+"T00:00:00",l=this.searchDate.to+"T23:59:59";this.lnbitsBalance=i.length?i[i.length-1].balance:0,i=i.filter(e=>this.searchDate.from&&this.searchDate.to?e.date>=n&&e.date<=l:this.searchDate.from?e.date>=n:!this.searchDate.to||e.date<=l),this.paymentsDailyChart.data.datasets=[{label:"Balance",data:i.map(e=>e.balance),pointStyle:!1,borderWidth:2,tension:.7,fill:1},{label:"Fees",data:i.map(e=>e.fee),pointStyle:!1,borderWidth:1,tension:.4,fill:1}],this.paymentsDailyChart.data.labels=i.map(e=>e.date.substring(0,10)),this.paymentsDailyChart.update(),this.paymentsBalanceInOutChart.data.datasets=[{label:"Incoming Payments Balance",data:i.map(e=>e.balance_in)},{label:"Outgoing Payments Balance",data:i.map(e=>e.balance_out)}],this.paymentsBalanceInOutChart.data.labels=i.map(e=>e.date.substring(0,10)),this.paymentsBalanceInOutChart.update(),this.paymentsCountInOutChart.data.datasets=[{label:"Incoming Payments Count",data:i.map(e=>e.count_in)},{label:"Outgoing Payments Count",data:i.map(e=>-e.count_out)}],this.paymentsCountInOutChart.data.labels=i.map(e=>e.date.substring(0,10)),this.paymentsCountInOutChart.update()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async initCharts(){const e=this.$q.localStorage.getItem("lnbits.payments.chartData")||{};this.chartData={...this.chartData,...e},this.chartsReady?(this.paymentsStatusChart=new Chart(this.$refs.paymentsStatusChart.getContext("2d"),{type:"doughnut",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1}},onClick:(e,t,a)=>{if(t[0]){const e=t[0].index;this.searchPaymentsBy("status",a.data.labels[e])}}},data:{datasets:[{label:"",data:[],backgroundColor:["rgb(0, 205, 86)","rgb(64, 72, 78)","rgb(255, 99, 132)"],hoverOffset:4}]}}),this.paymentsWalletsChart=new Chart(this.$refs.paymentsWalletsChart.getContext("2d"),{type:"bubble",options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},title:{display:!1}},onClick:(e,t,a)=>{if(t[0]){const e=t[0].datasetIndex;this.searchPaymentsBy("wallet_id",a.data.datasets[e].wallet_id)}}},data:{datasets:[{label:"",data:[],backgroundColor:this.randomColors(20),hoverOffset:4}]}}),this.paymentsTagsChart=new Chart(this.$refs.paymentsTagsChart.getContext("2d"),{type:"pie",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1},legend:{display:!1,title:{display:!1,text:"Tags"}}},onClick:(e,t,a)=>{if(t[0]){const e=t[0].index;this.searchPaymentsBy("tag",a.data.labels[e])}}},data:{datasets:[{label:"",data:[],backgroundColor:this.randomColors(10),hoverOffset:4}]}}),this.paymentsDailyChart=new Chart(this.$refs.paymentsDailyChart.getContext("2d"),{type:"line",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1},legend:{display:!0,title:{display:!1,text:"Tags"}}}},data:{datasets:[{label:"",data:[],backgroundColor:this.randomColors(10),hoverOffset:4}]}}),this.paymentsBalanceInOutChart=new Chart(this.$refs.paymentsBalanceInOutChart.getContext("2d"),{type:"bar",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1},legend:{display:!0,title:{display:!1,text:"Tags"}}},scales:{x:{stacked:!0},y:{stacked:!0}}},data:{datasets:[{label:"",data:[],backgroundColor:this.randomColors(50),hoverOffset:4}]}}),this.paymentsCountInOutChart=new Chart(this.$refs.paymentsCountInOutChart.getContext("2d"),{type:"bar",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1},legend:{display:!0,title:{display:!1,text:""}}},scales:{x:{stacked:!0},y:{stacked:!0}}},data:{datasets:[{label:"",data:[],backgroundColor:this.randomColors(80),hoverOffset:4}]}})):console.warn("Charts are not ready yet. Initialization delayed.")},saveChartsPreferences(){this.$q.localStorage.set("lnbits.payments.chartData",this.chartData)},randomColors(e=1){const t=[];for(let a=1;a<=10;a++)for(let s=1;s<=10;s++)t.push(`rgb(${s*e*33%200}, ${71*(a+s+e)%255}, ${(a+30*e)%255})`);return t}}},window.PageNode={template:"#page-node",config:{globalProperties:{LNbits:LNbits,msg:"hello"}},data(){return{isSuperUser:!1,wallet:{},tab:"dashboard",payments:1e3,info:{},channel_stats:{},channels:{data:[],filter:""},activeBalance:{},ranks:{},peers:{data:[],filter:""},connectPeerDialog:{show:!1,data:{}},setFeeDialog:{show:!1,data:{fee_ppm:0,fee_base_msat:0}},openChannelDialog:{show:!1,data:{}},closeChannelDialog:{show:!1,data:{}},nodeInfoDialog:{show:!1,data:{}},transactionDetailsDialog:{show:!1,data:{}},states:[{label:"Active",value:"active",color:"green"},{label:"Pending",value:"pending",color:"orange"},{label:"Inactive",value:"inactive",color:"grey"},{label:"Closed",value:"closed",color:"red"}],stateFilters:[{label:"Active",value:"active"},{label:"Pending",value:"pending"}],paymentsTable:{data:[],columns:[{name:"pending",label:""},{name:"date",align:"left",label:this.$t("date"),field:"date",sortable:!0},{name:"sat",align:"right",label:this.$t("amount"),field:e=>this.formatMsat(e.amount),sortable:!0},{name:"fee",align:"right",label:this.$t("fee"),field:"fee"},{name:"destination",align:"right",label:"Destination",field:"destination"},{name:"memo",align:"left",label:this.$t("memo"),field:"memo"}],pagination:{rowsPerPage:10,page:1,rowsNumber:10},filter:null},invoiceTable:{data:[],columns:[{name:"pending",label:""},{name:"paid_at",field:"paid_at",align:"left",label:"Paid at",sortable:!0},{name:"expiry",label:this.$t("expiry"),field:"expiry",align:"left",sortable:!0},{name:"amount",label:this.$t("amount"),field:e=>this.formatMsat(e.amount),sortable:!0},{name:"memo",align:"left",label:this.$t("memo"),field:"memo"}],pagination:{rowsPerPage:10,page:1,rowsNumber:10},filter:null}}},created(){this.getInfo(),this.get1MLStats()},watch:{tab(e){"transactions"!==e||this.paymentsTable.data.length?"channels"!==e||this.channels.data.length||(this.getChannels(),this.getPeers()):(this.getPayments(),this.getInvoices())}},computed:{checkChanges(){return!_.isEqual(this.settings,this.formData)},filteredChannels(){return this.stateFilters?this.channels.data.filter(e=>this.stateFilters.find(({value:t})=>t==e.state)):this.channels.data},totalBalance(){return this.filteredChannels.reduce((e,t)=>(e.local_msat+=t.balance.local_msat,e.remote_msat+=t.balance.remote_msat,e.total_msat+=t.balance.total_msat,e),{local_msat:0,remote_msat:0,total_msat:0})}},methods:{formatMsat:e=>LNbits.utils.formatMsat(e),nodeApi(e,t,a){const s=new URLSearchParams(a?.query);return LNbits.api.request(e,`/node/api/v1${t}?${s}`,{},a?.data).catch(e=>{LNbits.utils.notifyApiError(e)})},getChannel(e){return this.nodeApi("GET",`/channels/${e}`).then(e=>{this.setFeeDialog.data.fee_ppm=e.data.fee_ppm,this.setFeeDialog.data.fee_base_msat=e.data.fee_base_msat})},getChannels(){return this.nodeApi("GET","/channels").then(e=>{this.channels.data=e.data})},getInfo(){return this.nodeApi("GET","/info").then(e=>{this.info=e.data,this.channel_stats=e.data.channel_stats}).catch(()=>{this.info={},this.channel_stats={}})},get1MLStats(){return this.nodeApi("GET","/rank").then(e=>{this.ranks=e.data}).catch(()=>{this.ranks={}})},getPayments(e){e&&(this.paymentsTable.pagination=e.pagination);let t=this.paymentsTable.pagination;const a={limit:t.rowsPerPage,offset:(t.page-1)*t.rowsPerPage??0};return this.nodeApi("GET","/payments",{query:a}).then(e=>{this.paymentsTable.data=e.data.data,this.paymentsTable.pagination.rowsNumber=e.data.total})},getInvoices(e){e&&(this.invoiceTable.pagination=e.pagination);let t=this.invoiceTable.pagination;const a={limit:t.rowsPerPage,offset:(t.page-1)*t.rowsPerPage??0};return this.nodeApi("GET","/invoices",{query:a}).then(e=>{this.invoiceTable.data=e.data.data,this.invoiceTable.pagination.rowsNumber=e.data.total})},getPeers(){return this.nodeApi("GET","/peers").then(e=>{this.peers.data=e.data})},connectPeer(){this.nodeApi("POST","/peers",{data:this.connectPeerDialog.data}).then(()=>{this.connectPeerDialog.show=!1,this.getPeers()})},disconnectPeer(e){LNbits.utils.confirmDialog("Do you really wanna disconnect this peer?").onOk(()=>{this.nodeApi("DELETE",`/peers/${e}`).then(e=>{Quasar.Notify.create({message:"Disconnected",icon:null}),this.needsRestart=!0,this.getPeers()})})},setChannelFee(e){this.nodeApi("PUT",`/channels/${e}`,{data:this.setFeeDialog.data}).then(e=>{this.setFeeDialog.show=!1,this.getChannels()}).catch(LNbits.utils.notifyApiError)},openChannel(){this.nodeApi("POST","/channels",{data:this.openChannelDialog.data}).then(e=>{this.openChannelDialog.show=!1,this.getChannels()}).catch(e=>{console.log(e)})},showCloseChannelDialog(e){this.closeChannelDialog.show=!0,this.closeChannelDialog.data={force:!1,short_id:e.short_id,...e.point}},closeChannel(){this.nodeApi("DELETE","/channels",{query:this.closeChannelDialog.data}).then(e=>{this.closeChannelDialog.show=!1,this.getChannels()})},showSetFeeDialog(e){this.setFeeDialog.show=!0,this.setFeeDialog.channel_id=e,this.getChannel(e)},showOpenChannelDialog(e){this.openChannelDialog.show=!0,this.openChannelDialog.data={peer_id:e,funding_amount:0}},showNodeInfoDialog(e){this.nodeInfoDialog.show=!0,this.nodeInfoDialog.data=e},showTransactionDetailsDialog(e){this.transactionDetailsDialog.show=!0,this.transactionDetailsDialog.data=e},shortenNodeId:e=>e?e.substring(0,5)+"..."+e.substring(e.length-5):"..."}},window.PageNodePublic={template:"#page-node-public",data:()=>({enabled:!1,isSuperUser:!1,wallet:{},tab:"dashboard",payments:1e3,info:{},channel_stats:{},channels:[],activeBalance:{},ranks:{},peers:[],connectPeerDialog:{show:!1,data:{}},openChannelDialog:{show:!1,data:{}},closeChannelDialog:{show:!1,data:{}},nodeInfoDialog:{show:!1,data:{}},states:[{label:"Active",value:"active",color:"green"},{label:"Pending",value:"pending",color:"orange"},{label:"Inactive",value:"inactive",color:"grey"},{label:"Closed",value:"closed",color:"red"}]}),created(){this.getInfo(),this.get1MLStats()},methods:{formatMsat:e=>LNbits.utils.formatMsat(e),api:(e,t,a)=>LNbits.api.request(e,"/node/public/api/v1"+t,{},a),getInfo(){this.api("GET","/info",{}).then(e=>{this.info=e.data,this.channel_stats=e.data.channel_stats,this.enabled=!0}).catch(()=>{this.info={},this.channel_stats={}})},get1MLStats(){this.api("GET","/rank",{}).then(e=>{this.ranks=e.data}).catch(()=>{this.ranks={}})}}},window.PageAudit={template:"#page-audit",data:()=>({chartsReady:!1,auditEntries:[],searchData:{user_id:"",ip_address:"",request_type:"",component:"",request_method:"",response_code:"",path:""},searchOptions:{component:[],request_method:[],response_code:[]},auditTable:{columns:[{name:"created_at",align:"center",label:"Date",field:"created_at",sortable:!0},{name:"duration",align:"left",label:"Duration (sec)",field:"duration",sortable:!0},{name:"component",align:"left",label:"Component",field:"component",sortable:!1},{name:"request_method",align:"left",label:"Method",field:"request_method",sortable:!1},{name:"response_code",align:"left",label:"Code",field:"response_code",sortable:!1},{name:"user_id",align:"left",label:"User Id",field:"user_id",sortable:!1},{name:"ip_address",align:"left",label:"IP Address",field:"ip_address",sortable:!1},{name:"path",align:"left",label:"Path",field:"path",sortable:!1}],pagination:{sortBy:"created_at",rowsPerPage:10,page:1,descending:!0,rowsNumber:10},search:null,hideEmpty:!0,loading:!1},auditDetailsDialog:{data:null,show:!1}}),async created(){},async mounted(){this.chartsReady=!0,await this.$nextTick(),this.initCharts(),await this.fetchAudit()},methods:{async fetchAudit(e){try{const t=LNbits.utils.prepareFilterQuery(this.auditTable,e),{data:a}=await LNbits.api.request("GET",`/audit/api/v1?${t}`);this.auditTable.pagination.rowsNumber=a.total,this.auditEntries=a.data,await this.fetchAuditStats(e)}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}finally{this.auditTable.loading=!1}},async fetchAuditStats(e){try{const t=LNbits.utils.prepareFilterQuery(this.auditTable,e),{data:a}=await LNbits.api.request("GET",`/audit/api/v1/stats?${t}`),s=a.request_method.map(e=>e.field);this.searchOptions.request_method=[...new Set(this.searchOptions.request_method.concat(s))],this.requestMethodChart.data.labels=s,this.requestMethodChart.data.datasets[0].data=a.request_method.map(e=>e.total),this.requestMethodChart.update();const i=a.response_code.map(e=>e.field);this.searchOptions.response_code=[...new Set(this.searchOptions.response_code.concat(i))],this.responseCodeChart.data.labels=i,this.responseCodeChart.data.datasets[0].data=a.response_code.map(e=>e.total),this.responseCodeChart.update();const n=a.component.map(e=>e.field);this.searchOptions.component=[...new Set(this.searchOptions.component.concat(n))],this.componentUseChart.data.labels=n,this.componentUseChart.data.datasets[0].data=a.component.map(e=>e.total),this.componentUseChart.update(),this.longDurationChart.data.labels=a.long_duration.map(e=>e.field),this.longDurationChart.data.datasets[0].data=a.long_duration.map(e=>e.total),this.longDurationChart.update()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async searchAuditBy(e,t){e&&(this.searchData[e]=t),this.auditTable.filter=Object.entries(this.searchData).reduce((e,[t,a])=>a?(e[t]=a,e):e,{}),await this.fetchAudit()},showDetailsDialog(e){const t=JSON.parse(e?.request_details||"");try{t.body&&(t.body=JSON.parse(t.body))}catch(e){}this.auditDetailsDialog.data=JSON.stringify(t,null,4),this.auditDetailsDialog.show=!0},shortify:e=>(valueLength=(e||"").length,valueLength<=10?e:`${e.substring(0,5)}...${e.substring(valueLength-5,valueLength)}`),async initCharts(){this.chartsReady?(this.responseCodeChart=new Chart(this.$refs.responseCodeChart.getContext("2d"),{type:"doughnut",options:{responsive:!0,plugins:{legend:{position:"bottom"},title:{display:!1,text:"HTTP Response Codes"}},onClick:(e,t,a)=>{if(t[0]){const e=t[0].index;this.searchAuditBy("response_code",a.data.labels[e])}}},data:{datasets:[{label:"",data:[20,10],backgroundColor:["rgb(100, 99, 200)","rgb(54, 162, 235)","rgb(255, 205, 86)","rgb(255, 5, 86)","rgb(25, 205, 86)","rgb(255, 205, 250)"]}],labels:[]}}),this.requestMethodChart=new Chart(this.$refs.requestMethodChart.getContext("2d"),{type:"bar",options:{responsive:!0,maintainAspectRatio:!1,plugins:{title:{display:!1}},onClick:(e,t,a)=>{if(t[0]){const e=t[0].index;this.searchAuditBy("request_method",a.data.labels[e])}}},data:{datasets:[{label:"",data:[],backgroundColor:["rgb(255, 99, 132)","rgb(54, 162, 235)","rgb(255, 205, 86)","rgb(255, 5, 86)","rgb(25, 205, 86)","rgb(255, 205, 250)"],hoverOffset:4}]}}),this.componentUseChart=new Chart(this.$refs.componentUseChart.getContext("2d"),{type:"pie",options:{responsive:!0,plugins:{legend:{position:"xxx"},title:{display:!1,text:"Components"}},onClick:(e,t,a)=>{if(t[0]){const e=t[0].index;this.searchAuditBy("component",a.data.labels[e])}}},data:{datasets:[{data:[],backgroundColor:["rgb(255, 99, 132)","rgb(54, 162, 235)","rgb(255, 205, 86)","rgb(255, 5, 86)","rgb(25, 205, 86)","rgb(255, 205, 250)","rgb(100, 205, 250)","rgb(120, 205, 250)","rgb(140, 205, 250)","rgb(160, 205, 250)"],hoverOffset:4}]}}),this.longDurationChart=new Chart(this.$refs.longDurationChart.getContext("2d"),{type:"bar",options:{responsive:!0,indexAxis:"y",maintainAspectRatio:!1,plugins:{legend:{title:{display:!1,text:"Long Duration"}}},onClick:(e,t,a)=>{if(t[0]){const e=t[0].index;this.searchAuditBy("path",a.data.labels[e])}}},data:{datasets:[{label:"",data:[],backgroundColor:["rgb(255, 99, 132)","rgb(54, 162, 235)","rgb(255, 205, 86)","rgb(255, 5, 86)","rgb(25, 205, 86)","rgb(255, 205, 250)","rgb(100, 205, 250)","rgb(120, 205, 250)","rgb(140, 205, 250)","rgb(160, 205, 250)"],hoverOffset:4}]}})):console.warn("Charts are not ready yet. Initialization delayed.")}}},window.PageWallet={template:"#page-wallet",data:()=>({parse:{show:!1,invoice:null,lnurlpay:null,lnurlauth:null,data:{request:"",amount:0,comment:"",internalMemo:null,unit:"sat"},paymentChecker:null,copy:{show:!1},camera:{show:!1,camera:"auto"}},receive:{show:!1,status:"pending",paymentReq:null,paymentHash:null,amountMsat:null,minMax:[0,21e14],lnurl:null,units:[],unit:"sat",fiatProvider:"",data:{amount:null,memo:"",internalMemo:null,payment_hash:null}},update:{name:null,currency:null},hasNfc:!1,nfcReaderAbortController:null,formattedFiatAmount:0,paymentFilter:{"status[ne]":"failed"},chartConfig:Quasar.LocalStorage.getItem("lnbits.wallets.chartConfig")||{showPaymentInOutChart:!0,showBalanceChart:!0,showBalanceInOutChart:!0}}),computed:{canPay(){return!!this.parse.invoice&&(this.parse.invoice.expired?(Quasar.Notify.create({message:"Invoice has expired",color:"negative"}),!1):this.parse.invoice.sat<=this.g.wallet.sat)},formattedAmount(){return"sat"==this.receive.unit&&this.g.isSatsDenomination?LNbits.utils.formatMsat(this.receive.amountMsat)+" sat":LNbits.utils.formatCurrency(Number(this.receive.data.amount).toFixed(2),this.g.isSatsDenomination?this.receive.unit:this.g.denomination)},formattedSatAmount(){return LNbits.utils.formatMsat(this.receive.amountMsat)+" sat"}},methods:{handleSendLnurl(e){this.parse.data.request=e,this.parse.show=!0,this.lnurlScan()},msatoshiFormat:e=>LNbits.utils.formatSat(e/1e3),showReceiveDialog(){this.receive.show=!0,this.receive.status="pending",this.receive.paymentReq=null,this.receive.paymentHash=null,this.receive.data.amount=null,this.receive.data.memo=null,this.receive.data.internalMemo=null,this.receive.data.payment_hash=null,this.receive.units=["sat",...this.g.allowedCurrencies.length>0?this.g.allowedCurrencies:this.g.currencies],this.receive.unit=this.g.isFiatPriority&&this.g.wallet.currency||"sat",this.receive.minMax=[0,21e14],this.receive.lnurl=null},onReceiveDialogHide(){this.hasNfc&&this.nfcReaderAbortController.abort()},showParseDialog(){this.parse.show=!0,this.parse.invoice=null,this.parse.lnurlpay=null,this.parse.lnurlauth=null,this.parse.copy.show=window.isSecureContext&&void 0!==navigator.clipboard?.readText,this.parse.data.request="",this.parse.data.comment="",this.parse.data.internalMemo=null,this.parse.data.paymentChecker=null,this.parse.camera.show=!1},closeParseDialog(){setTimeout(()=>{clearInterval(this.parse.paymentChecker)},1e4)},handleBalanceUpdate(e){this.g.wallet.sat=this.g.wallet.sat+e},createInvoice(){this.receive.status="loading",this.g.isSatsDenomination||(this.receive.data.amount=100*this.receive.data.amount),LNbits.api.createInvoice(this.g.wallet,this.receive.data.amount,this.receive.data.memo,this.receive.unit,this.receive.lnurlWithdraw,this.receive.fiatProvider,this.receive.data.internalMemo,this.receive.data.payment_hash).then(e=>{if(this.g.updatePayments=!this.g.updatePayments,this.receive.status="success",this.receive.paymentReq=e.data.bolt11,this.receive.fiatPaymentReq=e.data.extra?.fiat_payment_request,this.receive.amountMsat=e.data.amount,this.receive.paymentHash=e.data.payment_hash,this.receive.lnurl||this.readNfcTag(),this.receive.lnurl&&null!==e.data.extra?.lnurl_response){!1===e.data.extra.lnurl_response&&(e.data.extra.lnurl_response="Unable to connect");const t=this.receive.lnurl.callback.split("/")[2];if("string"==typeof e.data.extra.lnurl_response)return void Quasar.Notify.create({timeout:5e3,type:"warning",message:`${t} lnurl-withdraw call failed.`,caption:e.data.extra.lnurl_response});!0===e.data.extra.lnurl_response&&Quasar.Notify.create({timeout:3e3,message:`Invoice sent to ${t}!`,spinner:!0})}}).catch(e=>{LNbits.utils.notifyApiError(e),this.receive.status="pending"})},lnurlScan(){LNbits.api.request("POST","/api/v1/lnurlscan",this.g.wallet.adminkey,{lnurl:this.parse.data.request}).then(e=>{const t=e.data;if("ERROR"!==t.status){if("payRequest"===t.tag)this.parse.lnurlpay=Object.freeze(t),this.parse.data.amount=t.minSendable/1e3;else if("login"===t.tag)this.parse.lnurlauth=Object.freeze(t);else if("withdrawRequest"===t.tag){this.parse.show=!1,this.receive.show=!0,this.receive.lnurlWithdraw=Object.freeze(t),this.receive.status="pending",this.receive.paymentReq=null,this.receive.paymentHash=null,this.receive.data.amount=t.maxWithdrawable/1e3,this.receive.data.memo=t.defaultDescription,this.receive.minMax=[t.minWithdrawable/1e3,t.maxWithdrawable/1e3];const e=t.callback.split("/")[2];this.receive.lnurl={domain:e,callback:t.callback,fixed:t.fixed}}}else Quasar.Notify.create({timeout:5e3,type:"warning",message:"lnurl scan failed.",caption:t.reason})}).catch(e=>{LNbits.utils.notifyApiError(e)})},decodeQR(e){this.parse.data.request=e,this.decodeRequest(),this.parse.camera.show=!1},isLnurl:e=>e.toLowerCase().startsWith("lnurl1")||e.startsWith("lnurlp://")||e.startsWith("lnurlw://")||e.startsWith("lnurlauth://")||e.match(/[\w.+-~_]+@[\w.+-~_]/),decodeRequest(){this.parse.show=!0,this.parse.data.request=this.parse.data.request.trim();const e=this.parse.data.request.toLowerCase();if(e.startsWith("lightning:")?this.parse.data.request=this.parse.data.request.slice(10):e.startsWith("lnurl:")?this.parse.data.request=this.parse.data.request.slice(6):e.includes("lightning=lnurl1")&&(this.parse.data.request=this.parse.data.request.split("lightning=")[1].split("&")[0]),this.isLnurl(this.parse.data.request))return void this.lnurlScan();let t;this.parse.data.request.toLowerCase().includes("lightning")&&(this.parse.data.request=this.parse.data.request.split("lightning=")[1],this.parse.data.request.includes("&")&&(this.parse.data.request=this.parse.data.request.split("&")[0]));try{t=decode(this.parse.data.request)}catch(e){return Quasar.Notify.create({timeout:3e3,type:"warning",message:e+".",caption:"400 BAD REQUEST"}),void(this.parse.show=!1)}let a={msat:t.human_readable_part.amount,sat:t.human_readable_part.amount/1e3,fsat:LNbits.utils.formatSat(t.human_readable_part.amount/1e3),bolt11:this.parse.data.request};_.each(t.data.tags,e=>{if(_.isObject(e)&&_.has(e,"description"))if("payment_hash"===e.description)a.hash=e.value;else if("description"===e.description)a.description=e.value;else if("expiry"===e.description){const s=new Date(1e3*(t.data.time_stamp+e.value)),i=new Date(1e3*t.data.time_stamp);a.expireDate=Quasar.date.formatDate(s,"YYYY-MM-DDTHH:mm:ss.SSSZ"),a.createdDate=Quasar.date.formatDate(i,"YYYY-MM-DDTHH:mm:ss.SSSZ"),a.expireDateFrom=moment.utc(s).local().fromNow(),a.createdDateFrom=moment.utc(i).local().fromNow(),a.expired=!1}}),this.g.wallet.currency&&(a.fiatAmount=LNbits.utils.formatCurrency((a.sat/1e8*this.g.exchangeRate).toFixed(2),this.g.wallet.currency)),this.parse.invoice=Object.freeze(a)},payInvoice(){const e=Quasar.Notify.create({timeout:0,message:this.$t("payment_processing")});LNbits.api.payInvoice(this.g.wallet,this.parse.data.request,this.parse.data.internalMemo).then(t=>{e(),this.g.updatePayments=!this.g.updatePayments,this.parse.show=!1,"success"==t.data.status&&Quasar.Notify.create({type:"positive",message:this.$t("payment_successful")}),"pending"==t.data.status&&Quasar.Notify.create({type:"info",message:this.$t("payment_pending")})}).catch(t=>{e(),LNbits.utils.notifyApiError(t),this.g.updatePayments=!this.g.updatePayments,this.parse.show=!1})},payLnurl(){LNbits.api.request("post","/api/v1/payments/lnurl",this.g.wallet.adminkey,{res:this.parse.lnurlpay,lnurl:this.parse.data.request,unit:this.parse.data.unit,amount:1e3*this.parse.data.amount,comment:this.parse.data.comment,internalMemo:this.parse.data.internalMemo}).then(e=>{if(this.parse.show=!1,e.data.extra.success_action){const t=JSON.parse(e.data.extra.success_action);switch(t.tag){case"url":Quasar.Notify.create({message:`${t.url}`,caption:t.description,html:!0,type:"positive",timeout:0,closeBtn:!0});break;case"message":Quasar.Notify.create({message:t.message,type:"positive",timeout:0,closeBtn:!0});break;case"aes":this.utils.decryptLnurlPayAES(t,e.data.preimage),Quasar.Notify.create({message:value,caption:extra.success_action.description,html:!0,type:"positive",timeout:0,closeBtn:!0})}}}).catch(LNbits.utils.notifyApiError)},authLnurl(){const e=Quasar.Notify.create({timeout:10,message:"Performing authentication..."});LNbits.api.request("post","/api/v1/lnurlauth",wallet.adminkey,this.parse.lnurlauth).then(t=>{e(),Quasar.Notify.create({message:"Authentication successful.",type:"positive",timeout:3500}),this.parse.show=!1}).catch(e=>{e.response.data.reason?Quasar.Notify.create({message:`Authentication failed. ${this.parse.lnurlauth.callback} says:`,caption:e.response.data.reason,type:"warning",timeout:5e3}):LNbits.utils.notifyApiError(e)})},updateWallet(e){LNbits.api.request("PATCH","/api/v1/wallet",this.g.wallet.adminkey,e).then(e=>{this.g.wallet={...this.g.wallet,...e.data};const t=this.g.user.wallets.findIndex(t=>t.id===e.data.id);-1!==t&&(this.g.user.wallets[t]={...this.g.user.wallets[t],...e.data}),Quasar.Notify.create({message:"Wallet updated.",type:"positive",timeout:3500})}).catch(e=>{LNbits.utils.notifyApiError(e)})},pasteToTextArea(){this.$refs.textArea.focus(),navigator.clipboard.readText().then(e=>{this.parse.data.request=e.trim()})},readNfcTag(){try{if("undefined"==typeof NDEFReader)return void console.debug("NFC not supported on this device or browser.");const e=new NDEFReader;this.nfcReaderAbortController=new AbortController,this.nfcReaderAbortController.signal.onabort=e=>{console.debug("All NFC Read operations have been aborted.")},this.hasNfc=!0;const t=Quasar.Notify.create({message:"Tap your NFC tag to pay this invoice with LNURLw."});return e.scan({signal:this.nfcReaderAbortController.signal}).then(()=>{e.onreadingerror=()=>{Quasar.Notify.create({type:"negative",message:"There was an error reading this NFC tag."})},e.onreading=({message:e})=>{const a=new TextDecoder("utf-8"),s=e.records.find(e=>-1!==a.decode(e.data).toUpperCase().indexOf("LNURLW"));if(s){t(),Quasar.Notify.create({type:"positive",message:"NFC tag read successfully."});const e=a.decode(s.data);this.payInvoiceWithNfc(e)}else Quasar.Notify.create({type:"warning",message:"NFC tag does not have LNURLw record."})}})}catch(e){Quasar.Notify.create({type:"negative",message:e?e.toString():"An unexpected error has occurred."})}},payInvoiceWithNfc(e){const t=Quasar.Notify.create({timeout:0,spinner:!0,message:this.$t("processing_payment")});LNbits.api.request("POST",`/api/v1/payments/${this.receive.paymentReq}/pay-with-nfc`,this.g.wallet.adminkey,{lnurl_w:e}).then(e=>{t(),e.data.success?Quasar.Notify.create({type:"positive",message:"Payment successful"}):Quasar.Notify.create({type:"negative",message:e.data.detail||"Payment failed"})}).catch(e=>{t(),LNbits.utils.notifyApiError(e)})}},created(){const e=new URLSearchParams(window.location.search);(e.has("lightning")||e.has("lnurl"))&&(this.parse.data.request=e.get("lightning")||e.get("lnurl"),this.decodeRequest(),this.parse.show=!0);const t=this.g.user.wallets.find(e=>e.id===this.$route.params.id);t?(this.g.wallet=t,this.g.lastActiveWallet=t.id,this.$q.localStorage.setItem("lnbits.lastActiveWallet",t.id),this.$router.replace(`/wallet/${t.id}`)):(this.g.errorCode=404,this.g.errorMessage="Wallet not found.",this.$router.push("/error"))},watch:{"g.updatePaymentsHash"(){this.receive.show=!1},"g.updatePayments"(){this.parse.show=!1,this.g.wallet.currency&&this.$q.localStorage.getItem("lnbits.exchangeRate."+this.g.wallet.currency)&&(this.g.exchangeRate=this.$q.localStorage.getItem("lnbits.exchangeRate."+this.g.wallet.currency),this.g.fiatBalance=this.g.exchangeRate/1e8*this.g.wallet.sat)},"g.wallet"(){this.g.wallet.currency?(this.g.fiatTracking=!0,this.g.fiatBalance=this.g.exchangeRate/1e8*this.g.wallet.sat):(this.g.fiatBalance=0,this.g.fiatTracking=!1)},"g.isFiatPriority"(){this.receive.unit=this.g.isFiatPriority?this.g.wallet.currency:"sat"},"g.fiatBalance"(){this.formattedFiatAmount=LNbits.utils.formatCurrency(this.g.fiatBalance.toFixed(2),this.g.wallet.currency)},"g.exchangeRate"(){this.g.fiatTracking&&this.g.wallet.currency&&(this.g.fiatBalance=this.g.exchangeRate/1e8*this.g.wallet.sat)}}},window.PageWallets={template:"#page-wallets",data:()=>({user:null,tab:"wallets",wallets:[],addWalletDialog:{show:!1},walletsTable:{columns:[{name:"name",align:"left",label:"Name",field:"name",sortable:!0},{name:"currency",align:"center",label:"Currency",field:"currency",sortable:!0},{name:"updated_at",align:"right",label:"Last Updated",field:"updated_at",sortable:!0}],pagination:{sortBy:"updated_at",rowsPerPage:12,page:1,descending:!0,rowsNumber:10},search:"",hideEmpty:!0,loading:!1}}),watch:{"walletsTable.search":{handler(){const e={};this.walletsTable.search&&(e.search=this.walletsTable.search),this.getUserWallets()}}},methods:{async getUserWallets(e){try{this.walletsTable.loading=!0;const t=LNbits.utils.prepareFilterQuery(this.walletsTable,e),{data:a}=await LNbits.api.request("GET",`/api/v1/wallet/paginated?${t}`,null);this.wallets=a.data,this.walletsTable.pagination.rowsNumber=a.total}catch(e){LNbits.utils.notifyApiError(e)}finally{this.walletsTable.loading=!1}},goToWallet(e){this.$router.push({path:"/wallet",query:{wal:e}})},formattedFiatAmount:(e,t)=>LNbits.utils.formatCurrency(Number(e).toFixed(2),t),formattedSatAmount:e=>LNbits.utils.formatMsat(e)+" sat"},async created(){await this.getUserWallets()}},window.PageUsers={template:"#page-users",data(){return{paymentsWallet:{},cancel:{},users:[],wallets:[],searchData:{user:"",username:"",email:"",pubkey:""},paymentPage:{show:!1},activeWallet:{userId:null,show:!1},activeUser:{data:null,showUserId:!1,show:!1},createWalletDialog:{data:{},show:!1},walletTable:{columns:[{name:"name",align:"left",label:"Name",field:"name"},{name:"id",align:"left",label:"Wallet Id",field:"id"},{name:"currency",align:"left",label:"Currency",field:"currency"},{name:"balance_msat",align:"left",label:"Balance",field:"balance_msat"}],pagination:{sortBy:"name",rowsPerPage:10,page:1,descending:!0,rowsNumber:10},search:null,hideEmpty:!0,loading:!1},usersTable:{columns:[{name:"activated",align:"left",label:this.$t("activated"),field:"activated",sortable:!1},{name:"wallet_id",align:"left",label:"Wallets",field:"wallet_id",sortable:!1},{name:"id",align:"left",label:"User Id",field:"id",sortable:!1},{name:"username",align:"left",label:"Username",field:"username",sortable:!1},{name:"email",align:"left",label:"Email",field:"email",sortable:!1},{name:"pubkey",align:"left",label:"Public Key",field:"pubkey",sortable:!1},{name:"balance_msat",align:"left",label:"Balance",field:"balance_msat",sortable:!1},{name:"transaction_count",align:"left",label:"Payments",field:"transaction_count",sortable:!1},{name:"last_payment",align:"left",label:"Last Payment",field:"last_payment",sortable:!1}],pagination:{sortBy:"created_at",rowsPerPage:10,page:1,descending:!0,rowsNumber:10},sortFields:[{name:"id",label:"User ID"},{name:"username",label:"Username"},{name:"email",label:"Email"},{name:"pubkey",label:"Public Key"},{name:"created_at",label:"Creation Date"},{name:"updated_at",label:"Last Updated"}],search:null,hideEmpty:!0,loading:!1}}},watch:{"usersTable.hideEmpty":function(e,t){this.usersTable.filter=e?{"transaction_count[gt]":0}:{},this.fetchUsers()}},created(){this.fetchUsers()},methods:{formatSat:e=>LNbits.utils.formatSat(Math.floor(e/1e3)),backToUsersPage(){this.activeUser.show=!1,this.paymentPage.show=!1,this.activeWallet.show=!1,this.fetchUsers()},handleBalanceUpdate(){this.fetchWallets(this.activeWallet.userId)},resetPassword(e){return LNbits.api.request("PUT",`/users/api/v1/user/${e}/reset_password`).then(e=>{LNbits.utils.confirmDialog(this.$t("reset_key_generated")+" "+this.$t("reset_key_copy")).onOk(()=>{const t=window.location.origin+"?reset_key="+e.data;this.utils.copyText(t)})}).catch(LNbits.utils.notifyApiError)},sortByColumn(e){this.usersTable.pagination.sortBy===e?this.usersTable.pagination.descending=!this.usersTable.pagination.descending:(this.usersTable.pagination.sortBy=e,this.usersTable.pagination.descending=!1),this.fetchUsers()},createUser(){LNbits.api.request("POST","/users/api/v1/user",null,this.activeUser.data).then(e=>{Quasar.Notify.create({type:"positive",message:"User created!",icon:null}),this.activeUser.setPassword=!0,this.activeUser.data=e.data,this.fetchUsers()}).catch(LNbits.utils.notifyApiError)},updateUser(){LNbits.api.request("PUT",`/users/api/v1/user/${this.activeUser.data.id}`,null,this.activeUser.data).then(()=>{Quasar.Notify.create({type:"positive",message:"User updated!",icon:null}),this.activeUser.data=null,this.activeUser.show=!1,this.fetchUsers()}).catch(LNbits.utils.notifyApiError)},createWallet(){const e=this.activeWallet.userId;e?LNbits.api.request("POST",`/users/api/v1/user/${e}/wallet`,null,this.createWalletDialog.data).then(()=>{this.fetchWallets(e),Quasar.Notify.create({type:"positive",message:"Wallet created!"})}).catch(LNbits.utils.notifyApiError):Quasar.Notify.create({type:"warning",message:"No user selected!",icon:null})},deleteUser(e){LNbits.utils.confirmDialog("Are you sure you want to delete this user?").onOk(()=>{LNbits.api.request("DELETE",`/users/api/v1/user/${e}`).then(()=>{this.fetchUsers(),Quasar.Notify.create({type:"positive",message:"User deleted!",icon:null}),this.activeUser.data=null,this.activeUser.show=!1}).catch(LNbits.utils.notifyApiError)})},undeleteUserWallet(e,t){LNbits.api.request("PUT",`/users/api/v1/user/${e}/wallet/${t}/undelete`).then(()=>{this.fetchWallets(e),Quasar.Notify.create({type:"positive",message:"Undeleted user wallet!",icon:null})}).catch(LNbits.utils.notifyApiError)},deleteUserWallet(e,t,a){const s=a?"Wallet is already deleted, are you sure you want to permanently delete this user wallet?":"Are you sure you want to delete this user wallet?";LNbits.utils.confirmDialog(s).onOk(()=>{LNbits.api.request("DELETE",`/users/api/v1/user/${e}/wallet/${t}`).then(()=>{this.fetchWallets(e),Quasar.Notify.create({type:"positive",message:"User wallet deleted!",icon:null})}).catch(LNbits.utils.notifyApiError)})},deleteAllUserWallets(e){LNbits.utils.confirmDialog(this.$t("confirm_delete_all_wallets")).onOk(()=>{LNbits.api.request("DELETE",`/users/api/v1/user/${e}/wallets`).then(t=>{Quasar.Notify.create({type:"positive",message:t.data.message,icon:null}),this.fetchWallets(e)}).catch(LNbits.utils.notifyApiError)})},copyWalletLink(e){const t=`${window.location.origin}/wallet?usr=${this.activeWallet.userId}&wal=${e}`;this.utils.copyText(t)},fetchUsers(e){this.relaxFilterForFields(["username","email"]);const t=LNbits.utils.prepareFilterQuery(this.usersTable,e);LNbits.api.request("GET",`/users/api/v1/user?${t}`).then(e=>{this.usersTable.loading=!1,this.usersTable.pagination.rowsNumber=e.data.total,this.users=e.data.data}).catch(LNbits.utils.notifyApiError)},fetchWallets(e){return LNbits.api.request("GET",`/users/api/v1/user/${e}/wallet`).then(t=>{this.wallets=t.data,this.activeWallet.userId=e,this.activeWallet.show=!0}).catch(LNbits.utils.notifyApiError)},relaxFilterForFields(e=[]){e.forEach(e=>{const t=this.usersTable?.filter?.[e];t&&this.usersTable.filter[e]&&(this.usersTable.filter[`${e}[like]`]=t,delete this.usersTable.filter[e])})},updateWallet(e){LNbits.api.request("PATCH","/api/v1/wallet",e.adminkey,{name:e.name}).then(()=>{e.editable=!1,Quasar.Notify.create({message:"Wallet name updated.",type:"positive",timeout:3500})}).catch(e=>{LNbits.utils.notifyApiError(e)})},toggleAdmin(e){LNbits.api.request("PUT",`/users/api/v1/user/${e}/admin`).then(()=>{this.fetchUsers(),Quasar.Notify.create({type:"positive",message:"Toggled admin!",icon:null})}).catch(LNbits.utils.notifyApiError)},toggleUserActivated(e){LNbits.api.request("PUT",`/users/api/v1/user/${e}/activate`).then(e=>{this.fetchUsers(),Quasar.Notify.create({type:"positive",message:e.data.message,icon:null})}).catch(LNbits.utils.notifyApiError)},async showAccountPage(e){if(this.activeUser.showPassword=!1,this.activeUser.showUserId=!1,this.activeUser.setPassword=!1,!e)return this.activeUser.data={extra:{}},void(this.activeUser.show=!0);try{const{data:t}=await LNbits.api.request("GET",`/users/api/v1/user/${e}`);this.activeUser.data=t,this.activeUser.show=!0}catch(e){console.warn(e),Quasar.Notify.create({type:"warning",message:"Failed to get user!"}),this.activeUser.show=!1}},async impersonateUser(e){try{await LNbits.api.impersonateUser(e),LNbits.utils.backupLocalStorage("impersonation",!0),this.$q.localStorage.setItem("lnbits.disclaimerShown",!0),window.location="/wallet"}catch(e){console.warn(e),Quasar.Notify.create({type:"warning",message:"Failed to impersonate user!"})}},async showWalletPayments(e){this.activeUser.show=!1,await this.fetchWallets(this.users[0].id),await this.showPayments(e)},showPayments(e){this.paymentsWallet=this.wallets.find(t=>t.id===e),this.paymentPage.show=!0},searchUserBy(e){const t=this.searchData[e];this.usersTable.filter={},t&&(this.usersTable.filter[e]=t),this.fetchUsers()},shortify:e=>(valueLength=(e||"").length,valueLength<=10?e:`${e.substring(0,5)}...${e.substring(valueLength-5,valueLength)}`)}},window.PageAccount={template:"#page-account",data(){return{untouchedUser:null,hasUsername:!1,showUserId:!1,themeOptions:[{name:"bitcoin",color:"deep-orange"},{name:"classic",color:"purple"},{name:"mint",color:"green"},{name:"autumn",color:"brown"},{name:"monochrome",color:"grey"},{name:"salvador",color:"blue-10"},{name:"freedom",color:"pink-13"},{name:"cyber",color:"light-green-9"},{name:"flamingo",color:"pink-3"}],defaultSiteCustomisation:{locale:"en"},reactionOptions:["None","confettiBothSides","confettiFireworks","confettiStars","confettiTop"],borderOptions:["retro-border","hard-border","neon-border","no-border"],tab:"user",credentialsData:{show:!1,oldPassword:null,newPassword:null,newPasswordRepeat:null,username:null,pubkey:null},apiAcl:{showNewAclDialog:!1,showPasswordDialog:!1,showNewTokenDialog:!1,data:[],passwordGuardedFunction:null,newAclName:"",newTokenName:"",password:"",apiToken:null,selectedTokenId:null,columns:[{name:"Name",align:"left",label:this.$t("Name"),field:"Name",sortable:!1},{name:"path",align:"left",label:this.$t("path"),field:"path",sortable:!1},{name:"read",align:"left",label:this.$t("read"),field:"read",sortable:!1},{name:"write",align:"left",label:this.$t("write"),field:"write",sortable:!1}],pagination:{rowsPerPage:100,page:1}},selectedApiAcl:{id:null,name:null,endpoints:[],token_id_list:[],allRead:!1,allWrite:!1},assets:[],assetsTable:{loading:!1,columns:[{name:"name",align:"left",label:this.$t("Name"),field:"name",sortable:!0},{name:"created_at",align:"left",label:this.$t("created_at"),field:"created_at",sortable:!0}],pagination:{rowsPerPage:6,page:1}},assetsUploadToPublic:!1,notifications:{nostr:{identifier:""}},labels:[],labelsDialog:{show:!1,data:{name:"",description:"",color:"#000000"}},labelsTable:{loading:!1,columns:[{name:"actions",align:"left"},{name:"name",align:"left",label:this.$t("Name"),field:"name",sortable:!0},{name:"description",align:"left",label:this.$t("description"),field:"description"},{name:"color",align:"left",label:this.$t("color"),field:"color"}],pagination:{rowsPerPage:6,page:1}}}},watch:{tab(e){this.$router.push(`/account#${e}`)},$route(e){e.hash.length>1&&(this.tab=e.hash.replace("#",""))},"assetsTable.search":{handler(){const e={};this.assetsTable.search&&(e.search=this.assetsTable.search),this.getUserAssets()}}},computed:{isUserTouched(){return!_.isEqual(this.g.user,this.untouchedUser)}},methods:{changeLanguage(e){window.i18n.global.locale=e,this.$q.localStorage.set("lnbits.lang",e)},async updateAccount(){try{const{data:e}=await LNbits.api.request("PATCH","/api/v1/auth",null,{user_id:this.g.user.id,username:this.g.user.username,email:this.g.user.email,extra:this.g.user.extra});this.untouchedUser=JSON.parse(JSON.stringify(this.g.user)),this.hasUsername=!!e.username,Quasar.Notify.create({type:"positive",message:"Account updated."})}catch(e){LNbits.utils.notifyApiError(e)}},disableUpdatePassword(){return!this.credentialsData.newPassword||!this.credentialsData.newPasswordRepeat||this.credentialsData.newPassword!==this.credentialsData.newPasswordRepeat},async updatePassword(){if(this.credentialsData.username)try{const{data:e}=await LNbits.api.request("PUT","/api/v1/auth/password",null,{user_id:this.g.user.id,username:this.credentialsData.username,password_old:this.credentialsData.oldPassword,password:this.credentialsData.newPassword,password_repeat:this.credentialsData.newPasswordRepeat});this.untouchedUser=JSON.parse(JSON.stringify(e)),this.hasUsername=!!e.username,this.credentialsData.show=!1,Quasar.Notify.create({type:"positive",message:"Password updated."})}catch(e){LNbits.utils.notifyApiError(e)}else Quasar.Notify.create({type:"warning",message:"Please set a username."})},async updatePubkey(){try{const{data:e}=await LNbits.api.request("PUT","/api/v1/auth/pubkey",null,{user_id:this.g.user.id,pubkey:this.credentialsData.pubkey});this.untouchedUser=JSON.parse(JSON.stringify(e)),this.hasUsername=!!e.username,this.credentialsData.show=!1,this.$q.notify({type:"positive",message:"Public key updated."})}catch(e){LNbits.utils.notifyApiError(e)}},showUpdateCredentials(){this.credentialsData={show:!0,oldPassword:null,username:this.g.user.username,pubkey:this.g.user.pubkey,newPassword:null,newPasswordRepeat:null}},newApiAclDialog(){this.apiAcl.newAclName=null,this.apiAcl.showNewAclDialog=!0},newTokenAclDialog(){this.apiAcl.newTokenName=null,this.apiAcl.newTokenExpiry=null,this.apiAcl.showNewTokenDialog=!0},handleApiACLSelected(e){this.selectedApiAcl={id:null,name:null,endpoints:[],token_id_list:[]},this.apiAcl.selectedTokenId=null,e&&setTimeout(()=>{const t=this.apiAcl.data.find(t=>t.id===e);this.selectedApiAcl&&(this.selectedApiAcl={...t},this.selectedApiAcl.allRead=this.selectedApiAcl.endpoints.every(e=>e.read),this.selectedApiAcl.allWrite=this.selectedApiAcl.endpoints.every(e=>e.write))})},handleAllEndpointsReadAccess(){this.selectedApiAcl.endpoints.forEach(e=>e.read=this.selectedApiAcl.allRead)},handleAllEndpointsWriteAccess(){this.selectedApiAcl.endpoints.forEach(e=>e.write=this.selectedApiAcl.allWrite)},async getApiACLs(){try{const{data:e}=await LNbits.api.request("GET","/api/v1/auth/acl",null);this.apiAcl.data=e.access_control_list}catch(e){LNbits.utils.notifyApiError(e)}},askPasswordAndRunFunction(e){this.apiAcl.passwordGuardedFunction=e,this.apiAcl.showPasswordDialog=!0},runPasswordGuardedFunction(){this.apiAcl.showPasswordDialog=!1;const e=this.apiAcl.passwordGuardedFunction;e&&this[e]()},async addApiACL(){if(this.apiAcl.newAclName){try{const{data:e}=await LNbits.api.request("PUT","/api/v1/auth/acl",null,{id:this.apiAcl.newAclName,name:this.apiAcl.newAclName,password:this.apiAcl.password});this.apiAcl.data=e.access_control_list;const t=this.apiAcl.data.find(e=>e.name===this.apiAcl.newAclName);this.handleApiACLSelected(t.id),this.apiAcl.showNewAclDialog=!1,this.$q.notify({type:"positive",message:"Access Control List created."})}catch(e){LNbits.utils.notifyApiError(e)}finally{this.apiAcl.name="",this.apiAcl.password=""}this.apiAcl.showNewAclDialog=!1}else this.$q.notify({type:"warning",message:"Name is required."})},async updateApiACLs(){try{const{data:e}=await LNbits.api.request("PUT","/api/v1/auth/acl",null,{id:this.g.user.id,password:this.apiAcl.password,...this.selectedApiAcl});this.apiAcl.data=e.access_control_list}catch(e){LNbits.utils.notifyApiError(e)}finally{this.apiAcl.password=""}},async deleteApiACL(){if(this.selectedApiAcl.id){try{await LNbits.api.request("DELETE","/api/v1/auth/acl",null,{id:this.selectedApiAcl.id,password:this.apiAcl.password}),this.$q.notify({type:"positive",message:"Access Control List deleted."})}catch(e){LNbits.utils.notifyApiError(e)}finally{this.apiAcl.password=""}this.apiAcl.data=this.apiAcl.data.filter(e=>e.id!==this.selectedApiAcl.id),this.handleApiACLSelected(this.apiAcl.data[0]?.id)}},async generateApiToken(){if(!this.selectedApiAcl.id)return;const e=new Date(this.apiAcl.newTokenExpiry)-new Date;try{const{data:t}=await LNbits.api.request("POST","/api/v1/auth/acl/token",null,{acl_id:this.selectedApiAcl.id,token_name:this.apiAcl.newTokenName,password:this.apiAcl.password,expiration_time_minutes:Math.trunc(e/6e4)});this.apiAcl.apiToken=t.api_token,this.apiAcl.selectedTokenId=t.id,Quasar.Notify.create({type:"positive",message:"Token Generated."}),await this.getApiACLs(),this.handleApiACLSelected(this.selectedApiAcl.id),this.apiAcl.showNewTokenDialog=!1}catch(e){LNbits.utils.notifyApiError(e)}finally{this.apiAcl.password=""}},async deleteToken(){if(this.apiAcl.selectedTokenId)try{await LNbits.api.request("DELETE","/api/v1/auth/acl/token",null,{id:this.apiAcl.selectedTokenId,acl_id:this.selectedApiAcl.id,password:this.apiAcl.password}),this.$q.notify({type:"positive",message:"Token deleted."}),this.selectedApiAcl.token_id_list=this.selectedApiAcl.token_id_list.filter(e=>e.id!==this.apiAcl.selectedTokenId),this.apiAcl.selectedTokenId=null}catch(e){LNbits.utils.notifyApiError(e)}finally{this.apiAcl.password=""}},async getUserAssets(e){try{this.assetsTable.loading=!0;const t=LNbits.utils.prepareFilterQuery(this.assetsTable,e),{data:a}=await LNbits.api.request("GET",`/api/v1/assets/paginated?${t}`,null);this.assets=a.data,this.assetsTable.pagination.rowsNumber=a.total}catch(e){LNbits.utils.notifyApiError(e)}finally{this.assetsTable.loading=!1}},onImageInput(e){const t=e.target.files[0];t&&this.uploadAsset(t),e.target.value=null},onBackgroundImageInput(e){const t=e.target.files[0];t&&this.uploadBackgroundImage(t),e.target.value=null},async uploadAsset(e,{isPublic:t=this.assetsUploadToPublic,notifySuccess:a=!0}={}){const s=new FormData;s.append("file",e);try{const{data:e}=await LNbits.api.request("POST",`/api/v1/assets?public_asset=${t}`,null,s,{headers:{"Content-Type":"multipart/form-data"}});return a&&this.$q.notify({type:"positive",message:"Upload successful!",icon:null}),await this.getUserAssets(),e}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},async uploadBackgroundImage(e){const t=await this.uploadAsset(e,{isPublic:!1,notifySuccess:!1});if(!t)return;const a=`${window.location.origin}/api/v1/assets/${t.id}/thumbnail`;await this.siteCustomisationChanged({bgimageChoice:a})},async deleteAsset(e){LNbits.utils.confirmDialog("Are you sure you want to delete this asset?").onOk(async()=>{try{await LNbits.api.request("DELETE",`/api/v1/assets/${e.id}`,null),this.$q.notify({type:"positive",message:"Asset deleted."}),await this.getUserAssets()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}})},async toggleAssetPublicAccess(e){try{await LNbits.api.request("PUT",`/api/v1/assets/${e.id}`,null,{is_public:!e.is_public}),this.$q.notify({type:"positive",message:"Update successful!",icon:null}),await this.getUserAssets()}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}},copyAssetLinkToClipboard(e){const t=`${window.location.origin}/api/v1/assets/${e.id}/data`;this.utils.copyText(t)},addUserLabel(){if(!this.labelsDialog.data.name)return void this.$q.notify({type:"warning",message:"Name is required."});if(!this.labelsDialog.data.color)return void this.$q.notify({type:"warning",message:"Color is required."});this.g.user.extra.labels=this.g.user.extra.labels||[];if(!this.g.user.extra.labels.find(e=>e.name===this.labelsDialog.data.name))return this.g.user.extra.labels.unshift({...this.labelsDialog.data}),this.labelsDialog.show=!1,!0;this.$q.notify({type:"warning",message:"A label with this name already exists."})},openAddLabelDialog(){this.labelsDialog.data={name:"",description:"",color:"#000000"},this.labelsDialog.show=!0},openEditLabelDialog(e){this.labelsDialog.data={name:e.name,description:e.description,color:e.color},this.labelsDialog.show=!0},updateUserLabel(){const e=this.labelsDialog.data,t=JSON.parse(JSON.stringify(this.g.user.extra.labels));this.g.user.extra.labels=this.g.user.extra.labels.filter(t=>t.name!==e.name);this.addUserLabel()||(this.g.user.extra.labels=t),this.labelsDialog.show=!1},deleteUserLabel(e){LNbits.utils.confirmDialog("Are you sure you want to delete this label?").onOk(()=>{this.g.user.extra.labels=this.g.user.extra.labels.filter(t=>t.name!==e.name)})},async siteCustomisationChanged(e={}){try{Object.entries(e||{}).forEach(([e,t])=>{e in this.g&&(this.g[e]=t)}),await LNbits.api.updateUiCustomization(e),this.$q.notify({type:"positive",message:"UI Customization updated."})}catch(e){LNbits.utils.notifyApiError(e)}},resetThemeDefaults(){const e={themeChoice:this.g.settings.defaultTheme,borderChoice:this.g.settings.defaultBorder,gradientChoice:this.g.settings.defaultGradient,bgimageChoice:this.g.settings.defaultBgimage||"",reactionChoice:this.g.settings.defaultReaction,darkChoice:this.g.settings.defaultDark,cardRoundedChoice:this.g.settings.defaultCardRounded,cardGradientChoice:this.g.settings.defaultCardGradient,cardShadowChoice:this.g.settings.defaultCardShadow,burgerMenuChoice:this.g.settings.defaultBurgerMenuBackground};this.siteCustomisationChanged(e)}},async created(){this.untouchedUser=JSON.parse(JSON.stringify(this.g.user)),this.hasUsername=!!this.g.user.username,this.$route.hash.length>1&&(this.tab=this.$route.hash.replace("#","")),await this.getApiACLs(),await this.getUserAssets(),this.themeOptions=this.themeOptions.filter(e=>this.g.settings.themeOptions.includes(e.name))}},window.PageAdmin={template:"#page-admin",data:()=>({tab:"funding",settings:{},formData:{lnbits_exchange_rate_providers:[],lnbits_audit_exclude_paths:[],lnbits_audit_include_paths:[],lnbits_audit_http_response_codes:[]},isSuperUser:!1,needsRestart:!1}),watch:{tab(e){this.$router.push(`/admin#${e}`)},$route(e){e.hash.length>1&&(this.tab=e.hash.replace("#",""))}},async created(){this.$route.hash.length>1&&(this.tab=this.$route.hash.replace("#","")),await this.getSettings()},computed:{checkChanges(){return!_.isEqual(this.settings,this.formData)}},methods:{getDefaultSetting(e){LNbits.api.getDefaultSetting(e).then(t=>{this.formData[e]=t.data.default_value})},restartServer(){LNbits.api.request("GET","/admin/api/v1/restart/").then(e=>{this.$q.notify({type:"positive",message:"Success! Restarted Server",icon:null}),this.needsRestart=!1}).catch(LNbits.utils.notifyApiError)},async getSettings(){await LNbits.api.request("GET","/admin/api/v1/settings",this.g.user.wallets[0].adminkey).then(e=>{this.isSuperUser=e.data.is_super_user||!1,this.settings=e.data,this.formData={...this.settings}}).catch(LNbits.utils.notifyApiError)},updateSettings(){const e=_.omit(this.formData,["is_super_user","lnbits_allowed_funding_sources","touch"]);LNbits.api.request("PUT","/admin/api/v1/settings",this.g.user.wallets[0].adminkey,e).then(e=>{this.needsRestart=this.settings.lnbits_backend_wallet_class!==this.formData.lnbits_backend_wallet_class,this.settings=this.formData,this.formData=_.clone(this.settings),Quasar.Notify.create({type:"positive",message:"Success! Settings changed! "+(this.needsRestart?"Restart required!":""),icon:null})}).catch(LNbits.utils.notifyApiError)},deleteSettings(){LNbits.utils.confirmDialog("Are you sure you want to restore settings to default?").onOk(()=>{LNbits.api.request("DELETE","/admin/api/v1/settings").then(e=>{Quasar.Notify.create({type:"positive",message:"Success! Restored settings to defaults. Restarting...",icon:null}),this.$q.localStorage.clear()}).catch(LNbits.utils.notifyApiError)})},downloadBackup(){window.open("/admin/api/v1/backup","_blank")}}},window.app.component("lnbits-admin-funding",{props:["is-super-user","form-data","settings"],template:"#lnbits-admin-funding",data:()=>({auditData:[]}),created(){this.getAudit()},methods:{getAudit(){LNbits.api.request("GET","/admin/api/v1/audit",this.g.user.wallets[0].adminkey).then(e=>{this.auditData=e.data}).catch(LNbits.utils.notifyApiError)}}}),window.app.component("lnbits-admin-funding-sources",{template:"#lnbits-admin-funding-sources",props:["form-data","allowed-funding-sources"],methods:{getFundingSourceLabel(e){const t=this.rawFundingSources.find(t=>t[0]===e);return t?t[1]:e},showQRValue(e){this.qrValue=e,this.showQRDialog=!0}},computed:{fundingSources(){let e=[];for(const[t,a,s]of this.rawFundingSources){const a={};if(null!==s)for(let[e,t]of Object.entries(s))a[e]="string"==typeof t?{label:t,value:null}:t||{};e.push([t,a])}return new Map(e)},sortedAllowedFundingSources(){return this.allowedFundingSources.sort()}},data:()=>({hideInput:!0,showQRDialog:!1,qrValue:"",rawFundingSources:[["VoidWallet","Void Wallet",null],["FakeWallet","Fake Wallet",{fake_wallet_secret:"Secret",lnbits_denomination:'"sats" or 3 Letter Custom Denomination'}],["CLNRestWallet","Core Lightning Rest (plugin)",{clnrest_url:"Endpoint",clnrest_ca:"ca.pem",clnrest_cert:"server.pem",clnrest_readonly_rune:"Rune used for readonly requests",clnrest_invoice_rune:"Rune used for creating invoices",clnrest_pay_rune:"Rune used for paying invoices using pay",clnrest_renepay_rune:"Rune used for paying invoices using renepay",clnrest_last_pay_index:"Ignores any invoices paid prior to or including this index. 0 is equivalent to not specifying and negative value is invalid.",clnrest_nodeid:"Node id"}],["CoreLightningWallet","Core Lightning",{corelightning_rpc:"Endpoint",corelightning_pay_command:"Custom Pay Command"}],["CoreLightningRestWallet","Core Lightning Rest (legacy)",{corelightning_rest_url:"Endpoint",corelightning_rest_cert:"Certificate",corelightning_rest_macaroon:"Macaroon"}],["LndRestWallet","Lightning Network Daemon (LND Rest)",{lnd_rest_endpoint:"Endpoint",lnd_rest_cert:"Certificate",lnd_rest_macaroon:"Macaroon",lnd_rest_macaroon_encrypted:"Encrypted Macaroon",lnd_rest_route_hints:{advanced:!0,label:"Enable Route Hints"},lnd_rest_allow_self_payment:{advanced:!0,label:"Allow Self Payment"}}],["LndWallet","Lightning Network Daemon (LND)",{lnd_grpc_endpoint:"Endpoint",lnd_grpc_cert:"Certificate",lnd_grpc_port:"Port",lnd_grpc_macaroon:"GRPC Macaroon",lnd_grpc_invoice_macaroon:"GRPC Invoice Macaroon",lnd_grpc_admin_macaroon:"GRPC Admin Macaroon",lnd_grpc_macaroon_encrypted:"Encrypted Macaroon"}],["LnTipsWallet","LN.Tips",{lntips_api_endpoint:"Endpoint",lntips_api_key:"API Key"}],["LNPayWallet","LN Pay",{lnpay_api_endpoint:"Endpoint",lnpay_api_key:"API Key",lnpay_wallet_key:"Wallet Key"}],["EclairWallet","Eclair (ACINQ)",{eclair_url:"URL",eclair_pass:"Password"}],["LNbitsWallet","LNbits",{lnbits_endpoint:"Endpoint",lnbits_key:"Admin Key"}],["BlinkWallet","Blink",{blink_api_endpoint:"Endpoint",blink_ws_endpoint:"WebSocket",blink_token:"Key"}],["AlbyWallet","Alby",{alby_api_endpoint:"Endpoint",alby_access_token:"Key"}],["BoltzWallet","Boltz",{boltz_client_endpoint:{label:"Boltz client endpoint",value:"127.0.0.1:9002"},boltz_client_macaroon:{label:"Admin Macaroon path or hex",value:"/home/ubuntu/.boltz/macaroons/admin.macaroon"},boltz_client_cert:{label:"Certificate path or hex",value:"/home/ubuntu/.boltz/tls.cert"},boltz_mnemonic:{label:"Liquid seed phrase",hint:"Boltz will fetch once connected, but you can change later (can be opened in a liquid wallet) ",copy:!0,qrcode:!0},boltz_client_password:{label:"Wallet Password (optional)",advanced:!0}}],["ZBDWallet","ZBD",{zbd_api_endpoint:"Endpoint",zbd_api_key:"Key"}],["PhoenixdWallet","Phoenixd",{phoenixd_api_endpoint:"Endpoint",phoenixd_api_password:"Key",phoenixd_data_dir:{label:"Data Directory",hint:"Directory where phoenixd stores its data, including the seed phrase."},phoenixd_mnemonic:{label:"Phoenixd Seed Phrase",hint:"Only available if phoenixd data-dir is specified",readonly:!0,copy:!0,qrcode:!0}}],["OpenNodeWallet","OpenNode",{opennode_api_endpoint:"Endpoint",opennode_key:"Key"}],["ClicheWallet","Cliche (NBD)",{cliche_endpoint:"Endpoint"}],["SparkWallet","Spark",{spark_url:"Endpoint",spark_token:"Token"}],["SparkL2Wallet","Spark (L2)",{spark_l2_external_endpoint:{label:"External Sidecar Endpoint",hint:"Make sure to also specify the API key if your sidecar requires authentication.",value:""},spark_l2_mnemonic:{label:"External Sidecar Mnemonic",hint:"Mnemonic for the Spark wallet on the external sidecar. Required if the side car does not have its own mnemonic.",value:""},spark_l2_external_api_key:{label:"External Sidecar API Key",hint:"API key for authenticating with the external sidecar if it requires authentication.",value:""},spark_l2_network:{label:"Network",value:"MAINNET",hint:"The network to use for the Spark wallet.",advanced:!0},spark_l2_pay_wait_ms:{label:"Payment Wait Time (ms)",hint:"The time to wait for a payment to be processed before considering it failed.",advanced:!0},spark_l2_pay_poll_ms:{label:"Payment Poll Time (ms)",hint:"The time to wait between polling for payment status updates.",advanced:!0},spark_l2_stream_keepalive_ms:{label:"Stream Keepalive Time (ms)",hint:"The time to wait between sending keepalive messages to the Spark sidecar to keep the connection open.",advanced:!0}}],["NWCWallet","Nostr Wallet Connect",{nwc_pairing_url:"Pairing URL"}],["BreezSdkWallet","Breez SDK",{breez_api_key:"Breez API Key",breez_greenlight_seed:"Greenlight Seed",breez_greenlight_device_key:"Greenlight Device Key",breez_greenlight_device_cert:"Greenlight Device Cert",breez_greenlight_invite_code:"Greenlight Invite Code"}],["StrikeWallet","Strike (alpha)",{strike_api_endpoint:"API Endpoint",strike_api_key:"API Key"}],["BreezLiquidSdkWallet","Breez Liquid SDK",{breez_liquid_api_key:"Breez API Key (can be empty)",breez_liquid_seed:"Liquid seed phrase",breez_liquid_fee_offset_sat:"Offset amount in sats to increase fee limit"}]]})}),window.app.component("lnbits-admin-fiat-providers",{props:["form-data"],template:"#lnbits-admin-fiat-providers",data:()=>({formAddStripeUser:"",formAddPaypalUser:"",formAddSquareUser:"",formAddRevolutUser:"",creatingRevolutWebhook:!1,hideInputToggle:!0}),computed:{stripeWebhookUrl(){return this.formData?.stripe_payment_webhook_url||this.calculateWebhookUrl("stripe")},paypalWebhookUrl(){return this.formData?.paypal_payment_webhook_url||this.calculateWebhookUrl("paypal")},revolutWebhookUrl(){return this.formData?.revolut_payment_webhook_url||this.calculateWebhookUrl("revolut")}},watch:{formData:{handler(){this.syncWebhookUrls()},immediate:!0}},methods:{basePathFromLocation(){if("undefined"==typeof window)return"";const e=window.location.pathname.replace(/\/+$/,""),t=e.lastIndexOf("/admin");return(t>=0?e.slice(0,t):e||"")||""},calculateWebhookUrl(e){if("undefined"==typeof window)return"";const t=`${this.basePathFromLocation()}/api/v1/callback/${e}`.replace(/\/+/g,"/"),a=t.startsWith("/")?t:`/${t}`;return`${window.location.origin}${a}`},syncWebhookUrls(){this.maybeSetWebhookUrl("stripe_payment_webhook_url","stripe"),this.maybeSetWebhookUrl("paypal_payment_webhook_url","paypal"),this.maybeSetWebhookUrl("square_payment_webhook_url","square"),this.maybeSetWebhookUrl("revolut_payment_webhook_url","revolut")},maybeSetWebhookUrl(e,t){if(!this.formData)return;const a=this.calculateWebhookUrl(t),s=this.formData[e];(!s||s.includes("your-lnbits-domain-here.com"))&&a&&(this.formData[e]=a)},copyWebhookUrl(e){e&&this.copyText(e)},isClearnetWebhookUrl(e){let t;try{t=new URL(e)}catch(e){return!1}const a=t.hostname.toLowerCase();return!!["http:","https:"].includes(t.protocol)&&(!("localhost"===a||a.endsWith(".localhost")||a.endsWith(".local")||a.endsWith(".onion"))&&!(/^127\./.test(a)||/^10\./.test(a)||/^192\.168\./.test(a)||/^169\.254\./.test(a)||/^172\.(1[6-9]|2\d|3[0-1])\./.test(a)||"0.0.0.0"===a||"::1"===a))},notifyRevolutWebhookWarning(e){Quasar.Notify.create({type:"warning",message:e,icon:null,closeBtn:!0})},addStripeAllowedUser(){const e=this.formAddStripeUser||"";e.length&&!this.formData.stripe_limits.allowed_users.includes(e)&&(this.formData.stripe_limits.allowed_users=[...this.formData.stripe_limits.allowed_users,e],this.formAddStripeUser="")},removeStripeAllowedUser(e){this.formData.stripe_limits.allowed_users=this.formData.stripe_limits.allowed_users.filter(t=>t!==e)},addPaypalAllowedUser(){const e=this.formAddPaypalUser||"";e.length&&!this.formData.paypal_limits.allowed_users.includes(e)&&(this.formData.paypal_limits.allowed_users=[...this.formData.paypal_limits.allowed_users,e],this.formAddPaypalUser="")},removePaypalAllowedUser(e){this.formData.paypal_limits.allowed_users=this.formData.paypal_limits.allowed_users.filter(t=>t!==e)},addSquareAllowedUser(){const e=this.formAddSquareUser||"";e.length&&!this.formData.square_limits.allowed_users.includes(e)&&(this.formData.square_limits.allowed_users=[...this.formData.square_limits.allowed_users,e],this.formAddSquareUser="")},removeSquareAllowedUser(e){this.formData.square_limits.allowed_users=this.formData.square_limits.allowed_users.filter(t=>t!==e)},addRevolutAllowedUser(){const e=this.formAddRevolutUser||"";e.length&&!this.formData.revolut_limits.allowed_users.includes(e)&&(this.formData.revolut_limits.allowed_users=[...this.formData.revolut_limits.allowed_users,e],this.formAddRevolutUser="")},removeRevolutAllowedUser(e){this.formData.revolut_limits.allowed_users=this.formData.revolut_limits.allowed_users.filter(t=>t!==e)},checkFiatProvider(e){LNbits.api.request("PUT",`/api/v1/fiat/check/${e}`).then(e=>{const t=e.data;Quasar.Notify.create({type:t.success?"positive":"warning",message:t.message,icon:null})}).catch(LNbits.utils.notifyApiError)},createRevolutWebhook(){const e=this.calculateWebhookUrl("revolut");this.formData.revolut_payment_webhook_url=e,this.formData.revolut_api_secret_key?this.isClearnetWebhookUrl(e)?(this.creatingRevolutWebhook=!0,LNbits.api.request("POST","/api/v1/fiat/revolut/webhook",null,{url:e,endpoint:this.formData.revolut_api_endpoint,api_secret_key:this.formData.revolut_api_secret_key,api_version:this.formData.revolut_api_version}).then(e=>{const t=e.data;this.formData.revolut_payment_webhook_url=t.url,this.formData.revolut_webhook_signing_secret=t.signing_secret,Quasar.Notify.create({type:"positive",message:`Revolut webhook ${t.already_exists?"already exists":"created"}${t.id?`: ${t.id}`:""}.`,icon:null})}).catch(LNbits.utils.notifyApiError).finally(()=>{this.creatingRevolutWebhook=!1})):this.notifyRevolutWebhookWarning("Revolut webhook URL must be a clearnet URL."):this.notifyRevolutWebhookWarning("Add your Revolut API secret key before creating a webhook.")}}}),window.app.component("lnbits-admin-exchange-providers",{props:["form-data"],template:"#lnbits-admin-exchange-providers",data:()=>({exchangeData:{selectedProvider:null,showTickerConversion:!1,convertFromTicker:null,convertToTicker:null},exchangesTable:{columns:[{name:"name",align:"left",label:"Exchange Name",field:"name",sortable:!0},{name:"api_url",align:"left",label:"URL",field:"api_url",sortable:!1},{name:"path",align:"left",label:"JSON Path",field:"path",sortable:!1},{name:"exclude_to",align:"left",label:"Exclude Currencies",field:"exclude_to",sortable:!1},{name:"ticker_conversion",align:"left",label:"Ticker Conversion",field:"ticker_conversion",sortable:!1}],pagination:{sortBy:"name",rowsPerPage:100,page:1,rowsNumber:100},search:null,hideEmpty:!0}}),mounted(){this.getExchangeRateHistory()},created(){const e=window.location.hash.replace("#","");"exchange_providers"===e&&this.showExchangeProvidersTab(e)},methods:{getDefaultSetting(e){LNbits.api.getDefaultSetting(e).then(t=>{this.formData[e]=t.data.default_value})},getExchangeRateHistory(){LNbits.api.request("GET","/api/v1/rate/history",this.g.user.wallets[0].inkey).then(e=>{this.initExchangeChart(e.data)}).catch(function(e){LNbits.utils.notifyApiError(e)})},showExchangeProvidersTab(e){"exchange_providers"===e&&this.getExchangeRateHistory()},addExchangeProvider(){this.formData.lnbits_exchange_rate_providers=[{name:"",api_url:"",path:"",exclude_to:[]},...this.formData.lnbits_exchange_rate_providers]},removeExchangeProvider(e){this.formData.lnbits_exchange_rate_providers=this.formData.lnbits_exchange_rate_providers.filter(t=>t!==e)},removeExchangeTickerConversion(e,t){e.ticker_conversion=e.ticker_conversion.filter(e=>e!==t),this.formData.touch=null},addExchangeTickerConversion(){this.exchangeData.selectedProvider&&(this.exchangeData.selectedProvider.ticker_conversion.push(`${this.exchangeData.convertFromTicker}:${this.exchangeData.convertToTicker}`),this.formData.touch=null,this.exchangeData.showTickerConversion=!1)},showTickerConversionDialog(e){this.exchangeData.convertFromTicker=null,this.exchangeData.convertToTicker=null,this.exchangeData.selectedProvider=e,this.exchangeData.showTickerConversion=!0},initExchangeChart(e){const t=e.map(e=>this.utils.formatTimestamp(e.timestamp,"HH:mm")),a=[...this.formData.lnbits_exchange_rate_providers,{name:"LNbits"}].map(t=>({label:t.name,data:e.map(e=>e.rates[t.name]),pointStyle:!0,borderWidth:"LNbits"===t.name?4:1,tension:.4}));this.exchangeRatesChart=new Chart(this.$refs.exchangeRatesChart.getContext("2d"),{type:"line",options:{plugins:{legend:{display:!1}}},data:{labels:t,datasets:a}})}}}),window.app.component("lnbits-admin-security",{props:["form-data"],template:"#lnbits-admin-security",data:()=>({logs:[],formBlockedIPs:"",serverlogEnabled:!1,nostrAcceptedUrl:"",formAllowedIPs:"",formCallbackUrlRule:""}),created(){},methods:{addAllowedIPs(){const e=this.formAllowedIPs.trim(),t=this.formData.lnbits_allowed_ips;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_allowed_ips=[...t,e],this.formAllowedIPs="")},removeAllowedIPs(e){const t=this.formData.lnbits_allowed_ips;this.formData.lnbits_allowed_ips=t.filter(t=>t!==e)},addBlockedIPs(){const e=this.formBlockedIPs.trim(),t=this.formData.lnbits_blocked_ips;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_blocked_ips=[...t,e],this.formBlockedIPs="")},removeBlockedIPs(e){const t=this.formData.lnbits_blocked_ips;this.formData.lnbits_blocked_ips=t.filter(t=>t!==e)},addCallbackUrlRule(){const e=this.formCallbackUrlRule.trim(),t=this.formData.lnbits_callback_url_rules;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_callback_url_rules=[...t,e],this.formCallbackUrlRule="")},removeCallbackUrlRule(e){const t=this.formData.lnbits_callback_url_rules;this.formData.lnbits_callback_url_rules=t.filter(t=>t!==e)},addNostrUrl(){const e=this.nostrAcceptedUrl.trim();this.removeNostrUrl(e),this.formData.nostr_absolute_request_urls.push(e),this.nostrAcceptedUrl=""},removeNostrUrl(e){this.formData.nostr_absolute_request_urls=this.formData.nostr_absolute_request_urls.filter(t=>t!==e)},async toggleServerLog(){if(this.serverlogEnabled=!this.serverlogEnabled,this.serverlogEnabled){const e="http:"!==location.protocol?"wss://":"ws://",t=await LNbits.utils.digestMessage(this.g.user.id),a=e+document.domain+":"+location.port+"/api/v1/ws/"+t;this.ws=new WebSocket(a),this.ws.addEventListener("message",async({data:e})=>{this.logs.push(e.toString());const t=this.$refs.logScroll;if(t){const e=t.getScrollTarget(),a=0;t.setScrollPosition(e.scrollHeight,a)}})}else this.ws.close()}}}),window.app.component("lnbits-admin-users",{props:["form-data"],template:"#lnbits-admin-users",data:()=>({formAddUser:"",formAddAdmin:"",formAddActivationCode:"",showReusableActivationCode:!1}),methods:{addAllowedUser(){let e=this.formAddUser,t=this.formData.lnbits_allowed_users;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_allowed_users=[...t,e],this.formAddUser="")},removeAllowedUser(e){let t=this.formData.lnbits_allowed_users;this.formData.lnbits_allowed_users=t.filter(t=>t!==e)},addAdminUser(){let e=this.formAddAdmin,t=this.formData.lnbits_admin_users;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_admin_users=[...t,e],this.formAddAdmin="")},removeAdminUser(e){let t=this.formData.lnbits_admin_users;this.formData.lnbits_admin_users=t.filter(t=>t!==e)},addOneTimeActivationCode(){const e=this.formAddActivationCode,t=this.formData.lnbits_register_one_time_activation_codes;e?.length&&!t.includes(e)&&(this.formData.lnbits_register_one_time_activation_codes=[...t,e],this.formAddActivationCode="")},removeOneTimeActivationCode(e){const t=this.formData.lnbits_register_one_time_activation_codes;this.formData.lnbits_register_one_time_activation_codes=t.filter(t=>t!==e)}}}),window.app.component("lnbits-admin-server",{props:["form-data"],template:"#lnbits-admin-server"}),window.app.component("lnbits-admin-extensions",{props:["form-data"],template:"#lnbits-admin-extensions",data:()=>({formAddExtensionsManifest:""}),methods:{addExtensionsManifest(){const e=this.formAddExtensionsManifest.trim(),t=this.formData.lnbits_extensions_manifests;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_extensions_manifests=[...t,e],this.formAddExtensionsManifest="")},removeExtensionsManifest(e){const t=this.formData.lnbits_extensions_manifests;this.formData.lnbits_extensions_manifests=t.filter(t=>t!==e)}}}),window.app.component("lnbits-admin-notifications",{props:["form-data"],template:"#lnbits-admin-notifications",data:()=>({nostrNotificationIdentifier:"",emailNotificationAddress:""}),methods:{sendTestEmail(){LNbits.api.request("GET","/admin/api/v1/testemail",this.g.user.wallets[0].adminkey).then(e=>{if("error"===e.data.status)throw new Error(e.data.message);this.$q.notify({message:"Test email sent!",color:"positive"})}).catch(e=>{this.$q.notify({message:e.message,color:"negative"})})},addNostrNotificationIdentifier(){const e=this.nostrNotificationIdentifier.trim(),t=this.formData.lnbits_nostr_notifications_identifiers;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_nostr_notifications_identifiers=[...t,e],this.nostrNotificationIdentifier="")},removeNostrNotificationIdentifier(e){const t=this.formData.lnbits_nostr_notifications_identifiers;this.formData.lnbits_nostr_notifications_identifiers=t.filter(t=>t!==e)},addEmailNotificationAddress(){const e=this.emailNotificationAddress.trim(),t=this.formData.lnbits_email_notifications_to_emails;e&&e.length&&!t.includes(e)&&(this.formData.lnbits_email_notifications_to_emails=[...t,e],this.emailNotificationAddress="")},removeEmailNotificationAddress(e){const t=this.formData.lnbits_email_notifications_to_emails;this.formData.lnbits_email_notifications_to_emails=t.filter(t=>t!==e)}}}),window.app.component("lnbits-admin-site-customisation",{props:["form-data"],template:"#lnbits-admin-site-customisation",data:()=>({lnbits_theme_options:["classic","bitcoin","flamingo","cyber","freedom","mint","autumn","monochrome","salvador"],colors:["primary","secondary","accent","positive","negative","info","warning","red","yellow","orange"],reactionOptions:["none","confettiBothSides","confettiFireworks","confettiStars","confettiTop"],globalBorderOptions:["retro-border","hard-border","neon-border","no-border"]}),methods:{onBackgroundImageInput(e){const t=e.target.files[0];t&&this.uploadBackgroundImage(t),e.target.value=null},async uploadBackgroundImage(e){const t=new FormData;t.append("file",e);try{const{data:e}=await LNbits.api.request("POST","/api/v1/assets?public_asset=true",null,t,{headers:{"Content-Type":"multipart/form-data"}}),a=`${window.location.origin}/api/v1/assets/${e.id}/thumbnail`;this.formData.lnbits_default_bgimage=a,Quasar.Notify.create({type:"positive",message:"Background image uploaded.",icon:null})}catch(e){LNbits.utils.notifyApiError(e)}}}}),window.app.component("lnbits-admin-assets-config",{props:["form-data"],template:"#lnbits-admin-assets-config",data:()=>({newAllowedAssetMimeType:"",newNoLimitUser:""}),async created(){},methods:{addAllowedAssetMimeType(){this.newAllowedAssetMimeType&&(this.removeAllowedAssetMimeType(this.newAllowedAssetMimeType),this.formData.lnbits_assets_allowed_mime_types.push(this.newAllowedAssetMimeType),this.newAllowedAssetMimeType="",this.formData.touch=null)},removeAllowedAssetMimeType(e){const t=this.formData.lnbits_assets_allowed_mime_types.indexOf(e);-1!==t&&this.formData.lnbits_assets_allowed_mime_types.splice(t,1),this.formData.touch=null},addNewNoLimitUser(){this.newNoLimitUser&&(this.removeNoLimitUser(this.newNoLimitUser),this.formData.lnbits_assets_no_limit_users.push(this.newNoLimitUser),this.newNoLimitUser="",this.formData.touch=null)},removeNoLimitUser(e){e&&(this.formData.lnbits_assets_no_limit_users=this.formData.lnbits_assets_no_limit_users.filter(t=>t!==e),this.formData.touch=null)}}}),window.app.component("lnbits-admin-audit",{props:["form-data"],template:"#lnbits-admin-audit",data:()=>({formAddIncludePath:"",formAddExcludePath:"",formAddIncludeResponseCode:""}),methods:{addIncludePath(){if(""===this.formAddIncludePath)return;const e=this.formData.lnbits_audit_include_paths;e.includes(this.formAddIncludePath)||(this.formData.lnbits_audit_include_paths=[...e,this.formAddIncludePath]),this.formAddIncludePath=""},removeIncludePath(e){this.formData.lnbits_audit_include_paths=this.formData.lnbits_audit_include_paths.filter(t=>t!==e)},addExcludePath(){if(""===this.formAddExcludePath)return;const e=this.formData.lnbits_audit_exclude_paths;e.includes(this.formAddExcludePath)||(this.formData.lnbits_audit_exclude_paths=[...e,this.formAddExcludePath]),this.formAddExcludePath=""},removeExcludePath(e){this.formData.lnbits_audit_exclude_paths=this.formData.lnbits_audit_exclude_paths.filter(t=>t!==e)},addIncludeResponseCode(){if(""===this.formAddIncludeResponseCode)return;const e=this.formData.lnbits_audit_http_response_codes;e.includes(this.formAddIncludeResponseCode)||(this.formData.lnbits_audit_http_response_codes=[...e,this.formAddIncludeResponseCode]),this.formAddIncludeResponseCode=""},removeIncludeResponseCode(e){this.formData.lnbits_audit_http_response_codes=this.formData.lnbits_audit_http_response_codes.filter(t=>t!==e)}}}),window.app.component("lnbits-wallet-charts",{template:"#lnbits-wallet-charts",props:["paymentFilter","chartConfig"],data:()=>({debounceTimeoutValue:1337,debounceTimeout:null,chartData:[],chartDataPointCount:0,walletBalanceChart:null,walletBalanceInOut:null,walletPaymentInOut:null,colorPrimary:Quasar.colors.changeAlpha(Quasar.colors.getPaletteColor("primary"),.3),colorSecondary:Quasar.colors.changeAlpha(Quasar.colors.getPaletteColor("secondary"),.3),barOptions:{responsive:!0,maintainAspectRatio:!1,scales:{x:{stacked:!0},y:{stacked:!0}}}}),watch:{paymentFilter:{deep:!0,handler(){this.changeCharts()}},chartConfig:{deep:!0,handler(e){this.$q.localStorage.setItem("lnbits.wallets.chartConfig",e),this.changeCharts()}}},methods:{changeCharts(){this.debounceTimeout&&clearTimeout(this.debounceTimeout),this.debounceTimeout=setTimeout(async()=>{await this.fetchChartData(),this.drawCharts()},this.debounceTimeoutValue)},filterChartData(){const e=this.paymentFilter["time[ge]"]+"T00:00:00",t=this.paymentFilter["time[le]"]+"T23:59:59";let a=0,s=this.chartData.map(e=>void 0!==this.paymentFilter["amount[ge]"]?(a+=e.balance_in,{...e,balance:a,balance_out:0,count_out:0}):void 0!==this.paymentFilter["amount[le]"]?(a-=e.balance_out,{...e,balance:a,balance_in:0,count_in:0}):{...e});s=s.filter(a=>this.paymentFilter["time[ge]"]&&this.paymentFilter["time[le]"]?a.date>=e&&a.date<=t:this.paymentFilter["time[ge]"]?a.date>=e:!this.paymentFilter["time[le]"]||a.date<=t);const i=s.map(e=>new Date(e.date).toLocaleString("default",{month:"short",day:"numeric"}));return this.chartDataPointCount=s.length,{data:s,labels:i}},drawBalanceInOutChart(e,t){this.walletBalanceInOut&&this.walletBalanceInOut.destroy();const a=this.$refs.walletBalanceInOut;a&&(this.walletBalanceInOut=new Chart(a.getContext("2d"),{type:"bar",options:this.barOptions,data:{labels:t,datasets:[{label:"Balance In",borderRadius:5,data:e.map(e=>e.balance_in),backgroundColor:this.colorPrimary},{label:"Balance Out",borderRadius:5,data:e.map(e=>e.balance_out),backgroundColor:this.colorSecondary}]}}))},drawPaymentInOut(e,t){this.walletPaymentInOut&&this.walletPaymentInOut.destroy();const a=this.$refs.walletPaymentInOut;a&&(this.walletPaymentInOut=new Chart(a.getContext("2d"),{type:"bar",options:this.barOptions,data:{labels:t,datasets:[{label:"Payments In",data:e.map(e=>e.count_in),backgroundColor:this.colorPrimary},{label:"Payments Out",data:e.map(e=>-e.count_out),backgroundColor:this.colorSecondary}]}}))},drawBalanceChart(e,t){this.walletBalanceChart&&this.walletBalanceChart.destroy();const a=this.$refs.walletBalanceChart;a&&(this.walletBalanceChart=new Chart(a.getContext("2d"),{type:"line",options:{responsive:!0,maintainAspectRatio:!1},data:{labels:t,datasets:[{label:"Balance",data:e.map(e=>e.balance),pointStyle:!1,backgroundColor:this.colorPrimary,borderColor:this.colorPrimary,borderWidth:2,fill:!0,tension:.7,fill:1},{label:"Fees",data:e.map(e=>e.fee),pointStyle:!1,backgroundColor:this.colorSecondary,borderColor:this.colorSecondary,borderWidth:1,fill:!0,tension:.7,fill:1}]}}))},drawCharts(){const{data:e,labels:t}=this.filterChartData();this.chartConfig.showBalanceChart&&this.drawBalanceChart(e,t),this.chartConfig.showBalanceInOutChart&&this.drawBalanceInOutChart(e,t),this.chartConfig.showPaymentInOutChart&&this.drawPaymentInOut(e,t)},async fetchChartData(){try{const{data:e}=await LNbits.api.request("GET",`/api/v1/payments/stats/daily?wallet_id=${this.g.wallet.id}`);this.chartData=e}catch(e){console.warn(e),LNbits.utils.notifyApiError(e)}}},async created(){await this.fetchChartData(),this.drawCharts()}}),window.app.component("lnbits-wallet-api-docs",{template:"#lnbits-wallet-api-docs",methods:{resetKeys(){LNbits.utils.confirmDialog("Are you sure you want to reset your API keys?").onOk(()=>{LNbits.api.resetWalletKeys(this.g.wallet).then(e=>{const{id:t,adminkey:a,inkey:s}=e;this.g.wallet={...this.g.wallet,inkey:s,adminkey:a};const i=this.g.user.wallets.findIndex(e=>e.id===t);-1!==i&&(this.g.user.wallets[i]={...this.g.user.wallets[i],inkey:s,adminkey:a}),Quasar.Notify.create({timeout:3500,type:"positive",message:"API keys reset!"})}).catch(e=>{LNbits.utils.notifyApiError(e)})})}},data:()=>({origin:window.location.origin,inkeyHidden:!0,adminkeyHidden:!0,walletIdHidden:!0})}),window.app.component("lnbits-wallet-icon",{template:"#lnbits-wallet-icon",data:()=>({icon:{show:!1,data:{},colorOptions:["primary","purple","orange","green","brown","blue","red","pink"],options:["home","star","bolt","paid","savings","store","videocam","music_note","flight","train","directions_car","school","construction","science","sports_esports","sports_tennis","theaters","water","headset_mic","videogame_asset","person","group","pets","sunny","elderly","verified","snooze","mail","forum","shopping_cart","shopping_bag","attach_money","print_connect","dark_mode","light_mode","android","network_wifi","shield","fitness_center","lunch_dining"]}}),methods:{setSelectedIcon(e){this.icon.data.icon=e},setSelectedColor(e){this.icon.data.color=e},setIcon(){this.$emit("update-wallet",this.icon.data),this.icon.show=!1}}}),window.app.component("lnbits-wallet-new",{template:"#lnbits-wallet-new",data:()=>({walletTypes:[{label:"Lightning Wallet",value:"lightning"}],wallet:{name:"",sharedWalletId:""},showNewWalletDialog:!1}),watch:{"g.newWalletType"(e){null!==e&&(this.showNewWalletDialog=!0)},showNewWalletDialog(e){!0!==e&&this.reset()}},computed:{isLightning(){return"lightning"===this.g.newWalletType},isLightningShared(){return"lightning-shared"===this.g.newWalletType},inviteWalletOptions(){return(this.g.user?.extra?.wallet_invite_requests||[]).map(e=>({label:`${e.to_wallet_name} (from ${e.from_user_name})`,value:e.to_wallet_id}))}},methods:{reset(){this.showNewWalletDialog=!1,this.g.newWalletType=null,this.wallet={name:"",sharedWalletId:""}},async submitRejectWalletInvitation(){try{const e=this.g.user.extra.wallet_invite_requests||[],t=e.find(e=>e.to_wallet_id===this.wallet.sharedWalletId);if(!t)return void Quasar.Notify.create({message:"Cannot find invitation for the selected wallet.",type:"warning"});await LNbits.api.request("DELETE",`/api/v1/wallet/share/invite/${t.request_id}`,this.g.wallet.adminkey),Quasar.Notify.create({message:"Invitation rejected.",type:"positive"}),this.g.user.extra.wallet_invite_requests=e.filter(e=>e.request_id!==t.request_id)}catch(e){LNbits.utils.notifyApiError(e)}},submitAddWallet(){const e=this.wallet;"lightning"!==this.g.newWalletType||e.name?"lightning-shared"!==this.g.newWalletType||e.sharedWalletId?LNbits.api.createWallet(e.name,this.g.newWalletType,{shared_wallet_id:e.sharedWalletId}).then(e=>{this.$q.notify({message:"Wallet created successfully",color:"positive"}),this.reset(),this.g.user.wallets.push(LNbits.map.wallet(e.data)),this.g.lastWalletId=e.data.id,this.$router.push(`/wallet/${e.data.id}`)}).catch(LNbits.utils.notifyApiError):this.$q.notify({message:"Missing a shared wallet ID",color:"warning"}):this.$q.notify({message:"Please enter a name for the wallet",color:"warning"})}},created(){this.g.user?.extra?.wallet_invite_requests?.length&&this.walletTypes.push({label:`Lightning Wallet (Share Invite: ${this.g.user.extra.wallet_invite_requests.length})`,value:"lightning-shared"})}}),window.app.component("lnbits-wallet-share",{template:"#lnbits-wallet-share",computed:{walletApprovedShares(){return this.g.wallet.extra.shared_with.filter(e=>"approved"===e.status)},walletPendingRequests(){return this.g.wallet.extra.shared_with.filter(e=>"request_access"===e.status)},walletPendingInvites(){return this.g.wallet.extra.shared_with.filter(e=>"invite_sent"===e.status)}},data:()=>({permissionOptions:[{label:"View",value:"view-payments"},{label:"Receive",value:"receive-payments"},{label:"Send",value:"send-payments"}],walletShareInvite:{username:"",permissions:[]}}),methods:{async updateSharePermissions(e){try{const{data:t}=await LNbits.api.request("PUT","/api/v1/wallet/share",this.g.wallet.adminkey,e);Object.assign(e,t),Quasar.Notify.create({message:"Wallet permission updated.",type:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}},async inviteUserToWallet(){try{const{data:e}=await LNbits.api.request("PUT","/api/v1/wallet/share/invite",this.g.wallet.adminkey,{...this.walletShareInvite,status:"invite_sent",wallet_id:this.g.wallet.id});this.g.wallet.extra.shared_with.push(e),this.walletShareInvite={username:"",permissions:[]},Quasar.Notify.create({message:"User invited to wallet.",type:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}},deleteSharePermission(e){LNbits.utils.confirmDialog("Are you sure you want to remove this share permission?").onOk(async()=>{try{await LNbits.api.request("DELETE",`/api/v1/wallet/share/${e.request_id}`,this.g.wallet.adminkey),this.g.wallet.extra.shared_with=this.g.wallet.extra.shared_with.filter(t=>t.wallet_id!==e.wallet_id),Quasar.Notify.create({message:"Wallet permission deleted.",type:"positive"})}catch(e){LNbits.utils.notifyApiError(e)}})}}}),window.app.component("lnbits-wallet-paylinks",{template:"#lnbits-wallet-paylinks",data:()=>({storedPaylinks:[]}),watch:{"g.wallet"(e){this.storedPaylinks=e.storedPaylinks??[]}},created(){this.storedPaylinks=this.g.wallet.storedPaylinks},methods:{updatePaylinks(){LNbits.api.request("PUT",`/api/v1/wallet/stored_paylinks/${this.g.wallet.id}`,this.g.wallet.adminkey,{links:this.storedPaylinks}).then(()=>{this.$q.notify({message:"Paylinks updated.",type:"positive",timeout:3500})}).catch(e=>{LNbits.utils.notifyApiError(e)})},sendToPaylink(e){this.$emit("send-lnurl",e)},editPaylink(){this.$nextTick(()=>{this.updatePaylinks()})},deletePaylink(e){const t=[];this.storedPaylinks.forEach(a=>{a.lnurl!==e&&t.push(a)}),this.storedPaylinks=t,this.updatePaylinks()}}}),window.app.component("lnbits-wallet-extra",{template:"#lnbits-wallet-extra",props:["chartConfig"],computed:{exportUrl(){return`${window.location.origin}/wallet?usr=${this.g.user.id}&wal=${this.g.wallet.id}`}},methods:{handleSendLnurl(e){this.$emit("send-lnurl",e)},updateWallet(e){this.$emit("update-wallet",e)},handleFiatTracking(){this.g.fiatTracking=!this.g.fiatTracking,this.g.fiatTracking?(this.updateWallet({currency:this.g.wallet.currency}),this.updateFiatBalance()):(this.g.isFiatPriority=!1,this.g.wallet.currency="",this.updateWallet({currency:""}))},deleteWallet(){LNbits.utils.confirmDialog("Are you sure you want to delete this wallet?").onOk(()=>{LNbits.api.deleteWallet(this.g.wallet).then(()=>{this.g.user.wallets=this.g.user.wallets.filter(e=>e.id!==this.g.wallet.id),this.g.lastActiveWallet=this.g.user.wallets[0].id,this.$router.push(`/wallet/${this.g.lastActiveWallet}`),Quasar.Notify.create({timeout:3e3,message:"Wallet deleted!",spinner:!0})}).catch(e=>{LNbits.utils.notifyApiError(e)})})},updateFiatBalance(){this.$q.localStorage.getItem("lnbits.exchangeRate."+this.g.wallet.currency)&&(this.g.exchangeRate=this.$q.localStorage.getItem("lnbits.exchangeRate."+this.g.wallet.currency),this.g.fiatBalance=this.g.exchangeRate/1e8*this.g.wallet.sat),LNbits.api.request("GET","/api/v1/rate/"+this.g.wallet.currency,null).then(e=>{this.g.fiatBalance=e.data.price/1e8*this.g.wallet.sat,this.g.exchangeRate=e.data.price.toFixed(2),this.g.fiatTracking=!0,this.$q.localStorage.set("lnbits.exchangeRate."+this.g.wallet.currency,this.g.exchangeRate),this.g.exchangeRate<=0&&(this.g.fiatTracking=!1,this.g.isFiatPriority=!1)}).catch(e=>console.error(e))}},created(){""!==this.g.wallet.currency&&this.g.isSatsDenomination?(this.g.fiatTracking=!0,this.updateFiatBalance()):this.g.fiatTracking=!1}}),window.app.component("lnbits-home-logos",{template:"#lnbits-home-logos",data:()=>({logos:[{href:"https://github.com/ElementsProject/lightning",lightSrc:"/static/images/clnl.png",darkSrc:"/static/images/cln.png"},{href:"https://github.com/lightningnetwork/lnd",lightSrc:"/static/images/lnd.png",darkSrc:"/static/images/lnd.png"},{href:"https://opennode.com",lightSrc:"/static/images/opennodel.png",darkSrc:"/static/images/opennode.png"},{href:"https://lnpay.co/",lightSrc:"/static/images/lnpayl.png",darkSrc:"/static/images/lnpay.png"},{href:"https://github.com/rootzoll/raspiblitz",lightSrc:"/static/images/blitzl.png",darkSrc:"/static/images/blitz.png"},{href:"https://start9.com/",lightSrc:"/static/images/start9l.png",darkSrc:"/static/images/start9.png"},{href:"https://getumbrel.com/",lightSrc:"/static/images/umbrell.png",darkSrc:"/static/images/umbrel.png"},{href:"https://mynodebtc.com",lightSrc:"/static/images/mynodel.png",darkSrc:"/static/images/mynode.png"},{href:"https://github.com/shesek/spark-wallet",lightSrc:"/static/images/sparkl.png",darkSrc:"/static/images/spark.png"},{href:"https://voltage.cloud",lightSrc:"/static/images/voltagel.png",darkSrc:"/static/images/voltage.png"},{href:"https://breez.technology/sdk/",lightSrc:"/static/images/breezl.png",darkSrc:"/static/images/breez.png"},{href:"https://blockstream.com/lightning/greenlight/",lightSrc:"/static/images/greenlightl.png",darkSrc:"/static/images/greenlight.png"},{href:"https://getalby.com",lightSrc:"/static/images/albyl.png",darkSrc:"/static/images/alby.png"},{href:"https://zbd.gg",lightSrc:"/static/images/zbdl.png",darkSrc:"/static/images/zbd.png"},{href:"https://phoenix.acinq.co/server",lightSrc:"/static/images/phoenixdl.png",darkSrc:"/static/images/phoenixd.png"},{href:"https://boltz.exchange/",lightSrc:"/static/images/boltzl.svg",darkSrc:"/static/images/boltz.svg"},{href:"https://www.blink.sv/",lightSrc:"/static/images/blink_logol.png",darkSrc:"/static/images/blink_logo.png"}]}),computed:{showLogos(){return this.g.isSatsDenomination&&"LNbits"==this.g.settings.siteTitle&&1==this.g.settings.showHomePageElements}}}),window.app.component("lnbits-error",{template:"#lnbits-error",props:["dynamic","code","message"],computed:{isExtension(){return 403==this.code&&(!!this.message.startsWith("Extension ")||void 0)}},methods:{goBack(){window.history.back()},goHome(){window.location="/"},goToWallet(){this.dynamic?this.$router.push("/wallet"):window.location="/wallet"},goToExtension(){const e=`/extensions#${this.message.match(/'([^']+)'/)[1]}`;this.dynamic?this.$router.push(e):window.location=e},async logOut(){try{await LNbits.api.logout(),window.location="/"}catch(e){LNbits.utils.notifyApiError(e)}}},async created(){if(!this.dynamic&&401==this.code)return console.warn(`Unauthorized: ${this.errorMessage}`),void this.logOut()}}),window.app.component("lnbits-qrcode",{template:"#lnbits-qrcode",components:{QrcodeVue:QrcodeVue.default},props:{value:{type:String,required:!0},nfc:{type:Boolean,default:!1},print:{type:Boolean,default:!1},showButtons:{type:Boolean,default:!0},href:{type:String,default:""},margin:{type:Number,default:3},maxWidth:{type:Number,default:450},logo:{type:String,default:window.g.settings.qrLogo||null}},data:()=>({nfcTagWriting:!1,nfcSupported:"undefined"!=typeof NDEFReader}),methods:{printQrCode(){const e=this.$refs.qrCode.$el.outerHTML,t=window.open("","_blank");t.document.write(`\n \n \n Print QR Code\n \n \n ${e}\n \n `),t.document.close(),t.focus(),t.print(),t.close()},clickQrCode(e){if(""===this.href)return this.utils.copyText(this.value),e.preventDefault(),e.stopPropagation(),!1},async writeNfcTag(){try{if(!this.nfcSupported)throw{toString:function(){return"NFC not supported on this device or browser."}};const e=new NDEFReader;this.nfcTagWriting=!0,this.$q.notify({message:"Tap your NFC tag to write the LNURL-withdraw link to it."}),await e.write({records:[{recordType:"url",data:this.value,lang:"en"}]}),this.nfcTagWriting=!1,this.$q.notify({type:"positive",message:"NFC tag written successfully."})}catch(e){this.nfcTagWriting=!1,this.$q.notify({type:"negative",message:e?e.toString():"An unexpected error has occurred."})}},downloadSVG(){const e=this.$refs.qrCode.$el;if(!e)return void console.error("SVG element not found");let t=(new XMLSerializer).serializeToString(e);t.match(/^]+xmlns="http:\/\/www\.w3\.org\/2000\/svg"/)||(t=t.replace(/^({tab:"bech32",lnurl:""}),methods:{setLnurl(){if("bech32"==this.tab){const e=(new TextEncoder).encode(this.url),t=NostrTools.nip19.encodeBytes("lnurl",e);this.lnurl=this.href&&""!==this.href.trim()?`${this.href}?lightning=${t.toUpperCase()}`:`lightning:${t.toUpperCase()}`}else"lud17"==this.tab&&(this.url.startsWith("http://")?this.lnurl=this.url.replace("http://",this.prefix+"://"):this.lnurl=this.url.replace("https://",this.prefix+"://"));this.$emit("update:lnurl",this.lnurl)}},watch:{url(){this.setLnurl()},tab(){this.setLnurl()}},created(){this.setLnurl()}}),window.app.component("lnbits-disclaimer",{template:"#lnbits-disclaimer",computed:{showDisclaimer:()=>!g.disclaimerShown&&g.isUserAuthorized}}),window.app.component("lnbits-footer",{template:"#lnbits-footer",computed:{title(){return`${this.g.settings.siteTitle}, ${this.g.settings.siteTagline}`},version(){return this.$t("lnbits_version")+": "+this.g.settings.version}}}),window.app.component("lnbits-header",{template:"#lnbits-header",computed:{showAdmin(){return this.g.user&&(this.g.user.super_user||this.g.user.admin)},displayName(){return this.g.user?.extra?.display_name||this.g.user.username||this.g.user?.extra?.first_name||"Anon"},displayRole(){return this.g.user?.super_user?"Super User":this.g.user?.admin?"Admin":"User"}},methods:{async stopImpersonation(){try{await LNbits.api.stopImpersonation(),LNbits.utils.restoreLocalStorage("impersonation"),window.location="/users"}catch(e){console.warn(e)}},async handleLanguageChanged(e){try{await LNbits.api.updateUiCustomization({locale:e.locale}),this.$q.notify({type:"positive",message:"Language Updated",caption:e.locale})}catch(e){LNbits.utils.notifyApiError(e)}}}}),window.app.component("lnbits-header-wallets",{template:"#lnbits-header-wallets"}),window.app.component("lnbits-drawer",{template:"#lnbits-drawer"}),window.app.component("lnbits-theme",{watch:{"g.walletFlip"(e){this.$q.localStorage.setItem("lnbits.walletFlip",e),!0===e&&this.$q.screen.lt.md&&(this.g.visibleDrawer=!1)},"g.disclaimerShown"(e){this.$q.localStorage.setItem("lnbits.disclaimerShown",e)},"g.locale"(e){this.$q.localStorage.setItem("lnbits.lang",e),window.i18n.global.locale=e},"g.isFiatPriority"(e){this.$q.localStorage.setItem("lnbits.isFiatPriority",e)},"g.reactionChoice"(e){this.$q.localStorage.set("lnbits.reactions",e)},"g.themeChoice"(e){document.body.setAttribute("data-theme",e),this.$q.localStorage.set("lnbits.theme",e)},"g.darkChoice"(e){this.$q.dark.set(e),this.$q.localStorage.set("lnbits.darkMode",e),Chart.defaults.color=this.$q.dark.isActive?"#fff":"#000"},"g.borderChoice"(e){document.body.classList.forEach(e=>{e.endsWith("-border")&&document.body.classList.remove(e)}),this.$q.localStorage.setItem("lnbits.border",e),document.body.classList.add(e)},"g.gradientChoice"(e){this.$q.localStorage.set("lnbits.gradientBg",e),!0===e?document.body.classList.add("gradient-bg"):document.body.classList.remove("gradient-bg")},"g.cardRoundedChoice"(e){this.$q.localStorage.set("lnbits.cardRounded",e),!0===e?document.body.classList.add("rounded-ui"):document.body.classList.remove("rounded-ui")},"g.cardGradientChoice"(e){this.$q.localStorage.set("lnbits.cardGradient",e),!0===e?document.body.classList.add("card-gradient"):document.body.classList.remove("card-gradient")},"g.cardShadowChoice"(e){this.$q.localStorage.set("lnbits.cardShadow",e),!0===e?document.body.classList.add("card-shadow"):document.body.classList.remove("card-shadow")},"g.burgerMenuChoice"(e){this.$q.localStorage.set("lnbits.burgerMenu",e),!0===e?document.body.classList.remove("no-burger-background"):document.body.classList.add("no-burger-background")},"g.mobileSimple"(e){this.$q.localStorage.set("lnbits.mobileSimple",e),!0===e?document.body.classList.add("mobile-simple"):document.body.classList.remove("mobile-simple")},"g.bgimageChoice"(e){this.$q.localStorage.set("lnbits.backgroundImage",e),""===e?document.body.classList.remove("bg-image"):(document.body.classList.add("bg-image"),document.body.style.setProperty("--background",`url(${e})`))}},methods:{async checkUrlParams(){const e=new URLSearchParams(window.location.search);if(0===e.length)return;if(e.has("theme")){const t=e.get("theme").trim().toLowerCase();this.g.themeChoice=t,e.delete("theme")}if(e.has("border")){const t=e.get("border").trim().toLowerCase();this.g.borderChoice=t,e.delete("border")}if(e.has("gradient")){const t=e.get("gradient").toLowerCase();this.g.gradientChoice="1"===t||"true"===t,e.delete("gradient")}if(e.has("dark")){const t=e.get("dark").trim().toLowerCase();this.g.darkChoice="1"===t||"true"===t,e.delete("dark")}if(e.has("usr")){try{await LNbits.api.loginUsr(e.get("usr")),window.location.href="/wallet"}catch(e){LNbits.utils.notifyApiError(e)}e.delete("usr")}const t=e.size?`?${e.toString()}`:"",a=window.location.pathname+t;window.history.replaceState(null,null,a)}},created(){this.$q.dark.set(this.g.darkChoice),document.body.setAttribute("data-theme",this.g.themeChoice),Chart.defaults.color=this.$q.dark.isActive?"#fff":"#000",document.body.classList.add(this.g.borderChoice),!0===this.g.gradientChoice&&document.body.classList.add("gradient-bg"),!0===this.g.cardRoundedChoice&&document.body.classList.add("rounded-ui"),!0===this.g.cardGradientChoice&&document.body.classList.add("card-gradient"),!0===this.g.cardShadowChoice&&document.body.classList.add("card-shadow"),!0!==this.g.burgerMenuChoice&&document.body.classList.add("no-burger-background"),""!==this.g.bgimageChoice&&(document.body.classList.add("bg-image"),document.body.style.setProperty("--background",`url(${this.g.bgimageChoice})`)),!0===this.g.mobileSimple&&document.body.classList.add("mobile-simple"),Object.entries(this.g.user?.uiCustomization||{}).forEach(([e,t])=>{e in this.g&&(this.g[e]=t)}),this.checkUrlParams()}}),window.app.component("lnbits-qrcode-scanner",{template:"#lnbits-qrcode-scanner",props:["callback"],data:()=>({showScanner:!1}),watch:{callback(e){return null===e?this.reset():"function"!=typeof e?(Quasar.Notify.create({message:"QR code scanner callback is not a function.",type:"negative"}),this.reset()):!1===this.g.hasCamera?(Quasar.Notify.create({message:"No camera found on this device.",type:"negative"}),this.reset()):void(this.showScanner=!0)}},methods:{reset(){this.showScanner=!1,this.g.scanner=null},detect(e){const t=e[0].rawValue;console.log("Detected QR code value:",t),this.callback(t),this.$emit("detect",t),this.reset()},async onInitQR(e){try{await e}catch(e){const t={NotAllowedError:"ERROR: you need to grant camera access permission",NotFoundError:"ERROR: no camera on this device",NotSupportedError:"ERROR: secure context required (HTTPS, localhost)",NotReadableError:"ERROR: is the camera already in use?",OverconstrainedError:"ERROR: installed cameras are not suitable",StreamApiNotSupportedError:"ERROR: Stream API is not supported in this browser",InsecureContextError:"ERROR: Camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP."},a=Object.keys(t).filter(t=>e.name===t),s=a?t[a]:`ERROR: Camera error (${e.name})`;Quasar.Notify.create({message:s,type:"negative"}),this.g.hasCamera=!1,this.reset()}}}}),window.app.component("lnbits-manage-extension-list",{template:"#lnbits-manage-extension-list",data:()=>({extensions:[],userExtensions:[],searchTerm:""}),watch:{"g.user.extensions"(){this.loadExtensions()},searchTerm(){this.filterUserExtensionsByTerm()}},methods:{async loadExtensions(){try{res=await LNbits.api.request("GET","/api/v1/extension"),this.extensions=res.data.sort((e,t)=>e.name.localeCompare(t.name)),this.filterUserExtensionsByTerm()}catch(e){LNbits.utils.notifyApiError(e)}},filterUserExtensionsByTerm(){const e=this.g.user.extensions;this.userExtensions=this.extensions.filter(t=>e.includes(t.code)).filter(e=>""===this.searchTerm||`${e.code} ${e.name} ${e.short_description} ${e.url}`.toLocaleLowerCase().includes(this.searchTerm.toLocaleLowerCase()))}},async created(){await this.loadExtensions()}}),window.app.component("lnbits-manage-wallet-list",{template:"#lnbits-manage-wallet-list",data:()=>({activeWalletId:null}),computed:{maxWallets(){return this.g.user?.extra?.visible_wallet_count||10}},watch:{$route(e){e.path.startsWith("/wallet/")?this.activeWalletId=e.params.id:this.activeWalletId=null},"g.user.wallets":{handler(){this.paymentEvents()},deep:!0,immediate:!0}},created(){this.g.user&&0===this.g.walletEventListeners.length&&this.paymentEvents()},methods:{openNewWalletDialog(){this.g.user.walletInvitesCount?this.g.newWalletType="lightning-shared":this.g.newWalletType="lightning"},onWebsocketMessage(e){const t=JSON.parse(e.data);t.payment?(this.g.user.wallets.forEach(e=>{e.id===t.payment.wallet_id&&(e.sat=t.wallet_balance)}),this.g.wallet.id===t.payment.wallet_id&&(this.g.wallet.sat=t.wallet_balance,this.g.updatePayments=!this.g.updatePayments,this.g.updatePaymentsHash=!this.g.updatePaymentsHash),t.payment.amount>0&&eventReaction(1e3*t.wallet_balance)):console.error("ws message no payment",t)},paymentEvents(){if(!this.g.user)return;let e;this.g.user.wallets.slice(0,this.maxWallets).forEach(t=>{if(!this.g.walletEventListeners.includes(t.id)){this.g.walletEventListeners.push(t.id);const a=new WebSocket(`${websocketUrl}/${t.inkey}`);a.onmessage=this.onWebsocketMessage,a.onopen=()=>console.log("ws connected for wallet",t.id),a.onclose=()=>{console.log("ws closed, reconnecting...",t.id),this.g.walletEventListeners=this.g.walletEventListeners.filter(e=>e!==t.id),clearTimeout(e),e=setTimeout(this.paymentEvents,5e3)},a.onerror=()=>{console.warn("ws error, reconnecting...",t.id),this.g.walletEventListeners=this.g.walletEventListeners.filter(e=>e!==t.id),clearTimeout(e),e=setTimeout(this.paymentEvents,5e3)}}})}}}),window.app.component("lnbits-language-dropdown",{template:"#lnbits-language-dropdown",computed:{currentLanguage(){return this.langs.find(e=>e.value===window.i18n.global.locale)||{value:"en",label:"English",display:"🇬🇧 EN"}}},methods:{activeLanguage:e=>window.i18n.global.locale===e,changeLanguage(e){this.g.locale=e,window.i18n.global.locale=e,this.$q.localStorage.set("lnbits.lang",e),this.$emit("language-changed",e)}},data:()=>({langs:[{value:"en",label:"English",display:"🇬🇧 EN"},{value:"de",label:"Deutsch",display:"🇩🇪 DE"},{value:"es",label:"Español",display:"🇪🇸 ES"},{value:"jp",label:"日本語",display:"🇯🇵 JP"},{value:"cn",label:"中文",display:"🇨🇳 CN"},{value:"fr",label:"Français",display:"🇫🇷 FR"},{value:"it",label:"Italiano",display:"🇮🇹 IT"},{value:"pi",label:"Pirate",display:"🏴‍☠️ PI"},{value:"nl",label:"Nederlands",display:"🇳🇱 NL"},{value:"we",label:"Cymraeg",display:"🏴󠁧󠁢󠁷󠁬󠁳󠁿 CY"},{value:"pl",label:"Polski",display:"🇵🇱 PL"},{value:"pt",label:"Português",display:"🇵🇹 PT"},{value:"br",label:"Português do Brasil",display:"🇧🇷 BR"},{value:"cs",label:"Česky",display:"🇨🇿 CS"},{value:"sk",label:"Slovensky",display:"🇸🇰 SK"},{value:"kr",label:"한국어",display:"🇰🇷 KR"},{value:"fi",label:"Suomi",display:"🇫🇮 FI"}]})}),window.app.component("lnbits-payment-list",{template:"#lnbits-payment-list",props:["wallet","paymentFilter"],data(){return{payments:[],paymentsTable:{columns:[{name:"time",align:"left",label:this.$t("memo")+"/"+this.$t("date"),field:"date",sortable:!0},{name:"amount",align:"right",label:this.$t("amount"),field:"sat",sortable:!0}],pagination:{rowsPerPage:10,page:1,sortBy:"time",descending:!0,rowsNumber:10},sortFields:[{name:"amount",label:"Amount"},{name:"fee",label:"Fee"},{name:"memo",label:"Memo"},{name:"time",label:"Creation Date"},{name:"updated_at",label:"Last Updated"}],search:"",loading:!1},searchDate:{from:null,to:null},searchStatus:{success:!0,pending:!0,failed:!1,incoming:!0,outgoing:!0},exportTagName:"",exportPaymentTagList:[],paymentsCSV:{columns:[{name:"status",align:"right",label:this.$t("status"),field:"status"},{name:"memo",align:"left",label:this.$t("memo"),field:"memo"},{name:"time",align:"left",label:this.$t("date"),field:"date",sortable:!0},{name:"amount",align:"right",label:this.$t("amount"),field:"sat",sortable:!0},{name:"fee",align:"right",label:this.$t("fee"),field:"fee"},{name:"tag",align:"right",label:this.$t("tag"),field:"tag"},{name:"payment_hash",align:"right",label:this.$t("payment_hash"),field:"payment_hash"},{name:"payment_proof",align:"right",label:this.$t("payment_proof"),field:"payment_proof"},{name:"webhook",align:"right",label:this.$t("webhook"),field:"webhook"},{name:"fiat_currency",align:"right",label:"Fiat Currency",field:e=>e.extra.wallet_fiat_currency},{name:"fiat_amount",align:"right",label:"Fiat Amount",field:e=>e.extra.wallet_fiat_amount}],preimage:null,loading:!1},hodlInvoice:{show:!1,payment:null,preimage:null},selectedPayment:null,filterLabels:[]}},computed:{filteredPayments(){const e=this.paymentsTable.search;return e&&""!==e?LNbits.utils.search(this.payments,e):this.payments},paymentsOmitter(){return this.$q.screen.lt.md&&this.g.mobileSimple?this.payments.length>0?[this.payments[0]]:[]:this.payments},pendingPaymentsExist(){return-1!==this.payments.findIndex(e=>e.pending)}},methods:{mapPayment(e){const t={checking_id:e.checking_id,status:e.status,amount:e.amount,fee:e.fee,memo:e.memo,time:e.time,bolt11:e.bolt11,preimage:e.preimage,payment_hash:e.payment_hash,expiry:e.expiry,extra:e.extra??{},wallet_id:e.wallet_id,webhook:e.webhook,webhook_status:e.webhook_status,fiat_amount:e.fiat_amount,fiat_currency:e.fiat_currency,labels:e.labels};t.date=this.utils.formatDate(e.created_at),t.dateFrom=this.utils.formatDateFrom(e.created_at),t.expirydate=this.utils.formatDate(e.expiry),t.expirydateFrom=this.utils.formatDateFrom(e.expiry),t.msat=t.amount,t.sat=t.msat/1e3,t.tag=t.extra?.tag,t.fsat=this.utils.formatSat(t.sat),t.isIn=t.amount>0,t.isOut=t.amount<0,t.isPending="pending"===t.status,t.isPaid="success"===t.status,t.isFailed="failed"===t.status,t._q=[t.memo,t.sat].join(" ").toLowerCase();try{t.details=JSON.parse(e.extra?.details||"{}")}catch{t.details={extraDetails:e.extra?.details}}return t},searchByDate(){"string"==typeof this.searchDate&&(this.searchDate={from:this.searchDate,to:this.searchDate}),this.searchDate.from&&(this.paymentFilter["time[ge]"]=this.searchDate.from+"T00:00:00"),this.searchDate.to&&(this.paymentFilter["time[le]"]=this.searchDate.to+"T23:59:59"),this.fetchPayments()},searchByLabels(e){e&&0!==e.length?(this.filterLabels=e,this.paymentsTable.filter["labels[every]"]=e,this.fetchPayments()):this.clearLabelSeach()},clearDateSeach(){this.searchDate={from:null,to:null},delete this.paymentFilter["time[ge]"],delete this.paymentFilter["time[le]"],this.fetchPayments()},clearLabelSeach(){this.filterLabels=[],delete this.paymentsTable.filter["labels[every]"],this.fetchPayments()},fetchPayments(e){this.paymentsTable.loading=!0;const t=LNbits.utils.prepareFilterQuery(this.paymentsTable,e,this.paymentFilter);return LNbits.api.getPayments(this.wallet,t).then(e=>{this.paymentsTable.pagination.rowsNumber=e.data.total,this.payments=e.data.data.map(this.mapPayment),this.paymentsTable.loading=!1,this.recheckPendingPayments()}).catch(e=>{this.paymentsTable.loading=!1,g.user.admin?this.fetchPaymentsAsAdmin(this.wallet.id,t):LNbits.utils.notifyApiError(e)})},sortByColumn(e){this.paymentsTable.pagination.sortBy===e?this.paymentsTable.pagination.descending=!this.paymentsTable.pagination.descending:(this.paymentsTable.pagination.sortBy=e,this.paymentsTable.pagination.descending=!1),this.fetchPayments()},fetchPaymentsAsAdmin(e,t){return t=(t||"")+"&wallet_id="+e,LNbits.api.request("GET","/api/v1/payments/all/paginated?"+t).then(e=>{this.paymentsTable.loading=!1,this.paymentsTable.pagination.rowsNumber=e.data.total,this.payments=e.data.data.map(this.mapPayment)}).catch(e=>{this.paymentsTable.loading=!1,LNbits.utils.notifyApiError(e)})},checkPayment(e){LNbits.api.getPayment(this.wallet,e).then(e=>{this.update=!this.update,"success"==e.data.status&&Quasar.Notify.create({type:"positive",message:this.$t("payment_successful")}),"pending"==e.data.status&&Quasar.Notify.create({type:"info",message:this.$t("payment_pending")})}).catch(LNbits.utils.notifyApiError)},recheckPendingPayments(){const e=this.payments.filter(e=>"pending"===e.status);if(0===e.length)return;const t=["recheck_pending=true","checking_id[in]="+e.map(e=>e.checking_id).join(",")].join("&");LNbits.api.getPayments(this.wallet,t).then(e=>{let t=0;e.data.data.forEach(e=>{if("pending"!==e.status){const a=this.payments.findIndex(t=>t.checking_id===e.checking_id);-1!==a&&(this.payments.splice(a,1,this.mapPayment(e)),t+=1)}}),t>0&&Quasar.Notify.create({type:"positive",message:this.$t("payment_successful")})}).catch(e=>{console.warn(e)})},showHoldInvoiceDialog(e){this.hodlInvoice.show=!0,this.hodlInvoice.preimage="",this.hodlInvoice.payment=e},cancelHoldInvoice(e){LNbits.api.cancelInvoice(this.wallet,e).then(()=>{this.update=!this.update,Quasar.Notify.create({type:"positive",message:this.$t("invoice_cancelled")})}).catch(LNbits.utils.notifyApiError)},settleHoldInvoice(e){LNbits.api.settleInvoice(this.wallet,e).then(()=>{this.update=!this.update,Quasar.Notify.create({type:"positive",message:this.$t("invoice_settled")})}).catch(LNbits.utils.notifyApiError)},paymentTableRowKey:e=>e.payment_hash+e.amount,async exportCSV(e=!1){const t=this.paymentsTable.pagination,a=1e3;let s=[];this.paymentsCSV.loading=!0;try{for(let e=0;e<100;e++){const i={sortby:t.sortBy??"time",direction:t.descending?"desc":"asc",limit:a,offset:e*a},n=new URLSearchParams(i),l=await LNbits.api.getPayments(this.wallet,n),o=l.data.data||[];if(s=s.concat(o.map(this.mapPayment)),o.length=l.data.total)break}let i=this.paymentsCSV.columns;if(e){this.exportPaymentTagList.length&&(s=s.filter(e=>this.exportPaymentTagList.includes(e.tag)));const e=Object.keys(s.reduce((e,t)=>({...e,...t.details}),{})).map(e=>({name:e,align:"right",label:e.charAt(0).toUpperCase()+e.slice(1).replace(/([A-Z])/g," $1"),field:t=>t.details[e],format:e=>"object"==typeof e?JSON.stringify(e):e}));i=this.paymentsCSV.columns.concat(e)}LNbits.utils.exportCSV(i,s,this.wallet.name+"-payments")}catch(e){LNbits.utils.notifyApiError(e)}finally{this.paymentsCSV.loading=!1}},addFilterTag(){if(!this.exportTagName)return;const e=this.exportTagName.trim();this.exportPaymentTagList=this.exportPaymentTagList.filter(t=>t!==e),this.exportPaymentTagList.push(e),this.exportTagName=""},removeExportTag(e){this.exportPaymentTagList=this.exportPaymentTagList.filter(t=>t!==e)},formatCurrency(e,t){try{return LNbits.utils.formatCurrency(e,t)}catch(t){return console.error(t),`${e} ???`}},handleFilterChanged(){const{success:e,pending:t,failed:a,incoming:s,outgoing:i}=this.searchStatus;let n=this.paymentFilter||{};delete n["status[ne]"],delete n["status[eq]"],e&&t&&a||(e&&t?n["status[ne]"]="failed":e&&a?n["status[ne]"]="pending":a&&t?n["status[ne]"]="success":!e||t||a?!t||e||a?!a||e||t||(n["status[eq]"]="failed"):n["status[eq]"]="pending":n["status[eq]"]="success"),delete n["amount[ge]"],delete n["amount[le]"],s&&i||!s&&!i||(s&&!i?n["amount[ge]"]=0:i&&!s&&(n["amount[le]"]=0)),this.paymentFilter=n},async savePaymentLabels(e){if(this.selectedPayment)try{await LNbits.api.request("PUT",`/api/v1/payments/${this.selectedPayment.payment_hash}/labels`,this.wallet.adminkey,{labels:e});const t=this.payments.find(e=>e.checking_id===this.selectedPayment.checking_id);t&&(t.labels=[...e]),Quasar.Notify.create({type:"positive",message:this.$t("payment_labels_updated")})}catch(e){LNbits.utils.notifyApiError(e)}else Quasar.Notify.create({type:"warning",message:"No payment selected"})},isLightColor(e){try{return Quasar.colors.luminosity(e)>.5}catch(e){return console.warning(e),!1}}},watch:{"paymentsTable.search":{handler(){const e={};this.paymentsTable.search&&(e.search=this.paymentsTable.search),this.fetchPayments()}},"g.updatePayments"(){this.fetchPayments()}},created(){this.fetchPayments()}}),window.app.component("lnbits-label-selector",{template:"#lnbits-label-selector",props:["labels"],data:()=>({labelFilter:"",localLabels:[]}),methods:{toggleLabel(e){if(this.localLabels.includes(e.name)){const t=this.localLabels.indexOf(e.name);-1!==t&&this.localLabels.splice(t,1)}else this.localLabels.push(e.name)},saveLabels(){this.$emit("update:labels",this.localLabels)},clearLabels(){this.localLabels=[],this.saveLabels()}},created(){this.localLabels=[...this.labels]}}),window.app.component("lnbits-extension-settings-form",{name:"lnbits-extension-settings-form",template:"#lnbits-extension-settings-form",props:["options","adminkey","endpoint"],methods:{async updateSettings(){if(!this.settings)return Quasar.Notify.create({message:"No settings to update",type:"negative"});try{const{data:e}=await LNbits.api.request("PUT",this.endpoint,this.adminkey,this.settings);this.settings=e}catch(e){LNbits.utils.notifyApiError(e)}},async getSettings(){try{const{data:e}=await LNbits.api.request("GET",this.endpoint,this.adminkey);this.settings=e}catch(e){LNbits.utils.notifyApiError(e)}},async resetSettings(){LNbits.utils.confirmDialog("Are you sure you want to reset the settings?").onOk(async()=>{try{await LNbits.api.request("DELETE",this.endpoint,this.adminkey),await this.getSettings()}catch(e){LNbits.utils.notifyApiError(e)}})}},async created(){await this.getSettings()},data:()=>({settings:void 0})}),window.app.component("lnbits-extension-settings-btn-dialog",{template:"#lnbits-extension-settings-btn-dialog",name:"lnbits-extension-settings-btn-dialog",props:["options","adminkey","endpoint"],data:()=>({show:!1})}),window.app.component("lnbits-data-fields",{name:"lnbits-data-fields",template:"#lnbits-data-fields",props:["fields","hide-advanced"],data:()=>({fieldTypes:[{label:"Text",value:"str"},{label:"Integer",value:"int"},{label:"Float",value:"float"},{label:"Boolean",value:"bool"},{label:"Date Time",value:"datetime"},{label:"JSON",value:"json"},{label:"Wallet Select",value:"wallet"},{label:"Currency Select",value:"currency"}],fieldsTable:{columns:[{name:"name",align:"left",label:"Field Name",field:"name",sortable:!0},{name:"type",align:"left",label:"Type",field:"type",sortable:!1},{name:"label",align:"left",label:"UI Label",field:"label",sortable:!0},{name:"hint",align:"left",label:"UI Hint",field:"hint",sortable:!1},{name:"optional",align:"left",label:"Optional",field:"optional",sortable:!1}],pagination:{sortBy:"name",rowsPerPage:100,page:1,rowsNumber:100},search:null,hideEmpty:!0}}),methods:{addField:function(){this.fields.push({name:"field_name_"+(this.fields.length+1),type:"text",label:"",hint:"",optional:!0,sortable:!0,searchable:!0,editable:!0,fields:[]})},removeField:function(e){const t=this.fields.indexOf(e);t>-1&&this.fields.splice(t,1)}},async created(){this.hideAdvanced||this.fieldsTable.columns.push({name:"editable",align:"left",label:"UI Editable",field:"editable",sortable:!1},{name:"sortable",align:"left",label:"Sortable",field:"sortable",sortable:!1},{name:"searchable",align:"left",label:"Searchable",field:"searchable",sortable:!1})}}),window.app.component(QrcodeVue),window.app.component("lnbits-extension-rating",{template:"#lnbits-extension-rating",name:"lnbits-extension-rating",props:{rating:{type:Number,default:0},count:{type:Number,default:null},clickable:{type:Boolean,default:!1}},computed:{displayRating(){return Math.round(2*(this.rating||0))/2},hasData(){return null!==this.count&&void 0!==this.count}},methods:{handleClick(){this.clickable&&this.$emit("click")}}}),window.app.component("lnbits-manage",{template:"#lnbits-manage",methods:{isActive:e=>window.location.pathname===e},data:()=>({extensions:[]})}),window.app.component("lnbits-payment-details",{template:"#lnbits-payment-details",props:["payment"],computed:{hasPreimage(){return this.payment.preimage&&"0000000000000000000000000000000000000000000000000000000000000000"!==this.payment.preimage},hasExpiry(){return!!this.payment.expiry},hasSuccessAction(){return this.hasPreimage&&this.payment.extra&&this.payment.extra.success_action},webhookStatusColor(){return this.payment.webhook_status>=300||this.payment.webhook_status<0?"red-10":this.payment.webhook_status?"green-10":"cyan-7"},webhookStatusText(){return this.payment.webhook_status?this.payment.webhook_status:"not sent yet"},hasTag(){return this.payment.extra&&!!this.payment.extra.tag},extras(){if(!this.payment.extra)return[];let e=_.omit(this.payment.extra,["tag","success_action"]);return Object.keys(e).map(t=>({key:t,value:e[t]}))}}}),window.app.component("lnbits-lnurlpay-success-action",{template:"#lnbits-lnurlpay-success-action",props:["payment","success_action"],data(){return{decryptedValue:this.success_action.ciphertext}},mounted(){if("aes"!==this.success_action.tag)return null;this.utils.decryptLnurlPayAES(this.success_action,this.payment.preimage).then(e=>{this.decryptedValue=e})}}),window.app.component("lnbits-notifications-btn",{template:"#lnbits-notifications-btn",props:["pubkey"],data:()=>({isSupported:!1,isSubscribed:!1,isPermissionGranted:!1,isPermissionDenied:!1}),methods:{urlB64ToUint8Array(e){const t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),a=atob(t),s=new Uint8Array(a.length);for(let e=0;et!==e),this.$q.localStorage.set("lnbits.webpush.subscribedUsers",JSON.stringify(t))},isUserSubscribed(e){return(JSON.parse(this.$q.localStorage.getItem("lnbits.webpush.subscribedUsers"))||[]).includes(e)},subscribe(){this.isSupported&&!this.isPermissionDenied&&(Notification.requestPermission().then(e=>{this.isPermissionGranted="granted"===e,this.isPermissionDenied="denied"===e}).catch(console.log),navigator.serviceWorker.ready.then(e=>{navigator.serviceWorker.getRegistration().then(e=>{e.pushManager.getSubscription().then(t=>{if(null===t||!this.isUserSubscribed(this.g.user.id)){const t={applicationServerKey:this.urlB64ToUint8Array(this.pubkey),userVisibleOnly:!0};e.pushManager.subscribe(t).then(e=>{LNbits.api.request("POST","/api/v1/webpush",null,{subscription:JSON.stringify(e)}).then(e=>{this.saveUserSubscribed(e.data.user),this.isSubscribed=!0}).catch(LNbits.utils.notifyApiError)})}}).catch(console.log)})}))},unsubscribe(){navigator.serviceWorker.ready.then(e=>{e.pushManager.getSubscription().then(e=>{e&&LNbits.api.request("DELETE","/api/v1/webpush?endpoint="+btoa(e.endpoint),null).then(()=>{this.removeUserSubscribed(this.g.user.id),this.isSubscribed=!1}).catch(LNbits.utils.notifyApiError)})}).catch(console.log)},checkSupported(){let e="https:"===window.location.protocol,t="serviceWorker"in navigator,a="Notification"in window,s="PushManager"in window;return this.isSupported=e&&t&&a&&s,this.isSupported||console.log("Notifications disabled because requirements are not met:",{HTTPS:e,"Service Worker API":t,"Notification API":a,"Push API":s}),this.isSupported},async updateSubscriptionStatus(){await navigator.serviceWorker.ready.then(e=>{e.pushManager.getSubscription().then(e=>{this.isSubscribed=!!e&&this.isUserSubscribed(this.g.user.id)})}).catch(console.log)}},created(){this.isPermissionDenied="denied"===Notification.permission,this.checkSupported()&&this.updateSubscriptionStatus()}}),window.app.component("lnbits-dynamic-fields",{template:"#lnbits-dynamic-fields",props:["options","modelValue"],data:()=>({formData:null,rules:[e=>!!e||"Field is required"]}),methods:{applyRules(e){return e?this.rules:[]},buildData(e,t={}){return e.reduce((e,a)=>(a.options?.length?e[a.name]=this.buildData(a.options,t[a.name]):e[a.name]=t[a.name]??a.default,e),{})},handleValueChanged(){this.$emit("update:model-value",this.formData)}},created(){this.formData=this.buildData(this.options,this.modelValue)}}),window.app.component("lnbits-dynamic-chips",{template:"#lnbits-dynamic-chips",props:["modelValue"],data:()=>({chip:"",chips:[]}),methods:{addChip(){this.chip&&(this.chips.push(this.chip),this.chip="",this.$emit("update:model-value",this.chips.join(",")))},removeChip(e){this.chips.splice(e,1),this.$emit("update:model-value",this.chips.join(","))}},created(){"string"==typeof this.modelValue?this.chips=this.modelValue.split(","):this.chips=[...this.modelValue]}}),window.app.component("lnbits-update-balance",{template:"#lnbits-update-balance",props:["wallet_id","small_btn"],computed:{admin(){return!0===this.g.user?.super_user}},data:()=>({credit:0}),methods:{updateBalance(e){LNbits.api.updateBalance(e.value,this.wallet_id).then(t=>{if(!0!==t.data.success)throw new Error(t.data);credit=parseInt(e.value),Quasar.Notify.create({type:"positive",message:this.$t("credit_ok",{amount:credit}),icon:null}),this.credit=0,e.value=0,e.set()}).catch(LNbits.utils.notifyApiError)}}}),window.app.component("user-id-only",{template:"#user-id-only",props:{allowed_new_users:Boolean,authAction:String,authMethod:String,usr:String,wallet:String},data(){return{user:this.usr,walletName:this.wallet}},methods:{showLogin(e){this.$emit("show-login",e)},showRegister(e){this.$emit("show-register",e)},loginUsr(){this.$emit("update:usr",this.user),this.$emit("login-usr")},createWallet(){this.$emit("update:wallet",this.walletName),this.$emit("create-wallet")}},computed:{showInstantLogin(){return"username-password"!==this.authMethod||"register"!==this.authAction}},created(){}}),window.app.component("username-password",{template:"#username-password",props:{allowed_new_users:Boolean,authMethods:Array,authAction:String,username:String,password_1:String,password_2:String,invitationCode:String,resetKey:String},data(){return{oauth:["nostr-auth-nip98","google-auth","github-auth","keycloak-auth","oidc-auth"],username:this.userName,password:this.password_1,passwordRepeat:this.password_2,reset_key:this.resetKey,confirmationMethod:"code",confirmationEmail:"",confirmationCode:this.invitationCode||"",showConfirmationCode:!1,showPwd:!1,showPwdRepeat:!1}},methods:{login(){this.$emit("update:userName",this.username),this.$emit("update:password_1",this.password),this.$emit("login")},register(){this.$emit("update:userName",this.username),this.$emit("update:password_1",this.password),this.$emit("update:password_2",this.passwordRepeat),this.$emit("update:invitationCode",this.confirmationCode),this.$emit("register")},reset(){this.$emit("update:resetKey",this.reset_key),this.$emit("update:password_1",this.password),this.$emit("update:password_2",this.passwordRepeat),this.$emit("reset")},validateUsername:e=>new RegExp("^(?=[a-zA-Z0-9._]{2,20}$)(?!.*[_.]{2})[^_.].*[^_.]$").test(e),async signInWithNostr(){try{const e=await this.createNostrToken();if(!e)return;resp=await LNbits.api.loginByProvider("nostr",{Authorization:e},{}),window.location.href="/wallet"}catch(e){console.warn(e);const t=e?.response?.data?.detail||`${e}`;Quasar.Notify.create({type:"negative",message:"Failed to sign in with Nostr.",caption:t})}},async createNostrToken(){try{if(!window.nostr?.signEvent)return void Quasar.Notify.create({type:"negative",message:"No Nostr signing app detected.",caption:'Is "window.nostr" present?'});const e=`${window.location}nostr`,t="POST",a=await NostrTools.nip98.getToken(e,t,e=>async function(e){try{const{data:t}=await LNbits.api.getServerHealth();return e.created_at=t.server_time,await window.nostr.signEvent(e)}catch(e){console.error(e),Quasar.Notify.create({type:"negative",message:"Failed to sign nostr event.",caption:`${e}`})}}(e),!0);if(!await NostrTools.nip98.validateToken(a,e,t))throw new Error("Invalid signed token!");return a}catch(e){console.warn(e),Quasar.Notify.create({type:"negative",message:"Failed create Nostr event.",caption:`${e}`})}}},computed:{showOauth(){return this.oauth.some(e=>this.authMethods.includes(e))},disableRegister(){const e=!!this.username,t=!!this.password&&this.password.length>=8,a=this.password===this.passwordRepeat,s=0===this.confirmationMethodsCount||"code"!==this.confirmationMethod||this.confirmationCode.length>0;return!(e&&t&&a&&s)},confirmationMethodsCount(){return[this.g.settings.userActivationByEmail,this.g.settings.userActivationByPayment,this.g.settings.userActivationByInvitationCode].filter(Boolean).length}},created(){}}),window.app.component("separator-text",{template:"#separator-text",props:{text:String,uppercase:{type:Boolean,default:!1},color:{type:String,default:"grey"}}}),window.app.component("lnbits-node-ranks",{props:["ranks"],data:()=>({stats:[{label:"Capacity",key:"capacity"},{label:"Channels",key:"channelcount"},{label:"Age",key:"age"},{label:"Growth",key:"growth"},{label:"Availability",key:"availability"}]}),template:"\n \n
\n
1ml Node Rank
\n
\n
\n
{{ stat.label }}
\n
\n {{ (ranks && ranks[stat.key]) ?? '-' }}\n
\n
\n
\n
\n \n "}),window.app.component("lnbits-channel-stats",{props:["stats"],data:()=>({states:[{label:"Active",value:"active",color:"green"},{label:"Pending",value:"pending",color:"orange"},{label:"Inactive",value:"inactive",color:"grey"},{label:"Closed",value:"closed",color:"red"}]}),template:"\n \n
\n
Channels
\n
\n
\n
\n {{ state.label }}\n
\n
\n {{ (stats?.counts && stats.counts[state.value]) ?? \"-\" }}\n
\n
\n
\n
\n
\n "}),window.app.component("lnbits-stat",{props:["title","amount","msat","btc"],computed:{value(){return this.amount??(this.btc?LNbits.utils.formatSat(this.btc):LNbits.utils.formatMsat(this.msat))}},template:"\n \n \n
\n {{ title }}\n
\n
\n {{ value }}\n sats\n BTC\n
\n
\n
\n "}),window.app.component("lnbits-node-qrcode",{props:["info"],template:'\n \n \n
\n
\n \n
\n No addresses available\n
\n
\n
\n
\n \n Public Key Click to copy \n \n \n
\n '}),window.app.component("lnbits-channel-balance",{props:["balance","color"],methods:{formatMsat:e=>LNbits.utils.formatMsat(e)},template:'\n
\n
\n \n Local: {{ formatMsat(balance.local_msat) }}\n sats\n \n \n Remote: {{ formatMsat(balance.remote_msat) }}\n sats\n \n
\n\n \n
\n \n {{ balance.alias }}\n \n
\n \n
\n '}),window.app.component("lnbits-node-info",{props:["info"],data:()=>({showDialog:!1}),methods:{shortenNodeId:e=>e?e.substring(0,5)+"..."+e.substring(e.length-5):"..."},template:"\n
\n
{{ this.info.alias }}
\n
\n
{{ this.info.backend_name }}
\n \n #{{ this.info.color }}\n \n
{{ shortenNodeId(this.info.id) }}
\n \n \n
\n \n \n \n
\n "}),window.app.component("lnbits-stat",{props:["title","amount","msat","btc"],computed:{value(){return this.amount??(this.btc?LNbits.utils.formatSat(this.btc):LNbits.utils.formatMsat(this.msat))}},template:"\n \n \n
\n {{ title }}\n
\n
\n {{ value }}\n sats\n BTC\n
\n
\n
\n "});const quasarConfig={config:{loading:{spinner:Quasar.QSpinnerBars},table:{rowsPerPageOptions:[5,10,20,50,100,200,500,0]}}},DynamicComponent={async created(){const e=this.$route.path.split("/")[1],t=`/${e}/`,a=`/${e}/static/routes.json`;this.$router.getRoutes().some(e=>e.path===t)||this.$route.fullPath.startsWith("/extensions/builder/preview")||fetch(a).then(async e=>{if(!e.ok)throw new Error("No dynamic routes found");(await e.json()).forEach(e=>{console.log("Adding dynamic route:",e.path),window.router.addRoute({path:e.path,name:e.name,component:async()=>(await LNbits.utils.loadTemplate(e.template),await LNbits.utils.loadScript(e.component),window[e.name])}),window.router.push(this.$route.fullPath)})}).catch(()=>{let e=RENDERED_ROUTE;if(2===e.split("/").length&&(e+="/"),e!==this.$route.path)return console.log("Redirecting to non-vue route:",this.$route.fullPath),void(window.location=this.$route.fullPath)})}},routes=[{path:"/node",name:"Node",component:PageNode},{path:"/node/public",name:"NodePublic",component:PageNodePublic},{path:"/payments",name:"Payments",component:PagePayments},{path:"/audit",name:"Audit",component:PageAudit},{path:"/wallet",redirect:e=>{const t=window.g?.lastActiveWallet||window.g?.user?.wallets[0].id;return`/wallet/${e.query.wal||t||"default"}`}},{path:"/wallet/:id",name:"Wallet",component:PageWallet},{path:"/wallets",name:"Wallets",component:PageWallets},{path:"/users",name:"Users",component:PageUsers},{path:"/admin",name:"Admin",component:PageAdmin},{path:"/account",name:"Account",component:PageAccount},{path:"/extensions/builder",name:"ExtensionsBuilder",component:PageExtensionBuilder},{path:"/extensions/builder/preview",name:"ExtensionsBuilderPreview",component:PageExtensionBuilderPreview},{path:"/extensions",name:"Extensions",component:PageExtensions},{path:"/first_install",name:"FirstInstall",component:PageFirstInstall},{path:"/",name:"PageHome",component:PageHome},{path:"/error",name:"PageError",component:PageError},{path:"/:pathMatch(.*)*",name:"DynamicComponent",component:DynamicComponent}];window.router=VueRouter.createRouter({history:VueRouter.createWebHistory(),routes:routes}),window.LOCALE=window.g.locale,window.i18n=new VueI18n.createI18n({locale:window.g.locale,fallbackLocale:"en",messages:window.localisation}),window.app.mixin({data:()=>({api:window._lnbitsApi,utils:window._lnbitsUtils,g:window.g}),methods:{copyText:window._lnbitsUtils.copyText,formatBalance:window._lnbitsUtils.formatBalance}}),window.app.use(VueQrcodeReader),window.app.use(Quasar,quasarConfig),window.app.use(window.i18n),window.app.use(window.router),window.app.mount("#vue"); \ No newline at end of file diff --git a/lnbits/static/bundle.min.css b/lnbits/static/bundle.min.css index 01ca75c78..3fc27818b 100644 --- a/lnbits/static/bundle.min.css +++ b/lnbits/static/bundle.min.css @@ -1 +1 @@ -*,:after,:before{box-sizing:inherit;-webkit-tap-highlight-color:transparent;-moz-tap-highlight-color:transparent}#q-app,body,html{width:100%;direction:ltr}body.platform-ios.within-iframe,body.platform-ios.within-iframe #q-app{width:100px;min-width:100%}body,html{margin:0;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}img{border-style:none}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;font-family:inherit;margin:0}optgroup{font-weight:700}button,input,select{overflow:visible;text-transform:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button:-moz-focusring,input:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.q-icon{line-height:1;width:1em;height:1em;flex-shrink:0;letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;direction:ltr;text-align:center;position:relative;box-sizing:content-box;fill:currentColor}.q-icon:after,.q-icon:before{width:100%;height:100%;display:flex!important;align-items:center;justify-content:center}.q-icon>img,.q-icon>svg{width:100%;height:100%}.q-icon>div{box-sizing:border-box}.material-icons,.material-icons-outlined,.material-icons-round,.material-icons-sharp,.material-symbols-outlined,.material-symbols-rounded,.material-symbols-sharp,.q-icon{user-select:none;cursor:inherit;font-size:inherit;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}.q-panel{height:100%;width:100%}.q-panel>div{height:100%;width:100%}.q-panel-parent{overflow:hidden;position:relative}.q-loading-bar{position:fixed;z-index:9998;transition:transform .5s cubic-bezier(0, 0, .2, 1),opacity .5s;background:#f44336}.q-loading-bar--top{left:0;right:0;top:0;width:100%}.q-loading-bar--bottom{left:0;right:0;bottom:0;width:100%}.q-loading-bar--right{top:0;bottom:0;right:0;height:100%}.q-loading-bar--left{top:0;bottom:0;left:0;height:100%}.q-avatar{position:relative;vertical-align:middle;display:inline-block;border-radius:50%;font-size:48px;height:1em;width:1em}.q-avatar__content{font-size:.5em;line-height:.5em}.q-avatar img:not(.q-icon):not(.q-img__image),.q-avatar__content{border-radius:inherit;height:inherit;width:inherit}.q-avatar--square{border-radius:0}.q-badge{background-color:var(--q-primary);color:#fff;padding:2px 6px;border-radius:4px;font-size:12px;line-height:1;min-height:12px;font-weight:400;vertical-align:baseline}.q-badge--single-line{white-space:nowrap}.q-badge--multi-line{word-break:break-all;word-wrap:break-word}.q-badge--floating{position:absolute;top:-4px;right:-3px;cursor:inherit}.q-badge--transparent{opacity:.8}.q-badge--outline{background-color:transparent;border:1px solid currentColor}.q-badge--rounded{border-radius:1em}.q-banner{min-height:54px;padding:8px 16px;background:#fff}.q-banner--top-padding{padding-top:14px}.q-banner__avatar{min-width:1px!important}.q-banner__avatar>.q-avatar{font-size:46px}.q-banner__avatar>.q-icon{font-size:40px}.q-banner__avatar:not(:empty)+.q-banner__content{padding-left:16px}.q-banner__actions.col-auto{padding-left:16px}.q-banner__actions.col-all .q-btn-item{margin:4px 0 0 4px}.q-banner--dense{min-height:32px;padding:8px}.q-banner--dense.q-banner--top-padding{padding-top:12px}.q-banner--dense .q-banner__avatar>.q-avatar,.q-banner--dense .q-banner__avatar>.q-icon{font-size:28px}.q-banner--dense .q-banner__avatar:not(:empty)+.q-banner__content{padding-left:8px}.q-banner--dense .q-banner__actions.col-auto{padding-left:8px}.q-bar{background:rgba(0,0,0,.2)}.q-bar>.q-icon{margin-left:2px}.q-bar>div,.q-bar>div+.q-icon{margin-left:8px}.q-bar>.q-btn{margin-left:2px}.q-bar>.q-btn:first-child,.q-bar>.q-icon:first-child,.q-bar>div:first-child{margin-left:0}.q-bar--standard{padding:0 12px;height:32px;font-size:18px}.q-bar--standard>div{font-size:16px}.q-bar--standard .q-btn{font-size:11px}.q-bar--dense{padding:0 8px;height:24px;font-size:14px}.q-bar--dense .q-btn{font-size:8px}.q-bar--dark{background:rgba(255,255,255,.15)}.q-breadcrumbs__el{color:inherit}.q-breadcrumbs__el-icon{font-size:125%}.q-breadcrumbs__el-icon--with-label{margin-right:8px}[dir=rtl] .q-breadcrumbs__separator .q-icon{transform:scaleX(-1)}.q-btn{display:inline-flex;flex-direction:column;align-items:stretch;position:relative;outline:0;border:0;vertical-align:middle;font-size:14px;line-height:1.715em;text-decoration:none;color:inherit;background:0 0;font-weight:500;text-transform:uppercase;text-align:center;width:auto;height:auto;cursor:default;padding:4px 16px;min-height:2.572em}.q-btn .q-icon,.q-btn .q-spinner{font-size:1.715em}.q-btn.disabled{opacity:.7!important}.q-btn:before{content:"";display:block;position:absolute;left:0;right:0;top:0;bottom:0;border-radius:inherit;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-btn--actionable{cursor:pointer}.q-btn--actionable.q-btn--standard:before{transition:box-shadow .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--actionable.q-btn--standard.q-btn--active:before,.q-btn--actionable.q-btn--standard:active:before{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px rgba(0,0,0,.14),0 1px 14px rgba(0,0,0,.12)}.q-btn--no-uppercase{text-transform:none}.q-btn--rectangle{border-radius:3px}.q-btn--outline{background:0 0!important}.q-btn--outline:before{border:1px solid currentColor}.q-btn--push{border-radius:7px}.q-btn--push:before{border-bottom:3px solid rgba(0,0,0,.15)}.q-btn--push.q-btn--actionable{transition:transform .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--push.q-btn--actionable:before{transition:border-width .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--push.q-btn--actionable.q-btn--active,.q-btn--push.q-btn--actionable:active{transform:translateY(2px)}.q-btn--push.q-btn--actionable.q-btn--active:before,.q-btn--push.q-btn--actionable:active:before{border-bottom-width:0}.q-btn--rounded{border-radius:28px}.q-btn--round{border-radius:50%;padding:0;min-width:3em;min-height:3em}.q-btn--square{border-radius:0}.q-btn--flat:before,.q-btn--outline:before,.q-btn--unelevated:before{box-shadow:none}.q-btn--dense{padding:.285em;min-height:2em}.q-btn--dense.q-btn--round{padding:0;min-height:2.4em;min-width:2.4em}.q-btn--dense .on-left{margin-right:6px}.q-btn--dense .on-right{margin-left:6px}.q-btn--fab .q-icon,.q-btn--fab-mini .q-icon{font-size:24px}.q-btn--fab{padding:16px;min-height:56px;min-width:56px}.q-btn--fab .q-icon{margin:auto}.q-btn--fab-mini{padding:8px;min-height:40px;min-width:40px}.q-btn__content{transition:opacity .3s;z-index:0}.q-btn__content--hidden{opacity:0;pointer-events:none}.q-btn__progress{border-radius:inherit;z-index:0}.q-btn__progress-indicator{z-index:-1;transform:translateX(-100%);background:rgba(255,255,255,.25)}.q-btn__progress--dark .q-btn__progress-indicator{background:rgba(0,0,0,.2)}.q-btn--flat .q-btn__progress-indicator,.q-btn--outline .q-btn__progress-indicator{opacity:.2;background:currentColor}.q-btn-dropdown--split .q-btn-dropdown__arrow-container{padding:0 4px}.q-btn-dropdown--split .q-btn-dropdown__arrow-container.q-btn--outline{border-left:1px solid currentColor}.q-btn-dropdown--split .q-btn-dropdown__arrow-container:not(.q-btn--outline){border-left:1px solid rgba(255,255,255,.3)}.q-btn-dropdown--simple *+.q-btn-dropdown__arrow{margin-left:8px}.q-btn-dropdown__arrow{transition:transform .28s}.q-btn-dropdown--current{flex-grow:1}.q-btn-group{border-radius:3px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);vertical-align:middle}.q-btn-group>.q-btn-item{border-radius:inherit;align-self:stretch}.q-btn-group>.q-btn-item:before{box-shadow:none}.q-btn-group>.q-btn-item .q-badge--floating{right:0}.q-btn-group>.q-btn-group{box-shadow:none}.q-btn-group>.q-btn-group:first-child>.q-btn:first-child{border-top-left-radius:inherit;border-bottom-left-radius:inherit}.q-btn-group>.q-btn-group:last-child>.q-btn:last-child{border-top-right-radius:inherit;border-bottom-right-radius:inherit}.q-btn-group>.q-btn-group:not(:first-child)>.q-btn:first-child:before{border-left:0}.q-btn-group>.q-btn-group:not(:last-child)>.q-btn:last-child:before{border-right:0}.q-btn-group>.q-btn-item:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.q-btn-group>.q-btn-item:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.q-btn-group>.q-btn-item.q-btn--standard:before{z-index:-1}.q-btn-group--push{border-radius:7px}.q-btn-group--push>.q-btn--push.q-btn--actionable{transform:none}.q-btn-group--push>.q-btn--push.q-btn--actionable .q-btn__content{transition:margin-top .3s cubic-bezier(.25, .8, .5, 1),margin-bottom .3s cubic-bezier(.25, .8, .5, 1)}.q-btn-group--push>.q-btn--push.q-btn--actionable.q-btn--active .q-btn__content,.q-btn-group--push>.q-btn--push.q-btn--actionable:active .q-btn__content{margin-top:2px;margin-bottom:-2px}.q-btn-group--rounded{border-radius:28px}.q-btn-group--square{border-radius:0}.q-btn-group--flat,.q-btn-group--outline,.q-btn-group--unelevated{box-shadow:none}.q-btn-group--outline>.q-separator{display:none}.q-btn-group--outline>.q-btn-item+.q-btn-item:before{border-left:0}.q-btn-group--outline>.q-btn-item:not(:last-child):before{border-right:0}.q-btn-group--stretch{align-self:stretch;border-radius:0}.q-btn-group--glossy>.q-btn-item{background-image:linear-gradient(to bottom,rgba(255,255,255,.3),rgba(255,255,255,0) 50%,rgba(0,0,0,.12) 51%,rgba(0,0,0,.04))!important}.q-btn-group--spread>.q-btn-group{display:flex!important}.q-btn-group--spread>.q-btn-group>.q-btn-item:not(.q-btn-dropdown__arrow-container),.q-btn-group--spread>.q-btn-item{width:auto;min-width:0;max-width:100%;flex:10000 1 0%}.q-btn-toggle{position:relative}.q-card{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;vertical-align:top;background:#fff;position:relative}.q-card>div:not(.q--avoid-card-border),.q-card>img:not(.q--avoid-card-border){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.q-card>div:nth-child(1of:not(.q--avoid-card-border)),.q-card>img:nth-child(1of:not(.q--avoid-card-border)){border-top:0;border-top-left-radius:inherit;border-top-right-radius:inherit}.q-card>div:nth-last-child(1of:not(.q--avoid-card-border)),.q-card>img:nth-last-child(1of:not(.q--avoid-card-border)){border-bottom:0;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.q-card>div:not(.q--avoid-card-border){border-left:0;border-right:0;box-shadow:none}.q-card--bordered{border:1px solid rgba(0,0,0,.12)}.q-card--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-card__section{position:relative}.q-card__section--vert{padding:16px}.q-card__section--horiz>div:not(.q--avoid-card-border),.q-card__section--horiz>img:not(.q--avoid-card-border){border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0}.q-card__section--horiz>div:nth-child(1of:not(.q--avoid-card-border)),.q-card__section--horiz>img:nth-child(1of:not(.q--avoid-card-border)){border-top-left-radius:inherit;border-bottom-left-radius:inherit}.q-card__section--horiz>div:nth-last-child(1of:not(.q--avoid-card-border)),.q-card__section--horiz>img:nth-last-child(1of:not(.q--avoid-card-border)){border-top-right-radius:inherit;border-bottom-right-radius:inherit}.q-card__section--horiz>div:not(.q--avoid-card-border){border-top:0;border-bottom:0;box-shadow:none}.q-card__actions{padding:8px;align-items:center}.q-card__actions .q-btn--rectangle{padding:0 8px}.q-card__actions--horiz>.q-btn-group+.q-btn-item,.q-card__actions--horiz>.q-btn-item+.q-btn-group,.q-card__actions--horiz>.q-btn-item+.q-btn-item{margin-left:8px}.q-card__actions--vert>.q-btn-item.q-btn--round{align-self:center}.q-card__actions--vert>.q-btn-group+.q-btn-item,.q-card__actions--vert>.q-btn-item+.q-btn-group,.q-card__actions--vert>.q-btn-item+.q-btn-item{margin-top:4px}.q-card__actions--vert>.q-btn-group>.q-btn-item{flex-grow:1}.q-card>img{display:block;width:100%;max-width:100%;border:0}.q-carousel{background-color:#fff;height:400px}.q-carousel__slide{min-height:100%;background-size:cover;background-position:50%}.q-carousel .q-carousel--padding,.q-carousel__slide{padding:16px}.q-carousel__slides-container{height:100%}.q-carousel__control{color:#fff}.q-carousel__arrow{pointer-events:none}.q-carousel__arrow .q-icon{font-size:28px}.q-carousel__arrow .q-btn{pointer-events:all}.q-carousel__next-arrow--horizontal,.q-carousel__prev-arrow--horizontal{top:16px;bottom:16px}.q-carousel__prev-arrow--horizontal{left:16px}.q-carousel__next-arrow--horizontal{right:16px}.q-carousel__next-arrow--vertical,.q-carousel__prev-arrow--vertical{left:16px;right:16px}.q-carousel__prev-arrow--vertical{top:16px}.q-carousel__next-arrow--vertical{bottom:16px}.q-carousel__navigation--bottom,.q-carousel__navigation--top{left:16px;right:16px;overflow-x:auto;overflow-y:hidden}.q-carousel__navigation--top{top:16px}.q-carousel__navigation--bottom{bottom:16px}.q-carousel__navigation--left,.q-carousel__navigation--right{top:16px;bottom:16px;overflow-x:hidden;overflow-y:auto}.q-carousel__navigation--left>.q-carousel__navigation-inner,.q-carousel__navigation--right>.q-carousel__navigation-inner{flex-direction:column}.q-carousel__navigation--left{left:16px}.q-carousel__navigation--right{right:16px}.q-carousel__navigation-inner{flex:1 1 auto}.q-carousel__navigation .q-btn{margin:6px 4px;padding:5px}.q-carousel__navigation-icon--inactive{opacity:.7}.q-carousel .q-carousel__thumbnail{margin:2px;height:50px;width:auto;display:inline-block;cursor:pointer;border:1px solid transparent;border-radius:4px;vertical-align:middle;opacity:.7;transition:opacity .3s}.q-carousel .q-carousel__thumbnail--active,.q-carousel .q-carousel__thumbnail:hover{opacity:1}.q-carousel .q-carousel__thumbnail--active{border-color:currentColor;cursor:default}.q-carousel--arrows-vertical .q-carousel--padding,.q-carousel--arrows-vertical.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-top .q-carousel--padding,.q-carousel--navigation-top.q-carousel--with-padding .q-carousel__slide{padding-top:60px}.q-carousel--arrows-vertical .q-carousel--padding,.q-carousel--arrows-vertical.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-bottom .q-carousel--padding,.q-carousel--navigation-bottom.q-carousel--with-padding .q-carousel__slide{padding-bottom:60px}.q-carousel--arrows-horizontal .q-carousel--padding,.q-carousel--arrows-horizontal.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-left .q-carousel--padding,.q-carousel--navigation-left.q-carousel--with-padding .q-carousel__slide{padding-left:60px}.q-carousel--arrows-horizontal .q-carousel--padding,.q-carousel--arrows-horizontal.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-right .q-carousel--padding,.q-carousel--navigation-right.q-carousel--with-padding .q-carousel__slide{padding-right:60px}.q-carousel.fullscreen{height:100%}.q-message-name{font-size:small}.q-message-label{margin:24px 0;text-align:center;font-size:small}.q-message-stamp{color:inherit;margin-top:4px;opacity:.6;display:none;font-size:small}.q-message-avatar{border-radius:50%;width:48px;height:48px;min-width:48px}.q-message{margin-bottom:8px}.q-message:first-child .q-message-label{margin-top:0}.q-message-avatar--received{margin-right:8px}.q-message-text--received{color:#81c784;border-radius:4px 4px 4px 0}.q-message-text--received:last-child:before{right:100%;border-right:0 solid transparent;border-left:8px solid transparent;border-bottom:8px solid currentColor}.q-message-text-content--received{color:#000}.q-message-name--sent{text-align:right}.q-message-avatar--sent{margin-left:8px}.q-message-container--sent{flex-direction:row-reverse}.q-message-text--sent{color:#e0e0e0;border-radius:4px 4px 0 4px}.q-message-text--sent:last-child:before{left:100%;border-left:0 solid transparent;border-right:8px solid transparent;border-bottom:8px solid currentColor}.q-message-text-content--sent{color:#000}.q-message-text{background:currentColor;padding:8px;line-height:1.2;word-break:break-word;position:relative}.q-message-text+.q-message-text{margin-top:3px}.q-message-text:last-child{min-height:48px}.q-message-text:last-child .q-message-stamp{display:block}.q-message-text:last-child:before{content:"";position:absolute;bottom:0;width:0;height:0}.q-checkbox{vertical-align:middle}.q-checkbox__native{width:1px;height:1px}.q-checkbox__bg,.q-checkbox__icon-container{user-select:none}.q-checkbox__bg{top:25%;left:25%;width:50%;height:50%;border:2px solid currentColor;border-radius:2px;transition:background .22s cubic-bezier(0, 0, .2, 1) 0s;-webkit-print-color-adjust:exact}.q-checkbox__icon{color:currentColor;font-size:.5em}.q-checkbox__svg{color:#fff}.q-checkbox__truthy{stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.78334;stroke-dasharray:29.78334}.q-checkbox__indet{fill:currentColor;transform-origin:50% 50%;transform:rotate(-280deg) scale(0)}.q-checkbox__inner{font-size:40px;width:1em;min-width:1em;height:1em;outline:0;border-radius:50%;color:rgba(0,0,0,.54)}.q-checkbox__inner--indet,.q-checkbox__inner--truthy{color:var(--q-primary)}.q-checkbox__inner--indet .q-checkbox__bg,.q-checkbox__inner--truthy .q-checkbox__bg{background:currentColor}.q-checkbox__inner--truthy path{stroke-dashoffset:0;transition:stroke-dashoffset .18s cubic-bezier(.4, 0, .6, 1) 0s}.q-checkbox__inner--indet .q-checkbox__indet{transform:rotate(0) scale(1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}.q-checkbox.disabled{opacity:.75!important}.q-checkbox--dark .q-checkbox__inner{color:rgba(255,255,255,.7)}.q-checkbox--dark .q-checkbox__inner:before{opacity:.32!important}.q-checkbox--dark .q-checkbox__inner--indet,.q-checkbox--dark .q-checkbox__inner--truthy{color:var(--q-primary)}.q-checkbox--dense .q-checkbox__inner{width:.5em;min-width:.5em;height:.5em}.q-checkbox--dense .q-checkbox__bg{left:5%;top:5%;width:90%;height:90%}.q-checkbox--dense .q-checkbox__label{padding-left:.5em}.q-checkbox--dense.reverse .q-checkbox__label{padding-left:0;padding-right:.5em}body.desktop .q-checkbox:not(.disabled) .q-checkbox__inner:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1)}body.desktop .q-checkbox:not(.disabled):focus .q-checkbox__inner:before,body.desktop .q-checkbox:not(.disabled):hover .q-checkbox__inner:before{transform:scale3d(1,1,1)}body.desktop .q-checkbox--dense:not(.disabled):focus .q-checkbox__inner:before,body.desktop .q-checkbox--dense:not(.disabled):hover .q-checkbox__inner:before{transform:scale3d(1.4,1.4,1)}.q-chip{vertical-align:middle;border-radius:16px;outline:0;position:relative;height:2em;max-width:100%;margin:4px;background:#e0e0e0;color:rgba(0,0,0,.87);font-size:14px;padding:.5em .9em}.q-chip--colored .q-chip__icon,.q-chip--dark .q-chip__icon{color:inherit}.q-chip .q-avatar{font-size:2em;margin-left:-.45em;margin-right:.2em;border-radius:16px}.q-chip--outline{background:0 0!important;border:1px solid currentColor}.q-chip--outline .q-avatar{margin-left:calc(-.45em - 1px)}.q-chip--selected .q-avatar{display:none}.q-chip__icon{color:rgba(0,0,0,.54);font-size:1.5em;margin:-.2em}.q-chip__icon--left{margin-right:.2em}.q-chip__icon--right{margin-left:.2em}.q-chip__icon--remove{margin-left:.1em;margin-right:-.5em;opacity:.6;outline:0}.q-chip__icon--remove:focus,.q-chip__icon--remove:hover{opacity:1}.q-chip__content{white-space:nowrap}.q-chip--dense{border-radius:12px;padding:0 .4em;height:1.5em}.q-chip--dense .q-avatar{font-size:1.5em;margin-left:-.27em;margin-right:.1em;border-radius:12px}.q-chip--dense .q-chip__icon{font-size:1.25em}.q-chip--dense .q-chip__icon--left{margin-right:.195em}.q-chip--dense .q-chip__icon--remove{margin-right:-.25em}.q-chip--square{border-radius:4px}.q-chip--square .q-avatar{border-radius:3px 0 0 3px}body.desktop .q-chip--clickable:focus{box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12)}body.desktop.body--dark .q-chip--clickable:focus{box-shadow:0 1px 3px rgba(255,255,255,.2),0 1px 1px rgba(255,255,255,.14),0 2px 1px -1px rgba(255,255,255,.12)}.q-circular-progress{display:inline-block;position:relative;vertical-align:middle;width:1em;height:1em;line-height:1}.q-circular-progress.q-focusable{border-radius:50%}.q-circular-progress__svg{width:100%;height:100%}.q-circular-progress__text{font-size:.25em}.q-circular-progress--indeterminate .q-circular-progress__svg{transform-origin:50% 50%;animation:q-spin 2s linear infinite}.q-circular-progress--indeterminate .q-circular-progress__circle{stroke-dasharray:1 400;stroke-dashoffset:0;animation:q-circular-progress-circle 1.5s ease-in-out infinite}@keyframes q-circular-progress-circle{0%{stroke-dasharray:1,400;stroke-dashoffset:0}50%{stroke-dasharray:400,400;stroke-dashoffset:-100}100%{stroke-dasharray:400,400;stroke-dashoffset:-300}}.q-color-picker{overflow:hidden;background:#fff;max-width:350px;vertical-align:top;min-width:180px;border-radius:4px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-color-picker .q-tab{padding:0!important}.q-color-picker--bordered{border:1px solid rgba(0,0,0,.12)}.q-color-picker__header-tabs{height:32px}.q-color-picker__header-banner{height:36px}.q-color-picker__header input{line-height:24px;border:0}.q-color-picker__header .q-tab{min-height:32px!important;height:32px!important}.q-color-picker__header .q-tab--inactive{background:linear-gradient(to top,rgba(0,0,0,.3) 0,rgba(0,0,0,.15) 25%,rgba(0,0,0,.1))}.q-color-picker__error-icon{bottom:2px;right:2px;font-size:24px;opacity:0;transition:opacity .3s ease-in}.q-color-picker__header-content{position:relative;background:#fff}.q-color-picker__header-content--light{color:#000}.q-color-picker__header-content--dark{color:#fff}.q-color-picker__header-content--dark .q-tab--inactive:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(255,255,255,.2)}.q-color-picker__header-banner{height:36px}.q-color-picker__header-bg{background:#fff;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAH0lEQVQoU2NkYGAwZkAFZ5G5jPRRgOYEVDeB3EBjBQBOZwTVugIGyAAAAABJRU5ErkJggg==")!important}.q-color-picker__footer{height:36px}.q-color-picker__footer .q-tab{min-height:36px!important;height:36px!important}.q-color-picker__footer .q-tab--inactive{background:linear-gradient(to bottom,rgba(0,0,0,.3) 0,rgba(0,0,0,.15) 25%,rgba(0,0,0,.1))}.q-color-picker__spectrum{width:100%;height:100%}.q-color-picker__spectrum-tab{padding:0!important}.q-color-picker__spectrum-white{background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.q-color-picker__spectrum-black{background:linear-gradient(to top,#000,rgba(0,0,0,0))}.q-color-picker__spectrum-circle{width:10px;height:10px;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;transform:translate(-5px,-5px)}.q-color-picker__hue .q-slider__track{background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)!important;opacity:1}.q-color-picker__alpha .q-slider__track-container{padding-top:0}.q-color-picker__alpha .q-slider__track:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;background:linear-gradient(90deg,rgba(255,255,255,0),#757575)}.q-color-picker__sliders{padding:0 16px}.q-color-picker__sliders .q-slider__thumb{color:#424242}.q-color-picker__sliders .q-slider__thumb path{stroke-width:2px;fill:transparent}.q-color-picker__sliders .q-slider--active path{stroke-width:3px}.q-color-picker__tune-tab .q-slider{margin-left:18px;margin-right:18px}.q-color-picker__tune-tab input{font-size:11px;border:1px solid #e0e0e0;border-radius:4px;width:3.5em}.q-color-picker__palette-tab{padding:0!important}.q-color-picker__palette-rows--editable .q-color-picker__cube{cursor:pointer}.q-color-picker__cube{padding-bottom:10%;width:10%!important}.q-color-picker input{color:inherit;background:0 0;outline:0;text-align:center}.q-color-picker .q-tabs{overflow:hidden}.q-color-picker .q-tab--active{box-shadow:0 0 14px 3px rgba(0,0,0,.2)}.q-color-picker .q-tab--active .q-focus-helper{display:none}.q-color-picker .q-tab__indicator{display:none}.q-color-picker .q-tab-panels{background:inherit}.q-color-picker--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-color-picker--dark .q-color-picker__tune-tab input{border:1px solid rgba(255,255,255,.3)}.q-color-picker--dark .q-slider__thumb{color:#fafafa}.q-date{display:inline-flex;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff;width:290px;min-width:290px;max-width:100%}.q-date--bordered{border:1px solid rgba(0,0,0,.12)}.q-date__header{border-top-left-radius:inherit;color:#fff;background-color:var(--q-primary);padding:16px}.q-date__actions{padding:0 16px 16px}.q-date__content,.q-date__main{outline:0}.q-date__content .q-btn{font-weight:400}.q-date__header-link{opacity:.64;outline:0;transition:opacity .3s ease-out}.q-date__header-link--active,.q-date__header-link:focus,.q-date__header-link:hover{opacity:1}.q-date__header-subtitle{font-size:14px;line-height:1.75;letter-spacing:.00938em}.q-date__header-title-label{font-size:24px;line-height:1.2;letter-spacing:.00735em}.q-date__view{height:100%;width:100%;min-height:290px;padding:16px}.q-date__navigation{height:12.5%}.q-date__navigation>div:first-child{width:8%;min-width:24px;justify-content:flex-end}.q-date__navigation>div:last-child{width:8%;min-width:24px;justify-content:flex-start}.q-date__calendar-weekdays{height:12.5%}.q-date__calendar-weekdays>div{opacity:.38;font-size:12px}.q-date__calendar-item{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;width:14.285%!important;height:12.5%!important;position:relative;padding:1px}.q-date__calendar-item:after{content:"";position:absolute;pointer-events:none;top:1px;right:0;bottom:1px;left:0;border-style:dashed;border-color:transparent;border-width:1px}.q-date__calendar-item button,.q-date__calendar-item>div{width:30px;height:30px;border-radius:50%}.q-date__calendar-item>div{line-height:30px;text-align:center}.q-date__calendar-item>button{line-height:22px}.q-date__calendar-item--out{opacity:.18}.q-date__calendar-item--fill{visibility:hidden}.q-date__range-from:before,.q-date__range-to:before,.q-date__range:before{content:"";background-color:currentColor;position:absolute;top:1px;bottom:1px;left:0;right:0;opacity:.3}.q-date__range-from:nth-child(7n-6):before,.q-date__range-to:nth-child(7n-6):before,.q-date__range:nth-child(7n-6):before{border-top-left-radius:0;border-bottom-left-radius:0}.q-date__range-from:nth-child(7n):before,.q-date__range-to:nth-child(7n):before,.q-date__range:nth-child(7n):before{border-top-right-radius:0;border-bottom-right-radius:0}.q-date__range-from:before{left:50%}.q-date__range-to:before{right:50%}.q-date__edit-range:after{border-color:currentColor transparent}.q-date__edit-range:nth-child(7n-6):after{border-top-left-radius:0;border-bottom-left-radius:0}.q-date__edit-range:nth-child(7n):after{border-top-right-radius:0;border-bottom-right-radius:0}.q-date__edit-range-from-to:after,.q-date__edit-range-from:after{left:4px;border-left-color:currentColor;border-top-color:currentColor;border-bottom-color:currentColor;border-top-left-radius:28px;border-bottom-left-radius:28px}.q-date__edit-range-from-to:after,.q-date__edit-range-to:after{right:4px;border-right-color:currentColor;border-top-color:currentColor;border-bottom-color:currentColor;border-top-right-radius:28px;border-bottom-right-radius:28px}.q-date__calendar-days-container{height:75%;min-height:192px}.q-date__calendar-days>div{height:16.66%!important}.q-date__event{position:absolute;bottom:2px;left:50%;height:5px;width:8px;border-radius:5px;background-color:var(--q-secondary);transform:translate3d(-50%,0,0)}.q-date__today{box-shadow:0 0 1px 0 currentColor}.q-date__years-content{padding:0 8px}.q-date__months-item,.q-date__years-item{flex:0 0 33.3333%}.q-date--readonly .q-date__content,.q-date--readonly .q-date__header,.q-date.disabled .q-date__content,.q-date.disabled .q-date__header{pointer-events:none}.q-date--readonly .q-date__navigation{display:none}.q-date--portrait{flex-direction:column}.q-date--portrait-standard .q-date__content{height:calc(100% - 86px)}.q-date--portrait-standard .q-date__header{border-top-right-radius:inherit;height:86px}.q-date--portrait-standard .q-date__header-title{align-items:center;height:30px}.q-date--portrait-minimal .q-date__content{height:100%}.q-date--landscape{flex-direction:row;align-items:stretch;min-width:420px}.q-date--landscape>div{display:flex;flex-direction:column}.q-date--landscape .q-date__content{height:100%}.q-date--landscape-standard{min-width:420px}.q-date--landscape-standard .q-date__header{border-bottom-left-radius:inherit;min-width:110px;width:110px}.q-date--landscape-standard .q-date__header-title{flex-direction:column}.q-date--landscape-standard .q-date__header-today{margin-top:12px;margin-left:-8px}.q-date--landscape-minimal{width:310px}.q-date--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12);border-color:rgba(255,255,255,.28)}.q-dialog__title{font-size:1.25rem;font-weight:500;line-height:1.6;letter-spacing:.0125em}.q-dialog__progress{font-size:4rem}.q-dialog__inner{outline:0}.q-dialog__inner>div{pointer-events:all;overflow:auto;-webkit-overflow-scrolling:touch;will-change:scroll-position;border-radius:4px}.q-dialog__inner--square>div{border-radius:0!important}.q-dialog__inner>.q-card>.q-card__actions .q-btn--rectangle{min-width:64px}.q-dialog__inner--minimized{padding:24px}.q-dialog__inner--minimized>div{max-height:calc(100vh - 48px)}.q-dialog__inner--maximized>div{height:100%;width:100%;max-height:100vh;max-width:100vw;border-radius:0!important;top:0!important;left:0!important}.q-dialog__inner--bottom,.q-dialog__inner--top{padding-top:0!important;padding-bottom:0!important}.q-dialog__inner--left,.q-dialog__inner--right{padding-right:0!important;padding-left:0!important}.q-dialog__inner--left:not(.q-dialog__inner--animating)>div,.q-dialog__inner--top:not(.q-dialog__inner--animating)>div{border-top-left-radius:0}.q-dialog__inner--right:not(.q-dialog__inner--animating)>div,.q-dialog__inner--top:not(.q-dialog__inner--animating)>div{border-top-right-radius:0}.q-dialog__inner--bottom:not(.q-dialog__inner--animating)>div,.q-dialog__inner--left:not(.q-dialog__inner--animating)>div{border-bottom-left-radius:0}.q-dialog__inner--bottom:not(.q-dialog__inner--animating)>div,.q-dialog__inner--right:not(.q-dialog__inner--animating)>div{border-bottom-right-radius:0}.q-dialog__inner--fullwidth>div{width:100%!important;max-width:100%!important}.q-dialog__inner--fullheight>div{height:100%!important;max-height:100%!important}.q-dialog__backdrop{z-index:-1;pointer-events:all;outline:0;background:rgba(0,0,0,.4)}body.platform-android:not(.native-mobile) .q-dialog__inner--minimized>div,body.platform-ios .q-dialog__inner--minimized>div{max-height:calc(100vh - 108px)}body.q-ios-padding .q-dialog__inner{padding-top:20px!important;padding-top:env(safe-area-inset-top)!important;padding-bottom:env(safe-area-inset-bottom)!important}body.q-ios-padding .q-dialog__inner>div{max-height:calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom))!important}@media (max-width:599.98px){.q-dialog__inner--bottom,.q-dialog__inner--top{padding-left:0;padding-right:0}.q-dialog__inner--bottom>div,.q-dialog__inner--top>div{width:100%!important}}@media (min-width:600px){.q-dialog__inner--minimized>div{max-width:560px}}.q-body--dialog{overflow:hidden}.q-editor{border:1px solid rgba(0,0,0,.12);border-radius:4px;background-color:#fff}.q-editor.disabled{border-style:dashed}.q-editor>div:first-child,.q-editor__toolbars-container,.q-editor__toolbars-container>div:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-editor__content{outline:0;padding:10px;min-height:10em;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;overflow:auto;max-width:100%}.q-editor__content pre{white-space:pre-wrap}.q-editor__content hr{border:0;outline:0;margin:1px;height:1px;background:rgba(0,0,0,.12)}.q-editor__content:empty:not(:focus):before{content:attr(placeholder);opacity:.7}.q-editor__toolbar{border-bottom:1px solid rgba(0,0,0,.12);min-height:32px}.q-editor__toolbars-container{max-width:100%}.q-editor .q-btn{margin:4px}.q-editor__toolbar-group{position:relative;margin:0 4px}.q-editor__toolbar-group+.q-editor__toolbar-group:before{content:"";position:absolute;left:-4px;top:4px;bottom:4px;width:1px;background:rgba(0,0,0,.12)}.q-editor__link-input{color:inherit;text-decoration:none;text-transform:none;border:none;border-radius:0;background:0 0;outline:0}.q-editor--flat,.q-editor--flat .q-editor__toolbar{border:0}.q-editor--dense .q-editor__toolbar-group{display:flex;align-items:center;flex-wrap:nowrap}.q-editor--dark{border-color:rgba(255,255,255,.28)}.q-editor--dark .q-editor__content hr{background:rgba(255,255,255,.28)}.q-editor--dark .q-editor__toolbar{border-color:rgba(255,255,255,.28)}.q-editor--dark .q-editor__toolbar-group+.q-editor__toolbar-group:before{background:rgba(255,255,255,.28)}.q-expansion-item__border{opacity:0}.q-expansion-item__toggle-icon{position:relative;transition:transform .3s}.q-expansion-item__toggle-icon--rotated{transform:rotate(180deg)}.q-expansion-item__toggle-focus{width:1em!important;height:1em!important;position:relative!important}.q-expansion-item__toggle-focus+.q-expansion-item__toggle-icon{margin-top:-1em}.q-expansion-item--standard.q-expansion-item--expanded>div>.q-expansion-item__border{opacity:1}.q-expansion-item--popup{transition:padding .5s}.q-expansion-item--popup>.q-expansion-item__container{border:1px solid rgba(0,0,0,.12)}.q-expansion-item--popup>.q-expansion-item__container>.q-separator{display:none}.q-expansion-item--popup.q-expansion-item--collapsed{padding:0 15px}.q-expansion-item--popup.q-expansion-item--expanded{padding:15px 0}.q-expansion-item--popup.q-expansion-item--expanded+.q-expansion-item--popup.q-expansion-item--expanded{padding-top:0}.q-expansion-item--popup.q-expansion-item--collapsed:not(:first-child)>.q-expansion-item__container{border-top-width:0}.q-expansion-item--popup.q-expansion-item--expanded+.q-expansion-item--popup.q-expansion-item--collapsed>.q-expansion-item__container{border-top-width:1px}.q-expansion-item__content>.q-card{box-shadow:none;border-radius:0}.q-expansion-item:first-child>div>.q-expansion-item__border--top{opacity:0}.q-expansion-item:last-child>div>.q-expansion-item__border--bottom{opacity:0}.q-expansion-item--expanded+.q-expansion-item--expanded>div>.q-expansion-item__border--top{opacity:0}.q-expansion-item--expanded .q-textarea--autogrow textarea{animation:q-expansion-done 0s}@keyframes q-expansion-done{0%{--q-exp-done:1}}.z-fab{z-index:990}.q-fab{position:relative;vertical-align:middle}.q-fab>.q-btn{width:100%}.q-fab--form-rounded{border-radius:28px}.q-fab--form-square{border-radius:4px}.q-fab__active-icon,.q-fab__icon{transition:opacity .4s,transform .4s}.q-fab__icon{opacity:1;transform:rotate(0)}.q-fab__active-icon{opacity:0;transform:rotate(-180deg)}.q-fab__label--external{position:absolute;padding:0 8px;transition:opacity .18s cubic-bezier(.65, .815, .735, .395)}.q-fab__label--external-hidden{opacity:0;pointer-events:none}.q-fab__label--external-left{top:50%;left:-12px;transform:translate(-100%,-50%)}.q-fab__label--external-right{top:50%;right:-12px;transform:translate(100%,-50%)}.q-fab__label--external-bottom{bottom:-12px;left:50%;transform:translate(-50%,100%)}.q-fab__label--external-top{top:-12px;left:50%;transform:translate(-50%,-100%)}.q-fab__label--internal{padding:0;transition:font-size .12s cubic-bezier(.65, .815, .735, .395),max-height .12s cubic-bezier(.65, .815, .735, .395),opacity 70ms cubic-bezier(.65, .815, .735, .395);max-height:30px}.q-fab__label--internal-hidden{font-size:0;opacity:0}.q-fab__label--internal-top{padding-bottom:.12em}.q-fab__label--internal-bottom{padding-top:.12em}.q-fab__label--internal-bottom.q-fab__label--internal-hidden,.q-fab__label--internal-top.q-fab__label--internal-hidden{max-height:0}.q-fab__label--internal-left{padding-left:.285em;padding-right:.571em}.q-fab__label--internal-right{padding-right:.285em;padding-left:.571em}.q-fab__icon-holder{min-width:24px;min-height:24px;position:relative}.q-fab__icon-holder--opened .q-fab__icon{transform:rotate(180deg);opacity:0}.q-fab__icon-holder--opened .q-fab__active-icon{transform:rotate(0);opacity:1}.q-fab__actions{position:absolute;opacity:0;transition:transform .18s ease-in,opacity .18s ease-in;pointer-events:none;align-items:center;justify-content:center;align-self:center;padding:3px}.q-fab__actions .q-btn{margin:5px}.q-fab__actions--right{transform-origin:0 50%;transform:scale(.4) translateX(-62px);height:56px;left:100%;margin-left:9px}.q-fab__actions--left{transform-origin:100% 50%;transform:scale(.4) translateX(62px);height:56px;right:100%;margin-right:9px;flex-direction:row-reverse}.q-fab__actions--up{transform-origin:50% 100%;transform:scale(.4) translateY(62px);width:56px;bottom:100%;margin-bottom:9px;flex-direction:column-reverse}.q-fab__actions--down{transform-origin:50% 0;transform:scale(.4) translateY(-62px);width:56px;top:100%;margin-top:9px;flex-direction:column}.q-fab__actions--down,.q-fab__actions--up{left:50%;margin-left:-28px}.q-fab__actions--opened{opacity:1;transform:scale(1) translate(.1px,0);pointer-events:all}.q-fab--align-left>.q-fab__actions--down,.q-fab--align-left>.q-fab__actions--up{align-items:flex-start;left:28px}.q-fab--align-right>.q-fab__actions--down,.q-fab--align-right>.q-fab__actions--up{align-items:flex-end;left:auto;right:0}.q-field{font-size:14px}.q-field ::-ms-clear,.q-field ::-ms-reveal{display:none}.q-field--with-bottom{padding-bottom:20px}.q-field__marginal{height:56px;color:rgba(0,0,0,.54);font-size:24px}.q-field__marginal>*+*{margin-left:2px}.q-field__marginal .q-avatar{font-size:32px}.q-field__before,.q-field__prepend{padding-right:12px}.q-field__after,.q-field__append{padding-left:12px}.q-field__after:empty,.q-field__append:empty{display:none}.q-field__append+.q-field__append{padding-left:2px}.q-field__inner{text-align:left}.q-field__bottom{font-size:12px;min-height:20px;line-height:1;color:rgba(0,0,0,.54);padding:8px 12px 0;backface-visibility:hidden}.q-field__bottom--animated{transform:translateY(100%);position:absolute;left:0;right:0;bottom:0}.q-field__messages{line-height:1}.q-field__messages>div{word-break:break-word;word-wrap:break-word;overflow-wrap:break-word}.q-field__messages>div+div{margin-top:4px}.q-field__counter{padding-left:8px;line-height:1}.q-field--item-aligned{padding:8px 16px}.q-field--item-aligned .q-field__before{min-width:56px}.q-field__control-container{height:inherit}.q-field__control{color:var(--q-primary);height:56px;max-width:100%;outline:0}.q-field__control:after,.q-field__control:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.q-field__control:before{border-radius:inherit}.q-field__shadow{top:8px;opacity:0;overflow:hidden;white-space:pre-wrap;transition:opacity .36s cubic-bezier(.4, 0, .2, 1)}.q-field__shadow+.q-field__native::placeholder{transition:opacity .36s cubic-bezier(.4, 0, .2, 1)}.q-field__shadow+.q-field__native:focus::placeholder{opacity:0}.q-field__input,.q-field__native,.q-field__prefix,.q-field__suffix{font-weight:400;line-height:28px;letter-spacing:.00937em;text-decoration:inherit;text-transform:inherit;border:none;border-radius:0;background:0 0;color:rgba(0,0,0,.87);outline:0;padding:6px 0}.q-field__input,.q-field__native{width:100%;min-width:0;outline:0!important;user-select:auto}.q-field__input:-webkit-autofill,.q-field__native:-webkit-autofill{-webkit-animation-name:q-autofill;-webkit-animation-fill-mode:both}.q-field__input:invalid,.q-field__native:invalid{box-shadow:none}.q-field__native[type=file]{line-height:1em}.q-field__input{padding:0;height:0;min-height:24px;line-height:24px}.q-field__prefix,.q-field__suffix{transition:opacity .36s cubic-bezier(.4, 0, .2, 1);white-space:nowrap}.q-field__prefix{padding-right:4px}.q-field__suffix{padding-left:4px}.q-field--disabled .q-placeholder,.q-field--readonly .q-placeholder{opacity:1!important}.q-field--readonly.q-field--labeled .q-field__input,.q-field--readonly.q-field--labeled .q-field__native{cursor:default}.q-field--readonly.q-field--float .q-field__input,.q-field--readonly.q-field--float .q-field__native{cursor:text}.q-field--disabled .q-field__inner{cursor:not-allowed}.q-field--disabled .q-field__control{pointer-events:none}.q-field--disabled .q-field__control>div{opacity:.6!important}.q-field--disabled .q-field__control>div,.q-field--disabled .q-field__control>div *{outline:0!important}.q-field__label{left:0;top:18px;max-width:100%;color:rgba(0,0,0,.6);font-size:16px;line-height:1.25;font-weight:400;letter-spacing:.00937em;text-decoration:inherit;text-transform:inherit;transform-origin:left top;transition:transform .36s cubic-bezier(.4, 0, .2, 1),max-width 324ms cubic-bezier(.4, 0, .2, 1);backface-visibility:hidden}.q-field__label:has(+ :is(.q-field__native,.q-field__input):is(:-webkit-autofill,[type=color],[type=date],[type=datetime-local],[type=month],[type=time],[type=week])){transform:translateY(-40%) scale(.75)}.q-field--float .q-field__label{max-width:133%;transform:translateY(-40%) scale(.75);transition:transform .36s cubic-bezier(.4, 0, .2, 1),max-width 396ms cubic-bezier(.4, 0, .2, 1)}.q-field--highlighted .q-field__label{color:currentColor}.q-field--highlighted .q-field__shadow{opacity:.5}.q-field--filled .q-field__control{padding:0 12px;background:rgba(0,0,0,.05);border-radius:4px 4px 0 0}.q-field--filled .q-field__control:before{background:rgba(0,0,0,.05);border-bottom:1px solid rgba(0,0,0,.42);opacity:0;transition:opacity .36s cubic-bezier(.4, 0, .2, 1),background .36s cubic-bezier(.4, 0, .2, 1)}.q-field--filled .q-field__control:hover:before{opacity:1}.q-field--filled .q-field__control:after{height:2px;top:auto;transform-origin:center bottom;transform:scale3d(0,1,1);background:currentColor;transition:transform .36s cubic-bezier(.4, 0, .2, 1)}.q-field--filled.q-field--rounded .q-field__control{border-radius:28px 28px 0 0}.q-field--filled.q-field--highlighted .q-field__control:before{opacity:1;background:rgba(0,0,0,.12)}.q-field--filled.q-field--highlighted .q-field__control:after{transform:scale3d(1,1,1)}.q-field--filled.q-field--dark .q-field__control,.q-field--filled.q-field--dark .q-field__control:before{background:rgba(255,255,255,.07)}.q-field--filled.q-field--dark.q-field--highlighted .q-field__control:before{background:rgba(255,255,255,.1)}.q-field--filled.q-field--readonly .q-field__control:before{opacity:1;background:0 0;border-bottom-style:dashed}.q-field--outlined .q-field__control{border-radius:4px;padding:0 12px}.q-field--outlined .q-field__control:before{border:1px solid rgba(0,0,0,.24);transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--outlined .q-field__control:hover:before{border-color:#000}.q-field--outlined .q-field__control:after{height:inherit;border-radius:inherit;border:2px solid transparent;transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--outlined .q-field__input:-webkit-autofill,.q-field--outlined .q-field__native:-webkit-autofill{margin-top:1px;margin-bottom:1px}.q-field--outlined.q-field--rounded .q-field__control{border-radius:28px}.q-field--outlined.q-field--highlighted .q-field__control:hover:before{border-color:transparent}.q-field--outlined.q-field--highlighted .q-field__control:after{border-color:currentColor;border-width:2px;transform:scale3d(1,1,1)}.q-field--outlined.q-field--readonly .q-field__control:before{border-style:dashed}.q-field--standard .q-field__control:before{border-bottom:1px solid rgba(0,0,0,.24);transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standard .q-field__control:hover:before{border-color:#000}.q-field--standard .q-field__control:after{height:2px;top:auto;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;transform-origin:center bottom;transform:scale3d(0,1,1);background:currentColor;transition:transform .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standard.q-field--highlighted .q-field__control:after{transform:scale3d(1,1,1)}.q-field--standard.q-field--readonly .q-field__control:before{border-bottom-style:dashed}.q-field--dark .q-field__control:before{border-color:rgba(255,255,255,.6)}.q-field--dark .q-field__control:hover:before{border-color:#fff}.q-field--dark .q-field__input,.q-field--dark .q-field__native,.q-field--dark .q-field__prefix,.q-field--dark .q-field__suffix{color:#fff}.q-field--dark .q-field__bottom,.q-field--dark .q-field__marginal,.q-field--dark:not(.q-field--highlighted) .q-field__label{color:rgba(255,255,255,.7)}.q-field--standout .q-field__control{padding:0 12px;background:rgba(0,0,0,.05);border-radius:4px;transition:box-shadow .36s cubic-bezier(.4, 0, .2, 1),background-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standout .q-field__control:before{background:rgba(0,0,0,.07);opacity:0;transition:opacity .36s cubic-bezier(.4, 0, .2, 1),background .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standout .q-field__control:hover:before{opacity:1}.q-field--standout.q-field--rounded .q-field__control{border-radius:28px}.q-field--standout.q-field--highlighted .q-field__control{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);background:#000}.q-field--standout.q-field--highlighted .q-field__append,.q-field--standout.q-field--highlighted .q-field__input,.q-field--standout.q-field--highlighted .q-field__native,.q-field--standout.q-field--highlighted .q-field__prefix,.q-field--standout.q-field--highlighted .q-field__prepend,.q-field--standout.q-field--highlighted .q-field__suffix{color:#fff}.q-field--standout.q-field--readonly .q-field__control:before{opacity:1;background:0 0;border:1px dashed rgba(0,0,0,.24)}.q-field--standout.q-field--dark .q-field__control{background:rgba(255,255,255,.07)}.q-field--standout.q-field--dark .q-field__control:before{background:rgba(255,255,255,.07)}.q-field--standout.q-field--dark.q-field--highlighted .q-field__control{background:#fff}.q-field--standout.q-field--dark.q-field--highlighted .q-field__append,.q-field--standout.q-field--dark.q-field--highlighted .q-field__input,.q-field--standout.q-field--dark.q-field--highlighted .q-field__native,.q-field--standout.q-field--dark.q-field--highlighted .q-field__prefix,.q-field--standout.q-field--dark.q-field--highlighted .q-field__prepend,.q-field--standout.q-field--dark.q-field--highlighted .q-field__suffix{color:#000}.q-field--standout.q-field--dark.q-field--readonly .q-field__control:before{border-color:rgba(255,255,255,.24)}.q-field--labeled .q-field__native,.q-field--labeled .q-field__prefix,.q-field--labeled .q-field__suffix{line-height:24px;padding-top:24px;padding-bottom:8px}.q-field--labeled .q-field__shadow{top:0}.q-field--labeled:not(.q-field--float) .q-field__prefix,.q-field--labeled:not(.q-field--float) .q-field__suffix{opacity:0}.q-field--labeled:not(.q-field--float) .q-field__input::placeholder,.q-field--labeled:not(.q-field--float) .q-field__native::placeholder{color:transparent}.q-field--labeled.q-field--dense .q-field__native,.q-field--labeled.q-field--dense .q-field__prefix,.q-field--labeled.q-field--dense .q-field__suffix{padding-top:14px;padding-bottom:2px}.q-field--dense .q-field--with-bottom{padding-bottom:19px}.q-field--dense .q-field__shadow{top:0}.q-field--dense .q-field__control,.q-field--dense .q-field__marginal{height:40px}.q-field--dense .q-field__bottom{font-size:11px}.q-field--dense .q-field__label{font-size:14px;top:10px}.q-field--dense .q-field__before,.q-field--dense .q-field__prepend{padding-right:6px}.q-field--dense .q-field__after,.q-field--dense .q-field__append{padding-left:6px}.q-field--dense .q-field__append+.q-field__append{padding-left:2px}.q-field--dense .q-field__marginal .q-avatar{font-size:24px}.q-field--dense.q-field--float .q-field__label{transform:translateY(-30%) scale(.75)}.q-field--dense .q-field__label:has(+ :is(.q-field__native,.q-field__input):is(:-webkit-autofill,[type=color],[type=date],[type=datetime-local],[type=month],[type=time],[type=week])){transform:translateY(-30%) scale(.75)}.q-field--borderless .q-field__bottom,.q-field--borderless.q-field--dense .q-field__control,.q-field--standard .q-field__bottom,.q-field--standard.q-field--dense .q-field__control{padding-left:0;padding-right:0}.q-field--error .q-field__label{animation:q-field-label .36s}.q-field--error .q-field__bottom{color:var(--q-negative)}.q-field__focusable-action{opacity:.6;cursor:pointer;outline:0!important;border:0;color:inherit;background:0 0;padding:0}.q-field__focusable-action:focus,.q-field__focusable-action:hover{opacity:1}.q-field--auto-height .q-field__control{height:auto}.q-field--auto-height .q-field__control,.q-field--auto-height .q-field__native{min-height:56px}.q-field--auto-height .q-field__native{align-items:center}.q-field--auto-height .q-field__control-container{padding-top:0}.q-field--auto-height .q-field__native,.q-field--auto-height .q-field__prefix,.q-field--auto-height .q-field__suffix{line-height:18px}.q-field--auto-height.q-field--labeled .q-field__control-container{padding-top:24px}.q-field--auto-height.q-field--labeled .q-field__shadow{top:24px}.q-field--auto-height.q-field--labeled .q-field__native,.q-field--auto-height.q-field--labeled .q-field__prefix,.q-field--auto-height.q-field--labeled .q-field__suffix{padding-top:0}.q-field--auto-height.q-field--labeled .q-field__native{min-height:24px}.q-field--auto-height.q-field--dense .q-field__control,.q-field--auto-height.q-field--dense .q-field__native{min-height:40px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__control-container{padding-top:14px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__shadow{top:14px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__native{min-height:24px}.q-field--square .q-field__control{border-radius:0!important}.q-transition--field-message-enter-active,.q-transition--field-message-leave-active{transition:transform .6s cubic-bezier(.86, 0, .07, 1),opacity .6s cubic-bezier(.86, 0, .07, 1)}.q-transition--field-message-enter-from,.q-transition--field-message-leave-to{opacity:0;transform:translateY(-10px)}.q-transition--field-message-leave-active,.q-transition--field-message-leave-from{position:absolute}@keyframes q-field-label{40%{margin-left:2px}60%,80%{margin-left:-2px}70%,90%{margin-left:2px}}@keyframes q-autofill{to{background:0 0;color:inherit}}.q-file .q-field__native{word-break:break-all;overflow:hidden}.q-file .q-field__input{opacity:0!important}.q-file .q-field__input::-webkit-file-upload-button{cursor:pointer}.q-file__filler{visibility:hidden;width:100%;border:none;padding:0}.q-file__dnd{outline:1px dashed currentColor;outline-offset:-4px}.q-form{position:relative}.q-img{position:relative;width:100%;display:inline-block;vertical-align:middle;overflow:hidden}.q-img__loading .q-spinner{font-size:50px}.q-img__container{border-radius:inherit;font-size:0}.q-img__image{border-radius:inherit;width:100%;height:100%;opacity:0}.q-img__image--with-transition{transition:opacity .28s ease-in}.q-img__image--loaded{opacity:1}.q-img__content{border-radius:inherit;pointer-events:none}.q-img__content>div{pointer-events:all;position:absolute;padding:16px;color:#fff;background:rgba(0,0,0,.47)}.q-img--no-menu .q-img__image,.q-img--no-menu .q-img__placeholder{pointer-events:none}.q-inner-loading{background:rgba(255,255,255,.6);border-radius:inherit}.q-inner-loading--dark{background:rgba(0,0,0,.4)}.q-inner-loading__label{margin-top:8px}.q-textarea .q-field__control{min-height:56px;height:auto}.q-textarea .q-field__control-container{padding-top:2px;padding-bottom:2px}.q-textarea .q-field__shadow{top:2px;bottom:2px}.q-textarea .q-field__native,.q-textarea .q-field__prefix,.q-textarea .q-field__suffix{line-height:18px}.q-textarea .q-field__native{resize:vertical;padding-top:17px;min-height:52px}.q-textarea.q-field--labeled .q-field__control-container{padding-top:26px}.q-textarea.q-field--labeled .q-field__shadow{top:26px}.q-textarea.q-field--labeled .q-field__native,.q-textarea.q-field--labeled .q-field__prefix,.q-textarea.q-field--labeled .q-field__suffix{padding-top:0}.q-textarea.q-field--labeled .q-field__native{min-height:26px;padding-top:1px}.q-textarea--autogrow .q-field__native{resize:none}.q-textarea.q-field--dense .q-field__control,.q-textarea.q-field--dense .q-field__native{min-height:36px}.q-textarea.q-field--dense .q-field__native{padding-top:9px}.q-textarea.q-field--dense.q-field--labeled .q-field__control-container{padding-top:14px}.q-textarea.q-field--dense.q-field--labeled .q-field__shadow{top:14px}.q-textarea.q-field--dense.q-field--labeled .q-field__native{min-height:24px;padding-top:3px}.q-textarea.q-field--dense.q-field--labeled .q-field__prefix,.q-textarea.q-field--dense.q-field--labeled .q-field__suffix{padding-top:2px}.q-textarea.disabled .q-field__native,body.mobile .q-textarea .q-field__native{resize:none}.q-intersection{position:relative}.q-item{min-height:48px;padding:8px 16px;color:inherit;transition:color .3s,background-color .3s}.q-item__section--side{color:#757575;align-items:flex-start;padding-right:16px;width:auto;min-width:0;max-width:100%}.q-item__section--side>.q-icon{font-size:24px}.q-item__section--side>.q-avatar{font-size:40px}.q-item__section--avatar{color:inherit;min-width:56px}.q-item__section--thumbnail img{width:100px;height:56px}.q-item__section--nowrap{white-space:nowrap}.q-item>.q-focus-helper+.q-item__section--thumbnail,.q-item>.q-item__section--thumbnail:first-child{margin-left:-16px}.q-item>.q-item__section--thumbnail:last-of-type{margin-right:-16px}.q-item__label{line-height:1.2em!important;max-width:100%}.q-item__label--overline{color:rgba(0,0,0,.7)}.q-item__label--caption{color:rgba(0,0,0,.54)}.q-item__label--header{color:#757575;padding:16px;font-size:.875rem;line-height:1.25rem;letter-spacing:.01786em}.q-list--padding .q-item__label--header,.q-separator--spaced+.q-item__label--header{padding-top:8px}.q-item__label+.q-item__label{margin-top:4px}.q-item__section--main{width:auto;min-width:0;max-width:100%;flex:10000 1 0%}.q-item__section--main+.q-item__section--main{margin-left:8px}.q-item__section--main~.q-item__section--side{align-items:flex-end;padding-right:0;padding-left:16px}.q-item__section--main.q-item__section--thumbnail{margin-left:0;margin-right:-16px}.q-list--bordered{border:1px solid rgba(0,0,0,.12)}.q-list--separator>.q-item-type+.q-item-type,.q-list--separator>.q-virtual-scroll__content>.q-item-type+.q-item-type{border-top:1px solid rgba(0,0,0,.12)}.q-list--padding{padding:8px 0}.q-item--dense,.q-list--dense>.q-item{min-height:32px;padding:2px 16px}.q-list--dark.q-list--separator>.q-item-type+.q-item-type,.q-list--dark.q-list--separator>.q-virtual-scroll__content>.q-item-type+.q-item-type{border-top-color:rgba(255,255,255,.28)}.q-item--dark,.q-list--dark{color:#fff;border-color:rgba(255,255,255,.28)}.q-item--dark .q-item__section--side:not(.q-item__section--avatar),.q-list--dark .q-item__section--side:not(.q-item__section--avatar){color:rgba(255,255,255,.7)}.q-item--dark .q-item__label--header,.q-list--dark .q-item__label--header{color:rgba(255,255,255,.64)}.q-item--dark .q-item__label--caption,.q-item--dark .q-item__label--overline,.q-list--dark .q-item__label--caption,.q-list--dark .q-item__label--overline{color:rgba(255,255,255,.8)}.q-item{position:relative}.q-item--active,.q-item.q-router-link--active{color:var(--q-primary)}.q-knob{font-size:48px}.q-knob--editable{cursor:pointer;outline:0}.q-knob--editable:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;box-shadow:none;transition:box-shadow .24s ease-in-out}.q-knob--editable:focus:before{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}body.body--dark .q-knob--editable:focus:before{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-layout{width:100%;outline:0}.q-layout-container{position:relative;width:100%;height:100%}.q-layout-container .q-layout{min-height:100%}.q-layout-container>div{transform:translate3d(0,0,0)}.q-layout-container>div>div{min-height:0;max-height:100%}.q-layout__shadow{width:100%}.q-layout__shadow:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 0 10px 2px rgba(0,0,0,.2),0 0 10px rgba(0,0,0,.24)}.q-layout__section--marginal{background-color:var(--q-primary);color:#fff}.q-header--hidden{transform:translateY(-110%)}.q-header--bordered{border-bottom:1px solid rgba(0,0,0,.12)}.q-header .q-layout__shadow{bottom:-10px}.q-header .q-layout__shadow:after{bottom:10px}.q-footer--hidden{transform:translateY(110%)}.q-footer--bordered{border-top:1px solid rgba(0,0,0,.12)}.q-footer .q-layout__shadow{top:-10px}.q-footer .q-layout__shadow:after{top:10px}.q-footer,.q-header{z-index:2000}.q-drawer{position:absolute;top:0;bottom:0;background:#fff;z-index:1000}.q-drawer--on-top{z-index:3000}.q-drawer--left{left:0;transform:translateX(-100%)}.q-drawer--left.q-drawer--bordered{border-right:1px solid rgba(0,0,0,.12)}.q-drawer--left .q-layout__shadow{left:10px;right:-10px}.q-drawer--left .q-layout__shadow:after{right:10px}.q-drawer--right{right:0;transform:translateX(100%)}.q-drawer--right.q-drawer--bordered{border-left:1px solid rgba(0,0,0,.12)}.q-drawer--right .q-layout__shadow{left:-10px}.q-drawer--right .q-layout__shadow:after{left:10px}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini{padding:0!important}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section{text-align:center;justify-content:center;padding-left:0;padding-right:0;min-width:0}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__label,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section--main,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section--side~.q-item__section--side{display:none}.q-drawer--mini .q-expansion-item__content,.q-drawer--mini .q-mini-drawer-hide{display:none}.q-drawer--mini-animate .q-drawer__content{overflow-x:hidden!important;white-space:nowrap}.q-drawer--standard .q-mini-drawer-only{display:none}.q-drawer--mobile .q-mini-drawer-hide,.q-drawer--mobile .q-mini-drawer-only{display:none}.q-drawer__backdrop{z-index:2999!important;will-change:background-color}.q-drawer__opener{z-index:2001;height:100%;width:15px;user-select:none}.q-footer,.q-header,.q-layout,.q-page{position:relative}.q-page-sticky--shrink{pointer-events:none}.q-page-sticky--shrink>div{display:inline-block;pointer-events:auto}body.q-ios-padding .q-layout--standard .q-drawer--top-padding .q-drawer__content,body.q-ios-padding .q-layout--standard .q-header>.q-tabs:first-child .q-tabs__content,body.q-ios-padding .q-layout--standard .q-header>.q-toolbar:first-child{padding-top:20px;min-height:70px;padding-top:env(safe-area-inset-top);min-height:calc(env(safe-area-inset-top) + 50px)}body.q-ios-padding .q-layout--standard .q-drawer--top-padding .q-drawer__content,body.q-ios-padding .q-layout--standard .q-footer>.q-tabs:nth-last-child(1of:not(.q-layout__shadow)) .q-tabs__content,body.q-ios-padding .q-layout--standard .q-footer>.q-toolbar:last-child{padding-bottom:env(safe-area-inset-bottom);min-height:calc(env(safe-area-inset-bottom) + 50px)}.q-body--layout-animate .q-drawer__backdrop{transition:background-color .12s!important}.q-body--layout-animate .q-drawer{transition:transform .12s,width .12s,top .12s,bottom .12s!important}.q-body--layout-animate .q-layout__section--marginal{transition:transform .12s,left .12s,right .12s!important}.q-body--layout-animate .q-page-container{transition:padding-top .12s,padding-right .12s,padding-bottom .12s,padding-left .12s!important}.q-body--layout-animate .q-page-sticky{transition:transform .12s,left .12s,right .12s,top .12s,bottom .12s!important}body:not(.q-body--layout-animate) .q-layout--prevent-focus{visibility:hidden}.q-body--drawer-toggle{overflow-x:hidden!important}@media (max-width:599.98px){.q-layout-padding{padding:8px}}@media (min-width:600px) and (max-width:1439.98px){.q-layout-padding{padding:16px}}@media (min-width:1440px){.q-layout-padding{padding:24px}}body.body--dark .q-drawer,body.body--dark .q-footer,body.body--dark .q-header{border-color:rgba(255,255,255,.28)}body.body--dark .q-layout__shadow:after{box-shadow:0 0 10px 2px rgba(255,255,255,.2),0 0 10px rgba(255,255,255,.24)}body.platform-ios .q-layout--containerized{position:unset!important}.q-linear-progress{--q-linear-progress-speed:.3s;position:relative;width:100%;overflow:hidden;font-size:4px;height:1em;color:var(--q-primary);transform:scale3d(1,1,1)}.q-linear-progress__model,.q-linear-progress__track{transform-origin:0 0}.q-linear-progress__model--with-transition,.q-linear-progress__track--with-transition{transition:transform var(--q-linear-progress-speed)}.q-linear-progress--reverse .q-linear-progress__model,.q-linear-progress--reverse .q-linear-progress__track{transform-origin:0 100%}.q-linear-progress__model--determinate{background:currentColor}.q-linear-progress__model--indeterminate,.q-linear-progress__model--query{transition:none}.q-linear-progress__model--indeterminate:after,.q-linear-progress__model--indeterminate:before,.q-linear-progress__model--query:after,.q-linear-progress__model--query:before{background:currentColor;content:"";position:absolute;top:0;right:0;bottom:0;left:0;transform-origin:0 0}.q-linear-progress__model--indeterminate:before,.q-linear-progress__model--query:before{animation:q-linear-progress--indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.q-linear-progress__model--indeterminate:after,.q-linear-progress__model--query:after{transform:translate3d(-101%,0,0) scale3d(1,1,1);animation:q-linear-progress--indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation-delay:1.15s}.q-linear-progress__track{opacity:.4}.q-linear-progress__track--light{background:rgba(0,0,0,.26)}.q-linear-progress__track--dark{background:rgba(255,255,255,.6)}.q-linear-progress__stripe{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,rgba(255,255,255,0) 25%,rgba(255,255,255,0) 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,rgba(255,255,255,0) 75%,rgba(255,255,255,0))!important;background-size:40px 40px!important}.q-linear-progress__stripe--with-transition{transition:width var(--q-linear-progress-speed)}@keyframes q-linear-progress--indeterminate{0%{transform:translate3d(-35%,0,0) scale3d(.35,1,1)}60%{transform:translate3d(100%,0,0) scale3d(.9,1,1)}100%{transform:translate3d(100%,0,0) scale3d(.9,1,1)}}@keyframes q-linear-progress--indeterminate-short{0%{transform:translate3d(-101%,0,0) scale3d(1,1,1)}60%{transform:translate3d(107%,0,0) scale3d(.01,1,1)}100%{transform:translate3d(107%,0,0) scale3d(.01,1,1)}}.q-menu{position:fixed!important;display:inline-block;max-width:95vw;max-height:65vh;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);background:#fff;border-radius:4px;overflow-y:auto;overflow-x:hidden;outline:0;z-index:6000}.q-menu--square{border-radius:0}.q-menu--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-option-group--inline>div{display:inline-block}.q-pagination input{text-align:center;-moz-appearance:textfield}.q-pagination input::-webkit-inner-spin-button,.q-pagination input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.q-pagination__content{--q-pagination-gutter-parent:-2px;--q-pagination-gutter-child:2px;margin-top:var(--q-pagination-gutter-parent);margin-left:var(--q-pagination-gutter-parent)}.q-pagination__content>.q-btn,.q-pagination__content>.q-input,.q-pagination__middle>.q-btn{margin-top:var(--q-pagination-gutter-child);margin-left:var(--q-pagination-gutter-child)}.q-parallax{position:relative;width:100%;overflow:hidden;border-radius:inherit}.q-parallax__media>img,.q-parallax__media>video{position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;will-change:transform;display:none}.q-popup-edit{padding:8px 16px}.q-popup-edit__buttons{margin-top:8px}.q-popup-edit__buttons .q-btn+.q-btn{margin-left:8px}.q-pull-to-refresh{position:relative}.q-pull-to-refresh__puller{border-radius:50%;width:40px;height:40px;color:var(--q-primary);background:#fff;box-shadow:0 0 4px 0 rgba(0,0,0,.3)}.q-pull-to-refresh__puller--animating{transition:transform .3s,opacity .3s}.q-radio{vertical-align:middle}.q-radio__native{width:1px;height:1px}.q-radio__bg,.q-radio__icon-container{user-select:none}.q-radio__bg{top:25%;left:25%;width:50%;height:50%;-webkit-print-color-adjust:exact}.q-radio__bg path{fill:currentColor}.q-radio__icon{color:currentColor;font-size:.5em}.q-radio__check{transform-origin:50% 50%;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}.q-radio__inner{font-size:40px;width:1em;min-width:1em;height:1em;outline:0;border-radius:50%;color:rgba(0,0,0,.54)}.q-radio__inner--truthy{color:var(--q-primary)}.q-radio__inner--truthy .q-radio__check{transform:scale3d(1,1,1)}.q-radio.disabled{opacity:.75!important}.q-radio--dark .q-radio__inner{color:rgba(255,255,255,.7)}.q-radio--dark .q-radio__inner:before{opacity:.32!important}.q-radio--dark .q-radio__inner--truthy{color:var(--q-primary)}.q-radio--dense .q-radio__inner{width:.5em;min-width:.5em;height:.5em}.q-radio--dense .q-radio__bg{left:0;top:0;width:100%;height:100%}.q-radio--dense .q-radio__label{padding-left:.5em}.q-radio--dense.reverse .q-radio__label{padding-left:0;padding-right:.5em}body.desktop .q-radio:not(.disabled) .q-radio__inner:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}body.desktop .q-radio:not(.disabled):focus .q-radio__inner:before,body.desktop .q-radio:not(.disabled):hover .q-radio__inner:before{transform:scale3d(1,1,1)}body.desktop .q-radio--dense:not(.disabled):focus .q-radio__inner:before,body.desktop .q-radio--dense:not(.disabled):hover .q-radio__inner:before{transform:scale3d(1.5,1.5,1)}.q-rating{color:#ffeb3b;vertical-align:middle}.q-rating__icon-container{height:1em;outline:0}.q-rating__icon-container+.q-rating__icon-container{margin-left:2px}[dir=rtl] .q-rating__icon-container+.q-rating__icon-container{margin-left:0;margin-right:2px}.q-rating__icon{color:currentColor;text-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24);position:relative;opacity:.4;transition:transform .2s ease-in,opacity .2s ease-in,color .2s ease-in}.q-rating__icon--hovered{transform:scale(1.3)}.q-rating__icon--active{opacity:1}.q-rating__icon--exselected{opacity:.7}.q-rating--no-dimming .q-rating__icon{opacity:1}.q-rating--editable .q-rating__icon-container{cursor:pointer}.q-responsive{position:relative;max-width:100%;max-height:100%}.q-responsive__filler{width:inherit;max-width:inherit;height:inherit;max-height:inherit}.q-responsive__content{border-radius:inherit}.q-responsive__content>*{width:100%!important;height:100%!important;max-height:100%!important;max-width:100%!important}.q-scrollarea{position:relative;contain:strict}.q-scrollarea__bar,.q-scrollarea__thumb{opacity:.2;transition:opacity .3s;will-change:opacity;cursor:grab}.q-scrollarea__bar--v,.q-scrollarea__thumb--v{right:0;width:10px}.q-scrollarea__bar--h,.q-scrollarea__thumb--h{bottom:0;height:10px}.q-scrollarea__bar--invisible,.q-scrollarea__thumb--invisible{opacity:0!important;pointer-events:none}.q-scrollarea__thumb{background:#000;border-radius:3px}.q-scrollarea__thumb:hover{opacity:.3}.q-scrollarea__thumb:active{opacity:.5}.q-scrollarea__content{min-height:100%;min-width:100%}.q-scrollarea--dark .q-scrollarea__thumb{background:#fff}.q-select--without-input .q-field__control{cursor:pointer}.q-select--with-input .q-field__control{cursor:text}.q-select .q-field__input{min-width:50px!important;cursor:text}.q-select .q-field__input--padding{padding-left:4px}.q-select__autocomplete-input,.q-select__focus-target{position:absolute;outline:0!important;width:1px;height:1px;padding:0;border:0;opacity:0}.q-select__dropdown-icon{cursor:pointer;transition:transform .28s}.q-select.q-field--readonly .q-field__control,.q-select.q-field--readonly .q-select__dropdown-icon{cursor:default}.q-select__dialog{width:90vw!important;max-width:90vw!important;max-height:calc(100vh - 70px)!important;background:#fff;display:flex;flex-direction:column}.q-select__dialog>.scroll{position:relative;background:inherit}body.mobile:not(.native-mobile) .q-select__dialog{max-height:calc(100vh - 108px)!important}body.platform-android.native-mobile .q-dialog__inner--top .q-select__dialog{max-height:calc(100vh - 24px)!important}body.platform-android:not(.native-mobile) .q-dialog__inner--top .q-select__dialog{max-height:calc(100vh - 80px)!important}body.platform-ios.native-mobile .q-dialog__inner--top>div{border-radius:4px}body.platform-ios.native-mobile .q-dialog__inner--top .q-select__dialog--focused{max-height:47vh!important}body.platform-ios:not(.native-mobile) .q-dialog__inner--top .q-select__dialog--focused{max-height:50vh!important}.q-separator{border:0;background:rgba(0,0,0,.12);margin:0;transition:background .3s,opacity .3s;flex-shrink:0}.q-separator--dark{background:rgba(255,255,255,.28)}.q-separator--horizontal{display:block;height:1px}.q-separator--horizontal-inset{margin-left:16px;margin-right:16px}.q-separator--horizontal-item-inset{margin-left:72px;margin-right:0}.q-separator--horizontal-item-thumbnail-inset{margin-left:116px;margin-right:0}.q-separator--vertical{width:1px;height:auto;align-self:stretch}.q-separator--vertical-inset{margin-top:8px;margin-bottom:8px}.q-skeleton{--q-skeleton-speed:1500ms;background:rgba(0,0,0,.12);border-radius:4px;box-sizing:border-box}.q-skeleton--anim{cursor:wait}.q-skeleton:before{content:" "}.q-skeleton--type-text{transform:scale(1,.5)}.q-skeleton--type-QAvatar,.q-skeleton--type-circle{height:48px;width:48px;border-radius:50%}.q-skeleton--type-QBtn{width:90px;height:36px}.q-skeleton--type-QBadge{width:70px;height:16px}.q-skeleton--type-QChip{width:90px;height:28px;border-radius:16px}.q-skeleton--type-QToolbar{height:50px}.q-skeleton--type-QCheckbox,.q-skeleton--type-QRadio{width:40px;height:40px;border-radius:50%}.q-skeleton--type-QToggle{width:56px;height:40px;border-radius:7px}.q-skeleton--type-QRange,.q-skeleton--type-QSlider{height:40px}.q-skeleton--type-QInput{height:56px}.q-skeleton--bordered{border:1px solid rgba(0,0,0,.05)}.q-skeleton--square{border-radius:0}.q-skeleton--anim-fade{animation:q-skeleton--fade var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--anim-pulse{animation:q-skeleton--pulse var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-pulse-x{animation:q-skeleton--pulse-x var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-pulse-y{animation:q-skeleton--pulse-y var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-blink,.q-skeleton--anim-pop,.q-skeleton--anim-wave{position:relative;overflow:hidden;z-index:1}.q-skeleton--anim-blink:after,.q-skeleton--anim-pop:after,.q-skeleton--anim-wave:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:0}.q-skeleton--anim-blink:after{background:rgba(255,255,255,.7);animation:q-skeleton--fade var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--anim-wave:after{background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.5),rgba(255,255,255,0));animation:q-skeleton--wave var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--dark{background:rgba(255,255,255,.05)}.q-skeleton--dark.q-skeleton--bordered{border:1px solid rgba(255,255,255,.25)}.q-skeleton--dark.q-skeleton--anim-wave:after{background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.1),rgba(255,255,255,0))}.q-skeleton--dark.q-skeleton--anim-blink:after{background:rgba(255,255,255,.2)}@keyframes q-skeleton--fade{0%{opacity:1}50%{opacity:.4}100%{opacity:1}}@keyframes q-skeleton--pulse{0%{transform:scale(1)}50%{transform:scale(.85)}100%{transform:scale(1)}}@keyframes q-skeleton--pulse-x{0%{transform:scaleX(1)}50%{transform:scaleX(.75)}100%{transform:scaleX(1)}}@keyframes q-skeleton--pulse-y{0%{transform:scaleY(1)}50%{transform:scaleY(.75)}100%{transform:scaleY(1)}}@keyframes q-skeleton--wave{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}.q-slide-item{position:relative;background:#fff}.q-slide-item__bottom,.q-slide-item__left,.q-slide-item__right,.q-slide-item__top{visibility:hidden;font-size:14px;color:#fff}.q-slide-item__bottom .q-icon,.q-slide-item__left .q-icon,.q-slide-item__right .q-icon,.q-slide-item__top .q-icon{font-size:1.714em}.q-slide-item__left{background:#4caf50;padding:8px 16px}.q-slide-item__left>div{transform-origin:left center}.q-slide-item__right{background:#ff9800;padding:8px 16px}.q-slide-item__right>div{transform-origin:right center}.q-slide-item__top{background:#2196f3;padding:16px 8px}.q-slide-item__top>div{transform-origin:top center}.q-slide-item__bottom{background:#9c27b0;padding:16px 8px}.q-slide-item__bottom>div{transform-origin:bottom center}.q-slide-item__content{background:inherit;transition:transform .2s ease-in;user-select:none;cursor:pointer}.q-slider{position:relative}.q-slider--h{width:100%}.q-slider--v{height:200px}.q-slider--editable .q-slider__track-container{cursor:grab}.q-slider__track-container{outline:0}.q-slider__track-container--h{width:100%;padding:12px 0}.q-slider__track-container--h .q-slider__selection{will-change:width,left}.q-slider__track-container--v{height:100%;padding:0 12px}.q-slider__track-container--v .q-slider__selection{will-change:height,top}.q-slider__track{color:var(--q-primary);background:rgba(0,0,0,.1);border-radius:4px;width:inherit;height:inherit}.q-slider__inner{background:rgba(0,0,0,.1);border-radius:inherit;width:100%;height:100%}.q-slider__selection{background:currentColor;border-radius:inherit;width:100%;height:100%}.q-slider__markers{color:rgba(0,0,0,.3);border-radius:inherit;width:100%;height:100%}.q-slider__markers:after{content:"";position:absolute;background:currentColor}.q-slider__markers--h{background-image:repeating-linear-gradient(to right,currentColor,currentColor 2px,rgba(255,255,255,0) 0,rgba(255,255,255,0))}.q-slider__markers--h:after{height:100%;width:2px;top:0;right:0}.q-slider__markers--v{background-image:repeating-linear-gradient(to bottom,currentColor,currentColor 2px,rgba(255,255,255,0) 0,rgba(255,255,255,0))}.q-slider__markers--v:after{width:100%;height:2px;left:0;bottom:0}.q-slider__marker-labels-container{position:relative;width:100%;height:100%;min-height:24px;min-width:24px}.q-slider__marker-labels{position:absolute}.q-slider__marker-labels--h-standard{top:0}.q-slider__marker-labels--h-switched{bottom:0}.q-slider__marker-labels--h-ltr{transform:translateX(-50%)}.q-slider__marker-labels--h-rtl{transform:translateX(50%)}.q-slider__marker-labels--v-standard{left:4px}.q-slider__marker-labels--v-switched{right:4px}.q-slider__marker-labels--v-ltr{transform:translateY(-50%)}.q-slider__marker-labels--v-rtl{transform:translateY(50%)}.q-slider__thumb{z-index:1;outline:0;color:var(--q-primary);transition:transform .18s ease-out,fill .18s ease-out,stroke .18s ease-out}.q-slider__thumb.q-slider--focus{opacity:1!important}.q-slider__thumb--h{top:50%;will-change:left}.q-slider__thumb--h-ltr{transform:scale(1) translate(-50%,-50%)}.q-slider__thumb--h-rtl{transform:scale(1) translate(50%,-50%)}.q-slider__thumb--v{left:50%;will-change:top}.q-slider__thumb--v-ltr{transform:scale(1) translate(-50%,-50%)}.q-slider__thumb--v-rtl{transform:scale(1) translate(-50%,50%)}.q-slider__thumb-shape{top:0;left:0;stroke-width:3.5;stroke:currentColor;transition:transform .28s}.q-slider__thumb-shape path{stroke:currentColor;fill:currentColor}.q-slider__focus-ring{border-radius:50%;opacity:0;transition:transform .266s ease-out,opacity .266s ease-out,background-color .266s ease-out;transition-delay:0.14s}.q-slider__pin{opacity:0;white-space:nowrap;transition:opacity .28s ease-out;transition-delay:0.14s}.q-slider__pin:before{content:"";width:0;height:0;position:absolute}.q-slider__pin--h:before{border-left:6px solid transparent;border-right:6px solid transparent;left:50%;transform:translateX(-50%)}.q-slider__pin--h-standard{bottom:100%}.q-slider__pin--h-standard:before{bottom:2px;border-top:6px solid currentColor}.q-slider__pin--h-switched{top:100%}.q-slider__pin--h-switched:before{top:2px;border-bottom:6px solid currentColor}.q-slider__pin--v{top:0}.q-slider__pin--v:before{top:50%;transform:translateY(-50%);border-top:6px solid transparent;border-bottom:6px solid transparent}.q-slider__pin--v-standard{left:100%}.q-slider__pin--v-standard:before{left:2px;border-right:6px solid currentColor}.q-slider__pin--v-switched{right:100%}.q-slider__pin--v-switched:before{right:2px;border-left:6px solid currentColor}.q-slider__label{z-index:1;white-space:nowrap;position:absolute}.q-slider__label--h{left:50%;transform:translateX(-50%)}.q-slider__label--h-standard{bottom:7px}.q-slider__label--h-switched{top:7px}.q-slider__label--v{top:50%;transform:translateY(-50%)}.q-slider__label--v-standard{left:7px}.q-slider__label--v-switched{right:7px}.q-slider__text-container{min-height:25px;padding:2px 8px;border-radius:4px;background:currentColor;position:relative;text-align:center}.q-slider__text{color:#fff;font-size:12px}.q-slider--no-value .q-slider__inner,.q-slider--no-value .q-slider__selection,.q-slider--no-value .q-slider__thumb{opacity:0}.q-slider--focus .q-slider__focus-ring,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__focus-ring{background:currentColor;transform:scale3d(1.55,1.55,1);opacity:.25}.q-slider--focus .q-slider__inner,.q-slider--focus .q-slider__selection,.q-slider--focus .q-slider__thumb,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__inner,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__selection,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__thumb{opacity:1}.q-slider--inactive .q-slider__thumb--h{transition:left .28s,right .28s}.q-slider--inactive .q-slider__thumb--v{transition:top .28s,bottom .28s}.q-slider--inactive .q-slider__selection{transition:width .28s,left .28s,right .28s,height .28s,top .28s,bottom .28s}.q-slider--inactive .q-slider__text-container{transition:transform .28s}.q-slider--active{cursor:grabbing}.q-slider--active .q-slider__thumb-shape{transform:scale(1.5)}.q-slider--active .q-slider__focus-ring,.q-slider--active.q-slider--label .q-slider__thumb-shape{transform:scale(0)!important}body.desktop .q-slider.q-slider--enabled .q-slider__track-container:hover .q-slider__pin{opacity:1}.q-slider--label .q-slider--focus .q-slider__pin,.q-slider--label.q-slider--active .q-slider__pin,.q-slider--label.q-slider--label-always .q-slider__pin{opacity:1}.q-slider--dark .q-slider__track{background:rgba(255,255,255,.1)}.q-slider--dark .q-slider__inner{background:rgba(255,255,255,.1)}.q-slider--dark .q-slider__markers{color:rgba(255,255,255,.3)}.q-slider--dense .q-slider__track-container--h{padding:6px 0}.q-slider--dense .q-slider__track-container--v{padding:0 6px}.q-space{flex-grow:1!important}.q-spinner{vertical-align:middle}.q-spinner-mat{animation:q-spin 2s linear infinite;transform-origin:center center}.q-spinner-mat .path{stroke-dasharray:1,200;stroke-dashoffset:0;animation:q-mat-dash 1.5s ease-in-out infinite}@keyframes q-spin{0%{transform:rotate3d(0,0,1,0deg)}25%{transform:rotate3d(0,0,1,90deg)}50%{transform:rotate3d(0,0,1,180deg)}75%{transform:rotate3d(0,0,1,270deg)}100%{transform:rotate3d(0,0,1,359deg)}}@keyframes q-mat-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}.q-splitter__panel{position:relative;z-index:0}.q-splitter__panel>.q-splitter{width:100%;height:100%}.q-splitter__separator{background-color:rgba(0,0,0,.12);user-select:none;position:relative;z-index:1}.q-splitter__separator-area>*{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.q-splitter--dark .q-splitter__separator{background-color:rgba(255,255,255,.28)}.q-splitter--vertical>.q-splitter__panel{height:100%}.q-splitter--vertical.q-splitter--active{cursor:col-resize}.q-splitter--vertical>.q-splitter__separator{width:1px}.q-splitter--vertical>.q-splitter__separator>div{left:-6px;right:-6px}.q-splitter--vertical.q-splitter--workable>.q-splitter__separator{cursor:col-resize}.q-splitter--horizontal>.q-splitter__panel{width:100%}.q-splitter--horizontal.q-splitter--active{cursor:row-resize}.q-splitter--horizontal>.q-splitter__separator{height:1px}.q-splitter--horizontal>.q-splitter__separator>div{top:-6px;bottom:-6px}.q-splitter--horizontal.q-splitter--workable>.q-splitter__separator{cursor:row-resize}.q-splitter__after,.q-splitter__before{overflow:auto}.q-stepper{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff}.q-stepper__title{font-size:14px;line-height:1.285714;letter-spacing:.1px}.q-stepper__caption{font-size:12px;line-height:1.16667}.q-stepper__dot{contain:layout;margin-right:8px;font-size:14px;width:24px;min-width:24px;height:24px;border-radius:50%;background:currentColor}.q-stepper__dot span{color:#fff}.q-stepper__tab{padding:8px 24px;font-size:14px;color:#9e9e9e;flex-direction:row}.q-stepper--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-stepper--dark .q-stepper__dot span{color:#000}.q-stepper__tab--navigation{user-select:none;cursor:pointer}.q-stepper__tab--active,.q-stepper__tab--done{color:var(--q-primary)}.q-stepper__tab--active .q-stepper__dot,.q-stepper__tab--active .q-stepper__label,.q-stepper__tab--done .q-stepper__dot,.q-stepper__tab--done .q-stepper__label{text-shadow:0 0 0 currentColor}.q-stepper__tab--disabled .q-stepper__dot{background:rgba(0,0,0,.22)}.q-stepper__tab--disabled .q-stepper__label{color:rgba(0,0,0,.32)}.q-stepper__tab--error{color:var(--q-negative)}.q-stepper__tab--error-with-icon .q-stepper__dot{background:0 0!important}.q-stepper__tab--error-with-icon .q-stepper__dot span{color:currentColor;font-size:24px}.q-stepper__header{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-stepper__header--border{border-bottom:1px solid rgba(0,0,0,.12)}.q-stepper__header--standard-labels .q-stepper__tab{min-height:72px;justify-content:center}.q-stepper__header--standard-labels .q-stepper__tab:first-child{justify-content:flex-start}.q-stepper__header--standard-labels .q-stepper__tab:last-child{justify-content:flex-end}.q-stepper__header--standard-labels .q-stepper__tab:only-child{justify-content:center}.q-stepper__header--standard-labels .q-stepper__dot:after{display:none}.q-stepper__header--alternative-labels .q-stepper__tab{min-height:104px;padding:24px 32px;flex-direction:column;justify-content:flex-start}.q-stepper__header--alternative-labels .q-stepper__dot{margin-right:0}.q-stepper__header--alternative-labels .q-stepper__label{margin-top:8px;text-align:center}.q-stepper__header--alternative-labels .q-stepper__label:after,.q-stepper__header--alternative-labels .q-stepper__label:before{display:none}.q-stepper__header--contracted{min-height:72px}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab{min-height:72px}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab:first-child{align-items:flex-start}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab:last-child{align-items:flex-end}.q-stepper__header--contracted .q-stepper__tab{padding:24px 0}.q-stepper__header--contracted .q-stepper__tab:first-child .q-stepper__dot{transform:translateX(24px)}.q-stepper__header--contracted .q-stepper__tab:last-child .q-stepper__dot{transform:translateX(-24px)}.q-stepper__header--contracted .q-stepper__tab:not(:last-child) .q-stepper__dot:after{display:block!important}.q-stepper__header--contracted .q-stepper__dot{margin:0}.q-stepper__header--contracted .q-stepper__label{display:none}.q-stepper__nav{padding-top:24px}.q-stepper--flat{box-shadow:none}.q-stepper--bordered{border:1px solid rgba(0,0,0,.12)}.q-stepper--horizontal .q-stepper__step-inner{padding:24px}.q-stepper--horizontal .q-stepper__tab:first-child{border-top-left-radius:inherit}.q-stepper--horizontal .q-stepper__tab:last-child{border-top-right-radius:inherit}.q-stepper--horizontal .q-stepper__tab:first-child .q-stepper__dot:before,.q-stepper--horizontal .q-stepper__tab:last-child .q-stepper__dot:after,.q-stepper--horizontal .q-stepper__tab:last-child .q-stepper__label:after{display:none}.q-stepper--horizontal .q-stepper__tab{overflow:hidden}.q-stepper--horizontal .q-stepper__line{contain:layout}.q-stepper--horizontal .q-stepper__line:after,.q-stepper--horizontal .q-stepper__line:before{position:absolute;top:50%;height:1px;width:100vw;background:rgba(0,0,0,.12)}.q-stepper--horizontal .q-stepper__dot:after,.q-stepper--horizontal .q-stepper__label:after{content:"";left:100%;margin-left:8px}.q-stepper--horizontal .q-stepper__dot:before{content:"";right:100%;margin-right:8px}.q-stepper--horizontal>.q-stepper__nav{padding:0 24px 24px}.q-stepper--vertical{padding:16px 0}.q-stepper--vertical .q-stepper__tab{padding:12px 24px}.q-stepper--vertical .q-stepper__title{line-height:18px}.q-stepper--vertical .q-stepper__step-inner{padding:0 24px 32px 60px}.q-stepper--vertical>.q-stepper__nav{padding:24px 24px 0}.q-stepper--vertical .q-stepper__step{overflow:hidden}.q-stepper--vertical .q-stepper__dot{margin-right:12px}.q-stepper--vertical .q-stepper__dot:after,.q-stepper--vertical .q-stepper__dot:before{content:"";position:absolute;left:50%;width:1px;height:99999px;background:rgba(0,0,0,.12)}.q-stepper--vertical .q-stepper__dot:before{bottom:100%;margin-bottom:8px}.q-stepper--vertical .q-stepper__dot:after{top:100%;margin-top:8px}.q-stepper--vertical .q-stepper__step:first-child .q-stepper__dot:before,.q-stepper--vertical .q-stepper__step:last-child .q-stepper__dot:after{display:none}.q-stepper--vertical .q-stepper__step:last-child .q-stepper__step-inner{padding-bottom:8px}.q-stepper--dark .q-stepper__header--border,.q-stepper--dark.q-stepper--bordered{border-color:rgba(255,255,255,.28)}.q-stepper--dark.q-stepper--horizontal .q-stepper__line:after,.q-stepper--dark.q-stepper--horizontal .q-stepper__line:before{background:rgba(255,255,255,.28)}.q-stepper--dark.q-stepper--vertical .q-stepper__dot:after,.q-stepper--dark.q-stepper--vertical .q-stepper__dot:before{background:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled{color:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled .q-stepper__dot{background:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled .q-stepper__label{color:rgba(255,255,255,.54)}.q-tab-panels{background:#fff}.q-tab-panel{padding:16px}.q-markup-table{overflow:auto;background:#fff}.q-table{width:100%;max-width:100%;border-collapse:separate;border-spacing:0}.q-table tbody td,.q-table thead tr{height:48px}.q-table th{font-weight:500;font-size:12px;user-select:none}.q-table th.sortable{cursor:pointer}.q-table th.sortable:hover .q-table__sort-icon{opacity:.64}.q-table th.sorted .q-table__sort-icon{opacity:.86!important}.q-table th.sort-desc .q-table__sort-icon{transform:rotate(180deg)}.q-table td,.q-table th{padding:7px 16px;background-color:inherit}.q-table td,.q-table th,.q-table thead{border-style:solid;border-width:0}.q-table tbody td{font-size:13px}.q-table__card{color:#000;background-color:#fff;border-radius:4px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-table__card .q-table__middle{flex:1 1 auto}.q-table__card .q-table__bottom,.q-table__card .q-table__top{flex:0 0 auto}.q-table__container{position:relative}.q-table__container>div:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-table__container>div:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.q-table__container>.q-inner-loading{border-radius:inherit!important}.q-table__top{padding:12px 16px}.q-table__top .q-table__control{flex-wrap:wrap}.q-table__title{font-size:20px;letter-spacing:.005em;font-weight:400}.q-table__separator{min-width:8px!important}.q-table__progress{height:0!important}.q-table__progress th{padding:0!important;border:0!important}.q-table__progress .q-linear-progress{position:absolute;bottom:0}.q-table__middle{max-width:100%}.q-table__bottom{min-height:50px;padding:4px 14px 4px 16px;font-size:12px}.q-table__bottom .q-table__control{min-height:24px}.q-table__bottom-nodata-icon{font-size:200%;margin-right:8px}.q-table__bottom-item{margin-right:16px}.q-table__control{display:flex;align-items:center}.q-table__sort-icon{transition:transform .3s cubic-bezier(.25, .8, .5, 1);opacity:0;font-size:120%}.q-table__sort-icon--center,.q-table__sort-icon--left{margin-left:4px}.q-table__sort-icon--right{margin-right:4px}.q-table--col-auto-width{width:1px}.q-table--dark,.q-table__card--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-table--flat{box-shadow:none}.q-table--bordered{border:1px solid rgba(0,0,0,.12)}.q-table--square{border-radius:0}.q-table__linear-progress{height:2px}.q-table--no-wrap td,.q-table--no-wrap th{white-space:nowrap}.q-table--grid{box-shadow:none;border-radius:4px}.q-table--grid .q-table__top{padding-bottom:4px}.q-table--grid .q-table__middle{min-height:2px;margin-bottom:4px}.q-table--grid .q-table__middle thead,.q-table--grid .q-table__middle thead th{border:0!important}.q-table--grid .q-table__linear-progress{bottom:0}.q-table--grid .q-table__bottom{border-top:0}.q-table--grid .q-table__grid-content{flex:1 1 auto}.q-table--grid.fullscreen{background:inherit}.q-table__grid-item-card{vertical-align:top;padding:12px}.q-table__grid-item-card .q-separator{margin:12px 0}.q-table__grid-item-row+.q-table__grid-item-row{margin-top:8px}.q-table__grid-item-title{opacity:.54;font-weight:500;font-size:12px}.q-table__grid-item-value{font-size:13px}.q-table__grid-item{padding:4px;transition:transform .3s cubic-bezier(.25, .8, .5, 1)}.q-table__grid-item--selected{transform:scale(.95)}.q-table--cell-separator tbody tr:not(:last-child)>td,.q-table--cell-separator thead th,.q-table--horizontal-separator tbody tr:not(:last-child)>td,.q-table--horizontal-separator thead th{border-bottom-width:1px}.q-table--cell-separator td,.q-table--cell-separator th,.q-table--vertical-separator td,.q-table--vertical-separator th{border-left-width:1px}.q-table--cell-separator thead tr:last-child th,.q-table--cell-separator.q-table--loading tr:nth-last-child(2) th,.q-table--vertical-separator thead tr:last-child th,.q-table--vertical-separator.q-table--loading tr:nth-last-child(2) th{border-bottom-width:1px}.q-table--cell-separator td:first-child,.q-table--cell-separator th:first-child,.q-table--vertical-separator td:first-child,.q-table--vertical-separator th:first-child{border-left:0}.q-table--cell-separator .q-table__top,.q-table--vertical-separator .q-table__top{border-bottom:1px solid rgba(0,0,0,.12)}.q-table--dense .q-table__top{padding:6px 16px}.q-table--dense .q-table__bottom{min-height:33px}.q-table--dense .q-table__sort-icon{font-size:110%}.q-table--dense .q-table td,.q-table--dense .q-table th{padding:4px 8px}.q-table--dense .q-table tbody td,.q-table--dense .q-table tbody tr,.q-table--dense .q-table thead tr{height:28px}.q-table--dense .q-table td:first-child,.q-table--dense .q-table th:first-child{padding-left:16px}.q-table--dense .q-table td:last-child,.q-table--dense .q-table th:last-child{padding-right:16px}.q-table--dense .q-table__bottom-item{margin-right:8px}.q-table--dense .q-table__select .q-field__control,.q-table--dense .q-table__select .q-field__native{min-height:24px;padding:0}.q-table--dense .q-table__select .q-field__marginal{height:24px}.q-table__bottom:not(.q-table__bottom--nodata){border-top:1px solid rgba(0,0,0,.12)}.q-table td,.q-table th,.q-table thead,.q-table tr{border-color:rgba(0,0,0,.12)}.q-table tbody td{position:relative}.q-table tbody td:after,.q-table tbody td:before{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none}.q-table tbody td:before{background:rgba(0,0,0,.03)}.q-table tbody td:after{background:rgba(0,0,0,.06)}.q-table tbody tr.selected td:after{content:""}body.desktop .q-table>tbody>tr:not(.q-tr--no-hover):hover>td:not(.q-td--no-hover):before{content:""}.q-table--dark,.q-table__card--dark{border-color:rgba(255,255,255,.28)}.q-table--dark .q-table__bottom,.q-table--dark td,.q-table--dark th,.q-table--dark thead,.q-table--dark tr{border-color:rgba(255,255,255,.28)}.q-table--dark tbody td:before{background:rgba(255,255,255,.07)}.q-table--dark tbody td:after{background:rgba(255,255,255,.1)}.q-table--dark.q-table--cell-separator .q-table__top,.q-table--dark.q-table--vertical-separator .q-table__top{border-color:rgba(255,255,255,.28)}.q-tab{padding:0 16px;min-height:48px;transition:color .3s,background-color .3s;text-transform:uppercase;white-space:nowrap;color:inherit;text-decoration:none}.q-tab--full{min-height:72px}.q-tab--no-caps{text-transform:none}.q-tab__content{height:inherit;padding:4px 0;min-width:40px}.q-tab__content--inline .q-tab__icon+.q-tab__label{padding-left:8px}.q-tab__content .q-chip--floating{top:0;right:-16px}.q-tab__icon{width:24px;height:24px;font-size:24px}.q-tab__label{font-size:14px;line-height:1.715em;font-weight:500}.q-tab .q-badge{top:3px;right:-12px}.q-tab__alert,.q-tab__alert-icon{position:absolute}.q-tab__alert{top:7px;right:-9px;height:10px;width:10px;border-radius:50%;background:currentColor}.q-tab__alert-icon{top:2px;right:-12px;font-size:18px}.q-tab__indicator{opacity:0;height:2px;background:currentColor}.q-tab--active .q-tab__indicator{opacity:1;transform-origin:left}.q-tab--inactive{opacity:.85}.q-tabs{position:relative;transition:color .3s,background-color .3s}.q-tabs--scrollable.q-tabs__arrows--outside.q-tabs--horizontal{padding-left:36px;padding-right:36px}.q-tabs--scrollable.q-tabs__arrows--outside.q-tabs--vertical{padding-top:36px;padding-bottom:36px}.q-tabs--scrollable.q-tabs__arrows--outside .q-tabs__arrow--faded{opacity:.3;pointer-events:none}.q-tabs--scrollable.q-tabs__arrows--inside .q-tabs__arrow--faded{display:none}.q-tabs--not-scrollable.q-tabs__arrows--outside,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows.q-tabs__arrows--outside{padding-left:0;padding-right:0}.q-tabs--not-scrollable .q-tabs__arrow,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows .q-tabs__arrow{display:none}.q-tabs--not-scrollable .q-tabs__content,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows .q-tabs__content{border-radius:inherit}.q-tabs__arrow{cursor:pointer;font-size:32px;min-width:36px;text-shadow:0 0 3px #fff,0 0 1px #fff,0 0 1px #000;transition:opacity .3s}.q-tabs__content{overflow:hidden;flex:1 1 auto}.q-tabs__content--align-center{justify-content:center}.q-tabs__content--align-right{justify-content:flex-end}.q-tabs__content--align-justify .q-tab{flex:1 1 auto}.q-tabs__offset{display:none}.q-tabs--horizontal .q-tabs__arrow{height:100%}.q-tabs--horizontal .q-tabs__arrow--left{top:0;left:0;bottom:0}.q-tabs--horizontal .q-tabs__arrow--right{top:0;right:0;bottom:0}.q-tabs--vertical{display:block!important;height:100%}.q-tabs--vertical .q-tabs__content{display:block!important;height:100%}.q-tabs--vertical .q-tabs__arrow{width:100%;height:36px;text-align:center}.q-tabs--vertical .q-tabs__arrow--left{top:0;left:0;right:0}.q-tabs--vertical .q-tabs__arrow--right{left:0;right:0;bottom:0}.q-tabs--vertical .q-tab{padding:0 8px}.q-tabs--vertical .q-tab__indicator{height:unset;width:2px}.q-tabs--vertical.q-tabs--not-scrollable .q-tabs__content{height:100%}.q-tabs--vertical.q-tabs--dense .q-tab__content{min-width:24px}.q-tabs--dense .q-tab{min-height:36px}.q-tabs--dense .q-tab--full{min-height:52px}.q-time{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff;outline:0;width:290px;min-width:290px;max-width:100%}.q-time--bordered{border:1px solid rgba(0,0,0,.12)}.q-time__header{border-top-left-radius:inherit;color:#fff;background-color:var(--q-primary);padding:16px;font-weight:300}.q-time__actions{padding:0 16px 16px}.q-time__header-label{font-size:28px;line-height:1;letter-spacing:-.00833em}.q-time__header-label>div+div{margin-left:4px}.q-time__link{opacity:.56;outline:0;transition:opacity .3s ease-out}.q-time__link--active,.q-time__link:focus,.q-time__link:hover{opacity:1}.q-time__header-ampm{font-size:16px;letter-spacing:.1em}.q-time__content{padding:16px}.q-time__content:before{content:"";display:block;padding-bottom:100%}.q-time__container-parent{padding:16px}.q-time__container-child{border-radius:50%;background:rgba(0,0,0,.12)}.q-time__clock{padding:24px;width:100%;height:100%;max-width:100%;max-height:100%;font-size:14px}.q-time__clock-circle{position:relative}.q-time__clock-center{height:6px;width:6px;margin:auto;border-radius:50%;min-height:0;background:currentColor}.q-time__clock-pointer{width:2px;height:50%;transform-origin:0 0;min-height:0;position:absolute;left:50%;right:0;bottom:0;color:var(--q-primary);background:currentColor;transform:translateX(-50%)}.q-time__clock-pointer:after,.q-time__clock-pointer:before{content:"";position:absolute;left:50%;border-radius:50%;background:currentColor;transform:translateX(-50%)}.q-time__clock-pointer:before{bottom:-4px;width:8px;height:8px}.q-time__clock-pointer:after{top:-3px;height:6px;width:6px}.q-time__clock-position{position:absolute;min-height:32px;width:32px;height:32px;font-size:12px;line-height:32px;margin:0;padding:0;transform:translate(-50%,-50%);border-radius:50%}.q-time__clock-position--disable{opacity:.4}.q-time__clock-position--active{background-color:var(--q-primary);color:#fff}.q-time__clock-pos-0{top:0;left:50%}.q-time__clock-pos-1{top:6.7%;left:75%}.q-time__clock-pos-2{top:25%;left:93.3%}.q-time__clock-pos-3{top:50%;left:100%}.q-time__clock-pos-4{top:75%;left:93.3%}.q-time__clock-pos-5{top:93.3%;left:75%}.q-time__clock-pos-6{top:100%;left:50%}.q-time__clock-pos-7{top:93.3%;left:25%}.q-time__clock-pos-8{top:75%;left:6.7%}.q-time__clock-pos-9{top:50%;left:0}.q-time__clock-pos-10{top:25%;left:6.7%}.q-time__clock-pos-11{top:6.7%;left:25%}.q-time__clock-pos-12{top:15%;left:50%}.q-time__clock-pos-13{top:19.69%;left:67.5%}.q-time__clock-pos-14{top:32.5%;left:80.31%}.q-time__clock-pos-15{top:50%;left:85%}.q-time__clock-pos-16{top:67.5%;left:80.31%}.q-time__clock-pos-17{top:80.31%;left:67.5%}.q-time__clock-pos-18{top:85%;left:50%}.q-time__clock-pos-19{top:80.31%;left:32.5%}.q-time__clock-pos-20{top:67.5%;left:19.69%}.q-time__clock-pos-21{top:50%;left:15%}.q-time__clock-pos-22{top:32.5%;left:19.69%}.q-time__clock-pos-23{top:19.69%;left:32.5%}.q-time__now-button{background-color:var(--q-primary);color:#fff;top:12px;right:12px}.q-time--readonly .q-time__content,.q-time--readonly .q-time__header-ampm,.q-time.disabled .q-time__content,.q-time.disabled .q-time__header-ampm{pointer-events:none}.q-time--portrait{display:inline-flex;flex-direction:column}.q-time--portrait .q-time__header{border-top-right-radius:inherit;min-height:86px}.q-time--portrait .q-time__header-ampm{margin-left:12px}.q-time--portrait.q-time--bordered .q-time__content{margin:1px 0}.q-time--landscape{display:inline-flex;align-items:stretch;min-width:420px}.q-time--landscape>div{display:flex;flex-direction:column;justify-content:center}.q-time--landscape .q-time__header{border-bottom-left-radius:inherit;min-width:156px}.q-time--landscape .q-time__header-ampm{margin-top:12px}.q-time--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-timeline{padding:0;width:100%;list-style:none}.q-timeline h6{line-height:inherit}.q-timeline--dark{color:#fff}.q-timeline--dark .q-timeline__subtitle{opacity:.7}.q-timeline__content{padding-bottom:24px}.q-timeline__title{margin-top:0;margin-bottom:16px}.q-timeline__subtitle{font-size:12px;margin-bottom:8px;opacity:.6;text-transform:uppercase;letter-spacing:1px;font-weight:700}.q-timeline__dot{position:absolute;top:0;bottom:0;width:15px}.q-timeline__dot:after,.q-timeline__dot:before{content:"";background:currentColor;display:block;position:absolute}.q-timeline__dot:before{border:3px solid transparent;border-radius:100%;height:15px;width:15px;top:4px;left:0;transition:background .3s ease-in-out,border .3s ease-in-out}.q-timeline__dot:after{width:3px;opacity:.4;top:24px;bottom:0;left:6px}.q-timeline__dot .q-icon{position:absolute;top:0;left:0;right:0;font-size:16px;height:38px;line-height:38px;width:100%;color:#fff}.q-timeline__dot .q-icon>img,.q-timeline__dot .q-icon>svg{width:1em;height:1em}.q-timeline__dot-img{position:absolute;top:4px;left:0;right:0;height:31px;width:31px;background:currentColor;border-radius:50%}.q-timeline__heading{position:relative}.q-timeline__heading:first-child .q-timeline__heading-title{padding-top:0}.q-timeline__heading:last-child .q-timeline__heading-title{padding-bottom:0}.q-timeline__heading-title{padding:32px 0;margin:0}.q-timeline__entry{position:relative;line-height:22px}.q-timeline__entry:last-child{padding-bottom:0!important}.q-timeline__entry:last-child .q-timeline__dot:after{content:none}.q-timeline__entry--icon .q-timeline__dot{width:31px}.q-timeline__entry--icon .q-timeline__dot:before{height:31px;width:31px}.q-timeline__entry--icon .q-timeline__dot:after{top:41px;left:14px}.q-timeline__entry--icon .q-timeline__subtitle{padding-top:8px}.q-timeline--dense--right .q-timeline__entry{padding-left:40px}.q-timeline--dense--right .q-timeline__entry--icon .q-timeline__dot{left:-8px}.q-timeline--dense--right .q-timeline__dot{left:0}.q-timeline--dense--left .q-timeline__heading{text-align:right}.q-timeline--dense--left .q-timeline__entry{padding-right:40px}.q-timeline--dense--left .q-timeline__entry--icon .q-timeline__dot{right:-8px}.q-timeline--dense--left .q-timeline__content,.q-timeline--dense--left .q-timeline__subtitle,.q-timeline--dense--left .q-timeline__title{text-align:right}.q-timeline--dense--left .q-timeline__dot{right:0}.q-timeline--comfortable{display:table}.q-timeline--comfortable .q-timeline__heading{display:table-row;font-size:200%}.q-timeline--comfortable .q-timeline__heading>div{display:table-cell}.q-timeline--comfortable .q-timeline__entry{display:table-row;padding:0}.q-timeline--comfortable .q-timeline__entry--icon .q-timeline__content{padding-top:8px}.q-timeline--comfortable .q-timeline__content,.q-timeline--comfortable .q-timeline__dot,.q-timeline--comfortable .q-timeline__subtitle{display:table-cell;vertical-align:top}.q-timeline--comfortable .q-timeline__subtitle{width:35%}.q-timeline--comfortable .q-timeline__dot{position:relative;min-width:31px}.q-timeline--comfortable--right .q-timeline__heading .q-timeline__heading-title{margin-left:-50px}.q-timeline--comfortable--right .q-timeline__subtitle{text-align:right;padding-right:30px}.q-timeline--comfortable--right .q-timeline__content{padding-left:30px}.q-timeline--comfortable--right .q-timeline__entry--icon .q-timeline__dot{left:-8px}.q-timeline--comfortable--left .q-timeline__heading{text-align:right}.q-timeline--comfortable--left .q-timeline__heading .q-timeline__heading-title{margin-right:-50px}.q-timeline--comfortable--left .q-timeline__subtitle{padding-left:30px}.q-timeline--comfortable--left .q-timeline__content{padding-right:30px}.q-timeline--comfortable--left .q-timeline__content,.q-timeline--comfortable--left .q-timeline__title{text-align:right}.q-timeline--comfortable--left .q-timeline__entry--icon .q-timeline__dot{right:0}.q-timeline--comfortable--left .q-timeline__dot{right:-8px}.q-timeline--loose .q-timeline__heading-title{text-align:center;margin-left:0}.q-timeline--loose .q-timeline__content,.q-timeline--loose .q-timeline__dot,.q-timeline--loose .q-timeline__entry,.q-timeline--loose .q-timeline__subtitle{display:block;margin:0;padding:0}.q-timeline--loose .q-timeline__dot{position:absolute;left:50%;margin-left:-7.15px}.q-timeline--loose .q-timeline__entry{padding-bottom:24px;overflow:hidden}.q-timeline--loose .q-timeline__entry--icon .q-timeline__dot{margin-left:-15px}.q-timeline--loose .q-timeline__entry--icon .q-timeline__subtitle{line-height:38px}.q-timeline--loose .q-timeline__entry--icon .q-timeline__content{padding-top:8px}.q-timeline--loose .q-timeline__entry--left .q-timeline__content,.q-timeline--loose .q-timeline__entry--right .q-timeline__subtitle{float:left;padding-right:30px;text-align:right}.q-timeline--loose .q-timeline__entry--left .q-timeline__subtitle,.q-timeline--loose .q-timeline__entry--right .q-timeline__content{float:right;text-align:left;padding-left:30px}.q-timeline--loose .q-timeline__content,.q-timeline--loose .q-timeline__subtitle{width:50%}.q-toggle{vertical-align:middle}.q-toggle__native{width:1px;height:1px}.q-toggle__track{height:.35em;border-radius:.175em;opacity:.38;background:currentColor}.q-toggle__thumb{top:.25em;left:.25em;width:.5em;height:.5em;transition:left .22s cubic-bezier(.4, 0, .2, 1);user-select:none;z-index:0}.q-toggle__thumb:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:#fff;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.q-toggle__thumb .q-icon{font-size:.3em;min-width:1em;color:#000;opacity:.54;z-index:1}.q-toggle__inner{font-size:40px;width:1.4em;min-width:1.4em;height:1em;padding:.325em .3em;-webkit-print-color-adjust:exact}.q-toggle__inner--indet .q-toggle__thumb{left:.45em}.q-toggle__inner--truthy{color:var(--q-primary)}.q-toggle__inner--truthy .q-toggle__track{opacity:.54}.q-toggle__inner--truthy .q-toggle__thumb{left:.65em}.q-toggle__inner--truthy .q-toggle__thumb:after{background-color:currentColor}.q-toggle__inner--truthy .q-toggle__thumb .q-icon{color:#fff;opacity:1}.q-toggle.disabled{opacity:.75!important}.q-toggle--dark .q-toggle__inner{color:#fff}.q-toggle--dark .q-toggle__inner--truthy{color:var(--q-primary)}.q-toggle--dark .q-toggle__thumb:after{box-shadow:none}.q-toggle--dark .q-toggle__thumb:before{opacity:.32!important}.q-toggle--dense .q-toggle__inner{width:.8em;min-width:.8em;height:.5em;padding:.07625em 0}.q-toggle--dense .q-toggle__thumb{top:0;left:0}.q-toggle--dense .q-toggle__inner--indet .q-toggle__thumb{left:.15em}.q-toggle--dense .q-toggle__inner--truthy .q-toggle__thumb{left:.3em}.q-toggle--dense .q-toggle__label{padding-left:.5em}.q-toggle--dense.reverse .q-toggle__label{padding-left:0;padding-right:.5em}body.desktop .q-toggle:not(.disabled) .q-toggle__thumb:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1)}body.desktop .q-toggle:not(.disabled):focus .q-toggle__thumb:before,body.desktop .q-toggle:not(.disabled):hover .q-toggle__thumb:before{transform:scale3d(2,2,1)}body.desktop .q-toggle--dense:not(.disabled):focus .q-toggle__thumb:before,body.desktop .q-toggle--dense:not(.disabled):hover .q-toggle__thumb:before{transform:scale3d(1.5,1.5,1)}.q-toolbar{position:relative;padding:0 12px;min-height:50px;width:100%}.q-toolbar--inset{padding-left:58px}.q-toolbar .q-avatar{font-size:38px}.q-toolbar__title{flex:1 1 0%;min-width:1px;max-width:100%;font-size:21px;font-weight:400;letter-spacing:.01em;padding:0 12px}.q-toolbar__title:first-child{padding-left:0}.q-toolbar__title:last-child{padding-right:0}.q-tooltip--style{font-size:10px;color:#fafafa;background:#757575;border-radius:4px;text-transform:none;font-weight:400}.q-tooltip{z-index:9000;position:fixed!important;overflow-y:auto;overflow-x:hidden;padding:6px 10px;max-width:95vw;max-height:65vh}@media (max-width:599.98px){.q-tooltip{font-size:14px;padding:8px 16px}}.q-tree{position:relative;color:#9e9e9e}.q-tree__node{padding:0 0 3px 22px}.q-tree__node:after{content:"";position:absolute;top:-3px;bottom:0;width:2px;right:auto;left:-13px;border-left:1px solid currentColor}.q-tree__node:last-child:after{display:none}.q-tree__node--disabled{pointer-events:none}.q-tree__node--disabled .disabled{opacity:1!important}.q-tree__node--disabled>.disabled,.q-tree__node--disabled>div,.q-tree__node--disabled>i{opacity:.6!important}.q-tree__node--disabled>.disabled .q-tree__node--disabled>.disabled,.q-tree__node--disabled>.disabled .q-tree__node--disabled>div,.q-tree__node--disabled>.disabled .q-tree__node--disabled>i,.q-tree__node--disabled>div .q-tree__node--disabled>.disabled,.q-tree__node--disabled>div .q-tree__node--disabled>div,.q-tree__node--disabled>div .q-tree__node--disabled>i,.q-tree__node--disabled>i .q-tree__node--disabled>.disabled,.q-tree__node--disabled>i .q-tree__node--disabled>div,.q-tree__node--disabled>i .q-tree__node--disabled>i{opacity:1!important}.q-tree__node-header:before{content:"";position:absolute;top:-3px;bottom:50%;width:31px;left:-35px;border-left:1px solid currentColor;border-bottom:1px solid currentColor}.q-tree__children{padding-left:25px}.q-tree__node-body{padding:5px 0 8px 5px}.q-tree__node--parent{padding-left:2px}.q-tree__node--parent>.q-tree__node-header:before{width:15px;left:-15px}.q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body{padding:5px 0 8px 27px}.q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body:after{content:"";position:absolute;top:0;width:2px;height:100%;right:auto;left:12px;border-left:1px solid currentColor;bottom:50px}.q-tree__node--link{cursor:pointer}.q-tree__node-header{padding:4px;margin-top:3px;border-radius:4px;outline:0}.q-tree__node-header-content{color:#000;transition:color .3s}.q-tree__node--selected .q-tree__node-header-content{color:#9e9e9e}.q-tree__icon,.q-tree__node-header-content .q-icon{font-size:21px}.q-tree__img{height:42px;border-radius:2px}.q-tree__avatar,.q-tree__node-header-content .q-avatar{font-size:28px;border-radius:50%;width:28px;height:28px}.q-tree__arrow,.q-tree__spinner{font-size:16px;margin-right:4px}.q-tree__arrow{transition:transform .3s}.q-tree__arrow--rotate{transform:rotate3d(0,0,1,90deg)}.q-tree__tickbox{margin-right:4px}.q-tree>.q-tree__node{padding:0}.q-tree>.q-tree__node:after,.q-tree>.q-tree__node>.q-tree__node-header:before{display:none}.q-tree>.q-tree__node--child>.q-tree__node-header{padding-left:24px}.q-tree--dark .q-tree__node-header-content{color:#fff}.q-tree--no-connectors .q-tree__node-body:after,.q-tree--no-connectors .q-tree__node-header:before,.q-tree--no-connectors .q-tree__node:after{display:none!important}.q-tree--dense>.q-tree__node--child>.q-tree__node-header{padding-left:1px}.q-tree--dense .q-tree__arrow,.q-tree--dense .q-tree__spinner{margin-right:1px}.q-tree--dense .q-tree__img{height:32px}.q-tree--dense .q-tree__tickbox{margin-right:3px}.q-tree--dense .q-tree__node{padding:0}.q-tree--dense .q-tree__node:after{top:0;left:-8px}.q-tree--dense .q-tree__node-header{margin-top:0;padding:1px}.q-tree--dense .q-tree__node-header:before{top:0;left:-8px;width:8px}.q-tree--dense .q-tree__node--child{padding-left:17px}.q-tree--dense .q-tree__node--child>.q-tree__node-header:before{left:-25px;width:21px}.q-tree--dense .q-tree__node-body{padding:0 0 2px}.q-tree--dense .q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body{padding:0 0 2px 20px}.q-tree--dense .q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body:after{left:8px}.q-tree--dense .q-tree__children{padding-left:16px}[dir=rtl] .q-tree__arrow{transform:rotate3d(0,0,1,180deg)}[dir=rtl] .q-tree__arrow--rotate{transform:rotate3d(0,0,1,90deg)}.q-uploader{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;vertical-align:top;background:#fff;position:relative;width:320px;max-height:320px}.q-uploader--bordered{border:1px solid rgba(0,0,0,.12)}.q-uploader__input{opacity:0;width:100%;height:100%;cursor:pointer!important;z-index:1}.q-uploader__input::-webkit-file-upload-button{cursor:pointer}.q-uploader__file:before{content:"";border-top-left-radius:inherit;border-top-right-radius:inherit;position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;background:currentColor;opacity:.04}.q-uploader__header{position:relative;border-top-left-radius:inherit;border-top-right-radius:inherit;background-color:var(--q-primary);color:#fff;width:100%}.q-uploader__spinner{font-size:24px;margin-right:4px}.q-uploader__header-content{padding:8px}.q-uploader__dnd{outline:1px dashed currentColor;outline-offset:-4px;background:rgba(255,255,255,.6)}.q-uploader__overlay{font-size:36px;color:#000;background-color:rgba(255,255,255,.6)}.q-uploader__list{position:relative;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding:8px;min-height:60px;flex:1 1 auto}.q-uploader__file{border-radius:4px 4px 0 0;border:1px solid rgba(0,0,0,.12)}.q-uploader__file .q-circular-progress{font-size:24px}.q-uploader__file--img{color:#fff;height:200px;min-width:200px;background-position:50% 50%;background-repeat:no-repeat}.q-uploader__file--img:before{content:none}.q-uploader__file--img .q-circular-progress{color:#fff}.q-uploader__file--img .q-uploader__file-header{padding-bottom:24px;background:linear-gradient(to bottom,rgba(0,0,0,.7) 20%,rgba(255,255,255,0))}.q-uploader__file+.q-uploader__file{margin-top:8px}.q-uploader__file-header{position:relative;padding:4px 8px;border-top-left-radius:inherit;border-top-right-radius:inherit}.q-uploader__file-header-content{padding-right:8px}.q-uploader__file-status{font-size:24px;margin-right:4px}.q-uploader__title{font-size:14px;font-weight:700;line-height:1.285714;word-break:break-word}.q-uploader__subtitle{font-size:12px;line-height:1.5}.q-uploader--disable .q-uploader__header,.q-uploader--disable .q-uploader__list{pointer-events:none}.q-uploader--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-uploader--dark .q-uploader__file{border-color:rgba(255,255,255,.28)}.q-uploader--dark .q-uploader__dnd,.q-uploader--dark .q-uploader__overlay{background:rgba(255,255,255,.3)}.q-uploader--dark .q-uploader__overlay{color:#fff}img.responsive{max-width:100%;height:auto}.q-video{position:relative;overflow:hidden;border-radius:inherit}.q-video embed,.q-video iframe,.q-video object{width:100%;height:100%}.q-video--responsive{height:0}.q-video--responsive embed,.q-video--responsive iframe,.q-video--responsive object{position:absolute;top:0;left:0}.q-virtual-scroll:focus{outline:0}.q-virtual-scroll__content{outline:0;contain:content}.q-virtual-scroll__content>*{overflow-anchor:none}.q-virtual-scroll__content>[data-q-vs-anchor]{overflow-anchor:auto}.q-virtual-scroll__padding{background:linear-gradient(rgba(255,255,255,0),rgba(255,255,255,0) 20%,rgba(128,128,128,.03) 20%,rgba(128,128,128,.08) 50%,rgba(128,128,128,.03) 80%,rgba(255,255,255,0) 80%,rgba(255,255,255,0));background-size:var(--q-virtual-scroll-item-width,100%) var(--q-virtual-scroll-item-height,50px)}.q-table .q-virtual-scroll__padding tr{height:0!important}.q-table .q-virtual-scroll__padding td{padding:0!important}.q-virtual-scroll--horizontal{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch}.q-virtual-scroll--horizontal .q-virtual-scroll__content{display:flex;flex-direction:row;flex-wrap:nowrap}.q-virtual-scroll--horizontal .q-virtual-scroll__content,.q-virtual-scroll--horizontal .q-virtual-scroll__content>*,.q-virtual-scroll--horizontal .q-virtual-scroll__padding{flex:0 0 auto}.q-virtual-scroll--horizontal .q-virtual-scroll__padding{background:linear-gradient(to left,rgba(255,255,255,0),rgba(255,255,255,0) 20%,rgba(128,128,128,.03) 20%,rgba(128,128,128,.08) 50%,rgba(128,128,128,.03) 80%,rgba(255,255,255,0) 80%,rgba(255,255,255,0));background-size:var(--q-virtual-scroll-item-width,50px) var(--q-virtual-scroll-item-height,100%)}.q-ripple{position:absolute;top:0;left:0;width:100%;height:100%;color:inherit;border-radius:inherit;z-index:0;pointer-events:none;overflow:hidden;contain:strict}.q-ripple__inner{position:absolute;top:0;left:0;opacity:0;color:inherit;border-radius:50%;background:currentColor;pointer-events:none;will-change:transform,opacity}.q-ripple__inner--enter{transition:transform 225ms cubic-bezier(.4, 0, .2, 1),opacity .1s cubic-bezier(.4, 0, .2, 1)}.q-ripple__inner--leave{transition:opacity .25s cubic-bezier(.4, 0, .2, 1)}.q-morph--internal,.q-morph--invisible{opacity:0!important;pointer-events:none!important;position:fixed!important;right:200vw!important;bottom:200vh!important}.q-bottom-sheet{padding-bottom:8px}.q-bottom-sheet__avatar{border-radius:50%}.q-bottom-sheet--list{width:400px}.q-bottom-sheet--list .q-icon,.q-bottom-sheet--list img{font-size:24px;width:24px;height:24px}.q-bottom-sheet--grid{width:700px}.q-bottom-sheet--grid .q-bottom-sheet__item{padding:8px;text-align:center;min-width:100px}.q-bottom-sheet--grid .q-bottom-sheet__empty-icon,.q-bottom-sheet--grid .q-icon,.q-bottom-sheet--grid img{font-size:48px;width:48px;height:48px;margin-bottom:8px}.q-bottom-sheet--grid .q-separator{margin:12px 0}.q-bottom-sheet__item{flex:0 0 33.3333%}@media (min-width:600px){.q-bottom-sheet__item{flex:0 0 25%}}.q-dialog-plugin{width:400px}.q-dialog-plugin__form{max-height:50vh}.q-dialog-plugin .q-card__section+.q-card__section{padding-top:0}.q-dialog-plugin--progress{text-align:center}.q-loading{color:#000;position:fixed!important}.q-loading__backdrop{position:fixed;top:0;right:0;bottom:0;left:0;opacity:.5;z-index:-1;background-color:#000;transition:background-color .28s}.q-loading__box{border-radius:4px;padding:18px;color:#fff;max-width:450px}.q-loading__message{margin:40px 20px 0;text-align:center}.q-notifications__list{z-index:9500;pointer-events:none;left:0;right:0;margin-bottom:10px;position:relative}.q-notifications__list--center{top:0;bottom:0}.q-notifications__list--top{top:0}.q-notifications__list--bottom{bottom:0}body.q-ios-padding .q-notifications__list--center,body.q-ios-padding .q-notifications__list--top{top:20px;top:env(safe-area-inset-top)}body.q-ios-padding .q-notifications__list--bottom,body.q-ios-padding .q-notifications__list--center{bottom:env(safe-area-inset-bottom)}.q-notification{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;pointer-events:all;display:inline-flex;margin:10px 10px 0;transition:transform 1s,opacity 1s;z-index:9500;flex-shrink:0;max-width:95vw;background:#323232;color:#fff;font-size:14px}.q-notification__icon{font-size:24px;flex:0 0 1em}.q-notification__icon--additional{margin-right:16px}.q-notification__avatar{font-size:32px}.q-notification__avatar--additional{margin-right:8px}.q-notification__spinner{font-size:32px}.q-notification__spinner--additional{margin-right:8px}.q-notification__message{padding:8px 0}.q-notification__caption{font-size:.9em;opacity:.7}.q-notification__actions{color:var(--q-primary)}.q-notification__badge{animation:q-notif-badge .42s;padding:4px 8px;position:absolute;box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12);background-color:var(--q-negative);color:#fff;border-radius:4px;font-size:12px;line-height:12px}.q-notification__badge--top-left,.q-notification__badge--top-right{top:-6px}.q-notification__badge--bottom-left,.q-notification__badge--bottom-right{bottom:-6px}.q-notification__badge--bottom-left,.q-notification__badge--top-left{left:-22px}.q-notification__badge--bottom-right,.q-notification__badge--top-right{right:-22px}.q-notification__progress{z-index:-1;position:absolute;height:3px;bottom:0;left:-10px;right:-10px;animation:q-notif-progress linear;background:currentColor;opacity:.3;border-radius:4px 4px 0 0;transform-origin:0 50%;transform:scaleX(0)}.q-notification--standard{padding:0 16px;min-height:48px}.q-notification--standard .q-notification__actions{padding:6px 0 6px 8px;margin-right:-8px}.q-notification--multi-line{min-height:68px;padding:8px 16px}.q-notification--multi-line .q-notification__badge--top-left,.q-notification--multi-line .q-notification__badge--top-right{top:-15px}.q-notification--multi-line .q-notification__badge--bottom-left,.q-notification--multi-line .q-notification__badge--bottom-right{bottom:-15px}.q-notification--multi-line .q-notification__progress{bottom:-8px}.q-notification--multi-line .q-notification__actions{padding:0}.q-notification--multi-line .q-notification__actions--with-media{padding-left:25px}.q-notification--top-enter-from,.q-notification--top-leave-to,.q-notification--top-left-enter-from,.q-notification--top-left-leave-to,.q-notification--top-right-enter-from,.q-notification--top-right-leave-to{opacity:0;transform:translateY(-50px);z-index:9499}.q-notification--center-enter-from,.q-notification--center-leave-to,.q-notification--left-enter-from,.q-notification--left-leave-to,.q-notification--right-enter-from,.q-notification--right-leave-to{opacity:0;transform:rotateX(90deg);z-index:9499}.q-notification--bottom-enter-from,.q-notification--bottom-leave-to,.q-notification--bottom-left-enter-from,.q-notification--bottom-left-leave-to,.q-notification--bottom-right-enter-from,.q-notification--bottom-right-leave-to{opacity:0;transform:translateY(50px);z-index:9499}.q-notification--bottom-leave-active,.q-notification--bottom-left-leave-active,.q-notification--bottom-right-leave-active,.q-notification--center-leave-active,.q-notification--left-leave-active,.q-notification--right-leave-active,.q-notification--top-leave-active,.q-notification--top-left-leave-active,.q-notification--top-right-leave-active{position:absolute;z-index:9499;margin-left:0;margin-right:0}.q-notification--center-leave-active,.q-notification--top-leave-active{top:0}.q-notification--bottom-leave-active,.q-notification--bottom-left-leave-active,.q-notification--bottom-right-leave-active{bottom:0}@media (min-width:600px){.q-notification{max-width:65vw}}@keyframes q-notif-badge{15%{transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}}@keyframes q-notif-progress{0%{transform:scaleX(1)}100%{transform:scaleX(0)}}:root{--animate-duration:0.3s;--animate-delay:0.3s;--animate-repeat:1}.animated{animation-duration:var(--animate-duration);animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}.animated.repeat-1{animation-iteration-count:var(--animate-repeat)}.animated.repeat-2{animation-iteration-count:calc(var(--animate-repeat) * 2)}.animated.repeat-3{animation-iteration-count:calc(var(--animate-repeat) * 3)}.animated.delay-1s{animation-delay:var(--animate-delay)}.animated.delay-2s{animation-delay:calc(var(--animate-delay) * 2)}.animated.delay-3s{animation-delay:calc(var(--animate-delay) * 3)}.animated.delay-4s{animation-delay:calc(var(--animate-delay) * 4)}.animated.delay-5s{animation-delay:calc(var(--animate-delay) * 5)}.animated.faster{animation-duration:calc(var(--animate-duration) / 2)}.animated.fast{animation-duration:calc(var(--animate-duration) * .8)}.animated.slow{animation-duration:calc(var(--animate-duration) * 2)}.animated.slower{animation-duration:calc(var(--animate-duration) * 3)}@media print,(prefers-reduced-motion:reduce){.animated{animation-duration:1ms!important;transition-duration:1ms!important;animation-iteration-count:1!important}.animated[class*=Out]{opacity:0}}.q-animate--scale{animation:q-scale .15s;animation-timing-function:cubic-bezier(0.25,0.8,0.25,1)}@keyframes q-scale{0%{transform:scale(1)}50%{transform:scale(1.04)}100%{transform:scale(1)}}.q-animate--fade{animation:q-fade .2s}@keyframes q-fade{0%{opacity:0}100%{opacity:1}}:root{--q-primary:#1976D2;--q-secondary:#26A69A;--q-accent:#9C27B0;--q-positive:#21BA45;--q-negative:#C10015;--q-info:#31CCEC;--q-warning:#F2C037;--q-dark:#1d1d1d;--q-dark-page:#121212}.text-dark{color:var(--q-dark)!important}.bg-dark{background:var(--q-dark)!important}.text-primary{color:var(--q-primary)!important}.bg-primary{background:var(--q-primary)!important}.text-secondary{color:var(--q-secondary)!important}.bg-secondary{background:var(--q-secondary)!important}.text-accent{color:var(--q-accent)!important}.bg-accent{background:var(--q-accent)!important}.text-positive{color:var(--q-positive)!important}.bg-positive{background:var(--q-positive)!important}.text-negative{color:var(--q-negative)!important}.bg-negative{background:var(--q-negative)!important}.text-info{color:var(--q-info)!important}.bg-info{background:var(--q-info)!important}.text-warning{color:var(--q-warning)!important}.bg-warning{background:var(--q-warning)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.text-transparent{color:transparent!important}.bg-transparent{background:0 0!important}.text-separator{color:rgba(0,0,0,.12)!important}.bg-separator{background:rgba(0,0,0,.12)!important}.text-dark-separator{color:rgba(255,255,255,.28)!important}.bg-dark-separator{background:rgba(255,255,255,.28)!important}.text-red{color:#f44336!important}.text-red-1{color:#ffebee!important}.text-red-2{color:#ffcdd2!important}.text-red-3{color:#ef9a9a!important}.text-red-4{color:#e57373!important}.text-red-5{color:#ef5350!important}.text-red-6{color:#f44336!important}.text-red-7{color:#e53935!important}.text-red-8{color:#d32f2f!important}.text-red-9{color:#c62828!important}.text-red-10{color:#b71c1c!important}.text-red-11{color:#ff8a80!important}.text-red-12{color:#ff5252!important}.text-red-13{color:#ff1744!important}.text-red-14{color:#d50000!important}.text-pink{color:#e91e63!important}.text-pink-1{color:#fce4ec!important}.text-pink-2{color:#f8bbd0!important}.text-pink-3{color:#f48fb1!important}.text-pink-4{color:#f06292!important}.text-pink-5{color:#ec407a!important}.text-pink-6{color:#e91e63!important}.text-pink-7{color:#d81b60!important}.text-pink-8{color:#c2185b!important}.text-pink-9{color:#ad1457!important}.text-pink-10{color:#880e4f!important}.text-pink-11{color:#ff80ab!important}.text-pink-12{color:#ff4081!important}.text-pink-13{color:#f50057!important}.text-pink-14{color:#c51162!important}.text-purple{color:#9c27b0!important}.text-purple-1{color:#f3e5f5!important}.text-purple-2{color:#e1bee7!important}.text-purple-3{color:#ce93d8!important}.text-purple-4{color:#ba68c8!important}.text-purple-5{color:#ab47bc!important}.text-purple-6{color:#9c27b0!important}.text-purple-7{color:#8e24aa!important}.text-purple-8{color:#7b1fa2!important}.text-purple-9{color:#6a1b9a!important}.text-purple-10{color:#4a148c!important}.text-purple-11{color:#ea80fc!important}.text-purple-12{color:#e040fb!important}.text-purple-13{color:#d500f9!important}.text-purple-14{color:#a0f!important}.text-deep-purple{color:#673ab7!important}.text-deep-purple-1{color:#ede7f6!important}.text-deep-purple-2{color:#d1c4e9!important}.text-deep-purple-3{color:#b39ddb!important}.text-deep-purple-4{color:#9575cd!important}.text-deep-purple-5{color:#7e57c2!important}.text-deep-purple-6{color:#673ab7!important}.text-deep-purple-7{color:#5e35b1!important}.text-deep-purple-8{color:#512da8!important}.text-deep-purple-9{color:#4527a0!important}.text-deep-purple-10{color:#311b92!important}.text-deep-purple-11{color:#b388ff!important}.text-deep-purple-12{color:#7c4dff!important}.text-deep-purple-13{color:#651fff!important}.text-deep-purple-14{color:#6200ea!important}.text-indigo{color:#3f51b5!important}.text-indigo-1{color:#e8eaf6!important}.text-indigo-2{color:#c5cae9!important}.text-indigo-3{color:#9fa8da!important}.text-indigo-4{color:#7986cb!important}.text-indigo-5{color:#5c6bc0!important}.text-indigo-6{color:#3f51b5!important}.text-indigo-7{color:#3949ab!important}.text-indigo-8{color:#303f9f!important}.text-indigo-9{color:#283593!important}.text-indigo-10{color:#1a237e!important}.text-indigo-11{color:#8c9eff!important}.text-indigo-12{color:#536dfe!important}.text-indigo-13{color:#3d5afe!important}.text-indigo-14{color:#304ffe!important}.text-blue{color:#2196f3!important}.text-blue-1{color:#e3f2fd!important}.text-blue-2{color:#bbdefb!important}.text-blue-3{color:#90caf9!important}.text-blue-4{color:#64b5f6!important}.text-blue-5{color:#42a5f5!important}.text-blue-6{color:#2196f3!important}.text-blue-7{color:#1e88e5!important}.text-blue-8{color:#1976d2!important}.text-blue-9{color:#1565c0!important}.text-blue-10{color:#0d47a1!important}.text-blue-11{color:#82b1ff!important}.text-blue-12{color:#448aff!important}.text-blue-13{color:#2979ff!important}.text-blue-14{color:#2962ff!important}.text-light-blue{color:#03a9f4!important}.text-light-blue-1{color:#e1f5fe!important}.text-light-blue-2{color:#b3e5fc!important}.text-light-blue-3{color:#81d4fa!important}.text-light-blue-4{color:#4fc3f7!important}.text-light-blue-5{color:#29b6f6!important}.text-light-blue-6{color:#03a9f4!important}.text-light-blue-7{color:#039be5!important}.text-light-blue-8{color:#0288d1!important}.text-light-blue-9{color:#0277bd!important}.text-light-blue-10{color:#01579b!important}.text-light-blue-11{color:#80d8ff!important}.text-light-blue-12{color:#40c4ff!important}.text-light-blue-13{color:#00b0ff!important}.text-light-blue-14{color:#0091ea!important}.text-cyan{color:#00bcd4!important}.text-cyan-1{color:#e0f7fa!important}.text-cyan-2{color:#b2ebf2!important}.text-cyan-3{color:#80deea!important}.text-cyan-4{color:#4dd0e1!important}.text-cyan-5{color:#26c6da!important}.text-cyan-6{color:#00bcd4!important}.text-cyan-7{color:#00acc1!important}.text-cyan-8{color:#0097a7!important}.text-cyan-9{color:#00838f!important}.text-cyan-10{color:#006064!important}.text-cyan-11{color:#84ffff!important}.text-cyan-12{color:#18ffff!important}.text-cyan-13{color:#00e5ff!important}.text-cyan-14{color:#00b8d4!important}.text-teal{color:#009688!important}.text-teal-1{color:#e0f2f1!important}.text-teal-2{color:#b2dfdb!important}.text-teal-3{color:#80cbc4!important}.text-teal-4{color:#4db6ac!important}.text-teal-5{color:#26a69a!important}.text-teal-6{color:#009688!important}.text-teal-7{color:#00897b!important}.text-teal-8{color:#00796b!important}.text-teal-9{color:#00695c!important}.text-teal-10{color:#004d40!important}.text-teal-11{color:#a7ffeb!important}.text-teal-12{color:#64ffda!important}.text-teal-13{color:#1de9b6!important}.text-teal-14{color:#00bfa5!important}.text-green{color:#4caf50!important}.text-green-1{color:#e8f5e9!important}.text-green-2{color:#c8e6c9!important}.text-green-3{color:#a5d6a7!important}.text-green-4{color:#81c784!important}.text-green-5{color:#66bb6a!important}.text-green-6{color:#4caf50!important}.text-green-7{color:#43a047!important}.text-green-8{color:#388e3c!important}.text-green-9{color:#2e7d32!important}.text-green-10{color:#1b5e20!important}.text-green-11{color:#b9f6ca!important}.text-green-12{color:#69f0ae!important}.text-green-13{color:#00e676!important}.text-green-14{color:#00c853!important}.text-light-green{color:#8bc34a!important}.text-light-green-1{color:#f1f8e9!important}.text-light-green-2{color:#dcedc8!important}.text-light-green-3{color:#c5e1a5!important}.text-light-green-4{color:#aed581!important}.text-light-green-5{color:#9ccc65!important}.text-light-green-6{color:#8bc34a!important}.text-light-green-7{color:#7cb342!important}.text-light-green-8{color:#689f38!important}.text-light-green-9{color:#558b2f!important}.text-light-green-10{color:#33691e!important}.text-light-green-11{color:#ccff90!important}.text-light-green-12{color:#b2ff59!important}.text-light-green-13{color:#76ff03!important}.text-light-green-14{color:#64dd17!important}.text-lime{color:#cddc39!important}.text-lime-1{color:#f9fbe7!important}.text-lime-2{color:#f0f4c3!important}.text-lime-3{color:#e6ee9c!important}.text-lime-4{color:#dce775!important}.text-lime-5{color:#d4e157!important}.text-lime-6{color:#cddc39!important}.text-lime-7{color:#c0ca33!important}.text-lime-8{color:#afb42b!important}.text-lime-9{color:#9e9d24!important}.text-lime-10{color:#827717!important}.text-lime-11{color:#f4ff81!important}.text-lime-12{color:#eeff41!important}.text-lime-13{color:#c6ff00!important}.text-lime-14{color:#aeea00!important}.text-yellow{color:#ffeb3b!important}.text-yellow-1{color:#fffde7!important}.text-yellow-2{color:#fff9c4!important}.text-yellow-3{color:#fff59d!important}.text-yellow-4{color:#fff176!important}.text-yellow-5{color:#ffee58!important}.text-yellow-6{color:#ffeb3b!important}.text-yellow-7{color:#fdd835!important}.text-yellow-8{color:#fbc02d!important}.text-yellow-9{color:#f9a825!important}.text-yellow-10{color:#f57f17!important}.text-yellow-11{color:#ffff8d!important}.text-yellow-12{color:#ff0!important}.text-yellow-13{color:#ffea00!important}.text-yellow-14{color:#ffd600!important}.text-amber{color:#ffc107!important}.text-amber-1{color:#fff8e1!important}.text-amber-2{color:#ffecb3!important}.text-amber-3{color:#ffe082!important}.text-amber-4{color:#ffd54f!important}.text-amber-5{color:#ffca28!important}.text-amber-6{color:#ffc107!important}.text-amber-7{color:#ffb300!important}.text-amber-8{color:#ffa000!important}.text-amber-9{color:#ff8f00!important}.text-amber-10{color:#ff6f00!important}.text-amber-11{color:#ffe57f!important}.text-amber-12{color:#ffd740!important}.text-amber-13{color:#ffc400!important}.text-amber-14{color:#ffab00!important}.text-orange{color:#ff9800!important}.text-orange-1{color:#fff3e0!important}.text-orange-2{color:#ffe0b2!important}.text-orange-3{color:#ffcc80!important}.text-orange-4{color:#ffb74d!important}.text-orange-5{color:#ffa726!important}.text-orange-6{color:#ff9800!important}.text-orange-7{color:#fb8c00!important}.text-orange-8{color:#f57c00!important}.text-orange-9{color:#ef6c00!important}.text-orange-10{color:#e65100!important}.text-orange-11{color:#ffd180!important}.text-orange-12{color:#ffab40!important}.text-orange-13{color:#ff9100!important}.text-orange-14{color:#ff6d00!important}.text-deep-orange{color:#ff5722!important}.text-deep-orange-1{color:#fbe9e7!important}.text-deep-orange-2{color:#ffccbc!important}.text-deep-orange-3{color:#ffab91!important}.text-deep-orange-4{color:#ff8a65!important}.text-deep-orange-5{color:#ff7043!important}.text-deep-orange-6{color:#ff5722!important}.text-deep-orange-7{color:#f4511e!important}.text-deep-orange-8{color:#e64a19!important}.text-deep-orange-9{color:#d84315!important}.text-deep-orange-10{color:#bf360c!important}.text-deep-orange-11{color:#ff9e80!important}.text-deep-orange-12{color:#ff6e40!important}.text-deep-orange-13{color:#ff3d00!important}.text-deep-orange-14{color:#dd2c00!important}.text-brown{color:#795548!important}.text-brown-1{color:#efebe9!important}.text-brown-2{color:#d7ccc8!important}.text-brown-3{color:#bcaaa4!important}.text-brown-4{color:#a1887f!important}.text-brown-5{color:#8d6e63!important}.text-brown-6{color:#795548!important}.text-brown-7{color:#6d4c41!important}.text-brown-8{color:#5d4037!important}.text-brown-9{color:#4e342e!important}.text-brown-10{color:#3e2723!important}.text-brown-11{color:#d7ccc8!important}.text-brown-12{color:#bcaaa4!important}.text-brown-13{color:#8d6e63!important}.text-brown-14{color:#5d4037!important}.text-grey{color:#9e9e9e!important}.text-grey-1{color:#fafafa!important}.text-grey-2{color:#f5f5f5!important}.text-grey-3{color:#eee!important}.text-grey-4{color:#e0e0e0!important}.text-grey-5{color:#bdbdbd!important}.text-grey-6{color:#9e9e9e!important}.text-grey-7{color:#757575!important}.text-grey-8{color:#616161!important}.text-grey-9{color:#424242!important}.text-grey-10{color:#212121!important}.text-grey-11{color:#f5f5f5!important}.text-grey-12{color:#eee!important}.text-grey-13{color:#bdbdbd!important}.text-grey-14{color:#616161!important}.text-blue-grey{color:#607d8b!important}.text-blue-grey-1{color:#eceff1!important}.text-blue-grey-2{color:#cfd8dc!important}.text-blue-grey-3{color:#b0bec5!important}.text-blue-grey-4{color:#90a4ae!important}.text-blue-grey-5{color:#78909c!important}.text-blue-grey-6{color:#607d8b!important}.text-blue-grey-7{color:#546e7a!important}.text-blue-grey-8{color:#455a64!important}.text-blue-grey-9{color:#37474f!important}.text-blue-grey-10{color:#263238!important}.text-blue-grey-11{color:#cfd8dc!important}.text-blue-grey-12{color:#b0bec5!important}.text-blue-grey-13{color:#78909c!important}.text-blue-grey-14{color:#455a64!important}.bg-red{background:#f44336!important}.bg-red-1{background:#ffebee!important}.bg-red-2{background:#ffcdd2!important}.bg-red-3{background:#ef9a9a!important}.bg-red-4{background:#e57373!important}.bg-red-5{background:#ef5350!important}.bg-red-6{background:#f44336!important}.bg-red-7{background:#e53935!important}.bg-red-8{background:#d32f2f!important}.bg-red-9{background:#c62828!important}.bg-red-10{background:#b71c1c!important}.bg-red-11{background:#ff8a80!important}.bg-red-12{background:#ff5252!important}.bg-red-13{background:#ff1744!important}.bg-red-14{background:#d50000!important}.bg-pink{background:#e91e63!important}.bg-pink-1{background:#fce4ec!important}.bg-pink-2{background:#f8bbd0!important}.bg-pink-3{background:#f48fb1!important}.bg-pink-4{background:#f06292!important}.bg-pink-5{background:#ec407a!important}.bg-pink-6{background:#e91e63!important}.bg-pink-7{background:#d81b60!important}.bg-pink-8{background:#c2185b!important}.bg-pink-9{background:#ad1457!important}.bg-pink-10{background:#880e4f!important}.bg-pink-11{background:#ff80ab!important}.bg-pink-12{background:#ff4081!important}.bg-pink-13{background:#f50057!important}.bg-pink-14{background:#c51162!important}.bg-purple{background:#9c27b0!important}.bg-purple-1{background:#f3e5f5!important}.bg-purple-2{background:#e1bee7!important}.bg-purple-3{background:#ce93d8!important}.bg-purple-4{background:#ba68c8!important}.bg-purple-5{background:#ab47bc!important}.bg-purple-6{background:#9c27b0!important}.bg-purple-7{background:#8e24aa!important}.bg-purple-8{background:#7b1fa2!important}.bg-purple-9{background:#6a1b9a!important}.bg-purple-10{background:#4a148c!important}.bg-purple-11{background:#ea80fc!important}.bg-purple-12{background:#e040fb!important}.bg-purple-13{background:#d500f9!important}.bg-purple-14{background:#a0f!important}.bg-deep-purple{background:#673ab7!important}.bg-deep-purple-1{background:#ede7f6!important}.bg-deep-purple-2{background:#d1c4e9!important}.bg-deep-purple-3{background:#b39ddb!important}.bg-deep-purple-4{background:#9575cd!important}.bg-deep-purple-5{background:#7e57c2!important}.bg-deep-purple-6{background:#673ab7!important}.bg-deep-purple-7{background:#5e35b1!important}.bg-deep-purple-8{background:#512da8!important}.bg-deep-purple-9{background:#4527a0!important}.bg-deep-purple-10{background:#311b92!important}.bg-deep-purple-11{background:#b388ff!important}.bg-deep-purple-12{background:#7c4dff!important}.bg-deep-purple-13{background:#651fff!important}.bg-deep-purple-14{background:#6200ea!important}.bg-indigo{background:#3f51b5!important}.bg-indigo-1{background:#e8eaf6!important}.bg-indigo-2{background:#c5cae9!important}.bg-indigo-3{background:#9fa8da!important}.bg-indigo-4{background:#7986cb!important}.bg-indigo-5{background:#5c6bc0!important}.bg-indigo-6{background:#3f51b5!important}.bg-indigo-7{background:#3949ab!important}.bg-indigo-8{background:#303f9f!important}.bg-indigo-9{background:#283593!important}.bg-indigo-10{background:#1a237e!important}.bg-indigo-11{background:#8c9eff!important}.bg-indigo-12{background:#536dfe!important}.bg-indigo-13{background:#3d5afe!important}.bg-indigo-14{background:#304ffe!important}.bg-blue{background:#2196f3!important}.bg-blue-1{background:#e3f2fd!important}.bg-blue-2{background:#bbdefb!important}.bg-blue-3{background:#90caf9!important}.bg-blue-4{background:#64b5f6!important}.bg-blue-5{background:#42a5f5!important}.bg-blue-6{background:#2196f3!important}.bg-blue-7{background:#1e88e5!important}.bg-blue-8{background:#1976d2!important}.bg-blue-9{background:#1565c0!important}.bg-blue-10{background:#0d47a1!important}.bg-blue-11{background:#82b1ff!important}.bg-blue-12{background:#448aff!important}.bg-blue-13{background:#2979ff!important}.bg-blue-14{background:#2962ff!important}.bg-light-blue{background:#03a9f4!important}.bg-light-blue-1{background:#e1f5fe!important}.bg-light-blue-2{background:#b3e5fc!important}.bg-light-blue-3{background:#81d4fa!important}.bg-light-blue-4{background:#4fc3f7!important}.bg-light-blue-5{background:#29b6f6!important}.bg-light-blue-6{background:#03a9f4!important}.bg-light-blue-7{background:#039be5!important}.bg-light-blue-8{background:#0288d1!important}.bg-light-blue-9{background:#0277bd!important}.bg-light-blue-10{background:#01579b!important}.bg-light-blue-11{background:#80d8ff!important}.bg-light-blue-12{background:#40c4ff!important}.bg-light-blue-13{background:#00b0ff!important}.bg-light-blue-14{background:#0091ea!important}.bg-cyan{background:#00bcd4!important}.bg-cyan-1{background:#e0f7fa!important}.bg-cyan-2{background:#b2ebf2!important}.bg-cyan-3{background:#80deea!important}.bg-cyan-4{background:#4dd0e1!important}.bg-cyan-5{background:#26c6da!important}.bg-cyan-6{background:#00bcd4!important}.bg-cyan-7{background:#00acc1!important}.bg-cyan-8{background:#0097a7!important}.bg-cyan-9{background:#00838f!important}.bg-cyan-10{background:#006064!important}.bg-cyan-11{background:#84ffff!important}.bg-cyan-12{background:#18ffff!important}.bg-cyan-13{background:#00e5ff!important}.bg-cyan-14{background:#00b8d4!important}.bg-teal{background:#009688!important}.bg-teal-1{background:#e0f2f1!important}.bg-teal-2{background:#b2dfdb!important}.bg-teal-3{background:#80cbc4!important}.bg-teal-4{background:#4db6ac!important}.bg-teal-5{background:#26a69a!important}.bg-teal-6{background:#009688!important}.bg-teal-7{background:#00897b!important}.bg-teal-8{background:#00796b!important}.bg-teal-9{background:#00695c!important}.bg-teal-10{background:#004d40!important}.bg-teal-11{background:#a7ffeb!important}.bg-teal-12{background:#64ffda!important}.bg-teal-13{background:#1de9b6!important}.bg-teal-14{background:#00bfa5!important}.bg-green{background:#4caf50!important}.bg-green-1{background:#e8f5e9!important}.bg-green-2{background:#c8e6c9!important}.bg-green-3{background:#a5d6a7!important}.bg-green-4{background:#81c784!important}.bg-green-5{background:#66bb6a!important}.bg-green-6{background:#4caf50!important}.bg-green-7{background:#43a047!important}.bg-green-8{background:#388e3c!important}.bg-green-9{background:#2e7d32!important}.bg-green-10{background:#1b5e20!important}.bg-green-11{background:#b9f6ca!important}.bg-green-12{background:#69f0ae!important}.bg-green-13{background:#00e676!important}.bg-green-14{background:#00c853!important}.bg-light-green{background:#8bc34a!important}.bg-light-green-1{background:#f1f8e9!important}.bg-light-green-2{background:#dcedc8!important}.bg-light-green-3{background:#c5e1a5!important}.bg-light-green-4{background:#aed581!important}.bg-light-green-5{background:#9ccc65!important}.bg-light-green-6{background:#8bc34a!important}.bg-light-green-7{background:#7cb342!important}.bg-light-green-8{background:#689f38!important}.bg-light-green-9{background:#558b2f!important}.bg-light-green-10{background:#33691e!important}.bg-light-green-11{background:#ccff90!important}.bg-light-green-12{background:#b2ff59!important}.bg-light-green-13{background:#76ff03!important}.bg-light-green-14{background:#64dd17!important}.bg-lime{background:#cddc39!important}.bg-lime-1{background:#f9fbe7!important}.bg-lime-2{background:#f0f4c3!important}.bg-lime-3{background:#e6ee9c!important}.bg-lime-4{background:#dce775!important}.bg-lime-5{background:#d4e157!important}.bg-lime-6{background:#cddc39!important}.bg-lime-7{background:#c0ca33!important}.bg-lime-8{background:#afb42b!important}.bg-lime-9{background:#9e9d24!important}.bg-lime-10{background:#827717!important}.bg-lime-11{background:#f4ff81!important}.bg-lime-12{background:#eeff41!important}.bg-lime-13{background:#c6ff00!important}.bg-lime-14{background:#aeea00!important}.bg-yellow{background:#ffeb3b!important}.bg-yellow-1{background:#fffde7!important}.bg-yellow-2{background:#fff9c4!important}.bg-yellow-3{background:#fff59d!important}.bg-yellow-4{background:#fff176!important}.bg-yellow-5{background:#ffee58!important}.bg-yellow-6{background:#ffeb3b!important}.bg-yellow-7{background:#fdd835!important}.bg-yellow-8{background:#fbc02d!important}.bg-yellow-9{background:#f9a825!important}.bg-yellow-10{background:#f57f17!important}.bg-yellow-11{background:#ffff8d!important}.bg-yellow-12{background:#ff0!important}.bg-yellow-13{background:#ffea00!important}.bg-yellow-14{background:#ffd600!important}.bg-amber{background:#ffc107!important}.bg-amber-1{background:#fff8e1!important}.bg-amber-2{background:#ffecb3!important}.bg-amber-3{background:#ffe082!important}.bg-amber-4{background:#ffd54f!important}.bg-amber-5{background:#ffca28!important}.bg-amber-6{background:#ffc107!important}.bg-amber-7{background:#ffb300!important}.bg-amber-8{background:#ffa000!important}.bg-amber-9{background:#ff8f00!important}.bg-amber-10{background:#ff6f00!important}.bg-amber-11{background:#ffe57f!important}.bg-amber-12{background:#ffd740!important}.bg-amber-13{background:#ffc400!important}.bg-amber-14{background:#ffab00!important}.bg-orange{background:#ff9800!important}.bg-orange-1{background:#fff3e0!important}.bg-orange-2{background:#ffe0b2!important}.bg-orange-3{background:#ffcc80!important}.bg-orange-4{background:#ffb74d!important}.bg-orange-5{background:#ffa726!important}.bg-orange-6{background:#ff9800!important}.bg-orange-7{background:#fb8c00!important}.bg-orange-8{background:#f57c00!important}.bg-orange-9{background:#ef6c00!important}.bg-orange-10{background:#e65100!important}.bg-orange-11{background:#ffd180!important}.bg-orange-12{background:#ffab40!important}.bg-orange-13{background:#ff9100!important}.bg-orange-14{background:#ff6d00!important}.bg-deep-orange{background:#ff5722!important}.bg-deep-orange-1{background:#fbe9e7!important}.bg-deep-orange-2{background:#ffccbc!important}.bg-deep-orange-3{background:#ffab91!important}.bg-deep-orange-4{background:#ff8a65!important}.bg-deep-orange-5{background:#ff7043!important}.bg-deep-orange-6{background:#ff5722!important}.bg-deep-orange-7{background:#f4511e!important}.bg-deep-orange-8{background:#e64a19!important}.bg-deep-orange-9{background:#d84315!important}.bg-deep-orange-10{background:#bf360c!important}.bg-deep-orange-11{background:#ff9e80!important}.bg-deep-orange-12{background:#ff6e40!important}.bg-deep-orange-13{background:#ff3d00!important}.bg-deep-orange-14{background:#dd2c00!important}.bg-brown{background:#795548!important}.bg-brown-1{background:#efebe9!important}.bg-brown-2{background:#d7ccc8!important}.bg-brown-3{background:#bcaaa4!important}.bg-brown-4{background:#a1887f!important}.bg-brown-5{background:#8d6e63!important}.bg-brown-6{background:#795548!important}.bg-brown-7{background:#6d4c41!important}.bg-brown-8{background:#5d4037!important}.bg-brown-9{background:#4e342e!important}.bg-brown-10{background:#3e2723!important}.bg-brown-11{background:#d7ccc8!important}.bg-brown-12{background:#bcaaa4!important}.bg-brown-13{background:#8d6e63!important}.bg-brown-14{background:#5d4037!important}.bg-grey{background:#9e9e9e!important}.bg-grey-1{background:#fafafa!important}.bg-grey-2{background:#f5f5f5!important}.bg-grey-3{background:#eee!important}.bg-grey-4{background:#e0e0e0!important}.bg-grey-5{background:#bdbdbd!important}.bg-grey-6{background:#9e9e9e!important}.bg-grey-7{background:#757575!important}.bg-grey-8{background:#616161!important}.bg-grey-9{background:#424242!important}.bg-grey-10{background:#212121!important}.bg-grey-11{background:#f5f5f5!important}.bg-grey-12{background:#eee!important}.bg-grey-13{background:#bdbdbd!important}.bg-grey-14{background:#616161!important}.bg-blue-grey{background:#607d8b!important}.bg-blue-grey-1{background:#eceff1!important}.bg-blue-grey-2{background:#cfd8dc!important}.bg-blue-grey-3{background:#b0bec5!important}.bg-blue-grey-4{background:#90a4ae!important}.bg-blue-grey-5{background:#78909c!important}.bg-blue-grey-6{background:#607d8b!important}.bg-blue-grey-7{background:#546e7a!important}.bg-blue-grey-8{background:#455a64!important}.bg-blue-grey-9{background:#37474f!important}.bg-blue-grey-10{background:#263238!important}.bg-blue-grey-11{background:#cfd8dc!important}.bg-blue-grey-12{background:#b0bec5!important}.bg-blue-grey-13{background:#78909c!important}.bg-blue-grey-14{background:#455a64!important}.shadow-transition{transition:box-shadow .28s cubic-bezier(.4, 0, .2, 1)!important}.shadow-1{box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12)}.shadow-up-1{box-shadow:0 -1px 3px rgba(0,0,0,.2),0 -1px 1px rgba(0,0,0,.14),0 -2px 1px -1px rgba(0,0,0,.12)}.shadow-2{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.shadow-up-2{box-shadow:0 -1px 5px rgba(0,0,0,.2),0 -2px 2px rgba(0,0,0,.14),0 -3px 1px -2px rgba(0,0,0,.12)}.shadow-3{box-shadow:0 1px 8px rgba(0,0,0,.2),0 3px 4px rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.12)}.shadow-up-3{box-shadow:0 -1px 8px rgba(0,0,0,.2),0 -3px 4px rgba(0,0,0,.14),0 -3px 3px -2px rgba(0,0,0,.12)}.shadow-4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px rgba(0,0,0,.14),0 1px 10px rgba(0,0,0,.12)}.shadow-up-4{box-shadow:0 -2px 4px -1px rgba(0,0,0,.2),0 -4px 5px rgba(0,0,0,.14),0 -1px 10px rgba(0,0,0,.12)}.shadow-5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px rgba(0,0,0,.14),0 1px 14px rgba(0,0,0,.12)}.shadow-up-5{box-shadow:0 -3px 5px -1px rgba(0,0,0,.2),0 -5px 8px rgba(0,0,0,.14),0 -1px 14px rgba(0,0,0,.12)}.shadow-6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px rgba(0,0,0,.14),0 1px 18px rgba(0,0,0,.12)}.shadow-up-6{box-shadow:0 -3px 5px -1px rgba(0,0,0,.2),0 -6px 10px rgba(0,0,0,.14),0 -1px 18px rgba(0,0,0,.12)}.shadow-7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.shadow-up-7{box-shadow:0 -4px 5px -2px rgba(0,0,0,.2),0 -7px 10px 1px rgba(0,0,0,.14),0 -2px 16px 1px rgba(0,0,0,.12)}.shadow-8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.shadow-up-8{box-shadow:0 -5px 5px -3px rgba(0,0,0,.2),0 -8px 10px 1px rgba(0,0,0,.14),0 -3px 14px 2px rgba(0,0,0,.12)}.shadow-9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.shadow-up-9{box-shadow:0 -5px 6px -3px rgba(0,0,0,.2),0 -9px 12px 1px rgba(0,0,0,.14),0 -3px 16px 2px rgba(0,0,0,.12)}.shadow-10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.shadow-up-10{box-shadow:0 -6px 6px -3px rgba(0,0,0,.2),0 -10px 14px 1px rgba(0,0,0,.14),0 -4px 18px 3px rgba(0,0,0,.12)}.shadow-11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.shadow-up-11{box-shadow:0 -6px 7px -4px rgba(0,0,0,.2),0 -11px 15px 1px rgba(0,0,0,.14),0 -4px 20px 3px rgba(0,0,0,.12)}.shadow-12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.shadow-up-12{box-shadow:0 -7px 8px -4px rgba(0,0,0,.2),0 -12px 17px 2px rgba(0,0,0,.14),0 -5px 22px 4px rgba(0,0,0,.12)}.shadow-13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.shadow-up-13{box-shadow:0 -7px 8px -4px rgba(0,0,0,.2),0 -13px 19px 2px rgba(0,0,0,.14),0 -5px 24px 4px rgba(0,0,0,.12)}.shadow-14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.shadow-up-14{box-shadow:0 -7px 9px -4px rgba(0,0,0,.2),0 -14px 21px 2px rgba(0,0,0,.14),0 -5px 26px 4px rgba(0,0,0,.12)}.shadow-15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.shadow-up-15{box-shadow:0 -8px 9px -5px rgba(0,0,0,.2),0 -15px 22px 2px rgba(0,0,0,.14),0 -6px 28px 5px rgba(0,0,0,.12)}.shadow-16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.shadow-up-16{box-shadow:0 -8px 10px -5px rgba(0,0,0,.2),0 -16px 24px 2px rgba(0,0,0,.14),0 -6px 30px 5px rgba(0,0,0,.12)}.shadow-17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.shadow-up-17{box-shadow:0 -8px 11px -5px rgba(0,0,0,.2),0 -17px 26px 2px rgba(0,0,0,.14),0 -6px 32px 5px rgba(0,0,0,.12)}.shadow-18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.shadow-up-18{box-shadow:0 -9px 11px -5px rgba(0,0,0,.2),0 -18px 28px 2px rgba(0,0,0,.14),0 -7px 34px 6px rgba(0,0,0,.12)}.shadow-19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.shadow-up-19{box-shadow:0 -9px 12px -6px rgba(0,0,0,.2),0 -19px 29px 2px rgba(0,0,0,.14),0 -7px 36px 6px rgba(0,0,0,.12)}.shadow-20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.shadow-up-20{box-shadow:0 -10px 13px -6px rgba(0,0,0,.2),0 -20px 31px 3px rgba(0,0,0,.14),0 -8px 38px 7px rgba(0,0,0,.12)}.shadow-21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.shadow-up-21{box-shadow:0 -10px 13px -6px rgba(0,0,0,.2),0 -21px 33px 3px rgba(0,0,0,.14),0 -8px 40px 7px rgba(0,0,0,.12)}.shadow-22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.shadow-up-22{box-shadow:0 -10px 14px -6px rgba(0,0,0,.2),0 -22px 35px 3px rgba(0,0,0,.14),0 -8px 42px 7px rgba(0,0,0,.12)}.shadow-23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.shadow-up-23{box-shadow:0 -11px 14px -7px rgba(0,0,0,.2),0 -23px 36px 3px rgba(0,0,0,.14),0 -9px 44px 8px rgba(0,0,0,.12)}.shadow-24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.shadow-up-24{box-shadow:0 -11px 15px -7px rgba(0,0,0,.2),0 -24px 38px 3px rgba(0,0,0,.14),0 -9px 46px 8px rgba(0,0,0,.12)}.inset-shadow{box-shadow:0 7px 9px -7px rgba(0,0,0,.7) inset}.inset-shadow-down{box-shadow:0 -7px 9px -7px rgba(0,0,0,.7) inset}body.body--dark .shadow-1{box-shadow:0 1px 3px rgba(255,255,255,.2),0 1px 1px rgba(255,255,255,.14),0 2px 1px -1px rgba(255,255,255,.12)}body.body--dark .shadow-up-1{box-shadow:0 -1px 3px rgba(255,255,255,.2),0 -1px 1px rgba(255,255,255,.14),0 -2px 1px -1px rgba(255,255,255,.12)}body.body--dark .shadow-2{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}body.body--dark .shadow-up-2{box-shadow:0 -1px 5px rgba(255,255,255,.2),0 -2px 2px rgba(255,255,255,.14),0 -3px 1px -2px rgba(255,255,255,.12)}body.body--dark .shadow-3{box-shadow:0 1px 8px rgba(255,255,255,.2),0 3px 4px rgba(255,255,255,.14),0 3px 3px -2px rgba(255,255,255,.12)}body.body--dark .shadow-up-3{box-shadow:0 -1px 8px rgba(255,255,255,.2),0 -3px 4px rgba(255,255,255,.14),0 -3px 3px -2px rgba(255,255,255,.12)}body.body--dark .shadow-4{box-shadow:0 2px 4px -1px rgba(255,255,255,.2),0 4px 5px rgba(255,255,255,.14),0 1px 10px rgba(255,255,255,.12)}body.body--dark .shadow-up-4{box-shadow:0 -2px 4px -1px rgba(255,255,255,.2),0 -4px 5px rgba(255,255,255,.14),0 -1px 10px rgba(255,255,255,.12)}body.body--dark .shadow-5{box-shadow:0 3px 5px -1px rgba(255,255,255,.2),0 5px 8px rgba(255,255,255,.14),0 1px 14px rgba(255,255,255,.12)}body.body--dark .shadow-up-5{box-shadow:0 -3px 5px -1px rgba(255,255,255,.2),0 -5px 8px rgba(255,255,255,.14),0 -1px 14px rgba(255,255,255,.12)}body.body--dark .shadow-6{box-shadow:0 3px 5px -1px rgba(255,255,255,.2),0 6px 10px rgba(255,255,255,.14),0 1px 18px rgba(255,255,255,.12)}body.body--dark .shadow-up-6{box-shadow:0 -3px 5px -1px rgba(255,255,255,.2),0 -6px 10px rgba(255,255,255,.14),0 -1px 18px rgba(255,255,255,.12)}body.body--dark .shadow-7{box-shadow:0 4px 5px -2px rgba(255,255,255,.2),0 7px 10px 1px rgba(255,255,255,.14),0 2px 16px 1px rgba(255,255,255,.12)}body.body--dark .shadow-up-7{box-shadow:0 -4px 5px -2px rgba(255,255,255,.2),0 -7px 10px 1px rgba(255,255,255,.14),0 -2px 16px 1px rgba(255,255,255,.12)}body.body--dark .shadow-8{box-shadow:0 5px 5px -3px rgba(255,255,255,.2),0 8px 10px 1px rgba(255,255,255,.14),0 3px 14px 2px rgba(255,255,255,.12)}body.body--dark .shadow-up-8{box-shadow:0 -5px 5px -3px rgba(255,255,255,.2),0 -8px 10px 1px rgba(255,255,255,.14),0 -3px 14px 2px rgba(255,255,255,.12)}body.body--dark .shadow-9{box-shadow:0 5px 6px -3px rgba(255,255,255,.2),0 9px 12px 1px rgba(255,255,255,.14),0 3px 16px 2px rgba(255,255,255,.12)}body.body--dark .shadow-up-9{box-shadow:0 -5px 6px -3px rgba(255,255,255,.2),0 -9px 12px 1px rgba(255,255,255,.14),0 -3px 16px 2px rgba(255,255,255,.12)}body.body--dark .shadow-10{box-shadow:0 6px 6px -3px rgba(255,255,255,.2),0 10px 14px 1px rgba(255,255,255,.14),0 4px 18px 3px rgba(255,255,255,.12)}body.body--dark .shadow-up-10{box-shadow:0 -6px 6px -3px rgba(255,255,255,.2),0 -10px 14px 1px rgba(255,255,255,.14),0 -4px 18px 3px rgba(255,255,255,.12)}body.body--dark .shadow-11{box-shadow:0 6px 7px -4px rgba(255,255,255,.2),0 11px 15px 1px rgba(255,255,255,.14),0 4px 20px 3px rgba(255,255,255,.12)}body.body--dark .shadow-up-11{box-shadow:0 -6px 7px -4px rgba(255,255,255,.2),0 -11px 15px 1px rgba(255,255,255,.14),0 -4px 20px 3px rgba(255,255,255,.12)}body.body--dark .shadow-12{box-shadow:0 7px 8px -4px rgba(255,255,255,.2),0 12px 17px 2px rgba(255,255,255,.14),0 5px 22px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-12{box-shadow:0 -7px 8px -4px rgba(255,255,255,.2),0 -12px 17px 2px rgba(255,255,255,.14),0 -5px 22px 4px rgba(255,255,255,.12)}body.body--dark .shadow-13{box-shadow:0 7px 8px -4px rgba(255,255,255,.2),0 13px 19px 2px rgba(255,255,255,.14),0 5px 24px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-13{box-shadow:0 -7px 8px -4px rgba(255,255,255,.2),0 -13px 19px 2px rgba(255,255,255,.14),0 -5px 24px 4px rgba(255,255,255,.12)}body.body--dark .shadow-14{box-shadow:0 7px 9px -4px rgba(255,255,255,.2),0 14px 21px 2px rgba(255,255,255,.14),0 5px 26px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-14{box-shadow:0 -7px 9px -4px rgba(255,255,255,.2),0 -14px 21px 2px rgba(255,255,255,.14),0 -5px 26px 4px rgba(255,255,255,.12)}body.body--dark .shadow-15{box-shadow:0 8px 9px -5px rgba(255,255,255,.2),0 15px 22px 2px rgba(255,255,255,.14),0 6px 28px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-15{box-shadow:0 -8px 9px -5px rgba(255,255,255,.2),0 -15px 22px 2px rgba(255,255,255,.14),0 -6px 28px 5px rgba(255,255,255,.12)}body.body--dark .shadow-16{box-shadow:0 8px 10px -5px rgba(255,255,255,.2),0 16px 24px 2px rgba(255,255,255,.14),0 6px 30px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-16{box-shadow:0 -8px 10px -5px rgba(255,255,255,.2),0 -16px 24px 2px rgba(255,255,255,.14),0 -6px 30px 5px rgba(255,255,255,.12)}body.body--dark .shadow-17{box-shadow:0 8px 11px -5px rgba(255,255,255,.2),0 17px 26px 2px rgba(255,255,255,.14),0 6px 32px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-17{box-shadow:0 -8px 11px -5px rgba(255,255,255,.2),0 -17px 26px 2px rgba(255,255,255,.14),0 -6px 32px 5px rgba(255,255,255,.12)}body.body--dark .shadow-18{box-shadow:0 9px 11px -5px rgba(255,255,255,.2),0 18px 28px 2px rgba(255,255,255,.14),0 7px 34px 6px rgba(255,255,255,.12)}body.body--dark .shadow-up-18{box-shadow:0 -9px 11px -5px rgba(255,255,255,.2),0 -18px 28px 2px rgba(255,255,255,.14),0 -7px 34px 6px rgba(255,255,255,.12)}body.body--dark .shadow-19{box-shadow:0 9px 12px -6px rgba(255,255,255,.2),0 19px 29px 2px rgba(255,255,255,.14),0 7px 36px 6px rgba(255,255,255,.12)}body.body--dark .shadow-up-19{box-shadow:0 -9px 12px -6px rgba(255,255,255,.2),0 -19px 29px 2px rgba(255,255,255,.14),0 -7px 36px 6px rgba(255,255,255,.12)}body.body--dark .shadow-20{box-shadow:0 10px 13px -6px rgba(255,255,255,.2),0 20px 31px 3px rgba(255,255,255,.14),0 8px 38px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-20{box-shadow:0 -10px 13px -6px rgba(255,255,255,.2),0 -20px 31px 3px rgba(255,255,255,.14),0 -8px 38px 7px rgba(255,255,255,.12)}body.body--dark .shadow-21{box-shadow:0 10px 13px -6px rgba(255,255,255,.2),0 21px 33px 3px rgba(255,255,255,.14),0 8px 40px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-21{box-shadow:0 -10px 13px -6px rgba(255,255,255,.2),0 -21px 33px 3px rgba(255,255,255,.14),0 -8px 40px 7px rgba(255,255,255,.12)}body.body--dark .shadow-22{box-shadow:0 10px 14px -6px rgba(255,255,255,.2),0 22px 35px 3px rgba(255,255,255,.14),0 8px 42px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-22{box-shadow:0 -10px 14px -6px rgba(255,255,255,.2),0 -22px 35px 3px rgba(255,255,255,.14),0 -8px 42px 7px rgba(255,255,255,.12)}body.body--dark .shadow-23{box-shadow:0 11px 14px -7px rgba(255,255,255,.2),0 23px 36px 3px rgba(255,255,255,.14),0 9px 44px 8px rgba(255,255,255,.12)}body.body--dark .shadow-up-23{box-shadow:0 -11px 14px -7px rgba(255,255,255,.2),0 -23px 36px 3px rgba(255,255,255,.14),0 -9px 44px 8px rgba(255,255,255,.12)}body.body--dark .shadow-24{box-shadow:0 11px 15px -7px rgba(255,255,255,.2),0 24px 38px 3px rgba(255,255,255,.14),0 9px 46px 8px rgba(255,255,255,.12)}body.body--dark .shadow-up-24{box-shadow:0 -11px 15px -7px rgba(255,255,255,.2),0 -24px 38px 3px rgba(255,255,255,.14),0 -9px 46px 8px rgba(255,255,255,.12)}body.body--dark .inset-shadow{box-shadow:0 7px 9px -7px rgba(255,255,255,.7) inset}body.body--dark .inset-shadow-down{box-shadow:0 -7px 9px -7px rgba(255,255,255,.7) inset}.no-shadow,.shadow-0{box-shadow:none!important}.z-marginals{z-index:2000}.z-notify{z-index:9500}.z-fullscreen{z-index:6000}.z-inherit{z-index:inherit!important}.column,.flex,.row{display:flex;flex-wrap:wrap}.column.inline,.flex.inline,.row.inline{display:inline-flex}.row.reverse{flex-direction:row-reverse}.column{flex-direction:column}.column.reverse{flex-direction:column-reverse}.wrap{flex-wrap:wrap}.no-wrap{flex-wrap:nowrap}.reverse-wrap{flex-wrap:wrap-reverse}.order-first{order:-10000}.order-last{order:10000}.order-none{order:0}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.flex-center,.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.flex-center,.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-center{align-content:center}.content-stretch{align-content:stretch}.content-between{align-content:space-between}.content-around{align-content:space-around}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-baseline{align-self:baseline}.self-stretch{align-self:stretch}.q-gutter-none,.q-gutter-x-none{margin-left:0}.q-gutter-none>*,.q-gutter-x-none>*{margin-left:0}.q-gutter-none,.q-gutter-y-none{margin-top:0}.q-gutter-none>*,.q-gutter-y-none>*{margin-top:0}.q-col-gutter-none,.q-col-gutter-x-none{margin-left:0}.q-col-gutter-none>*,.q-col-gutter-x-none>*{padding-left:0}.q-col-gutter-none,.q-col-gutter-y-none{margin-top:0}.q-col-gutter-none>*,.q-col-gutter-y-none>*{padding-top:0}.q-gutter-x-xs,.q-gutter-xs{margin-left:-4px}.q-gutter-x-xs>*,.q-gutter-xs>*{margin-left:4px}.q-gutter-xs,.q-gutter-y-xs{margin-top:-4px}.q-gutter-xs>*,.q-gutter-y-xs>*{margin-top:4px}.q-col-gutter-x-xs,.q-col-gutter-xs{margin-left:-4px}.q-col-gutter-x-xs>*,.q-col-gutter-xs>*{padding-left:4px}.q-col-gutter-xs,.q-col-gutter-y-xs{margin-top:-4px}.q-col-gutter-xs>*,.q-col-gutter-y-xs>*{padding-top:4px}.q-gutter-sm,.q-gutter-x-sm{margin-left:-8px}.q-gutter-sm>*,.q-gutter-x-sm>*{margin-left:8px}.q-gutter-sm,.q-gutter-y-sm{margin-top:-8px}.q-gutter-sm>*,.q-gutter-y-sm>*{margin-top:8px}.q-col-gutter-sm,.q-col-gutter-x-sm{margin-left:-8px}.q-col-gutter-sm>*,.q-col-gutter-x-sm>*{padding-left:8px}.q-col-gutter-sm,.q-col-gutter-y-sm{margin-top:-8px}.q-col-gutter-sm>*,.q-col-gutter-y-sm>*{padding-top:8px}.q-gutter-md,.q-gutter-x-md{margin-left:-16px}.q-gutter-md>*,.q-gutter-x-md>*{margin-left:16px}.q-gutter-md,.q-gutter-y-md{margin-top:-16px}.q-gutter-md>*,.q-gutter-y-md>*{margin-top:16px}.q-col-gutter-md,.q-col-gutter-x-md{margin-left:-16px}.q-col-gutter-md>*,.q-col-gutter-x-md>*{padding-left:16px}.q-col-gutter-md,.q-col-gutter-y-md{margin-top:-16px}.q-col-gutter-md>*,.q-col-gutter-y-md>*{padding-top:16px}.q-gutter-lg,.q-gutter-x-lg{margin-left:-24px}.q-gutter-lg>*,.q-gutter-x-lg>*{margin-left:24px}.q-gutter-lg,.q-gutter-y-lg{margin-top:-24px}.q-gutter-lg>*,.q-gutter-y-lg>*{margin-top:24px}.q-col-gutter-lg,.q-col-gutter-x-lg{margin-left:-24px}.q-col-gutter-lg>*,.q-col-gutter-x-lg>*{padding-left:24px}.q-col-gutter-lg,.q-col-gutter-y-lg{margin-top:-24px}.q-col-gutter-lg>*,.q-col-gutter-y-lg>*{padding-top:24px}.q-gutter-x-xl,.q-gutter-xl{margin-left:-48px}.q-gutter-x-xl>*,.q-gutter-xl>*{margin-left:48px}.q-gutter-xl,.q-gutter-y-xl{margin-top:-48px}.q-gutter-xl>*,.q-gutter-y-xl>*{margin-top:48px}.q-col-gutter-x-xl,.q-col-gutter-xl{margin-left:-48px}.q-col-gutter-x-xl>*,.q-col-gutter-xl>*{padding-left:48px}.q-col-gutter-xl,.q-col-gutter-y-xl{margin-top:-48px}.q-col-gutter-xl>*,.q-col-gutter-y-xl>*{padding-top:48px}@media (min-width:0){.flex>.col,.flex>.col-0,.flex>.col-1,.flex>.col-10,.flex>.col-11,.flex>.col-12,.flex>.col-2,.flex>.col-3,.flex>.col-4,.flex>.col-5,.flex>.col-6,.flex>.col-7,.flex>.col-8,.flex>.col-9,.flex>.col-auto,.flex>.col-grow,.flex>.col-shrink,.flex>.col-xs,.flex>.col-xs-0,.flex>.col-xs-1,.flex>.col-xs-10,.flex>.col-xs-11,.flex>.col-xs-12,.flex>.col-xs-2,.flex>.col-xs-3,.flex>.col-xs-4,.flex>.col-xs-5,.flex>.col-xs-6,.flex>.col-xs-7,.flex>.col-xs-8,.flex>.col-xs-9,.flex>.col-xs-auto,.flex>.col-xs-grow,.flex>.col-xs-shrink,.row>.col,.row>.col-0,.row>.col-1,.row>.col-10,.row>.col-11,.row>.col-12,.row>.col-2,.row>.col-3,.row>.col-4,.row>.col-5,.row>.col-6,.row>.col-7,.row>.col-8,.row>.col-9,.row>.col-auto,.row>.col-grow,.row>.col-shrink,.row>.col-xs,.row>.col-xs-0,.row>.col-xs-1,.row>.col-xs-10,.row>.col-xs-11,.row>.col-xs-12,.row>.col-xs-2,.row>.col-xs-3,.row>.col-xs-4,.row>.col-xs-5,.row>.col-xs-6,.row>.col-xs-7,.row>.col-xs-8,.row>.col-xs-9,.row>.col-xs-auto,.row>.col-xs-grow,.row>.col-xs-shrink{width:auto;min-width:0;max-width:100%}.column>.col,.column>.col-0,.column>.col-1,.column>.col-10,.column>.col-11,.column>.col-12,.column>.col-2,.column>.col-3,.column>.col-4,.column>.col-5,.column>.col-6,.column>.col-7,.column>.col-8,.column>.col-9,.column>.col-auto,.column>.col-grow,.column>.col-shrink,.column>.col-xs,.column>.col-xs-0,.column>.col-xs-1,.column>.col-xs-10,.column>.col-xs-11,.column>.col-xs-12,.column>.col-xs-2,.column>.col-xs-3,.column>.col-xs-4,.column>.col-xs-5,.column>.col-xs-6,.column>.col-xs-7,.column>.col-xs-8,.column>.col-xs-9,.column>.col-xs-auto,.column>.col-xs-grow,.column>.col-xs-shrink,.flex>.col,.flex>.col-0,.flex>.col-1,.flex>.col-10,.flex>.col-11,.flex>.col-12,.flex>.col-2,.flex>.col-3,.flex>.col-4,.flex>.col-5,.flex>.col-6,.flex>.col-7,.flex>.col-8,.flex>.col-9,.flex>.col-auto,.flex>.col-grow,.flex>.col-shrink,.flex>.col-xs,.flex>.col-xs-0,.flex>.col-xs-1,.flex>.col-xs-10,.flex>.col-xs-11,.flex>.col-xs-12,.flex>.col-xs-2,.flex>.col-xs-3,.flex>.col-xs-4,.flex>.col-xs-5,.flex>.col-xs-6,.flex>.col-xs-7,.flex>.col-xs-8,.flex>.col-xs-9,.flex>.col-xs-auto,.flex>.col-xs-grow,.flex>.col-xs-shrink{height:auto;min-height:0;max-height:100%}.col,.col-xs{flex:10000 1 0%}.col-0,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-xs-0,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-auto{flex:0 0 auto}.col-grow,.col-xs-grow{flex:1 0 auto}.col-shrink,.col-xs-shrink{flex:0 1 auto}.row>.col-0,.row>.col-xs-0{height:auto;width:0%}.row>.offset-0,.row>.offset-xs-0{margin-left:0}.column>.col-0,.column>.col-xs-0{height:0%;width:auto}.row>.col-1,.row>.col-xs-1{height:auto;width:8.3333%}.row>.offset-1,.row>.offset-xs-1{margin-left:8.3333%}.column>.col-1,.column>.col-xs-1{height:8.3333%;width:auto}.row>.col-2,.row>.col-xs-2{height:auto;width:16.6667%}.row>.offset-2,.row>.offset-xs-2{margin-left:16.6667%}.column>.col-2,.column>.col-xs-2{height:16.6667%;width:auto}.row>.col-3,.row>.col-xs-3{height:auto;width:25%}.row>.offset-3,.row>.offset-xs-3{margin-left:25%}.column>.col-3,.column>.col-xs-3{height:25%;width:auto}.row>.col-4,.row>.col-xs-4{height:auto;width:33.3333%}.row>.offset-4,.row>.offset-xs-4{margin-left:33.3333%}.column>.col-4,.column>.col-xs-4{height:33.3333%;width:auto}.row>.col-5,.row>.col-xs-5{height:auto;width:41.6667%}.row>.offset-5,.row>.offset-xs-5{margin-left:41.6667%}.column>.col-5,.column>.col-xs-5{height:41.6667%;width:auto}.row>.col-6,.row>.col-xs-6{height:auto;width:50%}.row>.offset-6,.row>.offset-xs-6{margin-left:50%}.column>.col-6,.column>.col-xs-6{height:50%;width:auto}.row>.col-7,.row>.col-xs-7{height:auto;width:58.3333%}.row>.offset-7,.row>.offset-xs-7{margin-left:58.3333%}.column>.col-7,.column>.col-xs-7{height:58.3333%;width:auto}.row>.col-8,.row>.col-xs-8{height:auto;width:66.6667%}.row>.offset-8,.row>.offset-xs-8{margin-left:66.6667%}.column>.col-8,.column>.col-xs-8{height:66.6667%;width:auto}.row>.col-9,.row>.col-xs-9{height:auto;width:75%}.row>.offset-9,.row>.offset-xs-9{margin-left:75%}.column>.col-9,.column>.col-xs-9{height:75%;width:auto}.row>.col-10,.row>.col-xs-10{height:auto;width:83.3333%}.row>.offset-10,.row>.offset-xs-10{margin-left:83.3333%}.column>.col-10,.column>.col-xs-10{height:83.3333%;width:auto}.row>.col-11,.row>.col-xs-11{height:auto;width:91.6667%}.row>.offset-11,.row>.offset-xs-11{margin-left:91.6667%}.column>.col-11,.column>.col-xs-11{height:91.6667%;width:auto}.row>.col-12,.row>.col-xs-12{height:auto;width:100%}.row>.offset-12,.row>.offset-xs-12{margin-left:100%}.column>.col-12,.column>.col-xs-12{height:100%;width:auto}.row>.col-all{height:auto;flex:0 0 100%}}@media (min-width:600px){.flex>.col-sm,.flex>.col-sm-0,.flex>.col-sm-1,.flex>.col-sm-10,.flex>.col-sm-11,.flex>.col-sm-12,.flex>.col-sm-2,.flex>.col-sm-3,.flex>.col-sm-4,.flex>.col-sm-5,.flex>.col-sm-6,.flex>.col-sm-7,.flex>.col-sm-8,.flex>.col-sm-9,.flex>.col-sm-auto,.flex>.col-sm-grow,.flex>.col-sm-shrink,.row>.col-sm,.row>.col-sm-0,.row>.col-sm-1,.row>.col-sm-10,.row>.col-sm-11,.row>.col-sm-12,.row>.col-sm-2,.row>.col-sm-3,.row>.col-sm-4,.row>.col-sm-5,.row>.col-sm-6,.row>.col-sm-7,.row>.col-sm-8,.row>.col-sm-9,.row>.col-sm-auto,.row>.col-sm-grow,.row>.col-sm-shrink{width:auto;min-width:0;max-width:100%}.column>.col-sm,.column>.col-sm-0,.column>.col-sm-1,.column>.col-sm-10,.column>.col-sm-11,.column>.col-sm-12,.column>.col-sm-2,.column>.col-sm-3,.column>.col-sm-4,.column>.col-sm-5,.column>.col-sm-6,.column>.col-sm-7,.column>.col-sm-8,.column>.col-sm-9,.column>.col-sm-auto,.column>.col-sm-grow,.column>.col-sm-shrink,.flex>.col-sm,.flex>.col-sm-0,.flex>.col-sm-1,.flex>.col-sm-10,.flex>.col-sm-11,.flex>.col-sm-12,.flex>.col-sm-2,.flex>.col-sm-3,.flex>.col-sm-4,.flex>.col-sm-5,.flex>.col-sm-6,.flex>.col-sm-7,.flex>.col-sm-8,.flex>.col-sm-9,.flex>.col-sm-auto,.flex>.col-sm-grow,.flex>.col-sm-shrink{height:auto;min-height:0;max-height:100%}.col-sm{flex:10000 1 0%}.col-sm-0,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto{flex:0 0 auto}.col-sm-grow{flex:1 0 auto}.col-sm-shrink{flex:0 1 auto}.row>.col-sm-0{height:auto;width:0%}.row>.offset-sm-0{margin-left:0}.column>.col-sm-0{height:0%;width:auto}.row>.col-sm-1{height:auto;width:8.3333%}.row>.offset-sm-1{margin-left:8.3333%}.column>.col-sm-1{height:8.3333%;width:auto}.row>.col-sm-2{height:auto;width:16.6667%}.row>.offset-sm-2{margin-left:16.6667%}.column>.col-sm-2{height:16.6667%;width:auto}.row>.col-sm-3{height:auto;width:25%}.row>.offset-sm-3{margin-left:25%}.column>.col-sm-3{height:25%;width:auto}.row>.col-sm-4{height:auto;width:33.3333%}.row>.offset-sm-4{margin-left:33.3333%}.column>.col-sm-4{height:33.3333%;width:auto}.row>.col-sm-5{height:auto;width:41.6667%}.row>.offset-sm-5{margin-left:41.6667%}.column>.col-sm-5{height:41.6667%;width:auto}.row>.col-sm-6{height:auto;width:50%}.row>.offset-sm-6{margin-left:50%}.column>.col-sm-6{height:50%;width:auto}.row>.col-sm-7{height:auto;width:58.3333%}.row>.offset-sm-7{margin-left:58.3333%}.column>.col-sm-7{height:58.3333%;width:auto}.row>.col-sm-8{height:auto;width:66.6667%}.row>.offset-sm-8{margin-left:66.6667%}.column>.col-sm-8{height:66.6667%;width:auto}.row>.col-sm-9{height:auto;width:75%}.row>.offset-sm-9{margin-left:75%}.column>.col-sm-9{height:75%;width:auto}.row>.col-sm-10{height:auto;width:83.3333%}.row>.offset-sm-10{margin-left:83.3333%}.column>.col-sm-10{height:83.3333%;width:auto}.row>.col-sm-11{height:auto;width:91.6667%}.row>.offset-sm-11{margin-left:91.6667%}.column>.col-sm-11{height:91.6667%;width:auto}.row>.col-sm-12{height:auto;width:100%}.row>.offset-sm-12{margin-left:100%}.column>.col-sm-12{height:100%;width:auto}}@media (min-width:1024px){.flex>.col-md,.flex>.col-md-0,.flex>.col-md-1,.flex>.col-md-10,.flex>.col-md-11,.flex>.col-md-12,.flex>.col-md-2,.flex>.col-md-3,.flex>.col-md-4,.flex>.col-md-5,.flex>.col-md-6,.flex>.col-md-7,.flex>.col-md-8,.flex>.col-md-9,.flex>.col-md-auto,.flex>.col-md-grow,.flex>.col-md-shrink,.row>.col-md,.row>.col-md-0,.row>.col-md-1,.row>.col-md-10,.row>.col-md-11,.row>.col-md-12,.row>.col-md-2,.row>.col-md-3,.row>.col-md-4,.row>.col-md-5,.row>.col-md-6,.row>.col-md-7,.row>.col-md-8,.row>.col-md-9,.row>.col-md-auto,.row>.col-md-grow,.row>.col-md-shrink{width:auto;min-width:0;max-width:100%}.column>.col-md,.column>.col-md-0,.column>.col-md-1,.column>.col-md-10,.column>.col-md-11,.column>.col-md-12,.column>.col-md-2,.column>.col-md-3,.column>.col-md-4,.column>.col-md-5,.column>.col-md-6,.column>.col-md-7,.column>.col-md-8,.column>.col-md-9,.column>.col-md-auto,.column>.col-md-grow,.column>.col-md-shrink,.flex>.col-md,.flex>.col-md-0,.flex>.col-md-1,.flex>.col-md-10,.flex>.col-md-11,.flex>.col-md-12,.flex>.col-md-2,.flex>.col-md-3,.flex>.col-md-4,.flex>.col-md-5,.flex>.col-md-6,.flex>.col-md-7,.flex>.col-md-8,.flex>.col-md-9,.flex>.col-md-auto,.flex>.col-md-grow,.flex>.col-md-shrink{height:auto;min-height:0;max-height:100%}.col-md{flex:10000 1 0%}.col-md-0,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto{flex:0 0 auto}.col-md-grow{flex:1 0 auto}.col-md-shrink{flex:0 1 auto}.row>.col-md-0{height:auto;width:0%}.row>.offset-md-0{margin-left:0}.column>.col-md-0{height:0%;width:auto}.row>.col-md-1{height:auto;width:8.3333%}.row>.offset-md-1{margin-left:8.3333%}.column>.col-md-1{height:8.3333%;width:auto}.row>.col-md-2{height:auto;width:16.6667%}.row>.offset-md-2{margin-left:16.6667%}.column>.col-md-2{height:16.6667%;width:auto}.row>.col-md-3{height:auto;width:25%}.row>.offset-md-3{margin-left:25%}.column>.col-md-3{height:25%;width:auto}.row>.col-md-4{height:auto;width:33.3333%}.row>.offset-md-4{margin-left:33.3333%}.column>.col-md-4{height:33.3333%;width:auto}.row>.col-md-5{height:auto;width:41.6667%}.row>.offset-md-5{margin-left:41.6667%}.column>.col-md-5{height:41.6667%;width:auto}.row>.col-md-6{height:auto;width:50%}.row>.offset-md-6{margin-left:50%}.column>.col-md-6{height:50%;width:auto}.row>.col-md-7{height:auto;width:58.3333%}.row>.offset-md-7{margin-left:58.3333%}.column>.col-md-7{height:58.3333%;width:auto}.row>.col-md-8{height:auto;width:66.6667%}.row>.offset-md-8{margin-left:66.6667%}.column>.col-md-8{height:66.6667%;width:auto}.row>.col-md-9{height:auto;width:75%}.row>.offset-md-9{margin-left:75%}.column>.col-md-9{height:75%;width:auto}.row>.col-md-10{height:auto;width:83.3333%}.row>.offset-md-10{margin-left:83.3333%}.column>.col-md-10{height:83.3333%;width:auto}.row>.col-md-11{height:auto;width:91.6667%}.row>.offset-md-11{margin-left:91.6667%}.column>.col-md-11{height:91.6667%;width:auto}.row>.col-md-12{height:auto;width:100%}.row>.offset-md-12{margin-left:100%}.column>.col-md-12{height:100%;width:auto}}@media (min-width:1440px){.flex>.col-lg,.flex>.col-lg-0,.flex>.col-lg-1,.flex>.col-lg-10,.flex>.col-lg-11,.flex>.col-lg-12,.flex>.col-lg-2,.flex>.col-lg-3,.flex>.col-lg-4,.flex>.col-lg-5,.flex>.col-lg-6,.flex>.col-lg-7,.flex>.col-lg-8,.flex>.col-lg-9,.flex>.col-lg-auto,.flex>.col-lg-grow,.flex>.col-lg-shrink,.row>.col-lg,.row>.col-lg-0,.row>.col-lg-1,.row>.col-lg-10,.row>.col-lg-11,.row>.col-lg-12,.row>.col-lg-2,.row>.col-lg-3,.row>.col-lg-4,.row>.col-lg-5,.row>.col-lg-6,.row>.col-lg-7,.row>.col-lg-8,.row>.col-lg-9,.row>.col-lg-auto,.row>.col-lg-grow,.row>.col-lg-shrink{width:auto;min-width:0;max-width:100%}.column>.col-lg,.column>.col-lg-0,.column>.col-lg-1,.column>.col-lg-10,.column>.col-lg-11,.column>.col-lg-12,.column>.col-lg-2,.column>.col-lg-3,.column>.col-lg-4,.column>.col-lg-5,.column>.col-lg-6,.column>.col-lg-7,.column>.col-lg-8,.column>.col-lg-9,.column>.col-lg-auto,.column>.col-lg-grow,.column>.col-lg-shrink,.flex>.col-lg,.flex>.col-lg-0,.flex>.col-lg-1,.flex>.col-lg-10,.flex>.col-lg-11,.flex>.col-lg-12,.flex>.col-lg-2,.flex>.col-lg-3,.flex>.col-lg-4,.flex>.col-lg-5,.flex>.col-lg-6,.flex>.col-lg-7,.flex>.col-lg-8,.flex>.col-lg-9,.flex>.col-lg-auto,.flex>.col-lg-grow,.flex>.col-lg-shrink{height:auto;min-height:0;max-height:100%}.col-lg{flex:10000 1 0%}.col-lg-0,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto{flex:0 0 auto}.col-lg-grow{flex:1 0 auto}.col-lg-shrink{flex:0 1 auto}.row>.col-lg-0{height:auto;width:0%}.row>.offset-lg-0{margin-left:0}.column>.col-lg-0{height:0%;width:auto}.row>.col-lg-1{height:auto;width:8.3333%}.row>.offset-lg-1{margin-left:8.3333%}.column>.col-lg-1{height:8.3333%;width:auto}.row>.col-lg-2{height:auto;width:16.6667%}.row>.offset-lg-2{margin-left:16.6667%}.column>.col-lg-2{height:16.6667%;width:auto}.row>.col-lg-3{height:auto;width:25%}.row>.offset-lg-3{margin-left:25%}.column>.col-lg-3{height:25%;width:auto}.row>.col-lg-4{height:auto;width:33.3333%}.row>.offset-lg-4{margin-left:33.3333%}.column>.col-lg-4{height:33.3333%;width:auto}.row>.col-lg-5{height:auto;width:41.6667%}.row>.offset-lg-5{margin-left:41.6667%}.column>.col-lg-5{height:41.6667%;width:auto}.row>.col-lg-6{height:auto;width:50%}.row>.offset-lg-6{margin-left:50%}.column>.col-lg-6{height:50%;width:auto}.row>.col-lg-7{height:auto;width:58.3333%}.row>.offset-lg-7{margin-left:58.3333%}.column>.col-lg-7{height:58.3333%;width:auto}.row>.col-lg-8{height:auto;width:66.6667%}.row>.offset-lg-8{margin-left:66.6667%}.column>.col-lg-8{height:66.6667%;width:auto}.row>.col-lg-9{height:auto;width:75%}.row>.offset-lg-9{margin-left:75%}.column>.col-lg-9{height:75%;width:auto}.row>.col-lg-10{height:auto;width:83.3333%}.row>.offset-lg-10{margin-left:83.3333%}.column>.col-lg-10{height:83.3333%;width:auto}.row>.col-lg-11{height:auto;width:91.6667%}.row>.offset-lg-11{margin-left:91.6667%}.column>.col-lg-11{height:91.6667%;width:auto}.row>.col-lg-12{height:auto;width:100%}.row>.offset-lg-12{margin-left:100%}.column>.col-lg-12{height:100%;width:auto}}@media (min-width:1920px){.flex>.col-xl,.flex>.col-xl-0,.flex>.col-xl-1,.flex>.col-xl-10,.flex>.col-xl-11,.flex>.col-xl-12,.flex>.col-xl-2,.flex>.col-xl-3,.flex>.col-xl-4,.flex>.col-xl-5,.flex>.col-xl-6,.flex>.col-xl-7,.flex>.col-xl-8,.flex>.col-xl-9,.flex>.col-xl-auto,.flex>.col-xl-grow,.flex>.col-xl-shrink,.row>.col-xl,.row>.col-xl-0,.row>.col-xl-1,.row>.col-xl-10,.row>.col-xl-11,.row>.col-xl-12,.row>.col-xl-2,.row>.col-xl-3,.row>.col-xl-4,.row>.col-xl-5,.row>.col-xl-6,.row>.col-xl-7,.row>.col-xl-8,.row>.col-xl-9,.row>.col-xl-auto,.row>.col-xl-grow,.row>.col-xl-shrink{width:auto;min-width:0;max-width:100%}.column>.col-xl,.column>.col-xl-0,.column>.col-xl-1,.column>.col-xl-10,.column>.col-xl-11,.column>.col-xl-12,.column>.col-xl-2,.column>.col-xl-3,.column>.col-xl-4,.column>.col-xl-5,.column>.col-xl-6,.column>.col-xl-7,.column>.col-xl-8,.column>.col-xl-9,.column>.col-xl-auto,.column>.col-xl-grow,.column>.col-xl-shrink,.flex>.col-xl,.flex>.col-xl-0,.flex>.col-xl-1,.flex>.col-xl-10,.flex>.col-xl-11,.flex>.col-xl-12,.flex>.col-xl-2,.flex>.col-xl-3,.flex>.col-xl-4,.flex>.col-xl-5,.flex>.col-xl-6,.flex>.col-xl-7,.flex>.col-xl-8,.flex>.col-xl-9,.flex>.col-xl-auto,.flex>.col-xl-grow,.flex>.col-xl-shrink{height:auto;min-height:0;max-height:100%}.col-xl{flex:10000 1 0%}.col-xl-0,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{flex:0 0 auto}.col-xl-grow{flex:1 0 auto}.col-xl-shrink{flex:0 1 auto}.row>.col-xl-0{height:auto;width:0%}.row>.offset-xl-0{margin-left:0}.column>.col-xl-0{height:0%;width:auto}.row>.col-xl-1{height:auto;width:8.3333%}.row>.offset-xl-1{margin-left:8.3333%}.column>.col-xl-1{height:8.3333%;width:auto}.row>.col-xl-2{height:auto;width:16.6667%}.row>.offset-xl-2{margin-left:16.6667%}.column>.col-xl-2{height:16.6667%;width:auto}.row>.col-xl-3{height:auto;width:25%}.row>.offset-xl-3{margin-left:25%}.column>.col-xl-3{height:25%;width:auto}.row>.col-xl-4{height:auto;width:33.3333%}.row>.offset-xl-4{margin-left:33.3333%}.column>.col-xl-4{height:33.3333%;width:auto}.row>.col-xl-5{height:auto;width:41.6667%}.row>.offset-xl-5{margin-left:41.6667%}.column>.col-xl-5{height:41.6667%;width:auto}.row>.col-xl-6{height:auto;width:50%}.row>.offset-xl-6{margin-left:50%}.column>.col-xl-6{height:50%;width:auto}.row>.col-xl-7{height:auto;width:58.3333%}.row>.offset-xl-7{margin-left:58.3333%}.column>.col-xl-7{height:58.3333%;width:auto}.row>.col-xl-8{height:auto;width:66.6667%}.row>.offset-xl-8{margin-left:66.6667%}.column>.col-xl-8{height:66.6667%;width:auto}.row>.col-xl-9{height:auto;width:75%}.row>.offset-xl-9{margin-left:75%}.column>.col-xl-9{height:75%;width:auto}.row>.col-xl-10{height:auto;width:83.3333%}.row>.offset-xl-10{margin-left:83.3333%}.column>.col-xl-10{height:83.3333%;width:auto}.row>.col-xl-11{height:auto;width:91.6667%}.row>.offset-xl-11{margin-left:91.6667%}.column>.col-xl-11{height:91.6667%;width:auto}.row>.col-xl-12{height:auto;width:100%}.row>.offset-xl-12{margin-left:100%}.column>.col-xl-12{height:100%;width:auto}}.rounded-borders{border-radius:4px}.border-radius-inherit{border-radius:inherit}.no-transition{transition:none!important}.transition-0{transition:0s!important}.glossy{background-image:linear-gradient(to bottom,rgba(255,255,255,.3),rgba(255,255,255,0) 50%,rgba(0,0,0,.12) 51%,rgba(0,0,0,.04))!important}.q-placeholder::placeholder{color:inherit;opacity:.7}.q-document--prevent-scroll{overscroll-behavior:none!important}.q-document--prevent-scroll body{position:fixed!important}.q-body--fullscreen-mixin{position:fixed!important}.q-body--force-scrollbar-x{overflow-x:scroll}.q-body--force-scrollbar-y{overflow-y:scroll}.q-no-input-spinner{-moz-appearance:textfield!important}.q-no-input-spinner::-webkit-inner-spin-button,.q-no-input-spinner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.q-link{outline:0;text-decoration:none}.q-link--focusable:focus-visible{text-decoration:underline dashed currentColor 1px}body.electron .q-electron-drag{-webkit-user-select:none;-webkit-app-region:drag}body.electron .q-electron-drag .q-btn-item,body.electron .q-electron-drag--exception{-webkit-app-region:no-drag}img.responsive{max-width:100%;height:auto}.non-selectable{user-select:none!important}.scroll,body.mobile .scroll--mobile{overflow:auto}.scroll,.scroll-x,.scroll-y{-webkit-overflow-scrolling:touch;will-change:scroll-position}.scroll-x{overflow-x:auto}.scroll-y{overflow-y:auto}.no-scroll{overflow:hidden!important}.no-pointer-events,.no-pointer-events--children,.no-pointer-events--children *{pointer-events:none!important}.all-pointer-events{pointer-events:all!important}.cursor-pointer{cursor:pointer!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-inherit{cursor:inherit!important}.cursor-none{cursor:none!important}[aria-busy=true]{cursor:progress}[aria-controls]{cursor:pointer}[aria-disabled=true]{cursor:default}.rotate-45{transform:rotate(45deg)}.rotate-90{transform:rotate(90deg)}.rotate-135{transform:rotate(135deg)}.rotate-180{transform:rotate(180deg)}.rotate-225{transform:rotate(225deg)}.rotate-270{transform:rotate(270deg)}.rotate-315{transform:rotate(315deg)}.flip-horizontal{transform:scaleX(-1)}.flip-vertical{transform:scaleY(-1)}.float-left{float:left}.float-right{float:right}.relative-position{position:relative}.fixed,.fixed-bottom,.fixed-bottom-left,.fixed-bottom-right,.fixed-center,.fixed-full,.fixed-left,.fixed-right,.fixed-top,.fixed-top-left,.fixed-top-right,.fullscreen{position:fixed}.absolute,.absolute-bottom,.absolute-bottom-left,.absolute-bottom-right,.absolute-center,.absolute-full,.absolute-left,.absolute-right,.absolute-top,.absolute-top-left,.absolute-top-right{position:absolute}.absolute-top,.fixed-top{top:0;left:0;right:0}.absolute-right,.fixed-right{top:0;right:0;bottom:0}.absolute-bottom,.fixed-bottom{right:0;bottom:0;left:0}.absolute-left,.fixed-left{top:0;bottom:0;left:0}.absolute-top-left,.fixed-top-left{top:0;left:0}.absolute-top-right,.fixed-top-right{top:0;right:0}.absolute-bottom-left,.fixed-bottom-left{bottom:0;left:0}.absolute-bottom-right,.fixed-bottom-right{bottom:0;right:0}.fullscreen{z-index:6000;border-radius:0!important;max-width:100vw;max-height:100vh}body.q-ios-padding .fullscreen{padding-top:20px!important;padding-top:env(safe-area-inset-top)!important;padding-bottom:env(safe-area-inset-bottom)!important}.absolute-full,.fixed-full,.fullscreen{top:0;right:0;bottom:0;left:0}.absolute-center,.fixed-center{top:50%;left:50%;transform:translate(-50%,-50%)}.vertical-top{vertical-align:top!important}.vertical-middle{vertical-align:middle!important}.vertical-bottom{vertical-align:bottom!important}.on-left{margin-right:12px}.on-right{margin-left:12px}.q-position-engine{margin-top:var(--q-pe-top,0)!important;margin-left:var(--q-pe-left,0)!important;will-change:auto;visibility:collapse}:root{--q-size-xs:0;--q-size-sm:600px;--q-size-md:1024px;--q-size-lg:1440px;--q-size-xl:1920px}.fit{width:100%!important;height:100%!important}.full-height{height:100%!important}.full-width{width:100%!important;margin-left:0!important;margin-right:0!important}.window-height{margin-top:0!important;margin-bottom:0!important;height:100vh!important}.window-width{margin-left:0!important;margin-right:0!important;width:100vw!important}.block{display:block!important}.inline-block{display:inline-block!important}.q-pa-none{padding:0 0}.q-pl-none{padding-left:0}.q-pr-none{padding-right:0}.q-pt-none{padding-top:0}.q-pb-none{padding-bottom:0}.q-px-none{padding-left:0;padding-right:0}.q-py-none{padding-top:0;padding-bottom:0}.q-ma-none{margin:0 0}.q-ml-none{margin-left:0}.q-mr-none{margin-right:0}.q-mt-none{margin-top:0}.q-mb-none{margin-bottom:0}.q-mx-none{margin-left:0;margin-right:0}.q-my-none{margin-top:0;margin-bottom:0}.q-pa-xs{padding:4px 4px}.q-pl-xs{padding-left:4px}.q-pr-xs{padding-right:4px}.q-pt-xs{padding-top:4px}.q-pb-xs{padding-bottom:4px}.q-px-xs{padding-left:4px;padding-right:4px}.q-py-xs{padding-top:4px;padding-bottom:4px}.q-ma-xs{margin:4px 4px}.q-ml-xs{margin-left:4px}.q-mr-xs{margin-right:4px}.q-mt-xs{margin-top:4px}.q-mb-xs{margin-bottom:4px}.q-mx-xs{margin-left:4px;margin-right:4px}.q-my-xs{margin-top:4px;margin-bottom:4px}.q-pa-sm{padding:8px 8px}.q-pl-sm{padding-left:8px}.q-pr-sm{padding-right:8px}.q-pt-sm{padding-top:8px}.q-pb-sm{padding-bottom:8px}.q-px-sm{padding-left:8px;padding-right:8px}.q-py-sm{padding-top:8px;padding-bottom:8px}.q-ma-sm{margin:8px 8px}.q-ml-sm{margin-left:8px}.q-mr-sm{margin-right:8px}.q-mt-sm{margin-top:8px}.q-mb-sm{margin-bottom:8px}.q-mx-sm{margin-left:8px;margin-right:8px}.q-my-sm{margin-top:8px;margin-bottom:8px}.q-pa-md{padding:16px 16px}.q-pl-md{padding-left:16px}.q-pr-md{padding-right:16px}.q-pt-md{padding-top:16px}.q-pb-md{padding-bottom:16px}.q-px-md{padding-left:16px;padding-right:16px}.q-py-md{padding-top:16px;padding-bottom:16px}.q-ma-md{margin:16px 16px}.q-ml-md{margin-left:16px}.q-mr-md{margin-right:16px}.q-mt-md{margin-top:16px}.q-mb-md{margin-bottom:16px}.q-mx-md{margin-left:16px;margin-right:16px}.q-my-md{margin-top:16px;margin-bottom:16px}.q-pa-lg{padding:24px 24px}.q-pl-lg{padding-left:24px}.q-pr-lg{padding-right:24px}.q-pt-lg{padding-top:24px}.q-pb-lg{padding-bottom:24px}.q-px-lg{padding-left:24px;padding-right:24px}.q-py-lg{padding-top:24px;padding-bottom:24px}.q-ma-lg{margin:24px 24px}.q-ml-lg{margin-left:24px}.q-mr-lg{margin-right:24px}.q-mt-lg{margin-top:24px}.q-mb-lg{margin-bottom:24px}.q-mx-lg{margin-left:24px;margin-right:24px}.q-my-lg{margin-top:24px;margin-bottom:24px}.q-pa-xl{padding:48px 48px}.q-pl-xl{padding-left:48px}.q-pr-xl{padding-right:48px}.q-pt-xl{padding-top:48px}.q-pb-xl{padding-bottom:48px}.q-px-xl{padding-left:48px;padding-right:48px}.q-py-xl{padding-top:48px;padding-bottom:48px}.q-ma-xl{margin:48px 48px}.q-ml-xl{margin-left:48px}.q-mr-xl{margin-right:48px}.q-mt-xl{margin-top:48px}.q-mb-xl{margin-bottom:48px}.q-mx-xl{margin-left:48px;margin-right:48px}.q-my-xl{margin-top:48px;margin-bottom:48px}.q-mt-auto,.q-my-auto{margin-top:auto}.q-ml-auto{margin-left:auto}.q-mb-auto,.q-my-auto{margin-bottom:auto}.q-mr-auto{margin-right:auto}.q-mx-auto{margin-left:auto;margin-right:auto}.q-touch{user-select:none;user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none}.q-touch-x{touch-action:pan-x}.q-touch-y{touch-action:pan-y}:root{--q-transition-duration:.3s}.q-transition--fade-enter-active,.q-transition--fade-leave-active,.q-transition--flip-enter-active,.q-transition--flip-leave-active,.q-transition--jump-down-enter-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-enter-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-enter-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-enter-active,.q-transition--jump-up-leave-active,.q-transition--rotate-enter-active,.q-transition--rotate-leave-active,.q-transition--scale-enter-active,.q-transition--scale-leave-active,.q-transition--slide-down-enter-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-enter-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-enter-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-enter-active,.q-transition--slide-up-leave-active{--q-transition-duration:.3s;--q-transition-easing:cubic-bezier(0.215,0.61,0.355,1)}.q-transition--fade-leave-active,.q-transition--flip-leave-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-leave-active,.q-transition--rotate-leave-active,.q-transition--scale-leave-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-leave-active{position:absolute}.q-transition--slide-down-enter-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-enter-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-enter-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-enter-active,.q-transition--slide-up-leave-active{transition:transform var(--q-transition-duration) var(--q-transition-easing)}.q-transition--slide-right-enter-from{transform:translate3d(-100%,0,0)}.q-transition--slide-right-leave-to{transform:translate3d(100%,0,0)}.q-transition--slide-left-enter-from{transform:translate3d(100%,0,0)}.q-transition--slide-left-leave-to{transform:translate3d(-100%,0,0)}.q-transition--slide-up-enter-from{transform:translate3d(0,100%,0)}.q-transition--slide-up-leave-to{transform:translate3d(0,-100%,0)}.q-transition--slide-down-enter-from{transform:translate3d(0,-100%,0)}.q-transition--slide-down-leave-to{transform:translate3d(0,100%,0)}.q-transition--jump-down-enter-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-enter-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-enter-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-enter-active,.q-transition--jump-up-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration)}.q-transition--jump-down-enter-from,.q-transition--jump-down-leave-to,.q-transition--jump-left-enter-from,.q-transition--jump-left-leave-to,.q-transition--jump-right-enter-from,.q-transition--jump-right-leave-to,.q-transition--jump-up-enter-from,.q-transition--jump-up-leave-to{opacity:0}.q-transition--jump-right-enter-from{transform:translate3d(-15px,0,0)}.q-transition--jump-right-leave-to{transform:translate3d(15px,0,0)}.q-transition--jump-left-enter-from{transform:translate3d(15px,0,0)}.q-transition--jump-left-leave-to{transform:translateX(-15px)}.q-transition--jump-up-enter-from{transform:translate3d(0,15px,0)}.q-transition--jump-up-leave-to{transform:translate3d(0,-15px,0)}.q-transition--jump-down-enter-from{transform:translate3d(0,-15px,0)}.q-transition--jump-down-leave-to{transform:translate3d(0,15px,0)}.q-transition--fade-enter-active,.q-transition--fade-leave-active{transition:opacity var(--q-transition-duration) ease-out}.q-transition--fade-enter-from,.q-transition--fade-leave-to{opacity:0}.q-transition--scale-enter-active,.q-transition--scale-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration) var(--q-transition-easing)}.q-transition--scale-enter-from,.q-transition--scale-leave-to{opacity:0;transform:scale3d(0,0,1)}.q-transition--rotate-enter-active,.q-transition--rotate-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration) var(--q-transition-easing);transform-style:preserve-3d}.q-transition--rotate-enter-from,.q-transition--rotate-leave-to{opacity:0;transform:scale3d(0,0,1) rotate3d(0,0,1,90deg)}.q-transition--flip-down-enter-active,.q-transition--flip-down-leave-active,.q-transition--flip-left-enter-active,.q-transition--flip-left-leave-active,.q-transition--flip-right-enter-active,.q-transition--flip-right-leave-active,.q-transition--flip-up-enter-active,.q-transition--flip-up-leave-active{transition:transform var(--q-transition-duration);backface-visibility:hidden}.q-transition--flip-down-enter-to,.q-transition--flip-down-leave-from,.q-transition--flip-left-enter-to,.q-transition--flip-left-leave-from,.q-transition--flip-right-enter-to,.q-transition--flip-right-leave-from,.q-transition--flip-up-enter-to,.q-transition--flip-up-leave-from{transform:perspective(400px) rotate3d(1,1,0,0deg)}.q-transition--flip-right-enter-from{transform:perspective(400px) rotate3d(0,1,0,-180deg)}.q-transition--flip-right-leave-to{transform:perspective(400px) rotate3d(0,1,0,180deg)}.q-transition--flip-left-enter-from{transform:perspective(400px) rotate3d(0,1,0,180deg)}.q-transition--flip-left-leave-to{transform:perspective(400px) rotate3d(0,1,0,-180deg)}.q-transition--flip-up-enter-from{transform:perspective(400px) rotate3d(1,0,0,-180deg)}.q-transition--flip-up-leave-to{transform:perspective(400px) rotate3d(1,0,0,180deg)}.q-transition--flip-down-enter-from{transform:perspective(400px) rotate3d(1,0,0,180deg)}.q-transition--flip-down-leave-to{transform:perspective(400px) rotate3d(1,0,0,-180deg)}body{min-width:100px;min-height:100%;font-family:Roboto,"-apple-system","Helvetica Neue",Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;line-height:1.5;font-size:14px}h1{font-size:6rem;font-weight:300;line-height:6rem;letter-spacing:-.01562em}h2{font-size:3.75rem;font-weight:300;line-height:3.75rem;letter-spacing:-.00833em}h3{font-size:3rem;font-weight:400;line-height:3.125rem;letter-spacing:normal}h4{font-size:2.125rem;font-weight:400;line-height:2.5rem;letter-spacing:.00735em}h5{font-size:1.5rem;font-weight:400;line-height:2rem;letter-spacing:normal}h6{font-size:1.25rem;font-weight:500;line-height:2rem;letter-spacing:.0125em}p{margin:0 0 16px}.text-h1{font-size:6rem;font-weight:300;line-height:6rem;letter-spacing:-.01562em}.text-h2{font-size:3.75rem;font-weight:300;line-height:3.75rem;letter-spacing:-.00833em}.text-h3{font-size:3rem;font-weight:400;line-height:3.125rem;letter-spacing:normal}.text-h4{font-size:2.125rem;font-weight:400;line-height:2.5rem;letter-spacing:.00735em}.text-h5{font-size:1.5rem;font-weight:400;line-height:2rem;letter-spacing:normal}.text-h6{font-size:1.25rem;font-weight:500;line-height:2rem;letter-spacing:.0125em}.text-subtitle1{font-size:1rem;font-weight:400;line-height:1.75rem;letter-spacing:.00937em}.text-subtitle2{font-size:.875rem;font-weight:500;line-height:1.375rem;letter-spacing:.00714em}.text-body1{font-size:1rem;font-weight:400;line-height:1.5rem;letter-spacing:.03125em}.text-body2{font-size:.875rem;font-weight:400;line-height:1.25rem;letter-spacing:.01786em}.text-overline{font-size:.75rem;font-weight:500;line-height:2rem;letter-spacing:.16667em}.text-caption{font-size:.75rem;font-weight:400;line-height:1.25rem;letter-spacing:.03333em}.text-uppercase{text-transform:uppercase}.text-lowercase{text-transform:lowercase}.text-capitalize{text-transform:capitalize}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-justify{text-align:justify;hyphens:auto}.text-italic{font-style:italic}.text-bold{font-weight:700}.text-no-wrap{white-space:nowrap}.text-strike{text-decoration:line-through}.text-weight-thin{font-weight:100}.text-weight-light{font-weight:300}.text-weight-regular{font-weight:400}.text-weight-medium{font-weight:500}.text-weight-bold{font-weight:700}.text-weight-bolder{font-weight:900}small{font-size:80%}big{font-size:170%}sub{bottom:-.25em}sup{top:-.5em}.no-margin{margin:0!important}.no-padding{padding:0!important}.no-border{border:0!important}.no-border-radius{border-radius:0!important}.no-box-shadow{box-shadow:none!important}.no-outline{outline:0!important}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ellipsis-2-lines,.ellipsis-3-lines{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.ellipsis-2-lines{-webkit-line-clamp:2}.ellipsis-3-lines{-webkit-line-clamp:3}.readonly{cursor:default!important}.disabled,.disabled *,[disabled],[disabled] *{outline:0!important;cursor:not-allowed!important}.disabled,[disabled]{opacity:.6!important}.hidden{display:none!important}.invisible,.invisible *{visibility:hidden!important;transition:none!important;animation:none!important}.transparent{background:0 0!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-hidden-y{overflow-y:hidden!important}.hide-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.hide-scrollbar::-webkit-scrollbar{width:0;height:0;display:none}.dimmed:after,.light-dimmed:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0}.dimmed:after{background:rgba(0,0,0,.4)!important}.light-dimmed:after{background:rgba(255,255,255,.6)!important}.z-top{z-index:7000!important}.z-max{z-index:9998!important}body.desktop .desktop-hide,body:not(.desktop) .desktop-only{display:none!important}body.mobile .mobile-hide,body:not(.mobile) .mobile-only{display:none!important}body.native-mobile .native-mobile-hide,body:not(.native-mobile) .native-mobile-only{display:none!important}body.cordova .cordova-hide,body:not(.cordova) .cordova-only{display:none!important}body.capacitor .capacitor-hide,body:not(.capacitor) .capacitor-only{display:none!important}body.electron .electron-hide,body:not(.electron) .electron-only{display:none!important}body.touch .touch-hide,body:not(.touch) .touch-only{display:none!important}body.within-iframe .within-iframe-hide,body:not(.within-iframe) .within-iframe-only{display:none!important}body.platform-ios .platform-ios-hide,body:not(.platform-ios) .platform-ios-only{display:none!important}body.platform-android .platform-android-hide,body:not(.platform-android) .platform-android-only{display:none!important}@media all and (orientation:portrait){.orientation-landscape{display:none!important}}@media all and (orientation:landscape){.orientation-portrait{display:none!important}}@media screen{.print-only{display:none!important}}@media print{.print-hide{display:none!important}}@media (max-width:599.98px){.gt-lg,.gt-md,.gt-sm,.gt-xs,.lg,.md,.sm,.xl,.xs-hide{display:none!important}}@media (min-width:600px) and (max-width:1023.98px){.gt-lg,.gt-md,.gt-sm,.lg,.lt-sm,.md,.sm-hide,.xl,.xs{display:none!important}}@media (min-width:1024px) and (max-width:1439.98px){.gt-lg,.gt-md,.lg,.lt-md,.lt-sm,.md-hide,.sm,.xl,.xs{display:none!important}}@media (min-width:1440px) and (max-width:1919.98px){.gt-lg,.lg-hide,.lt-lg,.lt-md,.lt-sm,.md,.sm,.xl,.xs{display:none!important}}@media (min-width:1920px){.lg,.lt-lg,.lt-md,.lt-sm,.lt-xl,.md,.sm,.xl-hide,.xs{display:none!important}}.q-focus-helper,.q-focusable,.q-hoverable,.q-manual-focusable{outline:0}body.desktop .q-focus-helper{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;border-radius:inherit;opacity:0;transition:background-color .3s cubic-bezier(.25, .8, .5, 1),opacity .4s cubic-bezier(.25, .8, .5, 1)}body.desktop .q-focus-helper:after,body.desktop .q-focus-helper:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;border-radius:inherit;transition:background-color .3s cubic-bezier(.25, .8, .5, 1),opacity .6s cubic-bezier(.25, .8, .5, 1)}body.desktop .q-focus-helper:before{background:#000}body.desktop .q-focus-helper:after{background:#fff}body.desktop .q-focus-helper--rounded{border-radius:4px}body.desktop .q-focus-helper--round{border-radius:50%}body.desktop .q-focusable:focus>.q-focus-helper,body.desktop .q-hoverable:hover>.q-focus-helper,body.desktop .q-manual-focusable--focused>.q-focus-helper{background:currentColor;opacity:.15}body.desktop .q-focusable:focus>.q-focus-helper:before,body.desktop .q-hoverable:hover>.q-focus-helper:before,body.desktop .q-manual-focusable--focused>.q-focus-helper:before{opacity:.1}body.desktop .q-focusable:focus>.q-focus-helper:after,body.desktop .q-hoverable:hover>.q-focus-helper:after,body.desktop .q-manual-focusable--focused>.q-focus-helper:after{opacity:.4}body.desktop .q-focusable:focus>.q-focus-helper,body.desktop .q-manual-focusable--focused>.q-focus-helper{opacity:.22}body.body--dark{color:#fff;background:var(--q-dark-page)}.q-dark{color:#fff;background:var(--q-dark)}body[data-theme=classic].neon-border .q-card,body[data-theme=classic].neon-border .q-card.q-card--dark,body[data-theme=classic].neon-border .q-date,body[data-theme=classic].neon-border .q-date--dark{border:2px solid #673ab7;box-shadow:none}body[data-theme=bitcoin].neon-border .q-card,body[data-theme=bitcoin].neon-border .q-card.q-card--dark,body[data-theme=bitcoin].neon-border .q-date,body[data-theme=bitcoin].neon-border .q-date--dark{border:2px solid #ea611d;box-shadow:none}body[data-theme=freedom].neon-border .q-card,body[data-theme=freedom].neon-border .q-card.q-card--dark,body[data-theme=freedom].neon-border .q-date,body[data-theme=freedom].neon-border .q-date--dark{border:2px solid #e22156;box-shadow:none}body[data-theme=cyber].neon-border .q-card,body[data-theme=cyber].neon-border .q-card.q-card--dark,body[data-theme=cyber].neon-border .q-date,body[data-theme=cyber].neon-border .q-date--dark{border:2px solid #7cb342;box-shadow:none}body[data-theme=mint].neon-border .q-card,body[data-theme=mint].neon-border .q-card.q-card--dark,body[data-theme=mint].neon-border .q-date,body[data-theme=mint].neon-border .q-date--dark{border:2px solid #3ab77d;box-shadow:none}body[data-theme=autumn].neon-border .q-card,body[data-theme=autumn].neon-border .q-card.q-card--dark,body[data-theme=autumn].neon-border .q-date,body[data-theme=autumn].neon-border .q-date--dark{border:2px solid #b7763a;box-shadow:none}body[data-theme=flamingo].neon-border .q-card,body[data-theme=flamingo].neon-border .q-card.q-card--dark,body[data-theme=flamingo].neon-border .q-date,body[data-theme=flamingo].neon-border .q-date--dark{border:2px solid #f0f;box-shadow:none}body[data-theme=monochrome].neon-border .q-card,body[data-theme=monochrome].neon-border .q-card.q-card--dark,body[data-theme=monochrome].neon-border .q-date,body[data-theme=monochrome].neon-border .q-date--dark{border:2px solid #494949;box-shadow:none}body[data-theme=salvador].neon-border .q-card,body[data-theme=salvador].neon-border .q-card.q-card--dark,body[data-theme=salvador].neon-border .q-date,body[data-theme=salvador].neon-border .q-date--dark{border:2px solid #1976d2;box-shadow:none}body.hard-border .q-card,body.hard-border .q-card.q-card--dark,body.hard-border .q-date,body.hard-border .q-date--dark{box-shadow:0 0 0 1px rgba(0,0,0,.12),0 0 0 1px rgba(255,255,255,.2784313725);border:none}body.retro-border .q-card,body.retro-border .q-card.q-card--dark,body.retro-border .q-date,body.retro-border .q-date--dark{border:none;box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}body.no-border .q-card,body.no-border .q-card.q-card--dark,body.no-border .q-date,body.no-border .q-date--dark{border:none;box-shadow:none}body[data-theme=classic]{--q-primary:#673ab7;--q-secondary:#9c27b0;--q-dark-page:#1f2234}body[data-theme=classic] [data-theme=classic] .q-card--dark,body[data-theme=classic] [data-theme=classic] .q-stepper--dark{background:#333646!important}body[data-theme=bitcoin]{--q-primary:#ea611d;--q-secondary:#e56f35;--q-dark-page:#2d293b}body[data-theme=bitcoin] [data-theme=bitcoin] .q-card--dark,body[data-theme=bitcoin] [data-theme=bitcoin] .q-stepper--dark{background:#333646!important}body[data-theme=freedom]{--q-primary:#e22156;--q-secondary:#b91a45;--q-dark-page:#462f36}body[data-theme=freedom] [data-theme=freedom] .q-card--dark,body[data-theme=freedom] [data-theme=freedom] .q-stepper--dark{background:#47393d!important}body[data-theme=cyber]{--q-primary:#7cb342;--q-secondary:#558b2f;--q-dark-page:#000}body[data-theme=cyber] [data-theme=cyber] .q-card--dark,body[data-theme=cyber] [data-theme=cyber] .q-stepper--dark{background:#1f2915!important}body[data-theme=mint]{--q-primary:#3ab77d;--q-secondary:#27b065;--q-dark-page:#1f342b}body[data-theme=mint] [data-theme=mint] .q-card--dark,body[data-theme=mint] [data-theme=mint] .q-stepper--dark{background:#334642!important}body[data-theme=autumn]{--q-primary:#b7763a;--q-secondary:#b07927;--q-dark-page:#34291f}body[data-theme=autumn] [data-theme=autumn] .q-card--dark,body[data-theme=autumn] [data-theme=autumn] .q-stepper--dark{background:#463f33!important}body[data-theme=flamingo]{--q-primary:#ff00ff;--q-secondary:#fda3fd;--q-dark-page:#2f032f}body[data-theme=flamingo] [data-theme=flamingo] .q-card--dark,body[data-theme=flamingo] [data-theme=flamingo] .q-stepper--dark{background:#bc23bc!important}body[data-theme=monochrome]{--q-primary:#494949;--q-secondary:#6b6b6b;--q-dark-page:#000}body[data-theme=monochrome] [data-theme=monochrome] .q-card--dark,body[data-theme=monochrome] [data-theme=monochrome] .q-stepper--dark{background:#272727!important}body[data-theme=salvador]{--q-primary:#1976d2;--q-secondary:#26a69a;--q-dark-page:#253647}body[data-theme=salvador] [data-theme=salvador] .q-card--dark,body[data-theme=salvador] [data-theme=salvador] .q-stepper--dark{background:#343d47!important}body.gradient-bg{background-image:linear-gradient(to bottom right,#fff,var(--q-primary));background-attachment:fixed}body.gradient-bg.body--dark{background-image:linear-gradient(to bottom right,var(--q-dark-page),#0a0a0a);background-attachment:fixed}body.bg-image::before{content:"";position:fixed;z-index:-1;top:0;left:0;width:100%;height:100%;filter:blur(8px);background-image:var(--background);background-size:cover;background-position:center;background-repeat:no-repeat}body.bg-image .q-page-container{backdrop-filter:none}body.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){--q-dark:rgba(29, 29, 29, 0.3);background-color:var(--q-dark)}body.body--dark .q-drawer,body.body--dark .q-header{--q-dark:rgba(29, 29, 29, 0.3);background-color:var(--q-dark);backdrop-filter:brightness(0.8)}body.rounded-ui .q-btn,body.rounded-ui .q-card{border-radius:10px}body[data-theme=classic].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(103,58,183,.08),rgba(156,39,176,.06))}body[data-theme=classic].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(103,58,183,.06),rgba(156,39,176,.04))}body[data-theme=classic].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(38.6192771084,42.356626506,64.7807228916),rgba(103,58,183,.07))}body[data-theme=classic].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(36.7144578313,40.2674698795,61.5855421687),rgba(103,58,183,.05))}body[data-theme=bitcoin].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(234,97,29,.08),rgba(229,111,53,.06))}body[data-theme=bitcoin].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(234,97,29,.06),rgba(229,111,53,.04))}body[data-theme=bitcoin].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(54.18,49.364,71.036),rgba(234,97,29,.07))}body[data-theme=bitcoin].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(51.885,47.273,68.027),rgba(234,97,29,.05))}body[data-theme=freedom].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(226,33,86,.08),rgba(185,26,69,.06))}body[data-theme=freedom].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(226,33,86,.06),rgba(185,26,69,.04))}body[data-theme=freedom].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(82.2051282051,55.1948717949,63.4153846154),rgba(226,33,86,.07))}body[data-theme=freedom].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(79.1538461538,53.1461538462,61.0615384615),rgba(226,33,86,.05))}body[data-theme=cyber].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(124,179,66,.08),rgba(85,139,47,.06))}body[data-theme=cyber].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(124,179,66,.06),rgba(85,139,47,.04))}body[data-theme=cyber].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(10.2,10.2,10.2),rgba(124,179,66,.07))}body[data-theme=cyber].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(7.65,7.65,7.65),rgba(124,179,66,.05))}body[data-theme=mint].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(58,183,125,.08),rgba(39,176,101,.06))}body[data-theme=mint].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(58,183,125,.06),rgba(39,176,101,.04))}body[data-theme=mint].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(38.6192771084,64.7807228916,53.5686746988),rgba(58,183,125,.07))}body[data-theme=mint].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(36.7144578313,61.5855421687,50.9265060241),rgba(58,183,125,.05))}body[data-theme=autumn].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(183,118,58,.08),rgba(176,121,39,.06))}body[data-theme=autumn].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(183,118,58,.06),rgba(176,121,39,.04))}body[data-theme=autumn].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(64.7807228916,51.0771084337,38.6192771084),rgba(183,118,58,.07))}body[data-theme=autumn].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(61.5855421687,48.5578313253,36.7144578313),rgba(183,118,58,.05))}body[data-theme=flamingo].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(255,0,255,.08),rgba(253,163,253,.06))}body[data-theme=flamingo].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(255,0,255,.06),rgba(253,163,253,.04))}body[data-theme=flamingo].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(66.176,4.224,66.176),rgba(255,0,255,.07))}body[data-theme=flamingo].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(61.382,3.918,61.382),rgba(255,0,255,.05))}body[data-theme=monochrome].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(73,73,73,.08),rgba(107,107,107,.06))}body[data-theme=monochrome].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(73,73,73,.06),rgba(107,107,107,.04))}body[data-theme=monochrome].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(10.2,10.2,10.2),rgba(73,73,73,.07))}body[data-theme=monochrome].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(7.65,7.65,7.65),rgba(73,73,73,.05))}body[data-theme=salvador].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(25,118,210,.08),rgba(38,166,154,.06))}body[data-theme=salvador].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(25,118,210,.06),rgba(38,166,154,.04))}body[data-theme=salvador].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(43.9888888889,64.2,84.4111111111),rgba(25,118,210,.07))}body[data-theme=salvador].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(42.2416666667,61.65,81.0583333333),rgba(25,118,210,.05))}body.card-shadow .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){box-shadow:0 10px 24px rgba(0,0,0,.18)}body.card-shadow.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){box-shadow:0 12px 28px rgba(0,0,0,.45)}body.no-burger-background .q-drawer{background-color:transparent!important;background-image:none!important;backdrop-filter:none!important;box-shadow:none!important}:root{--size:100px;--gap:25px}.home .wrapper{display:flex;flex-direction:column;gap:var(--gap);margin:auto;max-width:100%}.home .marquee{display:flex;overflow:hidden;user-select:none;gap:var(--gap);height:max-content;mask-image:linear-gradient(to right,hsla(0,0%,0%,0),hsl(0,0%,0%) 20%,hsl(0,0%,0%) 80%,hsla(0,0%,0%,0))}.home .marquee__group{flex-shrink:0;display:flex;align-items:center;justify-content:space-around;gap:var(--gap);min-width:100%;animation:scroll-x 60s linear infinite}.home .marquee:hover .marquee__group{animation-play-state:paused}.home .marquee__group div{width:var(--size)}@keyframes scroll-x{from{transform:translateX(0)}to{transform:translateX(calc(-100% - var(--gap)))}}[v-cloak]{display:none}body.body--dark .q-table--dark{background:0 0}body.body--dark .q-field--error .q-field__messages,body.body--dark .q-field--error .text-negative{color:#ff0!important}.lnbits-drawer__q-list .q-item{padding-top:5px!important;padding-bottom:5px!important;border-top-right-radius:3px;border-bottom-right-radius:3px}.lnbits-drawer__q-list .q-item.q-item--active{color:inherit;font-weight:700}.lnbits__dialog-card{width:500px}.blur-and-disable{filter:blur(4px);pointer-events:none;user-select:none;opacity:.6}.lnbits__table-bordered td,.lnbits__table-bordered th{border:1px solid #000;border-collapse:collapse}.q-table--dense .q-table__bottom,.q-table--dense td:first-child,.q-table--dense th:first-child{padding-left:6px!important}.q-table--dense .q-table__bottom,.q-table--dense td:last-child,.q-table--dense th:last-child{padding-right:6px!important}a.inherit{color:inherit;text-decoration:none}video{border-radius:3px}.material-icons{font-family:"Material Icons";font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale}.q-rating__icon{font-size:1em}.text-wrap{word-break:break-word}.q-card code{overflow-wrap:break-word}.qrcode__wrapper{position:relative;display:flex;align-items:center;justify-content:center;margin:0 auto}.qrcode__wrapper canvas{width:100%!important;height:100%!important;max-width:320px}.qrcode__image{position:absolute;max-width:52px;width:15%;overflow:hidden;background:#fff;overflow:hidden;padding:.2rem;border-radius:.2rem}.whitespace-pre-line{white-space:pre-line}.q-carousel__slide{background-size:contain;background-repeat:no-repeat}.q-dialog__inner--minimized{padding:12px}.first-install{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%}.first-install .grid{display:block}.first-install .hero-wrapper{display:none}.first-install .hero{display:block;height:100%;max-width:250px;background-image:url(/static/images/logos/lnbits.svg);background-position:center;background-size:contain;background-repeat:no-repeat}@media (min-width:992px){.first-install .grid{display:grid;grid-template-columns:1fr 1fr;grid-gap:1rem}.first-install .hero-wrapper{display:block;position:relative;height:100%;padding:1rem}}.wallet-list-card{margin-top:1px;margin-right:1rem}.wallet-list-card:first-child{margin-left:1px}@media (max-width:1024px){.wallet-card{background:0 0!important;box-shadow:none!important;border:none!important}.mobile-simple .wallet-wrapper{position:fixed!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important}.mobile-simple .wallet-card{width:90%!important}}.error-code{font-size:clamp(15vh, 20vw, 30vh)}.error-message{font-size:clamp(1.5rem, 3vw, 3.75rem);font-weight:300;opacity:.4} \ No newline at end of file +*,:after,:before{box-sizing:inherit;-webkit-tap-highlight-color:transparent;-moz-tap-highlight-color:transparent}#q-app,body,html{width:100%;direction:ltr}body.platform-ios.within-iframe,body.platform-ios.within-iframe #q-app{width:100px;min-width:100%}body,html{margin:0;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}img{border-style:none}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;font-family:inherit;margin:0}optgroup{font-weight:700}button,input,select{overflow:visible;text-transform:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button:-moz-focusring,input:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.q-icon{line-height:1;width:1em;height:1em;flex-shrink:0;letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;direction:ltr;text-align:center;position:relative;box-sizing:content-box;fill:currentColor}.q-icon:after,.q-icon:before{width:100%;height:100%;display:flex!important;align-items:center;justify-content:center}.q-icon>img,.q-icon>svg{width:100%;height:100%}.q-icon>div{box-sizing:border-box}.material-icons,.material-icons-outlined,.material-icons-round,.material-icons-sharp,.material-symbols-outlined,.material-symbols-rounded,.material-symbols-sharp,.q-icon{user-select:none;cursor:inherit;font-size:inherit;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}.q-panel{height:100%;width:100%}.q-panel>div{height:100%;width:100%}.q-panel-parent{overflow:hidden;position:relative}.q-loading-bar{position:fixed;z-index:9998;transition:transform .5s cubic-bezier(0, 0, .2, 1),opacity .5s;background:#f44336}.q-loading-bar--top{left:0;right:0;top:0;width:100%}.q-loading-bar--bottom{left:0;right:0;bottom:0;width:100%}.q-loading-bar--right{top:0;bottom:0;right:0;height:100%}.q-loading-bar--left{top:0;bottom:0;left:0;height:100%}.q-avatar{position:relative;vertical-align:middle;display:inline-block;border-radius:50%;font-size:48px;height:1em;width:1em}.q-avatar__content{font-size:.5em;line-height:.5em}.q-avatar img:not(.q-icon):not(.q-img__image),.q-avatar__content{border-radius:inherit;height:inherit;width:inherit}.q-avatar--square{border-radius:0}.q-badge{background-color:var(--q-primary);color:#fff;padding:2px 6px;border-radius:4px;font-size:12px;line-height:1;min-height:12px;font-weight:400;vertical-align:baseline}.q-badge--single-line{white-space:nowrap}.q-badge--multi-line{word-break:break-all;word-wrap:break-word}.q-badge--floating{position:absolute;top:-4px;right:-3px;cursor:inherit}.q-badge--transparent{opacity:.8}.q-badge--outline{background-color:transparent;border:1px solid currentColor}.q-badge--rounded{border-radius:1em}.q-banner{min-height:54px;padding:8px 16px;background:#fff}.q-banner--top-padding{padding-top:14px}.q-banner__avatar{min-width:1px!important}.q-banner__avatar>.q-avatar{font-size:46px}.q-banner__avatar>.q-icon{font-size:40px}.q-banner__avatar:not(:empty)+.q-banner__content{padding-left:16px}.q-banner__actions.col-auto{padding-left:16px}.q-banner__actions.col-all .q-btn-item{margin:4px 0 0 4px}.q-banner--dense{min-height:32px;padding:8px}.q-banner--dense.q-banner--top-padding{padding-top:12px}.q-banner--dense .q-banner__avatar>.q-avatar,.q-banner--dense .q-banner__avatar>.q-icon{font-size:28px}.q-banner--dense .q-banner__avatar:not(:empty)+.q-banner__content{padding-left:8px}.q-banner--dense .q-banner__actions.col-auto{padding-left:8px}.q-bar{background:rgba(0,0,0,.2)}.q-bar>.q-icon{margin-left:2px}.q-bar>div,.q-bar>div+.q-icon{margin-left:8px}.q-bar>.q-btn{margin-left:2px}.q-bar>.q-btn:first-child,.q-bar>.q-icon:first-child,.q-bar>div:first-child{margin-left:0}.q-bar--standard{padding:0 12px;height:32px;font-size:18px}.q-bar--standard>div{font-size:16px}.q-bar--standard .q-btn{font-size:11px}.q-bar--dense{padding:0 8px;height:24px;font-size:14px}.q-bar--dense .q-btn{font-size:8px}.q-bar--dark{background:rgba(255,255,255,.15)}.q-breadcrumbs__el{color:inherit}.q-breadcrumbs__el-icon{font-size:125%}.q-breadcrumbs__el-icon--with-label{margin-right:8px}[dir=rtl] .q-breadcrumbs__separator .q-icon{transform:scaleX(-1)}.q-btn{display:inline-flex;flex-direction:column;align-items:stretch;position:relative;outline:0;border:0;vertical-align:middle;font-size:14px;line-height:1.715em;text-decoration:none;color:inherit;background:0 0;font-weight:500;text-transform:uppercase;text-align:center;width:auto;height:auto;cursor:default;padding:4px 16px;min-height:2.572em}.q-btn .q-icon,.q-btn .q-spinner{font-size:1.715em}.q-btn.disabled{opacity:.7!important}.q-btn:before{content:"";display:block;position:absolute;left:0;right:0;top:0;bottom:0;border-radius:inherit;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-btn--actionable{cursor:pointer}.q-btn--actionable.q-btn--standard:before{transition:box-shadow .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--actionable.q-btn--standard.q-btn--active:before,.q-btn--actionable.q-btn--standard:active:before{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px rgba(0,0,0,.14),0 1px 14px rgba(0,0,0,.12)}.q-btn--no-uppercase{text-transform:none}.q-btn--rectangle{border-radius:3px}.q-btn--outline{background:0 0!important}.q-btn--outline:before{border:1px solid currentColor}.q-btn--push{border-radius:7px}.q-btn--push:before{border-bottom:3px solid rgba(0,0,0,.15)}.q-btn--push.q-btn--actionable{transition:transform .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--push.q-btn--actionable:before{transition:border-width .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--push.q-btn--actionable.q-btn--active,.q-btn--push.q-btn--actionable:active{transform:translateY(2px)}.q-btn--push.q-btn--actionable.q-btn--active:before,.q-btn--push.q-btn--actionable:active:before{border-bottom-width:0}.q-btn--rounded{border-radius:28px}.q-btn--round{border-radius:50%;padding:0;min-width:3em;min-height:3em}.q-btn--square{border-radius:0}.q-btn--flat:before,.q-btn--outline:before,.q-btn--unelevated:before{box-shadow:none}.q-btn--dense{padding:.285em;min-height:2em}.q-btn--dense.q-btn--round{padding:0;min-height:2.4em;min-width:2.4em}.q-btn--dense .on-left{margin-right:6px}.q-btn--dense .on-right{margin-left:6px}.q-btn--fab .q-icon,.q-btn--fab-mini .q-icon{font-size:24px}.q-btn--fab{padding:16px;min-height:56px;min-width:56px}.q-btn--fab .q-icon{margin:auto}.q-btn--fab-mini{padding:8px;min-height:40px;min-width:40px}.q-btn__content{transition:opacity .3s;z-index:0}.q-btn__content--hidden{opacity:0;pointer-events:none}.q-btn__progress{border-radius:inherit;z-index:0}.q-btn__progress-indicator{z-index:-1;transform:translateX(-100%);background:rgba(255,255,255,.25)}.q-btn__progress--dark .q-btn__progress-indicator{background:rgba(0,0,0,.2)}.q-btn--flat .q-btn__progress-indicator,.q-btn--outline .q-btn__progress-indicator{opacity:.2;background:currentColor}.q-btn-dropdown--split .q-btn-dropdown__arrow-container{padding:0 4px}.q-btn-dropdown--split .q-btn-dropdown__arrow-container.q-btn--outline{border-left:1px solid currentColor}.q-btn-dropdown--split .q-btn-dropdown__arrow-container:not(.q-btn--outline){border-left:1px solid rgba(255,255,255,.3)}.q-btn-dropdown--simple *+.q-btn-dropdown__arrow{margin-left:8px}.q-btn-dropdown__arrow{transition:transform .28s}.q-btn-dropdown--current{flex-grow:1}.q-btn-group{border-radius:3px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);vertical-align:middle}.q-btn-group>.q-btn-item{border-radius:inherit;align-self:stretch}.q-btn-group>.q-btn-item:before{box-shadow:none}.q-btn-group>.q-btn-item .q-badge--floating{right:0}.q-btn-group>.q-btn-group{box-shadow:none}.q-btn-group>.q-btn-group:first-child>.q-btn:first-child{border-top-left-radius:inherit;border-bottom-left-radius:inherit}.q-btn-group>.q-btn-group:last-child>.q-btn:last-child{border-top-right-radius:inherit;border-bottom-right-radius:inherit}.q-btn-group>.q-btn-group:not(:first-child)>.q-btn:first-child:before{border-left:0}.q-btn-group>.q-btn-group:not(:last-child)>.q-btn:last-child:before{border-right:0}.q-btn-group>.q-btn-item:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.q-btn-group>.q-btn-item:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.q-btn-group>.q-btn-item.q-btn--standard:before{z-index:-1}.q-btn-group--push{border-radius:7px}.q-btn-group--push>.q-btn--push.q-btn--actionable{transform:none}.q-btn-group--push>.q-btn--push.q-btn--actionable .q-btn__content{transition:margin-top .3s cubic-bezier(.25, .8, .5, 1),margin-bottom .3s cubic-bezier(.25, .8, .5, 1)}.q-btn-group--push>.q-btn--push.q-btn--actionable.q-btn--active .q-btn__content,.q-btn-group--push>.q-btn--push.q-btn--actionable:active .q-btn__content{margin-top:2px;margin-bottom:-2px}.q-btn-group--rounded{border-radius:28px}.q-btn-group--square{border-radius:0}.q-btn-group--flat,.q-btn-group--outline,.q-btn-group--unelevated{box-shadow:none}.q-btn-group--outline>.q-separator{display:none}.q-btn-group--outline>.q-btn-item+.q-btn-item:before{border-left:0}.q-btn-group--outline>.q-btn-item:not(:last-child):before{border-right:0}.q-btn-group--stretch{align-self:stretch;border-radius:0}.q-btn-group--glossy>.q-btn-item{background-image:linear-gradient(to bottom,rgba(255,255,255,.3),rgba(255,255,255,0) 50%,rgba(0,0,0,.12) 51%,rgba(0,0,0,.04))!important}.q-btn-group--spread>.q-btn-group{display:flex!important}.q-btn-group--spread>.q-btn-group>.q-btn-item:not(.q-btn-dropdown__arrow-container),.q-btn-group--spread>.q-btn-item{width:auto;min-width:0;max-width:100%;flex:10000 1 0%}.q-btn-toggle{position:relative}.q-card{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;vertical-align:top;background:#fff;position:relative}.q-card>div:not(.q--avoid-card-border),.q-card>img:not(.q--avoid-card-border){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.q-card>div:nth-child(1of:not(.q--avoid-card-border)),.q-card>img:nth-child(1of:not(.q--avoid-card-border)){border-top:0;border-top-left-radius:inherit;border-top-right-radius:inherit}.q-card>div:nth-last-child(1of:not(.q--avoid-card-border)),.q-card>img:nth-last-child(1of:not(.q--avoid-card-border)){border-bottom:0;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.q-card>div:not(.q--avoid-card-border){border-left:0;border-right:0;box-shadow:none}.q-card--bordered{border:1px solid rgba(0,0,0,.12)}.q-card--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-card__section{position:relative}.q-card__section--vert{padding:16px}.q-card__section--horiz>div:not(.q--avoid-card-border),.q-card__section--horiz>img:not(.q--avoid-card-border){border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0}.q-card__section--horiz>div:nth-child(1of:not(.q--avoid-card-border)),.q-card__section--horiz>img:nth-child(1of:not(.q--avoid-card-border)){border-top-left-radius:inherit;border-bottom-left-radius:inherit}.q-card__section--horiz>div:nth-last-child(1of:not(.q--avoid-card-border)),.q-card__section--horiz>img:nth-last-child(1of:not(.q--avoid-card-border)){border-top-right-radius:inherit;border-bottom-right-radius:inherit}.q-card__section--horiz>div:not(.q--avoid-card-border){border-top:0;border-bottom:0;box-shadow:none}.q-card__actions{padding:8px;align-items:center}.q-card__actions .q-btn--rectangle{padding:0 8px}.q-card__actions--horiz>.q-btn-group+.q-btn-item,.q-card__actions--horiz>.q-btn-item+.q-btn-group,.q-card__actions--horiz>.q-btn-item+.q-btn-item{margin-left:8px}.q-card__actions--vert>.q-btn-item.q-btn--round{align-self:center}.q-card__actions--vert>.q-btn-group+.q-btn-item,.q-card__actions--vert>.q-btn-item+.q-btn-group,.q-card__actions--vert>.q-btn-item+.q-btn-item{margin-top:4px}.q-card__actions--vert>.q-btn-group>.q-btn-item{flex-grow:1}.q-card>img{display:block;width:100%;max-width:100%;border:0}.q-carousel{background-color:#fff;height:400px}.q-carousel__slide{min-height:100%;background-size:cover;background-position:50%}.q-carousel .q-carousel--padding,.q-carousel__slide{padding:16px}.q-carousel__slides-container{height:100%}.q-carousel__control{color:#fff}.q-carousel__arrow{pointer-events:none}.q-carousel__arrow .q-icon{font-size:28px}.q-carousel__arrow .q-btn{pointer-events:all}.q-carousel__next-arrow--horizontal,.q-carousel__prev-arrow--horizontal{top:16px;bottom:16px}.q-carousel__prev-arrow--horizontal{left:16px}.q-carousel__next-arrow--horizontal{right:16px}.q-carousel__next-arrow--vertical,.q-carousel__prev-arrow--vertical{left:16px;right:16px}.q-carousel__prev-arrow--vertical{top:16px}.q-carousel__next-arrow--vertical{bottom:16px}.q-carousel__navigation--bottom,.q-carousel__navigation--top{left:16px;right:16px;overflow-x:auto;overflow-y:hidden}.q-carousel__navigation--top{top:16px}.q-carousel__navigation--bottom{bottom:16px}.q-carousel__navigation--left,.q-carousel__navigation--right{top:16px;bottom:16px;overflow-x:hidden;overflow-y:auto}.q-carousel__navigation--left>.q-carousel__navigation-inner,.q-carousel__navigation--right>.q-carousel__navigation-inner{flex-direction:column}.q-carousel__navigation--left{left:16px}.q-carousel__navigation--right{right:16px}.q-carousel__navigation-inner{flex:1 1 auto}.q-carousel__navigation .q-btn{margin:6px 4px;padding:5px}.q-carousel__navigation-icon--inactive{opacity:.7}.q-carousel .q-carousel__thumbnail{margin:2px;height:50px;width:auto;display:inline-block;cursor:pointer;border:1px solid transparent;border-radius:4px;vertical-align:middle;opacity:.7;transition:opacity .3s}.q-carousel .q-carousel__thumbnail--active,.q-carousel .q-carousel__thumbnail:hover{opacity:1}.q-carousel .q-carousel__thumbnail--active{border-color:currentColor;cursor:default}.q-carousel--arrows-vertical .q-carousel--padding,.q-carousel--arrows-vertical.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-top .q-carousel--padding,.q-carousel--navigation-top.q-carousel--with-padding .q-carousel__slide{padding-top:60px}.q-carousel--arrows-vertical .q-carousel--padding,.q-carousel--arrows-vertical.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-bottom .q-carousel--padding,.q-carousel--navigation-bottom.q-carousel--with-padding .q-carousel__slide{padding-bottom:60px}.q-carousel--arrows-horizontal .q-carousel--padding,.q-carousel--arrows-horizontal.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-left .q-carousel--padding,.q-carousel--navigation-left.q-carousel--with-padding .q-carousel__slide{padding-left:60px}.q-carousel--arrows-horizontal .q-carousel--padding,.q-carousel--arrows-horizontal.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-right .q-carousel--padding,.q-carousel--navigation-right.q-carousel--with-padding .q-carousel__slide{padding-right:60px}.q-carousel.fullscreen{height:100%}.q-message-name{font-size:small}.q-message-label{margin:24px 0;text-align:center;font-size:small}.q-message-stamp{color:inherit;margin-top:4px;opacity:.6;display:none;font-size:small}.q-message-avatar{border-radius:50%;width:48px;height:48px;min-width:48px}.q-message{margin-bottom:8px}.q-message:first-child .q-message-label{margin-top:0}.q-message-avatar--received{margin-right:8px}.q-message-text--received{color:#81c784;border-radius:4px 4px 4px 0}.q-message-text--received:last-child:before{right:100%;border-right:0 solid transparent;border-left:8px solid transparent;border-bottom:8px solid currentColor}.q-message-text-content--received{color:#000}.q-message-name--sent{text-align:right}.q-message-avatar--sent{margin-left:8px}.q-message-container--sent{flex-direction:row-reverse}.q-message-text--sent{color:#e0e0e0;border-radius:4px 4px 0 4px}.q-message-text--sent:last-child:before{left:100%;border-left:0 solid transparent;border-right:8px solid transparent;border-bottom:8px solid currentColor}.q-message-text-content--sent{color:#000}.q-message-text{background:currentColor;padding:8px;line-height:1.2;word-break:break-word;position:relative}.q-message-text+.q-message-text{margin-top:3px}.q-message-text:last-child{min-height:48px}.q-message-text:last-child .q-message-stamp{display:block}.q-message-text:last-child:before{content:"";position:absolute;bottom:0;width:0;height:0}.q-checkbox{vertical-align:middle}.q-checkbox__native{width:1px;height:1px}.q-checkbox__bg,.q-checkbox__icon-container{user-select:none}.q-checkbox__bg{top:25%;left:25%;width:50%;height:50%;border:2px solid currentColor;border-radius:2px;transition:background .22s cubic-bezier(0, 0, .2, 1) 0s;-webkit-print-color-adjust:exact}.q-checkbox__icon{color:currentColor;font-size:.5em}.q-checkbox__svg{color:#fff}.q-checkbox__truthy{stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.78334;stroke-dasharray:29.78334}.q-checkbox__indet{fill:currentColor;transform-origin:50% 50%;transform:rotate(-280deg) scale(0)}.q-checkbox__inner{font-size:40px;width:1em;min-width:1em;height:1em;outline:0;border-radius:50%;color:rgba(0,0,0,.54)}.q-checkbox__inner--indet,.q-checkbox__inner--truthy{color:var(--q-primary)}.q-checkbox__inner--indet .q-checkbox__bg,.q-checkbox__inner--truthy .q-checkbox__bg{background:currentColor}.q-checkbox__inner--truthy path{stroke-dashoffset:0;transition:stroke-dashoffset .18s cubic-bezier(.4, 0, .6, 1) 0s}.q-checkbox__inner--indet .q-checkbox__indet{transform:rotate(0) scale(1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}.q-checkbox.disabled{opacity:.75!important}.q-checkbox--dark .q-checkbox__inner{color:rgba(255,255,255,.7)}.q-checkbox--dark .q-checkbox__inner:before{opacity:.32!important}.q-checkbox--dark .q-checkbox__inner--indet,.q-checkbox--dark .q-checkbox__inner--truthy{color:var(--q-primary)}.q-checkbox--dense .q-checkbox__inner{width:.5em;min-width:.5em;height:.5em}.q-checkbox--dense .q-checkbox__bg{left:5%;top:5%;width:90%;height:90%}.q-checkbox--dense .q-checkbox__label{padding-left:.5em}.q-checkbox--dense.reverse .q-checkbox__label{padding-left:0;padding-right:.5em}body.desktop .q-checkbox:not(.disabled) .q-checkbox__inner:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1)}body.desktop .q-checkbox:not(.disabled):focus .q-checkbox__inner:before,body.desktop .q-checkbox:not(.disabled):hover .q-checkbox__inner:before{transform:scale3d(1,1,1)}body.desktop .q-checkbox--dense:not(.disabled):focus .q-checkbox__inner:before,body.desktop .q-checkbox--dense:not(.disabled):hover .q-checkbox__inner:before{transform:scale3d(1.4,1.4,1)}.q-chip{vertical-align:middle;border-radius:16px;outline:0;position:relative;height:2em;max-width:100%;margin:4px;background:#e0e0e0;color:rgba(0,0,0,.87);font-size:14px;padding:.5em .9em}.q-chip--colored .q-chip__icon,.q-chip--dark .q-chip__icon{color:inherit}.q-chip .q-avatar{font-size:2em;margin-left:-.45em;margin-right:.2em;border-radius:16px}.q-chip--outline{background:0 0!important;border:1px solid currentColor}.q-chip--outline .q-avatar{margin-left:calc(-.45em - 1px)}.q-chip--selected .q-avatar{display:none}.q-chip__icon{color:rgba(0,0,0,.54);font-size:1.5em;margin:-.2em}.q-chip__icon--left{margin-right:.2em}.q-chip__icon--right{margin-left:.2em}.q-chip__icon--remove{margin-left:.1em;margin-right:-.5em;opacity:.6;outline:0}.q-chip__icon--remove:focus,.q-chip__icon--remove:hover{opacity:1}.q-chip__content{white-space:nowrap}.q-chip--dense{border-radius:12px;padding:0 .4em;height:1.5em}.q-chip--dense .q-avatar{font-size:1.5em;margin-left:-.27em;margin-right:.1em;border-radius:12px}.q-chip--dense .q-chip__icon{font-size:1.25em}.q-chip--dense .q-chip__icon--left{margin-right:.195em}.q-chip--dense .q-chip__icon--remove{margin-right:-.25em}.q-chip--square{border-radius:4px}.q-chip--square .q-avatar{border-radius:3px 0 0 3px}body.desktop .q-chip--clickable:focus{box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12)}body.desktop.body--dark .q-chip--clickable:focus{box-shadow:0 1px 3px rgba(255,255,255,.2),0 1px 1px rgba(255,255,255,.14),0 2px 1px -1px rgba(255,255,255,.12)}.q-circular-progress{display:inline-block;position:relative;vertical-align:middle;width:1em;height:1em;line-height:1}.q-circular-progress.q-focusable{border-radius:50%}.q-circular-progress__svg{width:100%;height:100%}.q-circular-progress__text{font-size:.25em}.q-circular-progress--indeterminate .q-circular-progress__svg{transform-origin:50% 50%;animation:q-spin 2s linear infinite}.q-circular-progress--indeterminate .q-circular-progress__circle{stroke-dasharray:1 400;stroke-dashoffset:0;animation:q-circular-progress-circle 1.5s ease-in-out infinite}@keyframes q-circular-progress-circle{0%{stroke-dasharray:1,400;stroke-dashoffset:0}50%{stroke-dasharray:400,400;stroke-dashoffset:-100}100%{stroke-dasharray:400,400;stroke-dashoffset:-300}}.q-color-picker{overflow:hidden;background:#fff;max-width:350px;vertical-align:top;min-width:180px;border-radius:4px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-color-picker .q-tab{padding:0!important}.q-color-picker--bordered{border:1px solid rgba(0,0,0,.12)}.q-color-picker__header-tabs{height:32px}.q-color-picker__header-banner{height:36px}.q-color-picker__header input{line-height:24px;border:0}.q-color-picker__header .q-tab{min-height:32px!important;height:32px!important}.q-color-picker__header .q-tab--inactive{background:linear-gradient(to top,rgba(0,0,0,.3) 0,rgba(0,0,0,.15) 25%,rgba(0,0,0,.1))}.q-color-picker__error-icon{bottom:2px;right:2px;font-size:24px;opacity:0;transition:opacity .3s ease-in}.q-color-picker__header-content{position:relative;background:#fff}.q-color-picker__header-content--light{color:#000}.q-color-picker__header-content--dark{color:#fff}.q-color-picker__header-content--dark .q-tab--inactive:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(255,255,255,.2)}.q-color-picker__header-banner{height:36px}.q-color-picker__header-bg{background:#fff;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAH0lEQVQoU2NkYGAwZkAFZ5G5jPRRgOYEVDeB3EBjBQBOZwTVugIGyAAAAABJRU5ErkJggg==")!important}.q-color-picker__footer{height:36px}.q-color-picker__footer .q-tab{min-height:36px!important;height:36px!important}.q-color-picker__footer .q-tab--inactive{background:linear-gradient(to bottom,rgba(0,0,0,.3) 0,rgba(0,0,0,.15) 25%,rgba(0,0,0,.1))}.q-color-picker__spectrum{width:100%;height:100%}.q-color-picker__spectrum-tab{padding:0!important}.q-color-picker__spectrum-white{background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.q-color-picker__spectrum-black{background:linear-gradient(to top,#000,rgba(0,0,0,0))}.q-color-picker__spectrum-circle{width:10px;height:10px;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;transform:translate(-5px,-5px)}.q-color-picker__hue .q-slider__track{background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)!important;opacity:1}.q-color-picker__alpha .q-slider__track-container{padding-top:0}.q-color-picker__alpha .q-slider__track:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;background:linear-gradient(90deg,rgba(255,255,255,0),#757575)}.q-color-picker__sliders{padding:0 16px}.q-color-picker__sliders .q-slider__thumb{color:#424242}.q-color-picker__sliders .q-slider__thumb path{stroke-width:2px;fill:transparent}.q-color-picker__sliders .q-slider--active path{stroke-width:3px}.q-color-picker__tune-tab .q-slider{margin-left:18px;margin-right:18px}.q-color-picker__tune-tab input{font-size:11px;border:1px solid #e0e0e0;border-radius:4px;width:3.5em}.q-color-picker__palette-tab{padding:0!important}.q-color-picker__palette-rows--editable .q-color-picker__cube{cursor:pointer}.q-color-picker__cube{padding-bottom:10%;width:10%!important}.q-color-picker input{color:inherit;background:0 0;outline:0;text-align:center}.q-color-picker .q-tabs{overflow:hidden}.q-color-picker .q-tab--active{box-shadow:0 0 14px 3px rgba(0,0,0,.2)}.q-color-picker .q-tab--active .q-focus-helper{display:none}.q-color-picker .q-tab__indicator{display:none}.q-color-picker .q-tab-panels{background:inherit}.q-color-picker--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-color-picker--dark .q-color-picker__tune-tab input{border:1px solid rgba(255,255,255,.3)}.q-color-picker--dark .q-slider__thumb{color:#fafafa}.q-date{display:inline-flex;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff;width:290px;min-width:290px;max-width:100%}.q-date--bordered{border:1px solid rgba(0,0,0,.12)}.q-date__header{border-top-left-radius:inherit;color:#fff;background-color:var(--q-primary);padding:16px}.q-date__actions{padding:0 16px 16px}.q-date__content,.q-date__main{outline:0}.q-date__content .q-btn{font-weight:400}.q-date__header-link{opacity:.64;outline:0;transition:opacity .3s ease-out}.q-date__header-link--active,.q-date__header-link:focus,.q-date__header-link:hover{opacity:1}.q-date__header-subtitle{font-size:14px;line-height:1.75;letter-spacing:.00938em}.q-date__header-title-label{font-size:24px;line-height:1.2;letter-spacing:.00735em}.q-date__view{height:100%;width:100%;min-height:290px;padding:16px}.q-date__navigation{height:12.5%}.q-date__navigation>div:first-child{width:8%;min-width:24px;justify-content:flex-end}.q-date__navigation>div:last-child{width:8%;min-width:24px;justify-content:flex-start}.q-date__calendar-weekdays{height:12.5%}.q-date__calendar-weekdays>div{opacity:.38;font-size:12px}.q-date__calendar-item{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;width:14.285%!important;height:12.5%!important;position:relative;padding:1px}.q-date__calendar-item:after{content:"";position:absolute;pointer-events:none;top:1px;right:0;bottom:1px;left:0;border-style:dashed;border-color:transparent;border-width:1px}.q-date__calendar-item button,.q-date__calendar-item>div{width:30px;height:30px;border-radius:50%}.q-date__calendar-item>div{line-height:30px;text-align:center}.q-date__calendar-item>button{line-height:22px}.q-date__calendar-item--out{opacity:.18}.q-date__calendar-item--fill{visibility:hidden}.q-date__range-from:before,.q-date__range-to:before,.q-date__range:before{content:"";background-color:currentColor;position:absolute;top:1px;bottom:1px;left:0;right:0;opacity:.3}.q-date__range-from:nth-child(7n-6):before,.q-date__range-to:nth-child(7n-6):before,.q-date__range:nth-child(7n-6):before{border-top-left-radius:0;border-bottom-left-radius:0}.q-date__range-from:nth-child(7n):before,.q-date__range-to:nth-child(7n):before,.q-date__range:nth-child(7n):before{border-top-right-radius:0;border-bottom-right-radius:0}.q-date__range-from:before{left:50%}.q-date__range-to:before{right:50%}.q-date__edit-range:after{border-color:currentColor transparent}.q-date__edit-range:nth-child(7n-6):after{border-top-left-radius:0;border-bottom-left-radius:0}.q-date__edit-range:nth-child(7n):after{border-top-right-radius:0;border-bottom-right-radius:0}.q-date__edit-range-from-to:after,.q-date__edit-range-from:after{left:4px;border-left-color:currentColor;border-top-color:currentColor;border-bottom-color:currentColor;border-top-left-radius:28px;border-bottom-left-radius:28px}.q-date__edit-range-from-to:after,.q-date__edit-range-to:after{right:4px;border-right-color:currentColor;border-top-color:currentColor;border-bottom-color:currentColor;border-top-right-radius:28px;border-bottom-right-radius:28px}.q-date__calendar-days-container{height:75%;min-height:192px}.q-date__calendar-days>div{height:16.66%!important}.q-date__event{position:absolute;bottom:2px;left:50%;height:5px;width:8px;border-radius:5px;background-color:var(--q-secondary);transform:translate3d(-50%,0,0)}.q-date__today{box-shadow:0 0 1px 0 currentColor}.q-date__years-content{padding:0 8px}.q-date__months-item,.q-date__years-item{flex:0 0 33.3333%}.q-date--readonly .q-date__content,.q-date--readonly .q-date__header,.q-date.disabled .q-date__content,.q-date.disabled .q-date__header{pointer-events:none}.q-date--readonly .q-date__navigation{display:none}.q-date--portrait{flex-direction:column}.q-date--portrait-standard .q-date__content{height:calc(100% - 86px)}.q-date--portrait-standard .q-date__header{border-top-right-radius:inherit;height:86px}.q-date--portrait-standard .q-date__header-title{align-items:center;height:30px}.q-date--portrait-minimal .q-date__content{height:100%}.q-date--landscape{flex-direction:row;align-items:stretch;min-width:420px}.q-date--landscape>div{display:flex;flex-direction:column}.q-date--landscape .q-date__content{height:100%}.q-date--landscape-standard{min-width:420px}.q-date--landscape-standard .q-date__header{border-bottom-left-radius:inherit;min-width:110px;width:110px}.q-date--landscape-standard .q-date__header-title{flex-direction:column}.q-date--landscape-standard .q-date__header-today{margin-top:12px;margin-left:-8px}.q-date--landscape-minimal{width:310px}.q-date--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12);border-color:rgba(255,255,255,.28)}.q-dialog__title{font-size:1.25rem;font-weight:500;line-height:1.6;letter-spacing:.0125em}.q-dialog__progress{font-size:4rem}.q-dialog__inner{outline:0}.q-dialog__inner>div{pointer-events:all;overflow:auto;-webkit-overflow-scrolling:touch;will-change:scroll-position;border-radius:4px}.q-dialog__inner--square>div{border-radius:0!important}.q-dialog__inner>.q-card>.q-card__actions .q-btn--rectangle{min-width:64px}.q-dialog__inner--minimized{padding:24px}.q-dialog__inner--minimized>div{max-height:calc(100vh - 48px)}.q-dialog__inner--maximized>div{height:100%;width:100%;max-height:100vh;max-width:100vw;border-radius:0!important;top:0!important;left:0!important}.q-dialog__inner--bottom,.q-dialog__inner--top{padding-top:0!important;padding-bottom:0!important}.q-dialog__inner--left,.q-dialog__inner--right{padding-right:0!important;padding-left:0!important}.q-dialog__inner--left:not(.q-dialog__inner--animating)>div,.q-dialog__inner--top:not(.q-dialog__inner--animating)>div{border-top-left-radius:0}.q-dialog__inner--right:not(.q-dialog__inner--animating)>div,.q-dialog__inner--top:not(.q-dialog__inner--animating)>div{border-top-right-radius:0}.q-dialog__inner--bottom:not(.q-dialog__inner--animating)>div,.q-dialog__inner--left:not(.q-dialog__inner--animating)>div{border-bottom-left-radius:0}.q-dialog__inner--bottom:not(.q-dialog__inner--animating)>div,.q-dialog__inner--right:not(.q-dialog__inner--animating)>div{border-bottom-right-radius:0}.q-dialog__inner--fullwidth>div{width:100%!important;max-width:100%!important}.q-dialog__inner--fullheight>div{height:100%!important;max-height:100%!important}.q-dialog__backdrop{z-index:-1;pointer-events:all;outline:0;background:rgba(0,0,0,.4)}body.platform-android:not(.native-mobile) .q-dialog__inner--minimized>div,body.platform-ios .q-dialog__inner--minimized>div{max-height:calc(100vh - 108px)}body.q-ios-padding .q-dialog__inner{padding-top:20px!important;padding-top:env(safe-area-inset-top)!important;padding-bottom:env(safe-area-inset-bottom)!important}body.q-ios-padding .q-dialog__inner>div{max-height:calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom))!important}@media (max-width:599.98px){.q-dialog__inner--bottom,.q-dialog__inner--top{padding-left:0;padding-right:0}.q-dialog__inner--bottom>div,.q-dialog__inner--top>div{width:100%!important}}@media (min-width:600px){.q-dialog__inner--minimized>div{max-width:560px}}.q-body--dialog{overflow:hidden}.q-editor{border:1px solid rgba(0,0,0,.12);border-radius:4px;background-color:#fff}.q-editor.disabled{border-style:dashed}.q-editor>div:first-child,.q-editor__toolbars-container,.q-editor__toolbars-container>div:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-editor__content{outline:0;padding:10px;min-height:10em;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;overflow:auto;max-width:100%}.q-editor__content pre{white-space:pre-wrap}.q-editor__content hr{border:0;outline:0;margin:1px;height:1px;background:rgba(0,0,0,.12)}.q-editor__content:empty:not(:focus):before{content:attr(placeholder);opacity:.7}.q-editor__toolbar{border-bottom:1px solid rgba(0,0,0,.12);min-height:32px}.q-editor__toolbars-container{max-width:100%}.q-editor .q-btn{margin:4px}.q-editor__toolbar-group{position:relative;margin:0 4px}.q-editor__toolbar-group+.q-editor__toolbar-group:before{content:"";position:absolute;left:-4px;top:4px;bottom:4px;width:1px;background:rgba(0,0,0,.12)}.q-editor__link-input{color:inherit;text-decoration:none;text-transform:none;border:none;border-radius:0;background:0 0;outline:0}.q-editor--flat,.q-editor--flat .q-editor__toolbar{border:0}.q-editor--dense .q-editor__toolbar-group{display:flex;align-items:center;flex-wrap:nowrap}.q-editor--dark{border-color:rgba(255,255,255,.28)}.q-editor--dark .q-editor__content hr{background:rgba(255,255,255,.28)}.q-editor--dark .q-editor__toolbar{border-color:rgba(255,255,255,.28)}.q-editor--dark .q-editor__toolbar-group+.q-editor__toolbar-group:before{background:rgba(255,255,255,.28)}.q-expansion-item__border{opacity:0}.q-expansion-item__toggle-icon{position:relative;transition:transform .3s}.q-expansion-item__toggle-icon--rotated{transform:rotate(180deg)}.q-expansion-item__toggle-focus{width:1em!important;height:1em!important;position:relative!important}.q-expansion-item__toggle-focus+.q-expansion-item__toggle-icon{margin-top:-1em}.q-expansion-item--standard.q-expansion-item--expanded>div>.q-expansion-item__border{opacity:1}.q-expansion-item--popup{transition:padding .5s}.q-expansion-item--popup>.q-expansion-item__container{border:1px solid rgba(0,0,0,.12)}.q-expansion-item--popup>.q-expansion-item__container>.q-separator{display:none}.q-expansion-item--popup.q-expansion-item--collapsed{padding:0 15px}.q-expansion-item--popup.q-expansion-item--expanded{padding:15px 0}.q-expansion-item--popup.q-expansion-item--expanded+.q-expansion-item--popup.q-expansion-item--expanded{padding-top:0}.q-expansion-item--popup.q-expansion-item--collapsed:not(:first-child)>.q-expansion-item__container{border-top-width:0}.q-expansion-item--popup.q-expansion-item--expanded+.q-expansion-item--popup.q-expansion-item--collapsed>.q-expansion-item__container{border-top-width:1px}.q-expansion-item__content>.q-card{box-shadow:none;border-radius:0}.q-expansion-item:first-child>div>.q-expansion-item__border--top{opacity:0}.q-expansion-item:last-child>div>.q-expansion-item__border--bottom{opacity:0}.q-expansion-item--expanded+.q-expansion-item--expanded>div>.q-expansion-item__border--top{opacity:0}.q-expansion-item--expanded .q-textarea--autogrow textarea{animation:q-expansion-done 0s}@keyframes q-expansion-done{0%{--q-exp-done:1}}.z-fab{z-index:990}.q-fab{position:relative;vertical-align:middle}.q-fab>.q-btn{width:100%}.q-fab--form-rounded{border-radius:28px}.q-fab--form-square{border-radius:4px}.q-fab__active-icon,.q-fab__icon{transition:opacity .4s,transform .4s}.q-fab__icon{opacity:1;transform:rotate(0)}.q-fab__active-icon{opacity:0;transform:rotate(-180deg)}.q-fab__label--external{position:absolute;padding:0 8px;transition:opacity .18s cubic-bezier(.65, .815, .735, .395)}.q-fab__label--external-hidden{opacity:0;pointer-events:none}.q-fab__label--external-left{top:50%;left:-12px;transform:translate(-100%,-50%)}.q-fab__label--external-right{top:50%;right:-12px;transform:translate(100%,-50%)}.q-fab__label--external-bottom{bottom:-12px;left:50%;transform:translate(-50%,100%)}.q-fab__label--external-top{top:-12px;left:50%;transform:translate(-50%,-100%)}.q-fab__label--internal{padding:0;transition:font-size .12s cubic-bezier(.65, .815, .735, .395),max-height .12s cubic-bezier(.65, .815, .735, .395),opacity 70ms cubic-bezier(.65, .815, .735, .395);max-height:30px}.q-fab__label--internal-hidden{font-size:0;opacity:0}.q-fab__label--internal-top{padding-bottom:.12em}.q-fab__label--internal-bottom{padding-top:.12em}.q-fab__label--internal-bottom.q-fab__label--internal-hidden,.q-fab__label--internal-top.q-fab__label--internal-hidden{max-height:0}.q-fab__label--internal-left{padding-left:.285em;padding-right:.571em}.q-fab__label--internal-right{padding-right:.285em;padding-left:.571em}.q-fab__icon-holder{min-width:24px;min-height:24px;position:relative}.q-fab__icon-holder--opened .q-fab__icon{transform:rotate(180deg);opacity:0}.q-fab__icon-holder--opened .q-fab__active-icon{transform:rotate(0);opacity:1}.q-fab__actions{position:absolute;opacity:0;transition:transform .18s ease-in,opacity .18s ease-in;pointer-events:none;align-items:center;justify-content:center;align-self:center;padding:3px}.q-fab__actions .q-btn{margin:5px}.q-fab__actions--right{transform-origin:0 50%;transform:scale(.4) translateX(-62px);height:56px;left:100%;margin-left:9px}.q-fab__actions--left{transform-origin:100% 50%;transform:scale(.4) translateX(62px);height:56px;right:100%;margin-right:9px;flex-direction:row-reverse}.q-fab__actions--up{transform-origin:50% 100%;transform:scale(.4) translateY(62px);width:56px;bottom:100%;margin-bottom:9px;flex-direction:column-reverse}.q-fab__actions--down{transform-origin:50% 0;transform:scale(.4) translateY(-62px);width:56px;top:100%;margin-top:9px;flex-direction:column}.q-fab__actions--down,.q-fab__actions--up{left:50%;margin-left:-28px}.q-fab__actions--opened{opacity:1;transform:scale(1) translate(.1px,0);pointer-events:all}.q-fab--align-left>.q-fab__actions--down,.q-fab--align-left>.q-fab__actions--up{align-items:flex-start;left:28px}.q-fab--align-right>.q-fab__actions--down,.q-fab--align-right>.q-fab__actions--up{align-items:flex-end;left:auto;right:0}.q-field{font-size:14px}.q-field ::-ms-clear,.q-field ::-ms-reveal{display:none}.q-field--with-bottom{padding-bottom:20px}.q-field__marginal{height:56px;color:rgba(0,0,0,.54);font-size:24px}.q-field__marginal>*+*{margin-left:2px}.q-field__marginal .q-avatar{font-size:32px}.q-field__before,.q-field__prepend{padding-right:12px}.q-field__after,.q-field__append{padding-left:12px}.q-field__after:empty,.q-field__append:empty{display:none}.q-field__append+.q-field__append{padding-left:2px}.q-field__inner{text-align:left}.q-field__bottom{font-size:12px;min-height:20px;line-height:1;color:rgba(0,0,0,.54);padding:8px 12px 0;backface-visibility:hidden}.q-field__bottom--animated{transform:translateY(100%);position:absolute;left:0;right:0;bottom:0}.q-field__messages{line-height:1}.q-field__messages>div{word-break:break-word;word-wrap:break-word;overflow-wrap:break-word}.q-field__messages>div+div{margin-top:4px}.q-field__counter{padding-left:8px;line-height:1}.q-field--item-aligned{padding:8px 16px}.q-field--item-aligned .q-field__before{min-width:56px}.q-field__control-container{height:inherit}.q-field__control{color:var(--q-primary);height:56px;max-width:100%;outline:0}.q-field__control:after,.q-field__control:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.q-field__control:before{border-radius:inherit}.q-field__shadow{top:8px;opacity:0;overflow:hidden;white-space:pre-wrap;transition:opacity .36s cubic-bezier(.4, 0, .2, 1)}.q-field__shadow+.q-field__native::placeholder{transition:opacity .36s cubic-bezier(.4, 0, .2, 1)}.q-field__shadow+.q-field__native:focus::placeholder{opacity:0}.q-field__input,.q-field__native,.q-field__prefix,.q-field__suffix{font-weight:400;line-height:28px;letter-spacing:.00937em;text-decoration:inherit;text-transform:inherit;border:none;border-radius:0;background:0 0;color:rgba(0,0,0,.87);outline:0;padding:6px 0}.q-field__input,.q-field__native{width:100%;min-width:0;outline:0!important;user-select:auto}.q-field__input:-webkit-autofill,.q-field__native:-webkit-autofill{-webkit-animation-name:q-autofill;-webkit-animation-fill-mode:both}.q-field__input:invalid,.q-field__native:invalid{box-shadow:none}.q-field__native[type=file]{line-height:1em}.q-field__input{padding:0;height:0;min-height:24px;line-height:24px}.q-field__prefix,.q-field__suffix{transition:opacity .36s cubic-bezier(.4, 0, .2, 1);white-space:nowrap}.q-field__prefix{padding-right:4px}.q-field__suffix{padding-left:4px}.q-field--disabled .q-placeholder,.q-field--readonly .q-placeholder{opacity:1!important}.q-field--readonly.q-field--labeled .q-field__input,.q-field--readonly.q-field--labeled .q-field__native{cursor:default}.q-field--readonly.q-field--float .q-field__input,.q-field--readonly.q-field--float .q-field__native{cursor:text}.q-field--disabled .q-field__inner{cursor:not-allowed}.q-field--disabled .q-field__control{pointer-events:none}.q-field--disabled .q-field__control>div{opacity:.6!important}.q-field--disabled .q-field__control>div,.q-field--disabled .q-field__control>div *{outline:0!important}.q-field__label{left:0;top:18px;max-width:100%;color:rgba(0,0,0,.6);font-size:16px;line-height:1.25;font-weight:400;letter-spacing:.00937em;text-decoration:inherit;text-transform:inherit;transform-origin:left top;transition:transform .36s cubic-bezier(.4, 0, .2, 1),max-width 324ms cubic-bezier(.4, 0, .2, 1);backface-visibility:hidden}.q-field__label:has(+ :is(.q-field__native,.q-field__input):is(:-webkit-autofill,[type=color],[type=date],[type=datetime-local],[type=month],[type=time],[type=week])){transform:translateY(-40%) scale(.75)}.q-field--float .q-field__label{max-width:133%;transform:translateY(-40%) scale(.75);transition:transform .36s cubic-bezier(.4, 0, .2, 1),max-width 396ms cubic-bezier(.4, 0, .2, 1)}.q-field--highlighted .q-field__label{color:currentColor}.q-field--highlighted .q-field__shadow{opacity:.5}.q-field--filled .q-field__control{padding:0 12px;background:rgba(0,0,0,.05);border-radius:4px 4px 0 0}.q-field--filled .q-field__control:before{background:rgba(0,0,0,.05);border-bottom:1px solid rgba(0,0,0,.42);opacity:0;transition:opacity .36s cubic-bezier(.4, 0, .2, 1),background .36s cubic-bezier(.4, 0, .2, 1)}.q-field--filled .q-field__control:hover:before{opacity:1}.q-field--filled .q-field__control:after{height:2px;top:auto;transform-origin:center bottom;transform:scale3d(0,1,1);background:currentColor;transition:transform .36s cubic-bezier(.4, 0, .2, 1)}.q-field--filled.q-field--rounded .q-field__control{border-radius:28px 28px 0 0}.q-field--filled.q-field--highlighted .q-field__control:before{opacity:1;background:rgba(0,0,0,.12)}.q-field--filled.q-field--highlighted .q-field__control:after{transform:scale3d(1,1,1)}.q-field--filled.q-field--dark .q-field__control,.q-field--filled.q-field--dark .q-field__control:before{background:rgba(255,255,255,.07)}.q-field--filled.q-field--dark.q-field--highlighted .q-field__control:before{background:rgba(255,255,255,.1)}.q-field--filled.q-field--readonly .q-field__control:before{opacity:1;background:0 0;border-bottom-style:dashed}.q-field--outlined .q-field__control{border-radius:4px;padding:0 12px}.q-field--outlined .q-field__control:before{border:1px solid rgba(0,0,0,.24);transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--outlined .q-field__control:hover:before{border-color:#000}.q-field--outlined .q-field__control:after{height:inherit;border-radius:inherit;border:2px solid transparent;transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--outlined .q-field__input:-webkit-autofill,.q-field--outlined .q-field__native:-webkit-autofill{margin-top:1px;margin-bottom:1px}.q-field--outlined.q-field--rounded .q-field__control{border-radius:28px}.q-field--outlined.q-field--highlighted .q-field__control:hover:before{border-color:transparent}.q-field--outlined.q-field--highlighted .q-field__control:after{border-color:currentColor;border-width:2px;transform:scale3d(1,1,1)}.q-field--outlined.q-field--readonly .q-field__control:before{border-style:dashed}.q-field--standard .q-field__control:before{border-bottom:1px solid rgba(0,0,0,.24);transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standard .q-field__control:hover:before{border-color:#000}.q-field--standard .q-field__control:after{height:2px;top:auto;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;transform-origin:center bottom;transform:scale3d(0,1,1);background:currentColor;transition:transform .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standard.q-field--highlighted .q-field__control:after{transform:scale3d(1,1,1)}.q-field--standard.q-field--readonly .q-field__control:before{border-bottom-style:dashed}.q-field--dark .q-field__control:before{border-color:rgba(255,255,255,.6)}.q-field--dark .q-field__control:hover:before{border-color:#fff}.q-field--dark .q-field__input,.q-field--dark .q-field__native,.q-field--dark .q-field__prefix,.q-field--dark .q-field__suffix{color:#fff}.q-field--dark .q-field__bottom,.q-field--dark .q-field__marginal,.q-field--dark:not(.q-field--highlighted) .q-field__label{color:rgba(255,255,255,.7)}.q-field--standout .q-field__control{padding:0 12px;background:rgba(0,0,0,.05);border-radius:4px;transition:box-shadow .36s cubic-bezier(.4, 0, .2, 1),background-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standout .q-field__control:before{background:rgba(0,0,0,.07);opacity:0;transition:opacity .36s cubic-bezier(.4, 0, .2, 1),background .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standout .q-field__control:hover:before{opacity:1}.q-field--standout.q-field--rounded .q-field__control{border-radius:28px}.q-field--standout.q-field--highlighted .q-field__control{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);background:#000}.q-field--standout.q-field--highlighted .q-field__append,.q-field--standout.q-field--highlighted .q-field__input,.q-field--standout.q-field--highlighted .q-field__native,.q-field--standout.q-field--highlighted .q-field__prefix,.q-field--standout.q-field--highlighted .q-field__prepend,.q-field--standout.q-field--highlighted .q-field__suffix{color:#fff}.q-field--standout.q-field--readonly .q-field__control:before{opacity:1;background:0 0;border:1px dashed rgba(0,0,0,.24)}.q-field--standout.q-field--dark .q-field__control{background:rgba(255,255,255,.07)}.q-field--standout.q-field--dark .q-field__control:before{background:rgba(255,255,255,.07)}.q-field--standout.q-field--dark.q-field--highlighted .q-field__control{background:#fff}.q-field--standout.q-field--dark.q-field--highlighted .q-field__append,.q-field--standout.q-field--dark.q-field--highlighted .q-field__input,.q-field--standout.q-field--dark.q-field--highlighted .q-field__native,.q-field--standout.q-field--dark.q-field--highlighted .q-field__prefix,.q-field--standout.q-field--dark.q-field--highlighted .q-field__prepend,.q-field--standout.q-field--dark.q-field--highlighted .q-field__suffix{color:#000}.q-field--standout.q-field--dark.q-field--readonly .q-field__control:before{border-color:rgba(255,255,255,.24)}.q-field--labeled .q-field__native,.q-field--labeled .q-field__prefix,.q-field--labeled .q-field__suffix{line-height:24px;padding-top:24px;padding-bottom:8px}.q-field--labeled .q-field__shadow{top:0}.q-field--labeled:not(.q-field--float) .q-field__prefix,.q-field--labeled:not(.q-field--float) .q-field__suffix{opacity:0}.q-field--labeled:not(.q-field--float) .q-field__input::placeholder,.q-field--labeled:not(.q-field--float) .q-field__native::placeholder{color:transparent}.q-field--labeled.q-field--dense .q-field__native,.q-field--labeled.q-field--dense .q-field__prefix,.q-field--labeled.q-field--dense .q-field__suffix{padding-top:14px;padding-bottom:2px}.q-field--dense .q-field--with-bottom{padding-bottom:19px}.q-field--dense .q-field__shadow{top:0}.q-field--dense .q-field__control,.q-field--dense .q-field__marginal{height:40px}.q-field--dense .q-field__bottom{font-size:11px}.q-field--dense .q-field__label{font-size:14px;top:10px}.q-field--dense .q-field__before,.q-field--dense .q-field__prepend{padding-right:6px}.q-field--dense .q-field__after,.q-field--dense .q-field__append{padding-left:6px}.q-field--dense .q-field__append+.q-field__append{padding-left:2px}.q-field--dense .q-field__marginal .q-avatar{font-size:24px}.q-field--dense.q-field--float .q-field__label{transform:translateY(-30%) scale(.75)}.q-field--dense .q-field__label:has(+ :is(.q-field__native,.q-field__input):is(:-webkit-autofill,[type=color],[type=date],[type=datetime-local],[type=month],[type=time],[type=week])){transform:translateY(-30%) scale(.75)}.q-field--borderless .q-field__bottom,.q-field--borderless.q-field--dense .q-field__control,.q-field--standard .q-field__bottom,.q-field--standard.q-field--dense .q-field__control{padding-left:0;padding-right:0}.q-field--error .q-field__label{animation:q-field-label .36s}.q-field--error .q-field__bottom{color:var(--q-negative)}.q-field__focusable-action{opacity:.6;cursor:pointer;outline:0!important;border:0;color:inherit;background:0 0;padding:0}.q-field__focusable-action:focus,.q-field__focusable-action:hover{opacity:1}.q-field--auto-height .q-field__control{height:auto}.q-field--auto-height .q-field__control,.q-field--auto-height .q-field__native{min-height:56px}.q-field--auto-height .q-field__native{align-items:center}.q-field--auto-height .q-field__control-container{padding-top:0}.q-field--auto-height .q-field__native,.q-field--auto-height .q-field__prefix,.q-field--auto-height .q-field__suffix{line-height:18px}.q-field--auto-height.q-field--labeled .q-field__control-container{padding-top:24px}.q-field--auto-height.q-field--labeled .q-field__shadow{top:24px}.q-field--auto-height.q-field--labeled .q-field__native,.q-field--auto-height.q-field--labeled .q-field__prefix,.q-field--auto-height.q-field--labeled .q-field__suffix{padding-top:0}.q-field--auto-height.q-field--labeled .q-field__native{min-height:24px}.q-field--auto-height.q-field--dense .q-field__control,.q-field--auto-height.q-field--dense .q-field__native{min-height:40px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__control-container{padding-top:14px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__shadow{top:14px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__native{min-height:24px}.q-field--square .q-field__control{border-radius:0!important}.q-transition--field-message-enter-active,.q-transition--field-message-leave-active{transition:transform .6s cubic-bezier(.86, 0, .07, 1),opacity .6s cubic-bezier(.86, 0, .07, 1)}.q-transition--field-message-enter-from,.q-transition--field-message-leave-to{opacity:0;transform:translateY(-10px)}.q-transition--field-message-leave-active,.q-transition--field-message-leave-from{position:absolute}@keyframes q-field-label{40%{margin-left:2px}60%,80%{margin-left:-2px}70%,90%{margin-left:2px}}@keyframes q-autofill{to{background:0 0;color:inherit}}.q-file .q-field__native{word-break:break-all;overflow:hidden}.q-file .q-field__input{opacity:0!important}.q-file .q-field__input::-webkit-file-upload-button{cursor:pointer}.q-file__filler{visibility:hidden;width:100%;border:none;padding:0}.q-file__dnd{outline:1px dashed currentColor;outline-offset:-4px}.q-form{position:relative}.q-img{position:relative;width:100%;display:inline-block;vertical-align:middle;overflow:hidden}.q-img__loading .q-spinner{font-size:50px}.q-img__container{border-radius:inherit;font-size:0}.q-img__image{border-radius:inherit;width:100%;height:100%;opacity:0}.q-img__image--with-transition{transition:opacity .28s ease-in}.q-img__image--loaded{opacity:1}.q-img__content{border-radius:inherit;pointer-events:none}.q-img__content>div{pointer-events:all;position:absolute;padding:16px;color:#fff;background:rgba(0,0,0,.47)}.q-img--no-menu .q-img__image,.q-img--no-menu .q-img__placeholder{pointer-events:none}.q-inner-loading{background:rgba(255,255,255,.6);border-radius:inherit}.q-inner-loading--dark{background:rgba(0,0,0,.4)}.q-inner-loading__label{margin-top:8px}.q-textarea .q-field__control{min-height:56px;height:auto}.q-textarea .q-field__control-container{padding-top:2px;padding-bottom:2px}.q-textarea .q-field__shadow{top:2px;bottom:2px}.q-textarea .q-field__native,.q-textarea .q-field__prefix,.q-textarea .q-field__suffix{line-height:18px}.q-textarea .q-field__native{resize:vertical;padding-top:17px;min-height:52px}.q-textarea.q-field--labeled .q-field__control-container{padding-top:26px}.q-textarea.q-field--labeled .q-field__shadow{top:26px}.q-textarea.q-field--labeled .q-field__native,.q-textarea.q-field--labeled .q-field__prefix,.q-textarea.q-field--labeled .q-field__suffix{padding-top:0}.q-textarea.q-field--labeled .q-field__native{min-height:26px;padding-top:1px}.q-textarea--autogrow .q-field__native{resize:none}.q-textarea.q-field--dense .q-field__control,.q-textarea.q-field--dense .q-field__native{min-height:36px}.q-textarea.q-field--dense .q-field__native{padding-top:9px}.q-textarea.q-field--dense.q-field--labeled .q-field__control-container{padding-top:14px}.q-textarea.q-field--dense.q-field--labeled .q-field__shadow{top:14px}.q-textarea.q-field--dense.q-field--labeled .q-field__native{min-height:24px;padding-top:3px}.q-textarea.q-field--dense.q-field--labeled .q-field__prefix,.q-textarea.q-field--dense.q-field--labeled .q-field__suffix{padding-top:2px}.q-textarea.disabled .q-field__native,body.mobile .q-textarea .q-field__native{resize:none}.q-intersection{position:relative}.q-item{min-height:48px;padding:8px 16px;color:inherit;transition:color .3s,background-color .3s}.q-item__section--side{color:#757575;align-items:flex-start;padding-right:16px;width:auto;min-width:0;max-width:100%}.q-item__section--side>.q-icon{font-size:24px}.q-item__section--side>.q-avatar{font-size:40px}.q-item__section--avatar{color:inherit;min-width:56px}.q-item__section--thumbnail img{width:100px;height:56px}.q-item__section--nowrap{white-space:nowrap}.q-item>.q-focus-helper+.q-item__section--thumbnail,.q-item>.q-item__section--thumbnail:first-child{margin-left:-16px}.q-item>.q-item__section--thumbnail:last-of-type{margin-right:-16px}.q-item__label{line-height:1.2em!important;max-width:100%}.q-item__label--overline{color:rgba(0,0,0,.7)}.q-item__label--caption{color:rgba(0,0,0,.54)}.q-item__label--header{color:#757575;padding:16px;font-size:.875rem;line-height:1.25rem;letter-spacing:.01786em}.q-list--padding .q-item__label--header,.q-separator--spaced+.q-item__label--header{padding-top:8px}.q-item__label+.q-item__label{margin-top:4px}.q-item__section--main{width:auto;min-width:0;max-width:100%;flex:10000 1 0%}.q-item__section--main+.q-item__section--main{margin-left:8px}.q-item__section--main~.q-item__section--side{align-items:flex-end;padding-right:0;padding-left:16px}.q-item__section--main.q-item__section--thumbnail{margin-left:0;margin-right:-16px}.q-list--bordered{border:1px solid rgba(0,0,0,.12)}.q-list--separator>.q-item-type+.q-item-type,.q-list--separator>.q-virtual-scroll__content>.q-item-type+.q-item-type{border-top:1px solid rgba(0,0,0,.12)}.q-list--padding{padding:8px 0}.q-item--dense,.q-list--dense>.q-item{min-height:32px;padding:2px 16px}.q-list--dark.q-list--separator>.q-item-type+.q-item-type,.q-list--dark.q-list--separator>.q-virtual-scroll__content>.q-item-type+.q-item-type{border-top-color:rgba(255,255,255,.28)}.q-item--dark,.q-list--dark{color:#fff;border-color:rgba(255,255,255,.28)}.q-item--dark .q-item__section--side:not(.q-item__section--avatar),.q-list--dark .q-item__section--side:not(.q-item__section--avatar){color:rgba(255,255,255,.7)}.q-item--dark .q-item__label--header,.q-list--dark .q-item__label--header{color:rgba(255,255,255,.64)}.q-item--dark .q-item__label--caption,.q-item--dark .q-item__label--overline,.q-list--dark .q-item__label--caption,.q-list--dark .q-item__label--overline{color:rgba(255,255,255,.8)}.q-item{position:relative}.q-item--active,.q-item.q-router-link--active{color:var(--q-primary)}.q-knob{font-size:48px}.q-knob--editable{cursor:pointer;outline:0}.q-knob--editable:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;box-shadow:none;transition:box-shadow .24s ease-in-out}.q-knob--editable:focus:before{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}body.body--dark .q-knob--editable:focus:before{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-layout{width:100%;outline:0}.q-layout-container{position:relative;width:100%;height:100%}.q-layout-container .q-layout{min-height:100%}.q-layout-container>div{transform:translate3d(0,0,0)}.q-layout-container>div>div{min-height:0;max-height:100%}.q-layout__shadow{width:100%}.q-layout__shadow:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 0 10px 2px rgba(0,0,0,.2),0 0 10px rgba(0,0,0,.24)}.q-layout__section--marginal{background-color:var(--q-primary);color:#fff}.q-header--hidden{transform:translateY(-110%)}.q-header--bordered{border-bottom:1px solid rgba(0,0,0,.12)}.q-header .q-layout__shadow{bottom:-10px}.q-header .q-layout__shadow:after{bottom:10px}.q-footer--hidden{transform:translateY(110%)}.q-footer--bordered{border-top:1px solid rgba(0,0,0,.12)}.q-footer .q-layout__shadow{top:-10px}.q-footer .q-layout__shadow:after{top:10px}.q-footer,.q-header{z-index:2000}.q-drawer{position:absolute;top:0;bottom:0;background:#fff;z-index:1000}.q-drawer--on-top{z-index:3000}.q-drawer--left{left:0;transform:translateX(-100%)}.q-drawer--left.q-drawer--bordered{border-right:1px solid rgba(0,0,0,.12)}.q-drawer--left .q-layout__shadow{left:10px;right:-10px}.q-drawer--left .q-layout__shadow:after{right:10px}.q-drawer--right{right:0;transform:translateX(100%)}.q-drawer--right.q-drawer--bordered{border-left:1px solid rgba(0,0,0,.12)}.q-drawer--right .q-layout__shadow{left:-10px}.q-drawer--right .q-layout__shadow:after{left:10px}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini{padding:0!important}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section{text-align:center;justify-content:center;padding-left:0;padding-right:0;min-width:0}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__label,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section--main,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section--side~.q-item__section--side{display:none}.q-drawer--mini .q-expansion-item__content,.q-drawer--mini .q-mini-drawer-hide{display:none}.q-drawer--mini-animate .q-drawer__content{overflow-x:hidden!important;white-space:nowrap}.q-drawer--standard .q-mini-drawer-only{display:none}.q-drawer--mobile .q-mini-drawer-hide,.q-drawer--mobile .q-mini-drawer-only{display:none}.q-drawer__backdrop{z-index:2999!important;will-change:background-color}.q-drawer__opener{z-index:2001;height:100%;width:15px;user-select:none}.q-footer,.q-header,.q-layout,.q-page{position:relative}.q-page-sticky--shrink{pointer-events:none}.q-page-sticky--shrink>div{display:inline-block;pointer-events:auto}body.q-ios-padding .q-layout--standard .q-drawer--top-padding .q-drawer__content,body.q-ios-padding .q-layout--standard .q-header>.q-tabs:first-child .q-tabs__content,body.q-ios-padding .q-layout--standard .q-header>.q-toolbar:first-child{padding-top:20px;min-height:70px;padding-top:env(safe-area-inset-top);min-height:calc(env(safe-area-inset-top) + 50px)}body.q-ios-padding .q-layout--standard .q-drawer--top-padding .q-drawer__content,body.q-ios-padding .q-layout--standard .q-footer>.q-tabs:nth-last-child(1of:not(.q-layout__shadow)) .q-tabs__content,body.q-ios-padding .q-layout--standard .q-footer>.q-toolbar:last-child{padding-bottom:env(safe-area-inset-bottom);min-height:calc(env(safe-area-inset-bottom) + 50px)}.q-body--layout-animate .q-drawer__backdrop{transition:background-color .12s!important}.q-body--layout-animate .q-drawer{transition:transform .12s,width .12s,top .12s,bottom .12s!important}.q-body--layout-animate .q-layout__section--marginal{transition:transform .12s,left .12s,right .12s!important}.q-body--layout-animate .q-page-container{transition:padding-top .12s,padding-right .12s,padding-bottom .12s,padding-left .12s!important}.q-body--layout-animate .q-page-sticky{transition:transform .12s,left .12s,right .12s,top .12s,bottom .12s!important}body:not(.q-body--layout-animate) .q-layout--prevent-focus{visibility:hidden}.q-body--drawer-toggle{overflow-x:hidden!important}@media (max-width:599.98px){.q-layout-padding{padding:8px}}@media (min-width:600px) and (max-width:1439.98px){.q-layout-padding{padding:16px}}@media (min-width:1440px){.q-layout-padding{padding:24px}}body.body--dark .q-drawer,body.body--dark .q-footer,body.body--dark .q-header{border-color:rgba(255,255,255,.28)}body.body--dark .q-layout__shadow:after{box-shadow:0 0 10px 2px rgba(255,255,255,.2),0 0 10px rgba(255,255,255,.24)}body.platform-ios .q-layout--containerized{position:unset!important}.q-linear-progress{--q-linear-progress-speed:.3s;position:relative;width:100%;overflow:hidden;font-size:4px;height:1em;color:var(--q-primary);transform:scale3d(1,1,1)}.q-linear-progress__model,.q-linear-progress__track{transform-origin:0 0}.q-linear-progress__model--with-transition,.q-linear-progress__track--with-transition{transition:transform var(--q-linear-progress-speed)}.q-linear-progress--reverse .q-linear-progress__model,.q-linear-progress--reverse .q-linear-progress__track{transform-origin:0 100%}.q-linear-progress__model--determinate{background:currentColor}.q-linear-progress__model--indeterminate,.q-linear-progress__model--query{transition:none}.q-linear-progress__model--indeterminate:after,.q-linear-progress__model--indeterminate:before,.q-linear-progress__model--query:after,.q-linear-progress__model--query:before{background:currentColor;content:"";position:absolute;top:0;right:0;bottom:0;left:0;transform-origin:0 0}.q-linear-progress__model--indeterminate:before,.q-linear-progress__model--query:before{animation:q-linear-progress--indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.q-linear-progress__model--indeterminate:after,.q-linear-progress__model--query:after{transform:translate3d(-101%,0,0) scale3d(1,1,1);animation:q-linear-progress--indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation-delay:1.15s}.q-linear-progress__track{opacity:.4}.q-linear-progress__track--light{background:rgba(0,0,0,.26)}.q-linear-progress__track--dark{background:rgba(255,255,255,.6)}.q-linear-progress__stripe{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,rgba(255,255,255,0) 25%,rgba(255,255,255,0) 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,rgba(255,255,255,0) 75%,rgba(255,255,255,0))!important;background-size:40px 40px!important}.q-linear-progress__stripe--with-transition{transition:width var(--q-linear-progress-speed)}@keyframes q-linear-progress--indeterminate{0%{transform:translate3d(-35%,0,0) scale3d(.35,1,1)}60%{transform:translate3d(100%,0,0) scale3d(.9,1,1)}100%{transform:translate3d(100%,0,0) scale3d(.9,1,1)}}@keyframes q-linear-progress--indeterminate-short{0%{transform:translate3d(-101%,0,0) scale3d(1,1,1)}60%{transform:translate3d(107%,0,0) scale3d(.01,1,1)}100%{transform:translate3d(107%,0,0) scale3d(.01,1,1)}}.q-menu{position:fixed!important;display:inline-block;max-width:95vw;max-height:65vh;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);background:#fff;border-radius:4px;overflow-y:auto;overflow-x:hidden;outline:0;z-index:6000}.q-menu--square{border-radius:0}.q-menu--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-option-group--inline>div{display:inline-block}.q-pagination input{text-align:center;-moz-appearance:textfield}.q-pagination input::-webkit-inner-spin-button,.q-pagination input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.q-pagination__content{--q-pagination-gutter-parent:-2px;--q-pagination-gutter-child:2px;margin-top:var(--q-pagination-gutter-parent);margin-left:var(--q-pagination-gutter-parent)}.q-pagination__content>.q-btn,.q-pagination__content>.q-input,.q-pagination__middle>.q-btn{margin-top:var(--q-pagination-gutter-child);margin-left:var(--q-pagination-gutter-child)}.q-parallax{position:relative;width:100%;overflow:hidden;border-radius:inherit}.q-parallax__media>img,.q-parallax__media>video{position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;will-change:transform;display:none}.q-popup-edit{padding:8px 16px}.q-popup-edit__buttons{margin-top:8px}.q-popup-edit__buttons .q-btn+.q-btn{margin-left:8px}.q-pull-to-refresh{position:relative}.q-pull-to-refresh__puller{border-radius:50%;width:40px;height:40px;color:var(--q-primary);background:#fff;box-shadow:0 0 4px 0 rgba(0,0,0,.3)}.q-pull-to-refresh__puller--animating{transition:transform .3s,opacity .3s}.q-radio{vertical-align:middle}.q-radio__native{width:1px;height:1px}.q-radio__bg,.q-radio__icon-container{user-select:none}.q-radio__bg{top:25%;left:25%;width:50%;height:50%;-webkit-print-color-adjust:exact}.q-radio__bg path{fill:currentColor}.q-radio__icon{color:currentColor;font-size:.5em}.q-radio__check{transform-origin:50% 50%;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}.q-radio__inner{font-size:40px;width:1em;min-width:1em;height:1em;outline:0;border-radius:50%;color:rgba(0,0,0,.54)}.q-radio__inner--truthy{color:var(--q-primary)}.q-radio__inner--truthy .q-radio__check{transform:scale3d(1,1,1)}.q-radio.disabled{opacity:.75!important}.q-radio--dark .q-radio__inner{color:rgba(255,255,255,.7)}.q-radio--dark .q-radio__inner:before{opacity:.32!important}.q-radio--dark .q-radio__inner--truthy{color:var(--q-primary)}.q-radio--dense .q-radio__inner{width:.5em;min-width:.5em;height:.5em}.q-radio--dense .q-radio__bg{left:0;top:0;width:100%;height:100%}.q-radio--dense .q-radio__label{padding-left:.5em}.q-radio--dense.reverse .q-radio__label{padding-left:0;padding-right:.5em}body.desktop .q-radio:not(.disabled) .q-radio__inner:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}body.desktop .q-radio:not(.disabled):focus .q-radio__inner:before,body.desktop .q-radio:not(.disabled):hover .q-radio__inner:before{transform:scale3d(1,1,1)}body.desktop .q-radio--dense:not(.disabled):focus .q-radio__inner:before,body.desktop .q-radio--dense:not(.disabled):hover .q-radio__inner:before{transform:scale3d(1.5,1.5,1)}.q-rating{color:#ffeb3b;vertical-align:middle}.q-rating__icon-container{height:1em;outline:0}.q-rating__icon-container+.q-rating__icon-container{margin-left:2px}.q-rating__icon{color:currentColor;text-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24);position:relative;opacity:.4;transition:transform .2s ease-in,opacity .2s ease-in,color .2s ease-in}.q-rating__icon--hovered{transform:scale(1.3)}.q-rating__icon--active{opacity:1}.q-rating__icon--exselected{opacity:.7}.q-rating--no-dimming .q-rating__icon{opacity:1}.q-rating--editable .q-rating__icon-container{cursor:pointer}.q-responsive{position:relative;max-width:100%;max-height:100%}.q-responsive__filler{width:inherit;max-width:inherit;height:inherit;max-height:inherit}.q-responsive__content{border-radius:inherit}.q-responsive__content>*{width:100%!important;height:100%!important;max-height:100%!important;max-width:100%!important}.q-scrollarea{position:relative;contain:strict}.q-scrollarea__bar,.q-scrollarea__thumb{opacity:.2;transition:opacity .3s;will-change:opacity;cursor:grab}.q-scrollarea__bar--v,.q-scrollarea__thumb--v{right:0;width:10px}.q-scrollarea__bar--h,.q-scrollarea__thumb--h{bottom:0;height:10px}.q-scrollarea__bar--invisible,.q-scrollarea__thumb--invisible{opacity:0!important;pointer-events:none}.q-scrollarea__thumb{background:#000;border-radius:3px}.q-scrollarea__thumb:hover{opacity:.3}.q-scrollarea__thumb:active{opacity:.5}.q-scrollarea__content{min-height:100%;min-width:100%}.q-scrollarea--dark .q-scrollarea__thumb{background:#fff}.q-select--without-input .q-field__control{cursor:pointer}.q-select--with-input .q-field__control{cursor:text}.q-select .q-field__input{min-width:50px!important;cursor:text}.q-select .q-field__input--padding{padding-left:4px}.q-select__autocomplete-input,.q-select__focus-target{position:absolute;outline:0!important;width:1px;height:1px;padding:0;border:0;opacity:0}.q-select__dropdown-icon{cursor:pointer;transition:transform .28s}.q-select.q-field--readonly .q-field__control,.q-select.q-field--readonly .q-select__dropdown-icon{cursor:default}.q-select__dialog{width:90vw!important;max-width:90vw!important;max-height:calc(100vh - 70px)!important;background:#fff;display:flex;flex-direction:column}.q-select__dialog>.scroll{position:relative;background:inherit}body.mobile:not(.native-mobile) .q-select__dialog{max-height:calc(100vh - 108px)!important}body.platform-android.native-mobile .q-dialog__inner--top .q-select__dialog{max-height:calc(100vh - 24px)!important}body.platform-android:not(.native-mobile) .q-dialog__inner--top .q-select__dialog{max-height:calc(100vh - 80px)!important}body.platform-ios.native-mobile .q-dialog__inner--top>div{border-radius:4px}body.platform-ios.native-mobile .q-dialog__inner--top .q-select__dialog--focused{max-height:47vh!important}body.platform-ios:not(.native-mobile) .q-dialog__inner--top .q-select__dialog--focused{max-height:50vh!important}.q-separator{border:0;background:rgba(0,0,0,.12);margin:0;transition:background .3s,opacity .3s;flex-shrink:0}.q-separator--dark{background:rgba(255,255,255,.28)}.q-separator--horizontal{display:block;height:1px}.q-separator--horizontal-inset{margin-left:16px;margin-right:16px}.q-separator--horizontal-item-inset{margin-left:72px;margin-right:0}.q-separator--horizontal-item-thumbnail-inset{margin-left:116px;margin-right:0}.q-separator--vertical{width:1px;height:auto;align-self:stretch}.q-separator--vertical-inset{margin-top:8px;margin-bottom:8px}.q-skeleton{--q-skeleton-speed:1500ms;background:rgba(0,0,0,.12);border-radius:4px;box-sizing:border-box}.q-skeleton--anim{cursor:wait}.q-skeleton:before{content:" "}.q-skeleton--type-text{transform:scale(1,.5)}.q-skeleton--type-QAvatar,.q-skeleton--type-circle{height:48px;width:48px;border-radius:50%}.q-skeleton--type-QBtn{width:90px;height:36px}.q-skeleton--type-QBadge{width:70px;height:16px}.q-skeleton--type-QChip{width:90px;height:28px;border-radius:16px}.q-skeleton--type-QToolbar{height:50px}.q-skeleton--type-QCheckbox,.q-skeleton--type-QRadio{width:40px;height:40px;border-radius:50%}.q-skeleton--type-QToggle{width:56px;height:40px;border-radius:7px}.q-skeleton--type-QRange,.q-skeleton--type-QSlider{height:40px}.q-skeleton--type-QInput{height:56px}.q-skeleton--bordered{border:1px solid rgba(0,0,0,.05)}.q-skeleton--square{border-radius:0}.q-skeleton--anim-fade{animation:q-skeleton--fade var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--anim-pulse{animation:q-skeleton--pulse var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-pulse-x{animation:q-skeleton--pulse-x var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-pulse-y{animation:q-skeleton--pulse-y var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-blink,.q-skeleton--anim-pop,.q-skeleton--anim-wave{position:relative;overflow:hidden;z-index:1}.q-skeleton--anim-blink:after,.q-skeleton--anim-pop:after,.q-skeleton--anim-wave:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:0}.q-skeleton--anim-blink:after{background:rgba(255,255,255,.7);animation:q-skeleton--fade var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--anim-wave:after{background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.5),rgba(255,255,255,0));animation:q-skeleton--wave var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--dark{background:rgba(255,255,255,.05)}.q-skeleton--dark.q-skeleton--bordered{border:1px solid rgba(255,255,255,.25)}.q-skeleton--dark.q-skeleton--anim-wave:after{background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.1),rgba(255,255,255,0))}.q-skeleton--dark.q-skeleton--anim-blink:after{background:rgba(255,255,255,.2)}@keyframes q-skeleton--fade{0%{opacity:1}50%{opacity:.4}100%{opacity:1}}@keyframes q-skeleton--pulse{0%{transform:scale(1)}50%{transform:scale(.85)}100%{transform:scale(1)}}@keyframes q-skeleton--pulse-x{0%{transform:scaleX(1)}50%{transform:scaleX(.75)}100%{transform:scaleX(1)}}@keyframes q-skeleton--pulse-y{0%{transform:scaleY(1)}50%{transform:scaleY(.75)}100%{transform:scaleY(1)}}@keyframes q-skeleton--wave{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}.q-slide-item{position:relative;background:#fff}.q-slide-item__bottom,.q-slide-item__left,.q-slide-item__right,.q-slide-item__top{visibility:hidden;font-size:14px;color:#fff}.q-slide-item__bottom .q-icon,.q-slide-item__left .q-icon,.q-slide-item__right .q-icon,.q-slide-item__top .q-icon{font-size:1.714em}.q-slide-item__left{background:#4caf50;padding:8px 16px}.q-slide-item__left>div{transform-origin:left center}.q-slide-item__right{background:#ff9800;padding:8px 16px}.q-slide-item__right>div{transform-origin:right center}.q-slide-item__top{background:#2196f3;padding:16px 8px}.q-slide-item__top>div{transform-origin:top center}.q-slide-item__bottom{background:#9c27b0;padding:16px 8px}.q-slide-item__bottom>div{transform-origin:bottom center}.q-slide-item__content{background:inherit;transition:transform .2s ease-in;user-select:none;cursor:pointer}.q-slider{position:relative}.q-slider--h{width:100%}.q-slider--v{height:200px}.q-slider--editable .q-slider__track-container{cursor:grab}.q-slider__track-container{outline:0}.q-slider__track-container--h{width:100%;padding:12px 0}.q-slider__track-container--h .q-slider__selection{will-change:width,left}.q-slider__track-container--v{height:100%;padding:0 12px}.q-slider__track-container--v .q-slider__selection{will-change:height,top}.q-slider__track{color:var(--q-primary);background:rgba(0,0,0,.1);border-radius:4px;width:inherit;height:inherit}.q-slider__inner{background:rgba(0,0,0,.1);border-radius:inherit;width:100%;height:100%}.q-slider__selection{background:currentColor;border-radius:inherit;width:100%;height:100%}.q-slider__markers{color:rgba(0,0,0,.3);border-radius:inherit;width:100%;height:100%}.q-slider__markers:after{content:"";position:absolute;background:currentColor}.q-slider__markers--h{background-image:repeating-linear-gradient(to right,currentColor,currentColor 2px,rgba(255,255,255,0) 0,rgba(255,255,255,0))}.q-slider__markers--h:after{height:100%;width:2px;top:0;right:0}.q-slider__markers--v{background-image:repeating-linear-gradient(to bottom,currentColor,currentColor 2px,rgba(255,255,255,0) 0,rgba(255,255,255,0))}.q-slider__markers--v:after{width:100%;height:2px;left:0;bottom:0}.q-slider__marker-labels-container{position:relative;width:100%;height:100%;min-height:24px;min-width:24px}.q-slider__marker-labels{position:absolute}.q-slider__marker-labels--h-standard{top:0}.q-slider__marker-labels--h-switched{bottom:0}.q-slider__marker-labels--h-ltr{transform:translateX(-50%)}.q-slider__marker-labels--h-rtl{transform:translateX(50%)}.q-slider__marker-labels--v-standard{left:4px}.q-slider__marker-labels--v-switched{right:4px}.q-slider__marker-labels--v-ltr{transform:translateY(-50%)}.q-slider__marker-labels--v-rtl{transform:translateY(50%)}.q-slider__thumb{z-index:1;outline:0;color:var(--q-primary);transition:transform .18s ease-out,fill .18s ease-out,stroke .18s ease-out}.q-slider__thumb.q-slider--focus{opacity:1!important}.q-slider__thumb--h{top:50%;will-change:left}.q-slider__thumb--h-ltr{transform:scale(1) translate(-50%,-50%)}.q-slider__thumb--h-rtl{transform:scale(1) translate(50%,-50%)}.q-slider__thumb--v{left:50%;will-change:top}.q-slider__thumb--v-ltr{transform:scale(1) translate(-50%,-50%)}.q-slider__thumb--v-rtl{transform:scale(1) translate(-50%,50%)}.q-slider__thumb-shape{top:0;left:0;stroke-width:3.5;stroke:currentColor;transition:transform .28s}.q-slider__thumb-shape path{stroke:currentColor;fill:currentColor}.q-slider__focus-ring{border-radius:50%;opacity:0;transition:transform .266s ease-out,opacity .266s ease-out,background-color .266s ease-out;transition-delay:0.14s}.q-slider__pin{opacity:0;white-space:nowrap;transition:opacity .28s ease-out;transition-delay:0.14s}.q-slider__pin:before{content:"";width:0;height:0;position:absolute}.q-slider__pin--h:before{border-left:6px solid transparent;border-right:6px solid transparent;left:50%;transform:translateX(-50%)}.q-slider__pin--h-standard{bottom:100%}.q-slider__pin--h-standard:before{bottom:2px;border-top:6px solid currentColor}.q-slider__pin--h-switched{top:100%}.q-slider__pin--h-switched:before{top:2px;border-bottom:6px solid currentColor}.q-slider__pin--v{top:0}.q-slider__pin--v:before{top:50%;transform:translateY(-50%);border-top:6px solid transparent;border-bottom:6px solid transparent}.q-slider__pin--v-standard{left:100%}.q-slider__pin--v-standard:before{left:2px;border-right:6px solid currentColor}.q-slider__pin--v-switched{right:100%}.q-slider__pin--v-switched:before{right:2px;border-left:6px solid currentColor}.q-slider__label{z-index:1;white-space:nowrap;position:absolute}.q-slider__label--h{left:50%;transform:translateX(-50%)}.q-slider__label--h-standard{bottom:7px}.q-slider__label--h-switched{top:7px}.q-slider__label--v{top:50%;transform:translateY(-50%)}.q-slider__label--v-standard{left:7px}.q-slider__label--v-switched{right:7px}.q-slider__text-container{min-height:25px;padding:2px 8px;border-radius:4px;background:currentColor;position:relative;text-align:center}.q-slider__text{color:#fff;font-size:12px}.q-slider--no-value .q-slider__inner,.q-slider--no-value .q-slider__selection,.q-slider--no-value .q-slider__thumb{opacity:0}.q-slider--focus .q-slider__focus-ring,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__focus-ring{background:currentColor;transform:scale3d(1.55,1.55,1);opacity:.25}.q-slider--focus .q-slider__inner,.q-slider--focus .q-slider__selection,.q-slider--focus .q-slider__thumb,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__inner,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__selection,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__thumb{opacity:1}.q-slider--inactive .q-slider__thumb--h{transition:left .28s,right .28s}.q-slider--inactive .q-slider__thumb--v{transition:top .28s,bottom .28s}.q-slider--inactive .q-slider__selection{transition:width .28s,left .28s,right .28s,height .28s,top .28s,bottom .28s}.q-slider--inactive .q-slider__text-container{transition:transform .28s}.q-slider--active{cursor:grabbing}.q-slider--active .q-slider__thumb-shape{transform:scale(1.5)}.q-slider--active .q-slider__focus-ring,.q-slider--active.q-slider--label .q-slider__thumb-shape{transform:scale(0)!important}body.desktop .q-slider.q-slider--enabled .q-slider__track-container:hover .q-slider__pin{opacity:1}.q-slider--label .q-slider--focus .q-slider__pin,.q-slider--label.q-slider--active .q-slider__pin,.q-slider--label.q-slider--label-always .q-slider__pin{opacity:1}.q-slider--dark .q-slider__track{background:rgba(255,255,255,.1)}.q-slider--dark .q-slider__inner{background:rgba(255,255,255,.1)}.q-slider--dark .q-slider__markers{color:rgba(255,255,255,.3)}.q-slider--dense .q-slider__track-container--h{padding:6px 0}.q-slider--dense .q-slider__track-container--v{padding:0 6px}.q-space{flex-grow:1!important}.q-spinner{vertical-align:middle}.q-spinner-mat{animation:q-spin 2s linear infinite;transform-origin:center center}.q-spinner-mat .path{stroke-dasharray:1,200;stroke-dashoffset:0;animation:q-mat-dash 1.5s ease-in-out infinite}@keyframes q-spin{0%{transform:rotate3d(0,0,1,0deg)}25%{transform:rotate3d(0,0,1,90deg)}50%{transform:rotate3d(0,0,1,180deg)}75%{transform:rotate3d(0,0,1,270deg)}100%{transform:rotate3d(0,0,1,359deg)}}@keyframes q-mat-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}.q-splitter__panel{position:relative;z-index:0}.q-splitter__panel>.q-splitter{width:100%;height:100%}.q-splitter__separator{background-color:rgba(0,0,0,.12);user-select:none;position:relative;z-index:1}.q-splitter__separator-area>*{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.q-splitter--dark .q-splitter__separator{background-color:rgba(255,255,255,.28)}.q-splitter--vertical>.q-splitter__panel{height:100%}.q-splitter--vertical.q-splitter--active{cursor:col-resize}.q-splitter--vertical>.q-splitter__separator{width:1px}.q-splitter--vertical>.q-splitter__separator>div{left:-6px;right:-6px}.q-splitter--vertical.q-splitter--workable>.q-splitter__separator{cursor:col-resize}.q-splitter--horizontal>.q-splitter__panel{width:100%}.q-splitter--horizontal.q-splitter--active{cursor:row-resize}.q-splitter--horizontal>.q-splitter__separator{height:1px}.q-splitter--horizontal>.q-splitter__separator>div{top:-6px;bottom:-6px}.q-splitter--horizontal.q-splitter--workable>.q-splitter__separator{cursor:row-resize}.q-splitter__after,.q-splitter__before{overflow:auto}.q-stepper{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff}.q-stepper__title{font-size:14px;line-height:1.285714;letter-spacing:.1px}.q-stepper__caption{font-size:12px;line-height:1.16667}.q-stepper__dot{contain:layout;margin-right:8px;font-size:14px;width:24px;min-width:24px;height:24px;border-radius:50%;background:currentColor}.q-stepper__dot span{color:#fff}.q-stepper__tab{padding:8px 24px;font-size:14px;color:#9e9e9e;flex-direction:row}.q-stepper--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-stepper--dark .q-stepper__dot span{color:#000}.q-stepper__tab--navigation{user-select:none;cursor:pointer}.q-stepper__tab--active,.q-stepper__tab--done{color:var(--q-primary)}.q-stepper__tab--active .q-stepper__dot,.q-stepper__tab--active .q-stepper__label,.q-stepper__tab--done .q-stepper__dot,.q-stepper__tab--done .q-stepper__label{text-shadow:0 0 0 currentColor}.q-stepper__tab--disabled .q-stepper__dot{background:rgba(0,0,0,.22)}.q-stepper__tab--disabled .q-stepper__label{color:rgba(0,0,0,.32)}.q-stepper__tab--error{color:var(--q-negative)}.q-stepper__tab--error-with-icon .q-stepper__dot{background:0 0!important}.q-stepper__tab--error-with-icon .q-stepper__dot span{color:currentColor;font-size:24px}.q-stepper__header{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-stepper__header--border{border-bottom:1px solid rgba(0,0,0,.12)}.q-stepper__header--standard-labels .q-stepper__tab{min-height:72px;justify-content:center}.q-stepper__header--standard-labels .q-stepper__tab:first-child{justify-content:flex-start}.q-stepper__header--standard-labels .q-stepper__tab:last-child{justify-content:flex-end}.q-stepper__header--standard-labels .q-stepper__tab:only-child{justify-content:center}.q-stepper__header--standard-labels .q-stepper__dot:after{display:none}.q-stepper__header--alternative-labels .q-stepper__tab{min-height:104px;padding:24px 32px;flex-direction:column;justify-content:flex-start}.q-stepper__header--alternative-labels .q-stepper__dot{margin-right:0}.q-stepper__header--alternative-labels .q-stepper__label{margin-top:8px;text-align:center}.q-stepper__header--alternative-labels .q-stepper__label:after,.q-stepper__header--alternative-labels .q-stepper__label:before{display:none}.q-stepper__header--contracted{min-height:72px}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab{min-height:72px}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab:first-child{align-items:flex-start}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab:last-child{align-items:flex-end}.q-stepper__header--contracted .q-stepper__tab{padding:24px 0}.q-stepper__header--contracted .q-stepper__tab:first-child .q-stepper__dot{transform:translateX(24px)}.q-stepper__header--contracted .q-stepper__tab:last-child .q-stepper__dot{transform:translateX(-24px)}.q-stepper__header--contracted .q-stepper__tab:not(:last-child) .q-stepper__dot:after{display:block!important}.q-stepper__header--contracted .q-stepper__dot{margin:0}.q-stepper__header--contracted .q-stepper__label{display:none}.q-stepper__nav{padding-top:24px}.q-stepper--flat{box-shadow:none}.q-stepper--bordered{border:1px solid rgba(0,0,0,.12)}.q-stepper--horizontal .q-stepper__step-inner{padding:24px}.q-stepper--horizontal .q-stepper__tab:first-child{border-top-left-radius:inherit}.q-stepper--horizontal .q-stepper__tab:last-child{border-top-right-radius:inherit}.q-stepper--horizontal .q-stepper__tab:first-child .q-stepper__dot:before,.q-stepper--horizontal .q-stepper__tab:last-child .q-stepper__dot:after,.q-stepper--horizontal .q-stepper__tab:last-child .q-stepper__label:after{display:none}.q-stepper--horizontal .q-stepper__tab{overflow:hidden}.q-stepper--horizontal .q-stepper__line{contain:layout}.q-stepper--horizontal .q-stepper__line:after,.q-stepper--horizontal .q-stepper__line:before{position:absolute;top:50%;height:1px;width:100vw;background:rgba(0,0,0,.12)}.q-stepper--horizontal .q-stepper__dot:after,.q-stepper--horizontal .q-stepper__label:after{content:"";left:100%;margin-left:8px}.q-stepper--horizontal .q-stepper__dot:before{content:"";right:100%;margin-right:8px}.q-stepper--horizontal>.q-stepper__nav{padding:0 24px 24px}.q-stepper--vertical{padding:16px 0}.q-stepper--vertical .q-stepper__tab{padding:12px 24px}.q-stepper--vertical .q-stepper__title{line-height:18px}.q-stepper--vertical .q-stepper__step-inner{padding:0 24px 32px 60px}.q-stepper--vertical>.q-stepper__nav{padding:24px 24px 0}.q-stepper--vertical .q-stepper__step{overflow:hidden}.q-stepper--vertical .q-stepper__dot{margin-right:12px}.q-stepper--vertical .q-stepper__dot:after,.q-stepper--vertical .q-stepper__dot:before{content:"";position:absolute;left:50%;width:1px;height:99999px;background:rgba(0,0,0,.12)}.q-stepper--vertical .q-stepper__dot:before{bottom:100%;margin-bottom:8px}.q-stepper--vertical .q-stepper__dot:after{top:100%;margin-top:8px}.q-stepper--vertical .q-stepper__step:first-child .q-stepper__dot:before,.q-stepper--vertical .q-stepper__step:last-child .q-stepper__dot:after{display:none}.q-stepper--vertical .q-stepper__step:last-child .q-stepper__step-inner{padding-bottom:8px}.q-stepper--dark .q-stepper__header--border,.q-stepper--dark.q-stepper--bordered{border-color:rgba(255,255,255,.28)}.q-stepper--dark.q-stepper--horizontal .q-stepper__line:after,.q-stepper--dark.q-stepper--horizontal .q-stepper__line:before{background:rgba(255,255,255,.28)}.q-stepper--dark.q-stepper--vertical .q-stepper__dot:after,.q-stepper--dark.q-stepper--vertical .q-stepper__dot:before{background:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled{color:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled .q-stepper__dot{background:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled .q-stepper__label{color:rgba(255,255,255,.54)}.q-tab-panels{background:#fff}.q-tab-panel{padding:16px}.q-markup-table{overflow:auto;background:#fff}.q-table{width:100%;max-width:100%;border-collapse:separate;border-spacing:0}.q-table tbody td,.q-table thead tr{height:48px}.q-table th{font-weight:500;font-size:12px;user-select:none}.q-table th.sortable{cursor:pointer}.q-table th.sortable:hover .q-table__sort-icon{opacity:.64}.q-table th.sorted .q-table__sort-icon{opacity:.86!important}.q-table th.sort-desc .q-table__sort-icon{transform:rotate(180deg)}.q-table td,.q-table th{padding:7px 16px;background-color:inherit}.q-table td,.q-table th,.q-table thead{border-style:solid;border-width:0}.q-table tbody td{font-size:13px}.q-table__card{color:#000;background-color:#fff;border-radius:4px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-table__card .q-table__middle{flex:1 1 auto}.q-table__card .q-table__bottom,.q-table__card .q-table__top{flex:0 0 auto}.q-table__container{position:relative}.q-table__container>div:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-table__container>div:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.q-table__container>.q-inner-loading{border-radius:inherit!important}.q-table__top{padding:12px 16px}.q-table__top .q-table__control{flex-wrap:wrap}.q-table__title{font-size:20px;letter-spacing:.005em;font-weight:400}.q-table__separator{min-width:8px!important}.q-table__progress{height:0!important}.q-table__progress th{padding:0!important;border:0!important}.q-table__progress .q-linear-progress{position:absolute;bottom:0}.q-table__middle{max-width:100%}.q-table__bottom{min-height:50px;padding:4px 14px 4px 16px;font-size:12px}.q-table__bottom .q-table__control{min-height:24px}.q-table__bottom-nodata-icon{font-size:200%;margin-right:8px}.q-table__bottom-item{margin-right:16px}.q-table__control{display:flex;align-items:center}.q-table__sort-icon{transition:transform .3s cubic-bezier(.25, .8, .5, 1);opacity:0;font-size:120%}.q-table__sort-icon--center,.q-table__sort-icon--left{margin-left:4px}.q-table__sort-icon--right{margin-right:4px}.q-table--col-auto-width{width:1px}.q-table--dark,.q-table__card--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-table--flat{box-shadow:none}.q-table--bordered{border:1px solid rgba(0,0,0,.12)}.q-table--square{border-radius:0}.q-table__linear-progress{height:2px}.q-table--no-wrap td,.q-table--no-wrap th{white-space:nowrap}.q-table--grid{box-shadow:none;border-radius:4px}.q-table--grid .q-table__top{padding-bottom:4px}.q-table--grid .q-table__middle{min-height:2px;margin-bottom:4px}.q-table--grid .q-table__middle thead,.q-table--grid .q-table__middle thead th{border:0!important}.q-table--grid .q-table__linear-progress{bottom:0}.q-table--grid .q-table__bottom{border-top:0}.q-table--grid .q-table__grid-content{flex:1 1 auto}.q-table--grid.fullscreen{background:inherit}.q-table__grid-item-card{vertical-align:top;padding:12px}.q-table__grid-item-card .q-separator{margin:12px 0}.q-table__grid-item-row+.q-table__grid-item-row{margin-top:8px}.q-table__grid-item-title{opacity:.54;font-weight:500;font-size:12px}.q-table__grid-item-value{font-size:13px}.q-table__grid-item{padding:4px;transition:transform .3s cubic-bezier(.25, .8, .5, 1)}.q-table__grid-item--selected{transform:scale(.95)}.q-table--cell-separator tbody tr:not(:last-child)>td,.q-table--cell-separator thead th,.q-table--horizontal-separator tbody tr:not(:last-child)>td,.q-table--horizontal-separator thead th{border-bottom-width:1px}.q-table--cell-separator td,.q-table--cell-separator th,.q-table--vertical-separator td,.q-table--vertical-separator th{border-left-width:1px}.q-table--cell-separator thead tr:last-child th,.q-table--cell-separator.q-table--loading tr:nth-last-child(2) th,.q-table--vertical-separator thead tr:last-child th,.q-table--vertical-separator.q-table--loading tr:nth-last-child(2) th{border-bottom-width:1px}.q-table--cell-separator td:first-child,.q-table--cell-separator th:first-child,.q-table--vertical-separator td:first-child,.q-table--vertical-separator th:first-child{border-left:0}.q-table--cell-separator .q-table__top,.q-table--vertical-separator .q-table__top{border-bottom:1px solid rgba(0,0,0,.12)}.q-table--dense .q-table__top{padding:6px 16px}.q-table--dense .q-table__bottom{min-height:33px}.q-table--dense .q-table__sort-icon{font-size:110%}.q-table--dense .q-table td,.q-table--dense .q-table th{padding:4px 8px}.q-table--dense .q-table tbody td,.q-table--dense .q-table tbody tr,.q-table--dense .q-table thead tr{height:28px}.q-table--dense .q-table td:first-child,.q-table--dense .q-table th:first-child{padding-left:16px}.q-table--dense .q-table td:last-child,.q-table--dense .q-table th:last-child{padding-right:16px}.q-table--dense .q-table__bottom-item{margin-right:8px}.q-table--dense .q-table__select .q-field__control,.q-table--dense .q-table__select .q-field__native{min-height:24px;padding:0}.q-table--dense .q-table__select .q-field__marginal{height:24px}.q-table__bottom:not(.q-table__bottom--nodata){border-top:1px solid rgba(0,0,0,.12)}.q-table td,.q-table th,.q-table thead,.q-table tr{border-color:rgba(0,0,0,.12)}.q-table tbody td{position:relative}.q-table tbody td:after,.q-table tbody td:before{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none}.q-table tbody td:before{background:rgba(0,0,0,.03)}.q-table tbody td:after{background:rgba(0,0,0,.06)}.q-table tbody tr.selected td:after{content:""}body.desktop .q-table>tbody>tr:not(.q-tr--no-hover):hover>td:not(.q-td--no-hover):before{content:""}.q-table--dark,.q-table__card--dark{border-color:rgba(255,255,255,.28)}.q-table--dark .q-table__bottom,.q-table--dark td,.q-table--dark th,.q-table--dark thead,.q-table--dark tr{border-color:rgba(255,255,255,.28)}.q-table--dark tbody td:before{background:rgba(255,255,255,.07)}.q-table--dark tbody td:after{background:rgba(255,255,255,.1)}.q-table--dark.q-table--cell-separator .q-table__top,.q-table--dark.q-table--vertical-separator .q-table__top{border-color:rgba(255,255,255,.28)}.q-tab{padding:0 16px;min-height:48px;transition:color .3s,background-color .3s;text-transform:uppercase;white-space:nowrap;color:inherit;text-decoration:none}.q-tab--full{min-height:72px}.q-tab--no-caps{text-transform:none}.q-tab__content{height:inherit;padding:4px 0;min-width:40px}.q-tab__content--inline .q-tab__icon+.q-tab__label{padding-left:8px}.q-tab__content .q-chip--floating{top:0;right:-16px}.q-tab__icon{width:24px;height:24px;font-size:24px}.q-tab__label{font-size:14px;line-height:1.715em;font-weight:500}.q-tab .q-badge{top:3px;right:-12px}.q-tab__alert,.q-tab__alert-icon{position:absolute}.q-tab__alert{top:7px;right:-9px;height:10px;width:10px;border-radius:50%;background:currentColor}.q-tab__alert-icon{top:2px;right:-12px;font-size:18px}.q-tab__indicator{opacity:0;height:2px;background:currentColor}.q-tab--active .q-tab__indicator{opacity:1;transform-origin:left}.q-tab--inactive{opacity:.85}.q-tabs{position:relative;transition:color .3s,background-color .3s}.q-tabs--scrollable.q-tabs__arrows--outside.q-tabs--horizontal{padding-left:36px;padding-right:36px}.q-tabs--scrollable.q-tabs__arrows--outside.q-tabs--vertical{padding-top:36px;padding-bottom:36px}.q-tabs--scrollable.q-tabs__arrows--outside .q-tabs__arrow--faded{opacity:.3;pointer-events:none}.q-tabs--scrollable.q-tabs__arrows--inside .q-tabs__arrow--faded{display:none}.q-tabs--not-scrollable.q-tabs__arrows--outside,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows.q-tabs__arrows--outside{padding-left:0;padding-right:0}.q-tabs--not-scrollable .q-tabs__arrow,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows .q-tabs__arrow{display:none}.q-tabs--not-scrollable .q-tabs__content,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows .q-tabs__content{border-radius:inherit}.q-tabs__arrow{cursor:pointer;font-size:32px;min-width:36px;text-shadow:0 0 3px #fff,0 0 1px #fff,0 0 1px #000;transition:opacity .3s}.q-tabs__content{overflow:hidden;flex:1 1 auto}.q-tabs__content--align-center{justify-content:center}.q-tabs__content--align-right{justify-content:flex-end}.q-tabs__content--align-justify .q-tab{flex:1 1 auto}.q-tabs__offset{display:none}.q-tabs--horizontal .q-tabs__arrow{height:100%}.q-tabs--horizontal .q-tabs__arrow--left{top:0;left:0;bottom:0}.q-tabs--horizontal .q-tabs__arrow--right{top:0;right:0;bottom:0}.q-tabs--vertical{display:block!important;height:100%}.q-tabs--vertical .q-tabs__content{display:block!important;height:100%}.q-tabs--vertical .q-tabs__arrow{width:100%;height:36px;text-align:center}.q-tabs--vertical .q-tabs__arrow--left{top:0;left:0;right:0}.q-tabs--vertical .q-tabs__arrow--right{left:0;right:0;bottom:0}.q-tabs--vertical .q-tab{padding:0 8px}.q-tabs--vertical .q-tab__indicator{height:unset;width:2px}.q-tabs--vertical.q-tabs--not-scrollable .q-tabs__content{height:100%}.q-tabs--vertical.q-tabs--dense .q-tab__content{min-width:24px}.q-tabs--dense .q-tab{min-height:36px}.q-tabs--dense .q-tab--full{min-height:52px}.q-time{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff;outline:0;width:290px;min-width:290px;max-width:100%}.q-time--bordered{border:1px solid rgba(0,0,0,.12)}.q-time__header{border-top-left-radius:inherit;color:#fff;background-color:var(--q-primary);padding:16px;font-weight:300}.q-time__actions{padding:0 16px 16px}.q-time__header-label{font-size:28px;line-height:1;letter-spacing:-.00833em}.q-time__header-label>div+div{margin-left:4px}.q-time__link{opacity:.56;outline:0;transition:opacity .3s ease-out}.q-time__link--active,.q-time__link:focus,.q-time__link:hover{opacity:1}.q-time__header-ampm{font-size:16px;letter-spacing:.1em}.q-time__content{padding:16px}.q-time__content:before{content:"";display:block;padding-bottom:100%}.q-time__container-parent{padding:16px}.q-time__container-child{border-radius:50%;background:rgba(0,0,0,.12)}.q-time__clock{padding:24px;width:100%;height:100%;max-width:100%;max-height:100%;font-size:14px}.q-time__clock-circle{position:relative}.q-time__clock-center{height:6px;width:6px;margin:auto;border-radius:50%;min-height:0;background:currentColor}.q-time__clock-pointer{width:2px;height:50%;transform-origin:0 0;min-height:0;position:absolute;left:50%;right:0;bottom:0;color:var(--q-primary);background:currentColor;transform:translateX(-50%)}.q-time__clock-pointer:after,.q-time__clock-pointer:before{content:"";position:absolute;left:50%;border-radius:50%;background:currentColor;transform:translateX(-50%)}.q-time__clock-pointer:before{bottom:-4px;width:8px;height:8px}.q-time__clock-pointer:after{top:-3px;height:6px;width:6px}.q-time__clock-position{position:absolute;min-height:32px;width:32px;height:32px;font-size:12px;line-height:32px;margin:0;padding:0;transform:translate(-50%,-50%);border-radius:50%}.q-time__clock-position--disable{opacity:.4}.q-time__clock-position--active{background-color:var(--q-primary);color:#fff}.q-time__clock-pos-0{top:0;left:50%}.q-time__clock-pos-1{top:6.7%;left:75%}.q-time__clock-pos-2{top:25%;left:93.3%}.q-time__clock-pos-3{top:50%;left:100%}.q-time__clock-pos-4{top:75%;left:93.3%}.q-time__clock-pos-5{top:93.3%;left:75%}.q-time__clock-pos-6{top:100%;left:50%}.q-time__clock-pos-7{top:93.3%;left:25%}.q-time__clock-pos-8{top:75%;left:6.7%}.q-time__clock-pos-9{top:50%;left:0}.q-time__clock-pos-10{top:25%;left:6.7%}.q-time__clock-pos-11{top:6.7%;left:25%}.q-time__clock-pos-12{top:15%;left:50%}.q-time__clock-pos-13{top:19.69%;left:67.5%}.q-time__clock-pos-14{top:32.5%;left:80.31%}.q-time__clock-pos-15{top:50%;left:85%}.q-time__clock-pos-16{top:67.5%;left:80.31%}.q-time__clock-pos-17{top:80.31%;left:67.5%}.q-time__clock-pos-18{top:85%;left:50%}.q-time__clock-pos-19{top:80.31%;left:32.5%}.q-time__clock-pos-20{top:67.5%;left:19.69%}.q-time__clock-pos-21{top:50%;left:15%}.q-time__clock-pos-22{top:32.5%;left:19.69%}.q-time__clock-pos-23{top:19.69%;left:32.5%}.q-time__now-button{background-color:var(--q-primary);color:#fff;top:12px;right:12px}.q-time--readonly .q-time__content,.q-time--readonly .q-time__header-ampm,.q-time.disabled .q-time__content,.q-time.disabled .q-time__header-ampm{pointer-events:none}.q-time--portrait{display:inline-flex;flex-direction:column}.q-time--portrait .q-time__header{border-top-right-radius:inherit;min-height:86px}.q-time--portrait .q-time__header-ampm{margin-left:12px}.q-time--portrait.q-time--bordered .q-time__content{margin:1px 0}.q-time--landscape{display:inline-flex;align-items:stretch;min-width:420px}.q-time--landscape>div{display:flex;flex-direction:column;justify-content:center}.q-time--landscape .q-time__header{border-bottom-left-radius:inherit;min-width:156px}.q-time--landscape .q-time__header-ampm{margin-top:12px}.q-time--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-timeline{padding:0;width:100%;list-style:none}.q-timeline h6{line-height:inherit}.q-timeline--dark{color:#fff}.q-timeline--dark .q-timeline__subtitle{opacity:.7}.q-timeline__content{padding-bottom:24px}.q-timeline__title{margin-top:0;margin-bottom:16px}.q-timeline__subtitle{font-size:12px;margin-bottom:8px;opacity:.6;text-transform:uppercase;letter-spacing:1px;font-weight:700}.q-timeline__dot{position:absolute;top:0;bottom:0;width:15px}.q-timeline__dot:after,.q-timeline__dot:before{content:"";background:currentColor;display:block;position:absolute}.q-timeline__dot:before{border:3px solid transparent;border-radius:100%;height:15px;width:15px;top:4px;left:0;transition:background .3s ease-in-out,border .3s ease-in-out}.q-timeline__dot:after{width:3px;opacity:.4;top:24px;bottom:0;left:6px}.q-timeline__dot .q-icon{position:absolute;top:0;left:0;right:0;font-size:16px;height:38px;line-height:38px;width:100%;color:#fff}.q-timeline__dot .q-icon>img,.q-timeline__dot .q-icon>svg{width:1em;height:1em}.q-timeline__dot-img{position:absolute;top:4px;left:0;right:0;height:31px;width:31px;background:currentColor;border-radius:50%}.q-timeline__heading{position:relative}.q-timeline__heading:first-child .q-timeline__heading-title{padding-top:0}.q-timeline__heading:last-child .q-timeline__heading-title{padding-bottom:0}.q-timeline__heading-title{padding:32px 0;margin:0}.q-timeline__entry{position:relative;line-height:22px}.q-timeline__entry:last-child{padding-bottom:0!important}.q-timeline__entry:last-child .q-timeline__dot:after{content:none}.q-timeline__entry--icon .q-timeline__dot{width:31px}.q-timeline__entry--icon .q-timeline__dot:before{height:31px;width:31px}.q-timeline__entry--icon .q-timeline__dot:after{top:41px;left:14px}.q-timeline__entry--icon .q-timeline__subtitle{padding-top:8px}.q-timeline--dense--right .q-timeline__entry{padding-left:40px}.q-timeline--dense--right .q-timeline__entry--icon .q-timeline__dot{left:-8px}.q-timeline--dense--right .q-timeline__dot{left:0}.q-timeline--dense--left .q-timeline__heading{text-align:right}.q-timeline--dense--left .q-timeline__entry{padding-right:40px}.q-timeline--dense--left .q-timeline__entry--icon .q-timeline__dot{right:-8px}.q-timeline--dense--left .q-timeline__content,.q-timeline--dense--left .q-timeline__subtitle,.q-timeline--dense--left .q-timeline__title{text-align:right}.q-timeline--dense--left .q-timeline__dot{right:0}.q-timeline--comfortable{display:table}.q-timeline--comfortable .q-timeline__heading{display:table-row;font-size:200%}.q-timeline--comfortable .q-timeline__heading>div{display:table-cell}.q-timeline--comfortable .q-timeline__entry{display:table-row;padding:0}.q-timeline--comfortable .q-timeline__entry--icon .q-timeline__content{padding-top:8px}.q-timeline--comfortable .q-timeline__content,.q-timeline--comfortable .q-timeline__dot,.q-timeline--comfortable .q-timeline__subtitle{display:table-cell;vertical-align:top}.q-timeline--comfortable .q-timeline__subtitle{width:35%}.q-timeline--comfortable .q-timeline__dot{position:relative;min-width:31px}.q-timeline--comfortable--right .q-timeline__heading .q-timeline__heading-title{margin-left:-50px}.q-timeline--comfortable--right .q-timeline__subtitle{text-align:right;padding-right:30px}.q-timeline--comfortable--right .q-timeline__content{padding-left:30px}.q-timeline--comfortable--right .q-timeline__entry--icon .q-timeline__dot{left:-8px}.q-timeline--comfortable--left .q-timeline__heading{text-align:right}.q-timeline--comfortable--left .q-timeline__heading .q-timeline__heading-title{margin-right:-50px}.q-timeline--comfortable--left .q-timeline__subtitle{padding-left:30px}.q-timeline--comfortable--left .q-timeline__content{padding-right:30px}.q-timeline--comfortable--left .q-timeline__content,.q-timeline--comfortable--left .q-timeline__title{text-align:right}.q-timeline--comfortable--left .q-timeline__entry--icon .q-timeline__dot{right:0}.q-timeline--comfortable--left .q-timeline__dot{right:-8px}.q-timeline--loose .q-timeline__heading-title{text-align:center;margin-left:0}.q-timeline--loose .q-timeline__content,.q-timeline--loose .q-timeline__dot,.q-timeline--loose .q-timeline__entry,.q-timeline--loose .q-timeline__subtitle{display:block;margin:0;padding:0}.q-timeline--loose .q-timeline__dot{position:absolute;left:50%;margin-left:-7.15px}.q-timeline--loose .q-timeline__entry{padding-bottom:24px;overflow:hidden}.q-timeline--loose .q-timeline__entry--icon .q-timeline__dot{margin-left:-15px}.q-timeline--loose .q-timeline__entry--icon .q-timeline__subtitle{line-height:38px}.q-timeline--loose .q-timeline__entry--icon .q-timeline__content{padding-top:8px}.q-timeline--loose .q-timeline__entry--left .q-timeline__content,.q-timeline--loose .q-timeline__entry--right .q-timeline__subtitle{float:left;padding-right:30px;text-align:right}.q-timeline--loose .q-timeline__entry--left .q-timeline__subtitle,.q-timeline--loose .q-timeline__entry--right .q-timeline__content{float:right;text-align:left;padding-left:30px}.q-timeline--loose .q-timeline__content,.q-timeline--loose .q-timeline__subtitle{width:50%}.q-toggle{vertical-align:middle}.q-toggle__native{width:1px;height:1px}.q-toggle__track{height:.35em;border-radius:.175em;opacity:.38;background:currentColor}.q-toggle__thumb{top:.25em;left:.25em;width:.5em;height:.5em;transition:left .22s cubic-bezier(.4, 0, .2, 1);user-select:none;z-index:0}.q-toggle__thumb:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:#fff;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.q-toggle__thumb .q-icon{font-size:.3em;min-width:1em;color:#000;opacity:.54;z-index:1}.q-toggle__inner{font-size:40px;width:1.4em;min-width:1.4em;height:1em;padding:.325em .3em;-webkit-print-color-adjust:exact}.q-toggle__inner--indet .q-toggle__thumb{left:.45em}.q-toggle__inner--truthy{color:var(--q-primary)}.q-toggle__inner--truthy .q-toggle__track{opacity:.54}.q-toggle__inner--truthy .q-toggle__thumb{left:.65em}.q-toggle__inner--truthy .q-toggle__thumb:after{background-color:currentColor}.q-toggle__inner--truthy .q-toggle__thumb .q-icon{color:#fff;opacity:1}.q-toggle.disabled{opacity:.75!important}.q-toggle--dark .q-toggle__inner{color:#fff}.q-toggle--dark .q-toggle__inner--truthy{color:var(--q-primary)}.q-toggle--dark .q-toggle__thumb:after{box-shadow:none}.q-toggle--dark .q-toggle__thumb:before{opacity:.32!important}.q-toggle--dense .q-toggle__inner{width:.8em;min-width:.8em;height:.5em;padding:.07625em 0}.q-toggle--dense .q-toggle__thumb{top:0;left:0}.q-toggle--dense .q-toggle__inner--indet .q-toggle__thumb{left:.15em}.q-toggle--dense .q-toggle__inner--truthy .q-toggle__thumb{left:.3em}.q-toggle--dense .q-toggle__label{padding-left:.5em}.q-toggle--dense.reverse .q-toggle__label{padding-left:0;padding-right:.5em}body.desktop .q-toggle:not(.disabled) .q-toggle__thumb:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1)}body.desktop .q-toggle:not(.disabled):focus .q-toggle__thumb:before,body.desktop .q-toggle:not(.disabled):hover .q-toggle__thumb:before{transform:scale3d(2,2,1)}body.desktop .q-toggle--dense:not(.disabled):focus .q-toggle__thumb:before,body.desktop .q-toggle--dense:not(.disabled):hover .q-toggle__thumb:before{transform:scale3d(1.5,1.5,1)}.q-toolbar{position:relative;padding:0 12px;min-height:50px;width:100%}.q-toolbar--inset{padding-left:58px}.q-toolbar .q-avatar{font-size:38px}.q-toolbar__title{flex:1 1 0%;min-width:1px;max-width:100%;font-size:21px;font-weight:400;letter-spacing:.01em;padding:0 12px}.q-toolbar__title:first-child{padding-left:0}.q-toolbar__title:last-child{padding-right:0}.q-tooltip--style{font-size:10px;color:#fafafa;background:#757575;border-radius:4px;text-transform:none;font-weight:400}.q-tooltip{z-index:9000;position:fixed!important;overflow-y:auto;overflow-x:hidden;padding:6px 10px;max-width:95vw;max-height:65vh}@media (max-width:599.98px){.q-tooltip{font-size:14px;padding:8px 16px}}.q-tree{position:relative;color:#9e9e9e}.q-tree__node{padding:0 0 3px 22px}.q-tree__node:after{content:"";position:absolute;top:-3px;bottom:0;width:2px;right:auto;left:-13px;border-left:1px solid currentColor}.q-tree__node:last-child:after{display:none}.q-tree__node--disabled{pointer-events:none}.q-tree__node--disabled .disabled{opacity:1!important}.q-tree__node--disabled>.disabled,.q-tree__node--disabled>div,.q-tree__node--disabled>i{opacity:.6!important}.q-tree__node--disabled>.disabled .q-tree__node--disabled>.disabled,.q-tree__node--disabled>.disabled .q-tree__node--disabled>div,.q-tree__node--disabled>.disabled .q-tree__node--disabled>i,.q-tree__node--disabled>div .q-tree__node--disabled>.disabled,.q-tree__node--disabled>div .q-tree__node--disabled>div,.q-tree__node--disabled>div .q-tree__node--disabled>i,.q-tree__node--disabled>i .q-tree__node--disabled>.disabled,.q-tree__node--disabled>i .q-tree__node--disabled>div,.q-tree__node--disabled>i .q-tree__node--disabled>i{opacity:1!important}.q-tree__node-header:before{content:"";position:absolute;top:-3px;bottom:50%;width:31px;left:-35px;border-left:1px solid currentColor;border-bottom:1px solid currentColor}.q-tree__children{padding-left:25px}.q-tree__node-body{padding:5px 0 8px 5px}.q-tree__node--parent{padding-left:2px}.q-tree__node--parent>.q-tree__node-header:before{width:15px;left:-15px}.q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body{padding:5px 0 8px 27px}.q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body:after{content:"";position:absolute;top:0;width:2px;height:100%;right:auto;left:12px;border-left:1px solid currentColor;bottom:50px}.q-tree__node--link{cursor:pointer}.q-tree__node-header{padding:4px;margin-top:3px;border-radius:4px;outline:0}.q-tree__node-header-content{color:#000;transition:color .3s}.q-tree__node--selected .q-tree__node-header-content{color:#9e9e9e}.q-tree__icon,.q-tree__node-header-content .q-icon{font-size:21px}.q-tree__img{height:42px;border-radius:2px}.q-tree__avatar,.q-tree__node-header-content .q-avatar{font-size:28px;border-radius:50%;width:28px;height:28px}.q-tree__arrow,.q-tree__spinner{font-size:16px;margin-right:4px}.q-tree__arrow{transition:transform .3s}.q-tree__arrow--rotate{transform:rotate3d(0,0,1,90deg)}.q-tree__tickbox{margin-right:4px}.q-tree>.q-tree__node{padding:0}.q-tree>.q-tree__node:after,.q-tree>.q-tree__node>.q-tree__node-header:before{display:none}.q-tree>.q-tree__node--child>.q-tree__node-header{padding-left:24px}.q-tree--dark .q-tree__node-header-content{color:#fff}.q-tree--no-connectors .q-tree__node-body:after,.q-tree--no-connectors .q-tree__node-header:before,.q-tree--no-connectors .q-tree__node:after{display:none!important}.q-tree--dense>.q-tree__node--child>.q-tree__node-header{padding-left:1px}.q-tree--dense .q-tree__arrow,.q-tree--dense .q-tree__spinner{margin-right:1px}.q-tree--dense .q-tree__img{height:32px}.q-tree--dense .q-tree__tickbox{margin-right:3px}.q-tree--dense .q-tree__node{padding:0}.q-tree--dense .q-tree__node:after{top:0;left:-8px}.q-tree--dense .q-tree__node-header{margin-top:0;padding:1px}.q-tree--dense .q-tree__node-header:before{top:0;left:-8px;width:8px}.q-tree--dense .q-tree__node--child{padding-left:17px}.q-tree--dense .q-tree__node--child>.q-tree__node-header:before{left:-25px;width:21px}.q-tree--dense .q-tree__node-body{padding:0 0 2px}.q-tree--dense .q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body{padding:0 0 2px 20px}.q-tree--dense .q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body:after{left:8px}.q-tree--dense .q-tree__children{padding-left:16px}[dir=rtl] .q-tree__arrow{transform:rotate3d(0,0,1,180deg)}[dir=rtl] .q-tree__arrow--rotate{transform:rotate3d(0,0,1,90deg)}.q-uploader{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;vertical-align:top;background:#fff;position:relative;width:320px;max-height:320px}.q-uploader--bordered{border:1px solid rgba(0,0,0,.12)}.q-uploader__input{opacity:0;width:100%;height:100%;cursor:pointer!important;z-index:1}.q-uploader__input::-webkit-file-upload-button{cursor:pointer}.q-uploader__file:before{content:"";border-top-left-radius:inherit;border-top-right-radius:inherit;position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;background:currentColor;opacity:.04}.q-uploader__header{position:relative;border-top-left-radius:inherit;border-top-right-radius:inherit;background-color:var(--q-primary);color:#fff;width:100%}.q-uploader__spinner{font-size:24px;margin-right:4px}.q-uploader__header-content{padding:8px}.q-uploader__dnd{outline:1px dashed currentColor;outline-offset:-4px;background:rgba(255,255,255,.6)}.q-uploader__overlay{font-size:36px;color:#000;background-color:rgba(255,255,255,.6)}.q-uploader__list{position:relative;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding:8px;min-height:60px;flex:1 1 auto}.q-uploader__file{border-radius:4px 4px 0 0;border:1px solid rgba(0,0,0,.12)}.q-uploader__file .q-circular-progress{font-size:24px}.q-uploader__file--img{color:#fff;height:200px;min-width:200px;background-position:50% 50%;background-repeat:no-repeat}.q-uploader__file--img:before{content:none}.q-uploader__file--img .q-circular-progress{color:#fff}.q-uploader__file--img .q-uploader__file-header{padding-bottom:24px;background:linear-gradient(to bottom,rgba(0,0,0,.7) 20%,rgba(255,255,255,0))}.q-uploader__file+.q-uploader__file{margin-top:8px}.q-uploader__file-header{position:relative;padding:4px 8px;border-top-left-radius:inherit;border-top-right-radius:inherit}.q-uploader__file-header-content{padding-right:8px}.q-uploader__file-status{font-size:24px;margin-right:4px}.q-uploader__title{font-size:14px;font-weight:700;line-height:1.285714;word-break:break-word}.q-uploader__subtitle{font-size:12px;line-height:1.5}.q-uploader--disable .q-uploader__header,.q-uploader--disable .q-uploader__list{pointer-events:none}.q-uploader--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-uploader--dark .q-uploader__file{border-color:rgba(255,255,255,.28)}.q-uploader--dark .q-uploader__dnd,.q-uploader--dark .q-uploader__overlay{background:rgba(255,255,255,.3)}.q-uploader--dark .q-uploader__overlay{color:#fff}img.responsive{max-width:100%;height:auto}.q-video{position:relative;overflow:hidden;border-radius:inherit}.q-video embed,.q-video iframe,.q-video object{width:100%;height:100%}.q-video--responsive{height:0}.q-video--responsive embed,.q-video--responsive iframe,.q-video--responsive object{position:absolute;top:0;left:0}.q-virtual-scroll:focus{outline:0}.q-virtual-scroll__content{outline:0;contain:content}.q-virtual-scroll__content>*{overflow-anchor:none}.q-virtual-scroll__content>[data-q-vs-anchor]{overflow-anchor:auto}.q-virtual-scroll__padding{background:linear-gradient(rgba(255,255,255,0),rgba(255,255,255,0) 20%,rgba(128,128,128,.03) 20%,rgba(128,128,128,.08) 50%,rgba(128,128,128,.03) 80%,rgba(255,255,255,0) 80%,rgba(255,255,255,0));background-size:var(--q-virtual-scroll-item-width,100%) var(--q-virtual-scroll-item-height,50px)}.q-table .q-virtual-scroll__padding tr{height:0!important}.q-table .q-virtual-scroll__padding td{padding:0!important}.q-virtual-scroll--horizontal{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch}.q-virtual-scroll--horizontal .q-virtual-scroll__content{display:flex;flex-direction:row;flex-wrap:nowrap}.q-virtual-scroll--horizontal .q-virtual-scroll__content,.q-virtual-scroll--horizontal .q-virtual-scroll__content>*,.q-virtual-scroll--horizontal .q-virtual-scroll__padding{flex:0 0 auto}.q-virtual-scroll--horizontal .q-virtual-scroll__padding{background:linear-gradient(to left,rgba(255,255,255,0),rgba(255,255,255,0) 20%,rgba(128,128,128,.03) 20%,rgba(128,128,128,.08) 50%,rgba(128,128,128,.03) 80%,rgba(255,255,255,0) 80%,rgba(255,255,255,0));background-size:var(--q-virtual-scroll-item-width,50px) var(--q-virtual-scroll-item-height,100%)}.q-ripple{position:absolute;top:0;left:0;width:100%;height:100%;color:inherit;border-radius:inherit;z-index:0;pointer-events:none;overflow:hidden;contain:strict}.q-ripple__inner{position:absolute;top:0;left:0;opacity:0;color:inherit;border-radius:50%;background:currentColor;pointer-events:none;will-change:transform,opacity}.q-ripple__inner--enter{transition:transform 225ms cubic-bezier(.4, 0, .2, 1),opacity .1s cubic-bezier(.4, 0, .2, 1)}.q-ripple__inner--leave{transition:opacity .25s cubic-bezier(.4, 0, .2, 1)}.q-morph--internal,.q-morph--invisible{opacity:0!important;pointer-events:none!important;position:fixed!important;right:200vw!important;bottom:200vh!important}.q-bottom-sheet{padding-bottom:8px}.q-bottom-sheet__avatar{border-radius:50%}.q-bottom-sheet--list{width:400px}.q-bottom-sheet--list .q-icon,.q-bottom-sheet--list img{font-size:24px;width:24px;height:24px}.q-bottom-sheet--grid{width:700px}.q-bottom-sheet--grid .q-bottom-sheet__item{padding:8px;text-align:center;min-width:100px}.q-bottom-sheet--grid .q-bottom-sheet__empty-icon,.q-bottom-sheet--grid .q-icon,.q-bottom-sheet--grid img{font-size:48px;width:48px;height:48px;margin-bottom:8px}.q-bottom-sheet--grid .q-separator{margin:12px 0}.q-bottom-sheet__item{flex:0 0 33.3333%}@media (min-width:600px){.q-bottom-sheet__item{flex:0 0 25%}}.q-dialog-plugin{width:400px}.q-dialog-plugin__form{max-height:50vh}.q-dialog-plugin .q-card__section+.q-card__section{padding-top:0}.q-dialog-plugin--progress{text-align:center}.q-loading{color:#000;position:fixed!important}.q-loading__backdrop{position:fixed;top:0;right:0;bottom:0;left:0;opacity:.5;z-index:-1;background-color:#000;transition:background-color .28s}.q-loading__box{border-radius:4px;padding:18px;color:#fff;max-width:450px}.q-loading__message{margin:40px 20px 0;text-align:center}.q-notifications__list{z-index:9500;pointer-events:none;left:0;right:0;margin-bottom:10px;position:relative}.q-notifications__list--center{top:0;bottom:0}.q-notifications__list--top{top:0}.q-notifications__list--bottom{bottom:0}body.q-ios-padding .q-notifications__list--center,body.q-ios-padding .q-notifications__list--top{top:20px;top:env(safe-area-inset-top)}body.q-ios-padding .q-notifications__list--bottom,body.q-ios-padding .q-notifications__list--center{bottom:env(safe-area-inset-bottom)}.q-notification{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;pointer-events:all;display:inline-flex;margin:10px 10px 0;transition:transform 1s,opacity 1s;z-index:9500;flex-shrink:0;max-width:95vw;background:#323232;color:#fff;font-size:14px}.q-notification__icon{font-size:24px;flex:0 0 1em}.q-notification__icon--additional{margin-right:16px}.q-notification__avatar{font-size:32px}.q-notification__avatar--additional{margin-right:8px}.q-notification__spinner{font-size:32px}.q-notification__spinner--additional{margin-right:8px}.q-notification__message{padding:8px 0}.q-notification__caption{font-size:.9em;opacity:.7}.q-notification__actions{color:var(--q-primary)}.q-notification__badge{animation:q-notif-badge .42s;padding:4px 8px;position:absolute;box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12);background-color:var(--q-negative);color:#fff;border-radius:4px;font-size:12px;line-height:12px}.q-notification__badge--top-left,.q-notification__badge--top-right{top:-6px}.q-notification__badge--bottom-left,.q-notification__badge--bottom-right{bottom:-6px}.q-notification__badge--bottom-left,.q-notification__badge--top-left{left:-22px}.q-notification__badge--bottom-right,.q-notification__badge--top-right{right:-22px}.q-notification__progress{z-index:-1;position:absolute;height:3px;bottom:0;left:-10px;right:-10px;animation:q-notif-progress linear;background:currentColor;opacity:.3;border-radius:4px 4px 0 0;transform-origin:0 50%;transform:scaleX(0)}.q-notification--standard{padding:0 16px;min-height:48px}.q-notification--standard .q-notification__actions{padding:6px 0 6px 8px;margin-right:-8px}.q-notification--multi-line{min-height:68px;padding:8px 16px}.q-notification--multi-line .q-notification__badge--top-left,.q-notification--multi-line .q-notification__badge--top-right{top:-15px}.q-notification--multi-line .q-notification__badge--bottom-left,.q-notification--multi-line .q-notification__badge--bottom-right{bottom:-15px}.q-notification--multi-line .q-notification__progress{bottom:-8px}.q-notification--multi-line .q-notification__actions{padding:0}.q-notification--multi-line .q-notification__actions--with-media{padding-left:25px}.q-notification--top-enter-from,.q-notification--top-leave-to,.q-notification--top-left-enter-from,.q-notification--top-left-leave-to,.q-notification--top-right-enter-from,.q-notification--top-right-leave-to{opacity:0;transform:translateY(-50px);z-index:9499}.q-notification--center-enter-from,.q-notification--center-leave-to,.q-notification--left-enter-from,.q-notification--left-leave-to,.q-notification--right-enter-from,.q-notification--right-leave-to{opacity:0;transform:rotateX(90deg);z-index:9499}.q-notification--bottom-enter-from,.q-notification--bottom-leave-to,.q-notification--bottom-left-enter-from,.q-notification--bottom-left-leave-to,.q-notification--bottom-right-enter-from,.q-notification--bottom-right-leave-to{opacity:0;transform:translateY(50px);z-index:9499}.q-notification--bottom-leave-active,.q-notification--bottom-left-leave-active,.q-notification--bottom-right-leave-active,.q-notification--center-leave-active,.q-notification--left-leave-active,.q-notification--right-leave-active,.q-notification--top-leave-active,.q-notification--top-left-leave-active,.q-notification--top-right-leave-active{position:absolute;z-index:9499;margin-left:0;margin-right:0}.q-notification--center-leave-active,.q-notification--top-leave-active{top:0}.q-notification--bottom-leave-active,.q-notification--bottom-left-leave-active,.q-notification--bottom-right-leave-active{bottom:0}@media (min-width:600px){.q-notification{max-width:65vw}}@keyframes q-notif-badge{15%{transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}}@keyframes q-notif-progress{0%{transform:scaleX(1)}100%{transform:scaleX(0)}}:root{--animate-duration:0.3s;--animate-delay:0.3s;--animate-repeat:1}.animated{animation-duration:var(--animate-duration);animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}.animated.repeat-1{animation-iteration-count:var(--animate-repeat)}.animated.repeat-2{animation-iteration-count:calc(var(--animate-repeat) * 2)}.animated.repeat-3{animation-iteration-count:calc(var(--animate-repeat) * 3)}.animated.delay-1s{animation-delay:var(--animate-delay)}.animated.delay-2s{animation-delay:calc(var(--animate-delay) * 2)}.animated.delay-3s{animation-delay:calc(var(--animate-delay) * 3)}.animated.delay-4s{animation-delay:calc(var(--animate-delay) * 4)}.animated.delay-5s{animation-delay:calc(var(--animate-delay) * 5)}.animated.faster{animation-duration:calc(var(--animate-duration) / 2)}.animated.fast{animation-duration:calc(var(--animate-duration) * .8)}.animated.slow{animation-duration:calc(var(--animate-duration) * 2)}.animated.slower{animation-duration:calc(var(--animate-duration) * 3)}@media print,(prefers-reduced-motion:reduce){.animated{animation-duration:1ms!important;transition-duration:1ms!important;animation-iteration-count:1!important}.animated[class*=Out]{opacity:0}}.q-animate--scale{animation:q-scale .15s;animation-timing-function:cubic-bezier(0.25,0.8,0.25,1)}@keyframes q-scale{0%{transform:scale(1)}50%{transform:scale(1.04)}100%{transform:scale(1)}}.q-animate--fade{animation:q-fade .2s}@keyframes q-fade{0%{opacity:0}100%{opacity:1}}:root{--q-primary:#1976D2;--q-secondary:#26A69A;--q-accent:#9C27B0;--q-positive:#21BA45;--q-negative:#C10015;--q-info:#31CCEC;--q-warning:#F2C037;--q-dark:#1d1d1d;--q-dark-page:#121212}.text-dark{color:var(--q-dark)!important}.bg-dark{background:var(--q-dark)!important}.text-primary{color:var(--q-primary)!important}.bg-primary{background:var(--q-primary)!important}.text-secondary{color:var(--q-secondary)!important}.bg-secondary{background:var(--q-secondary)!important}.text-accent{color:var(--q-accent)!important}.bg-accent{background:var(--q-accent)!important}.text-positive{color:var(--q-positive)!important}.bg-positive{background:var(--q-positive)!important}.text-negative{color:var(--q-negative)!important}.bg-negative{background:var(--q-negative)!important}.text-info{color:var(--q-info)!important}.bg-info{background:var(--q-info)!important}.text-warning{color:var(--q-warning)!important}.bg-warning{background:var(--q-warning)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.text-transparent{color:transparent!important}.bg-transparent{background:0 0!important}.text-separator{color:rgba(0,0,0,.12)!important}.bg-separator{background:rgba(0,0,0,.12)!important}.text-dark-separator{color:rgba(255,255,255,.28)!important}.bg-dark-separator{background:rgba(255,255,255,.28)!important}.text-red{color:#f44336!important}.text-red-1{color:#ffebee!important}.text-red-2{color:#ffcdd2!important}.text-red-3{color:#ef9a9a!important}.text-red-4{color:#e57373!important}.text-red-5{color:#ef5350!important}.text-red-6{color:#f44336!important}.text-red-7{color:#e53935!important}.text-red-8{color:#d32f2f!important}.text-red-9{color:#c62828!important}.text-red-10{color:#b71c1c!important}.text-red-11{color:#ff8a80!important}.text-red-12{color:#ff5252!important}.text-red-13{color:#ff1744!important}.text-red-14{color:#d50000!important}.text-pink{color:#e91e63!important}.text-pink-1{color:#fce4ec!important}.text-pink-2{color:#f8bbd0!important}.text-pink-3{color:#f48fb1!important}.text-pink-4{color:#f06292!important}.text-pink-5{color:#ec407a!important}.text-pink-6{color:#e91e63!important}.text-pink-7{color:#d81b60!important}.text-pink-8{color:#c2185b!important}.text-pink-9{color:#ad1457!important}.text-pink-10{color:#880e4f!important}.text-pink-11{color:#ff80ab!important}.text-pink-12{color:#ff4081!important}.text-pink-13{color:#f50057!important}.text-pink-14{color:#c51162!important}.text-purple{color:#9c27b0!important}.text-purple-1{color:#f3e5f5!important}.text-purple-2{color:#e1bee7!important}.text-purple-3{color:#ce93d8!important}.text-purple-4{color:#ba68c8!important}.text-purple-5{color:#ab47bc!important}.text-purple-6{color:#9c27b0!important}.text-purple-7{color:#8e24aa!important}.text-purple-8{color:#7b1fa2!important}.text-purple-9{color:#6a1b9a!important}.text-purple-10{color:#4a148c!important}.text-purple-11{color:#ea80fc!important}.text-purple-12{color:#e040fb!important}.text-purple-13{color:#d500f9!important}.text-purple-14{color:#a0f!important}.text-deep-purple{color:#673ab7!important}.text-deep-purple-1{color:#ede7f6!important}.text-deep-purple-2{color:#d1c4e9!important}.text-deep-purple-3{color:#b39ddb!important}.text-deep-purple-4{color:#9575cd!important}.text-deep-purple-5{color:#7e57c2!important}.text-deep-purple-6{color:#673ab7!important}.text-deep-purple-7{color:#5e35b1!important}.text-deep-purple-8{color:#512da8!important}.text-deep-purple-9{color:#4527a0!important}.text-deep-purple-10{color:#311b92!important}.text-deep-purple-11{color:#b388ff!important}.text-deep-purple-12{color:#7c4dff!important}.text-deep-purple-13{color:#651fff!important}.text-deep-purple-14{color:#6200ea!important}.text-indigo{color:#3f51b5!important}.text-indigo-1{color:#e8eaf6!important}.text-indigo-2{color:#c5cae9!important}.text-indigo-3{color:#9fa8da!important}.text-indigo-4{color:#7986cb!important}.text-indigo-5{color:#5c6bc0!important}.text-indigo-6{color:#3f51b5!important}.text-indigo-7{color:#3949ab!important}.text-indigo-8{color:#303f9f!important}.text-indigo-9{color:#283593!important}.text-indigo-10{color:#1a237e!important}.text-indigo-11{color:#8c9eff!important}.text-indigo-12{color:#536dfe!important}.text-indigo-13{color:#3d5afe!important}.text-indigo-14{color:#304ffe!important}.text-blue{color:#2196f3!important}.text-blue-1{color:#e3f2fd!important}.text-blue-2{color:#bbdefb!important}.text-blue-3{color:#90caf9!important}.text-blue-4{color:#64b5f6!important}.text-blue-5{color:#42a5f5!important}.text-blue-6{color:#2196f3!important}.text-blue-7{color:#1e88e5!important}.text-blue-8{color:#1976d2!important}.text-blue-9{color:#1565c0!important}.text-blue-10{color:#0d47a1!important}.text-blue-11{color:#82b1ff!important}.text-blue-12{color:#448aff!important}.text-blue-13{color:#2979ff!important}.text-blue-14{color:#2962ff!important}.text-light-blue{color:#03a9f4!important}.text-light-blue-1{color:#e1f5fe!important}.text-light-blue-2{color:#b3e5fc!important}.text-light-blue-3{color:#81d4fa!important}.text-light-blue-4{color:#4fc3f7!important}.text-light-blue-5{color:#29b6f6!important}.text-light-blue-6{color:#03a9f4!important}.text-light-blue-7{color:#039be5!important}.text-light-blue-8{color:#0288d1!important}.text-light-blue-9{color:#0277bd!important}.text-light-blue-10{color:#01579b!important}.text-light-blue-11{color:#80d8ff!important}.text-light-blue-12{color:#40c4ff!important}.text-light-blue-13{color:#00b0ff!important}.text-light-blue-14{color:#0091ea!important}.text-cyan{color:#00bcd4!important}.text-cyan-1{color:#e0f7fa!important}.text-cyan-2{color:#b2ebf2!important}.text-cyan-3{color:#80deea!important}.text-cyan-4{color:#4dd0e1!important}.text-cyan-5{color:#26c6da!important}.text-cyan-6{color:#00bcd4!important}.text-cyan-7{color:#00acc1!important}.text-cyan-8{color:#0097a7!important}.text-cyan-9{color:#00838f!important}.text-cyan-10{color:#006064!important}.text-cyan-11{color:#84ffff!important}.text-cyan-12{color:#18ffff!important}.text-cyan-13{color:#00e5ff!important}.text-cyan-14{color:#00b8d4!important}.text-teal{color:#009688!important}.text-teal-1{color:#e0f2f1!important}.text-teal-2{color:#b2dfdb!important}.text-teal-3{color:#80cbc4!important}.text-teal-4{color:#4db6ac!important}.text-teal-5{color:#26a69a!important}.text-teal-6{color:#009688!important}.text-teal-7{color:#00897b!important}.text-teal-8{color:#00796b!important}.text-teal-9{color:#00695c!important}.text-teal-10{color:#004d40!important}.text-teal-11{color:#a7ffeb!important}.text-teal-12{color:#64ffda!important}.text-teal-13{color:#1de9b6!important}.text-teal-14{color:#00bfa5!important}.text-green{color:#4caf50!important}.text-green-1{color:#e8f5e9!important}.text-green-2{color:#c8e6c9!important}.text-green-3{color:#a5d6a7!important}.text-green-4{color:#81c784!important}.text-green-5{color:#66bb6a!important}.text-green-6{color:#4caf50!important}.text-green-7{color:#43a047!important}.text-green-8{color:#388e3c!important}.text-green-9{color:#2e7d32!important}.text-green-10{color:#1b5e20!important}.text-green-11{color:#b9f6ca!important}.text-green-12{color:#69f0ae!important}.text-green-13{color:#00e676!important}.text-green-14{color:#00c853!important}.text-light-green{color:#8bc34a!important}.text-light-green-1{color:#f1f8e9!important}.text-light-green-2{color:#dcedc8!important}.text-light-green-3{color:#c5e1a5!important}.text-light-green-4{color:#aed581!important}.text-light-green-5{color:#9ccc65!important}.text-light-green-6{color:#8bc34a!important}.text-light-green-7{color:#7cb342!important}.text-light-green-8{color:#689f38!important}.text-light-green-9{color:#558b2f!important}.text-light-green-10{color:#33691e!important}.text-light-green-11{color:#ccff90!important}.text-light-green-12{color:#b2ff59!important}.text-light-green-13{color:#76ff03!important}.text-light-green-14{color:#64dd17!important}.text-lime{color:#cddc39!important}.text-lime-1{color:#f9fbe7!important}.text-lime-2{color:#f0f4c3!important}.text-lime-3{color:#e6ee9c!important}.text-lime-4{color:#dce775!important}.text-lime-5{color:#d4e157!important}.text-lime-6{color:#cddc39!important}.text-lime-7{color:#c0ca33!important}.text-lime-8{color:#afb42b!important}.text-lime-9{color:#9e9d24!important}.text-lime-10{color:#827717!important}.text-lime-11{color:#f4ff81!important}.text-lime-12{color:#eeff41!important}.text-lime-13{color:#c6ff00!important}.text-lime-14{color:#aeea00!important}.text-yellow{color:#ffeb3b!important}.text-yellow-1{color:#fffde7!important}.text-yellow-2{color:#fff9c4!important}.text-yellow-3{color:#fff59d!important}.text-yellow-4{color:#fff176!important}.text-yellow-5{color:#ffee58!important}.text-yellow-6{color:#ffeb3b!important}.text-yellow-7{color:#fdd835!important}.text-yellow-8{color:#fbc02d!important}.text-yellow-9{color:#f9a825!important}.text-yellow-10{color:#f57f17!important}.text-yellow-11{color:#ffff8d!important}.text-yellow-12{color:#ff0!important}.text-yellow-13{color:#ffea00!important}.text-yellow-14{color:#ffd600!important}.text-amber{color:#ffc107!important}.text-amber-1{color:#fff8e1!important}.text-amber-2{color:#ffecb3!important}.text-amber-3{color:#ffe082!important}.text-amber-4{color:#ffd54f!important}.text-amber-5{color:#ffca28!important}.text-amber-6{color:#ffc107!important}.text-amber-7{color:#ffb300!important}.text-amber-8{color:#ffa000!important}.text-amber-9{color:#ff8f00!important}.text-amber-10{color:#ff6f00!important}.text-amber-11{color:#ffe57f!important}.text-amber-12{color:#ffd740!important}.text-amber-13{color:#ffc400!important}.text-amber-14{color:#ffab00!important}.text-orange{color:#ff9800!important}.text-orange-1{color:#fff3e0!important}.text-orange-2{color:#ffe0b2!important}.text-orange-3{color:#ffcc80!important}.text-orange-4{color:#ffb74d!important}.text-orange-5{color:#ffa726!important}.text-orange-6{color:#ff9800!important}.text-orange-7{color:#fb8c00!important}.text-orange-8{color:#f57c00!important}.text-orange-9{color:#ef6c00!important}.text-orange-10{color:#e65100!important}.text-orange-11{color:#ffd180!important}.text-orange-12{color:#ffab40!important}.text-orange-13{color:#ff9100!important}.text-orange-14{color:#ff6d00!important}.text-deep-orange{color:#ff5722!important}.text-deep-orange-1{color:#fbe9e7!important}.text-deep-orange-2{color:#ffccbc!important}.text-deep-orange-3{color:#ffab91!important}.text-deep-orange-4{color:#ff8a65!important}.text-deep-orange-5{color:#ff7043!important}.text-deep-orange-6{color:#ff5722!important}.text-deep-orange-7{color:#f4511e!important}.text-deep-orange-8{color:#e64a19!important}.text-deep-orange-9{color:#d84315!important}.text-deep-orange-10{color:#bf360c!important}.text-deep-orange-11{color:#ff9e80!important}.text-deep-orange-12{color:#ff6e40!important}.text-deep-orange-13{color:#ff3d00!important}.text-deep-orange-14{color:#dd2c00!important}.text-brown{color:#795548!important}.text-brown-1{color:#efebe9!important}.text-brown-2{color:#d7ccc8!important}.text-brown-3{color:#bcaaa4!important}.text-brown-4{color:#a1887f!important}.text-brown-5{color:#8d6e63!important}.text-brown-6{color:#795548!important}.text-brown-7{color:#6d4c41!important}.text-brown-8{color:#5d4037!important}.text-brown-9{color:#4e342e!important}.text-brown-10{color:#3e2723!important}.text-brown-11{color:#d7ccc8!important}.text-brown-12{color:#bcaaa4!important}.text-brown-13{color:#8d6e63!important}.text-brown-14{color:#5d4037!important}.text-grey{color:#9e9e9e!important}.text-grey-1{color:#fafafa!important}.text-grey-2{color:#f5f5f5!important}.text-grey-3{color:#eee!important}.text-grey-4{color:#e0e0e0!important}.text-grey-5{color:#bdbdbd!important}.text-grey-6{color:#9e9e9e!important}.text-grey-7{color:#757575!important}.text-grey-8{color:#616161!important}.text-grey-9{color:#424242!important}.text-grey-10{color:#212121!important}.text-grey-11{color:#f5f5f5!important}.text-grey-12{color:#eee!important}.text-grey-13{color:#bdbdbd!important}.text-grey-14{color:#616161!important}.text-blue-grey{color:#607d8b!important}.text-blue-grey-1{color:#eceff1!important}.text-blue-grey-2{color:#cfd8dc!important}.text-blue-grey-3{color:#b0bec5!important}.text-blue-grey-4{color:#90a4ae!important}.text-blue-grey-5{color:#78909c!important}.text-blue-grey-6{color:#607d8b!important}.text-blue-grey-7{color:#546e7a!important}.text-blue-grey-8{color:#455a64!important}.text-blue-grey-9{color:#37474f!important}.text-blue-grey-10{color:#263238!important}.text-blue-grey-11{color:#cfd8dc!important}.text-blue-grey-12{color:#b0bec5!important}.text-blue-grey-13{color:#78909c!important}.text-blue-grey-14{color:#455a64!important}.bg-red{background:#f44336!important}.bg-red-1{background:#ffebee!important}.bg-red-2{background:#ffcdd2!important}.bg-red-3{background:#ef9a9a!important}.bg-red-4{background:#e57373!important}.bg-red-5{background:#ef5350!important}.bg-red-6{background:#f44336!important}.bg-red-7{background:#e53935!important}.bg-red-8{background:#d32f2f!important}.bg-red-9{background:#c62828!important}.bg-red-10{background:#b71c1c!important}.bg-red-11{background:#ff8a80!important}.bg-red-12{background:#ff5252!important}.bg-red-13{background:#ff1744!important}.bg-red-14{background:#d50000!important}.bg-pink{background:#e91e63!important}.bg-pink-1{background:#fce4ec!important}.bg-pink-2{background:#f8bbd0!important}.bg-pink-3{background:#f48fb1!important}.bg-pink-4{background:#f06292!important}.bg-pink-5{background:#ec407a!important}.bg-pink-6{background:#e91e63!important}.bg-pink-7{background:#d81b60!important}.bg-pink-8{background:#c2185b!important}.bg-pink-9{background:#ad1457!important}.bg-pink-10{background:#880e4f!important}.bg-pink-11{background:#ff80ab!important}.bg-pink-12{background:#ff4081!important}.bg-pink-13{background:#f50057!important}.bg-pink-14{background:#c51162!important}.bg-purple{background:#9c27b0!important}.bg-purple-1{background:#f3e5f5!important}.bg-purple-2{background:#e1bee7!important}.bg-purple-3{background:#ce93d8!important}.bg-purple-4{background:#ba68c8!important}.bg-purple-5{background:#ab47bc!important}.bg-purple-6{background:#9c27b0!important}.bg-purple-7{background:#8e24aa!important}.bg-purple-8{background:#7b1fa2!important}.bg-purple-9{background:#6a1b9a!important}.bg-purple-10{background:#4a148c!important}.bg-purple-11{background:#ea80fc!important}.bg-purple-12{background:#e040fb!important}.bg-purple-13{background:#d500f9!important}.bg-purple-14{background:#a0f!important}.bg-deep-purple{background:#673ab7!important}.bg-deep-purple-1{background:#ede7f6!important}.bg-deep-purple-2{background:#d1c4e9!important}.bg-deep-purple-3{background:#b39ddb!important}.bg-deep-purple-4{background:#9575cd!important}.bg-deep-purple-5{background:#7e57c2!important}.bg-deep-purple-6{background:#673ab7!important}.bg-deep-purple-7{background:#5e35b1!important}.bg-deep-purple-8{background:#512da8!important}.bg-deep-purple-9{background:#4527a0!important}.bg-deep-purple-10{background:#311b92!important}.bg-deep-purple-11{background:#b388ff!important}.bg-deep-purple-12{background:#7c4dff!important}.bg-deep-purple-13{background:#651fff!important}.bg-deep-purple-14{background:#6200ea!important}.bg-indigo{background:#3f51b5!important}.bg-indigo-1{background:#e8eaf6!important}.bg-indigo-2{background:#c5cae9!important}.bg-indigo-3{background:#9fa8da!important}.bg-indigo-4{background:#7986cb!important}.bg-indigo-5{background:#5c6bc0!important}.bg-indigo-6{background:#3f51b5!important}.bg-indigo-7{background:#3949ab!important}.bg-indigo-8{background:#303f9f!important}.bg-indigo-9{background:#283593!important}.bg-indigo-10{background:#1a237e!important}.bg-indigo-11{background:#8c9eff!important}.bg-indigo-12{background:#536dfe!important}.bg-indigo-13{background:#3d5afe!important}.bg-indigo-14{background:#304ffe!important}.bg-blue{background:#2196f3!important}.bg-blue-1{background:#e3f2fd!important}.bg-blue-2{background:#bbdefb!important}.bg-blue-3{background:#90caf9!important}.bg-blue-4{background:#64b5f6!important}.bg-blue-5{background:#42a5f5!important}.bg-blue-6{background:#2196f3!important}.bg-blue-7{background:#1e88e5!important}.bg-blue-8{background:#1976d2!important}.bg-blue-9{background:#1565c0!important}.bg-blue-10{background:#0d47a1!important}.bg-blue-11{background:#82b1ff!important}.bg-blue-12{background:#448aff!important}.bg-blue-13{background:#2979ff!important}.bg-blue-14{background:#2962ff!important}.bg-light-blue{background:#03a9f4!important}.bg-light-blue-1{background:#e1f5fe!important}.bg-light-blue-2{background:#b3e5fc!important}.bg-light-blue-3{background:#81d4fa!important}.bg-light-blue-4{background:#4fc3f7!important}.bg-light-blue-5{background:#29b6f6!important}.bg-light-blue-6{background:#03a9f4!important}.bg-light-blue-7{background:#039be5!important}.bg-light-blue-8{background:#0288d1!important}.bg-light-blue-9{background:#0277bd!important}.bg-light-blue-10{background:#01579b!important}.bg-light-blue-11{background:#80d8ff!important}.bg-light-blue-12{background:#40c4ff!important}.bg-light-blue-13{background:#00b0ff!important}.bg-light-blue-14{background:#0091ea!important}.bg-cyan{background:#00bcd4!important}.bg-cyan-1{background:#e0f7fa!important}.bg-cyan-2{background:#b2ebf2!important}.bg-cyan-3{background:#80deea!important}.bg-cyan-4{background:#4dd0e1!important}.bg-cyan-5{background:#26c6da!important}.bg-cyan-6{background:#00bcd4!important}.bg-cyan-7{background:#00acc1!important}.bg-cyan-8{background:#0097a7!important}.bg-cyan-9{background:#00838f!important}.bg-cyan-10{background:#006064!important}.bg-cyan-11{background:#84ffff!important}.bg-cyan-12{background:#18ffff!important}.bg-cyan-13{background:#00e5ff!important}.bg-cyan-14{background:#00b8d4!important}.bg-teal{background:#009688!important}.bg-teal-1{background:#e0f2f1!important}.bg-teal-2{background:#b2dfdb!important}.bg-teal-3{background:#80cbc4!important}.bg-teal-4{background:#4db6ac!important}.bg-teal-5{background:#26a69a!important}.bg-teal-6{background:#009688!important}.bg-teal-7{background:#00897b!important}.bg-teal-8{background:#00796b!important}.bg-teal-9{background:#00695c!important}.bg-teal-10{background:#004d40!important}.bg-teal-11{background:#a7ffeb!important}.bg-teal-12{background:#64ffda!important}.bg-teal-13{background:#1de9b6!important}.bg-teal-14{background:#00bfa5!important}.bg-green{background:#4caf50!important}.bg-green-1{background:#e8f5e9!important}.bg-green-2{background:#c8e6c9!important}.bg-green-3{background:#a5d6a7!important}.bg-green-4{background:#81c784!important}.bg-green-5{background:#66bb6a!important}.bg-green-6{background:#4caf50!important}.bg-green-7{background:#43a047!important}.bg-green-8{background:#388e3c!important}.bg-green-9{background:#2e7d32!important}.bg-green-10{background:#1b5e20!important}.bg-green-11{background:#b9f6ca!important}.bg-green-12{background:#69f0ae!important}.bg-green-13{background:#00e676!important}.bg-green-14{background:#00c853!important}.bg-light-green{background:#8bc34a!important}.bg-light-green-1{background:#f1f8e9!important}.bg-light-green-2{background:#dcedc8!important}.bg-light-green-3{background:#c5e1a5!important}.bg-light-green-4{background:#aed581!important}.bg-light-green-5{background:#9ccc65!important}.bg-light-green-6{background:#8bc34a!important}.bg-light-green-7{background:#7cb342!important}.bg-light-green-8{background:#689f38!important}.bg-light-green-9{background:#558b2f!important}.bg-light-green-10{background:#33691e!important}.bg-light-green-11{background:#ccff90!important}.bg-light-green-12{background:#b2ff59!important}.bg-light-green-13{background:#76ff03!important}.bg-light-green-14{background:#64dd17!important}.bg-lime{background:#cddc39!important}.bg-lime-1{background:#f9fbe7!important}.bg-lime-2{background:#f0f4c3!important}.bg-lime-3{background:#e6ee9c!important}.bg-lime-4{background:#dce775!important}.bg-lime-5{background:#d4e157!important}.bg-lime-6{background:#cddc39!important}.bg-lime-7{background:#c0ca33!important}.bg-lime-8{background:#afb42b!important}.bg-lime-9{background:#9e9d24!important}.bg-lime-10{background:#827717!important}.bg-lime-11{background:#f4ff81!important}.bg-lime-12{background:#eeff41!important}.bg-lime-13{background:#c6ff00!important}.bg-lime-14{background:#aeea00!important}.bg-yellow{background:#ffeb3b!important}.bg-yellow-1{background:#fffde7!important}.bg-yellow-2{background:#fff9c4!important}.bg-yellow-3{background:#fff59d!important}.bg-yellow-4{background:#fff176!important}.bg-yellow-5{background:#ffee58!important}.bg-yellow-6{background:#ffeb3b!important}.bg-yellow-7{background:#fdd835!important}.bg-yellow-8{background:#fbc02d!important}.bg-yellow-9{background:#f9a825!important}.bg-yellow-10{background:#f57f17!important}.bg-yellow-11{background:#ffff8d!important}.bg-yellow-12{background:#ff0!important}.bg-yellow-13{background:#ffea00!important}.bg-yellow-14{background:#ffd600!important}.bg-amber{background:#ffc107!important}.bg-amber-1{background:#fff8e1!important}.bg-amber-2{background:#ffecb3!important}.bg-amber-3{background:#ffe082!important}.bg-amber-4{background:#ffd54f!important}.bg-amber-5{background:#ffca28!important}.bg-amber-6{background:#ffc107!important}.bg-amber-7{background:#ffb300!important}.bg-amber-8{background:#ffa000!important}.bg-amber-9{background:#ff8f00!important}.bg-amber-10{background:#ff6f00!important}.bg-amber-11{background:#ffe57f!important}.bg-amber-12{background:#ffd740!important}.bg-amber-13{background:#ffc400!important}.bg-amber-14{background:#ffab00!important}.bg-orange{background:#ff9800!important}.bg-orange-1{background:#fff3e0!important}.bg-orange-2{background:#ffe0b2!important}.bg-orange-3{background:#ffcc80!important}.bg-orange-4{background:#ffb74d!important}.bg-orange-5{background:#ffa726!important}.bg-orange-6{background:#ff9800!important}.bg-orange-7{background:#fb8c00!important}.bg-orange-8{background:#f57c00!important}.bg-orange-9{background:#ef6c00!important}.bg-orange-10{background:#e65100!important}.bg-orange-11{background:#ffd180!important}.bg-orange-12{background:#ffab40!important}.bg-orange-13{background:#ff9100!important}.bg-orange-14{background:#ff6d00!important}.bg-deep-orange{background:#ff5722!important}.bg-deep-orange-1{background:#fbe9e7!important}.bg-deep-orange-2{background:#ffccbc!important}.bg-deep-orange-3{background:#ffab91!important}.bg-deep-orange-4{background:#ff8a65!important}.bg-deep-orange-5{background:#ff7043!important}.bg-deep-orange-6{background:#ff5722!important}.bg-deep-orange-7{background:#f4511e!important}.bg-deep-orange-8{background:#e64a19!important}.bg-deep-orange-9{background:#d84315!important}.bg-deep-orange-10{background:#bf360c!important}.bg-deep-orange-11{background:#ff9e80!important}.bg-deep-orange-12{background:#ff6e40!important}.bg-deep-orange-13{background:#ff3d00!important}.bg-deep-orange-14{background:#dd2c00!important}.bg-brown{background:#795548!important}.bg-brown-1{background:#efebe9!important}.bg-brown-2{background:#d7ccc8!important}.bg-brown-3{background:#bcaaa4!important}.bg-brown-4{background:#a1887f!important}.bg-brown-5{background:#8d6e63!important}.bg-brown-6{background:#795548!important}.bg-brown-7{background:#6d4c41!important}.bg-brown-8{background:#5d4037!important}.bg-brown-9{background:#4e342e!important}.bg-brown-10{background:#3e2723!important}.bg-brown-11{background:#d7ccc8!important}.bg-brown-12{background:#bcaaa4!important}.bg-brown-13{background:#8d6e63!important}.bg-brown-14{background:#5d4037!important}.bg-grey{background:#9e9e9e!important}.bg-grey-1{background:#fafafa!important}.bg-grey-2{background:#f5f5f5!important}.bg-grey-3{background:#eee!important}.bg-grey-4{background:#e0e0e0!important}.bg-grey-5{background:#bdbdbd!important}.bg-grey-6{background:#9e9e9e!important}.bg-grey-7{background:#757575!important}.bg-grey-8{background:#616161!important}.bg-grey-9{background:#424242!important}.bg-grey-10{background:#212121!important}.bg-grey-11{background:#f5f5f5!important}.bg-grey-12{background:#eee!important}.bg-grey-13{background:#bdbdbd!important}.bg-grey-14{background:#616161!important}.bg-blue-grey{background:#607d8b!important}.bg-blue-grey-1{background:#eceff1!important}.bg-blue-grey-2{background:#cfd8dc!important}.bg-blue-grey-3{background:#b0bec5!important}.bg-blue-grey-4{background:#90a4ae!important}.bg-blue-grey-5{background:#78909c!important}.bg-blue-grey-6{background:#607d8b!important}.bg-blue-grey-7{background:#546e7a!important}.bg-blue-grey-8{background:#455a64!important}.bg-blue-grey-9{background:#37474f!important}.bg-blue-grey-10{background:#263238!important}.bg-blue-grey-11{background:#cfd8dc!important}.bg-blue-grey-12{background:#b0bec5!important}.bg-blue-grey-13{background:#78909c!important}.bg-blue-grey-14{background:#455a64!important}.shadow-transition{transition:box-shadow .28s cubic-bezier(.4, 0, .2, 1)!important}.shadow-1{box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12)}.shadow-up-1{box-shadow:0 -1px 3px rgba(0,0,0,.2),0 -1px 1px rgba(0,0,0,.14),0 -2px 1px -1px rgba(0,0,0,.12)}.shadow-2{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.shadow-up-2{box-shadow:0 -1px 5px rgba(0,0,0,.2),0 -2px 2px rgba(0,0,0,.14),0 -3px 1px -2px rgba(0,0,0,.12)}.shadow-3{box-shadow:0 1px 8px rgba(0,0,0,.2),0 3px 4px rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.12)}.shadow-up-3{box-shadow:0 -1px 8px rgba(0,0,0,.2),0 -3px 4px rgba(0,0,0,.14),0 -3px 3px -2px rgba(0,0,0,.12)}.shadow-4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px rgba(0,0,0,.14),0 1px 10px rgba(0,0,0,.12)}.shadow-up-4{box-shadow:0 -2px 4px -1px rgba(0,0,0,.2),0 -4px 5px rgba(0,0,0,.14),0 -1px 10px rgba(0,0,0,.12)}.shadow-5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px rgba(0,0,0,.14),0 1px 14px rgba(0,0,0,.12)}.shadow-up-5{box-shadow:0 -3px 5px -1px rgba(0,0,0,.2),0 -5px 8px rgba(0,0,0,.14),0 -1px 14px rgba(0,0,0,.12)}.shadow-6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px rgba(0,0,0,.14),0 1px 18px rgba(0,0,0,.12)}.shadow-up-6{box-shadow:0 -3px 5px -1px rgba(0,0,0,.2),0 -6px 10px rgba(0,0,0,.14),0 -1px 18px rgba(0,0,0,.12)}.shadow-7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.shadow-up-7{box-shadow:0 -4px 5px -2px rgba(0,0,0,.2),0 -7px 10px 1px rgba(0,0,0,.14),0 -2px 16px 1px rgba(0,0,0,.12)}.shadow-8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.shadow-up-8{box-shadow:0 -5px 5px -3px rgba(0,0,0,.2),0 -8px 10px 1px rgba(0,0,0,.14),0 -3px 14px 2px rgba(0,0,0,.12)}.shadow-9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.shadow-up-9{box-shadow:0 -5px 6px -3px rgba(0,0,0,.2),0 -9px 12px 1px rgba(0,0,0,.14),0 -3px 16px 2px rgba(0,0,0,.12)}.shadow-10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.shadow-up-10{box-shadow:0 -6px 6px -3px rgba(0,0,0,.2),0 -10px 14px 1px rgba(0,0,0,.14),0 -4px 18px 3px rgba(0,0,0,.12)}.shadow-11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.shadow-up-11{box-shadow:0 -6px 7px -4px rgba(0,0,0,.2),0 -11px 15px 1px rgba(0,0,0,.14),0 -4px 20px 3px rgba(0,0,0,.12)}.shadow-12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.shadow-up-12{box-shadow:0 -7px 8px -4px rgba(0,0,0,.2),0 -12px 17px 2px rgba(0,0,0,.14),0 -5px 22px 4px rgba(0,0,0,.12)}.shadow-13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.shadow-up-13{box-shadow:0 -7px 8px -4px rgba(0,0,0,.2),0 -13px 19px 2px rgba(0,0,0,.14),0 -5px 24px 4px rgba(0,0,0,.12)}.shadow-14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.shadow-up-14{box-shadow:0 -7px 9px -4px rgba(0,0,0,.2),0 -14px 21px 2px rgba(0,0,0,.14),0 -5px 26px 4px rgba(0,0,0,.12)}.shadow-15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.shadow-up-15{box-shadow:0 -8px 9px -5px rgba(0,0,0,.2),0 -15px 22px 2px rgba(0,0,0,.14),0 -6px 28px 5px rgba(0,0,0,.12)}.shadow-16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.shadow-up-16{box-shadow:0 -8px 10px -5px rgba(0,0,0,.2),0 -16px 24px 2px rgba(0,0,0,.14),0 -6px 30px 5px rgba(0,0,0,.12)}.shadow-17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.shadow-up-17{box-shadow:0 -8px 11px -5px rgba(0,0,0,.2),0 -17px 26px 2px rgba(0,0,0,.14),0 -6px 32px 5px rgba(0,0,0,.12)}.shadow-18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.shadow-up-18{box-shadow:0 -9px 11px -5px rgba(0,0,0,.2),0 -18px 28px 2px rgba(0,0,0,.14),0 -7px 34px 6px rgba(0,0,0,.12)}.shadow-19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.shadow-up-19{box-shadow:0 -9px 12px -6px rgba(0,0,0,.2),0 -19px 29px 2px rgba(0,0,0,.14),0 -7px 36px 6px rgba(0,0,0,.12)}.shadow-20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.shadow-up-20{box-shadow:0 -10px 13px -6px rgba(0,0,0,.2),0 -20px 31px 3px rgba(0,0,0,.14),0 -8px 38px 7px rgba(0,0,0,.12)}.shadow-21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.shadow-up-21{box-shadow:0 -10px 13px -6px rgba(0,0,0,.2),0 -21px 33px 3px rgba(0,0,0,.14),0 -8px 40px 7px rgba(0,0,0,.12)}.shadow-22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.shadow-up-22{box-shadow:0 -10px 14px -6px rgba(0,0,0,.2),0 -22px 35px 3px rgba(0,0,0,.14),0 -8px 42px 7px rgba(0,0,0,.12)}.shadow-23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.shadow-up-23{box-shadow:0 -11px 14px -7px rgba(0,0,0,.2),0 -23px 36px 3px rgba(0,0,0,.14),0 -9px 44px 8px rgba(0,0,0,.12)}.shadow-24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.shadow-up-24{box-shadow:0 -11px 15px -7px rgba(0,0,0,.2),0 -24px 38px 3px rgba(0,0,0,.14),0 -9px 46px 8px rgba(0,0,0,.12)}.inset-shadow{box-shadow:0 7px 9px -7px rgba(0,0,0,.7) inset}.inset-shadow-down{box-shadow:0 -7px 9px -7px rgba(0,0,0,.7) inset}body.body--dark .shadow-1{box-shadow:0 1px 3px rgba(255,255,255,.2),0 1px 1px rgba(255,255,255,.14),0 2px 1px -1px rgba(255,255,255,.12)}body.body--dark .shadow-up-1{box-shadow:0 -1px 3px rgba(255,255,255,.2),0 -1px 1px rgba(255,255,255,.14),0 -2px 1px -1px rgba(255,255,255,.12)}body.body--dark .shadow-2{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}body.body--dark .shadow-up-2{box-shadow:0 -1px 5px rgba(255,255,255,.2),0 -2px 2px rgba(255,255,255,.14),0 -3px 1px -2px rgba(255,255,255,.12)}body.body--dark .shadow-3{box-shadow:0 1px 8px rgba(255,255,255,.2),0 3px 4px rgba(255,255,255,.14),0 3px 3px -2px rgba(255,255,255,.12)}body.body--dark .shadow-up-3{box-shadow:0 -1px 8px rgba(255,255,255,.2),0 -3px 4px rgba(255,255,255,.14),0 -3px 3px -2px rgba(255,255,255,.12)}body.body--dark .shadow-4{box-shadow:0 2px 4px -1px rgba(255,255,255,.2),0 4px 5px rgba(255,255,255,.14),0 1px 10px rgba(255,255,255,.12)}body.body--dark .shadow-up-4{box-shadow:0 -2px 4px -1px rgba(255,255,255,.2),0 -4px 5px rgba(255,255,255,.14),0 -1px 10px rgba(255,255,255,.12)}body.body--dark .shadow-5{box-shadow:0 3px 5px -1px rgba(255,255,255,.2),0 5px 8px rgba(255,255,255,.14),0 1px 14px rgba(255,255,255,.12)}body.body--dark .shadow-up-5{box-shadow:0 -3px 5px -1px rgba(255,255,255,.2),0 -5px 8px rgba(255,255,255,.14),0 -1px 14px rgba(255,255,255,.12)}body.body--dark .shadow-6{box-shadow:0 3px 5px -1px rgba(255,255,255,.2),0 6px 10px rgba(255,255,255,.14),0 1px 18px rgba(255,255,255,.12)}body.body--dark .shadow-up-6{box-shadow:0 -3px 5px -1px rgba(255,255,255,.2),0 -6px 10px rgba(255,255,255,.14),0 -1px 18px rgba(255,255,255,.12)}body.body--dark .shadow-7{box-shadow:0 4px 5px -2px rgba(255,255,255,.2),0 7px 10px 1px rgba(255,255,255,.14),0 2px 16px 1px rgba(255,255,255,.12)}body.body--dark .shadow-up-7{box-shadow:0 -4px 5px -2px rgba(255,255,255,.2),0 -7px 10px 1px rgba(255,255,255,.14),0 -2px 16px 1px rgba(255,255,255,.12)}body.body--dark .shadow-8{box-shadow:0 5px 5px -3px rgba(255,255,255,.2),0 8px 10px 1px rgba(255,255,255,.14),0 3px 14px 2px rgba(255,255,255,.12)}body.body--dark .shadow-up-8{box-shadow:0 -5px 5px -3px rgba(255,255,255,.2),0 -8px 10px 1px rgba(255,255,255,.14),0 -3px 14px 2px rgba(255,255,255,.12)}body.body--dark .shadow-9{box-shadow:0 5px 6px -3px rgba(255,255,255,.2),0 9px 12px 1px rgba(255,255,255,.14),0 3px 16px 2px rgba(255,255,255,.12)}body.body--dark .shadow-up-9{box-shadow:0 -5px 6px -3px rgba(255,255,255,.2),0 -9px 12px 1px rgba(255,255,255,.14),0 -3px 16px 2px rgba(255,255,255,.12)}body.body--dark .shadow-10{box-shadow:0 6px 6px -3px rgba(255,255,255,.2),0 10px 14px 1px rgba(255,255,255,.14),0 4px 18px 3px rgba(255,255,255,.12)}body.body--dark .shadow-up-10{box-shadow:0 -6px 6px -3px rgba(255,255,255,.2),0 -10px 14px 1px rgba(255,255,255,.14),0 -4px 18px 3px rgba(255,255,255,.12)}body.body--dark .shadow-11{box-shadow:0 6px 7px -4px rgba(255,255,255,.2),0 11px 15px 1px rgba(255,255,255,.14),0 4px 20px 3px rgba(255,255,255,.12)}body.body--dark .shadow-up-11{box-shadow:0 -6px 7px -4px rgba(255,255,255,.2),0 -11px 15px 1px rgba(255,255,255,.14),0 -4px 20px 3px rgba(255,255,255,.12)}body.body--dark .shadow-12{box-shadow:0 7px 8px -4px rgba(255,255,255,.2),0 12px 17px 2px rgba(255,255,255,.14),0 5px 22px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-12{box-shadow:0 -7px 8px -4px rgba(255,255,255,.2),0 -12px 17px 2px rgba(255,255,255,.14),0 -5px 22px 4px rgba(255,255,255,.12)}body.body--dark .shadow-13{box-shadow:0 7px 8px -4px rgba(255,255,255,.2),0 13px 19px 2px rgba(255,255,255,.14),0 5px 24px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-13{box-shadow:0 -7px 8px -4px rgba(255,255,255,.2),0 -13px 19px 2px rgba(255,255,255,.14),0 -5px 24px 4px rgba(255,255,255,.12)}body.body--dark .shadow-14{box-shadow:0 7px 9px -4px rgba(255,255,255,.2),0 14px 21px 2px rgba(255,255,255,.14),0 5px 26px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-14{box-shadow:0 -7px 9px -4px rgba(255,255,255,.2),0 -14px 21px 2px rgba(255,255,255,.14),0 -5px 26px 4px rgba(255,255,255,.12)}body.body--dark .shadow-15{box-shadow:0 8px 9px -5px rgba(255,255,255,.2),0 15px 22px 2px rgba(255,255,255,.14),0 6px 28px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-15{box-shadow:0 -8px 9px -5px rgba(255,255,255,.2),0 -15px 22px 2px rgba(255,255,255,.14),0 -6px 28px 5px rgba(255,255,255,.12)}body.body--dark .shadow-16{box-shadow:0 8px 10px -5px rgba(255,255,255,.2),0 16px 24px 2px rgba(255,255,255,.14),0 6px 30px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-16{box-shadow:0 -8px 10px -5px rgba(255,255,255,.2),0 -16px 24px 2px rgba(255,255,255,.14),0 -6px 30px 5px rgba(255,255,255,.12)}body.body--dark .shadow-17{box-shadow:0 8px 11px -5px rgba(255,255,255,.2),0 17px 26px 2px rgba(255,255,255,.14),0 6px 32px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-17{box-shadow:0 -8px 11px -5px rgba(255,255,255,.2),0 -17px 26px 2px rgba(255,255,255,.14),0 -6px 32px 5px rgba(255,255,255,.12)}body.body--dark .shadow-18{box-shadow:0 9px 11px -5px rgba(255,255,255,.2),0 18px 28px 2px rgba(255,255,255,.14),0 7px 34px 6px rgba(255,255,255,.12)}body.body--dark .shadow-up-18{box-shadow:0 -9px 11px -5px rgba(255,255,255,.2),0 -18px 28px 2px rgba(255,255,255,.14),0 -7px 34px 6px rgba(255,255,255,.12)}body.body--dark .shadow-19{box-shadow:0 9px 12px -6px rgba(255,255,255,.2),0 19px 29px 2px rgba(255,255,255,.14),0 7px 36px 6px rgba(255,255,255,.12)}body.body--dark .shadow-up-19{box-shadow:0 -9px 12px -6px rgba(255,255,255,.2),0 -19px 29px 2px rgba(255,255,255,.14),0 -7px 36px 6px rgba(255,255,255,.12)}body.body--dark .shadow-20{box-shadow:0 10px 13px -6px rgba(255,255,255,.2),0 20px 31px 3px rgba(255,255,255,.14),0 8px 38px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-20{box-shadow:0 -10px 13px -6px rgba(255,255,255,.2),0 -20px 31px 3px rgba(255,255,255,.14),0 -8px 38px 7px rgba(255,255,255,.12)}body.body--dark .shadow-21{box-shadow:0 10px 13px -6px rgba(255,255,255,.2),0 21px 33px 3px rgba(255,255,255,.14),0 8px 40px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-21{box-shadow:0 -10px 13px -6px rgba(255,255,255,.2),0 -21px 33px 3px rgba(255,255,255,.14),0 -8px 40px 7px rgba(255,255,255,.12)}body.body--dark .shadow-22{box-shadow:0 10px 14px -6px rgba(255,255,255,.2),0 22px 35px 3px rgba(255,255,255,.14),0 8px 42px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-22{box-shadow:0 -10px 14px -6px rgba(255,255,255,.2),0 -22px 35px 3px rgba(255,255,255,.14),0 -8px 42px 7px rgba(255,255,255,.12)}body.body--dark .shadow-23{box-shadow:0 11px 14px -7px rgba(255,255,255,.2),0 23px 36px 3px rgba(255,255,255,.14),0 9px 44px 8px rgba(255,255,255,.12)}body.body--dark .shadow-up-23{box-shadow:0 -11px 14px -7px rgba(255,255,255,.2),0 -23px 36px 3px rgba(255,255,255,.14),0 -9px 44px 8px rgba(255,255,255,.12)}body.body--dark .shadow-24{box-shadow:0 11px 15px -7px rgba(255,255,255,.2),0 24px 38px 3px rgba(255,255,255,.14),0 9px 46px 8px rgba(255,255,255,.12)}body.body--dark .shadow-up-24{box-shadow:0 -11px 15px -7px rgba(255,255,255,.2),0 -24px 38px 3px rgba(255,255,255,.14),0 -9px 46px 8px rgba(255,255,255,.12)}body.body--dark .inset-shadow{box-shadow:0 7px 9px -7px rgba(255,255,255,.7) inset}body.body--dark .inset-shadow-down{box-shadow:0 -7px 9px -7px rgba(255,255,255,.7) inset}.no-shadow,.shadow-0{box-shadow:none!important}.z-marginals{z-index:2000}.z-notify{z-index:9500}.z-fullscreen{z-index:6000}.z-inherit{z-index:inherit!important}.column,.flex,.row{display:flex;flex-wrap:wrap}.column.inline,.flex.inline,.row.inline{display:inline-flex}.row.reverse{flex-direction:row-reverse}.column{flex-direction:column}.column.reverse{flex-direction:column-reverse}.wrap{flex-wrap:wrap}.no-wrap{flex-wrap:nowrap}.reverse-wrap{flex-wrap:wrap-reverse}.order-first{order:-10000}.order-last{order:10000}.order-none{order:0}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.flex-center,.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.flex-center,.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-center{align-content:center}.content-stretch{align-content:stretch}.content-between{align-content:space-between}.content-around{align-content:space-around}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-baseline{align-self:baseline}.self-stretch{align-self:stretch}.q-gutter-none,.q-gutter-x-none{margin-left:0}.q-gutter-none>*,.q-gutter-x-none>*{margin-left:0}.q-gutter-none,.q-gutter-y-none{margin-top:0}.q-gutter-none>*,.q-gutter-y-none>*{margin-top:0}.q-col-gutter-none,.q-col-gutter-x-none{margin-left:0}.q-col-gutter-none>*,.q-col-gutter-x-none>*{padding-left:0}.q-col-gutter-none,.q-col-gutter-y-none{margin-top:0}.q-col-gutter-none>*,.q-col-gutter-y-none>*{padding-top:0}.q-gutter-x-xs,.q-gutter-xs{margin-left:-4px}.q-gutter-x-xs>*,.q-gutter-xs>*{margin-left:4px}.q-gutter-xs,.q-gutter-y-xs{margin-top:-4px}.q-gutter-xs>*,.q-gutter-y-xs>*{margin-top:4px}.q-col-gutter-x-xs,.q-col-gutter-xs{margin-left:-4px}.q-col-gutter-x-xs>*,.q-col-gutter-xs>*{padding-left:4px}.q-col-gutter-xs,.q-col-gutter-y-xs{margin-top:-4px}.q-col-gutter-xs>*,.q-col-gutter-y-xs>*{padding-top:4px}.q-gutter-sm,.q-gutter-x-sm{margin-left:-8px}.q-gutter-sm>*,.q-gutter-x-sm>*{margin-left:8px}.q-gutter-sm,.q-gutter-y-sm{margin-top:-8px}.q-gutter-sm>*,.q-gutter-y-sm>*{margin-top:8px}.q-col-gutter-sm,.q-col-gutter-x-sm{margin-left:-8px}.q-col-gutter-sm>*,.q-col-gutter-x-sm>*{padding-left:8px}.q-col-gutter-sm,.q-col-gutter-y-sm{margin-top:-8px}.q-col-gutter-sm>*,.q-col-gutter-y-sm>*{padding-top:8px}.q-gutter-md,.q-gutter-x-md{margin-left:-16px}.q-gutter-md>*,.q-gutter-x-md>*{margin-left:16px}.q-gutter-md,.q-gutter-y-md{margin-top:-16px}.q-gutter-md>*,.q-gutter-y-md>*{margin-top:16px}.q-col-gutter-md,.q-col-gutter-x-md{margin-left:-16px}.q-col-gutter-md>*,.q-col-gutter-x-md>*{padding-left:16px}.q-col-gutter-md,.q-col-gutter-y-md{margin-top:-16px}.q-col-gutter-md>*,.q-col-gutter-y-md>*{padding-top:16px}.q-gutter-lg,.q-gutter-x-lg{margin-left:-24px}.q-gutter-lg>*,.q-gutter-x-lg>*{margin-left:24px}.q-gutter-lg,.q-gutter-y-lg{margin-top:-24px}.q-gutter-lg>*,.q-gutter-y-lg>*{margin-top:24px}.q-col-gutter-lg,.q-col-gutter-x-lg{margin-left:-24px}.q-col-gutter-lg>*,.q-col-gutter-x-lg>*{padding-left:24px}.q-col-gutter-lg,.q-col-gutter-y-lg{margin-top:-24px}.q-col-gutter-lg>*,.q-col-gutter-y-lg>*{padding-top:24px}.q-gutter-x-xl,.q-gutter-xl{margin-left:-48px}.q-gutter-x-xl>*,.q-gutter-xl>*{margin-left:48px}.q-gutter-xl,.q-gutter-y-xl{margin-top:-48px}.q-gutter-xl>*,.q-gutter-y-xl>*{margin-top:48px}.q-col-gutter-x-xl,.q-col-gutter-xl{margin-left:-48px}.q-col-gutter-x-xl>*,.q-col-gutter-xl>*{padding-left:48px}.q-col-gutter-xl,.q-col-gutter-y-xl{margin-top:-48px}.q-col-gutter-xl>*,.q-col-gutter-y-xl>*{padding-top:48px}@media (min-width:0){.flex>.col,.flex>.col-0,.flex>.col-1,.flex>.col-10,.flex>.col-11,.flex>.col-12,.flex>.col-2,.flex>.col-3,.flex>.col-4,.flex>.col-5,.flex>.col-6,.flex>.col-7,.flex>.col-8,.flex>.col-9,.flex>.col-auto,.flex>.col-grow,.flex>.col-shrink,.flex>.col-xs,.flex>.col-xs-0,.flex>.col-xs-1,.flex>.col-xs-10,.flex>.col-xs-11,.flex>.col-xs-12,.flex>.col-xs-2,.flex>.col-xs-3,.flex>.col-xs-4,.flex>.col-xs-5,.flex>.col-xs-6,.flex>.col-xs-7,.flex>.col-xs-8,.flex>.col-xs-9,.flex>.col-xs-auto,.flex>.col-xs-grow,.flex>.col-xs-shrink,.row>.col,.row>.col-0,.row>.col-1,.row>.col-10,.row>.col-11,.row>.col-12,.row>.col-2,.row>.col-3,.row>.col-4,.row>.col-5,.row>.col-6,.row>.col-7,.row>.col-8,.row>.col-9,.row>.col-auto,.row>.col-grow,.row>.col-shrink,.row>.col-xs,.row>.col-xs-0,.row>.col-xs-1,.row>.col-xs-10,.row>.col-xs-11,.row>.col-xs-12,.row>.col-xs-2,.row>.col-xs-3,.row>.col-xs-4,.row>.col-xs-5,.row>.col-xs-6,.row>.col-xs-7,.row>.col-xs-8,.row>.col-xs-9,.row>.col-xs-auto,.row>.col-xs-grow,.row>.col-xs-shrink{width:auto;min-width:0;max-width:100%}.column>.col,.column>.col-0,.column>.col-1,.column>.col-10,.column>.col-11,.column>.col-12,.column>.col-2,.column>.col-3,.column>.col-4,.column>.col-5,.column>.col-6,.column>.col-7,.column>.col-8,.column>.col-9,.column>.col-auto,.column>.col-grow,.column>.col-shrink,.column>.col-xs,.column>.col-xs-0,.column>.col-xs-1,.column>.col-xs-10,.column>.col-xs-11,.column>.col-xs-12,.column>.col-xs-2,.column>.col-xs-3,.column>.col-xs-4,.column>.col-xs-5,.column>.col-xs-6,.column>.col-xs-7,.column>.col-xs-8,.column>.col-xs-9,.column>.col-xs-auto,.column>.col-xs-grow,.column>.col-xs-shrink,.flex>.col,.flex>.col-0,.flex>.col-1,.flex>.col-10,.flex>.col-11,.flex>.col-12,.flex>.col-2,.flex>.col-3,.flex>.col-4,.flex>.col-5,.flex>.col-6,.flex>.col-7,.flex>.col-8,.flex>.col-9,.flex>.col-auto,.flex>.col-grow,.flex>.col-shrink,.flex>.col-xs,.flex>.col-xs-0,.flex>.col-xs-1,.flex>.col-xs-10,.flex>.col-xs-11,.flex>.col-xs-12,.flex>.col-xs-2,.flex>.col-xs-3,.flex>.col-xs-4,.flex>.col-xs-5,.flex>.col-xs-6,.flex>.col-xs-7,.flex>.col-xs-8,.flex>.col-xs-9,.flex>.col-xs-auto,.flex>.col-xs-grow,.flex>.col-xs-shrink{height:auto;min-height:0;max-height:100%}.col,.col-xs{flex:10000 1 0%}.col-0,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-xs-0,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-auto{flex:0 0 auto}.col-grow,.col-xs-grow{flex:1 0 auto}.col-shrink,.col-xs-shrink{flex:0 1 auto}.row>.col-0,.row>.col-xs-0{height:auto;width:0%}.row>.offset-0,.row>.offset-xs-0{margin-left:0}.column>.col-0,.column>.col-xs-0{height:0%;width:auto}.row>.col-1,.row>.col-xs-1{height:auto;width:8.3333%}.row>.offset-1,.row>.offset-xs-1{margin-left:8.3333%}.column>.col-1,.column>.col-xs-1{height:8.3333%;width:auto}.row>.col-2,.row>.col-xs-2{height:auto;width:16.6667%}.row>.offset-2,.row>.offset-xs-2{margin-left:16.6667%}.column>.col-2,.column>.col-xs-2{height:16.6667%;width:auto}.row>.col-3,.row>.col-xs-3{height:auto;width:25%}.row>.offset-3,.row>.offset-xs-3{margin-left:25%}.column>.col-3,.column>.col-xs-3{height:25%;width:auto}.row>.col-4,.row>.col-xs-4{height:auto;width:33.3333%}.row>.offset-4,.row>.offset-xs-4{margin-left:33.3333%}.column>.col-4,.column>.col-xs-4{height:33.3333%;width:auto}.row>.col-5,.row>.col-xs-5{height:auto;width:41.6667%}.row>.offset-5,.row>.offset-xs-5{margin-left:41.6667%}.column>.col-5,.column>.col-xs-5{height:41.6667%;width:auto}.row>.col-6,.row>.col-xs-6{height:auto;width:50%}.row>.offset-6,.row>.offset-xs-6{margin-left:50%}.column>.col-6,.column>.col-xs-6{height:50%;width:auto}.row>.col-7,.row>.col-xs-7{height:auto;width:58.3333%}.row>.offset-7,.row>.offset-xs-7{margin-left:58.3333%}.column>.col-7,.column>.col-xs-7{height:58.3333%;width:auto}.row>.col-8,.row>.col-xs-8{height:auto;width:66.6667%}.row>.offset-8,.row>.offset-xs-8{margin-left:66.6667%}.column>.col-8,.column>.col-xs-8{height:66.6667%;width:auto}.row>.col-9,.row>.col-xs-9{height:auto;width:75%}.row>.offset-9,.row>.offset-xs-9{margin-left:75%}.column>.col-9,.column>.col-xs-9{height:75%;width:auto}.row>.col-10,.row>.col-xs-10{height:auto;width:83.3333%}.row>.offset-10,.row>.offset-xs-10{margin-left:83.3333%}.column>.col-10,.column>.col-xs-10{height:83.3333%;width:auto}.row>.col-11,.row>.col-xs-11{height:auto;width:91.6667%}.row>.offset-11,.row>.offset-xs-11{margin-left:91.6667%}.column>.col-11,.column>.col-xs-11{height:91.6667%;width:auto}.row>.col-12,.row>.col-xs-12{height:auto;width:100%}.row>.offset-12,.row>.offset-xs-12{margin-left:100%}.column>.col-12,.column>.col-xs-12{height:100%;width:auto}.row>.col-all{height:auto;flex:0 0 100%}}@media (min-width:600px){.flex>.col-sm,.flex>.col-sm-0,.flex>.col-sm-1,.flex>.col-sm-10,.flex>.col-sm-11,.flex>.col-sm-12,.flex>.col-sm-2,.flex>.col-sm-3,.flex>.col-sm-4,.flex>.col-sm-5,.flex>.col-sm-6,.flex>.col-sm-7,.flex>.col-sm-8,.flex>.col-sm-9,.flex>.col-sm-auto,.flex>.col-sm-grow,.flex>.col-sm-shrink,.row>.col-sm,.row>.col-sm-0,.row>.col-sm-1,.row>.col-sm-10,.row>.col-sm-11,.row>.col-sm-12,.row>.col-sm-2,.row>.col-sm-3,.row>.col-sm-4,.row>.col-sm-5,.row>.col-sm-6,.row>.col-sm-7,.row>.col-sm-8,.row>.col-sm-9,.row>.col-sm-auto,.row>.col-sm-grow,.row>.col-sm-shrink{width:auto;min-width:0;max-width:100%}.column>.col-sm,.column>.col-sm-0,.column>.col-sm-1,.column>.col-sm-10,.column>.col-sm-11,.column>.col-sm-12,.column>.col-sm-2,.column>.col-sm-3,.column>.col-sm-4,.column>.col-sm-5,.column>.col-sm-6,.column>.col-sm-7,.column>.col-sm-8,.column>.col-sm-9,.column>.col-sm-auto,.column>.col-sm-grow,.column>.col-sm-shrink,.flex>.col-sm,.flex>.col-sm-0,.flex>.col-sm-1,.flex>.col-sm-10,.flex>.col-sm-11,.flex>.col-sm-12,.flex>.col-sm-2,.flex>.col-sm-3,.flex>.col-sm-4,.flex>.col-sm-5,.flex>.col-sm-6,.flex>.col-sm-7,.flex>.col-sm-8,.flex>.col-sm-9,.flex>.col-sm-auto,.flex>.col-sm-grow,.flex>.col-sm-shrink{height:auto;min-height:0;max-height:100%}.col-sm{flex:10000 1 0%}.col-sm-0,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto{flex:0 0 auto}.col-sm-grow{flex:1 0 auto}.col-sm-shrink{flex:0 1 auto}.row>.col-sm-0{height:auto;width:0%}.row>.offset-sm-0{margin-left:0}.column>.col-sm-0{height:0%;width:auto}.row>.col-sm-1{height:auto;width:8.3333%}.row>.offset-sm-1{margin-left:8.3333%}.column>.col-sm-1{height:8.3333%;width:auto}.row>.col-sm-2{height:auto;width:16.6667%}.row>.offset-sm-2{margin-left:16.6667%}.column>.col-sm-2{height:16.6667%;width:auto}.row>.col-sm-3{height:auto;width:25%}.row>.offset-sm-3{margin-left:25%}.column>.col-sm-3{height:25%;width:auto}.row>.col-sm-4{height:auto;width:33.3333%}.row>.offset-sm-4{margin-left:33.3333%}.column>.col-sm-4{height:33.3333%;width:auto}.row>.col-sm-5{height:auto;width:41.6667%}.row>.offset-sm-5{margin-left:41.6667%}.column>.col-sm-5{height:41.6667%;width:auto}.row>.col-sm-6{height:auto;width:50%}.row>.offset-sm-6{margin-left:50%}.column>.col-sm-6{height:50%;width:auto}.row>.col-sm-7{height:auto;width:58.3333%}.row>.offset-sm-7{margin-left:58.3333%}.column>.col-sm-7{height:58.3333%;width:auto}.row>.col-sm-8{height:auto;width:66.6667%}.row>.offset-sm-8{margin-left:66.6667%}.column>.col-sm-8{height:66.6667%;width:auto}.row>.col-sm-9{height:auto;width:75%}.row>.offset-sm-9{margin-left:75%}.column>.col-sm-9{height:75%;width:auto}.row>.col-sm-10{height:auto;width:83.3333%}.row>.offset-sm-10{margin-left:83.3333%}.column>.col-sm-10{height:83.3333%;width:auto}.row>.col-sm-11{height:auto;width:91.6667%}.row>.offset-sm-11{margin-left:91.6667%}.column>.col-sm-11{height:91.6667%;width:auto}.row>.col-sm-12{height:auto;width:100%}.row>.offset-sm-12{margin-left:100%}.column>.col-sm-12{height:100%;width:auto}}@media (min-width:1024px){.flex>.col-md,.flex>.col-md-0,.flex>.col-md-1,.flex>.col-md-10,.flex>.col-md-11,.flex>.col-md-12,.flex>.col-md-2,.flex>.col-md-3,.flex>.col-md-4,.flex>.col-md-5,.flex>.col-md-6,.flex>.col-md-7,.flex>.col-md-8,.flex>.col-md-9,.flex>.col-md-auto,.flex>.col-md-grow,.flex>.col-md-shrink,.row>.col-md,.row>.col-md-0,.row>.col-md-1,.row>.col-md-10,.row>.col-md-11,.row>.col-md-12,.row>.col-md-2,.row>.col-md-3,.row>.col-md-4,.row>.col-md-5,.row>.col-md-6,.row>.col-md-7,.row>.col-md-8,.row>.col-md-9,.row>.col-md-auto,.row>.col-md-grow,.row>.col-md-shrink{width:auto;min-width:0;max-width:100%}.column>.col-md,.column>.col-md-0,.column>.col-md-1,.column>.col-md-10,.column>.col-md-11,.column>.col-md-12,.column>.col-md-2,.column>.col-md-3,.column>.col-md-4,.column>.col-md-5,.column>.col-md-6,.column>.col-md-7,.column>.col-md-8,.column>.col-md-9,.column>.col-md-auto,.column>.col-md-grow,.column>.col-md-shrink,.flex>.col-md,.flex>.col-md-0,.flex>.col-md-1,.flex>.col-md-10,.flex>.col-md-11,.flex>.col-md-12,.flex>.col-md-2,.flex>.col-md-3,.flex>.col-md-4,.flex>.col-md-5,.flex>.col-md-6,.flex>.col-md-7,.flex>.col-md-8,.flex>.col-md-9,.flex>.col-md-auto,.flex>.col-md-grow,.flex>.col-md-shrink{height:auto;min-height:0;max-height:100%}.col-md{flex:10000 1 0%}.col-md-0,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto{flex:0 0 auto}.col-md-grow{flex:1 0 auto}.col-md-shrink{flex:0 1 auto}.row>.col-md-0{height:auto;width:0%}.row>.offset-md-0{margin-left:0}.column>.col-md-0{height:0%;width:auto}.row>.col-md-1{height:auto;width:8.3333%}.row>.offset-md-1{margin-left:8.3333%}.column>.col-md-1{height:8.3333%;width:auto}.row>.col-md-2{height:auto;width:16.6667%}.row>.offset-md-2{margin-left:16.6667%}.column>.col-md-2{height:16.6667%;width:auto}.row>.col-md-3{height:auto;width:25%}.row>.offset-md-3{margin-left:25%}.column>.col-md-3{height:25%;width:auto}.row>.col-md-4{height:auto;width:33.3333%}.row>.offset-md-4{margin-left:33.3333%}.column>.col-md-4{height:33.3333%;width:auto}.row>.col-md-5{height:auto;width:41.6667%}.row>.offset-md-5{margin-left:41.6667%}.column>.col-md-5{height:41.6667%;width:auto}.row>.col-md-6{height:auto;width:50%}.row>.offset-md-6{margin-left:50%}.column>.col-md-6{height:50%;width:auto}.row>.col-md-7{height:auto;width:58.3333%}.row>.offset-md-7{margin-left:58.3333%}.column>.col-md-7{height:58.3333%;width:auto}.row>.col-md-8{height:auto;width:66.6667%}.row>.offset-md-8{margin-left:66.6667%}.column>.col-md-8{height:66.6667%;width:auto}.row>.col-md-9{height:auto;width:75%}.row>.offset-md-9{margin-left:75%}.column>.col-md-9{height:75%;width:auto}.row>.col-md-10{height:auto;width:83.3333%}.row>.offset-md-10{margin-left:83.3333%}.column>.col-md-10{height:83.3333%;width:auto}.row>.col-md-11{height:auto;width:91.6667%}.row>.offset-md-11{margin-left:91.6667%}.column>.col-md-11{height:91.6667%;width:auto}.row>.col-md-12{height:auto;width:100%}.row>.offset-md-12{margin-left:100%}.column>.col-md-12{height:100%;width:auto}}@media (min-width:1440px){.flex>.col-lg,.flex>.col-lg-0,.flex>.col-lg-1,.flex>.col-lg-10,.flex>.col-lg-11,.flex>.col-lg-12,.flex>.col-lg-2,.flex>.col-lg-3,.flex>.col-lg-4,.flex>.col-lg-5,.flex>.col-lg-6,.flex>.col-lg-7,.flex>.col-lg-8,.flex>.col-lg-9,.flex>.col-lg-auto,.flex>.col-lg-grow,.flex>.col-lg-shrink,.row>.col-lg,.row>.col-lg-0,.row>.col-lg-1,.row>.col-lg-10,.row>.col-lg-11,.row>.col-lg-12,.row>.col-lg-2,.row>.col-lg-3,.row>.col-lg-4,.row>.col-lg-5,.row>.col-lg-6,.row>.col-lg-7,.row>.col-lg-8,.row>.col-lg-9,.row>.col-lg-auto,.row>.col-lg-grow,.row>.col-lg-shrink{width:auto;min-width:0;max-width:100%}.column>.col-lg,.column>.col-lg-0,.column>.col-lg-1,.column>.col-lg-10,.column>.col-lg-11,.column>.col-lg-12,.column>.col-lg-2,.column>.col-lg-3,.column>.col-lg-4,.column>.col-lg-5,.column>.col-lg-6,.column>.col-lg-7,.column>.col-lg-8,.column>.col-lg-9,.column>.col-lg-auto,.column>.col-lg-grow,.column>.col-lg-shrink,.flex>.col-lg,.flex>.col-lg-0,.flex>.col-lg-1,.flex>.col-lg-10,.flex>.col-lg-11,.flex>.col-lg-12,.flex>.col-lg-2,.flex>.col-lg-3,.flex>.col-lg-4,.flex>.col-lg-5,.flex>.col-lg-6,.flex>.col-lg-7,.flex>.col-lg-8,.flex>.col-lg-9,.flex>.col-lg-auto,.flex>.col-lg-grow,.flex>.col-lg-shrink{height:auto;min-height:0;max-height:100%}.col-lg{flex:10000 1 0%}.col-lg-0,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto{flex:0 0 auto}.col-lg-grow{flex:1 0 auto}.col-lg-shrink{flex:0 1 auto}.row>.col-lg-0{height:auto;width:0%}.row>.offset-lg-0{margin-left:0}.column>.col-lg-0{height:0%;width:auto}.row>.col-lg-1{height:auto;width:8.3333%}.row>.offset-lg-1{margin-left:8.3333%}.column>.col-lg-1{height:8.3333%;width:auto}.row>.col-lg-2{height:auto;width:16.6667%}.row>.offset-lg-2{margin-left:16.6667%}.column>.col-lg-2{height:16.6667%;width:auto}.row>.col-lg-3{height:auto;width:25%}.row>.offset-lg-3{margin-left:25%}.column>.col-lg-3{height:25%;width:auto}.row>.col-lg-4{height:auto;width:33.3333%}.row>.offset-lg-4{margin-left:33.3333%}.column>.col-lg-4{height:33.3333%;width:auto}.row>.col-lg-5{height:auto;width:41.6667%}.row>.offset-lg-5{margin-left:41.6667%}.column>.col-lg-5{height:41.6667%;width:auto}.row>.col-lg-6{height:auto;width:50%}.row>.offset-lg-6{margin-left:50%}.column>.col-lg-6{height:50%;width:auto}.row>.col-lg-7{height:auto;width:58.3333%}.row>.offset-lg-7{margin-left:58.3333%}.column>.col-lg-7{height:58.3333%;width:auto}.row>.col-lg-8{height:auto;width:66.6667%}.row>.offset-lg-8{margin-left:66.6667%}.column>.col-lg-8{height:66.6667%;width:auto}.row>.col-lg-9{height:auto;width:75%}.row>.offset-lg-9{margin-left:75%}.column>.col-lg-9{height:75%;width:auto}.row>.col-lg-10{height:auto;width:83.3333%}.row>.offset-lg-10{margin-left:83.3333%}.column>.col-lg-10{height:83.3333%;width:auto}.row>.col-lg-11{height:auto;width:91.6667%}.row>.offset-lg-11{margin-left:91.6667%}.column>.col-lg-11{height:91.6667%;width:auto}.row>.col-lg-12{height:auto;width:100%}.row>.offset-lg-12{margin-left:100%}.column>.col-lg-12{height:100%;width:auto}}@media (min-width:1920px){.flex>.col-xl,.flex>.col-xl-0,.flex>.col-xl-1,.flex>.col-xl-10,.flex>.col-xl-11,.flex>.col-xl-12,.flex>.col-xl-2,.flex>.col-xl-3,.flex>.col-xl-4,.flex>.col-xl-5,.flex>.col-xl-6,.flex>.col-xl-7,.flex>.col-xl-8,.flex>.col-xl-9,.flex>.col-xl-auto,.flex>.col-xl-grow,.flex>.col-xl-shrink,.row>.col-xl,.row>.col-xl-0,.row>.col-xl-1,.row>.col-xl-10,.row>.col-xl-11,.row>.col-xl-12,.row>.col-xl-2,.row>.col-xl-3,.row>.col-xl-4,.row>.col-xl-5,.row>.col-xl-6,.row>.col-xl-7,.row>.col-xl-8,.row>.col-xl-9,.row>.col-xl-auto,.row>.col-xl-grow,.row>.col-xl-shrink{width:auto;min-width:0;max-width:100%}.column>.col-xl,.column>.col-xl-0,.column>.col-xl-1,.column>.col-xl-10,.column>.col-xl-11,.column>.col-xl-12,.column>.col-xl-2,.column>.col-xl-3,.column>.col-xl-4,.column>.col-xl-5,.column>.col-xl-6,.column>.col-xl-7,.column>.col-xl-8,.column>.col-xl-9,.column>.col-xl-auto,.column>.col-xl-grow,.column>.col-xl-shrink,.flex>.col-xl,.flex>.col-xl-0,.flex>.col-xl-1,.flex>.col-xl-10,.flex>.col-xl-11,.flex>.col-xl-12,.flex>.col-xl-2,.flex>.col-xl-3,.flex>.col-xl-4,.flex>.col-xl-5,.flex>.col-xl-6,.flex>.col-xl-7,.flex>.col-xl-8,.flex>.col-xl-9,.flex>.col-xl-auto,.flex>.col-xl-grow,.flex>.col-xl-shrink{height:auto;min-height:0;max-height:100%}.col-xl{flex:10000 1 0%}.col-xl-0,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{flex:0 0 auto}.col-xl-grow{flex:1 0 auto}.col-xl-shrink{flex:0 1 auto}.row>.col-xl-0{height:auto;width:0%}.row>.offset-xl-0{margin-left:0}.column>.col-xl-0{height:0%;width:auto}.row>.col-xl-1{height:auto;width:8.3333%}.row>.offset-xl-1{margin-left:8.3333%}.column>.col-xl-1{height:8.3333%;width:auto}.row>.col-xl-2{height:auto;width:16.6667%}.row>.offset-xl-2{margin-left:16.6667%}.column>.col-xl-2{height:16.6667%;width:auto}.row>.col-xl-3{height:auto;width:25%}.row>.offset-xl-3{margin-left:25%}.column>.col-xl-3{height:25%;width:auto}.row>.col-xl-4{height:auto;width:33.3333%}.row>.offset-xl-4{margin-left:33.3333%}.column>.col-xl-4{height:33.3333%;width:auto}.row>.col-xl-5{height:auto;width:41.6667%}.row>.offset-xl-5{margin-left:41.6667%}.column>.col-xl-5{height:41.6667%;width:auto}.row>.col-xl-6{height:auto;width:50%}.row>.offset-xl-6{margin-left:50%}.column>.col-xl-6{height:50%;width:auto}.row>.col-xl-7{height:auto;width:58.3333%}.row>.offset-xl-7{margin-left:58.3333%}.column>.col-xl-7{height:58.3333%;width:auto}.row>.col-xl-8{height:auto;width:66.6667%}.row>.offset-xl-8{margin-left:66.6667%}.column>.col-xl-8{height:66.6667%;width:auto}.row>.col-xl-9{height:auto;width:75%}.row>.offset-xl-9{margin-left:75%}.column>.col-xl-9{height:75%;width:auto}.row>.col-xl-10{height:auto;width:83.3333%}.row>.offset-xl-10{margin-left:83.3333%}.column>.col-xl-10{height:83.3333%;width:auto}.row>.col-xl-11{height:auto;width:91.6667%}.row>.offset-xl-11{margin-left:91.6667%}.column>.col-xl-11{height:91.6667%;width:auto}.row>.col-xl-12{height:auto;width:100%}.row>.offset-xl-12{margin-left:100%}.column>.col-xl-12{height:100%;width:auto}}.rounded-borders{border-radius:4px}.border-radius-inherit{border-radius:inherit}.no-transition{transition:none!important}.transition-0{transition:0s!important}.glossy{background-image:linear-gradient(to bottom,rgba(255,255,255,.3),rgba(255,255,255,0) 50%,rgba(0,0,0,.12) 51%,rgba(0,0,0,.04))!important}.q-placeholder::placeholder{color:inherit;opacity:.7}.q-body--fullscreen-mixin,.q-body--prevent-scroll{position:fixed!important}.q-body--force-scrollbar-x{overflow-x:scroll}.q-body--force-scrollbar-y{overflow-y:scroll}.q-no-input-spinner{-moz-appearance:textfield!important}.q-no-input-spinner::-webkit-inner-spin-button,.q-no-input-spinner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.q-link{outline:0;text-decoration:none}.q-link--focusable:focus-visible{text-decoration:underline dashed currentColor 1px}body.electron .q-electron-drag{-webkit-user-select:none;-webkit-app-region:drag}body.electron .q-electron-drag .q-btn-item,body.electron .q-electron-drag--exception{-webkit-app-region:no-drag}img.responsive{max-width:100%;height:auto}.non-selectable{user-select:none!important}.scroll,body.mobile .scroll--mobile{overflow:auto}.scroll,.scroll-x,.scroll-y{-webkit-overflow-scrolling:touch;will-change:scroll-position}.scroll-x{overflow-x:auto}.scroll-y{overflow-y:auto}.no-scroll{overflow:hidden!important}.no-pointer-events,.no-pointer-events--children,.no-pointer-events--children *{pointer-events:none!important}.all-pointer-events{pointer-events:all!important}.cursor-pointer{cursor:pointer!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-inherit{cursor:inherit!important}.cursor-none{cursor:none!important}[aria-busy=true]{cursor:progress}[aria-controls]{cursor:pointer}[aria-disabled=true]{cursor:default}.rotate-45{transform:rotate(45deg)}.rotate-90{transform:rotate(90deg)}.rotate-135{transform:rotate(135deg)}.rotate-180{transform:rotate(180deg)}.rotate-225{transform:rotate(225deg)}.rotate-270{transform:rotate(270deg)}.rotate-315{transform:rotate(315deg)}.flip-horizontal{transform:scaleX(-1)}.flip-vertical{transform:scaleY(-1)}.float-left{float:left}.float-right{float:right}.relative-position{position:relative}.fixed,.fixed-bottom,.fixed-bottom-left,.fixed-bottom-right,.fixed-center,.fixed-full,.fixed-left,.fixed-right,.fixed-top,.fixed-top-left,.fixed-top-right,.fullscreen{position:fixed}.absolute,.absolute-bottom,.absolute-bottom-left,.absolute-bottom-right,.absolute-center,.absolute-full,.absolute-left,.absolute-right,.absolute-top,.absolute-top-left,.absolute-top-right{position:absolute}.absolute-top,.fixed-top{top:0;left:0;right:0}.absolute-right,.fixed-right{top:0;right:0;bottom:0}.absolute-bottom,.fixed-bottom{right:0;bottom:0;left:0}.absolute-left,.fixed-left{top:0;bottom:0;left:0}.absolute-top-left,.fixed-top-left{top:0;left:0}.absolute-top-right,.fixed-top-right{top:0;right:0}.absolute-bottom-left,.fixed-bottom-left{bottom:0;left:0}.absolute-bottom-right,.fixed-bottom-right{bottom:0;right:0}.fullscreen{z-index:6000;border-radius:0!important;max-width:100vw;max-height:100vh}body.q-ios-padding .fullscreen{padding-top:20px!important;padding-top:env(safe-area-inset-top)!important;padding-bottom:env(safe-area-inset-bottom)!important}.absolute-full,.fixed-full,.fullscreen{top:0;right:0;bottom:0;left:0}.absolute-center,.fixed-center{top:50%;left:50%;transform:translate(-50%,-50%)}.vertical-top{vertical-align:top!important}.vertical-middle{vertical-align:middle!important}.vertical-bottom{vertical-align:bottom!important}.on-left{margin-right:12px}.on-right{margin-left:12px}.q-position-engine{margin-top:var(--q-pe-top,0)!important;margin-left:var(--q-pe-left,0)!important;will-change:auto;visibility:collapse}:root{--q-size-xs:0;--q-size-sm:600px;--q-size-md:1024px;--q-size-lg:1440px;--q-size-xl:1920px}.fit{width:100%!important;height:100%!important}.full-height{height:100%!important}.full-width{width:100%!important;margin-left:0!important;margin-right:0!important}.window-height{margin-top:0!important;margin-bottom:0!important;height:100vh!important}.window-width{margin-left:0!important;margin-right:0!important;width:100vw!important}.block{display:block!important}.inline-block{display:inline-block!important}.q-pa-none{padding:0 0}.q-pl-none{padding-left:0}.q-pr-none{padding-right:0}.q-pt-none{padding-top:0}.q-pb-none{padding-bottom:0}.q-px-none{padding-left:0;padding-right:0}.q-py-none{padding-top:0;padding-bottom:0}.q-ma-none{margin:0 0}.q-ml-none{margin-left:0}.q-mr-none{margin-right:0}.q-mt-none{margin-top:0}.q-mb-none{margin-bottom:0}.q-mx-none{margin-left:0;margin-right:0}.q-my-none{margin-top:0;margin-bottom:0}.q-pa-xs{padding:4px 4px}.q-pl-xs{padding-left:4px}.q-pr-xs{padding-right:4px}.q-pt-xs{padding-top:4px}.q-pb-xs{padding-bottom:4px}.q-px-xs{padding-left:4px;padding-right:4px}.q-py-xs{padding-top:4px;padding-bottom:4px}.q-ma-xs{margin:4px 4px}.q-ml-xs{margin-left:4px}.q-mr-xs{margin-right:4px}.q-mt-xs{margin-top:4px}.q-mb-xs{margin-bottom:4px}.q-mx-xs{margin-left:4px;margin-right:4px}.q-my-xs{margin-top:4px;margin-bottom:4px}.q-pa-sm{padding:8px 8px}.q-pl-sm{padding-left:8px}.q-pr-sm{padding-right:8px}.q-pt-sm{padding-top:8px}.q-pb-sm{padding-bottom:8px}.q-px-sm{padding-left:8px;padding-right:8px}.q-py-sm{padding-top:8px;padding-bottom:8px}.q-ma-sm{margin:8px 8px}.q-ml-sm{margin-left:8px}.q-mr-sm{margin-right:8px}.q-mt-sm{margin-top:8px}.q-mb-sm{margin-bottom:8px}.q-mx-sm{margin-left:8px;margin-right:8px}.q-my-sm{margin-top:8px;margin-bottom:8px}.q-pa-md{padding:16px 16px}.q-pl-md{padding-left:16px}.q-pr-md{padding-right:16px}.q-pt-md{padding-top:16px}.q-pb-md{padding-bottom:16px}.q-px-md{padding-left:16px;padding-right:16px}.q-py-md{padding-top:16px;padding-bottom:16px}.q-ma-md{margin:16px 16px}.q-ml-md{margin-left:16px}.q-mr-md{margin-right:16px}.q-mt-md{margin-top:16px}.q-mb-md{margin-bottom:16px}.q-mx-md{margin-left:16px;margin-right:16px}.q-my-md{margin-top:16px;margin-bottom:16px}.q-pa-lg{padding:24px 24px}.q-pl-lg{padding-left:24px}.q-pr-lg{padding-right:24px}.q-pt-lg{padding-top:24px}.q-pb-lg{padding-bottom:24px}.q-px-lg{padding-left:24px;padding-right:24px}.q-py-lg{padding-top:24px;padding-bottom:24px}.q-ma-lg{margin:24px 24px}.q-ml-lg{margin-left:24px}.q-mr-lg{margin-right:24px}.q-mt-lg{margin-top:24px}.q-mb-lg{margin-bottom:24px}.q-mx-lg{margin-left:24px;margin-right:24px}.q-my-lg{margin-top:24px;margin-bottom:24px}.q-pa-xl{padding:48px 48px}.q-pl-xl{padding-left:48px}.q-pr-xl{padding-right:48px}.q-pt-xl{padding-top:48px}.q-pb-xl{padding-bottom:48px}.q-px-xl{padding-left:48px;padding-right:48px}.q-py-xl{padding-top:48px;padding-bottom:48px}.q-ma-xl{margin:48px 48px}.q-ml-xl{margin-left:48px}.q-mr-xl{margin-right:48px}.q-mt-xl{margin-top:48px}.q-mb-xl{margin-bottom:48px}.q-mx-xl{margin-left:48px;margin-right:48px}.q-my-xl{margin-top:48px;margin-bottom:48px}.q-mt-auto,.q-my-auto{margin-top:auto}.q-ml-auto{margin-left:auto}.q-mb-auto,.q-my-auto{margin-bottom:auto}.q-mr-auto{margin-right:auto}.q-mx-auto{margin-left:auto;margin-right:auto}.q-touch{user-select:none;user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none}.q-touch-x{touch-action:pan-x}.q-touch-y{touch-action:pan-y}:root{--q-transition-duration:.3s}.q-transition--fade-enter-active,.q-transition--fade-leave-active,.q-transition--flip-enter-active,.q-transition--flip-leave-active,.q-transition--jump-down-enter-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-enter-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-enter-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-enter-active,.q-transition--jump-up-leave-active,.q-transition--rotate-enter-active,.q-transition--rotate-leave-active,.q-transition--scale-enter-active,.q-transition--scale-leave-active,.q-transition--slide-down-enter-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-enter-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-enter-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-enter-active,.q-transition--slide-up-leave-active{--q-transition-duration:.3s;--q-transition-easing:cubic-bezier(0.215,0.61,0.355,1)}.q-transition--fade-leave-active,.q-transition--flip-leave-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-leave-active,.q-transition--rotate-leave-active,.q-transition--scale-leave-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-leave-active{position:absolute}.q-transition--slide-down-enter-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-enter-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-enter-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-enter-active,.q-transition--slide-up-leave-active{transition:transform var(--q-transition-duration) var(--q-transition-easing)}.q-transition--slide-right-enter-from{transform:translate3d(-100%,0,0)}.q-transition--slide-right-leave-to{transform:translate3d(100%,0,0)}.q-transition--slide-left-enter-from{transform:translate3d(100%,0,0)}.q-transition--slide-left-leave-to{transform:translate3d(-100%,0,0)}.q-transition--slide-up-enter-from{transform:translate3d(0,100%,0)}.q-transition--slide-up-leave-to{transform:translate3d(0,-100%,0)}.q-transition--slide-down-enter-from{transform:translate3d(0,-100%,0)}.q-transition--slide-down-leave-to{transform:translate3d(0,100%,0)}.q-transition--jump-down-enter-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-enter-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-enter-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-enter-active,.q-transition--jump-up-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration)}.q-transition--jump-down-enter-from,.q-transition--jump-down-leave-to,.q-transition--jump-left-enter-from,.q-transition--jump-left-leave-to,.q-transition--jump-right-enter-from,.q-transition--jump-right-leave-to,.q-transition--jump-up-enter-from,.q-transition--jump-up-leave-to{opacity:0}.q-transition--jump-right-enter-from{transform:translate3d(-15px,0,0)}.q-transition--jump-right-leave-to{transform:translate3d(15px,0,0)}.q-transition--jump-left-enter-from{transform:translate3d(15px,0,0)}.q-transition--jump-left-leave-to{transform:translateX(-15px)}.q-transition--jump-up-enter-from{transform:translate3d(0,15px,0)}.q-transition--jump-up-leave-to{transform:translate3d(0,-15px,0)}.q-transition--jump-down-enter-from{transform:translate3d(0,-15px,0)}.q-transition--jump-down-leave-to{transform:translate3d(0,15px,0)}.q-transition--fade-enter-active,.q-transition--fade-leave-active{transition:opacity var(--q-transition-duration) ease-out}.q-transition--fade-enter-from,.q-transition--fade-leave-to{opacity:0}.q-transition--scale-enter-active,.q-transition--scale-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration) var(--q-transition-easing)}.q-transition--scale-enter-from,.q-transition--scale-leave-to{opacity:0;transform:scale3d(0,0,1)}.q-transition--rotate-enter-active,.q-transition--rotate-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration) var(--q-transition-easing);transform-style:preserve-3d}.q-transition--rotate-enter-from,.q-transition--rotate-leave-to{opacity:0;transform:scale3d(0,0,1) rotate3d(0,0,1,90deg)}.q-transition--flip-down-enter-active,.q-transition--flip-down-leave-active,.q-transition--flip-left-enter-active,.q-transition--flip-left-leave-active,.q-transition--flip-right-enter-active,.q-transition--flip-right-leave-active,.q-transition--flip-up-enter-active,.q-transition--flip-up-leave-active{transition:transform var(--q-transition-duration);backface-visibility:hidden}.q-transition--flip-down-enter-to,.q-transition--flip-down-leave-from,.q-transition--flip-left-enter-to,.q-transition--flip-left-leave-from,.q-transition--flip-right-enter-to,.q-transition--flip-right-leave-from,.q-transition--flip-up-enter-to,.q-transition--flip-up-leave-from{transform:perspective(400px) rotate3d(1,1,0,0deg)}.q-transition--flip-right-enter-from{transform:perspective(400px) rotate3d(0,1,0,-180deg)}.q-transition--flip-right-leave-to{transform:perspective(400px) rotate3d(0,1,0,180deg)}.q-transition--flip-left-enter-from{transform:perspective(400px) rotate3d(0,1,0,180deg)}.q-transition--flip-left-leave-to{transform:perspective(400px) rotate3d(0,1,0,-180deg)}.q-transition--flip-up-enter-from{transform:perspective(400px) rotate3d(1,0,0,-180deg)}.q-transition--flip-up-leave-to{transform:perspective(400px) rotate3d(1,0,0,180deg)}.q-transition--flip-down-enter-from{transform:perspective(400px) rotate3d(1,0,0,180deg)}.q-transition--flip-down-leave-to{transform:perspective(400px) rotate3d(1,0,0,-180deg)}body{min-width:100px;min-height:100%;font-family:Roboto,"-apple-system","Helvetica Neue",Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;line-height:1.5;font-size:14px}h1{font-size:6rem;font-weight:300;line-height:6rem;letter-spacing:-.01562em}h2{font-size:3.75rem;font-weight:300;line-height:3.75rem;letter-spacing:-.00833em}h3{font-size:3rem;font-weight:400;line-height:3.125rem;letter-spacing:normal}h4{font-size:2.125rem;font-weight:400;line-height:2.5rem;letter-spacing:.00735em}h5{font-size:1.5rem;font-weight:400;line-height:2rem;letter-spacing:normal}h6{font-size:1.25rem;font-weight:500;line-height:2rem;letter-spacing:.0125em}p{margin:0 0 16px}.text-h1{font-size:6rem;font-weight:300;line-height:6rem;letter-spacing:-.01562em}.text-h2{font-size:3.75rem;font-weight:300;line-height:3.75rem;letter-spacing:-.00833em}.text-h3{font-size:3rem;font-weight:400;line-height:3.125rem;letter-spacing:normal}.text-h4{font-size:2.125rem;font-weight:400;line-height:2.5rem;letter-spacing:.00735em}.text-h5{font-size:1.5rem;font-weight:400;line-height:2rem;letter-spacing:normal}.text-h6{font-size:1.25rem;font-weight:500;line-height:2rem;letter-spacing:.0125em}.text-subtitle1{font-size:1rem;font-weight:400;line-height:1.75rem;letter-spacing:.00937em}.text-subtitle2{font-size:.875rem;font-weight:500;line-height:1.375rem;letter-spacing:.00714em}.text-body1{font-size:1rem;font-weight:400;line-height:1.5rem;letter-spacing:.03125em}.text-body2{font-size:.875rem;font-weight:400;line-height:1.25rem;letter-spacing:.01786em}.text-overline{font-size:.75rem;font-weight:500;line-height:2rem;letter-spacing:.16667em}.text-caption{font-size:.75rem;font-weight:400;line-height:1.25rem;letter-spacing:.03333em}.text-uppercase{text-transform:uppercase}.text-lowercase{text-transform:lowercase}.text-capitalize{text-transform:capitalize}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-justify{text-align:justify;hyphens:auto}.text-italic{font-style:italic}.text-bold{font-weight:700}.text-no-wrap{white-space:nowrap}.text-strike{text-decoration:line-through}.text-weight-thin{font-weight:100}.text-weight-light{font-weight:300}.text-weight-regular{font-weight:400}.text-weight-medium{font-weight:500}.text-weight-bold{font-weight:700}.text-weight-bolder{font-weight:900}small{font-size:80%}big{font-size:170%}sub{bottom:-.25em}sup{top:-.5em}.no-margin{margin:0!important}.no-padding{padding:0!important}.no-border{border:0!important}.no-border-radius{border-radius:0!important}.no-box-shadow{box-shadow:none!important}.no-outline{outline:0!important}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ellipsis-2-lines,.ellipsis-3-lines{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.ellipsis-2-lines{-webkit-line-clamp:2}.ellipsis-3-lines{-webkit-line-clamp:3}.readonly{cursor:default!important}.disabled,.disabled *,[disabled],[disabled] *{outline:0!important;cursor:not-allowed!important}.disabled,[disabled]{opacity:.6!important}.hidden{display:none!important}.invisible,.invisible *{visibility:hidden!important;transition:none!important;animation:none!important}.transparent{background:0 0!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-hidden-y{overflow-y:hidden!important}.hide-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.hide-scrollbar::-webkit-scrollbar{width:0;height:0;display:none}.dimmed:after,.light-dimmed:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0}.dimmed:after{background:rgba(0,0,0,.4)!important}.light-dimmed:after{background:rgba(255,255,255,.6)!important}.z-top{z-index:7000!important}.z-max{z-index:9998!important}body.desktop .desktop-hide,body:not(.desktop) .desktop-only{display:none!important}body.mobile .mobile-hide,body:not(.mobile) .mobile-only{display:none!important}body.native-mobile .native-mobile-hide,body:not(.native-mobile) .native-mobile-only{display:none!important}body.cordova .cordova-hide,body:not(.cordova) .cordova-only{display:none!important}body.capacitor .capacitor-hide,body:not(.capacitor) .capacitor-only{display:none!important}body.electron .electron-hide,body:not(.electron) .electron-only{display:none!important}body.touch .touch-hide,body:not(.touch) .touch-only{display:none!important}body.within-iframe .within-iframe-hide,body:not(.within-iframe) .within-iframe-only{display:none!important}body.platform-ios .platform-ios-hide,body:not(.platform-ios) .platform-ios-only{display:none!important}body.platform-android .platform-android-hide,body:not(.platform-android) .platform-android-only{display:none!important}@media all and (orientation:portrait){.orientation-landscape{display:none!important}}@media all and (orientation:landscape){.orientation-portrait{display:none!important}}@media screen{.print-only{display:none!important}}@media print{.print-hide{display:none!important}}@media (max-width:599.98px){.gt-lg,.gt-md,.gt-sm,.gt-xs,.lg,.md,.sm,.xl,.xs-hide{display:none!important}}@media (min-width:600px) and (max-width:1023.98px){.gt-lg,.gt-md,.gt-sm,.lg,.lt-sm,.md,.sm-hide,.xl,.xs{display:none!important}}@media (min-width:1024px) and (max-width:1439.98px){.gt-lg,.gt-md,.lg,.lt-md,.lt-sm,.md-hide,.sm,.xl,.xs{display:none!important}}@media (min-width:1440px) and (max-width:1919.98px){.gt-lg,.lg-hide,.lt-lg,.lt-md,.lt-sm,.md,.sm,.xl,.xs{display:none!important}}@media (min-width:1920px){.lg,.lt-lg,.lt-md,.lt-sm,.lt-xl,.md,.sm,.xl-hide,.xs{display:none!important}}.q-focus-helper,.q-focusable,.q-hoverable,.q-manual-focusable{outline:0}body.desktop .q-focus-helper{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;border-radius:inherit;opacity:0;transition:background-color .3s cubic-bezier(.25, .8, .5, 1),opacity .4s cubic-bezier(.25, .8, .5, 1)}body.desktop .q-focus-helper:after,body.desktop .q-focus-helper:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;border-radius:inherit;transition:background-color .3s cubic-bezier(.25, .8, .5, 1),opacity .6s cubic-bezier(.25, .8, .5, 1)}body.desktop .q-focus-helper:before{background:#000}body.desktop .q-focus-helper:after{background:#fff}body.desktop .q-focus-helper--rounded{border-radius:4px}body.desktop .q-focus-helper--round{border-radius:50%}body.desktop .q-focusable:focus>.q-focus-helper,body.desktop .q-hoverable:hover>.q-focus-helper,body.desktop .q-manual-focusable--focused>.q-focus-helper{background:currentColor;opacity:.15}body.desktop .q-focusable:focus>.q-focus-helper:before,body.desktop .q-hoverable:hover>.q-focus-helper:before,body.desktop .q-manual-focusable--focused>.q-focus-helper:before{opacity:.1}body.desktop .q-focusable:focus>.q-focus-helper:after,body.desktop .q-hoverable:hover>.q-focus-helper:after,body.desktop .q-manual-focusable--focused>.q-focus-helper:after{opacity:.4}body.desktop .q-focusable:focus>.q-focus-helper,body.desktop .q-manual-focusable--focused>.q-focus-helper{opacity:.22}body.body--dark{color:#fff;background:var(--q-dark-page)}.q-dark{color:#fff;background:var(--q-dark)}body[data-theme=classic].neon-border .q-card,body[data-theme=classic].neon-border .q-card.q-card--dark,body[data-theme=classic].neon-border .q-date,body[data-theme=classic].neon-border .q-date--dark{border:2px solid #673ab7;box-shadow:none}body[data-theme=bitcoin].neon-border .q-card,body[data-theme=bitcoin].neon-border .q-card.q-card--dark,body[data-theme=bitcoin].neon-border .q-date,body[data-theme=bitcoin].neon-border .q-date--dark{border:2px solid #ea611d;box-shadow:none}body[data-theme=freedom].neon-border .q-card,body[data-theme=freedom].neon-border .q-card.q-card--dark,body[data-theme=freedom].neon-border .q-date,body[data-theme=freedom].neon-border .q-date--dark{border:2px solid #e22156;box-shadow:none}body[data-theme=cyber].neon-border .q-card,body[data-theme=cyber].neon-border .q-card.q-card--dark,body[data-theme=cyber].neon-border .q-date,body[data-theme=cyber].neon-border .q-date--dark{border:2px solid #7cb342;box-shadow:none}body[data-theme=mint].neon-border .q-card,body[data-theme=mint].neon-border .q-card.q-card--dark,body[data-theme=mint].neon-border .q-date,body[data-theme=mint].neon-border .q-date--dark{border:2px solid #3ab77d;box-shadow:none}body[data-theme=autumn].neon-border .q-card,body[data-theme=autumn].neon-border .q-card.q-card--dark,body[data-theme=autumn].neon-border .q-date,body[data-theme=autumn].neon-border .q-date--dark{border:2px solid #b7763a;box-shadow:none}body[data-theme=flamingo].neon-border .q-card,body[data-theme=flamingo].neon-border .q-card.q-card--dark,body[data-theme=flamingo].neon-border .q-date,body[data-theme=flamingo].neon-border .q-date--dark{border:2px solid #f0f;box-shadow:none}body[data-theme=monochrome].neon-border .q-card,body[data-theme=monochrome].neon-border .q-card.q-card--dark,body[data-theme=monochrome].neon-border .q-date,body[data-theme=monochrome].neon-border .q-date--dark{border:2px solid #494949;box-shadow:none}body[data-theme=salvador].neon-border .q-card,body[data-theme=salvador].neon-border .q-card.q-card--dark,body[data-theme=salvador].neon-border .q-date,body[data-theme=salvador].neon-border .q-date--dark{border:2px solid #1976d2;box-shadow:none}body.hard-border .q-card,body.hard-border .q-card.q-card--dark,body.hard-border .q-date,body.hard-border .q-date--dark{box-shadow:0 0 0 1px rgba(0,0,0,.12),0 0 0 1px rgba(255,255,255,.2784313725);border:none}body.retro-border .q-card,body.retro-border .q-card.q-card--dark,body.retro-border .q-date,body.retro-border .q-date--dark{border:none;box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}body.no-border .q-card,body.no-border .q-card.q-card--dark,body.no-border .q-date,body.no-border .q-date--dark{border:none;box-shadow:none}body[data-theme=classic]{--q-primary:#673ab7;--q-secondary:#9c27b0;--q-dark-page:#1f2234}body[data-theme=classic] [data-theme=classic] .q-card--dark,body[data-theme=classic] [data-theme=classic] .q-stepper--dark{background:#333646!important}body[data-theme=bitcoin]{--q-primary:#ea611d;--q-secondary:#e56f35;--q-dark-page:#2d293b}body[data-theme=bitcoin] [data-theme=bitcoin] .q-card--dark,body[data-theme=bitcoin] [data-theme=bitcoin] .q-stepper--dark{background:#333646!important}body[data-theme=freedom]{--q-primary:#e22156;--q-secondary:#b91a45;--q-dark-page:#462f36}body[data-theme=freedom] [data-theme=freedom] .q-card--dark,body[data-theme=freedom] [data-theme=freedom] .q-stepper--dark{background:#47393d!important}body[data-theme=cyber]{--q-primary:#7cb342;--q-secondary:#558b2f;--q-dark-page:#000}body[data-theme=cyber] [data-theme=cyber] .q-card--dark,body[data-theme=cyber] [data-theme=cyber] .q-stepper--dark{background:#1f2915!important}body[data-theme=mint]{--q-primary:#3ab77d;--q-secondary:#27b065;--q-dark-page:#1f342b}body[data-theme=mint] [data-theme=mint] .q-card--dark,body[data-theme=mint] [data-theme=mint] .q-stepper--dark{background:#334642!important}body[data-theme=autumn]{--q-primary:#b7763a;--q-secondary:#b07927;--q-dark-page:#34291f}body[data-theme=autumn] [data-theme=autumn] .q-card--dark,body[data-theme=autumn] [data-theme=autumn] .q-stepper--dark{background:#463f33!important}body[data-theme=flamingo]{--q-primary:#ff00ff;--q-secondary:#fda3fd;--q-dark-page:#2f032f}body[data-theme=flamingo] [data-theme=flamingo] .q-card--dark,body[data-theme=flamingo] [data-theme=flamingo] .q-stepper--dark{background:#bc23bc!important}body[data-theme=monochrome]{--q-primary:#494949;--q-secondary:#6b6b6b;--q-dark-page:#000}body[data-theme=monochrome] [data-theme=monochrome] .q-card--dark,body[data-theme=monochrome] [data-theme=monochrome] .q-stepper--dark{background:#272727!important}body[data-theme=salvador]{--q-primary:#1976d2;--q-secondary:#26a69a;--q-dark-page:#253647}body[data-theme=salvador] [data-theme=salvador] .q-card--dark,body[data-theme=salvador] [data-theme=salvador] .q-stepper--dark{background:#343d47!important}body.gradient-bg{background-image:linear-gradient(to bottom right,#fff,var(--q-primary));background-attachment:fixed}body.gradient-bg.body--dark{background-image:linear-gradient(to bottom right,var(--q-dark-page),#0a0a0a);background-attachment:fixed}body.bg-image::before{content:"";position:fixed;z-index:-1;top:0;left:0;width:100%;height:100%;filter:blur(8px);background-image:var(--background);background-size:cover;background-position:center;background-repeat:no-repeat}body.bg-image .q-page-container{backdrop-filter:none}body.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){--q-dark:rgba(29, 29, 29, 0.3);background-color:var(--q-dark)}body.body--dark .q-drawer,body.body--dark .q-header{--q-dark:rgba(29, 29, 29, 0.3);background-color:var(--q-dark);backdrop-filter:brightness(0.8)}body.rounded-ui .q-btn,body.rounded-ui .q-card{border-radius:10px}body[data-theme=classic].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(103,58,183,.08),rgba(156,39,176,.06))}body[data-theme=classic].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(103,58,183,.06),rgba(156,39,176,.04))}body[data-theme=classic].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(38.6192771084,42.356626506,64.7807228916),rgba(103,58,183,.07))}body[data-theme=classic].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(36.7144578313,40.2674698795,61.5855421687),rgba(103,58,183,.05))}body[data-theme=bitcoin].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(234,97,29,.08),rgba(229,111,53,.06))}body[data-theme=bitcoin].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(234,97,29,.06),rgba(229,111,53,.04))}body[data-theme=bitcoin].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(54.18,49.364,71.036),rgba(234,97,29,.07))}body[data-theme=bitcoin].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(51.885,47.273,68.027),rgba(234,97,29,.05))}body[data-theme=freedom].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(226,33,86,.08),rgba(185,26,69,.06))}body[data-theme=freedom].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(226,33,86,.06),rgba(185,26,69,.04))}body[data-theme=freedom].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(82.2051282051,55.1948717949,63.4153846154),rgba(226,33,86,.07))}body[data-theme=freedom].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(79.1538461538,53.1461538462,61.0615384615),rgba(226,33,86,.05))}body[data-theme=cyber].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(124,179,66,.08),rgba(85,139,47,.06))}body[data-theme=cyber].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(124,179,66,.06),rgba(85,139,47,.04))}body[data-theme=cyber].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(10.2,10.2,10.2),rgba(124,179,66,.07))}body[data-theme=cyber].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(7.65,7.65,7.65),rgba(124,179,66,.05))}body[data-theme=mint].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(58,183,125,.08),rgba(39,176,101,.06))}body[data-theme=mint].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(58,183,125,.06),rgba(39,176,101,.04))}body[data-theme=mint].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(38.6192771084,64.7807228916,53.5686746988),rgba(58,183,125,.07))}body[data-theme=mint].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(36.7144578313,61.5855421687,50.9265060241),rgba(58,183,125,.05))}body[data-theme=autumn].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(183,118,58,.08),rgba(176,121,39,.06))}body[data-theme=autumn].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(183,118,58,.06),rgba(176,121,39,.04))}body[data-theme=autumn].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(64.7807228916,51.0771084337,38.6192771084),rgba(183,118,58,.07))}body[data-theme=autumn].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(61.5855421687,48.5578313253,36.7144578313),rgba(183,118,58,.05))}body[data-theme=flamingo].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(255,0,255,.08),rgba(253,163,253,.06))}body[data-theme=flamingo].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(255,0,255,.06),rgba(253,163,253,.04))}body[data-theme=flamingo].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(66.176,4.224,66.176),rgba(255,0,255,.07))}body[data-theme=flamingo].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(61.382,3.918,61.382),rgba(255,0,255,.05))}body[data-theme=monochrome].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(73,73,73,.08),rgba(107,107,107,.06))}body[data-theme=monochrome].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(73,73,73,.06),rgba(107,107,107,.04))}body[data-theme=monochrome].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(10.2,10.2,10.2),rgba(73,73,73,.07))}body[data-theme=monochrome].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(7.65,7.65,7.65),rgba(73,73,73,.05))}body[data-theme=salvador].card-gradient .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgba(25,118,210,.08),rgba(38,166,154,.06))}body[data-theme=salvador].card-gradient .q-drawer{background-image:linear-gradient(165deg,rgba(25,118,210,.06),rgba(38,166,154,.04))}body[data-theme=salvador].card-gradient.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){background-image:linear-gradient(135deg,rgb(43.9888888889,64.2,84.4111111111),rgba(25,118,210,.07))}body[data-theme=salvador].card-gradient.body--dark .q-drawer{background-image:linear-gradient(165deg,rgb(42.2416666667,61.65,81.0583333333),rgba(25,118,210,.05))}body.card-shadow .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){box-shadow:0 10px 24px rgba(0,0,0,.18)}body.card-shadow.body--dark .q-card:not(.q-dialog .q-card,.lnbits__dialog-card,.q-dialog-plugin--dark){box-shadow:0 12px 28px rgba(0,0,0,.45)}body.no-burger-background .q-drawer{background-color:transparent!important;background-image:none!important;backdrop-filter:none!important;box-shadow:none!important}:root{--size:100px;--gap:25px}.home .wrapper{display:flex;flex-direction:column;gap:var(--gap);margin:auto;max-width:100%}.home .marquee{display:flex;overflow:hidden;user-select:none;gap:var(--gap);height:max-content;mask-image:linear-gradient(to right,hsla(0,0%,0%,0),hsl(0,0%,0%) 20%,hsl(0,0%,0%) 80%,hsla(0,0%,0%,0))}.home .marquee__group{flex-shrink:0;display:flex;align-items:center;justify-content:space-around;gap:var(--gap);min-width:100%;animation:scroll-x 60s linear infinite}.home .marquee:hover .marquee__group{animation-play-state:paused}.home .marquee__group div{width:var(--size)}@keyframes scroll-x{from{transform:translateX(0)}to{transform:translateX(calc(-100% - var(--gap)))}}[v-cloak]{display:none}body.body--dark .q-table--dark{background:0 0}body.body--dark .q-field--error .q-field__messages,body.body--dark .q-field--error .text-negative{color:#ff0!important}.lnbits-drawer__q-list .q-item{padding-top:5px!important;padding-bottom:5px!important;border-top-right-radius:3px;border-bottom-right-radius:3px}.lnbits-drawer__q-list .q-item.q-item--active{color:inherit;font-weight:700}.lnbits__dialog-card{width:500px}.blur-and-disable{filter:blur(4px);pointer-events:none;user-select:none;opacity:.6}.lnbits__table-bordered td,.lnbits__table-bordered th{border:1px solid #000;border-collapse:collapse}.q-table--dense .q-table__bottom,.q-table--dense td:first-child,.q-table--dense th:first-child{padding-left:6px!important}.q-table--dense .q-table__bottom,.q-table--dense td:last-child,.q-table--dense th:last-child{padding-right:6px!important}a.inherit{color:inherit;text-decoration:none}video{border-radius:3px}.material-icons{font-family:"Material Icons";font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale}.q-rating__icon{font-size:1em}.text-wrap{word-break:break-word}.q-card code{overflow-wrap:break-word}.qrcode__wrapper{position:relative;display:flex;align-items:center;justify-content:center;margin:0 auto}.qrcode__wrapper canvas{width:100%!important;height:100%!important;max-width:320px}.qrcode__image{position:absolute;max-width:52px;width:15%;overflow:hidden;background:#fff;overflow:hidden;padding:.2rem;border-radius:.2rem}.whitespace-pre-line{white-space:pre-line}.q-carousel__slide{background-size:contain;background-repeat:no-repeat}.q-dialog__inner--minimized{padding:12px}.first-install{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%}.first-install .grid{display:block}.first-install .hero-wrapper{display:none}.first-install .hero{display:block;height:100%;max-width:250px;background-image:url(/static/images/logos/lnbits.svg);background-position:center;background-size:contain;background-repeat:no-repeat}@media (min-width:992px){.first-install .grid{display:grid;grid-template-columns:1fr 1fr;grid-gap:1rem}.first-install .hero-wrapper{display:block;position:relative;height:100%;padding:1rem}}.wallet-list-card{margin-top:1px;margin-right:1rem}.wallet-list-card:first-child{margin-left:1px}@media (max-width:1024px){.wallet-card{background:0 0!important;box-shadow:none!important;border:none!important}.mobile-simple .wallet-wrapper{position:fixed!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important}.mobile-simple .wallet-card{width:90%!important}}.error-code{font-size:clamp(15vh, 20vw, 30vh)}.error-message{font-size:clamp(1.5rem, 3vw, 3.75rem);font-weight:300;opacity:.4} \ No newline at end of file diff --git a/lnbits/static/bundle.min.js b/lnbits/static/bundle.min.js index 3f33d32d0..fdc658eb3 100644 --- a/lnbits/static/bundle.min.js +++ b/lnbits/static/bundle.min.js @@ -3,46 +3,46 @@ //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,t;function n(){return e.apply(null,arguments)}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 r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function o(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(r(e,t))return!1;return!0}function s(e){return void 0===e}function l(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function u(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function c(e,t){var n,a=[],i=e.length;for(n=0;n>>0;for(t=0;t0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+a}var L=/(\[[^\[]*\])|(\\)?([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,M=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,R={},z={};function I(e,t,n,a){var i=a;"string"==typeof a&&(i=function(){return this[a]()}),e&&(z[e]=i),t&&(z[t[0]]=function(){return A(i.apply(this,arguments),t[1],t[2])}),n&&(z[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function N(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function O(e,t){return e.isValid()?(t=j(t,e.localeData()),R[t]=R[t]||function(e){var t,n,a=e.match(L);for(t=0,n=a.length;t=0&&M.test(e);)e=e.replace(M,a),M.lastIndex=0,n-=1;return e}var D={D:"date",dates:"date",date:"date",d:"day",days:"day",day:"day",e:"weekday",weekdays:"weekday",weekday:"weekday",E:"isoWeekday",isoweekdays:"isoWeekday",isoweekday:"isoWeekday",DDD:"dayOfYear",dayofyears:"dayOfYear",dayofyear:"dayOfYear",h:"hour",hours:"hour",hour:"hour",ms:"millisecond",milliseconds:"millisecond",millisecond:"millisecond",m:"minute",minutes:"minute",minute:"minute",M:"month",months:"month",month:"month",Q:"quarter",quarters:"quarter",quarter:"quarter",s:"second",seconds:"second",second:"second",gg:"weekYear",weekyears:"weekYear",weekyear:"weekYear",GG:"isoWeekYear",isoweekyears:"isoWeekYear",isoweekyear:"isoWeekYear",w:"week",weeks:"week",week:"week",W:"isoWeek",isoweeks:"isoWeek",isoweek:"isoWeek",y:"year",years:"year",year:"year"};function q(e){return"string"==typeof e?D[e]||D[e.toLowerCase()]:void 0}function B(e){var t,n,a={};for(n in e)r(e,n)&&(t=q(n))&&(a[t]=e[n]);return a}var F={date:9,day:11,weekday:11,isoWeekday:11,dayOfYear:4,hour:13,millisecond:16,minute:14,month:8,quarter:7,second:15,weekYear:1,isoWeekYear:1,week:5,isoWeek:5,year:1};var V,U=/\d/,$=/\d\d/,H=/\d{3}/,W=/\d{4}/,G=/[+-]?\d{6}/,K=/\d\d?/,Y=/\d\d\d\d?/,Q=/\d\d\d\d\d\d?/,Z=/\d{1,3}/,J=/\d{1,4}/,X=/[+-]?\d{1,6}/,ee=/\d+/,te=/[+-]?\d+/,ne=/Z|[+-]\d\d:?\d\d/gi,ae=/Z|[+-]\d\d(?::?\d\d)?/gi,ie=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,re=/^[1-9]\d?/,oe=/^([1-9]\d|\d)/;function se(e,t,n){V[e]=T(t)?t:function(e,a){return e&&n?n:t}}function le(e,t){return r(V,e)?V[e](t._strict,t._locale):new RegExp(ue(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,a,i){return t||n||a||i})))}function ue(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ce(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function de(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=ce(t)),n}V={};var he={};function pe(e,t){var n,a,i=t;for("string"==typeof e&&(e=[e]),l(t)&&(i=function(e,n){n[t]=de(e)}),a=e.length,n=0;n68?1900:2e3)};var Pe,Ee=Ae("FullYear",!0);function Ae(e,t){return function(a){return null!=a?(Me(this,e,a),n.updateOffset(this,t),this):Le(this,e)}}function Le(e,t){if(!e.isValid())return NaN;var n=e._d,a=e._isUTC;switch(t){case"Milliseconds":return a?n.getUTCMilliseconds():n.getMilliseconds();case"Seconds":return a?n.getUTCSeconds():n.getSeconds();case"Minutes":return a?n.getUTCMinutes():n.getMinutes();case"Hours":return a?n.getUTCHours():n.getHours();case"Date":return a?n.getUTCDate():n.getDate();case"Day":return a?n.getUTCDay():n.getDay();case"Month":return a?n.getUTCMonth():n.getMonth();case"FullYear":return a?n.getUTCFullYear():n.getFullYear();default:return NaN}}function Me(e,t,n){var a,i,r,o,s;if(e.isValid()&&!isNaN(n)){switch(a=e._d,i=e._isUTC,t){case"Milliseconds":return void(i?a.setUTCMilliseconds(n):a.setMilliseconds(n));case"Seconds":return void(i?a.setUTCSeconds(n):a.setSeconds(n));case"Minutes":return void(i?a.setUTCMinutes(n):a.setMinutes(n));case"Hours":return void(i?a.setUTCHours(n):a.setHours(n));case"Date":return void(i?a.setUTCDate(n):a.setDate(n));case"FullYear":break;default:return}r=n,o=e.month(),s=29!==(s=e.date())||1!==o||_e(r)?s:28,i?a.setUTCFullYear(r,o,s):a.setFullYear(r,o,s)}}function Re(e,t){if(isNaN(e)||isNaN(t))return NaN;var n,a=(t%(n=12)+n)%n;return e+=(t-a)/12,1===a?_e(e)?29:28:31-a%7%2}Pe=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t=0?(s=new Date(e+400,t,n,a,i,r,o),isFinite(s.getFullYear())&&s.setFullYear(e)):s=new Date(e,t,n,a,i,r,o),s}function Ue(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 $e(e,t,n){var a=7+t-n;return-((7+Ue(e,0,a).getUTCDay()-t)%7)+a-1}function He(e,t,n,a,i){var r,o,s=1+7*(t-1)+(7+n-a)%7+$e(e,a,i);return s<=0?o=Te(r=e-1)+s:s>Te(e)?(r=e+1,o=s-Te(e)):(r=e,o=s),{year:r,dayOfYear:o}}function We(e,t,n){var a,i,r=$e(e.year(),t,n),o=Math.floor((e.dayOfYear()-r-1)/7)+1;return o<1?a=o+Ge(i=e.year()-1,t,n):o>Ge(e.year(),t,n)?(a=o-Ge(e.year(),t,n),i=e.year()+1):(i=e.year(),a=o),{week:a,year:i}}function Ge(e,t,n){var a=$e(e,t,n),i=$e(e+1,t,n);return(Te(e)-a+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),se("w",K,re),se("ww",K,$),se("W",K,re),se("WW",K,$),fe(["w","ww","W","WW"],function(e,t,n,a){t[a.substr(0,1)]=de(e)});function Ke(e,t){return e.slice(t,7).concat(e.slice(0,t))}I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),se("d",K),se("e",K),se("E",K),se("dd",function(e,t){return t.weekdaysMinRegex(e)}),se("ddd",function(e,t){return t.weekdaysShortRegex(e)}),se("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,a){var i=n._locale.weekdaysParse(e,a,n._strict);null!=i?t.d=i:p(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,a){t[a]=de(e)});var Ye="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Qe="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Je=ie,Xe=ie,et=ie;function tt(e,t,n){var a,i,r,o=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],a=0;a<7;++a)r=h([2e3,1]).day(a),this._minWeekdaysParse[a]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[a]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[a]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=Pe.call(this._weekdaysParse,o))?i:null:"ddd"===t?-1!==(i=Pe.call(this._shortWeekdaysParse,o))?i:null:-1!==(i=Pe.call(this._minWeekdaysParse,o))?i:null:"dddd"===t?-1!==(i=Pe.call(this._weekdaysParse,o))||-1!==(i=Pe.call(this._shortWeekdaysParse,o))||-1!==(i=Pe.call(this._minWeekdaysParse,o))?i:null:"ddd"===t?-1!==(i=Pe.call(this._shortWeekdaysParse,o))||-1!==(i=Pe.call(this._weekdaysParse,o))||-1!==(i=Pe.call(this._minWeekdaysParse,o))?i:null:-1!==(i=Pe.call(this._minWeekdaysParse,o))||-1!==(i=Pe.call(this._weekdaysParse,o))||-1!==(i=Pe.call(this._shortWeekdaysParse,o))?i:null}function nt(){function e(e,t){return t.length-e.length}var t,n,a,i,r,o=[],s=[],l=[],u=[];for(t=0;t<7;t++)n=h([2e3,1]).day(t),a=ue(this.weekdaysMin(n,"")),i=ue(this.weekdaysShort(n,"")),r=ue(this.weekdays(n,"")),o.push(a),s.push(i),l.push(r),u.push(a),u.push(i),u.push(r);o.sort(e),s.sort(e),l.sort(e),u.sort(e),this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function at(){return this.hours()%12||12}function it(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function rt(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,at),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+at.apply(this)+A(this.minutes(),2)}),I("hmmss",0,0,function(){return""+at.apply(this)+A(this.minutes(),2)+A(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+A(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+A(this.minutes(),2)+A(this.seconds(),2)}),it("a",!0),it("A",!1),se("a",rt),se("A",rt),se("H",K,oe),se("h",K,re),se("k",K,re),se("HH",K,$),se("hh",K,$),se("kk",K,$),se("hmm",Y),se("hmmss",Q),se("Hmm",Y),se("Hmmss",Q),pe(["H","HH"],ye),pe(["k","kk"],function(e,t,n){var a=de(e);t[ye]=24===a?0:a}),pe(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),pe(["h","hh"],function(e,t,n){t[ye]=de(e),p(n).bigHour=!0}),pe("hmm",function(e,t,n){var a=e.length-2;t[ye]=de(e.substr(0,a)),t[we]=de(e.substr(a)),p(n).bigHour=!0}),pe("hmmss",function(e,t,n){var a=e.length-4,i=e.length-2;t[ye]=de(e.substr(0,a)),t[we]=de(e.substr(a,2)),t[ke]=de(e.substr(i)),p(n).bigHour=!0}),pe("Hmm",function(e,t,n){var a=e.length-2;t[ye]=de(e.substr(0,a)),t[we]=de(e.substr(a))}),pe("Hmmss",function(e,t,n){var a=e.length-4,i=e.length-2;t[ye]=de(e.substr(0,a)),t[we]=de(e.substr(a,2)),t[ke]=de(e.substr(i))});var ot=Ae("Hours",!0);var st,lt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{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"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{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"},months:ze,monthsShort:Ie,week:{dow:0,doy:6},weekdays:Ye,weekdaysMin:Ze,weekdaysShort:Qe,meridiemParse:/[ap]\.?m?\.?/i},ut={},ct={};function dt(e,t){var n,a=Math.min(e.length,t.length);for(n=0;n0;){if(a=pt(i.slice(0,t).join("-")))return a;if(n&&n.length>=t&&dt(i,n)>=t-1)break;t--}r++}return st}(e)}function gt(e){var t,n=e._a;return n&&-2===p(e).overflow&&(t=n[ve]<0||n[ve]>11?ve:n[be]<1||n[be]>Re(n[ge],n[ve])?be:n[ye]<0||n[ye]>24||24===n[ye]&&(0!==n[we]||0!==n[ke]||0!==n[xe])?ye:n[we]<0||n[we]>59?we:n[ke]<0||n[ke]>59?ke:n[xe]<0||n[xe]>999?xe:-1,p(e)._overflowDayOfYear&&(tbe)&&(t=be),p(e)._overflowWeeks&&-1===t&&(t=Se),p(e)._overflowWeekday&&-1===t&&(t=Ce),p(e).overflow=t),e}var vt=/^\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)?)?$/,bt=/^\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)?)?$/,yt=/Z|[+-]\d\d(?::?\d\d)?/,wt=[["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]],kt=[["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/]],xt=/^\/?Date\((-?\d+)/i,St=/^(?:(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}))$/,Ct={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Tt(e){var t,n,a,i,r,o,s=e._i,l=vt.exec(s)||bt.exec(s),u=wt.length,c=kt.length;if(l){for(p(e).iso=!0,t=0,n=u;t7)&&(l=!0)):(r=e._locale._week.dow,o=e._locale._week.doy,u=We(It(),r,o),n=At(t.gg,e._a[ge],u.year),a=At(t.w,u.week),null!=t.d?((i=t.d)<0||i>6)&&(l=!0):null!=t.e?(i=t.e+r,(t.e<0||t.e>6)&&(l=!0)):i=r);a<1||a>Ge(n,r,o)?p(e)._overflowWeeks=!0:null!=l?p(e)._overflowWeekday=!0:(s=He(n,a,i,r,o),e._a[ge]=s.year,e._dayOfYear=s.dayOfYear)}(e),null!=e._dayOfYear&&(o=At(e._a[ge],i[ge]),(e._dayOfYear>Te(o)||0===e._dayOfYear)&&(p(e)._overflowDayOfYear=!0),a=Ue(o,0,e._dayOfYear),e._a[ve]=a.getUTCMonth(),e._a[be]=a.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=s[t]=i[t];for(;t<7;t++)e._a[t]=s[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ye]&&0===e._a[we]&&0===e._a[ke]&&0===e._a[xe]&&(e._nextDay=!0,e._a[ye]=0),e._d=(e._useUTC?Ue:Ve).apply(null,s),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ye]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(p(e).weekdayMismatch=!0)}}function Mt(e){if(e._f!==n.ISO_8601)if(e._f!==n.RFC_2822){e._a=[],p(e).empty=!0;var t,a,i,r,o,s,l,u=""+e._i,c=u.length,d=0;for(l=(i=j(e._f,e._locale).match(L)||[]).length,t=0;t0&&p(e).unusedInput.push(o),u=u.slice(u.indexOf(a)+a.length),d+=a.length),z[r]?(a?p(e).empty=!1:p(e).unusedTokens.push(r),me(r,a,e)):e._strict&&!a&&p(e).unusedTokens.push(r);p(e).charsLeftOver=c-d,u.length>0&&p(e).unusedInput.push(u),e._a[ye]<=12&&!0===p(e).bigHour&&e._a[ye]>0&&(p(e).bigHour=void 0),p(e).parsedDateParts=e._a.slice(0),p(e).meridiem=e._meridiem,e._a[ye]=function(e,t,n){var a;if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((a=e.isPM(n))&&t<12&&(t+=12),a||12!==t||(t=0),t):t}(e._locale,e._a[ye],e._meridiem),null!==(s=p(e).era)&&(e._a[ge]=e._locale.erasConvertYear(s,e._a[ge])),Lt(e),gt(e)}else Et(e);else Tt(e)}function Rt(e){var t=e._i,r=e._f;return e._locale=e._locale||_t(e._l),null===t||void 0===r&&""===t?m({nullInput:!0}):("string"==typeof t&&(e._i=t=e._locale.preparse(t)),y(t)?new b(gt(t)):(u(t)?e._d=t:a(r)?function(e){var t,n,a,i,r,o,s=!1,l=e._f.length;if(0===l)return p(e).invalidFormat=!0,void(e._d=new Date(NaN));for(i=0;ithis?this:e:m()});function jt(e,t){var n,i;if(1===t.length&&a(t[0])&&(t=t[0]),!t.length)return It();for(n=t[0],i=1;i=0?new Date(e+400,t,n)-pn:new Date(e,t,n).valueOf()}function _n(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-pn:Date.UTC(e,t,n)}function gn(e,t){return t.erasAbbrRegex(e)}function vn(){var e,t,n,a,i,r=[],o=[],s=[],l=[],u=this.eras();for(e=0,t=u.length;e(r=Ge(e,a,i))&&(t=r),wn.call(this,e,t,n,a,i))}function wn(e,t,n,a,i){var r=He(e,t,n,a,i),o=Ue(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}I("N",0,0,"eraAbbr"),I("NN",0,0,"eraAbbr"),I("NNN",0,0,"eraAbbr"),I("NNNN",0,0,"eraName"),I("NNNNN",0,0,"eraNarrow"),I("y",["y",1],"yo","eraYear"),I("y",["yy",2],0,"eraYear"),I("y",["yyy",3],0,"eraYear"),I("y",["yyyy",4],0,"eraYear"),se("N",gn),se("NN",gn),se("NNN",gn),se("NNNN",function(e,t){return t.erasNameRegex(e)}),se("NNNNN",function(e,t){return t.erasNarrowRegex(e)}),pe(["N","NN","NNN","NNNN","NNNNN"],function(e,t,n,a){var i=n._locale.erasParse(e,a,n._strict);i?p(n).era=i:p(n).invalidEra=e}),se("y",ee),se("yy",ee),se("yyy",ee),se("yyyy",ee),se("yo",function(e,t){return t._eraYearOrdinalRegex||ee}),pe(["y","yy","yyy","yyyy"],ge),pe(["yo"],function(e,t,n,a){var i;n._locale._eraYearOrdinalRegex&&(i=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[ge]=n._locale.eraYearOrdinalParse(e,i):t[ge]=parseInt(e,10)}),I(0,["gg",2],0,function(){return this.weekYear()%100}),I(0,["GG",2],0,function(){return this.isoWeekYear()%100}),bn("gggg","weekYear"),bn("ggggg","weekYear"),bn("GGGG","isoWeekYear"),bn("GGGGG","isoWeekYear"),se("G",te),se("g",te),se("GG",K,$),se("gg",K,$),se("GGGG",J,W),se("gggg",J,W),se("GGGGG",X,G),se("ggggg",X,G),fe(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,a){t[a.substr(0,2)]=de(e)}),fe(["gg","GG"],function(e,t,a,i){t[i]=n.parseTwoDigitYear(e)}),I("Q",0,"Qo","quarter"),se("Q",U),pe("Q",function(e,t){t[ve]=3*(de(e)-1)}),I("D",["DD",2],"Do","date"),se("D",K,re),se("DD",K,$),se("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),pe(["D","DD"],be),pe("Do",function(e,t){t[be]=de(e.match(K)[0])});var kn=Ae("Date",!0);I("DDD",["DDDD",3],"DDDo","dayOfYear"),se("DDD",Z),se("DDDD",H),pe(["DDD","DDDD"],function(e,t,n){n._dayOfYear=de(e)}),I("m",["mm",2],0,"minute"),se("m",K,oe),se("mm",K,$),pe(["m","mm"],we);var xn=Ae("Minutes",!1);I("s",["ss",2],0,"second"),se("s",K,oe),se("ss",K,$),pe(["s","ss"],ke);var Sn,Cn,Tn=Ae("Seconds",!1);for(I("S",0,0,function(){return~~(this.millisecond()/100)}),I(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),I(0,["SSS",3],0,"millisecond"),I(0,["SSSS",4],0,function(){return 10*this.millisecond()}),I(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),I(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),I(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),I(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),I(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),se("S",Z,U),se("SS",Z,$),se("SSS",Z,H),Sn="SSSS";Sn.length<=9;Sn+="S")se(Sn,ee);function Pn(e,t){t[xe]=de(1e3*("0."+e))}for(Sn="S";Sn.length<=9;Sn+="S")pe(Sn,Pn);Cn=Ae("Milliseconds",!1),I("z",0,0,"zoneAbbr"),I("zz",0,0,"zoneName");var En=b.prototype;function An(e){return e}En.add=tn,En.calendar=function(e,t){1===arguments.length&&(arguments[0]?rn(arguments[0])?(e=arguments[0],t=void 0):function(e){var t,n=i(e)&&!o(e),a=!1,s=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"];for(t=0;tn.valueOf():n.valueOf()9999?O(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):T(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",O(n,"Z")):O(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},En.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,t,n,a="moment",i="";return this.isLocal()||(a=0===this.utcOffset()?"moment.utc":"moment.parseZone",i="Z"),e="["+a+'("]',t=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n=i+'[")]',this.format(e+t+"-MM-DD[T]HH:mm:ss.SSS"+n)},"undefined"!=typeof Symbol&&null!=Symbol.for&&(En[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),En.toJSON=function(){return this.isValid()?this.toISOString():null},En.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},En.unix=function(){return Math.floor(this.valueOf()/1e3)},En.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},En.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},En.eraName=function(){var e,t,n,a=this.localeData().eras();for(e=0,t=a.length;ethis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},En.isLocal=function(){return!!this.isValid()&&!this._isUTC},En.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},En.isUtc=Gt,En.isUTC=Gt,En.zoneAbbr=function(){return this._isUTC?"UTC":""},En.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},En.dates=k("dates accessor is deprecated. Use date instead.",kn),En.months=k("months accessor is deprecated. Use month instead",Be),En.years=k("years accessor is deprecated. Use year instead",Ee),En.zone=k("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),En.isDSTShifted=k("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var e,t={};return v(t,this),(t=Rt(t))._a?(e=t._isUTC?h(t._a):It(t._a),this._isDSTShifted=this.isValid()&&function(e,t,n){var a,i=Math.min(e.length,t.length),r=Math.abs(e.length-t.length),o=0;for(a=0;a0):this._isDSTShifted=!1,this._isDSTShifted});var Ln=E.prototype;function Mn(e,t,n,a){var i=_t(),r=h().set(a,t);return i[n](r,e)}function Rn(e,t,n){if(l(e)&&(t=e,e=void 0),e=e||"",null!=t)return Mn(e,t,n,"month");var a,i=[];for(a=0;a<12;a++)i[a]=Mn(e,a,n,"month");return i}function zn(e,t,n,a){"boolean"==typeof e?(l(t)&&(n=t,t=void 0),t=t||""):(n=t=e,e=!1,l(t)&&(n=t,t=void 0),t=t||"");var i,r=_t(),o=e?r._week.dow:0,s=[];if(null!=n)return Mn(t,(n+o)%7,a,"day");for(i=0;i<7;i++)s[i]=Mn(t,(i+o)%7,a,"day");return s}Ln.calendar=function(e,t,n){var a=this._calendar[e]||this._calendar.sameElse;return T(a)?a.call(t,n):a},Ln.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(L).map(function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e}).join(""),this._longDateFormat[e])},Ln.invalidDate=function(){return this._invalidDate},Ln.ordinal=function(e){return this._ordinal.replace("%d",e)},Ln.preparse=An,Ln.postformat=An,Ln.relativeTime=function(e,t,n,a){var i=this._relativeTime[n];return T(i)?i(e,t,n,a):i.replace(/%d/i,e)},Ln.pastFuture=function(e,t){var n=this._relativeTime[e>0?"future":"past"];return T(n)?n(t):n.replace(/%s/i,t)},Ln.set=function(e){var t,n;for(n in e)r(e,n)&&(T(t=e[n])?this[n]=t:this["_"+n]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},Ln.eras=function(e,t){var a,i,r,o=this._eras||_t("en")._eras;for(a=0,i=o.length;a=0)return l[a]},Ln.erasConvertYear=function(e,t){var a=e.since<=e.until?1:-1;return void 0===t?n(e.since).year():n(e.since).year()+(t-e.offset)*a},Ln.erasAbbrRegex=function(e){return r(this,"_erasAbbrRegex")||vn.call(this),e?this._erasAbbrRegex:this._erasRegex},Ln.erasNameRegex=function(e){return r(this,"_erasNameRegex")||vn.call(this),e?this._erasNameRegex:this._erasRegex},Ln.erasNarrowRegex=function(e){return r(this,"_erasNarrowRegex")||vn.call(this),e?this._erasNarrowRegex:this._erasRegex},Ln.months=function(e,t){return e?a(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||Ne).test(t)?"format":"standalone"][e.month()]:a(this._months)?this._months:this._months.standalone},Ln.monthsShort=function(e,t){return e?a(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[Ne.test(t)?"format":"standalone"][e.month()]:a(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},Ln.monthsParse=function(e,t,n){var a,i,r;if(this._monthsParseExact)return De.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),a=0;a<12;a++){if(i=h([2e3,a]),n&&!this._longMonthsParse[a]&&(this._longMonthsParse[a]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[a]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[a]||(r="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[a]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[a].test(e))return a;if(n&&"MMM"===t&&this._shortMonthsParse[a].test(e))return a;if(!n&&this._monthsParse[a].test(e))return a}},Ln.monthsRegex=function(e){return this._monthsParseExact?(r(this,"_monthsRegex")||Fe.call(this),e?this._monthsStrictRegex:this._monthsRegex):(r(this,"_monthsRegex")||(this._monthsRegex=je),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},Ln.monthsShortRegex=function(e){return this._monthsParseExact?(r(this,"_monthsRegex")||Fe.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(r(this,"_monthsShortRegex")||(this._monthsShortRegex=Oe),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},Ln.week=function(e){return We(e,this._week.dow,this._week.doy).week},Ln.firstDayOfYear=function(){return this._week.doy},Ln.firstDayOfWeek=function(){return this._week.dow},Ln.weekdays=function(e,t){var n=a(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"];return!0===e?Ke(n,this._week.dow):e?n[e.day()]:n},Ln.weekdaysMin=function(e){return!0===e?Ke(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},Ln.weekdaysShort=function(e){return!0===e?Ke(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},Ln.weekdaysParse=function(e,t,n){var a,i,r;if(this._weekdaysParseExact)return tt.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),a=0;a<7;a++){if(i=h([2e3,1]).day(a),n&&!this._fullWeekdaysParse[a]&&(this._fullWeekdaysParse[a]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[a]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[a]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[a]||(r="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[a]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[a].test(e))return a;if(n&&"ddd"===t&&this._shortWeekdaysParse[a].test(e))return a;if(n&&"dd"===t&&this._minWeekdaysParse[a].test(e))return a;if(!n&&this._weekdaysParse[a].test(e))return a}},Ln.weekdaysRegex=function(e){return this._weekdaysParseExact?(r(this,"_weekdaysRegex")||nt.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(r(this,"_weekdaysRegex")||(this._weekdaysRegex=Je),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},Ln.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(r(this,"_weekdaysRegex")||nt.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(r(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Xe),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},Ln.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(r(this,"_weekdaysRegex")||nt.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(r(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=et),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},Ln.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},Ln.meridiem=function(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"},ft("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===de(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),n.lang=k("moment.lang is deprecated. Use moment.locale instead.",ft),n.langData=k("moment.langData is deprecated. Use moment.localeData instead.",_t);var In=Math.abs;function Nn(e,t,n,a){var i=Qt(t,n);return e._milliseconds+=a*i._milliseconds,e._days+=a*i._days,e._months+=a*i._months,e._bubble()}function On(e){return e<0?Math.floor(e):Math.ceil(e)}function jn(e){return 4800*e/146097}function Dn(e){return 146097*e/4800}function qn(e){return function(){return this.as(e)}}var Bn=qn("ms"),Fn=qn("s"),Vn=qn("m"),Un=qn("h"),$n=qn("d"),Hn=qn("w"),Wn=qn("M"),Gn=qn("Q"),Kn=qn("y"),Yn=Bn;function Qn(e){return function(){return this.isValid()?this._data[e]:NaN}}var Zn=Qn("milliseconds"),Jn=Qn("seconds"),Xn=Qn("minutes"),ea=Qn("hours"),ta=Qn("days"),na=Qn("months"),aa=Qn("years");var ia=Math.round,ra={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function oa(e,t,n,a,i){return i.relativeTime(t||1,!!n,e,a)}var sa=Math.abs;function la(e){return(e>0)-(e<0)||+e}function ua(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,a,i,r,o,s,l=sa(this._milliseconds)/1e3,u=sa(this._days),c=sa(this._months),d=this.asSeconds();return d?(e=ce(l/60),t=ce(e/60),l%=60,e%=60,n=ce(c/12),c%=12,a=l?l.toFixed(3).replace(/\.?0+$/,""):"",i=d<0?"-":"",r=la(this._months)!==la(d)?"-":"",o=la(this._days)!==la(d)?"-":"",s=la(this._milliseconds)!==la(d)?"-":"",i+"P"+(n?r+n+"Y":"")+(c?r+c+"M":"")+(u?o+u+"D":"")+(t||e||l?"T":"")+(t?s+t+"H":"")+(e?s+e+"M":"")+(l?s+a+"S":"")):"P0D"}var ca=qt.prototype;return ca.isValid=function(){return this._isValid},ca.abs=function(){var e=this._data;return this._milliseconds=In(this._milliseconds),this._days=In(this._days),this._months=In(this._months),e.milliseconds=In(e.milliseconds),e.seconds=In(e.seconds),e.minutes=In(e.minutes),e.hours=In(e.hours),e.months=In(e.months),e.years=In(e.years),this},ca.add=function(e,t){return Nn(this,e,t,1)},ca.subtract=function(e,t){return Nn(this,e,t,-1)},ca.as=function(e){if(!this.isValid())return NaN;var t,n,a=this._milliseconds;if("month"===(e=q(e))||"quarter"===e||"year"===e)switch(t=this._days+a/864e5,n=this._months+jn(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(Dn(this._months)),e){case"week":return t/7+a/6048e5;case"day":return t+a/864e5;case"hour":return 24*t+a/36e5;case"minute":return 1440*t+a/6e4;case"second":return 86400*t+a/1e3;case"millisecond":return Math.floor(864e5*t)+a;default:throw new Error("Unknown unit "+e)}},ca.asMilliseconds=Bn,ca.asSeconds=Fn,ca.asMinutes=Vn,ca.asHours=Un,ca.asDays=$n,ca.asWeeks=Hn,ca.asMonths=Wn,ca.asQuarters=Gn,ca.asYears=Kn,ca.valueOf=Yn,ca._bubble=function(){var e,t,n,a,i,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*On(Dn(s)+o),o=0,s=0),l.milliseconds=r%1e3,e=ce(r/1e3),l.seconds=e%60,t=ce(e/60),l.minutes=t%60,n=ce(t/60),l.hours=n%24,o+=ce(n/24),s+=i=ce(jn(o)),o-=On(Dn(i)),a=ce(s/12),s%=12,l.days=o,l.months=s,l.years=a,this},ca.clone=function(){return Qt(this)},ca.get=function(e){return e=q(e),this.isValid()?this[e+"s"]():NaN},ca.milliseconds=Zn,ca.seconds=Jn,ca.minutes=Xn,ca.hours=ea,ca.days=ta,ca.weeks=function(){return ce(this.days()/7)},ca.months=na,ca.years=aa,ca.humanize=function(e,t){if(!this.isValid())return this.localeData().invalidDate();var n,a,i=!1,r=ra;return"object"==typeof e&&(t=e,e=!1),"boolean"==typeof e&&(i=e),"object"==typeof t&&(r=Object.assign({},ra,t),null!=t.s&&null==t.ss&&(r.ss=t.s-1)),a=function(e,t,n,a){var i=Qt(e).abs(),r=ia(i.as("s")),o=ia(i.as("m")),s=ia(i.as("h")),l=ia(i.as("d")),u=ia(i.as("M")),c=ia(i.as("w")),d=ia(i.as("y")),h=r<=n.ss&&["s",r]||r0,h[4]=a,oa.apply(null,h)}(this,!i,r,n=this.localeData()),i&&(a=n.pastFuture(+this,a)),n.postformat(a)},ca.toISOString=ua,ca.toString=ua,ca.toJSON=ua,ca.locale=sn,ca.localeData=un,ca.toIsoString=k("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ua),ca.lang=ln,I("X",0,0,"unix"),I("x",0,0,"valueOf"),se("x",te),se("X",/[+-]?\d+(\.\d{1,3})?/),pe("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e))}),pe("x",function(e,t,n){n._d=new Date(de(e))}), +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,t;function n(){return e.apply(null,arguments)}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 o(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function r(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(o(e,t))return!1;return!0}function s(e){return void 0===e}function l(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function u(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function c(e,t){var n,a=[],i=e.length;for(n=0;n>>0;for(t=0;t0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+a}var L=/(\[[^\[]*\])|(\\)?([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,M=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,R={},z={};function O(e,t,n,a){var i=a;"string"==typeof a&&(i=function(){return this[a]()}),e&&(z[e]=i),t&&(z[t[0]]=function(){return A(i.apply(this,arguments),t[1],t[2])}),n&&(z[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function I(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function N(e,t){return e.isValid()?(t=D(t,e.localeData()),R[t]=R[t]||function(e){var t,n,a=e.match(L);for(t=0,n=a.length;t=0&&M.test(e);)e=e.replace(M,a),M.lastIndex=0,n-=1;return e}var q={D:"date",dates:"date",date:"date",d:"day",days:"day",day:"day",e:"weekday",weekdays:"weekday",weekday:"weekday",E:"isoWeekday",isoweekdays:"isoWeekday",isoweekday:"isoWeekday",DDD:"dayOfYear",dayofyears:"dayOfYear",dayofyear:"dayOfYear",h:"hour",hours:"hour",hour:"hour",ms:"millisecond",milliseconds:"millisecond",millisecond:"millisecond",m:"minute",minutes:"minute",minute:"minute",M:"month",months:"month",month:"month",Q:"quarter",quarters:"quarter",quarter:"quarter",s:"second",seconds:"second",second:"second",gg:"weekYear",weekyears:"weekYear",weekyear:"weekYear",GG:"isoWeekYear",isoweekyears:"isoWeekYear",isoweekyear:"isoWeekYear",w:"week",weeks:"week",week:"week",W:"isoWeek",isoweeks:"isoWeek",isoweek:"isoWeek",y:"year",years:"year",year:"year"};function j(e){return"string"==typeof e?q[e]||q[e.toLowerCase()]:void 0}function B(e){var t,n,a={};for(n in e)o(e,n)&&(t=j(n))&&(a[t]=e[n]);return a}var F={date:9,day:11,weekday:11,isoWeekday:11,dayOfYear:4,hour:13,millisecond:16,minute:14,month:8,quarter:7,second:15,weekYear:1,isoWeekYear:1,week:5,isoWeek:5,year:1};var $,V=/\d/,U=/\d\d/,H=/\d{3}/,W=/\d{4}/,G=/[+-]?\d{6}/,K=/\d\d?/,Y=/\d\d\d\d?/,Q=/\d\d\d\d\d\d?/,Z=/\d{1,3}/,J=/\d{1,4}/,X=/[+-]?\d{1,6}/,ee=/\d+/,te=/[+-]?\d+/,ne=/Z|[+-]\d\d:?\d\d/gi,ae=/Z|[+-]\d\d(?::?\d\d)?/gi,ie=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,oe=/^[1-9]\d?/,re=/^([1-9]\d|\d)/;function se(e,t,n){$[e]=T(t)?t:function(e,a){return e&&n?n:t}}function le(e,t){return o($,e)?$[e](t._strict,t._locale):new RegExp(ue(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,a,i){return t||n||a||i})))}function ue(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ce(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function de(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=ce(t)),n}$={};var he={};function pe(e,t){var n,a,i=t;for("string"==typeof e&&(e=[e]),l(t)&&(i=function(e,n){n[t]=de(e)}),a=e.length,n=0;n68?1900:2e3)};var Pe,Ee=Ae("FullYear",!0);function Ae(e,t){return function(a){return null!=a?(Me(this,e,a),n.updateOffset(this,t),this):Le(this,e)}}function Le(e,t){if(!e.isValid())return NaN;var n=e._d,a=e._isUTC;switch(t){case"Milliseconds":return a?n.getUTCMilliseconds():n.getMilliseconds();case"Seconds":return a?n.getUTCSeconds():n.getSeconds();case"Minutes":return a?n.getUTCMinutes():n.getMinutes();case"Hours":return a?n.getUTCHours():n.getHours();case"Date":return a?n.getUTCDate():n.getDate();case"Day":return a?n.getUTCDay():n.getDay();case"Month":return a?n.getUTCMonth():n.getMonth();case"FullYear":return a?n.getUTCFullYear():n.getFullYear();default:return NaN}}function Me(e,t,n){var a,i,o,r,s;if(e.isValid()&&!isNaN(n)){switch(a=e._d,i=e._isUTC,t){case"Milliseconds":return void(i?a.setUTCMilliseconds(n):a.setMilliseconds(n));case"Seconds":return void(i?a.setUTCSeconds(n):a.setSeconds(n));case"Minutes":return void(i?a.setUTCMinutes(n):a.setMinutes(n));case"Hours":return void(i?a.setUTCHours(n):a.setHours(n));case"Date":return void(i?a.setUTCDate(n):a.setDate(n));case"FullYear":break;default:return}o=n,r=e.month(),s=29!==(s=e.date())||1!==r||_e(o)?s:28,i?a.setUTCFullYear(o,r,s):a.setFullYear(o,r,s)}}function Re(e,t){if(isNaN(e)||isNaN(t))return NaN;var n,a=(t%(n=12)+n)%n;return e+=(t-a)/12,1===a?_e(e)?29:28:31-a%7%2}Pe=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t=0?(s=new Date(e+400,t,n,a,i,o,r),isFinite(s.getFullYear())&&s.setFullYear(e)):s=new Date(e,t,n,a,i,o,r),s}function Ve(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 Ue(e,t,n){var a=7+t-n;return-((7+Ve(e,0,a).getUTCDay()-t)%7)+a-1}function He(e,t,n,a,i){var o,r,s=1+7*(t-1)+(7+n-a)%7+Ue(e,a,i);return s<=0?r=Te(o=e-1)+s:s>Te(e)?(o=e+1,r=s-Te(e)):(o=e,r=s),{year:o,dayOfYear:r}}function We(e,t,n){var a,i,o=Ue(e.year(),t,n),r=Math.floor((e.dayOfYear()-o-1)/7)+1;return r<1?a=r+Ge(i=e.year()-1,t,n):r>Ge(e.year(),t,n)?(a=r-Ge(e.year(),t,n),i=e.year()+1):(i=e.year(),a=r),{week:a,year:i}}function Ge(e,t,n){var a=Ue(e,t,n),i=Ue(e+1,t,n);return(Te(e)-a+i)/7}O("w",["ww",2],"wo","week"),O("W",["WW",2],"Wo","isoWeek"),se("w",K,oe),se("ww",K,U),se("W",K,oe),se("WW",K,U),fe(["w","ww","W","WW"],function(e,t,n,a){t[a.substr(0,1)]=de(e)});function Ke(e,t){return e.slice(t,7).concat(e.slice(0,t))}O("d",0,"do","day"),O("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),O("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),O("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),O("e",0,0,"weekday"),O("E",0,0,"isoWeekday"),se("d",K),se("e",K),se("E",K),se("dd",function(e,t){return t.weekdaysMinRegex(e)}),se("ddd",function(e,t){return t.weekdaysShortRegex(e)}),se("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,a){var i=n._locale.weekdaysParse(e,a,n._strict);null!=i?t.d=i:p(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,a){t[a]=de(e)});var Ye="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Qe="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Je=ie,Xe=ie,et=ie;function tt(e,t,n){var a,i,o,r=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],a=0;a<7;++a)o=h([2e3,1]).day(a),this._minWeekdaysParse[a]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[a]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[a]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=Pe.call(this._weekdaysParse,r))?i:null:"ddd"===t?-1!==(i=Pe.call(this._shortWeekdaysParse,r))?i:null:-1!==(i=Pe.call(this._minWeekdaysParse,r))?i:null:"dddd"===t?-1!==(i=Pe.call(this._weekdaysParse,r))||-1!==(i=Pe.call(this._shortWeekdaysParse,r))||-1!==(i=Pe.call(this._minWeekdaysParse,r))?i:null:"ddd"===t?-1!==(i=Pe.call(this._shortWeekdaysParse,r))||-1!==(i=Pe.call(this._weekdaysParse,r))||-1!==(i=Pe.call(this._minWeekdaysParse,r))?i:null:-1!==(i=Pe.call(this._minWeekdaysParse,r))||-1!==(i=Pe.call(this._weekdaysParse,r))||-1!==(i=Pe.call(this._shortWeekdaysParse,r))?i:null}function nt(){function e(e,t){return t.length-e.length}var t,n,a,i,o,r=[],s=[],l=[],u=[];for(t=0;t<7;t++)n=h([2e3,1]).day(t),a=ue(this.weekdaysMin(n,"")),i=ue(this.weekdaysShort(n,"")),o=ue(this.weekdays(n,"")),r.push(a),s.push(i),l.push(o),u.push(a),u.push(i),u.push(o);r.sort(e),s.sort(e),l.sort(e),u.sort(e),this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function at(){return this.hours()%12||12}function it(e,t){O(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function ot(e,t){return t._meridiemParse}O("H",["HH",2],0,"hour"),O("h",["hh",2],0,at),O("k",["kk",2],0,function(){return this.hours()||24}),O("hmm",0,0,function(){return""+at.apply(this)+A(this.minutes(),2)}),O("hmmss",0,0,function(){return""+at.apply(this)+A(this.minutes(),2)+A(this.seconds(),2)}),O("Hmm",0,0,function(){return""+this.hours()+A(this.minutes(),2)}),O("Hmmss",0,0,function(){return""+this.hours()+A(this.minutes(),2)+A(this.seconds(),2)}),it("a",!0),it("A",!1),se("a",ot),se("A",ot),se("H",K,re),se("h",K,oe),se("k",K,oe),se("HH",K,U),se("hh",K,U),se("kk",K,U),se("hmm",Y),se("hmmss",Q),se("Hmm",Y),se("Hmmss",Q),pe(["H","HH"],ye),pe(["k","kk"],function(e,t,n){var a=de(e);t[ye]=24===a?0:a}),pe(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),pe(["h","hh"],function(e,t,n){t[ye]=de(e),p(n).bigHour=!0}),pe("hmm",function(e,t,n){var a=e.length-2;t[ye]=de(e.substr(0,a)),t[we]=de(e.substr(a)),p(n).bigHour=!0}),pe("hmmss",function(e,t,n){var a=e.length-4,i=e.length-2;t[ye]=de(e.substr(0,a)),t[we]=de(e.substr(a,2)),t[ke]=de(e.substr(i)),p(n).bigHour=!0}),pe("Hmm",function(e,t,n){var a=e.length-2;t[ye]=de(e.substr(0,a)),t[we]=de(e.substr(a))}),pe("Hmmss",function(e,t,n){var a=e.length-4,i=e.length-2;t[ye]=de(e.substr(0,a)),t[we]=de(e.substr(a,2)),t[ke]=de(e.substr(i))});var rt=Ae("Hours",!0);var st,lt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{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"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{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"},months:ze,monthsShort:Oe,week:{dow:0,doy:6},weekdays:Ye,weekdaysMin:Ze,weekdaysShort:Qe,meridiemParse:/[ap]\.?m?\.?/i},ut={},ct={};function dt(e,t){var n,a=Math.min(e.length,t.length);for(n=0;n0;){if(a=pt(i.slice(0,t).join("-")))return a;if(n&&n.length>=t&&dt(i,n)>=t-1)break;t--}o++}return st}(e)}function gt(e){var t,n=e._a;return n&&-2===p(e).overflow&&(t=n[ve]<0||n[ve]>11?ve:n[be]<1||n[be]>Re(n[ge],n[ve])?be:n[ye]<0||n[ye]>24||24===n[ye]&&(0!==n[we]||0!==n[ke]||0!==n[xe])?ye:n[we]<0||n[we]>59?we:n[ke]<0||n[ke]>59?ke:n[xe]<0||n[xe]>999?xe:-1,p(e)._overflowDayOfYear&&(tbe)&&(t=be),p(e)._overflowWeeks&&-1===t&&(t=Se),p(e)._overflowWeekday&&-1===t&&(t=Ce),p(e).overflow=t),e}var vt=/^\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)?)?$/,bt=/^\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)?)?$/,yt=/Z|[+-]\d\d(?::?\d\d)?/,wt=[["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]],kt=[["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/]],xt=/^\/?Date\((-?\d+)/i,St=/^(?:(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}))$/,Ct={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Tt(e){var t,n,a,i,o,r,s=e._i,l=vt.exec(s)||bt.exec(s),u=wt.length,c=kt.length;if(l){for(p(e).iso=!0,t=0,n=u;t7)&&(l=!0)):(o=e._locale._week.dow,r=e._locale._week.doy,u=We(Ot(),o,r),n=At(t.gg,e._a[ge],u.year),a=At(t.w,u.week),null!=t.d?((i=t.d)<0||i>6)&&(l=!0):null!=t.e?(i=t.e+o,(t.e<0||t.e>6)&&(l=!0)):i=o);a<1||a>Ge(n,o,r)?p(e)._overflowWeeks=!0:null!=l?p(e)._overflowWeekday=!0:(s=He(n,a,i,o,r),e._a[ge]=s.year,e._dayOfYear=s.dayOfYear)}(e),null!=e._dayOfYear&&(r=At(e._a[ge],i[ge]),(e._dayOfYear>Te(r)||0===e._dayOfYear)&&(p(e)._overflowDayOfYear=!0),a=Ve(r,0,e._dayOfYear),e._a[ve]=a.getUTCMonth(),e._a[be]=a.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=s[t]=i[t];for(;t<7;t++)e._a[t]=s[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ye]&&0===e._a[we]&&0===e._a[ke]&&0===e._a[xe]&&(e._nextDay=!0,e._a[ye]=0),e._d=(e._useUTC?Ve:$e).apply(null,s),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ye]=24),e._w&&void 0!==e._w.d&&e._w.d!==o&&(p(e).weekdayMismatch=!0)}}function Mt(e){if(e._f!==n.ISO_8601)if(e._f!==n.RFC_2822){e._a=[],p(e).empty=!0;var t,a,i,o,r,s,l,u=""+e._i,c=u.length,d=0;for(l=(i=D(e._f,e._locale).match(L)||[]).length,t=0;t0&&p(e).unusedInput.push(r),u=u.slice(u.indexOf(a)+a.length),d+=a.length),z[o]?(a?p(e).empty=!1:p(e).unusedTokens.push(o),me(o,a,e)):e._strict&&!a&&p(e).unusedTokens.push(o);p(e).charsLeftOver=c-d,u.length>0&&p(e).unusedInput.push(u),e._a[ye]<=12&&!0===p(e).bigHour&&e._a[ye]>0&&(p(e).bigHour=void 0),p(e).parsedDateParts=e._a.slice(0),p(e).meridiem=e._meridiem,e._a[ye]=function(e,t,n){var a;if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((a=e.isPM(n))&&t<12&&(t+=12),a||12!==t||(t=0),t):t}(e._locale,e._a[ye],e._meridiem),null!==(s=p(e).era)&&(e._a[ge]=e._locale.erasConvertYear(s,e._a[ge])),Lt(e),gt(e)}else Et(e);else Tt(e)}function Rt(e){var t=e._i,o=e._f;return e._locale=e._locale||_t(e._l),null===t||void 0===o&&""===t?m({nullInput:!0}):("string"==typeof t&&(e._i=t=e._locale.preparse(t)),y(t)?new b(gt(t)):(u(t)?e._d=t:a(o)?function(e){var t,n,a,i,o,r,s=!1,l=e._f.length;if(0===l)return p(e).invalidFormat=!0,void(e._d=new Date(NaN));for(i=0;ithis?this:e:m()});function Dt(e,t){var n,i;if(1===t.length&&a(t[0])&&(t=t[0]),!t.length)return Ot();for(n=t[0],i=1;i=0?new Date(e+400,t,n)-pn:new Date(e,t,n).valueOf()}function _n(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-pn:Date.UTC(e,t,n)}function gn(e,t){return t.erasAbbrRegex(e)}function vn(){var e,t,n,a,i,o=[],r=[],s=[],l=[],u=this.eras();for(e=0,t=u.length;e(o=Ge(e,a,i))&&(t=o),wn.call(this,e,t,n,a,i))}function wn(e,t,n,a,i){var o=He(e,t,n,a,i),r=Ve(o.year,0,o.dayOfYear);return this.year(r.getUTCFullYear()),this.month(r.getUTCMonth()),this.date(r.getUTCDate()),this}O("N",0,0,"eraAbbr"),O("NN",0,0,"eraAbbr"),O("NNN",0,0,"eraAbbr"),O("NNNN",0,0,"eraName"),O("NNNNN",0,0,"eraNarrow"),O("y",["y",1],"yo","eraYear"),O("y",["yy",2],0,"eraYear"),O("y",["yyy",3],0,"eraYear"),O("y",["yyyy",4],0,"eraYear"),se("N",gn),se("NN",gn),se("NNN",gn),se("NNNN",function(e,t){return t.erasNameRegex(e)}),se("NNNNN",function(e,t){return t.erasNarrowRegex(e)}),pe(["N","NN","NNN","NNNN","NNNNN"],function(e,t,n,a){var i=n._locale.erasParse(e,a,n._strict);i?p(n).era=i:p(n).invalidEra=e}),se("y",ee),se("yy",ee),se("yyy",ee),se("yyyy",ee),se("yo",function(e,t){return t._eraYearOrdinalRegex||ee}),pe(["y","yy","yyy","yyyy"],ge),pe(["yo"],function(e,t,n,a){var i;n._locale._eraYearOrdinalRegex&&(i=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[ge]=n._locale.eraYearOrdinalParse(e,i):t[ge]=parseInt(e,10)}),O(0,["gg",2],0,function(){return this.weekYear()%100}),O(0,["GG",2],0,function(){return this.isoWeekYear()%100}),bn("gggg","weekYear"),bn("ggggg","weekYear"),bn("GGGG","isoWeekYear"),bn("GGGGG","isoWeekYear"),se("G",te),se("g",te),se("GG",K,U),se("gg",K,U),se("GGGG",J,W),se("gggg",J,W),se("GGGGG",X,G),se("ggggg",X,G),fe(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,a){t[a.substr(0,2)]=de(e)}),fe(["gg","GG"],function(e,t,a,i){t[i]=n.parseTwoDigitYear(e)}),O("Q",0,"Qo","quarter"),se("Q",V),pe("Q",function(e,t){t[ve]=3*(de(e)-1)}),O("D",["DD",2],"Do","date"),se("D",K,oe),se("DD",K,U),se("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),pe(["D","DD"],be),pe("Do",function(e,t){t[be]=de(e.match(K)[0])});var kn=Ae("Date",!0);O("DDD",["DDDD",3],"DDDo","dayOfYear"),se("DDD",Z),se("DDDD",H),pe(["DDD","DDDD"],function(e,t,n){n._dayOfYear=de(e)}),O("m",["mm",2],0,"minute"),se("m",K,re),se("mm",K,U),pe(["m","mm"],we);var xn=Ae("Minutes",!1);O("s",["ss",2],0,"second"),se("s",K,re),se("ss",K,U),pe(["s","ss"],ke);var Sn,Cn,Tn=Ae("Seconds",!1);for(O("S",0,0,function(){return~~(this.millisecond()/100)}),O(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),O(0,["SSS",3],0,"millisecond"),O(0,["SSSS",4],0,function(){return 10*this.millisecond()}),O(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),O(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),O(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),O(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),O(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),se("S",Z,V),se("SS",Z,U),se("SSS",Z,H),Sn="SSSS";Sn.length<=9;Sn+="S")se(Sn,ee);function Pn(e,t){t[xe]=de(1e3*("0."+e))}for(Sn="S";Sn.length<=9;Sn+="S")pe(Sn,Pn);Cn=Ae("Milliseconds",!1),O("z",0,0,"zoneAbbr"),O("zz",0,0,"zoneName");var En=b.prototype;function An(e){return e}En.add=tn,En.calendar=function(e,t){1===arguments.length&&(arguments[0]?on(arguments[0])?(e=arguments[0],t=void 0):function(e){var t,n=i(e)&&!r(e),a=!1,s=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"];for(t=0;tn.valueOf():n.valueOf()9999?N(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):T(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",N(n,"Z")):N(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},En.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,t,n,a="moment",i="";return this.isLocal()||(a=0===this.utcOffset()?"moment.utc":"moment.parseZone",i="Z"),e="["+a+'("]',t=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n=i+'[")]',this.format(e+t+"-MM-DD[T]HH:mm:ss.SSS"+n)},"undefined"!=typeof Symbol&&null!=Symbol.for&&(En[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),En.toJSON=function(){return this.isValid()?this.toISOString():null},En.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},En.unix=function(){return Math.floor(this.valueOf()/1e3)},En.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},En.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},En.eraName=function(){var e,t,n,a=this.localeData().eras();for(e=0,t=a.length;ethis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},En.isLocal=function(){return!!this.isValid()&&!this._isUTC},En.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},En.isUtc=Gt,En.isUTC=Gt,En.zoneAbbr=function(){return this._isUTC?"UTC":""},En.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},En.dates=k("dates accessor is deprecated. Use date instead.",kn),En.months=k("months accessor is deprecated. Use month instead",Be),En.years=k("years accessor is deprecated. Use year instead",Ee),En.zone=k("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),En.isDSTShifted=k("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var e,t={};return v(t,this),(t=Rt(t))._a?(e=t._isUTC?h(t._a):Ot(t._a),this._isDSTShifted=this.isValid()&&function(e,t,n){var a,i=Math.min(e.length,t.length),o=Math.abs(e.length-t.length),r=0;for(a=0;a0):this._isDSTShifted=!1,this._isDSTShifted});var Ln=E.prototype;function Mn(e,t,n,a){var i=_t(),o=h().set(a,t);return i[n](o,e)}function Rn(e,t,n){if(l(e)&&(t=e,e=void 0),e=e||"",null!=t)return Mn(e,t,n,"month");var a,i=[];for(a=0;a<12;a++)i[a]=Mn(e,a,n,"month");return i}function zn(e,t,n,a){"boolean"==typeof e?(l(t)&&(n=t,t=void 0),t=t||""):(n=t=e,e=!1,l(t)&&(n=t,t=void 0),t=t||"");var i,o=_t(),r=e?o._week.dow:0,s=[];if(null!=n)return Mn(t,(n+r)%7,a,"day");for(i=0;i<7;i++)s[i]=Mn(t,(i+r)%7,a,"day");return s}Ln.calendar=function(e,t,n){var a=this._calendar[e]||this._calendar.sameElse;return T(a)?a.call(t,n):a},Ln.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(L).map(function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e}).join(""),this._longDateFormat[e])},Ln.invalidDate=function(){return this._invalidDate},Ln.ordinal=function(e){return this._ordinal.replace("%d",e)},Ln.preparse=An,Ln.postformat=An,Ln.relativeTime=function(e,t,n,a){var i=this._relativeTime[n];return T(i)?i(e,t,n,a):i.replace(/%d/i,e)},Ln.pastFuture=function(e,t){var n=this._relativeTime[e>0?"future":"past"];return T(n)?n(t):n.replace(/%s/i,t)},Ln.set=function(e){var t,n;for(n in e)o(e,n)&&(T(t=e[n])?this[n]=t:this["_"+n]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},Ln.eras=function(e,t){var a,i,o,r=this._eras||_t("en")._eras;for(a=0,i=r.length;a=0)return l[a]},Ln.erasConvertYear=function(e,t){var a=e.since<=e.until?1:-1;return void 0===t?n(e.since).year():n(e.since).year()+(t-e.offset)*a},Ln.erasAbbrRegex=function(e){return o(this,"_erasAbbrRegex")||vn.call(this),e?this._erasAbbrRegex:this._erasRegex},Ln.erasNameRegex=function(e){return o(this,"_erasNameRegex")||vn.call(this),e?this._erasNameRegex:this._erasRegex},Ln.erasNarrowRegex=function(e){return o(this,"_erasNarrowRegex")||vn.call(this),e?this._erasNarrowRegex:this._erasRegex},Ln.months=function(e,t){return e?a(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||Ie).test(t)?"format":"standalone"][e.month()]:a(this._months)?this._months:this._months.standalone},Ln.monthsShort=function(e,t){return e?a(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[Ie.test(t)?"format":"standalone"][e.month()]:a(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},Ln.monthsParse=function(e,t,n){var a,i,o;if(this._monthsParseExact)return qe.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),a=0;a<12;a++){if(i=h([2e3,a]),n&&!this._longMonthsParse[a]&&(this._longMonthsParse[a]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[a]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[a]||(o="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[a]=new RegExp(o.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[a].test(e))return a;if(n&&"MMM"===t&&this._shortMonthsParse[a].test(e))return a;if(!n&&this._monthsParse[a].test(e))return a}},Ln.monthsRegex=function(e){return this._monthsParseExact?(o(this,"_monthsRegex")||Fe.call(this),e?this._monthsStrictRegex:this._monthsRegex):(o(this,"_monthsRegex")||(this._monthsRegex=De),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},Ln.monthsShortRegex=function(e){return this._monthsParseExact?(o(this,"_monthsRegex")||Fe.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(o(this,"_monthsShortRegex")||(this._monthsShortRegex=Ne),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},Ln.week=function(e){return We(e,this._week.dow,this._week.doy).week},Ln.firstDayOfYear=function(){return this._week.doy},Ln.firstDayOfWeek=function(){return this._week.dow},Ln.weekdays=function(e,t){var n=a(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"];return!0===e?Ke(n,this._week.dow):e?n[e.day()]:n},Ln.weekdaysMin=function(e){return!0===e?Ke(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},Ln.weekdaysShort=function(e){return!0===e?Ke(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},Ln.weekdaysParse=function(e,t,n){var a,i,o;if(this._weekdaysParseExact)return tt.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),a=0;a<7;a++){if(i=h([2e3,1]).day(a),n&&!this._fullWeekdaysParse[a]&&(this._fullWeekdaysParse[a]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[a]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[a]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[a]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[a]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[a].test(e))return a;if(n&&"ddd"===t&&this._shortWeekdaysParse[a].test(e))return a;if(n&&"dd"===t&&this._minWeekdaysParse[a].test(e))return a;if(!n&&this._weekdaysParse[a].test(e))return a}},Ln.weekdaysRegex=function(e){return this._weekdaysParseExact?(o(this,"_weekdaysRegex")||nt.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(o(this,"_weekdaysRegex")||(this._weekdaysRegex=Je),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},Ln.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(o(this,"_weekdaysRegex")||nt.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(o(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Xe),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},Ln.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(o(this,"_weekdaysRegex")||nt.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(o(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=et),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},Ln.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},Ln.meridiem=function(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"},ft("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===de(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),n.lang=k("moment.lang is deprecated. Use moment.locale instead.",ft),n.langData=k("moment.langData is deprecated. Use moment.localeData instead.",_t);var On=Math.abs;function In(e,t,n,a){var i=Qt(t,n);return e._milliseconds+=a*i._milliseconds,e._days+=a*i._days,e._months+=a*i._months,e._bubble()}function Nn(e){return e<0?Math.floor(e):Math.ceil(e)}function Dn(e){return 4800*e/146097}function qn(e){return 146097*e/4800}function jn(e){return function(){return this.as(e)}}var Bn=jn("ms"),Fn=jn("s"),$n=jn("m"),Vn=jn("h"),Un=jn("d"),Hn=jn("w"),Wn=jn("M"),Gn=jn("Q"),Kn=jn("y"),Yn=Bn;function Qn(e){return function(){return this.isValid()?this._data[e]:NaN}}var Zn=Qn("milliseconds"),Jn=Qn("seconds"),Xn=Qn("minutes"),ea=Qn("hours"),ta=Qn("days"),na=Qn("months"),aa=Qn("years");var ia=Math.round,oa={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function ra(e,t,n,a,i){return i.relativeTime(t||1,!!n,e,a)}var sa=Math.abs;function la(e){return(e>0)-(e<0)||+e}function ua(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,a,i,o,r,s,l=sa(this._milliseconds)/1e3,u=sa(this._days),c=sa(this._months),d=this.asSeconds();return d?(e=ce(l/60),t=ce(e/60),l%=60,e%=60,n=ce(c/12),c%=12,a=l?l.toFixed(3).replace(/\.?0+$/,""):"",i=d<0?"-":"",o=la(this._months)!==la(d)?"-":"",r=la(this._days)!==la(d)?"-":"",s=la(this._milliseconds)!==la(d)?"-":"",i+"P"+(n?o+n+"Y":"")+(c?o+c+"M":"")+(u?r+u+"D":"")+(t||e||l?"T":"")+(t?s+t+"H":"")+(e?s+e+"M":"")+(l?s+a+"S":"")):"P0D"}var ca=jt.prototype;return ca.isValid=function(){return this._isValid},ca.abs=function(){var e=this._data;return this._milliseconds=On(this._milliseconds),this._days=On(this._days),this._months=On(this._months),e.milliseconds=On(e.milliseconds),e.seconds=On(e.seconds),e.minutes=On(e.minutes),e.hours=On(e.hours),e.months=On(e.months),e.years=On(e.years),this},ca.add=function(e,t){return In(this,e,t,1)},ca.subtract=function(e,t){return In(this,e,t,-1)},ca.as=function(e){if(!this.isValid())return NaN;var t,n,a=this._milliseconds;if("month"===(e=j(e))||"quarter"===e||"year"===e)switch(t=this._days+a/864e5,n=this._months+Dn(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(qn(this._months)),e){case"week":return t/7+a/6048e5;case"day":return t+a/864e5;case"hour":return 24*t+a/36e5;case"minute":return 1440*t+a/6e4;case"second":return 86400*t+a/1e3;case"millisecond":return Math.floor(864e5*t)+a;default:throw new Error("Unknown unit "+e)}},ca.asMilliseconds=Bn,ca.asSeconds=Fn,ca.asMinutes=$n,ca.asHours=Vn,ca.asDays=Un,ca.asWeeks=Hn,ca.asMonths=Wn,ca.asQuarters=Gn,ca.asYears=Kn,ca.valueOf=Yn,ca._bubble=function(){var e,t,n,a,i,o=this._milliseconds,r=this._days,s=this._months,l=this._data;return o>=0&&r>=0&&s>=0||o<=0&&r<=0&&s<=0||(o+=864e5*Nn(qn(s)+r),r=0,s=0),l.milliseconds=o%1e3,e=ce(o/1e3),l.seconds=e%60,t=ce(e/60),l.minutes=t%60,n=ce(t/60),l.hours=n%24,r+=ce(n/24),s+=i=ce(Dn(r)),r-=Nn(qn(i)),a=ce(s/12),s%=12,l.days=r,l.months=s,l.years=a,this},ca.clone=function(){return Qt(this)},ca.get=function(e){return e=j(e),this.isValid()?this[e+"s"]():NaN},ca.milliseconds=Zn,ca.seconds=Jn,ca.minutes=Xn,ca.hours=ea,ca.days=ta,ca.weeks=function(){return ce(this.days()/7)},ca.months=na,ca.years=aa,ca.humanize=function(e,t){if(!this.isValid())return this.localeData().invalidDate();var n,a,i=!1,o=oa;return"object"==typeof e&&(t=e,e=!1),"boolean"==typeof e&&(i=e),"object"==typeof t&&(o=Object.assign({},oa,t),null!=t.s&&null==t.ss&&(o.ss=t.s-1)),a=function(e,t,n,a){var i=Qt(e).abs(),o=ia(i.as("s")),r=ia(i.as("m")),s=ia(i.as("h")),l=ia(i.as("d")),u=ia(i.as("M")),c=ia(i.as("w")),d=ia(i.as("y")),h=o<=n.ss&&["s",o]||o0,h[4]=a,ra.apply(null,h)}(this,!i,o,n=this.localeData()),i&&(a=n.pastFuture(+this,a)),n.postformat(a)},ca.toISOString=ua,ca.toString=ua,ca.toJSON=ua,ca.locale=sn,ca.localeData=un,ca.toIsoString=k("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ua),ca.lang=ln,O("X",0,0,"unix"),O("x",0,0,"valueOf"),se("x",te),se("X",/[+-]?\d+(\.\d{1,3})?/),pe("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e))}),pe("x",function(e,t,n){n._d=new Date(de(e))}), //! moment.js -n.version="2.30.1",e=It,n.fn=En,n.min=function(){return jt("isBefore",[].slice.call(arguments,0))},n.max=function(){return jt("isAfter",[].slice.call(arguments,0))},n.now=function(){return Date.now?Date.now():+new Date},n.utc=h,n.unix=function(e){return It(1e3*e)},n.months=function(e,t){return Rn(e,t,"months")},n.isDate=u,n.locale=ft,n.invalid=m,n.duration=Qt,n.isMoment=y,n.weekdays=function(e,t,n){return zn(e,t,n,"weekdays")},n.parseZone=function(){return It.apply(null,arguments).parseZone()},n.localeData=_t,n.isDuration=Bt,n.monthsShort=function(e,t){return Rn(e,t,"monthsShort")},n.weekdaysMin=function(e,t,n){return zn(e,t,n,"weekdaysMin")},n.defineLocale=mt,n.updateLocale=function(e,t){if(null!=t){var n,a,i=lt;null!=ut[e]&&null!=ut[e].parentLocale?ut[e].set(P(ut[e]._config,t)):(null!=(a=pt(e))&&(i=a._config),t=P(i,t),null==a&&(t.abbr=e),(n=new E(t)).parentLocale=ut[e],ut[e]=n),ft(e)}else null!=ut[e]&&(null!=ut[e].parentLocale?(ut[e]=ut[e].parentLocale,e===ft()&&ft(e)):null!=ut[e]&&delete ut[e]);return ut[e]},n.locales=function(){return x(ut)},n.weekdaysShort=function(e,t,n){return zn(e,t,n,"weekdaysShort")},n.normalizeUnits=q,n.relativeTimeRounding=function(e){return void 0===e?ia:"function"==typeof e&&(ia=e,!0)},n.relativeTimeThreshold=function(e,t){return void 0!==ra[e]&&(void 0===t?ra[e]:(ra[e]=t,"s"===e&&(ra.ss=t-1),!0))},n.calendarFormat=function(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},n.prototype=En,n.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"},n}),function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("underscore",t):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var n=e._,a=e._=t();a.noConflict=function(){return e._=n,a}}())}(this,function(){var e="1.13.8",t="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},n=Array.prototype,a=Object.prototype,i="undefined"!=typeof Symbol?Symbol.prototype:null,r=n.push,o=n.slice,s=a.toString,l=a.hasOwnProperty,u="undefined"!=typeof ArrayBuffer,c="undefined"!=typeof DataView,d=Array.isArray,h=Object.keys,p=Object.create,f=u&&ArrayBuffer.isView,m=isNaN,_=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),v=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],b=Math.pow(2,53)-1;function y(e,t){return t=null==t?e.length-1:+t,function(){for(var n=Math.max(arguments.length-t,0),a=Array(n),i=0;i=0&&n<=b}}function G(e){return function(t){return null==t?void 0:t[e]}}var K=G("byteLength"),Y=W(K),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var Z=u?function(e){return f?f(e)&&!q(e):Y(e)&&Q.test(s.call(e))}:H(!1),J=G("length");function X(e,t){t=function(e){for(var t={},n=e.length,a=0;a":">",'"':""","'":"'","`":"`"},Fe=qe(Be),Ve=qe(ve(Be)),Ue=ne.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},$e=/(.)^/,He={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},We=/\\|'|\r|\n|\u2028|\u2029/g;function Ge(e){return"\\"+He[e]}var Ke=/^\s*(\w|\$)+\s*$/;var Ye=0;function Qe(e,t,n,a,i){if(!(a instanceof t))return e.apply(n,i);var r=Se(e.prototype),o=e.apply(r,i);return w(o)?o:r}var Ze=y(function(e,t){var n=Ze.placeholder,a=function(){for(var i=0,r=t.length,o=Array(r),s=0;s=o){if(!s.length)break;var l=s.pop();r=l.i,e=l.v,o=J(e)}else{var u=e[r++];s.length>=t?a[i++]=u:Xe(u)&&(B(u)||U(u))?(s.push({i:r,v:e}),r=0,o=J(e=u)):n||(a[i++]=u)}return a}var tt=y(function(e,t){var n=(t=et(t,!1,!1)).length;if(n<1)throw new Error("bindAll must be passed function names");for(;n--;){var a=t[n];e[a]=Je(e[a],e)}return e});var nt=y(function(e,t,n){return setTimeout(function(){return e.apply(null,n)},t)}),at=Ze(nt,ne,1);function it(e){return function(){return!e.apply(this,arguments)}}function rt(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}var ot=Ze(rt,2);function st(e,t,n){t=Ne(t,n);for(var a,i=ee(e),r=0,o=i.length;r0?0:i-1;r>=0&&r0?s=r>=0?r:Math.max(r+l,s):l=r>=0?Math.min(r+1,l):r+l+1;else if(n&&r&&l)return a[r=n(a,i)]===i?r:-1;if(i!=i)return(r=t(o.call(a,s,l),$))>=0?r+s:-1;for(r=e>0?s:l-1;r>=0&&r=3;return function(t,n,a,i){var r=!Xe(t)&&ee(t),o=(r||t).length,s=e>0?0:o-1;for(i||(a=t[r?r[s]:s],s+=e);s>=0&&s=0}var Ct=y(function(e,t,n){var a,i;return I(t)?i=t:(t=Te(t),a=t.slice(0,-1),t=t[t.length-1]),gt(e,function(e){var r=i;if(!r){if(a&&a.length&&(e=Pe(e,a)),null==e)return;r=e[t]}return null==r?r:r.apply(e,n)})});function Tt(e,t){return gt(e,Me(t))}function Pt(e,t,n){var a,i,r=-1/0,o=-1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,l=(e=Xe(e)?e:ge(e)).length;sr&&(r=a);else t=Ne(t,n),_t(e,function(e,n,a){((i=t(e,n,a))>o||i===-1/0&&r===-1/0)&&(r=e,o=i)});return r}var Et=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function At(e){return e?B(e)?o.call(e):C(e)?e.match(Et):Xe(e)?gt(e,Ae):ge(e):[]}function Lt(e,t,n){if(null==t||n)return Xe(e)||(e=ge(e)),e[je(e.length-1)];var a=At(e),i=J(a);t=Math.max(Math.min(t,i),0);for(var r=i-1,o=0;o1&&(a=Re(a,t[1])),t=re(e)):(a=Ot,t=et(t,!1,!1),e=Object(e));for(var i=0,r=t.length;i1&&(n=t[1])):(t=gt(et(t,!1,!1),String),a=function(e,n){return!St(t,n)}),jt(e,a,n)});function qt(e,t,n){return o.call(e,0,Math.max(0,e.length-(null==t||n?1:t)))}function Bt(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[0]:qt(e,e.length-t)}function Ft(e,t,n){return o.call(e,null==t||n?1:t)}var Vt=y(function(e,t){return t=et(t,!0,!0),wt(e,function(e){return!St(t,e)})}),Ut=y(function(e,t){return Vt(e,t)});function $t(e,t,n,a){x(t)||(a=n,n=t,t=!1),null!=n&&(n=Ne(n,a));for(var i=[],r=[],o=0,s=J(e);o=0))if(a.push(e),r.push(t),n.push(!0),c){if((p=e.length)!==t.length)return!1;for(;p--;)n.push({a:e[p],b:t[p]})}else{var f,m=ee(e);if(p=m.length,ee(t).length!==p)return!1;for(;p--;){if(!F(t,f=m[p]))return!1;n.push({a:e[f],b:t[f]})}}}else a.pop(),r.pop()}return!0},isMap:pe,isWeakMap:fe,isSet:me,isWeakSet:_e,keys:ee,allKeys:re,values:ge,pairs:function(e){for(var t=ee(e),n=t.length,a=Array(n),i=0;it?(a&&(clearTimeout(a),a=null),s=u,o=e.apply(i,r),a||(i=r=null)):a||!1===n.trailing||(a=setTimeout(l,c)),o};return u.cancel=function(){clearTimeout(a),s=0,a=i=r=null},u},debounce:function(e,t,n){var a,i,r,o,s,l=function(){var u=De()-i;t>u?a=setTimeout(l,t-u):(a=null,n||(o=e.apply(s,r)),a||(r=s=null))},u=y(function(u){return s=this,r=u,i=De(),a||(a=setTimeout(l,t),n&&(o=e.apply(s,r))),o});return u.cancel=function(){clearTimeout(a),a=r=s=null},u},wrap:function(e,t){return Ze(t,e)},negate:it,compose:function(){var e=arguments,t=e.length-1;return function(){for(var n=t,a=e[t].apply(this,arguments);n--;)a=e[n].call(this,a);return a}},after:function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},before:rt,once:ot,findKey:st,findIndex:ut,findLastIndex:ct,sortedIndex:dt,indexOf:pt,lastIndexOf:ft,find:mt,detect:mt,findWhere:function(e,t){return mt(e,Le(t))},each:_t,forEach:_t,map:gt,collect:gt,reduce:bt,foldl:bt,inject:bt,reduceRight:yt,foldr:yt,filter:wt,select:wt,reject:function(e,t,n){return wt(e,it(Ne(t)),n)},every:kt,all:kt,some:xt,any:xt,contains:St,includes:St,include:St,invoke:Ct,pluck:Tt,where:function(e,t){return wt(e,Le(t))},max:Pt,min:function(e,t,n){var a,i,r=1/0,o=1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,l=(e=Xe(e)?e:ge(e)).length;sa||void 0===n)return 1;if(ne.length)&&(t=e.length);for(var n=0,a=Array(t);n=0&&n<=b}}function G(e){return function(t){return null==t?void 0:t[e]}}var K=G("byteLength"),Y=W(K),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var Z=u?function(e){return f?f(e)&&!j(e):Y(e)&&Q.test(s.call(e))}:H(!1),J=G("length");function X(e,t){t=function(e){for(var t={},n=e.length,a=0;a":">",'"':""","'":"'","`":"`"},Fe=je(Be),$e=je(ve(Be)),Ve=ne.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Ue=/(.)^/,He={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},We=/\\|'|\r|\n|\u2028|\u2029/g;function Ge(e){return"\\"+He[e]}var Ke=/^\s*(\w|\$)+\s*$/;var Ye=0;function Qe(e,t,n,a,i){if(!(a instanceof t))return e.apply(n,i);var o=Se(e.prototype),r=e.apply(o,i);return w(r)?r:o}var Ze=y(function(e,t){var n=Ze.placeholder,a=function(){for(var i=0,o=t.length,r=Array(o),s=0;s=r){if(!s.length)break;var l=s.pop();o=l.i,e=l.v,r=J(e)}else{var u=e[o++];s.length>=t?a[i++]=u:Xe(u)&&(B(u)||V(u))?(s.push({i:o,v:e}),o=0,r=J(e=u)):n||(a[i++]=u)}return a}var tt=y(function(e,t){var n=(t=et(t,!1,!1)).length;if(n<1)throw new Error("bindAll must be passed function names");for(;n--;){var a=t[n];e[a]=Je(e[a],e)}return e});var nt=y(function(e,t,n){return setTimeout(function(){return e.apply(null,n)},t)}),at=Ze(nt,ne,1);function it(e){return function(){return!e.apply(this,arguments)}}function ot(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}var rt=Ze(ot,2);function st(e,t,n){t=Ie(t,n);for(var a,i=ee(e),o=0,r=i.length;o0?0:i-1;o>=0&&o0?s=o>=0?o:Math.max(o+l,s):l=o>=0?Math.min(o+1,l):o+l+1;else if(n&&o&&l)return a[o=n(a,i)]===i?o:-1;if(i!=i)return(o=t(r.call(a,s,l),U))>=0?o+s:-1;for(o=e>0?s:l-1;o>=0&&o=3;return function(t,n,a,i){var o=!Xe(t)&&ee(t),r=(o||t).length,s=e>0?0:r-1;for(i||(a=t[o?o[s]:s],s+=e);s>=0&&s=0}var Ct=y(function(e,t,n){var a,i;return O(t)?i=t:(t=Te(t),a=t.slice(0,-1),t=t[t.length-1]),gt(e,function(e){var o=i;if(!o){if(a&&a.length&&(e=Pe(e,a)),null==e)return;o=e[t]}return null==o?o:o.apply(e,n)})});function Tt(e,t){return gt(e,Me(t))}function Pt(e,t,n){var a,i,o=-1/0,r=-1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,l=(e=Xe(e)?e:ge(e)).length;so&&(o=a);else t=Ie(t,n),_t(e,function(e,n,a){((i=t(e,n,a))>r||i===-1/0&&o===-1/0)&&(o=e,r=i)});return o}var Et=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function At(e){return e?B(e)?r.call(e):C(e)?e.match(Et):Xe(e)?gt(e,Ae):ge(e):[]}function Lt(e,t,n){if(null==t||n)return Xe(e)||(e=ge(e)),e[De(e.length-1)];var a=At(e),i=J(a);t=Math.max(Math.min(t,i),0);for(var o=i-1,r=0;r1&&(a=Re(a,t[1])),t=oe(e)):(a=Nt,t=et(t,!1,!1),e=Object(e));for(var i=0,o=t.length;i1&&(n=t[1])):(t=gt(et(t,!1,!1),String),a=function(e,n){return!St(t,n)}),Dt(e,a,n)});function jt(e,t,n){return r.call(e,0,Math.max(0,e.length-(null==t||n?1:t)))}function Bt(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[0]:jt(e,e.length-t)}function Ft(e,t,n){return r.call(e,null==t||n?1:t)}var $t=y(function(e,t){return t=et(t,!0,!0),wt(e,function(e){return!St(t,e)})}),Vt=y(function(e,t){return $t(e,t)});function Ut(e,t,n,a){x(t)||(a=n,n=t,t=!1),null!=n&&(n=Ie(n,a));for(var i=[],o=[],r=0,s=J(e);r=0))if(a.push(e),o.push(t),n.push(!0),c){if((p=e.length)!==t.length)return!1;for(;p--;)n.push({a:e[p],b:t[p]})}else{var f,m=ee(e);if(p=m.length,ee(t).length!==p)return!1;for(;p--;){if(!F(t,f=m[p]))return!1;n.push({a:e[f],b:t[f]})}}}else a.pop(),o.pop()}return!0},isMap:pe,isWeakMap:fe,isSet:me,isWeakSet:_e,keys:ee,allKeys:oe,values:ge,pairs:function(e){for(var t=ee(e),n=t.length,a=Array(n),i=0;it?(a&&(clearTimeout(a),a=null),s=u,r=e.apply(i,o),a||(i=o=null)):a||!1===n.trailing||(a=setTimeout(l,c)),r};return u.cancel=function(){clearTimeout(a),s=0,a=i=o=null},u},debounce:function(e,t,n){var a,i,o,r,s,l=function(){var u=qe()-i;t>u?a=setTimeout(l,t-u):(a=null,n||(r=e.apply(s,o)),a||(o=s=null))},u=y(function(u){return s=this,o=u,i=qe(),a||(a=setTimeout(l,t),n&&(r=e.apply(s,o))),r});return u.cancel=function(){clearTimeout(a),a=o=s=null},u},wrap:function(e,t){return Ze(t,e)},negate:it,compose:function(){var e=arguments,t=e.length-1;return function(){for(var n=t,a=e[t].apply(this,arguments);n--;)a=e[n].call(this,a);return a}},after:function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},before:ot,once:rt,findKey:st,findIndex:ut,findLastIndex:ct,sortedIndex:dt,indexOf:pt,lastIndexOf:ft,find:mt,detect:mt,findWhere:function(e,t){return mt(e,Le(t))},each:_t,forEach:_t,map:gt,collect:gt,reduce:bt,foldl:bt,inject:bt,reduceRight:yt,foldr:yt,filter:wt,select:wt,reject:function(e,t,n){return wt(e,it(Ie(t)),n)},every:kt,all:kt,some:xt,any:xt,contains:St,includes:St,include:St,invoke:Ct,pluck:Tt,where:function(e,t){return wt(e,Le(t))},max:Pt,min:function(e,t,n){var a,i,o=1/0,r=1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,l=(e=Xe(e)?e:ge(e)).length;sa||void 0===n)return 1;if(ne.length)&&(t=e.length);for(var n=0,a=Array(t);n3?(i=f===a)&&(l=r[(s=r[4])?5:(s=3,3)],r[4]=r[5]=e):r[0]<=p&&((i=n<2&&pa||a>f)&&(r[4]=n,r[5]=a,h.n=f,s=0))}if(i||n>1)return o;throw d=!0,a}return function(i,c,f){if(u>1)throw TypeError("Generator is already running");for(d&&1===c&&p(c,f),s=c,l=f;(t=s<2?e:l)||!d;){r||(s?s<3?(s>1&&(h.n=-1),p(s,l)):h.n=l:h.v=l);try{if(u=2,r){if(s||(i="next"),t=r[i]){if(!(t=t.call(r,l)))throw TypeError("iterator result is not an object");if(!t.done)return t;l=t.value,s<2&&(s=0)}else 1===s&&(t=r.return)&&t.call(r),s<2&&(l=TypeError("The iterator does not provide a '"+i+"' method"),s=1);r=e}else if((t=(d=h.n<0)?l:n.call(a,h))!==o)break}catch(t){r=e,s=1,l=t}finally{u=1}}return{value:t,done:d}}}(n,i,r),!0),u}var o={};function s(){}function l(){}function u(){}t=Object.getPrototypeOf;var c=[][a]?t(t([][a]())):(b(t={},a,function(){return this}),t),d=u.prototype=s.prototype=Object.create(c);function h(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,u):(e.__proto__=u,b(e,i,"GeneratorFunction")),e.prototype=Object.create(d),e}return l.prototype=u,b(d,"constructor",u),b(u,"constructor",l),l.displayName="GeneratorFunction",b(u,i,"GeneratorFunction"),b(d),b(d,i,"Generator"),b(d,a,function(){return this}),b(d,"toString",function(){return"[object Generator]"}),(v=function(){return{w:r,m:h}})()}function b(e,t,n,a){var i=Object.defineProperty;try{i({},"",{})}catch(e){i=0}b=function(e,t,n,a){function r(t,n){b(e,t,function(e){return this._invoke(t,n,e)})}t?i?i(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},b(e,t,n,a)}function y(e){if(null!=e){var t=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(typeof e+" is not iterable")}function w(e,t){return w=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},w(e,t)}function k(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,i,r,o,s=[],l=!0,u=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(a=r.call(n)).done)&&(s.push(a.value),s.length!==t);l=!0);}catch(e){u=!0,i=e}finally{try{if(!l&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw i}}return s}}(e,t)||T(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function x(e){return function(e){if(Array.isArray(e))return t(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||T(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function S(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t);if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}function C(e){return C="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},C(e)}function T(e,n){if(e){if("string"==typeof e)return t(e,n);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?t(e,n):void 0}}function P(e){return function(){return new E(e.apply(this,arguments))}}function E(t){var n,a;function i(n,a){try{var o=t[n](a),s=o.value,l=s instanceof e;Promise.resolve(l?s.v:s).then(function(e){if(l){var a="return"===n&&s.k?n:"next";if(!s.k||e.done)return i(a,e);e=t[a](e).value}r(!!o.done,e)},function(e){i("throw",e)})}catch(e){r(2,e)}}function r(e,t){2===e?n.reject(t):n.resolve({value:t,done:e}),(n=n.next)?i(n.key,n.arg):a=null}this._invoke=function(e,t){return new Promise(function(r,o){var s={key:e,arg:t,resolve:r,reject:o,next:null};a?a=a.next=s:(n=a=s,i(e,t))})},"function"!=typeof t.return&&(this.return=void 0)}function A(e){var t="function"==typeof Map?new Map:void 0;return A=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return function(e,t,n){if(m())return Reflect.construct.apply(null,arguments);var a=[null];a.push.apply(a,t);var i=new(e.bind.apply(e,a));return n&&w(i,n.prototype),i}(e,arguments,p(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),w(n,e)},A(e)}function L(e,t){return function(){return e.apply(t,arguments)}}E.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},E.prototype.next=function(e){return this._invoke("next",e)},E.prototype.throw=function(e){return this._invoke("throw",e)},E.prototype.return=function(e){return this._invoke("return",e)};var M,R=Object.prototype.toString,z=Object.getPrototypeOf,I=Symbol.iterator,N=Symbol.toStringTag,O=function(){var e=Object.prototype.hasOwnProperty;return function(t,n){return e.call(t,n)}}(),j=function(e,t){for(var n=e,a=[];null!=n&&n!==Object.prototype;){if(-1!==a.indexOf(n))return!1;if(a.push(n),O(n,t))return!0;n=z(n)}return!1},D=(M=Object.create(null),function(e){var t=R.call(e);return M[t]||(M[t]=t.slice(8,-1).toLowerCase())}),q=function(e){return e=e.toLowerCase(),function(t){return D(t)===e}},B=function(e){return function(t){return C(t)===e}},F=Array.isArray,V=B("undefined");function U(e){return null!==e&&!V(e)&&null!==e.constructor&&!V(e.constructor)&&W(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}var $=q("ArrayBuffer");var H=B("string"),W=B("function"),G=B("number"),K=function(e){return null!==e&&"object"===C(e)},Y=function(e){if(!K(e))return!1;var t=z(e);return!(null!==t&&t!==Object.prototype&&null!==z(t)||j(e,N)||j(e,I))},Q=q("Date"),Z=q("File"),J=q("Blob"),X=q("FileList");var ee="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},te=void 0!==ee.FormData?ee.FormData:void 0,ne=q("URLSearchParams"),ae=k(["ReadableStream","Request","Response","Headers"].map(q),4),ie=ae[0],re=ae[1],oe=ae[2],se=ae[3];function le(e,t){var n,a,i=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).allOwnKeys,r=void 0!==i&&i;if(null!=e)if("object"!==C(e)&&(e=[e]),F(e))for(n=0,a=e.length;n0;)if(t===(n=a[i]).toLowerCase())return n;return null}var ce="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,de=function(e){return!V(e)&&e!==ce};var he,pe=(he="undefined"!=typeof Uint8Array&&z(Uint8Array),function(e){return he&&e instanceof he}),fe=q("HTMLFormElement"),me=Object.prototype.propertyIsEnumerable,_e=q("RegExp"),ge=function(e,t){var n=Object.getOwnPropertyDescriptors(e),a={};le(n,function(n,i){var r;!1!==(r=t(n,i,e))&&(a[i]=r||n)}),Object.defineProperties(e,a)};var ve,be,ye,we,ke=q("AsyncFunction"),xe=(ve="function"==typeof setImmediate,be=W(ce.postMessage),ve?setImmediate:be?(ye="axios@".concat(Math.random()),we=[],ce.addEventListener("message",function(e){var t=e.source,n=e.data;t===ce&&n===ye&&we.length&&we.shift()()},!1),function(e){we.push(e),ce.postMessage(ye,"*")}):function(e){return setTimeout(e)}),Se="undefined"!=typeof queueMicrotask?queueMicrotask.bind(ce):"undefined"!=typeof process&&process.nextTick||xe,Ce=function(e){return null!=e&&W(e[I])},Te={isArray:F,isArrayBuffer:$,isBuffer:U,isFormData:function(e){if(!e)return!1;if(te&&e instanceof te)return!0;var t=z(e);if(!t||t===Object.prototype)return!1;if(!W(e.append))return!1;var n=D(e);return"formdata"===n||"object"===n&&W(e.toString)&&"[object FormData]"===e.toString()},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&$(e.buffer)},isString:H,isNumber:G,isBoolean:function(e){return!0===e||!1===e},isObject:K,isPlainObject:Y,isEmptyObject:function(e){if(!K(e)||U(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:ie,isRequest:re,isResponse:oe,isHeaders:se,isUndefined:V,isDate:Q,isFile:Z,isReactNativeBlob:function(e){return!(!e||void 0===e.uri)},isReactNative:function(e){return e&&void 0!==e.getParts},isBlob:J,isRegExp:_e,isFunction:W,isStream:function(e){return K(e)&&W(e.pipe)},isURLSearchParams:ne,isTypedArray:pe,isFileList:X,forEach:le,merge:function e(){for(var t=de(this)&&this||{},n=t.caseless,a=t.skipUndefined,i={},r=function(t,r){if("__proto__"!==r&&"constructor"!==r&&"prototype"!==r){var o=n&&"string"==typeof r&&ue(i,r)||r,s=O(i,o)?i[o]:void 0;Y(s)&&Y(t)?i[o]=e(s,t):Y(t)?i[o]=e({},t):F(t)?i[o]=t.slice():a&&V(t)||(i[o]=t)}},o=0,s=arguments.length;o3&&void 0!==arguments[3]?arguments[3]:{}).allOwnKeys}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,a){e.prototype=Object.create(t.prototype,a),Object.defineProperty(e.prototype,"constructor",{__proto__:null,value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{__proto__:null,value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n,a){var i,r,o,s={};if(t=t||{},null==e)return t;do{for(r=(i=Object.getOwnPropertyNames(e)).length;r-- >0;)o=i[r],a&&!a(o,e,t)||s[o]||(t[o]=e[o],s[o]=!0);e=!1!==n&&z(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:D,kindOfTest:q,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var a=e.indexOf(t,n);return-1!==a&&a===n},toArray:function(e){if(!e)return null;if(F(e))return e;var t=e.length;if(!G(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},forEachEntry:function(e,t){for(var n,a=(e&&e[I]).call(e);(n=a.next())&&!n.done;){var i=n.value;t.call(e,i[0],i[1])}},matchAll:function(e,t){for(var n,a=[];null!==(n=e.exec(t));)a.push(n);return a},isHTMLForm:fe,hasOwnProperty:O,hasOwnProp:O,hasOwnInPrototypeChain:j,getSafeProp:function(e,t){return null!=e&&j(e,t)?e[t]:void 0},reduceDescriptors:ge,freezeMethods:function(e){ge(e,function(t,n){if(W(e)&&["arguments","caller","callee"].includes(n))return!1;var a=e[n];W(a)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+n+"'")}))})},toObjectSet:function(e,t){var n={},a=function(e){e.forEach(function(e){n[e]=!0})};return F(e)?a(e):a(String(e).split(t)),n},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n})},noop:function(){},toFiniteNumber:function(e,t){return null!=e&&Number.isFinite(e=+e)?e:t},findKey:ue,global:ce,isContextDefined:de,isSpecCompliantForm:function(e){return!!(e&&W(e.append)&&"FormData"===e[N]&&e[I])},toJSONObject:function(e){var t=new WeakSet,n=function(e){if(K(e)){if(t.has(e))return;if(U(e))return e;if(!("toJSON"in e)){t.add(e);var a=F(e)?[]:{};return le(e,function(e,t){var i=n(e);!V(i)&&(a[t]=i)}),t.delete(e),a}}return e};return n(e)},isAsyncFn:ke,isThenable:function(e){return e&&(K(e)||W(e))&&W(e.then)&&W(e.catch)},setImmediate:xe,asap:Se,isIterable:Ce,isSafeIterable:function(e){return null!=e&&j(e,I)&&Ce(e)}},Pe=Te.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]);var Ee=new RegExp("[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+","g"),Ae=new RegExp("[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+","g");function Le(e,t){return Te.isArray(e)?e.map(function(e){return Le(e,t)}):function(e){for(var t=0,n=e.length;tt;){var i=e.charCodeAt(n-1);if(9!==i&&32!==i)break;n-=1}return 0===t&&n===e.length?e:e.slice(t,n)}(String(e).replace(t,""))}function Me(e){var t=Object.create(null);return Te.forEach(e.toJSON(),function(e,n){t[n]=function(e){return Le(e,Ae)}(e)}),t}var Re=Symbol("internals");function ze(e){return e&&String(e).trim().toLowerCase()}function Ie(e){return!1===e||null==e?e:Te.isArray(e)?e.map(Ie):function(e){return Le(e,Ee)}(String(e))}function Ne(e,t,n,a,i){return Te.isFunction(a)?a.call(this,t,n):(i&&(t=n),Te.isString(t)?Te.isString(a)?-1!==t.indexOf(a):Te.isRegExp(a)?a.test(t):void 0:void 0)}var Oe=function(){return d(function e(t){u(this,e),t&&this.set(t)},[{key:"set",value:function(e,t,n){var a=this;function i(e,t,n){var i=ze(t);if(i){var r=Te.findKey(a,i);(!r||void 0===a[r]||!0===n||void 0===n&&!1!==a[r])&&(a[r||t]=Ie(e))}}var r=function(e,t){return Te.forEach(e,function(e,n){return i(e,n,t)})};if(Te.isPlainObject(e)||e instanceof this.constructor)r(e,t);else if(Te.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))r(function(e){var t,n,a,i={};return e&&e.split("\n").forEach(function(e){a=e.indexOf(":"),t=e.substring(0,a).trim().toLowerCase(),n=e.substring(a+1).trim(),!t||i[t]&&Pe[t]||("set-cookie"===t?i[t]?i[t].push(n):i[t]=[n]:i[t]=i[t]?i[t]+", "+n:n)}),i}(e),t);else if(Te.isObject(e)&&Te.isSafeIterable(e)){var o,s,l,u=Object.create(null),c=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=T(e))||t){n&&(e=n);var a=0,i=function(){};return{s:i,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:i}}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 r,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,r=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw r}}}}(e);try{for(c.s();!(l=c.n()).done;){var d=l.value;if(!Te.isArray(d))throw new TypeError("Object iterator must return a key-value pair");s=d[0],Te.hasOwnProp(u,s)?(o=u[s],u[s]=Te.isArray(o)?[].concat(x(o),[d[1]]):[o,d[1]]):u[s]=d[1]}}catch(e){c.e(e)}finally{c.f()}r(u,t)}else null!=e&&i(t,e,n);return this}},{key:"get",value:function(e,t){if(e=ze(e)){var n=Te.findKey(this,e);if(n){var a=this[n];if(!t)return a;if(!0===t)return function(e){for(var t,n=Object.create(null),a=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=a.exec(e);)n[t[1]]=t[2];return n}(a);if(Te.isFunction(t))return t.call(this,a,n);if(Te.isRegExp(t))return t.exec(a);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=ze(e)){var n=Te.findKey(this,e);return!(!n||void 0===this[n]||t&&!Ne(0,this[n],n,t))}return!1}},{key:"delete",value:function(e,t){var n=this,a=!1;function i(e){if(e=ze(e)){var i=Te.findKey(n,e);!i||t&&!Ne(0,n[i],i,t)||(delete n[i],a=!0)}}return Te.isArray(e)?e.forEach(i):i(e),a}},{key:"clear",value:function(e){for(var t=Object.keys(this),n=t.length,a=!1;n--;){var i=t[n];e&&!Ne(0,this[i],i,e,!0)||(delete this[i],a=!0)}return a}},{key:"normalize",value:function(e){var t=this,n={};return Te.forEach(this,function(a,i){var r=Te.findKey(n,i);if(r)return t[r]=Ie(a),void delete t[i];var o=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n})}(i):String(i).trim();o!==i&&delete t[i],t[o]=Ie(a),n[o]=!0}),this}},{key:"concat",value:function(){for(var e,t=arguments.length,n=new Array(t),a=0;a1?n-1:0),i=1;i0?je(e,t):Te.toJSONObject(e);return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:n,code:this.code,status:this.status}}}],[{key:"from",value:function(e,n,a,i,r,o){var s=new t(e.message,n||e.code,a,i,r);return s.cause=e,s.name=e.name,null!=e.status&&null==s.status&&(s.status=e.status),o&&Object.assign(s,o),s}}])}(A(Error));De.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE",De.ERR_BAD_OPTION="ERR_BAD_OPTION",De.ECONNABORTED="ECONNABORTED",De.ETIMEDOUT="ETIMEDOUT",De.ECONNREFUSED="ECONNREFUSED",De.ERR_NETWORK="ERR_NETWORK",De.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS",De.ERR_DEPRECATED="ERR_DEPRECATED",De.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE",De.ERR_BAD_REQUEST="ERR_BAD_REQUEST",De.ERR_CANCELED="ERR_CANCELED",De.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT",De.ERR_INVALID_URL="ERR_INVALID_URL",De.ERR_FORM_DATA_DEPTH_EXCEEDED="ERR_FORM_DATA_DEPTH_EXCEEDED";function qe(e){return Te.isPlainObject(e)||Te.isArray(e)}function Be(e){return Te.endsWith(e,"[]")?e.slice(0,-2):e}function Fe(e,t,n){return e?e.concat(t).map(function(e,t){return e=Be(e),!n&&t?"["+e+"]":e}).join(n?".":""):t}var Ve=Te.toFlatObject(Te,{},null,function(e){return/^is[A-Z]/.test(e)});function Ue(e,t,n){if(!Te.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;var a=(n=Te.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(e,t){return!Te.isUndefined(t[e])})).metaTokens,i=n.visitor||p,r=n.dots,o=n.indexes,s=n.Blob||"undefined"!=typeof Blob&&Blob,l=void 0===n.maxDepth?100:n.maxDepth,u=s&&Te.isSpecCompliantForm(t),c=[];if(!Te.isFunction(i))throw new TypeError("visitor must be a function");function d(e){if(null===e)return"";if(Te.isDate(e))return e.toISOString();if(Te.isBoolean(e))return e.toString();if(!u&&Te.isBlob(e))throw new De("Blob is not supported. Use a Buffer instead.");return Te.isArrayBuffer(e)||Te.isTypedArray(e)?u&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function h(e){if(e>l)throw new De("Object is too deeply nested ("+e+" levels). Max depth: "+l,De.ERR_FORM_DATA_DEPTH_EXCEEDED)}function p(e,n,i){var s=e;if(Te.isReactNative(t)&&Te.isReactNativeBlob(e))return t.append(Fe(i,n,r),d(e)),!1;if(e&&!i&&"object"===C(e))if(Te.endsWith(n,"{}"))n=a?n:n.slice(0,-2),e=function(e,t){if(l===1/0)return JSON.stringify(e);var n=[];return JSON.stringify(e,function(e,a){if(!Te.isObject(a))return a;for(;n.length&&n[n.length-1]!==this;)n.pop();return n.push(a),h(t+n.length-1),a})}(e,1);else if(Te.isArray(e)&&function(e){return Te.isArray(e)&&!e.some(qe)}(e)||(Te.isFileList(e)||Te.endsWith(n,"[]"))&&(s=Te.toArray(e)))return n=Be(n),s.forEach(function(e,a){!Te.isUndefined(e)&&null!==e&&t.append(!0===o?Fe([n],a,r):null===o?n:n+"[]",d(e))}),!1;return!!qe(e)||(t.append(Fe(i,n,r),d(e)),!1)}var f=Object.assign(Ve,{defaultVisitor:p,convertValue:d,isVisitable:qe});if(!Te.isObject(e))throw new TypeError("data must be an object");return function e(n,a){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(!Te.isUndefined(n)){if(h(r),-1!==c.indexOf(n))throw new Error("Circular reference detected in "+a.join("."));c.push(n),Te.forEach(n,function(n,o){!0===(!(Te.isUndefined(n)||null===n)&&i.call(t,n,Te.isString(o)?o.trim():o,a,f))&&e(n,a?a.concat(o):[o],r+1)}),c.pop()}}(e),t}function $e(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"};return encodeURIComponent(e).replace(/[!'()~]|%20/g,function(e){return t[e]})}function He(e,t){this._pairs=[],e&&Ue(e,this,t)}var We=He.prototype;function Ge(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Ke(e,t,n){if(!t)return e;var a,i=Te.isFunction(n)?{serialize:n}:n,r=Te.getSafeProp(i,"encode")||Ge,o=Te.getSafeProp(i,"serialize");if(a=o?o(t,i):Te.isURLSearchParams(t)?t.toString():new He(t,i).toString(r)){var s=e.indexOf("#");-1!==s&&(e=e.slice(0,s)),e+=(-1===e.indexOf("?")?"?":"&")+a}return e}We.append=function(e,t){this._pairs.push([e,t])},We.toString=function(e){var t=e?function(t){return e.call(this,t,$e)}:$e;return this._pairs.map(function(e){return t(e[0])+"="+t(e[1])},"").join("&")};var Ye=function(){return d(function e(){u(this,e),this.handlers=[]},[{key:"use",value:function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){Te.forEach(this.handlers,function(t){null!==t&&e(t)})}}])}(),Qe={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0,advertiseZstdAcceptEncoding:!1,validateStatusUndefinedResolves:!0},Ze={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:He,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},Je="undefined"!=typeof window&&"undefined"!=typeof document,Xe="object"===("undefined"==typeof navigator?"undefined":C(navigator))&&navigator||void 0,et=Je&&(!Xe||["ReactNative","NativeScript","NS"].indexOf(Xe.product)<0),tt="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,nt=Je&&window.location.href||"http://localhost",at=g(g({},Object.freeze({__proto__:null,hasBrowserEnv:Je,hasStandardBrowserEnv:et,hasStandardBrowserWebWorkerEnv:tt,navigator:Xe,origin:nt})),Ze);function it(e){if(e>100)throw new De("FormData field is too deeply nested ("+e+" levels). Max depth: 100",De.ERR_FORM_DATA_DEPTH_EXCEEDED)}function rt(e){function t(e,n,a,i){it(i);var r=e[i++];if("__proto__"===r)return!0;var o=Number.isFinite(+r),s=i>=e.length;return r=!r&&Te.isArray(a)?a.length:r,s?(Te.hasOwnProp(a,r)?a[r]=Te.isArray(a[r])?a[r].concat(n):[a[r],n]:a[r]=n,!o):(Te.hasOwnProp(a,r)&&Te.isObject(a[r])||(a[r]=[]),t(e,n,a[r],i)&&Te.isArray(a[r])&&(a[r]=function(e){var t,n,a={},i=Object.keys(e),r=i.length;for(t=0;t-1,r=Te.isObject(e);if(r&&Te.isHTMLForm(e)&&(e=new FormData(e)),Te.isFormData(e))return i?JSON.stringify(rt(e)):e;if(Te.isArrayBuffer(e)||Te.isBuffer(e)||Te.isStream(e)||Te.isFile(e)||Te.isBlob(e)||Te.isReadableStream(e))return e;if(Te.isArrayBufferView(e))return e.buffer;if(Te.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(r){var o=ot(this,"formSerializer");if(a.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return Ue(e,new at.classes.URLSearchParams,g({visitor:function(e,t,n,a){return at.isNode&&Te.isBuffer(e)?(this.append(t,e.toString("base64")),!1):a.defaultVisitor.apply(this,arguments)}},t))}(e,o).toString();if((n=Te.isFileList(e))||a.indexOf("multipart/form-data")>-1){var s=ot(this,"env"),l=s&&s.FormData;return Ue(n?{"files[]":e}:e,l&&new l,o)}}return r||i?(t.setContentType("application/json",!1),function(e,t,n){if(Te.isString(e))try{return(t||JSON.parse)(e),Te.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=ot(this,"transitional")||st.transitional,n=t&&t.forcedJSONParsing,a=ot(this,"responseType"),i="json"===a;if(Te.isResponse(e)||Te.isReadableStream(e))return e;if(e&&Te.isString(e)&&(n&&!a||i)){var r=!(t&&t.silentJSONParsing)&&i;try{return JSON.parse(e,ot(this,"parseReviver"))}catch(e){if(r){if("SyntaxError"===e.name)throw De.from(e,De.ERR_BAD_RESPONSE,this,null,ot(this,"response"));throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:at.classes.FormData,Blob:at.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};function lt(e,t){var n=this||st,a=t||n,i=Oe.from(a.headers),r=a.data;return Te.forEach(e,function(e){r=e.call(n,r,i.normalize(),t?t.status:void 0)}),i.normalize(),r}function ut(e){return!(!e||!e.__CANCEL__)}Te.forEach(["delete","get","head","post","put","patch","query"],function(e){st.headers[e]={}});var ct=function(e){function t(e,n,a){var i;return u(this,t),(i=l(this,t,[null==e?"canceled":e,De.ERR_CANCELED,n,a])).name="CanceledError",i.__CANCEL__=!0,i}return f(t,e),d(t)}(De);function dt(e,t,n){var a=n.config.validateStatus;n.status&&a&&!a(n.status)?t(new De("Request failed with status code "+n.status,n.status>=400&&n.status<500?De.ERR_BAD_REQUEST:De.ERR_BAD_RESPONSE,n.config,n.request,n)):e(n)}var ht=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,a=0,i=function(e,t){e=e||10;var n,a=new Array(e),i=new Array(e),r=0,o=0;return t=void 0!==t?t:1e3,function(s){var l=Date.now(),u=i[o];n||(n=l),a[r]=s,i[r]=l;for(var c=o,d=0;c!==r;)d+=a[c++],c%=e;if((r=(r+1)%e)===o&&(o=(o+1)%e),!(l-n1&&void 0!==arguments[1]?arguments[1]:Date.now();i=r,n=null,a&&(clearTimeout(a),a=null),e.apply(void 0,x(t))};return[function(){for(var e=Date.now(),t=e-i,s=arguments.length,l=new Array(s),u=0;u=r?o(l,e):(n=l,a||(a=setTimeout(function(){a=null,o(n)},r-t)))},function(){return n&&o(n)}]}(function(n){if(n&&"number"==typeof n.loaded){var r=n.loaded,o=n.lengthComputable?n.total:void 0,s=null!=o?Math.min(r,o):r,l=Math.max(0,s-a),u=i(l);a=Math.max(a,s);var c=h({loaded:s,total:o,progress:o?s/o:void 0,bytes:l,rate:u||void 0,estimated:u&&o?(o-s)/u:void 0,event:n,lengthComputable:null!=o},t?"download":"upload",!0);e(c)}},n)},pt=function(e,t){var n=null!=e;return[function(a){return t[0]({lengthComputable:n,total:e,loaded:a})},t[1]]},ft=function(e){return function(){for(var t=arguments.length,n=new Array(t),a=0;a=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102},Rt=function(e,t,n){return t+2=2&&37===a.charCodeAt(e-2)&&51===a.charCodeAt(e-1)&&(68===a.charCodeAt(e)||100===a.charCodeAt(e))};c>=0&&(61===a.charCodeAt(c)?(u++,c--):d(c)&&(u++,c-=3)),1===u&&c>=0&&(61===a.charCodeAt(c)||d(c))&&u++;var h=3*Math.floor(i/4)-(u||0);return h>0?h:0}for(var p=0,f=0,m=a.length;f=55296&&_<=56319&&f+1=56320&&g<=57343?(p+=4,f++):p+=3}else p+=3}return p}var It="1.18.0",Nt=Te.isFunction,Ot=function(e){return encodeURIComponent(e).replace(/%([0-9A-F]{2})/gi,function(e,t){return String.fromCharCode(parseInt(t,16))})},jt=function(e){if(!Te.isString(e))return e;try{return decodeURIComponent(e)}catch(t){return e}},Dt=function(e){try{for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a-1,z=Te.isNumber(M)&&M>-1,I=function(e){return Te.hasOwnProp(t,e)?t[e]:void 0},N=r||fetch,C=C?(C+"").toLowerCase():"text",O=Tt([d,h&&h.toAbortSignal()],f),j=null,D=O&&O.unsubscribe&&function(){O.unsubscribe()},B=null,F=function(){return new De("Request body larger than maxBodyLength limit",De.ERR_BAD_REQUEST,t,j)},e.p=1,V=void 0,(U=I("auth"))&&($=Te.getSafeProp(U,"username")||"",H=Te.getSafeProp(U,"password")||"",V={username:$,password:H}),qt(i)&&(W=new URL(i,at.origin),V||!W.username&&!W.password||(G=jt(W.username),K=jt(W.password),V={username:G,password:K}),(W.username||W.password)&&(W.username="",W.password="",i=W.href)),V&&(T.delete("authorization"),T.set("Authorization","Basic "+btoa(Ot((V.username||"")+":"+(V.password||""))))),!R||"string"!=typeof i||!i.startsWith("data:")){e.n=2;break}if(!(zt(i)>L)){e.n=2;break}throw new De("maxContentLength size of "+L+" exceeded",De.ERR_BAD_RESPONSE,t,j);case 2:if(!z||"get"===o||"head"===o){e.n=4;break}return e.n=3,y(u);case 3:if("number"!=typeof(Y=e.v)||!isFinite(Y)){e.n=4;break}if(q=Y,!(Y>M)){e.n=4;break}throw F();case 4:if(Q=z&&(Te.isReadableStream(u)||Te.isStream(u)),Z=function(e,t,n){return Lt(e,65536,function(e){if(z&&e>M)throw B=F();t&&t(e)},n)},!m||"get"===o||"head"===o||!S&&!Q){e.n=8;break}if(null!=q){e.n=6;break}return e.n=5,w(T,u);case 5:we=e.v,e.n=7;break;case 6:we=q;case 7:(0!==(q=we)||Q)&&(J=new s(i,{method:"POST",body:u,duplex:"half"}),Te.isFormData(u)&&(X=J.headers.get("content-type"))&&T.setContentType(X),J.body&&(ee=S&&pt(q,ht(ft(S)))||[],te=k(ee,2),ne=te[0],ae=te[1],u=Z(J.body,ne,ae))),e.n=10;break;case 8:if(!Q||c||!p||"get"===o||"head"===o){e.n=9;break}u=Z(u),e.n=10;break;case 9:if(!Q||!c||m||"get"===o||"head"===o){e.n=10;break}throw new De("Stream request bodies are not supported by the current fetch implementation",De.ERR_NOT_SUPPORT,t,j);case 10:return Te.isString(E)||(E=E?"include":"omit"),ie=c&&"credentials"in s.prototype,Te.isFormData(u)&&(re=T.getContentType())&&/^multipart\/form-data/i.test(re)&&!/boundary=/i.test(re)&&T.delete("content-type"),T.set("User-Agent","axios/"+It,!1),oe=g(g({},A),{},{signal:O,method:o.toUpperCase(),headers:Me(T.normalize()),body:u,duplex:"half",credentials:ie?E:void 0}),j=c&&new s(i,oe),e.n=11,c?N(j,A):N(i,oe);case 11:if(se=e.v,le=Oe.from(se.headers),!R){e.n=12;break}if(!(null!=(ue=Te.toFiniteNumber(le.getContentLength()))&&ue>L)){e.n=12;break}throw new De("maxContentLength size of "+L+" exceeded",De.ERR_BAD_RESPONSE,t,j);case 12:return ce=_&&("stream"===C||"response"===C),_&&se.body&&(x||R||ce&&D)&&(de={},["status","statusText","headers"].forEach(function(e){de[e]=se[e]}),he=Te.toFiniteNumber(le.getContentLength()),pe=x&&pt(he,ht(ft(x),!0))||[],fe=k(pe,2),me=fe[0],_e=fe[1],ge=function(e){if(R&&e>L)throw new De("maxContentLength size of "+L+" exceeded",De.ERR_BAD_RESPONSE,t,j);me&&me(e)},se=new l(Lt(se.body,65536,ge,function(){_e&&_e(),D&&D()}),de)),C=C||"text",e.n=13,b[Te.findKey(b,C)||"text"](se,t);case 13:if(ve=e.v,!R||_||ce){e.n=14;break}if(null!=ve&&("number"==typeof ve.byteLength?be=ve.byteLength:"number"==typeof ve.size?be=ve.size:"string"==typeof ve&&(be="function"==typeof a?(new a).encode(ve).byteLength:ve.length)),!("number"==typeof be&&be>L)){e.n=14;break}throw new De("maxContentLength size of "+L+" exceeded",De.ERR_BAD_RESPONSE,t,j);case 14:return!ce&&D&&D(),e.n=15,new Promise(function(e,n){dt(e,n,{data:ve,headers:Oe.from(se.headers),status:se.status,statusText:se.statusText,config:t,request:j})});case 15:return e.a(2,e.v);case 16:if(e.p=16,ke=e.v,D&&D(),!(O&&O.aborted&&O.reason instanceof De)){e.n=17;break}throw(ye=O.reason).config=t,j&&(ye.request=j),ke!==ye&&(ye.cause=ke),ye;case 17:if(!B){e.n=18;break}throw j&&!B.request&&(B.request=j),B;case 18:if(!(ke instanceof De)){e.n=19;break}throw j&&!ke.request&&(ke.request=j),ke;case 19:if(!ke||"TypeError"!==ke.name||!/Load failed|fetch/i.test(ke.message)){e.n=20;break}throw Object.assign(new De("Network Error",De.ERR_NETWORK,t,j,ke&&ke.response),{cause:ke.cause||ke});case 20:throw De.from(ke,ke&&ke.code,t,j,ke&&ke.response);case 21:return e.a(2)}},e,null,[[1,16]])}));return function(t){return e.apply(this,arguments)}}()},Ft=new Map,Vt=function(e){for(var t,n,a=e&&e.env||{},i=a.fetch,r=[a.Request,a.Response,i],o=r.length,s=Ft;o--;)t=r[o],void 0===(n=s.get(t))&&s.set(t,n=o?new Map:Bt(a)),s=n;return n};Vt();var Ut={http:null,xhr:Ct,fetch:{get:Vt}};Te.forEach(Ut,function(e,t){if(e){try{Object.defineProperty(e,"name",{__proto__:null,value:t})}catch(e){}Object.defineProperty(e,"adapterName",{__proto__:null,value:t})}});var $t=function(e){return"- ".concat(e)},Ht=function(e){return Te.isFunction(e)||null===e||!1===e};var Wt={getAdapter:function(e,t){for(var n,a,i=(e=Te.isArray(e)?e:[e]).length,r={},o=0;o1?"since :\n"+l.map($t).join("\n"):" "+$t(l[0]):"as no adapter specified";throw new De("There is no suitable adapter to dispatch the request "+u,"ERR_NOT_SUPPORT")}return a},adapters:Ut};function Gt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new ct(null,e)}function Kt(e){return Gt(e),e.headers=Oe.from(e.headers),e.data=lt.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Wt.getAdapter(e.adapter||st.adapter,e)(e).then(function(t){Gt(e),e.response=t;try{t.data=lt.call(e,e.transformResponse,t)}finally{delete e.response}return t.headers=Oe.from(t.headers),t},function(t){if(!ut(t)&&(Gt(e),t&&t.response)){e.response=t.response;try{t.response.data=lt.call(e,e.transformResponse,t.response)}finally{delete e.response}t.response.headers=Oe.from(t.response.headers)}return Promise.reject(t)})}var Yt={};["object","boolean","number","function","string","symbol"].forEach(function(e,t){Yt[e]=function(n){return C(n)===e||"a"+(t<1?"n ":" ")+e}});var Qt={};Yt.transitional=function(e,t,n){function a(e,t){return"[Axios v"+It+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,i,r){if(!1===e)throw new De(a(i," has been removed"+(t?" in "+t:"")),De.ERR_DEPRECATED);return t&&!Qt[i]&&(Qt[i]=!0,console.warn(a(i," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,i,r)}},Yt.spelling=function(e){return function(t,n){return console.warn("".concat(n," is likely a misspelling of ").concat(e)),!0}};var Zt={assertOptions:function(e,t,n){if("object"!==C(e))throw new De("options must be an object",De.ERR_BAD_OPTION_VALUE);for(var a=Object.keys(e),i=a.length;i-- >0;){var r=a[i],o=Object.prototype.hasOwnProperty.call(t,r)?t[r]:void 0;if(o){var s=e[r],l=void 0===s||o(s,r,e);if(!0!==l)throw new De("option "+r+" must be "+l,De.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new De("Unknown option "+r,De.ERR_BAD_OPTION)}},validators:Yt},Jt=Zt.validators,Xt=function(){return d(function e(t){u(this,e),this.defaults=t||{},this.interceptors={request:new Ye,response:new Ye}},[{key:"request",value:(e=o(v().m(function e(t,n){var a,i,r,o,s,l;return v().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,this._request(t,n);case 1:return e.a(2,e.v);case 2:if(e.p=2,(l=e.v)instanceof Error){a={},Error.captureStackTrace?Error.captureStackTrace(a):a=new Error,i=function(){if(!a.stack)return"";var e=a.stack.indexOf("\n");return-1===e?"":a.stack.slice(e+1)}();try{l.stack?i&&(r=i.indexOf("\n"),o=-1===r?-1:i.indexOf("\n",r+1),s=-1===o?"":i.slice(o+1),String(l.stack).endsWith(s)||(l.stack+="\n"+i)):l.stack=i}catch(e){}}throw l;case 3:return e.a(2)}},e,this,[[0,2]])})),function(t,n){return e.apply(this,arguments)})},{key:"_request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var n=t=kt(this.defaults,t),a=n.transitional,i=n.paramsSerializer,r=n.headers;void 0!==a&&Zt.assertOptions(a,{silentJSONParsing:Jt.transitional(Jt.boolean),forcedJSONParsing:Jt.transitional(Jt.boolean),clarifyTimeoutError:Jt.transitional(Jt.boolean),legacyInterceptorReqResOrdering:Jt.transitional(Jt.boolean),advertiseZstdAcceptEncoding:Jt.transitional(Jt.boolean),validateStatusUndefinedResolves:Jt.transitional(Jt.boolean)},!1),null!=i&&(Te.isFunction(i)?t.paramsSerializer={serialize:i}:Zt.assertOptions(i,{encode:Jt.function,serialize:Jt.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),Zt.assertOptions(t,{baseUrl:Jt.spelling("baseURL"),withXsrfToken:Jt.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();var o=r&&Te.merge(r.common,r[t.method]);r&&Te.forEach(["delete","get","head","post","put","patch","query","common"],function(e){delete r[e]}),t.headers=Oe.concat(o,r);var s=[],l=!0;this.interceptors.request.forEach(function(e){if("function"!=typeof e.runWhen||!1!==e.runWhen(t)){l=l&&e.synchronous;var n=t.transitional||Qe;n&&n.legacyInterceptorReqResOrdering?s.unshift(e.fulfilled,e.rejected):s.push(e.fulfilled,e.rejected)}});var u,c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});var d,h=0;if(!l){var p=[Kt.bind(this),void 0];for(p.unshift.apply(p,s),p.push.apply(p,c),d=p.length,u=Promise.resolve(t);h0;)a._listeners[t](e);a._listeners=null}}),this.promise.then=function(e){var t,n=new Promise(function(e){a.subscribe(e),t=e}).then(e);return n.cancel=function(){a.unsubscribe(t)},n},t(function(e,t,i){a.reason||(a.reason=new ct(e,t,i),n(a.reason))})}return d(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}},{key:"toAbortSignal",value:function(){var e=this,t=new AbortController,n=function(e){t.abort(e)};return this.subscribe(n),t.signal.unsubscribe=function(){return e.unsubscribe(n)},t.signal}}],[{key:"source",value:function(){var t;return{token:new e(function(e){t=e}),cancel:t}}}])}();var tn={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(tn).forEach(function(e){var t=k(e,2),n=t[0],a=t[1];tn[a]=n});var nn=function e(t){var n=new Xt(t),a=L(Xt.prototype.request,n);return Te.extend(a,Xt.prototype,n,{allOwnKeys:!0}),Te.extend(a,n,null,{allOwnKeys:!0}),a.create=function(n){return e(kt(t,n))},a}(st);return nn.Axios=Xt,nn.CanceledError=ct,nn.CancelToken=en,nn.isCancel=ut,nn.VERSION=It,nn.toFormData=Ue,nn.AxiosError=De,nn.Cancel=nn.CanceledError,nn.all=function(e){return Promise.all(e)},nn.spread=function(e){return function(t){return e.apply(null,t)}},nn.isAxiosError=function(e){return Te.isObject(e)&&!0===e.isAxiosError},nn.mergeConfig=kt,nn.AxiosHeaders=Oe,nn.formToJSON=function(e){return rt(Te.isHTMLForm(e)?new FormData(e):e)},nn.getAdapter=Wt.getAdapter,nn.HttpStatusCode=tn,nn.default=nn,nn}); +var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",i=n.toStringTag||"@@toStringTag";function o(n,a,i,o){var l=a&&a.prototype instanceof s?a:s,u=Object.create(l.prototype);return b(u,"_invoke",function(n,a,i){var o,s,l,u=0,c=i||[],d=!1,h={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return o=t,s=0,l=e,h.n=n,r}};function p(n,a){for(s=n,l=a,t=0;!d&&u&&!i&&t3?(i=f===a)&&(l=o[(s=o[4])?5:(s=3,3)],o[4]=o[5]=e):o[0]<=p&&((i=n<2&&pa||a>f)&&(o[4]=n,o[5]=a,h.n=f,s=0))}if(i||n>1)return r;throw d=!0,a}return function(i,c,f){if(u>1)throw TypeError("Generator is already running");for(d&&1===c&&p(c,f),s=c,l=f;(t=s<2?e:l)||!d;){o||(s?s<3?(s>1&&(h.n=-1),p(s,l)):h.n=l:h.v=l);try{if(u=2,o){if(s||(i="next"),t=o[i]){if(!(t=t.call(o,l)))throw TypeError("iterator result is not an object");if(!t.done)return t;l=t.value,s<2&&(s=0)}else 1===s&&(t=o.return)&&t.call(o),s<2&&(l=TypeError("The iterator does not provide a '"+i+"' method"),s=1);o=e}else if((t=(d=h.n<0)?l:n.call(a,h))!==r)break}catch(t){o=e,s=1,l=t}finally{u=1}}return{value:t,done:d}}}(n,i,o),!0),u}var r={};function s(){}function l(){}function u(){}t=Object.getPrototypeOf;var c=[][a]?t(t([][a]())):(b(t={},a,function(){return this}),t),d=u.prototype=s.prototype=Object.create(c);function h(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,u):(e.__proto__=u,b(e,i,"GeneratorFunction")),e.prototype=Object.create(d),e}return l.prototype=u,b(d,"constructor",u),b(u,"constructor",l),l.displayName="GeneratorFunction",b(u,i,"GeneratorFunction"),b(d),b(d,i,"Generator"),b(d,a,function(){return this}),b(d,"toString",function(){return"[object Generator]"}),(v=function(){return{w:o,m:h}})()}function b(e,t,n,a){var i=Object.defineProperty;try{i({},"",{})}catch(e){i=0}b=function(e,t,n,a){function o(t,n){b(e,t,function(e){return this._invoke(t,n,e)})}t?i?i(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(o("next",0),o("throw",1),o("return",2))},b(e,t,n,a)}function y(e){if(null!=e){var t=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(typeof e+" is not iterable")}function w(e,t){return w=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},w(e,t)}function k(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,i,o,r,s=[],l=!0,u=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(a=o.call(n)).done)&&(s.push(a.value),s.length!==t);l=!0);}catch(e){u=!0,i=e}finally{try{if(!l&&null!=n.return&&(r=n.return(),Object(r)!==r))return}finally{if(u)throw i}}return s}}(e,t)||T(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function x(e){return function(e){if(Array.isArray(e))return t(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||T(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function S(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t);if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}function C(e){return C="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},C(e)}function T(e,n){if(e){if("string"==typeof e)return t(e,n);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?t(e,n):void 0}}function P(e){return function(){return new E(e.apply(this,arguments))}}function E(t){var n,a;function i(n,a){try{var r=t[n](a),s=r.value,l=s instanceof e;Promise.resolve(l?s.v:s).then(function(e){if(l){var a="return"===n?"return":"next";if(!s.k||e.done)return i(a,e);e=t[a](e).value}o(r.done?"return":"normal",e)},function(e){i("throw",e)})}catch(e){o("throw",e)}}function o(e,t){switch(e){case"return":n.resolve({value:t,done:!0});break;case"throw":n.reject(t);break;default:n.resolve({value:t,done:!1})}(n=n.next)?i(n.key,n.arg):a=null}this._invoke=function(e,t){return new Promise(function(o,r){var s={key:e,arg:t,resolve:o,reject:r,next:null};a?a=a.next=s:(n=a=s,i(e,t))})},"function"!=typeof t.return&&(this.return=void 0)}function A(e){var t="function"==typeof Map?new Map:void 0;return A=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return function(e,t,n){if(m())return Reflect.construct.apply(null,arguments);var a=[null];a.push.apply(a,t);var i=new(e.bind.apply(e,a));return n&&w(i,n.prototype),i}(e,arguments,p(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),w(n,e)},A(e)}function L(e,t){return function(){return e.apply(t,arguments)}}E.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},E.prototype.next=function(e){return this._invoke("next",e)},E.prototype.throw=function(e){return this._invoke("throw",e)},E.prototype.return=function(e){return this._invoke("return",e)};var M,R=Object.prototype.toString,z=Object.getPrototypeOf,O=Symbol.iterator,I=Symbol.toStringTag,N=(M=Object.create(null),function(e){var t=R.call(e);return M[t]||(M[t]=t.slice(8,-1).toLowerCase())}),D=function(e){return e=e.toLowerCase(),function(t){return N(t)===e}},q=function(e){return function(t){return C(t)===e}},j=Array.isArray,B=q("undefined");function F(e){return null!==e&&!B(e)&&null!==e.constructor&&!B(e.constructor)&&U(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}var $=D("ArrayBuffer");var V=q("string"),U=q("function"),H=q("number"),W=function(e){return null!==e&&"object"===C(e)},G=function(e){if("object"!==N(e))return!1;var t=z(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||I in e||O in e)},K=D("Date"),Y=D("File"),Q=D("Blob"),Z=D("FileList");var J="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},X=void 0!==J.FormData?J.FormData:void 0,ee=D("URLSearchParams"),te=k(["ReadableStream","Request","Response","Headers"].map(D),4),ne=te[0],ae=te[1],ie=te[2],oe=te[3];function re(e,t){var n,a,i=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).allOwnKeys,o=void 0!==i&&i;if(null!=e)if("object"!==C(e)&&(e=[e]),j(e))for(n=0,a=e.length;n0;)if(t===(n=a[i]).toLowerCase())return n;return null}var le="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,ue=function(e){return!B(e)&&e!==le};var ce,de=(ce="undefined"!=typeof Uint8Array&&z(Uint8Array),function(e){return ce&&e instanceof ce}),he=D("HTMLFormElement"),pe=function(){var e=Object.prototype.hasOwnProperty;return function(t,n){return e.call(t,n)}}(),fe=D("RegExp"),me=function(e,t){var n=Object.getOwnPropertyDescriptors(e),a={};re(n,function(n,i){var o;!1!==(o=t(n,i,e))&&(a[i]=o||n)}),Object.defineProperties(e,a)};var _e,ge,ve,be,ye=D("AsyncFunction"),we=(_e="function"==typeof setImmediate,ge=U(le.postMessage),_e?setImmediate:ge?(ve="axios@".concat(Math.random()),be=[],le.addEventListener("message",function(e){var t=e.source,n=e.data;t===le&&n===ve&&be.length&&be.shift()()},!1),function(e){be.push(e),le.postMessage(ve,"*")}):function(e){return setTimeout(e)}),ke="undefined"!=typeof queueMicrotask?queueMicrotask.bind(le):"undefined"!=typeof process&&process.nextTick||we,xe={isArray:j,isArrayBuffer:$,isBuffer:F,isFormData:function(e){if(!e)return!1;if(X&&e instanceof X)return!0;var t=z(e);if(!t||t===Object.prototype)return!1;if(!U(e.append))return!1;var n=N(e);return"formdata"===n||"object"===n&&U(e.toString)&&"[object FormData]"===e.toString()},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&$(e.buffer)},isString:V,isNumber:H,isBoolean:function(e){return!0===e||!1===e},isObject:W,isPlainObject:G,isEmptyObject:function(e){if(!W(e)||F(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:ne,isRequest:ae,isResponse:ie,isHeaders:oe,isUndefined:B,isDate:K,isFile:Y,isReactNativeBlob:function(e){return!(!e||void 0===e.uri)},isReactNative:function(e){return e&&void 0!==e.getParts},isBlob:Q,isRegExp:fe,isFunction:U,isStream:function(e){return W(e)&&U(e.pipe)},isURLSearchParams:ee,isTypedArray:de,isFileList:Z,forEach:re,merge:function e(){for(var t=ue(this)&&this||{},n=t.caseless,a=t.skipUndefined,i={},o=function(t,o){if("__proto__"!==o&&"constructor"!==o&&"prototype"!==o){var r=n&&se(i,o)||o,s=pe(i,r)?i[r]:void 0;G(s)&&G(t)?i[r]=e(s,t):G(t)?i[r]=e({},t):j(t)?i[r]=t.slice():a&&B(t)||(i[r]=t)}},r=arguments.length,s=new Array(r),l=0;l3&&void 0!==arguments[3]?arguments[3]:{}).allOwnKeys}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,a){e.prototype=Object.create(t.prototype,a),Object.defineProperty(e.prototype,"constructor",{__proto__:null,value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{__proto__:null,value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n,a){var i,o,r,s={};if(t=t||{},null==e)return t;do{for(o=(i=Object.getOwnPropertyNames(e)).length;o-- >0;)r=i[o],a&&!a(r,e,t)||s[r]||(t[r]=e[r],s[r]=!0);e=!1!==n&&z(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:N,kindOfTest:D,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var a=e.indexOf(t,n);return-1!==a&&a===n},toArray:function(e){if(!e)return null;if(j(e))return e;var t=e.length;if(!H(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},forEachEntry:function(e,t){for(var n,a=(e&&e[O]).call(e);(n=a.next())&&!n.done;){var i=n.value;t.call(e,i[0],i[1])}},matchAll:function(e,t){for(var n,a=[];null!==(n=e.exec(t));)a.push(n);return a},isHTMLForm:he,hasOwnProperty:pe,hasOwnProp:pe,reduceDescriptors:me,freezeMethods:function(e){me(e,function(t,n){if(U(e)&&["arguments","caller","callee"].includes(n))return!1;var a=e[n];U(a)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+n+"'")}))})},toObjectSet:function(e,t){var n={},a=function(e){e.forEach(function(e){n[e]=!0})};return j(e)?a(e):a(String(e).split(t)),n},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n})},noop:function(){},toFiniteNumber:function(e,t){return null!=e&&Number.isFinite(e=+e)?e:t},findKey:se,global:le,isContextDefined:ue,isSpecCompliantForm:function(e){return!!(e&&U(e.append)&&"FormData"===e[I]&&e[O])},toJSONObject:function(e){var t=new Array(10),n=function(e,a){if(W(e)){if(t.indexOf(e)>=0)return;if(F(e))return e;if(!("toJSON"in e)){t[a]=e;var i=j(e)?[]:{};return re(e,function(e,t){var o=n(e,a+1);!B(o)&&(i[t]=o)}),t[a]=void 0,i}}return e};return n(e,0)},isAsyncFn:ye,isThenable:function(e){return e&&(W(e)||U(e))&&U(e.then)&&U(e.catch)},setImmediate:we,asap:ke,isIterable:function(e){return null!=e&&U(e[O])}},Se=xe.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Ce=Symbol("internals"),Te=/[^\x09\x20-\x7E\x80-\xFF]/g;function Pe(e){return e&&String(e).trim().toLowerCase()}function Ee(e){return!1===e||null==e?e:xe.isArray(e)?e.map(Ee):function(e){for(var t=0,n=e.length;tt;){var i=e.charCodeAt(n-1);if(9!==i&&32!==i)break;n-=1}return 0===t&&n===e.length?e:e.slice(t,n)}(String(e).replace(Te,""))}function Ae(e,t,n,a,i){return xe.isFunction(a)?a.call(this,t,n):(i&&(t=n),xe.isString(t)?xe.isString(a)?-1!==t.indexOf(a):xe.isRegExp(a)?a.test(t):void 0:void 0)}var Le=function(){return d(function e(t){u(this,e),t&&this.set(t)},[{key:"set",value:function(e,t,n){var a=this;function i(e,t,n){var i=Pe(t);if(!i)throw new Error("header name must be a non-empty string");var o=xe.findKey(a,i);(!o||void 0===a[o]||!0===n||void 0===n&&!1!==a[o])&&(a[o||t]=Ee(e))}var o=function(e,t){return xe.forEach(e,function(e,n){return i(e,n,t)})};if(xe.isPlainObject(e)||e instanceof this.constructor)o(e,t);else if(xe.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))o(function(e){var t,n,a,i={};return e&&e.split("\n").forEach(function(e){a=e.indexOf(":"),t=e.substring(0,a).trim().toLowerCase(),n=e.substring(a+1).trim(),!t||i[t]&&Se[t]||("set-cookie"===t?i[t]?i[t].push(n):i[t]=[n]:i[t]=i[t]?i[t]+", "+n:n)}),i}(e),t);else if(xe.isObject(e)&&xe.isIterable(e)){var r,s,l,u={},c=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=T(e))||t){n&&(e=n);var a=0,i=function(){};return{s:i,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:i}}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 o,r=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return r=e.done,e},e:function(e){s=!0,o=e},f:function(){try{r||null==n.return||n.return()}finally{if(s)throw o}}}}(e);try{for(c.s();!(l=c.n()).done;){var d=l.value;if(!xe.isArray(d))throw TypeError("Object iterator must return a key-value pair");u[s=d[0]]=(r=u[s])?xe.isArray(r)?[].concat(x(r),[d[1]]):[r,d[1]]:d[1]}}catch(e){c.e(e)}finally{c.f()}o(u,t)}else null!=e&&i(t,e,n);return this}},{key:"get",value:function(e,t){if(e=Pe(e)){var n=xe.findKey(this,e);if(n){var a=this[n];if(!t)return a;if(!0===t)return function(e){for(var t,n=Object.create(null),a=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=a.exec(e);)n[t[1]]=t[2];return n}(a);if(xe.isFunction(t))return t.call(this,a,n);if(xe.isRegExp(t))return t.exec(a);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=Pe(e)){var n=xe.findKey(this,e);return!(!n||void 0===this[n]||t&&!Ae(0,this[n],n,t))}return!1}},{key:"delete",value:function(e,t){var n=this,a=!1;function i(e){if(e=Pe(e)){var i=xe.findKey(n,e);!i||t&&!Ae(0,n[i],i,t)||(delete n[i],a=!0)}}return xe.isArray(e)?e.forEach(i):i(e),a}},{key:"clear",value:function(e){for(var t=Object.keys(this),n=t.length,a=!1;n--;){var i=t[n];e&&!Ae(0,this[i],i,e,!0)||(delete this[i],a=!0)}return a}},{key:"normalize",value:function(e){var t=this,n={};return xe.forEach(this,function(a,i){var o=xe.findKey(n,i);if(o)return t[o]=Ee(a),void delete t[i];var r=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n})}(i):String(i).trim();r!==i&&delete t[i],t[r]=Ee(a),n[r]=!0}),this}},{key:"concat",value:function(){for(var e,t=arguments.length,n=new Array(t),a=0;a1?n-1:0),i=1;i0?Me(e,t):xe.toJSONObject(e);return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:n,code:this.code,status:this.status}}}],[{key:"from",value:function(e,n,a,i,o,r){var s=new t(e.message,n||e.code,a,i,o);return s.cause=e,s.name=e.name,null!=e.status&&null==s.status&&(s.status=e.status),r&&Object.assign(s,r),s}}])}(A(Error));Re.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE",Re.ERR_BAD_OPTION="ERR_BAD_OPTION",Re.ECONNABORTED="ECONNABORTED",Re.ETIMEDOUT="ETIMEDOUT",Re.ECONNREFUSED="ECONNREFUSED",Re.ERR_NETWORK="ERR_NETWORK",Re.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS",Re.ERR_DEPRECATED="ERR_DEPRECATED",Re.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE",Re.ERR_BAD_REQUEST="ERR_BAD_REQUEST",Re.ERR_CANCELED="ERR_CANCELED",Re.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT",Re.ERR_INVALID_URL="ERR_INVALID_URL",Re.ERR_FORM_DATA_DEPTH_EXCEEDED="ERR_FORM_DATA_DEPTH_EXCEEDED";function ze(e){return xe.isPlainObject(e)||xe.isArray(e)}function Oe(e){return xe.endsWith(e,"[]")?e.slice(0,-2):e}function Ie(e,t,n){return e?e.concat(t).map(function(e,t){return e=Oe(e),!n&&t?"["+e+"]":e}).join(n?".":""):t}var Ne=xe.toFlatObject(xe,{},null,function(e){return/^is[A-Z]/.test(e)});function De(e,t,n){if(!xe.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;var a=(n=xe.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(e,t){return!xe.isUndefined(t[e])})).metaTokens,i=n.visitor||d,o=n.dots,r=n.indexes,s=n.Blob||"undefined"!=typeof Blob&&Blob,l=void 0===n.maxDepth?100:n.maxDepth,u=s&&xe.isSpecCompliantForm(t);if(!xe.isFunction(i))throw new TypeError("visitor must be a function");function c(e){if(null===e)return"";if(xe.isDate(e))return e.toISOString();if(xe.isBoolean(e))return e.toString();if(!u&&xe.isBlob(e))throw new Re("Blob is not supported. Use a Buffer instead.");return xe.isArrayBuffer(e)||xe.isTypedArray(e)?u&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function d(e,n,i){var s=e;if(xe.isReactNative(t)&&xe.isReactNativeBlob(e))return t.append(Ie(i,n,o),c(e)),!1;if(e&&!i&&"object"===C(e))if(xe.endsWith(n,"{}"))n=a?n:n.slice(0,-2),e=JSON.stringify(e);else if(xe.isArray(e)&&function(e){return xe.isArray(e)&&!e.some(ze)}(e)||(xe.isFileList(e)||xe.endsWith(n,"[]"))&&(s=xe.toArray(e)))return n=Oe(n),s.forEach(function(e,a){!xe.isUndefined(e)&&null!==e&&t.append(!0===r?Ie([n],a,o):null===r?n:n+"[]",c(e))}),!1;return!!ze(e)||(t.append(Ie(i,n,o),c(e)),!1)}var h=[],p=Object.assign(Ne,{defaultVisitor:d,convertValue:c,isVisitable:ze});if(!xe.isObject(e))throw new TypeError("data must be an object");return function e(n,a){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(!xe.isUndefined(n)){if(o>l)throw new Re("Object is too deeply nested ("+o+" levels). Max depth: "+l,Re.ERR_FORM_DATA_DEPTH_EXCEEDED);if(-1!==h.indexOf(n))throw Error("Circular reference detected in "+a.join("."));h.push(n),xe.forEach(n,function(n,r){!0===(!(xe.isUndefined(n)||null===n)&&i.call(t,n,xe.isString(r)?r.trim():r,a,p))&&e(n,a?a.concat(r):[r],o+1)}),h.pop()}}(e),t}function qe(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"};return encodeURIComponent(e).replace(/[!'()~]|%20/g,function(e){return t[e]})}function je(e,t){this._pairs=[],e&&De(e,this,t)}var Be=je.prototype;function Fe(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function $e(e,t,n){if(!t)return e;var a,i=n&&n.encode||Fe,o=xe.isFunction(n)?{serialize:n}:n,r=o&&o.serialize;if(a=r?r(t,o):xe.isURLSearchParams(t)?t.toString():new je(t,o).toString(i)){var s=e.indexOf("#");-1!==s&&(e=e.slice(0,s)),e+=(-1===e.indexOf("?")?"?":"&")+a}return e}Be.append=function(e,t){this._pairs.push([e,t])},Be.toString=function(e){var t=e?function(t){return e.call(this,t,qe)}:qe;return this._pairs.map(function(e){return t(e[0])+"="+t(e[1])},"").join("&")};var Ve=function(){return d(function e(){u(this,e),this.handlers=[]},[{key:"use",value:function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){xe.forEach(this.handlers,function(t){null!==t&&e(t)})}}])}(),Ue={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},He={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:je,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},We="undefined"!=typeof window&&"undefined"!=typeof document,Ge="object"===("undefined"==typeof navigator?"undefined":C(navigator))&&navigator||void 0,Ke=We&&(!Ge||["ReactNative","NativeScript","NS"].indexOf(Ge.product)<0),Ye="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,Qe=We&&window.location.href||"http://localhost",Ze=g(g({},Object.freeze({__proto__:null,hasBrowserEnv:We,hasStandardBrowserEnv:Ke,hasStandardBrowserWebWorkerEnv:Ye,navigator:Ge,origin:Qe})),He);function Je(e){function t(e,n,a,i){var o=e[i++];if("__proto__"===o)return!0;var r=Number.isFinite(+o),s=i>=e.length;return o=!o&&xe.isArray(a)?a.length:o,s?(xe.hasOwnProp(a,o)?a[o]=xe.isArray(a[o])?a[o].concat(n):[a[o],n]:a[o]=n,!r):(a[o]&&xe.isObject(a[o])||(a[o]=[]),t(e,n,a[o],i)&&xe.isArray(a[o])&&(a[o]=function(e){var t,n,a={},i=Object.keys(e),o=i.length;for(t=0;t-1,o=xe.isObject(e);if(o&&xe.isHTMLForm(e)&&(e=new FormData(e)),xe.isFormData(e))return i?JSON.stringify(Je(e)):e;if(xe.isArrayBuffer(e)||xe.isBuffer(e)||xe.isStream(e)||xe.isFile(e)||xe.isBlob(e)||xe.isReadableStream(e))return e;if(xe.isArrayBufferView(e))return e.buffer;if(xe.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(o){var r=Xe(this,"formSerializer");if(a.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return De(e,new Ze.classes.URLSearchParams,g({visitor:function(e,t,n,a){return Ze.isNode&&xe.isBuffer(e)?(this.append(t,e.toString("base64")),!1):a.defaultVisitor.apply(this,arguments)}},t))}(e,r).toString();if((n=xe.isFileList(e))||a.indexOf("multipart/form-data")>-1){var s=Xe(this,"env"),l=s&&s.FormData;return De(n?{"files[]":e}:e,l&&new l,r)}}return o||i?(t.setContentType("application/json",!1),function(e,t,n){if(xe.isString(e))try{return(t||JSON.parse)(e),xe.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=Xe(this,"transitional")||et.transitional,n=t&&t.forcedJSONParsing,a=Xe(this,"responseType"),i="json"===a;if(xe.isResponse(e)||xe.isReadableStream(e))return e;if(e&&xe.isString(e)&&(n&&!a||i)){var o=!(t&&t.silentJSONParsing)&&i;try{return JSON.parse(e,Xe(this,"parseReviver"))}catch(e){if(o){if("SyntaxError"===e.name)throw Re.from(e,Re.ERR_BAD_RESPONSE,this,null,Xe(this,"response"));throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ze.classes.FormData,Blob:Ze.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};function tt(e,t){var n=this||et,a=t||n,i=Le.from(a.headers),o=a.data;return xe.forEach(e,function(e){o=e.call(n,o,i.normalize(),t?t.status:void 0)}),i.normalize(),o}function nt(e){return!(!e||!e.__CANCEL__)}xe.forEach(["delete","get","head","post","put","patch","query"],function(e){et.headers[e]={}});var at=function(e){function t(e,n,a){var i;return u(this,t),(i=l(this,t,[null==e?"canceled":e,Re.ERR_CANCELED,n,a])).name="CanceledError",i.__CANCEL__=!0,i}return f(t,e),d(t)}(Re);function it(e,t,n){var a=n.config.validateStatus;n.status&&a&&!a(n.status)?t(new Re("Request failed with status code "+n.status,n.status>=400&&n.status<500?Re.ERR_BAD_REQUEST:Re.ERR_BAD_RESPONSE,n.config,n.request,n)):e(n)}var ot=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,a=0,i=function(e,t){e=e||10;var n,a=new Array(e),i=new Array(e),o=0,r=0;return t=void 0!==t?t:1e3,function(s){var l=Date.now(),u=i[r];n||(n=l),a[o]=s,i[o]=l;for(var c=r,d=0;c!==o;)d+=a[c++],c%=e;if((o=(o+1)%e)===r&&(r=(r+1)%e),!(l-n1&&void 0!==arguments[1]?arguments[1]:Date.now();i=o,n=null,a&&(clearTimeout(a),a=null),e.apply(void 0,x(t))};return[function(){for(var e=Date.now(),t=e-i,s=arguments.length,l=new Array(s),u=0;u=o?r(l,e):(n=l,a||(a=setTimeout(function(){a=null,r(n)},o-t)))},function(){return n&&r(n)}]}(function(n){var o=n.loaded,r=n.lengthComputable?n.total:void 0,s=null!=r?Math.min(o,r):o,l=Math.max(0,s-a),u=i(l);a=Math.max(a,s);var c=h({loaded:s,total:r,progress:r?s/r:void 0,bytes:l,rate:u||void 0,estimated:u&&r?(r-s)/u:void 0,event:n,lengthComputable:null!=r},t?"download":"upload",!0);e(c)},n)},rt=function(e,t){var n=null!=e;return[function(a){return t[0]({lengthComputable:n,total:e,loaded:a})},t[1]]},st=function(e){return function(){for(var t=arguments.length,n=new Array(t),a=0;a=48&&s<=57||s>=65&&s<=70||s>=97&&s<=102)&&(l>=48&&l<=57||l>=65&&l<=70||l>=97&&l<=102)&&(i-=2,r+=2)}var u=0,c=o-1,d=function(e){return e>=2&&37===a.charCodeAt(e-2)&&51===a.charCodeAt(e-1)&&(68===a.charCodeAt(e)||100===a.charCodeAt(e))};c>=0&&(61===a.charCodeAt(c)?(u++,c--):d(c)&&(u++,c-=3)),1===u&&c>=0&&(61===a.charCodeAt(c)||d(c))&&u++;var h=3*Math.floor(i/4)-(u||0);return h>0?h:0}if("undefined"!=typeof Buffer&&"function"==typeof Buffer.byteLength)return Buffer.byteLength(a,"utf8");for(var p=0,f=0,m=a.length;f=55296&&_<=56319&&f+1=56320&&g<=57343?(p+=4,f++):p+=3}else p+=3}return p}var kt="1.16.0",xt=xe.isFunction,St=function(e){try{for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a-1,M=xe.isNumber(A)&&A>-1,R=s||fetch,w=w?(w+"").toLowerCase():"text",z=_t([c,h&&h.toAbortSignal()],p),O=null,I=z&&z.unsubscribe&&function(){z.unsubscribe()},e.p=1,!L||"string"!=typeof a||!a.startsWith("data:")){e.n=2;break}if(!(wt(a)>E)){e.n=2;break}throw new Re("maxContentLength size of "+E+" exceeded",Re.ERR_BAD_RESPONSE,t,O);case 2:if(!M||"get"===o||"head"===o){e.n=4;break}return e.n=3,x(S,r);case 3:if(!("number"==typeof(D=e.v)&&isFinite(D)&&D>A)){e.n=4;break}throw new Re("Request body larger than maxBodyLength limit",Re.ERR_BAD_REQUEST,t,O);case 4:if(!(re=m&&_&&"get"!==o&&"head"!==o)){e.n=6;break}return e.n=5,x(S,r);case 5:se=N=e.v,re=0!==se;case 6:if(!re){e.n=7;break}q=new l(a,{method:"POST",body:r,duplex:"half"}),xe.isFormData(r)&&(j=q.headers.get("content-type"))&&S.setContentType(j),q.body&&(B=rt(N,ot(st(m))),F=k(B,2),$=F[0],V=F[1],r=yt(q.body,65536,$,V));case 7:return xe.isString(T)||(T=T?"include":"omit"),U=d&&"credentials"in l.prototype,xe.isFormData(r)&&(H=S.getContentType())&&/^multipart\/form-data/i.test(H)&&!/boundary=/i.test(H)&&S.delete("content-type"),S.set("User-Agent","axios/"+kt,!1),W=g(g({},P),{},{signal:z,method:o.toUpperCase(),headers:S.normalize().toJSON(),body:r,duplex:"half",credentials:U?T:void 0}),O=d&&new l(a,W),e.n=8,d?R(O,P):R(a,W);case 8:if(G=e.v,!L){e.n=9;break}if(!(null!=(K=xe.toFiniteNumber(G.headers.get("content-length")))&&K>E)){e.n=9;break}throw new Re("maxContentLength size of "+E+" exceeded",Re.ERR_BAD_RESPONSE,t,O);case 9:return Y=b&&("stream"===w||"response"===w),b&&G.body&&(f||L||Y&&I)&&(Q={},["status","statusText","headers"].forEach(function(e){Q[e]=G[e]}),Z=xe.toFiniteNumber(G.headers.get("content-length")),J=f&&rt(Z,ot(st(f),!0))||[],X=k(J,2),ee=X[0],te=X[1],ne=function(e){if(L&&e>E)throw new Re("maxContentLength size of "+E+" exceeded",Re.ERR_BAD_RESPONSE,t,O);ee&&ee(e)},G=new u(yt(G.body,65536,ne,function(){te&&te(),I&&I()}),Q)),w=w||"text",e.n=10,y[xe.findKey(y,w)||"text"](G,t);case 10:if(ae=e.v,!L||b||Y){e.n=11;break}if(null!=ae&&("number"==typeof ae.byteLength?ie=ae.byteLength:"number"==typeof ae.size?ie=ae.size:"string"==typeof ae&&(ie="function"==typeof i?(new i).encode(ae).byteLength:ae.length)),!("number"==typeof ie&&ie>E)){e.n=11;break}throw new Re("maxContentLength size of "+E+" exceeded",Re.ERR_BAD_RESPONSE,t,O);case 11:return!Y&&I&&I(),e.n=12,new Promise(function(e,n){it(e,n,{data:ae,headers:Le.from(G.headers),status:G.status,statusText:G.statusText,config:t,request:O})});case 12:return e.a(2,e.v);case 13:if(e.p=13,le=e.v,I&&I(),!(z&&z.aborted&&z.reason instanceof Re)){e.n=14;break}throw(oe=z.reason).config=t,O&&(oe.request=O),le!==oe&&(oe.cause=le),oe;case 14:if(!le||"TypeError"!==le.name||!/Load failed|fetch/i.test(le.message)){e.n=15;break}throw Object.assign(new Re("Network Error",Re.ERR_NETWORK,t,O,le&&le.response),{cause:le.cause||le});case 15:throw Re.from(le,le&&le.code,t,O,le&&le.response);case 16:return e.a(2)}},e,null,[[1,13]])}));return function(t){return e.apply(this,arguments)}}()},Tt=new Map,Pt=function(e){for(var t,n,a=e&&e.env||{},i=a.fetch,o=[a.Request,a.Response,i],r=o.length,s=Tt;r--;)t=o[r],void 0===(n=s.get(t))&&s.set(t,n=r?new Map:Ct(a)),s=n;return n};Pt();var Et={http:null,xhr:mt,fetch:{get:Pt}};xe.forEach(Et,function(e,t){if(e){try{Object.defineProperty(e,"name",{__proto__:null,value:t})}catch(e){}Object.defineProperty(e,"adapterName",{__proto__:null,value:t})}});var At=function(e){return"- ".concat(e)},Lt=function(e){return xe.isFunction(e)||null===e||!1===e};var Mt={getAdapter:function(e,t){for(var n,a,i=(e=xe.isArray(e)?e:[e]).length,o={},r=0;r1?"since :\n"+l.map(At).join("\n"):" "+At(l[0]):"as no adapter specified";throw new Re("There is no suitable adapter to dispatch the request "+u,"ERR_NOT_SUPPORT")}return a},adapters:Et};function Rt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new at(null,e)}function zt(e){return Rt(e),e.headers=Le.from(e.headers),e.data=tt.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Mt.getAdapter(e.adapter||et.adapter,e)(e).then(function(t){Rt(e),e.response=t;try{t.data=tt.call(e,e.transformResponse,t)}finally{delete e.response}return t.headers=Le.from(t.headers),t},function(t){if(!nt(t)&&(Rt(e),t&&t.response)){e.response=t.response;try{t.response.data=tt.call(e,e.transformResponse,t.response)}finally{delete e.response}t.response.headers=Le.from(t.response.headers)}return Promise.reject(t)})}var Ot={};["object","boolean","number","function","string","symbol"].forEach(function(e,t){Ot[e]=function(n){return C(n)===e||"a"+(t<1?"n ":" ")+e}});var It={};Ot.transitional=function(e,t,n){function a(e,t){return"[Axios v"+kt+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,i,o){if(!1===e)throw new Re(a(i," has been removed"+(t?" in "+t:"")),Re.ERR_DEPRECATED);return t&&!It[i]&&(It[i]=!0,console.warn(a(i," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,i,o)}},Ot.spelling=function(e){return function(t,n){return console.warn("".concat(n," is likely a misspelling of ").concat(e)),!0}};var Nt={assertOptions:function(e,t,n){if("object"!==C(e))throw new Re("options must be an object",Re.ERR_BAD_OPTION_VALUE);for(var a=Object.keys(e),i=a.length;i-- >0;){var o=a[i],r=Object.prototype.hasOwnProperty.call(t,o)?t[o]:void 0;if(r){var s=e[o],l=void 0===s||r(s,o,e);if(!0!==l)throw new Re("option "+o+" must be "+l,Re.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new Re("Unknown option "+o,Re.ERR_BAD_OPTION)}},validators:Ot},Dt=Nt.validators,qt=function(){return d(function e(t){u(this,e),this.defaults=t||{},this.interceptors={request:new Ve,response:new Ve}},[{key:"request",value:(e=r(v().m(function e(t,n){var a,i,o,r,s,l;return v().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,this._request(t,n);case 1:return e.a(2,e.v);case 2:if(e.p=2,(l=e.v)instanceof Error){a={},Error.captureStackTrace?Error.captureStackTrace(a):a=new Error,i=function(){if(!a.stack)return"";var e=a.stack.indexOf("\n");return-1===e?"":a.stack.slice(e+1)}();try{l.stack?i&&(o=i.indexOf("\n"),r=-1===o?-1:i.indexOf("\n",o+1),s=-1===r?"":i.slice(r+1),String(l.stack).endsWith(s)||(l.stack+="\n"+i)):l.stack=i}catch(e){}}throw l;case 3:return e.a(2)}},e,this,[[0,2]])})),function(t,n){return e.apply(this,arguments)})},{key:"_request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var n=t=ht(this.defaults,t),a=n.transitional,i=n.paramsSerializer,o=n.headers;void 0!==a&&Nt.assertOptions(a,{silentJSONParsing:Dt.transitional(Dt.boolean),forcedJSONParsing:Dt.transitional(Dt.boolean),clarifyTimeoutError:Dt.transitional(Dt.boolean),legacyInterceptorReqResOrdering:Dt.transitional(Dt.boolean)},!1),null!=i&&(xe.isFunction(i)?t.paramsSerializer={serialize:i}:Nt.assertOptions(i,{encode:Dt.function,serialize:Dt.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),Nt.assertOptions(t,{baseUrl:Dt.spelling("baseURL"),withXsrfToken:Dt.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();var r=o&&xe.merge(o.common,o[t.method]);o&&xe.forEach(["delete","get","head","post","put","patch","query","common"],function(e){delete o[e]}),t.headers=Le.concat(r,o);var s=[],l=!0;this.interceptors.request.forEach(function(e){if("function"!=typeof e.runWhen||!1!==e.runWhen(t)){l=l&&e.synchronous;var n=t.transitional||Ue;n&&n.legacyInterceptorReqResOrdering?s.unshift(e.fulfilled,e.rejected):s.push(e.fulfilled,e.rejected)}});var u,c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});var d,h=0;if(!l){var p=[zt.bind(this),void 0];for(p.unshift.apply(p,s),p.push.apply(p,c),d=p.length,u=Promise.resolve(t);h0;)a._listeners[t](e);a._listeners=null}}),this.promise.then=function(e){var t,n=new Promise(function(e){a.subscribe(e),t=e}).then(e);return n.cancel=function(){a.unsubscribe(t)},n},t(function(e,t,i){a.reason||(a.reason=new at(e,t,i),n(a.reason))})}return d(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}},{key:"toAbortSignal",value:function(){var e=this,t=new AbortController,n=function(e){t.abort(e)};return this.subscribe(n),t.signal.unsubscribe=function(){return e.unsubscribe(n)},t.signal}}],[{key:"source",value:function(){var t;return{token:new e(function(e){t=e}),cancel:t}}}])}();var Bt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Bt).forEach(function(e){var t=k(e,2),n=t[0],a=t[1];Bt[a]=n});var Ft=function e(t){var n=new qt(t),a=L(qt.prototype.request,n);return xe.extend(a,qt.prototype,n,{allOwnKeys:!0}),xe.extend(a,n,null,{allOwnKeys:!0}),a.create=function(n){return e(ht(t,n))},a}(et);return Ft.Axios=qt,Ft.CanceledError=at,Ft.CancelToken=jt,Ft.isCancel=nt,Ft.VERSION=kt,Ft.toFormData=De,Ft.AxiosError=Re,Ft.Cancel=Ft.CanceledError,Ft.all=function(e){return Promise.all(e)},Ft.spread=function(e){return function(t){return e.apply(null,t)}},Ft.isAxiosError=function(e){return xe.isObject(e)&&!0===e.isAxiosError},Ft.mergeConfig=ht,Ft.AxiosHeaders=Le,Ft.formToJSON=function(e){return Je(xe.isHTMLForm(e)?new FormData(e):e)},Ft.getAdapter=Mt.getAdapter,Ft.HttpStatusCode=Bt,Ft.default=Ft,Ft}); /** * vue v3.5.34 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ -var Vue=function(e){"use strict";var t,n,a;let i,r,o,s,l,u,c,d,h,p,f,m,_;function g(e){let t=Object.create(null);for(let n of e.split(","))t[n]=1;return e=>e in t}let v={},b=[],y=()=>{},w=()=>!1,k=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||97>e.charCodeAt(2)),x=e=>e.startsWith("onUpdate:"),S=Object.assign,C=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},T=Object.prototype.hasOwnProperty,P=(e,t)=>T.call(e,t),E=Array.isArray,A=e=>"function"==typeof e,L=e=>"string"==typeof e,M=e=>"symbol"==typeof e,R=e=>null!==e&&"object"==typeof e,z=e=>(R(e)||A(e))&&A(e.then)&&A(e.catch),I=Object.prototype.toString,N=e=>L(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,O=g(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),j=g("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),D=e=>{let t=Object.create(null);return n=>t[n]||(t[n]=e(n))},q=/-\w/g,B=D(e=>e.replace(q,e=>e.slice(1).toUpperCase())),F=/\B([A-Z])/g,V=D(e=>e.replace(F,"-$1").toLowerCase()),U=D(e=>e.charAt(0).toUpperCase()+e.slice(1)),$=D(e=>e?`on${U(e)}`:""),H=(e,t)=>!Object.is(e,t),W=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:a,value:n})},K=e=>{let t=parseFloat(e);return isNaN(t)?e:t},Y=e=>{let t=L(e)?Number(e):NaN;return isNaN(t)?e:t},Q=()=>i||(i="u">typeof globalThis?globalThis:"u">typeof self?self:"u">typeof window?window:"u">typeof global?global:{}),Z=g("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol");function J(e){if(E(e)){let t={};for(let n=0;n{if(e){let n=e.split(ee);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function ae(e){let t="";if(L(e))t=e;else if(E(e))for(let n=0;nue(e,t))}let de=e=>!(!e||!0!==e.__v_isRef),he=e=>L(e)?e:null==e?"":E(e)||R(e)&&(e.toString===I||!A(e.toString))?de(e)?he(e.value):JSON.stringify(e,pe,2):String(e),pe=(e,t)=>{let n;if(de(t))return pe(e,t.value);if("[object Map]"===(n=t,I.call(n)))return{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],a)=>(e[fe(t,a)+" =>"]=n,e),{})};{let e;if("[object Set]"===(e=t,I.call(e)))return{[`Set(${t.size})`]:[...t.values()].map(e=>fe(e))};{if(M(t))return fe(t);let e;if(R(t)&&!E(t)&&"[object Object]"!==(e=t,I.call(e)))return String(t)}}return t},fe=(e,t="")=>{var n;return M(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};class me{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&r&&(r.active?(this.parent=r,this.index=(r.scopes||(r.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){let e,t;if(this._isPaused=!0,this.scopes)for(e=0,t=this.scopes.length;e0&&0==--this._on){if(r===this)r=this.prevScope;else{let e=r;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){let t,n;for(this._active=!1,t=0,n=this.effects.length;t0)){if(l){let e=l;for(l=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}for(;s;){let t=s;for(s=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,1&t.flags)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}}function we(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function ke(e){let t,n=e.depsTail,a=n;for(;a;){let e=a.prevDep;-1===a.version?(a===n&&(n=e),Ce(a),function(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}(a)):t=a,a.dep.activeLink=a.prevActiveLink,a.prevActiveLink=void 0,a=e}e.deps=t,e.depsTail=n}function xe(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Se(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Se(e){if(4&e.flags&&!(16&e.flags)||(e.flags&=-17,e.globalVersion===Me)||(e.globalVersion=Me,!e.isSSR&&128&e.flags&&(!e.deps&&!e._dirty||!xe(e))))return;e.flags|=2;let t=e.dep,n=o,a=Te;o=e,Te=!0;try{we(e);let n=e.fn(e._value);(0===t.version||H(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{o=n,Te=a,ke(e),e.flags&=-3}}function Ce(e,t=!1){let{dep:n,prevSub:a,nextSub:i}=e;if(a&&(a.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=a,e.nextSub=void 0),n.subs===e&&(n.subs=a,!a&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)Ce(e,!0)}t||--n.sc||!n.map||n.map.delete(n.key)}let Te=!0,Pe=[];function Ee(){Pe.push(Te),Te=!1}function Ae(){let e=Pe.pop();Te=void 0===e||e}function Le(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=o;o=void 0;try{t()}finally{o=e}}}let Me=0;class Re{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class ze{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!o||!Te||o===this.computed)return;let t=this.activeLink;if(void 0===t||t.sub!==o)t=this.activeLink=new Re(o,this),o.deps?(t.prevDep=o.depsTail,o.depsTail.nextDep=t,o.depsTail=t):o.deps=o.depsTail=t,function e(t){if(t.dep.sc++,4&t.sub.flags){let n=t.dep.computed;if(n&&!t.dep.subs){n.flags|=20;for(let t=n.deps;t;t=t.nextDep)e(t)}let a=t.dep.subs;a!==t&&(t.prevSub=a,a&&(a.nextSub=t)),t.dep.subs=t}}(t);else if(-1===t.version&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=o.depsTail,t.nextDep=void 0,o.depsTail.nextDep=t,o.depsTail=t,o.deps===t&&(o.deps=e)}return t}trigger(e){this.version++,Me++,this.notify(e)}notify(e){ve++;try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{ye()}}}let Ie=new WeakMap,Ne=Symbol(""),Oe=Symbol(""),je=Symbol("");function De(e,t,n){if(Te&&o){let t=Ie.get(e);t||Ie.set(e,t=new Map);let a=t.get(n);a||(t.set(n,a=new ze),a.map=t,a.key=n),a.track()}}function qe(e,t,n,a,i,r){let o=Ie.get(e);if(!o)return void Me++;let s=e=>{e&&e.trigger()};if(ve++,"clear"===t)o.forEach(s);else{let i=E(e),r=i&&N(n);if(i&&"length"===n){let e=Number(a);o.forEach((t,n)=>{("length"===n||n===je||!M(n)&&n>=e)&&s(t)})}else switch((void 0!==n||o.has(void 0))&&s(o.get(n)),r&&s(o.get(je)),t){case"add":if(i)r&&s(o.get("length"));else{let t;s(o.get(Ne)),"[object Map]"===(t=e,I.call(t))&&s(o.get(Oe))}break;case"delete":if(!i){let t;s(o.get(Ne)),"[object Map]"===(t=e,I.call(t))&&s(o.get(Oe))}break;case"set":let t;"[object Map]"===(t=e,I.call(t))&&s(o.get(Ne))}}ye()}function Be(e){let t=Ct(e);return t===e?t:(De(t,0,je),xt(e)?t:t.map(Pt))}function Fe(e){return De(e=Ct(e),0,je),e}function Ve(e,t){return kt(e)?wt(e)?Et(Pt(t)):Et(t):Pt(t)}let Ue={__proto__:null,[Symbol.iterator](){return $e(this,Symbol.iterator,e=>Ve(this,e))},concat(...e){return Be(this).concat(...e.map(e=>E(e)?Be(e):e))},entries(){return $e(this,"entries",e=>(e[1]=Ve(this,e[1]),e))},every(e,t){return We(this,"every",e,t,void 0,arguments)},filter(e,t){return We(this,"filter",e,t,e=>e.map(e=>Ve(this,e)),arguments)},find(e,t){return We(this,"find",e,t,e=>Ve(this,e),arguments)},findIndex(e,t){return We(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return We(this,"findLast",e,t,e=>Ve(this,e),arguments)},findLastIndex(e,t){return We(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return We(this,"forEach",e,t,void 0,arguments)},includes(...e){return Ke(this,"includes",e)},indexOf(...e){return Ke(this,"indexOf",e)},join(e){return Be(this).join(e)},lastIndexOf(...e){return Ke(this,"lastIndexOf",e)},map(e,t){return We(this,"map",e,t,void 0,arguments)},pop(){return Ye(this,"pop")},push(...e){return Ye(this,"push",e)},reduce(e,...t){return Ge(this,"reduce",e,t)},reduceRight(e,...t){return Ge(this,"reduceRight",e,t)},shift(){return Ye(this,"shift")},some(e,t){return We(this,"some",e,t,void 0,arguments)},splice(...e){return Ye(this,"splice",e)},toReversed(){return Be(this).toReversed()},toSorted(e){return Be(this).toSorted(e)},toSpliced(...e){return Be(this).toSpliced(...e)},unshift(...e){return Ye(this,"unshift",e)},values(){return $e(this,"values",e=>Ve(this,e))}};function $e(e,t,n){let a=Fe(e),i=a[t]();return a===e||xt(e)||(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}let He=Array.prototype;function We(e,t,n,a,i,r){let o=Fe(e),s=o!==e&&!xt(e),l=o[t];if(l!==He[t]){let t=l.apply(e,r);return s?Pt(t):t}let u=n;o!==e&&(s?u=function(t,a){return n.call(this,Ve(e,t),a,e)}:n.length>2&&(u=function(t,a){return n.call(this,t,a,e)}));let c=l.call(o,u,a);return s&&i?i(c):c}function Ge(e,t,n,a){let i=Fe(e),r=i!==e&&!xt(e),o=n,s=!1;i!==e&&(r?(s=0===a.length,o=function(t,a,i){return s&&(s=!1,t=Ve(e,t)),n.call(this,t,Ve(e,a),i,e)}):n.length>3&&(o=function(t,a,i){return n.call(this,t,a,i,e)}));let l=i[t](o,...a);return s?Ve(e,l):l}function Ke(e,t,n){let a=Ct(e);De(a,0,je);let i=a[t](...n);return-1!==i&&!1!==i||!St(n[0])?i:(n[0]=Ct(n[0]),a[t](...n))}function Ye(e,t,n=[]){Ee(),ve++;let a=Ct(e)[t].apply(e,n);return ye(),Ae(),a}let Qe=g("__proto__,__v_isRef,__isVue"),Ze=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>"arguments"!==e&&"caller"!==e).map(e=>Symbol[e]).filter(M));function Je(e){M(e)||(e=String(e));let t=Ct(this);return De(t,0,e),t.hasOwnProperty(e)}class Xe{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if("__v_skip"===t)return e.__v_skip;let a=this._isReadonly,i=this._isShallow;if("__v_isReactive"===t)return!a;if("__v_isReadonly"===t)return a;if("__v_isShallow"===t)return i;if("__v_raw"===t)return n===(a?i?_t:mt:i?ft:pt).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let r=E(e);if(!a){let e;if(r&&(e=Ue[t]))return e;if("hasOwnProperty"===t)return Je}let o=Reflect.get(e,t,At(e)?e:n);if((M(t)?Ze.has(t):Qe(t))||(a||De(e,0,t),i))return o;if(At(o)){let e=r&&N(t)?o:o.value;return a&&R(e)?bt(e):e}return R(o)?a?bt(o):gt(o):o}}class et extends Xe{constructor(e=!1){super(!1,e)}set(e,t,n,a){let i=e[t],r=E(e)&&N(t);if(!this._isShallow){let e=kt(i);if(xt(n)||kt(n)||(i=Ct(i),n=Ct(n)),!r&&At(i)&&!At(n))return e||(i.value=n),!0}let o=r?Number(t)e;function st(e){return function(){return"delete"!==e&&("clear"===e?void 0:this)}}function lt(e,t){let n,a=(S(n={get(n){let a=this.__v_raw,i=Ct(a),r=Ct(n);e||(H(n,r)&&De(i,0,n),De(i,0,r));let{has:o}=Reflect.getPrototypeOf(i),s=t?ot:e?Et:Pt;return o.call(i,n)?s(a.get(n)):o.call(i,r)?s(a.get(r)):void(a!==i&&a.get(n))},get size(){let t=this.__v_raw;return e||De(Ct(t),0,Ne),t.size},has(t){let n=this.__v_raw,a=Ct(n),i=Ct(t);return e||(H(t,i)&&De(a,0,t),De(a,0,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,a){let i=this,r=i.__v_raw,o=Ct(r),s=t?ot:e?Et:Pt;return e||De(o,0,Ne),r.forEach((e,t)=>n.call(a,s(e),s(t),i))}},e?{add:st("add"),set:st("set"),delete:st("delete"),clear:st("clear")}:{add(e){let n=Ct(this),a=Reflect.getPrototypeOf(n),i=Ct(e),r=t||xt(e)||kt(e)?e:i;return a.has.call(n,r)||H(e,r)&&a.has.call(n,e)||H(i,r)&&a.has.call(n,i)||(n.add(r),qe(n,"add",r,r)),this},set(e,n){t||xt(n)||kt(n)||(n=Ct(n));let a=Ct(this),{has:i,get:r}=Reflect.getPrototypeOf(a),o=i.call(a,e);o||(e=Ct(e),o=i.call(a,e));let s=r.call(a,e);return a.set(e,n),o?H(n,s)&&qe(a,"set",e,n):qe(a,"add",e,n),this},delete(e){let t=Ct(this),{has:n,get:a}=Reflect.getPrototypeOf(t),i=n.call(t,e);i||(e=Ct(e),i=n.call(t,e)),a&&a.call(t,e);let r=t.delete(e);return i&&qe(t,"delete",e,void 0),r},clear(){let e=Ct(this),t=0!==e.size,n=e.clear();return t&&qe(e,"clear",void 0,void 0),n}}),["keys","values","entries",Symbol.iterator].forEach(a=>{n[a]=function(...n){let i,r=this.__v_raw,o=Ct(r),s="[object Map]"===(i=o,I.call(i)),l="entries"===a||a===Symbol.iterator&&s,u=r[a](...n),c=t?ot:e?Et:Pt;return e||De(o,0,"keys"===a&&s?Oe:Ne),S(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:l?[c(e[0]),c(e[1])]:c(e),done:t}}})}}),n);return(t,n,i)=>"__v_isReactive"===n?!e:"__v_isReadonly"===n?e:"__v_raw"===n?t:Reflect.get(P(a,n)&&n in t?a:t,n,i)}let ut={get:lt(!1,!1)},ct={get:lt(!1,!0)},dt={get:lt(!0,!1)},ht={get:lt(!0,!0)},pt=new WeakMap,ft=new WeakMap,mt=new WeakMap,_t=new WeakMap;function gt(e){return kt(e)?e:yt(e,!1,nt,ut,pt)}function vt(e){return yt(e,!1,it,ct,ft)}function bt(e){return yt(e,!0,at,dt,mt)}function yt(e,t,n,a,i){var r;let o;if(!R(e)||e.__v_raw&&(!t||!e.__v_isReactive))return e;let s=(r=e).__v_skip||!Object.isExtensible(r)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((o=r,I.call(o)).slice(8,-1));if(0===s)return e;let l=i.get(e);if(l)return l;let u=new Proxy(e,2===s?a:n);return i.set(e,u),u}function wt(e){return kt(e)?wt(e.__v_raw):!(!e||!e.__v_isReactive)}function kt(e){return!(!e||!e.__v_isReadonly)}function xt(e){return!(!e||!e.__v_isShallow)}function St(e){return!!e&&!!e.__v_raw}function Ct(e){let t=e&&e.__v_raw;return t?Ct(t):e}function Tt(e){return!P(e,"__v_skip")&&Object.isExtensible(e)&&G(e,"__v_skip",!0),e}let Pt=e=>R(e)?gt(e):e,Et=e=>R(e)?bt(e):e;function At(e){return!!e&&!0===e.__v_isRef}function Lt(e){return Rt(e,!1)}function Mt(e){return Rt(e,!0)}function Rt(e,t){return At(e)?e:new zt(e,t)}class zt{constructor(e,t){this.dep=new ze,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:Ct(e),this._value=t?e:Pt(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||xt(e)||kt(e);H(e=n?e:Ct(e),t)&&(this._rawValue=e,this._value=n?e:Pt(e),this.dep.trigger())}}function It(e){return At(e)?e.value:e}let Nt={get:(e,t,n)=>"__v_raw"===t?e:It(Reflect.get(e,t,n)),set:(e,t,n,a)=>{let i=e[t];return At(i)&&!At(n)?(i.value=n,!0):Reflect.set(e,t,n,a)}};function Ot(e){return wt(e)?e:new Proxy(e,Nt)}class jt{constructor(e){this.__v_isRef=!0,this._value=void 0;const t=this.dep=new ze,{get:n,set:a}=e(t.track.bind(t),t.trigger.bind(t));this._get=n,this._set=a}get value(){return this._value=this._get()}set value(e){this._set(e)}}function Dt(e){return new jt(e)}class qt{constructor(e,t,n){this._object=e,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=M(t)?t:String(t),this._raw=Ct(e);let a=!0,i=e;if(!E(e)||M(this._key)||!N(this._key))do{a=!St(i)||xt(i)}while(a&&(i=i.__v_raw));this._shallow=a}get value(){let e=this._object[this._key];return this._shallow&&(e=It(e)),this._value=void 0===e?this._defaultValue:e}set value(e){if(this._shallow&&At(this._raw[this._key])){let t=this._object[this._key];if(At(t))return void(t.value=e)}this._object[this._key]=e}get dep(){var e,t;let n;return e=this._raw,t=this._key,(n=Ie.get(e))&&n.get(t)}}class Bt{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}class Ft{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new ze(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Me-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(8&this.flags)&&o!==this)return be(this,!0),!0}get value(){let e=this.dep.track();return Se(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}let Vt={},Ut=new WeakMap;function $t(e,t=!1,n=m){if(n){let t=Ut.get(n);t||Ut.set(n,t=[]),t.push(e)}}function Ht(e,t=1/0,n){if(t<=0||!R(e)||e.__v_skip||((n=n||new Map).get(e)||0)>=t)return e;if(n.set(e,t),t--,At(e))Ht(e.value,t,n);else if(E(e))for(let a=0;a{Ht(e,t,n)});else{let a;if("[object Object]"===(a=e,I.call(a))){for(let a in e)Ht(e[a],t,n);for(let a of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,a)&&Ht(e[a],t,n)}}}return e}function Wt(e,t,n,a){try{return a?e(...a):e()}catch(e){Kt(e,t,n)}}function Gt(e,t,n,a){if(A(e)){let i=Wt(e,t,n,a);return i&&z(i)&&i.catch(e=>{Kt(e,t,n)}),i}if(E(e)){let i=[];for(let r=0;r=un(n)?Yt.push(e):Yt.splice(function(e){let t=Qt+1,n=Yt.length;for(;t>>1,i=Yt[a],r=un(i);run(e)-un(t));if(Zt.length=0,Jt)return void Jt.push(...e);for(Jt=e,Xt=0;Xtnull==e.id?2&e.flags?-1:1/0:e.id,cn=null,dn=null;function hn(e){let t=cn;return cn=e,dn=e&&e.type.__scopeId||null,t}function pn(e,t=cn,n){if(!t||e._n)return e;let a=(...n)=>{let i;a._d&&$i(-1);let r=hn(t);try{i=e(...n)}finally{hn(r),a._d&&$i(1)}return i};return a._n=!0,a._c=!0,a._d=!0,a}function fn(e,t,n,a){let i=e.dirs,r=t&&t.dirs;for(let o=0;o1)return n&&A(t)?t.call(a&&a.proxy):t}}let gn=Symbol.for("v-scx");function vn(e,t){return bn(e,null,{flush:"sync"})}function bn(e,t,n=v){let{flush:a}=n,i=S({},n),o=cr;i.call=(e,t,n)=>Gt(e,o,t,n);let s=!1;return"post"===a?i.scheduler=e=>{yi(e,o&&o.suspense)}:"sync"!==a&&(s=!0,i.scheduler=(e,t)=>{t?e():an(e)}),i.augmentJob=e=>{t&&(e.flags|=4),s&&(e.flags|=2,o&&(e.id=o.uid,e.i=o))},function(e,t,n=v){let a,i,o,s,{immediate:l,deep:u,once:c,scheduler:d,augmentJob:h,call:p}=n,f=e=>u?e:xt(e)||!1===u||0===u?Ht(e,1):Ht(e),_=!1,g=!1;if(At(e)?(i=()=>e.value,_=xt(e)):wt(e)?(i=()=>f(e),_=!0):E(e)?(g=!0,_=e.some(e=>wt(e)||xt(e)),i=()=>e.map(e=>At(e)?e.value:wt(e)?f(e):A(e)?p?p(e,2):e():void 0)):i=A(e)?t?p?()=>p(e,2):e:()=>{if(o){Ee();try{o()}finally{Ae()}}let t=m;m=a;try{return p?p(e,3,[s]):e(s)}finally{m=t}}:y,t&&u){let e=i,t=!0===u?1/0:u;i=()=>Ht(e(),t)}let b=r,w=()=>{a.stop(),b&&b.active&&C(b.effects,a)};if(c&&t){let e=t;t=(...t)=>{e(...t),w()}}let k=g?Array(e.length).fill(Vt):Vt,x=e=>{if(1&a.flags&&(a.dirty||e))if(t){let e=a.run();if(u||_||(g?e.some((e,t)=>H(e,k[t])):H(e,k))){o&&o();let n=m;m=a;try{let n=[e,k===Vt?void 0:g&&k[0]===Vt?[]:k,s];k=e,p?p(t,3,n):t(...n)}finally{m=n}}}else a.run()};return h&&h(x),(a=new ge(i)).scheduler=d?()=>d(x,!1):x,s=e=>$t(e,!1,a),o=a.onStop=()=>{let e=Ut.get(a);if(e){if(p)p(e,4);else for(let t of e)t();Ut.delete(a)}},t?l?x(!0):k=a.run():d?d(x.bind(null,!0),!0):a.run(),w.pause=a.pause.bind(a),w.resume=a.resume.bind(a),w.stop=w,w}(e,t,i)}function yn(e,t,n){let a,i=this.proxy,r=L(e)?e.includes(".")?wn(i,e):()=>i[e]:e.bind(i,i);A(t)?a=t:(a=t.handler,n=t);let o=hr(this),s=bn(r,a.bind(i),n);return o(),s}function wn(e,t){let n=t.split(".");return()=>{let t=e;for(let e=0;ee&&(e.disabled||""===e.disabled),Cn=e=>"u">typeof SVGElement&&e instanceof SVGElement,Tn=e=>"function"==typeof MathMLElement&&e instanceof MathMLElement,Pn=(e,t)=>{let n=e&&e.to;return L(n)?t?t(n):null:n};function En(e,t,n,{o:{insert:a},m:i},r=2){0===r&&a(e.targetAnchor,t,n);let{el:o,anchor:s,shapeFlag:l,children:u,props:c}=e,d=2===r;if(d&&a(o,t,n),!kn.has(e)&&(!d||Sn(c))&&16&l)for(let e=0;e{e.isMounted=!0}),ka(()=>{e.isUnmounting=!0}),e}let In=[Function,Array],Nn={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:In,onEnter:In,onAfterEnter:In,onEnterCancelled:In,onBeforeLeave:In,onLeave:In,onAfterLeave:In,onLeaveCancelled:In,onBeforeAppear:In,onAppear:In,onAfterAppear:In,onAppearCancelled:In},On=e=>{let t=e.subTree;return t.component?On(t.component):t};function jn(e){let t=e[0];if(e.length>1)for(let n of e)if(n.type!==ji){t=n;break}return t}let Dn={name:"BaseTransition",props:Nn,setup(e,{slots:t}){let n=dr(),a=zn();return()=>{let i=t.default&&$n(t.default(),!0),r=i&&i.length?jn(i):n.subTree?nr():void 0;if(!r)return;let o=Ct(e),{mode:s}=o;if(a.isLeaving)return Fn(r);let l=Vn(r);if(!l)return Fn(r);let u=Bn(l,o,a,n,e=>u=e);l.type!==ji&&Un(l,u);let c=n.subTree&&Vn(n.subTree);if(c&&c.type!==ji&&!Ki(c,l)&&On(n).type!==ji){let e=Bn(c,o,a,n);if(Un(c,e),"out-in"===s&&l.type!==ji)return a.isLeaving=!0,e.afterLeave=()=>{a.isLeaving=!1,8&n.job.flags||n.update(),delete e.afterLeave,c=void 0},Fn(r);"in-out"===s&&l.type!==ji?e.delayLeave=(e,t,n)=>{qn(a,c)[String(c.key)]=c,e[Mn]=()=>{t(),e[Mn]=void 0,delete u.delayedLeave,c=void 0},u.delayedLeave=()=>{n(),delete u.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return r}}};function qn(e,t){let{leavingVNodes:n}=e,a=n.get(t.type);return a||(a=Object.create(null),n.set(t.type,a)),a}function Bn(e,t,n,a,i){let{appear:r,mode:o,persisted:s=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:c,onEnterCancelled:d,onBeforeLeave:h,onLeave:p,onAfterLeave:f,onLeaveCancelled:m,onBeforeAppear:_,onAppear:g,onAfterAppear:v,onAppearCancelled:b}=t,y=String(e.key),w=qn(n,e),k=(e,t)=>{e&&Gt(e,a,9,t)},x=(e,t)=>{let n=t[1];k(e,t),E(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},S={mode:o,persisted:s,beforeEnter(t){let a=l;if(!n.isMounted){if(!r)return;a=_||l}t[Mn]&&t[Mn](!0);let i=w[y];i&&Ki(e,i)&&i.el[Mn]&&i.el[Mn](),k(a,[t])},enter(t){if(w[y]===e)return;let a=u,i=c,o=d;if(!n.isMounted){if(!r)return;a=g||u,i=v||c,o=b||d}let s=!1;t[Rn]=e=>{s||(s=!0,k(e?o:i,[t]),S.delayedLeave&&S.delayedLeave(),t[Rn]=void 0)};let l=t[Rn].bind(null,!1);a?x(a,[t,l]):l()},leave(t,a){let i=String(e.key);if(t[Rn]&&t[Rn](!0),n.isUnmounting)return a();k(h,[t]);let r=!1;t[Mn]=n=>{r||(r=!0,a(),k(n?m:f,[t]),t[Mn]=void 0,w[i]===e&&delete w[i])};let o=t[Mn].bind(null,!1);w[i]=e,p?x(p,[t,o]):o()},clone(e){let r=Bn(e,t,n,a,i);return i&&i(r),r}};return S}function Fn(e){if(ua(e))return(e=er(e)).children=null,e}function Vn(e){if(!ua(e))return e.type.__isTeleport&&e.children?jn(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(16&t)return n[0];if(32&t&&A(n.default))return n.default()}}function Un(e,t){6&e.shapeFlag&&e.component?(e.transition=t,Un(e.component.subTree,t)):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function $n(e,t=!1,n){let a=[],i=0;for(let r=0;r1)for(let e=0;eYn(e,t&&(E(t)?t[r]:t),n,a,i));if(sa(a)&&!i)return void(512&a.shapeFlag&&a.type.__asyncResolved&&a.component.subTree.component&&Yn(e,t,n,a.component.subTree));let r=4&a.shapeFlag?wr(a.component):a.el,o=i?null:r,{i:s,r:l}=e,u=t&&t.r,c=s.refs===v?s.refs={}:s.refs,d=s.setupState,h=Ct(d),p=d===v?w:e=>!Gn(c,e)&&P(h,e),f=(e,t)=>!(t&&Gn(c,t));if(null!=u&&u!==l&&(Qn(t),L(u)?(c[u]=null,p(u)&&(d[u]=null)):At(u)&&(f(0,t.k)&&(u.value=null),t.k&&(c[t.k]=null))),A(l))Wt(l,s,12,[o,c]);else{let t=L(l),a=At(l);if(t||a){let s=()=>{if(e.f){let n=t?p(l)?d[l]:c[l]:f()||!e.k?l.value:c[e.k];if(i)E(n)&&C(n,r);else if(E(n))n.includes(r)||n.push(r);else if(t)c[l]=[r],p(l)&&(d[l]=c[l]);else{let t=[r];f(0,e.k)&&(l.value=t),e.k&&(c[e.k]=t)}}else t?(c[l]=o,p(l)&&(d[l]=o)):a&&(f(0,e.k)&&(l.value=o),e.k&&(c[e.k]=o))};if(o){let t=()=>{s(),Kn.delete(e)};t.id=-1,Kn.set(e,t),yi(t,n)}else Qn(e),s()}}}function Qn(e){let t=Kn.get(e);t&&(t.flags|=8,Kn.delete(e))}let Zn=!1,Jn=()=>{Zn||(console.error("Hydration completed but contains mismatches."),Zn=!0)},Xn=e=>{if(1===e.nodeType){if(e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName)return"svg";if(e.namespaceURI.includes("MathML"))return"mathml"}},ea=e=>8===e.nodeType;function ta(e){let{mt:t,p:n,o:{patchProp:a,createText:i,nextSibling:r,parentNode:o,remove:s,insert:l,createComment:u}}=e,c=(n,a,s,u,v,b=!1)=>{b=b||!!a.dynamicChildren;let y=ea(n)&&"["===n.data,w=()=>f(n,a,s,u,v,y),{type:k,ref:x,shapeFlag:S,patchFlag:C}=a,T=n.nodeType;a.el=n,-2===C&&(b=!1,a.dynamicChildren=null);let P=null;switch(k){case Oi:3!==T?""===a.children?(l(a.el=i(""),o(n),n),P=n):P=w():(n.data!==a.children&&(Jn(),n.data=a.children),P=r(n));break;case ji:g(n)?(P=r(n),_(a.el=n.content.firstChild,n,s)):P=8!==T||y?w():r(n);break;case Di:if(y&&(T=(n=r(n)).nodeType),1===T||3===T){P=n;let e=!a.children.length;for(let t=0;t{o=o||!!t.dynamicChildren;let{type:l,props:u,patchFlag:c,shapeFlag:d,dirs:p,transition:f}=t,m="input"===l||"option"===l;if(m||-1!==c){let l;p&&fn(t,null,n,"created");let v=!1;if(g(e)){v=Ci(null,f)&&n&&n.vnode.props&&n.vnode.props.appear;let a=e.content.firstChild;if(v){let e=a.getAttribute("class");e&&(a.$cls=e),f.beforeEnter(a)}_(a,e,n),t.el=e=a}if(16&d&&(!u||!u.innerHTML&&!u.textContent)){let a=h(e.firstChild,t,e,n,i,r,o);for(;a;){ia(e,1)||Jn();let t=a;a=a.nextSibling,s(t)}}else if(8&d){let n=t.children;"\n"===n[0]&&("PRE"===e.tagName||"TEXTAREA"===e.tagName)&&(n=n.slice(1));let{textContent:a}=e;a!==n&&a!==n.replace(/\r\n|\r/g,"\n")&&(ia(e,0)||Jn(),e.textContent=t.children)}if(u)if(m||!o||48&c){let t=e.tagName.includes("-");for(let i in u)(m&&(i.endsWith("value")||"indeterminate"===i)||k(i)&&!O(i)||"."===i[0]||t&&!O(i))&&a(e,i,null,u[i],void 0,n)}else if(u.onClick)a(e,"onClick",null,u.onClick,void 0,n);else if(4&c&&wt(u.style))for(let e in u.style)u.style[e];(l=u&&u.onVnodeBeforeMount)&&sr(l,n,t),p&&fn(t,null,n,"beforeMount"),((l=u&&u.onVnodeMounted)||p||v)&&zi(()=>{l&&sr(l,n,t),v&&f.enter(e),p&&fn(t,null,n,"mounted")},i)}return e.nextSibling},h=(e,t,a,o,s,u,d)=>{d=d||!!t.dynamicChildren;let h=t.children,p=h.length;for(let t=0;t{let{slotScopeIds:c}=t;c&&(i=i?i.concat(c):c);let d=o(e),p=h(r(e),t,d,n,a,i,s);return p&&ea(p)&&"]"===p.data?r(t.anchor=p):(Jn(),l(t.anchor=u("]"),d,p),p)},f=(e,t,a,i,l,u)=>{if(ia(e.parentElement,1)||Jn(),t.el=null,u){let t=m(e);for(;;){let n=r(e);if(!n||n===t)break;s(n)}}let c=r(e),d=o(e);return s(e),n(null,t,d,c,a,i,Xn(d),l),a&&(a.vnode.el=t.el,si(a,t.el)),c},m=(e,t="[",n="]")=>{let a=0;for(;e;)if((e=r(e))&&ea(e)&&(e.data===t&&a++,e.data===n)){if(0===a)return r(e);a--}return e},_=(e,t,n)=>{let a=t.parentNode;a&&a.replaceChild(e,t);let i=n;for(;i;)i.vnode.el===t&&(i.vnode.el=i.subTree.el=e),i=i.parent},g=e=>1===e.nodeType&&"TEMPLATE"===e.tagName;return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),ln(),void(t._vnode=e);c(t.firstChild,e,null,null,null),ln(),t._vnode=e},c]}let na="data-allow-mismatch",aa={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function ia(e,t){if(0===t||1===t)for(;e&&!e.hasAttribute(na);)e=e.parentElement;let n=e&&e.getAttribute(na);if(null==n)return!1;{if(""===n)return!0;let e=n.split(",");return!(0!==t||!e.includes("children"))||e.includes(aa[t])}}let ra=Q().requestIdleCallback||(e=>setTimeout(e,1)),oa=Q().cancelIdleCallback||(e=>clearTimeout(e)),sa=e=>!!e.type.__asyncLoader;function la(e,t){let{ref:n,props:a,children:i,ce:r}=t.vnode,o=Ji(e,a,i);return o.ref=n,o.ce=r,delete t.vnode.ce,o}let ua=e=>e.type.__isKeepAlive;function ca(e,t){let n;return E(e)?e.some(e=>ca(e,t)):L(e)?e.split(",").includes(t):"[object RegExp]"===(n=e,I.call(n))&&(e.lastIndex=0,e.test(t))}function da(e,t){pa(e,"a",t)}function ha(e,t){pa(e,"da",t)}function pa(e,t,n=cr){let a=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(_a(t,a,n),n){let e=n.parent;for(;e&&e.parent;)ua(e.parent.vnode)&&function(e,t,n,a){let i=_a(t,e,a,!0);xa(()=>{C(a[t],i)},n)}(a,t,n,e),e=e.parent}}function fa(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ma(e){return 128&e.shapeFlag?e.ssContent:e}function _a(e,t,n=cr,a=!1){if(n){let i=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...a)=>{Ee();let i=hr(n),r=Gt(t,n,e,a);return i(),Ae(),r});return a?i.unshift(r):i.push(r),r}}let ga=e=>(t,n=cr)=>{mr&&"sp"!==e||_a(e,(...e)=>t(...e),n)},va=ga("bm"),ba=ga("m"),ya=ga("bu"),wa=ga("u"),ka=ga("bum"),xa=ga("um"),Sa=ga("sp"),Ca=ga("rtg"),Ta=ga("rtc");function Pa(e,t=cr){_a("ec",e,t)}let Ea="components",Aa=Symbol.for("v-ndc");function La(e,t,n=!0,a=!1){let i=cn||cr;if(i){let n=i.type;if(e===Ea){let e=kr(n,!1);if(e&&(e===t||e===B(t)||e===U(B(t))))return n}let r=Ma(i[e]||n[e],t)||Ma(i.appContext[e],t);return!r&&a?n:r}}function Ma(e,t){return e&&(e[t]||e[B(t)]||e[U(B(t))])}let Ra=e=>e?fr(e)?wr(e):Ra(e.parent):null,za=S(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ra(e.parent),$root:e=>Ra(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Fa(e),$forceUpdate:e=>e.f||(e.f=()=>{an(e.update)}),$nextTick:e=>e.n||(e.n=nn.bind(e.proxy)),$watch:e=>yn.bind(e)}),Ia=(e,t)=>e!==v&&!e.__isScriptSetup&&P(e,t),Na={get({_:e},t){let n,a;if("__v_skip"===t)return!0;let{ctx:i,setupState:r,data:o,props:s,accessCache:l,type:u,appContext:c}=e;if("$"!==t[0]){let e=l[t];if(void 0!==e)switch(e){case 1:return r[t];case 2:return o[t];case 4:return i[t];case 3:return s[t]}else{if(Ia(r,t))return l[t]=1,r[t];if(o!==v&&P(o,t))return l[t]=2,o[t];if(P(s,t))return l[t]=3,s[t];if(i!==v&&P(i,t))return l[t]=4,i[t];qa&&(l[t]=0)}}let d=za[t];return d?("$attrs"===t&&De(e.attrs,0,""),d(e)):(n=u.__cssModules)&&(n=n[t])?n:i!==v&&P(i,t)?(l[t]=4,i[t]):P(a=c.config.globalProperties,t)?a[t]:void 0},set({_:e},t,n){let{data:a,setupState:i,ctx:r}=e;return Ia(i,t)?(i[t]=n,!0):a!==v&&P(a,t)?(a[t]=n,!0):!(P(e.props,t)||"$"===t[0]&&t.slice(1)in e||(r[t]=n,0))},has({_:{data:e,setupState:t,accessCache:n,ctx:a,appContext:i,props:r,type:o}},s){let l;return!!(n[s]||e!==v&&"$"!==s[0]&&P(e,s)||Ia(t,s)||P(r,s)||P(a,s)||P(za,s)||P(i.config.globalProperties,s)||(l=o.__cssModules)&&l[s])},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:P(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},Oa=S({},Na,{get(e,t){if(t!==Symbol.unscopables)return Na.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!Z(t)});function ja(e){let t=dr();return t.setupContext||(t.setupContext=yr(t))}function Da(e){return E(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}let qa=!0;function Ba(e,t,n){Gt(E(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function Fa(e){let t,n=e.type,{mixins:a,extends:i}=n,{mixins:r,optionsCache:o,config:{optionMergeStrategies:s}}=e.appContext,l=o.get(n);return l?t=l:r.length||a||i?(t={},r.length&&r.forEach(e=>Va(t,e,s,!0)),Va(t,n,s)):t=n,R(n)&&o.set(n,t),t}function Va(e,t,n,a=!1){let{mixins:i,extends:r}=t;for(let o in r&&Va(e,r,n,!0),i&&i.forEach(t=>Va(e,t,n,!0)),t)if(a&&"expose"===o);else{let a=Ua[o]||n&&n[o];e[o]=a?a(e[o],t[o]):t[o]}return e}let Ua={data:$a,props:Ka,emits:Ka,methods:Ga,computed:Ga,beforeCreate:Wa,created:Wa,beforeMount:Wa,mounted:Wa,beforeUpdate:Wa,updated:Wa,beforeDestroy:Wa,beforeUnmount:Wa,destroyed:Wa,unmounted:Wa,activated:Wa,deactivated:Wa,errorCaptured:Wa,serverPrefetch:Wa,components:Ga,directives:Ga,watch:function(e,t){if(!e)return t;if(!t)return e;let n=S(Object.create(null),e);for(let a in t)n[a]=Wa(e[a],t[a]);return n},provide:$a,inject:function(e,t){return Ga(Ha(e),Ha(t))}};function $a(e,t){return t?e?function(){return S(A(e)?e.call(this,this):e,A(t)?t.call(this,this):t)}:t:e}function Ha(e){if(E(e)){let t={};for(let n=0;n"modelValue"===t||"model-value"===t?e.modelModifiers:e[`${t}Modifiers`]||e[`${B(t)}Modifiers`]||e[`${V(t)}Modifiers`];function Xa(e,t,...n){let a;if(e.isUnmounted)return;let i=e.vnode.props||v,r=n,o=t.startsWith("update:"),s=o&&Ja(i,t.slice(7));s&&(s.trim&&(r=n.map(e=>L(e)?e.trim():e)),s.number&&(r=n.map(K)));let l=i[a=$(t)]||i[a=$(B(t))];!l&&o&&(l=i[a=$(V(t))]),l&&Gt(l,e,6,r);let u=i[a+"Once"];if(u){if(e.emitted){if(e.emitted[a])return}else e.emitted={};e.emitted[a]=!0,Gt(u,e,6,r)}}let ei=new WeakMap;function ti(e,t){return!!e&&!!k(t)&&(P(e,(t=t.slice(2).replace(/Once$/,""))[0].toLowerCase()+t.slice(1))||P(e,V(t))||P(e,t))}function ni(e){let t,n,{type:a,vnode:i,proxy:r,withProxy:o,propsOptions:[s],slots:l,attrs:u,emit:c,render:d,renderCache:h,props:p,data:f,setupState:m,ctx:_,inheritAttrs:g}=e,v=hn(e);try{if(4&i.shapeFlag){let e=o||r;t=ar(d.call(e,e,h,p,m,f,_)),n=u}else t=ar(a.length>1?a(p,{attrs:u,slots:l,emit:c}):a(p,null)),n=a.props?u:ai(u)}catch(n){qi.length=0,Kt(n,e,1),t=Ji(ji)}let b=t;if(n&&!1!==g){let e=Object.keys(n),{shapeFlag:t}=b;e.length&&7&t&&(s&&e.some(x)&&(n=ii(n,s)),b=er(b,n,!1,!0))}return i.dirs&&((b=er(b,null,!1,!0)).dirs=b.dirs?b.dirs.concat(i.dirs):i.dirs),i.transition&&Un(b,i.transition),t=b,hn(v),t}let ai=e=>{let t;for(let n in e)("class"===n||"style"===n||k(n))&&((t||(t={}))[n]=e[n]);return t},ii=(e,t)=>{let n={};for(let a in e)x(a)&&a.slice(9)in t||(n[a]=e[a]);return n};function ri(e,t,n){let a=Object.keys(t);if(a.length!==Object.keys(e).length)return!0;for(let i=0;iObject.getPrototypeOf(e)===li;function ci(e,t,n,a){let i,[r,o]=e.propsOptions,s=!1;if(t)for(let l in t){let u;if(O(l))continue;let c=t[l];r&&P(r,u=B(l))?o&&o.includes(u)?(i||(i={}))[u]=c:n[u]=c:ti(e.emitsOptions,l)||l in a&&c===a[l]||(a[l]=c,s=!0)}if(o){let t=Ct(n),a=i||v;for(let i=0;i"_"===e||"_ctx"===e||"$stable"===e,mi=e=>E(e)?e.map(ar):[ar(e)],_i=(e,t,n)=>{if(t._n)return t;let a=pn((...e)=>mi(t(...e)),n);return a._c=!1,a},gi=(e,t,n)=>{let a=e._ctx;for(let n in e){if(fi(n))continue;let i=e[n];if(A(i))t[n]=_i(0,i,a);else if(null!=i){let e=mi(i);t[n]=()=>e}}},vi=(e,t)=>{let n=mi(t);e.slots.default=()=>n},bi=(e,t,n)=>{for(let a in t)(n||!fi(a))&&(e[a]=t[a])},yi=zi;function wi(e){return ki(e,ta)}function ki(e,t){var n;let a,i;Q().__VUE__=!0;let{insert:r,remove:o,patchProp:s,createElement:l,createText:u,createComment:d,setText:h,setElementText:p,parentNode:f,nextSibling:m,setScopeId:_=y,insertStaticContent:g}=e,w=(e,t,n,a=null,i=null,r=null,o,s=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!Ki(e,t)&&(a=re(e),ee(e,i,r,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);let{type:u,ref:c,shapeFlag:d}=t;switch(u){case Oi:k(e,t,n,a);break;case ji:x(e,t,n,a);break;case Di:null==e&&C(t,n,a,o);break;case Ni:q(e,t,n,a,i,r,o,s,l);break;default:1&d?T(e,t,n,a,i,r,o,s,l):6&d?F(e,t,n,a,i,r,o,s,l):(64&d||128&d)&&u.process(e,t,n,a,i,r,o,s,l,le)}null!=c&&i?Yn(c,e&&e.ref,r,t||e,!t):null==c&&e&&null!=e.ref&&Yn(e.ref,null,r,e,!0)},k=(e,t,n,a)=>{if(null==e)r(t.el=u(t.children),n,a);else{let n=t.el=e.el;t.children!==e.children&&h(n,t.children)}},x=(e,t,n,a)=>{null==e?r(t.el=d(t.children||""),n,a):t.el=e.el},C=(e,t,n,a)=>{[e.el,e.anchor]=g(e.children,t,n,a,e.el,e.anchor)},T=(e,t,n,a,i,r,o,s,l)=>{if("svg"===t.type?o="svg":"math"===t.type&&(o="mathml"),null==e)L(t,n,a,i,r,o,s,l);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),N(e,t,i,r,o,s,l)}finally{n&&n._endPatch()}}},L=(e,t,n,a,i,o,u,c)=>{let d,h,{props:f,shapeFlag:m,transition:_,dirs:g}=e;if(d=e.el=l(e.type,o,f&&f.is,f),8&m?p(d,e.children):16&m&&I(e.children,d,null,a,i,xi(e,o),u,c),g&&fn(e,null,a,"created"),M(d,e,e.scopeId,u,a),f){for(let e in f)"value"===e||O(e)||s(d,e,null,f[e],o,a);"value"in f&&s(d,"value",null,f.value,o),(h=f.onVnodeBeforeMount)&&sr(h,a,e)}g&&fn(e,null,a,"beforeMount");let v=Ci(i,_);v&&_.beforeEnter(d),r(d,t,n),((h=f&&f.onVnodeMounted)||v||g)&&yi(()=>{h&&sr(h,a,e),v&&_.enter(d),g&&fn(e,null,a,"mounted")},i)},M=(e,t,n,a,i)=>{if(n&&_(e,n),a)for(let t=0;t{for(let u=l;u{let l,u=t.el=e.el,{patchFlag:c,dynamicChildren:d,dirs:h}=t;c|=16&e.patchFlag;let f=e.props||v,m=t.props||v;if(n&&Si(n,!1),(l=m.onVnodeBeforeUpdate)&&sr(l,n,t,e),h&&fn(t,e,n,"beforeUpdate"),n&&Si(n,!0),(f.innerHTML&&null==m.innerHTML||f.textContent&&null==m.textContent)&&p(u,""),d?j(e.dynamicChildren,d,u,n,a,xi(t,i),r):o||Y(e,t,u,null,n,a,xi(t,i),r,!1),c>0){if(16&c)D(u,f,m,n,i);else if(2&c&&f.class!==m.class&&s(u,"class",null,m.class,i),4&c&&s(u,"style",f.style,m.style,i),8&c){let e=t.dynamicProps;for(let t=0;t{l&&sr(l,n,t,e),h&&fn(t,e,n,"updated")},a)},j=(e,t,n,a,i,r,o)=>{for(let s=0;s{if(t!==n){if(t!==v)for(let r in t)O(r)||r in n||s(e,r,t[r],null,i,a);for(let r in n){if(O(r))continue;let o=n[r],l=t[r];o!==l&&"value"!==r&&s(e,r,l,o,i,a)}"value"in n&&s(e,"value",t.value,n.value,i)}},q=(e,t,n,a,i,o,s,l,c)=>{let d=t.el=e?e.el:u(""),h=t.anchor=e?e.anchor:u(""),{patchFlag:p,dynamicChildren:f,slotScopeIds:m}=t;m&&(l=l?l.concat(m):m),null==e?(r(d,n,a),r(h,n,a),I(t.children||[],n,h,i,o,s,l,c)):p>0&&64&p&&f&&e.dynamicChildren&&e.dynamicChildren.length===f.length?(j(e.dynamicChildren,f,n,i,o,s,l),(null!=t.key||i&&t===i.subTree)&&Ti(e,t,!0)):Y(e,t,n,h,i,o,s,l,c)},F=(e,t,n,a,i,r,o,s,l)=>{t.slotScopeIds=s,null==e?512&t.shapeFlag?i.ctx.activate(t,n,a,o,l):U(t,n,a,i,r,o,l):$(e,t,l)},U=(e,t,n,a,i,r,o)=>{var s,l,u;let d,h,p,f=(l=a,u=i,d=(s=e).type,h=(l?l.appContext:s.appContext)||lr,(p={uid:ur++,vnode:s,type:d,parent:l,appContext:h,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new me(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:l?l.provides:Object.create(h.provides),ids:l?l.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:function e(t,n,a=!1){let i=a?hi:n.propsCache,r=i.get(t);if(r)return r;let o=t.props,s={},l=[],u=!1;if(!A(t)){let i=t=>{u=!0;let[a,i]=e(t,n,!0);S(s,a),i&&l.push(...i)};!a&&n.mixins.length&&n.mixins.forEach(i),t.extends&&i(t.extends),t.mixins&&t.mixins.forEach(i)}if(!o&&!u)return R(t)&&i.set(t,b),b;if(E(o))for(let e=0;e{let a=e(t,n,!0);a&&(l=!0,S(s,a))};!a&&n.mixins.length&&n.mixins.forEach(i),t.extends&&i(t.extends),t.mixins&&t.mixins.forEach(i)}return o||l?(E(o)?o.forEach(e=>s[e]=null):S(s,o),R(t)&&i.set(t,s),s):(R(t)&&i.set(t,null),null)}(d,h),emit:null,emitted:null,propsDefaults:v,inheritAttrs:d.inheritAttrs,ctx:v,data:v,props:v,attrs:v,slots:v,refs:v,setupState:v,setupContext:null,suspense:u,suspenseId:u?u.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null}).ctx={_:p},p.root=l?l.root:p,p.emit=Xa.bind(null,p),s.ce&&s.ce(p),e.component=p);if(ua(e)&&(f.ctx.renderer=le),function(e,t=!1,n=!1){t&&c(t);let{props:a,children:i}=e.vnode,r=fr(e);!function(e,t,n,a=!1){let i={},r=Object.create(li);for(let n in e.propsDefaults=Object.create(null),ci(e,t,i,r),e.propsOptions[0])n in i||(i[n]=void 0);n?e.props=a?i:vt(i):e.type.props?e.props=i:e.props=r,e.attrs=r}(e,a,r,t);var o=n||t;let s=e.slots=Object.create(li);if(32&e.vnode.shapeFlag){let e=i._;e?(bi(s,i,o),o&&G(s,"_",e,!0)):gi(i,s)}else i&&vi(e,i);r&&function(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Na);let{setup:a}=n;if(a){Ee();let n=e.setupContext=a.length>1?yr(e):null,i=hr(e),r=Wt(a,e,0,[e.props,n]),o=z(r);if(Ae(),i(),(o||e.sp)&&!sa(e)&&Wn(e),o){if(r.then(pr,pr),t)return r.then(n=>{_r(e,n,t)}).catch(t=>{Kt(t,e,0)});e.asyncDep=r}else _r(e,r,t)}else vr(e,t)}(e,t),t&&c(!1)}(f,!1,o),f.asyncDep){if(i&&i.registerDep(f,H,o),!e.el){let a=f.subTree=Ji(ji);x(null,a,t,n),e.placeholder=a.el}}else H(f,e,t,n,i,r,o)},$=(e,t,n)=>{let a=t.component=e.component;if(function(e,t,n){let{props:a,children:i,component:r}=e,{props:o,children:s,patchFlag:l}=t,u=r.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return(!!i||!!s)&&(!s||!s.$stable)||a!==o&&(a?!o||ri(a,o,u):!!o);if(1024&l)return!0;if(16&l)return a?ri(a,o,u):!!o;if(8&l){let e=t.dynamicProps;for(let t=0;t{e.scope.on();let l=e.effect=new ge(()=>{if(e.isMounted){let t,{next:n,bu:a,u:i,parent:l,vnode:c}=e;{let t=function e(t){let n=t.subTree.component;if(n)return n.asyncDep&&!n.asyncResolved?n:e(n)}(e);if(t)return n&&(n.el=c.el,K(e,n,s)),void t.asyncDep.then(()=>{yi(()=>{e.isUnmounted||u()},r)})}let d=n;Si(e,!1),n?(n.el=c.el,K(e,n,s)):n=c,a&&W(a),(t=n.props&&n.props.onVnodeBeforeUpdate)&&sr(t,l,n,c),Si(e,!0);let h=ni(e),p=e.subTree;e.subTree=h,w(p,h,f(p.el),re(p),e,r,o),n.el=h.el,null===d&&si(e,h.el),i&&yi(i,r),(t=n.props&&n.props.onVnodeUpdated)&&yi(()=>sr(t,l,n,c),r)}else{let s,{el:l,props:u}=t,{bm:c,m:d,parent:h,root:p,type:f}=e,m=sa(t);if(Si(e,!1),c&&W(c),!m&&(s=u&&u.onVnodeBeforeMount)&&sr(s,h,t),Si(e,!0),l&&i){let t=()=>{e.subTree=ni(e),i(l,e.subTree,e,r,null)};m&&f.__asyncHydrate?f.__asyncHydrate(l,e,t):t()}else{p.ce&&p.ce._hasShadowRoot()&&p.ce._injectChildStyle(f,e.parent?e.parent.type:void 0);let i=e.subTree=ni(e);w(null,i,n,a,e,r,o),t.el=i.el}if(d&&yi(d,r),!m&&(s=u&&u.onVnodeMounted)){let e=t;yi(()=>sr(s,h,e),r)}(256&t.shapeFlag||h&&sa(h.vnode)&&256&h.vnode.shapeFlag)&&e.a&&yi(e.a,r),e.isMounted=!0,t=n=a=null}});e.scope.off();let u=e.update=l.run.bind(l),c=e.job=l.runIfDirty.bind(l);c.i=e,c.id=e.uid,l.scheduler=()=>an(c),Si(e,!0),u()},K=(e,t,n)=>{t.component=e;let a=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,a){let{props:i,attrs:r,vnode:{patchFlag:o}}=e,s=Ct(i),[l]=e.propsOptions,u=!1;if(!(a||o>0)||16&o){let a;for(let o in ci(e,t,i,r)&&(u=!0),s)t&&(P(t,o)||(a=V(o))!==o&&P(t,a))||(l?n&&(void 0!==n[o]||void 0!==n[a])&&(i[o]=di(l,s,o,void 0,e,!0)):delete i[o]);if(r!==s)for(let e in r)t&&P(t,e)||(delete r[e],u=!0)}else if(8&o){let n=e.vnode.dynamicProps;for(let a=0;a{let{vnode:a,slots:i}=e,r=!0,o=v;if(32&a.shapeFlag){let e=t._;e?n&&1===e?r=!1:bi(i,t,n):(r=!t.$stable,gi(t,i)),o=t}else t&&(vi(e,t),o={default:1});if(r)for(let e in i)fi(e)||null!=o[e]||delete i[e]})(e,t.children,n),Ee(),sn(e),Ae()},Y=(e,t,n,a,i,r,o,s,l=!1)=>{let u=e&&e.children,c=e?e.shapeFlag:0,d=t.children,{patchFlag:h,shapeFlag:f}=t;if(h>0){if(128&h)return void J(u,d,n,a,i,r,o,s,l);if(256&h)return void Z(u,d,n,a,i,r,o,s,l)}8&f?(16&c&&ie(u,i,r),d!==u&&p(n,d)):16&c?16&f?J(u,d,n,a,i,r,o,s,l):ie(u,i,r,!0):(8&c&&p(n,""),16&f&&I(d,n,a,i,r,o,s,l))},Z=(e,t,n,a,i,r,o,s,l)=>{let u;t=t||b;let c=(e=e||b).length,d=t.length,h=Math.min(c,d);for(u=0;ud?ie(e,i,r,!0,!1,h):I(t,n,a,i,r,o,s,l,h)},J=(e,t,n,a,i,r,o,s,l)=>{let u=0,c=t.length,d=e.length-1,h=c-1;for(;u<=d&&u<=h;){let a=e[u],c=t[u]=l?ir(t[u]):ar(t[u]);if(!Ki(a,c))break;w(a,c,n,null,i,r,o,s,l),u++}for(;u<=d&&u<=h;){let a=e[d],u=t[h]=l?ir(t[h]):ar(t[h]);if(!Ki(a,u))break;w(a,u,n,null,i,r,o,s,l),d--,h--}if(u>d){if(u<=h){let e=h+1,d=eh)for(;u<=d;)ee(e[u],i,r,!0),u++;else{let p,f=u,m=u,_=new Map;for(u=m;u<=h;u++){let e=t[u]=l?ir(t[u]):ar(t[u]);null!=e.key&&_.set(e.key,u)}let g=0,v=h-m+1,y=!1,k=0,x=Array(v);for(u=0;u=v)ee(c,i,r,!0);else{if(null!=c.key)a=_.get(c.key);else for(p=m;p<=h;p++)if(0===x[p-m]&&Ki(c,t[p])){a=p;break}void 0===a?ee(c,i,r,!0):(x[a-m]=u+1,a>=k?k=a:y=!0,w(c,t[a],n,null,i,r,o,s,l),g++)}}let S=y?function(e){let t,n,a,i,r,o=e.slice(),s=[0],l=e.length;for(t=0;t>1]]0&&(o[t]=s[a-1]),s[a]=t)}}for(a=s.length,i=s[a-1];a-- >0;)s[a]=i,i=o[i];return s}(x):b;for(p=S.length-1,u=v-1;u>=0;u--){let e=m+u,d=t[e],h=t[e+1],f=e+1{let{el:s,type:l,transition:u,children:c,shapeFlag:d}=e;if(6&d)X(e.component.subTree,t,n,a);else if(128&d)e.suspense.move(t,n,a);else if(64&d)l.move(e,t,n,le);else if(l!==Ni)if(l!==Di)if(2!==a&&1&d&&u)if(0===a)u.beforeEnter(s),r(s,t,n),yi(()=>u.enter(s),i);else{let{leave:a,delayLeave:i,afterLeave:l}=u,c=()=>{e.ctx.isUnmounted?o(s):r(s,t,n)},d=()=>{s._isLeaving&&s[Mn](!0),a(s,()=>{c(),l&&l()})};i?i(s,c,d):d()}else r(s,t,n);else(({el:e,anchor:t},n,a)=>{let i;for(;e&&e!==t;)i=m(e),r(e,n,a),e=i;r(t,n,a)})(e,t,n);else{r(s,t,n);for(let e=0;e{let r,{type:o,props:s,ref:l,children:u,dynamicChildren:c,shapeFlag:d,patchFlag:h,dirs:p,cacheIndex:f,memo:m}=e;if(-2===h&&(i=!1),null!=l&&(Ee(),Yn(l,null,n,e,!0),Ae()),null!=f&&(t.renderCache[f]=void 0),256&d)return void t.ctx.deactivate(e);let _=1&d&&p,g=!sa(e);if(g&&(r=s&&s.onVnodeBeforeUnmount)&&sr(r,t,e),6&d)ae(e.component,n,a);else{if(128&d)return void e.suspense.unmount(n,a);_&&fn(e,null,t,"beforeUnmount"),64&d?e.type.remove(e,t,n,le,a):c&&!c.hasOnce&&(o!==Ni||h>0&&64&h)?ie(c,t,n,!1,!0):(o===Ni&&384&h||!i&&16&d)&&ie(u,t,n),a&&te(e)}let v=null!=m&&null==f;(g&&(r=s&&s.onVnodeUnmounted)||_||v)&&yi(()=>{r&&sr(r,t,e),_&&fn(e,null,t,"unmounted"),v&&(e.el=null)},n)},te=e=>{let{type:t,el:n,anchor:a,transition:i}=e;if(t===Ni)return void ne(n,a);if(t===Di)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=m(e),o(e),e=n;o(t)})(e);let r=()=>{o(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){let{leave:t,delayLeave:a}=i,o=()=>t(n,r);a?a(e.el,r,o):o()}else r()},ne=(e,t)=>{let n;for(;e!==t;)n=m(e),o(e),e=n;o(t)},ae=(e,t,n)=>{let{bum:a,scope:i,job:r,subTree:o,um:s,m:l,a:u}=e;Pi(l),Pi(u),a&&W(a),i.stop(),r&&(r.flags|=8,ee(o,e,t,n)),s&&yi(s,t),yi(()=>{e.isUnmounted=!0},t)},ie=(e,t,n,a=!1,i=!1,r=0)=>{for(let o=r;o{if(6&e.shapeFlag)return re(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();let t=m(e.anchor||e.el),n=t&&t[xn];return n?m(n):t},oe=!1,se=(e,t,n)=>{let a;null==e?t._vnode&&(ee(t._vnode,null,null,!0),a=t._vnode.component):w(t._vnode||null,e,t,null,null,null,n),t._vnode=e,oe||(oe=!0,sn(a),ln(),oe=!1)},le={p:w,um:ee,m:X,r:te,mt:U,mc:I,pc:Y,pbc:j,n:re,o:e};return t&&([a,i]=t(le)),{render:se,hydrate:a,createApp:(n=a,function(e,t=null){A(e)||(e=S({},e)),null==t||R(t)||(t=null);let a=Ya(),i=new WeakSet,r=[],o=!1,s=a.app={_uid:Qa++,_component:e,_props:t,_container:null,_context:a,_instance:null,version:Tr,get config(){return a.config},set config(e){},use:(e,...t)=>(i.has(e)||(e&&A(e.install)?(i.add(e),e.install(s,...t)):A(e)&&(i.add(e),e(s,...t))),s),mixin:e=>(a.mixins.includes(e)||a.mixins.push(e),s),component:(e,t)=>t?(a.components[e]=t,s):a.components[e],directive:(e,t)=>t?(a.directives[e]=t,s):a.directives[e],mount(i,r,l){if(!o){let u=s._ceVNode||Ji(e,t);return u.appContext=a,!0===l?l="svg":!1===l&&(l=void 0),r&&n?n(u,i):se(u,i,l),o=!0,s._container=i,i.__vue_app__=s,wr(u.component)}},onUnmount(e){r.push(e)},unmount(){o&&(Gt(r,s._instance,16),se(null,s._container),delete s._container.__vue_app__)},provide:(e,t)=>(a.provides[e]=t,s),runWithContext(e){let t=Za;Za=s;try{return e()}finally{Za=t}}};return s})}}function xi({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Si({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Ci(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ti(e,t,n=!1){let a=e.children,i=t.children;if(E(a)&&E(i))for(let e=0;ee.__isSuspense,Ai=0;function Li(e,t){let n=e.props&&e.props[t];A(n)&&n()}function Mi(e,t,n,a,i,r,o,s,l,u,c=!1){var d;let h,p,{p:f,m:m,um:_,n:g,o:{parentNode:v,remove:b}}=u,y=null!=(h=(d=e).props&&d.props.suspensible)&&!1!==h;y&&t&&t.pendingBranch&&(p=t.pendingId,t.deps++);let w=e.props?Y(e.props.timeout):void 0,k=r,x={vnode:e,parent:t,parentComponent:n,namespace:o,container:a,hiddenContainer:i,deps:0,pendingId:Ai++,timeout:"number"==typeof w?w:-1,activeBranch:null,isFallbackMountPending:!1,pendingBranch:null,isInFallback:!c,isHydrating:c,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){let{vnode:a,activeBranch:i,pendingBranch:o,pendingId:s,effects:l,parentComponent:u,container:c,isInFallback:d}=x,h=!1;if(x.isHydrating)x.isHydrating=!1;else if(!e){h=i&&o.transition&&"out-in"===o.transition.mode;let e=!1;h&&(i.transition.afterLeave=()=>{s===x.pendingId&&(m(o,c,r!==k||e?r:g(i),0),on(l),d&&a.ssFallback&&(a.ssFallback.el=null))}),i&&!x.isFallbackMountPending&&(v(i.el)===c&&(r=g(i),e=!0),_(i,u,x,!0),!h&&d&&a.ssFallback&&yi(()=>a.ssFallback.el=null,x)),h||m(o,c,r,0)}x.isFallbackMountPending=!1,Ii(x,o),x.pendingBranch=null,x.isInFallback=!1;let f=x.parent,b=!1;for(;f;){if(f.pendingBranch){f.effects.push(...l),b=!0;break}f=f.parent}b||h||on(l),x.effects=[],y&&t&&t.pendingBranch&&p===t.pendingId&&(t.deps--,0!==t.deps||n||t.resolve()),Li(a,"onResolve")},fallback(e){if(!x.pendingBranch)return;let{vnode:t,activeBranch:n,parentComponent:a,container:i,namespace:r}=x;Li(t,"onFallback");let o=g(n),u=()=>{x.isFallbackMountPending=!1,x.isInFallback&&(f(null,e,i,o,a,null,r,s,l),Ii(x,e))},c=e.transition&&"out-in"===e.transition.mode;c&&(x.isFallbackMountPending=!0,n.transition.afterLeave=u),x.isInFallback=!0,_(n,a,null,!0),c||u()},move(e,t,n){x.activeBranch&&m(x.activeBranch,e,t,n),x.container=e},next:()=>x.activeBranch&&g(x.activeBranch),registerDep(e,t,n){let a=!!x.pendingBranch;a&&x.deps++;let i=e.vnode.el;e.asyncDep.catch(t=>{Kt(t,e,0)}).then(r=>{if(e.isUnmounted||x.isUnmounted||x.pendingId!==e.suspenseId)return;pr(),e.asyncResolved=!0;let{vnode:s}=e;_r(e,r,!1),i&&(s.el=i);let l=!i&&e.subTree.el;t(e,s,v(i||e.subTree.el),i?null:g(e.subTree),x,o,n),l&&(s.placeholder=null,b(l)),si(e,s.el),a&&0==--x.deps&&x.resolve()})},unmount(e,t){x.isUnmounted=!0,x.activeBranch&&_(x.activeBranch,n,e,t),x.pendingBranch&&_(x.pendingBranch,n,e,t)}};return x}function Ri(e){let t;if(A(e)){let n=Ui&&e._c;n&&(e._d=!1,Fi()),e=e(),n&&(e._d=!0,t=Bi,Vi())}return E(e)&&(e=function(e){let t;for(let n=0;nt!==e)),e}function zi(e,t){t&&t.pendingBranch?E(e)?t.effects.push(...e):t.effects.push(e):on(e)}function Ii(e,t){e.activeBranch=t;let{vnode:n,parentComponent:a}=e,i=t.el;for(;!i&&t.component;)i=(t=t.component.subTree).el;n.el=i,a&&a.subTree===n&&(a.vnode.el=i,si(a,i))}let Ni=Symbol.for("v-fgt"),Oi=Symbol.for("v-txt"),ji=Symbol.for("v-cmt"),Di=Symbol.for("v-stc"),qi=[],Bi=null;function Fi(e=!1){qi.push(Bi=e?null:[])}function Vi(){qi.pop(),Bi=qi[qi.length-1]||null}let Ui=1;function $i(e,t=!1){Ui+=e,e<0&&Bi&&t&&(Bi.hasOnce=!0)}function Hi(e){return e.dynamicChildren=Ui>0?Bi||b:null,Vi(),Ui>0&&Bi&&Bi.push(e),e}function Wi(e,t,n,a,i){return Hi(Ji(e,t,n,a,i,!0))}function Gi(e){return!!e&&!0===e.__v_isVNode}function Ki(e,t){return e.type===t.type&&e.key===t.key}let Yi=({key:e})=>null!=e?e:null,Qi=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?L(e)||At(e)||A(e)?{i:cn,r:e,k:t,f:!!n}:e:null);function Zi(e,t=null,n=null,a=0,i=null,r=+(e!==Ni),o=!1,s=!1){let l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Yi(t),ref:t&&Qi(t),scopeId:dn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:a,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:cn};return s?(rr(l,n),128&r&&e.normalize(l)):n&&(l.shapeFlag|=L(n)?8:16),Ui>0&&!o&&Bi&&(l.patchFlag>0||6&r)&&32!==l.patchFlag&&Bi.push(l),l}let Ji=function(e,t=null,n=null,a=0,i=null,r=!1){var o;if(e&&e!==Aa||(e=ji),Gi(e)){let a=er(e,t,!0);return n&&rr(a,n),Ui>0&&!r&&Bi&&(6&a.shapeFlag?Bi[Bi.indexOf(e)]=a:Bi.push(a)),a.patchFlag=-2,a}if(A(o=e)&&"__vccOpts"in o&&(e=e.__vccOpts),t){let{class:e,style:n}=t=Xi(t);e&&!L(e)&&(t.class=ae(e)),R(n)&&(St(n)&&!E(n)&&(n=S({},n)),t.style=J(n))}return Zi(e,t,n,a,i,L(e)?1:Ei(e)?128:e.__isTeleport?64:R(e)?4:2*!!A(e),r,!0)};function Xi(e){return e?St(e)||ui(e)?S({},e):e:null}function er(e,t,n=!1,a=!1){let{props:i,ref:r,patchFlag:o,children:s,transition:l}=e,u=t?or(i||{},t):i,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Yi(u),ref:t&&t.ref?n&&r?E(r)?r.concat(Qi(t)):[r,Qi(t)]:Qi(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ni?-1===o?16:16|o:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&er(e.ssContent),ssFallback:e.ssFallback&&er(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&a&&Un(c,l.clone(c)),c}function tr(e=" ",t=0){return Ji(Oi,null,e,t)}function nr(e="",t=!1){return t?(Fi(),Wi(ji,null,e)):Ji(ji,null,e)}function ar(e){return null==e||"boolean"==typeof e?Ji(ji):E(e)?Ji(Ni,null,e.slice()):Gi(e)?ir(e):Ji(Oi,null,String(e))}function ir(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:er(e)}function rr(e,t){let n=0,{shapeFlag:a}=e;if(null==t)t=null;else if(E(t))n=16;else if("object"==typeof t){if(65&a){let n=t.default;return void(n&&(n._c&&(n._d=!1),rr(e,n()),n._c&&(n._d=!0)))}{n=32;let a=t._;a||ui(t)?3===a&&cn&&(1===cn.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=cn}}else A(t)?(t={default:t,_ctx:cn},n=32):(t=String(t),64&a?(n=16,t=[tr(t)]):n=8);e.children=t,e.shapeFlag|=n}function or(...e){let t={};for(let n=0;ncr||cn;u=e=>{cr=e},c=e=>{mr=e};let hr=e=>{let t=cr;return u(e),e.scope.on(),()=>{e.scope.off(),u(t)}},pr=()=>{cr&&cr.scope.off(),u(null)};function fr(e){return 4&e.vnode.shapeFlag}let mr=!1;function _r(e,t,n){A(t)?e.render=t:R(t)&&(e.setupState=Ot(t)),vr(e,n)}function gr(e){d=e,h=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,Oa))}}function vr(e,t,n){let a=e.type;if(!e.render){if(!t&&d&&!a.render){let t=a.template||Fa(e).template;if(t){let{isCustomElement:n,compilerOptions:i}=e.appContext.config,{delimiters:r,compilerOptions:o}=a,s=S(S({isCustomElement:n,delimiters:r},i),o);a.render=d(t,s)}}e.render=a.render||y,h&&h(e)}{let t=hr(e);Ee();try{!function(e){let t=Fa(e),n=e.proxy,a=e.ctx;qa=!1,t.beforeCreate&&Ba(t.beforeCreate,e,"bc");let{data:i,computed:r,methods:o,watch:s,provide:l,inject:u,created:c,beforeMount:d,mounted:h,beforeUpdate:p,updated:f,activated:m,deactivated:_,beforeUnmount:g,unmounted:v,render:b,renderTracked:w,renderTriggered:k,errorCaptured:x,serverPrefetch:S,expose:C,inheritAttrs:T,components:P,directives:M}=t;if(u&&function(e,t){for(let n in E(e)&&(e=Ha(e)),e){let a,i=e[n];At(a=R(i)?"default"in i?_n(i.from||n,i.default,!0):_n(i.from||n):_n(i))?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e}):t[n]=a}}(u,a),o)for(let e in o){let t=o[e];A(t)&&(a[e]=t.bind(n))}if(i){let t=i.call(n,n);R(t)&&(e.data=gt(t))}if(qa=!0,r)for(let e in r){let t=r[e],i=A(t)?t.bind(n,n):A(t.get)?t.get.bind(n,n):y,o=xr({get:i,set:!A(t)&&A(t.set)?t.set.bind(n):y});Object.defineProperty(a,e,{enumerable:!0,configurable:!0,get:()=>o.value,set:e=>o.value=e})}if(s)for(let e in s)!function e(t,n,a,i){let r=i.includes(".")?wn(a,i):()=>a[i];if(L(t)){let e=n[t];A(e)&&bn(r,e,void 0)}else if(A(t))bn(r,t.bind(a),void 0);else if(R(t))if(E(t))t.forEach(t=>e(t,n,a,i));else{let e=A(t.handler)?t.handler.bind(a):n[t.handler];A(e)&&bn(r,e,t)}}(s[e],a,n,e);if(l){let e=A(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{mn(t,e[t])})}function z(e,t){E(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(c&&Ba(c,e,"c"),z(va,d),z(ba,h),z(ya,p),z(wa,f),z(da,m),z(ha,_),z(Pa,x),z(Ta,w),z(Ca,k),z(ka,g),z(xa,v),z(Sa,S),E(C))if(C.length){let t=e.exposed||(e.exposed={});C.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});b&&e.render===y&&(e.render=b),null!=T&&(e.inheritAttrs=T),P&&(e.components=P),M&&(e.directives=M)}(e)}finally{Ae(),t()}}}let br={get:(e,t)=>(De(e,0,""),e[t])};function yr(e){return{attrs:new Proxy(e.attrs,br),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function wr(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ot(Tt(e.exposed)),{get:(t,n)=>n in t?t[n]:n in za?za[n](e):void 0,has:(e,t)=>t in e||t in za})):e.proxy}function kr(e,t=!0){return A(e)?e.displayName||e.name:e.name||t&&e.__name}let xr=(e,t)=>function(e,t=!1){let n,a;return A(e)?n=e:(n=e.get,a=e.set),new Ft(n,a,t)}(e,mr);function Sr(e,t,n){try{$i(-1);let a=arguments.length;return 2!==a?(a>3?n=Array.prototype.slice.call(arguments,2):3===a&&Gi(n)&&(n=[n]),Ji(e,t,n)):!R(t)||E(t)?Ji(e,null,t):Gi(t)?Ji(e,null,[t]):Ji(e,t)}finally{$i(1)}}function Cr(e,t){let n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e0&&Bi&&Bi.push(e),!0}let Tr="3.5.34",Pr="u">typeof window&&window.trustedTypes;if(Pr)try{_=Pr.createPolicy("vue",{createHTML:e=>e})}catch(e){}let Er=_?e=>_.createHTML(e):e=>e,Ar="u">typeof document?document:null,Lr=Ar&&Ar.createElement("template"),Mr={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,a)=>{let i="svg"===t?Ar.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?Ar.createElementNS("http://www.w3.org/1998/Math/MathML",e):n?Ar.createElement(e,{is:n}):Ar.createElement(e);return"select"===e&&a&&null!=a.multiple&&i.setAttribute("multiple",a.multiple),i},createText:e=>Ar.createTextNode(e),createComment:e=>Ar.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ar.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,a,i,r){let o=n?n.previousSibling:t.lastChild;if(i&&(i===r||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),i!==r&&(i=i.nextSibling););else{Lr.innerHTML=Er("svg"===a?`${e}`:"mathml"===a?`${e}`:e);let i=Lr.content;if("svg"===a||"mathml"===a){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Rr="transition",zr="animation",Ir=Symbol("_vtc"),Nr={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Or=S({},Nn,Nr),jr=((t=(e,{slots:t})=>Sr(Dn,Br(e),t)).displayName="Transition",t.props=Or,t),Dr=(e,t=[])=>{E(e)?e.forEach(e=>e(...t)):e&&e(...t)},qr=e=>!!e&&(E(e)?e.some(e=>e.length>1):e.length>1);function Br(e){let t={};for(let n in e)n in Nr||(t[n]=e[n]);if(!1===e.css)return t;let{name:n="v",type:a,duration:i,enterFromClass:r=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:l=r,appearActiveClass:u=o,appearToClass:c=s,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,f=function(e){if(null==e)return null;{if(R(e))return[function(e){return Y(e)}(e.enter),function(e){return Y(e)}(e.leave)];let t=function(e){return Y(e)}(e);return[t,t]}}(i),m=f&&f[0],_=f&&f[1],{onBeforeEnter:g,onEnter:v,onEnterCancelled:b,onLeave:y,onLeaveCancelled:w,onBeforeAppear:k=g,onAppear:x=v,onAppearCancelled:C=b}=t,T=(e,t,n,a)=>{e._enterCancelled=a,Vr(e,t?c:s),Vr(e,t?u:o),n&&n()},P=(e,t)=>{e._isLeaving=!1,Vr(e,d),Vr(e,p),Vr(e,h),t&&t()},E=e=>(t,n)=>{let i=e?x:v,o=()=>T(t,e,n);Dr(i,[t,o]),Ur(()=>{Vr(t,e?l:r),Fr(t,e?c:s),qr(i)||Hr(t,a,m,o)})};return S(t,{onBeforeEnter(e){Dr(g,[e]),Fr(e,r),Fr(e,o)},onBeforeAppear(e){Dr(k,[e]),Fr(e,l),Fr(e,u)},onEnter:E(!1),onAppear:E(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>P(e,t);Fr(e,d),e._enterCancelled?(Fr(e,h),Yr(e)):(Yr(e),Fr(e,h)),Ur(()=>{e._isLeaving&&(Vr(e,d),Fr(e,p),qr(y)||Hr(e,a,_,n))}),Dr(y,[e,n])},onEnterCancelled(e){T(e,!1,void 0,!0),Dr(b,[e])},onAppearCancelled(e){T(e,!0,void 0,!0),Dr(C,[e])},onLeaveCancelled(e){P(e),Dr(w,[e])}})}function Fr(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[Ir]||(e[Ir]=new Set)).add(t)}function Vr(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[Ir];n&&(n.delete(t),n.size||(e[Ir]=void 0))}function Ur(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let $r=0;function Hr(e,t,n,a){let i=e._endId=++$r,r=()=>{i===e._endId&&a()};if(null!=n)return setTimeout(r,n);let{type:o,timeout:s,propCount:l}=Wr(e,t);if(!o)return a();let u=o+"end",c=0,d=()=>{e.removeEventListener(u,h),r()},h=t=>{t.target===e&&++c>=l&&d()};setTimeout(()=>{c(n[e]||"").split(", "),i=a(`${Rr}Delay`),r=a(`${Rr}Duration`),o=Gr(i,r),s=a(`${zr}Delay`),l=a(`${zr}Duration`),u=Gr(s,l),c=null,d=0,h=0;return t===Rr?o>0&&(c=Rr,d=o,h=r.length):t===zr?u>0&&(c=zr,d=u,h=l.length):h=(c=(d=Math.max(o,u))>0?o>u?Rr:zr:null)?c===Rr?r.length:l.length:0,{type:c,timeout:d,propCount:h,hasTransform:c===Rr&&/\b(?:transform|all)(?:,|$)/.test(a(`${Rr}Property`).toString())}}function Gr(e,t){for(;e.lengthKr(t)+Kr(e[n])))}function Kr(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function Yr(e){return(e?e.ownerDocument:document).body.offsetHeight}let Qr=Symbol("_vod"),Zr=Symbol("_vsh");function Jr(e,t){e.style.display=t?e[Qr]:"none",e[Zr]=!t}let Xr=Symbol("");function eo(e,t){if(1===e.nodeType){let a=e.style,i="";for(let e in t){var n;let r=null==(n=t[e])?"initial":"string"==typeof n?""===n?" ":n:String(n);a.setProperty(`--${e}`,r),i+=`--${e}: ${r};`}a[Xr]=i}}let to=/(?:^|;)\s*display\s*:/,no=/\s*!important$/;function ao(e,t,n){if(E(n))n.forEach(n=>ao(e,t,n));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{let a=function(e,t){let n=ro[t];if(n)return n;let a=B(t);if("filter"!==a&&a in e)return ro[t]=a;a=U(a);for(let n=0;n111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&123>e.charCodeAt(2),_o=(e,t,n,a,i,r)=>{let o="svg"===i;if("class"===t){var s;let t;s=a,(t=e[Ir])&&(s=(s?[s,...t]:[...t]).join(" ")),null==s?e.removeAttribute("class"):o?e.setAttribute("class",s):e.className=s}else"style"===t?function(e,t,n){let a=e.style,i=L(n),r=!1;if(n&&!i){if(t)if(L(t))for(let e of t.split(";")){let t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&ao(a,t,"")}else for(let e in t)null==n[e]&&ao(a,e,"");for(let i in n){var o,s,l,u;"display"===i&&(r=!0);let c=n[i];null!=c?(o=e,s=i,l=!L(t)&&t?t[i]:void 0,u=c,"TEXTAREA"===o.tagName&&("width"===s||"height"===s)&&L(u)&&l===u||ao(a,i,c)):ao(a,i,"")}}else if(i){if(t!==n){let e=a[Xr];e&&(n+=";"+e),a.cssText=n,r=to.test(n)}}else t&&e.removeAttribute("style");Qr in e&&(e[Qr]=r?a.display:"",e[Zr]&&(a.display="none"))}(e,n,a):k(t)?x(t)||function(e,t,n,a=null){let i=e[co]||(e[co]={}),r=i[t];if(n&&r)r.value=n;else{let[s,l]=function(e){let t;if(ho.test(e)){let n;for(t={};n=e.match(ho);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):V(e.slice(2)),t]}(t);if(n){var o;let r;uo(e,s,i[t]=(o=a,(r=e=>{if(e._vts){if(e._vts<=r.attached)return}else e._vts=Date.now();Gt(function(e,t){if(!E(t))return t;{let n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(e=>t=>!t._stopped&&e&&e(t))}}(e,r.value),o,5,[e])}).value=n,r.attached=po||(fo.then(()=>po=0),po=Date.now()),r),l)}else r&&(e.removeEventListener(s,r,l),i[t]=void 0)}}(e,t,a,r):("."===t[0]?(t=t.slice(1),0):"^"===t[0]?(t=t.slice(1),1):!function(e,t,n,a){if(a)return!!("innerHTML"===t||"textContent"===t||t in e&&mo(t)&&A(n));if("spellcheck"===t||"draggable"===t||"translate"===t||"autocorrect"===t||"sandbox"===t&&"IFRAME"===e.tagName||"form"===t||"list"===t&&"INPUT"===e.tagName||"type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){let t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return!(mo(t)&&L(n))&&t in e}(e,t,a,o))?e._isVueCE&&(function(e,t){let n=e._def.props;if(!n)return!1;let a=B(t);return Array.isArray(n)?n.some(e=>B(e)===a):Object.keys(n).some(e=>B(e)===a)}(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!L(a)))?lo(e,B(t),a,0,t):("true-value"===t?e._trueValue=a:"false-value"===t&&(e._falseValue=a),so(e,t,a,o)):(lo(e,t,a),e.tagName.includes("-")||"value"!==t&&"checked"!==t&&"selected"!==t||so(e,t,a,o,0,"value"!==t))},go={};function vo(e,t,n){let a,i=Hn(e,t);"[object Object]"===(a=i,I.call(a))&&(i=S({},i,t));class r extends yo{constructor(e){super(i,e,n)}}return r.def=i,r}let bo="u">typeof HTMLElement?HTMLElement:class{};class yo extends bo{constructor(e,t={},n=Jo){super(),this._def=e,this._props=t,this._createApp=n,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._patching=!1,this._dirty=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._styleAnchors=new WeakMap,this._ob=null,this.shadowRoot&&n!==Jo?this._root=this.shadowRoot:!1!==e.shadowRoot?(this.attachShadow(S({},e.shadowRootOptions,{mode:"open"})),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._resolved||this._parseSlots(),this._connected=!0;let e=this;for(;e=e&&(e.assignedSlot||e.parentNode||e.host);)if(e instanceof yo){this._parent=e;break}this._instance||(this._resolved?this._mount(this._def):e&&e._pendingResolve?this._pendingResolve=e._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(e=this._parent){e&&(this._instance.parent=e._instance,this._inheritParentContext(e))}_inheritParentContext(e=this._parent){e&&this._app&&Object.setPrototypeOf(this._app._context.provides,e._instance.provides)}disconnectedCallback(){this._connected=!1,nn(()=>{!this._connected&&(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null,this._teleportTargets&&(this._teleportTargets.clear(),this._teleportTargets=void 0))})}_processMutations(e){for(let t of e)this._setAttr(t.attributeName)}_resolveDef(){if(this._pendingResolve)return;for(let e=0;e{let n;this._resolved=!0,this._pendingResolve=void 0;let{props:a,styles:i}=e;if(a&&!E(a))for(let e in a){let t=a[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=Y(this._props[e])),(n||(n=Object.create(null)))[B(e)]=!0)}this._numberProps=n,this._resolveProps(e),this.shadowRoot&&this._applyStyles(i),this._mount(e)},t=this._def.__asyncLoader;t?this._pendingResolve=t().then(t=>{t.configureApp=this._def.configureApp,e(this._def=t,!0)}):e(this._def)}_mount(e){this._app=this._createApp(e),this._inheritParentContext(),e.configureApp&&e.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);let t=this._instance&&this._instance.exposed;if(t)for(let e in t)P(this,e)||Object.defineProperty(this,e,{get:()=>It(t[e])})}_resolveProps(e){let{props:t}=e,n=E(t)?t:Object.keys(t||{});for(let e of Object.keys(this))"_"!==e[0]&&n.includes(e)&&this._setProp(e,this[e]);for(let e of n.map(B))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t,!0,!this._patching)}})}_setAttr(e){if(e.startsWith("data-v-"))return;let t=this.hasAttribute(e),n=t?this.getAttribute(e):go,a=B(e);t&&this._numberProps&&this._numberProps[a]&&(n=Y(n)),this._setProp(a,n,!1,!0)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,a=!1){if(t!==this._props[e]&&(this._dirty=!0,t===go?delete this._props[e]:(this._props[e]=t,"key"===e&&this._app&&(this._app._ceVNode.key=t)),a&&this._instance&&this._update(),n)){let n=this._ob;n&&(this._processMutations(n.takeRecords()),n.disconnect()),!0===t?this.setAttribute(V(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute(V(e),t+""):t||this.removeAttribute(V(e)),n&&n.observe(this,{attributes:!0})}}_update(){let e=this._createVNode();this._app&&(e.appContext=this._app._context),Zo(e,this._root)}_createVNode(){let e={};this.shadowRoot||(e.onVnodeMounted=e.onVnodeUpdated=this._renderSlots.bind(this));let t=Ji(this._def,S(e,this._props));return this._instance||(t.ce=e=>{this._instance=e,e.ce=this,e.isCE=!0;let t=(e,t)=>{let n;this.dispatchEvent(new CustomEvent(e,"[object Object]"===(n=t[0],I.call(n))?S({detail:t},t[0]):{detail:t}))};e.emit=(e,...n)=>{t(e,n),V(e)!==e&&t(V(e),n)},this._setParent()}),t}_applyStyles(e,t,n){if(!e)return;if(t){if(t===this._def||this._styleChildren.has(t))return;this._styleChildren.add(t)}let a=this._nonce,i=this.shadowRoot,r=n?this._getStyleAnchor(n)||this._getStyleAnchor(this._def):this._getRootStyleInsertionAnchor(i),o=null;for(let s=e.length-1;s>=0;s--){let l=document.createElement("style");a&&l.setAttribute("nonce",a),l.textContent=e[s],i.insertBefore(l,o||r),o=l,0===s&&(n||this._styleAnchors.set(this._def,l),t&&this._styleAnchors.set(t,l))}}_getStyleAnchor(e){if(!e)return null;let t=this._styleAnchors.get(e);return t&&t.parentNode===this.shadowRoot?t:(t&&this._styleAnchors.delete(e),null)}_getRootStyleInsertionAnchor(e){for(let t=0;t{if(!n.length)return;let t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){let a=e.cloneNode(),i=e[Ir];i&&i.forEach(e=>{e.split(/\s+/).forEach(e=>e&&a.classList.remove(e))}),n.split(/\s+/).forEach(e=>e&&a.classList.add(e)),a.style.display="none";let r=1===t.nodeType?t:t.parentNode;r.appendChild(a);let{hasTransform:o}=Wr(a);return r.removeChild(a),o}(n[0].el,i.vnode.el,t))return void(n=[]);n.forEach(Po),n.forEach(Eo);let a=n.filter(Ao);Yr(i.vnode.el),a.forEach(e=>{let n=e.el,a=n.style;Fr(n,t),a.transform=a.webkitTransform=a.transitionDuration="";let i=n[So]=e=>{(!e||e.target===n)&&(!e||e.propertyName.endsWith("transform"))&&(n.removeEventListener("transitionend",i),n[So]=null,Vr(n,t))};n.addEventListener("transitionend",i)}),n=[]}),()=>{let o=Ct(e),s=Br(o),l=o.tag||Ni;if(n=[],a)for(let e=0;eMath.abs(o-1)&&(o=1),.01>Math.abs(s-1)&&(s=1),n.transform=n.webkitTransform=`translate(${a/o}px,${i/s}px)`,n.transitionDuration="0s",e}}function Lo(e){let t=e.getBoundingClientRect();return{left:t.left,top:t.top}}let Mo=e=>{let t=e.props["onUpdate:modelValue"]||!1;return E(t)?e=>W(t,e):t};function Ro(e){e.target.composing=!0}function zo(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}let Io=Symbol("_assign");function No(e,t,n){return t&&(e=e.trim()),n&&(e=K(e)),e}let Oo={created(e,{modifiers:{lazy:t,trim:n,number:a}},i){e[Io]=Mo(i);let r=a||i.props&&"number"===i.props.type;uo(e,t?"change":"input",t=>{t.target.composing||e[Io](No(e.value,n,r))}),(n||r)&&uo(e,"change",()=>{e.value=No(e.value,n,r)}),t||(uo(e,"compositionstart",Ro),uo(e,"compositionend",zo),uo(e,"change",zo))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:a,trim:i,number:r}},o){if(e[Io]=Mo(o),e.composing)return;let s=null==t?"":t;if((!r&&"number"!==e.type||/^0\d/.test(e.value)?e.value:K(e.value))===s)return;let l=e.getRootNode();(l instanceof Document||l instanceof ShadowRoot)&&l.activeElement===e&&"range"!==e.type&&(a&&t===n||i&&e.value.trim()===s)||(e.value=s)}},jo={deep:!0,created(e,t,n){e[Io]=Mo(n),uo(e,"change",()=>{let t=e._modelValue,n=Vo(e),a=e.checked,i=e[Io];if(E(t)){let e=ce(t,n),r=-1!==e;if(a&&!r)i(t.concat(n));else if(!a&&r){let n=[...t];n.splice(e,1),i(n)}}else{let r;if("[object Set]"===(r=t,I.call(r))){let e=new Set(t);a?e.add(n):e.delete(n),i(e)}else i(Uo(e,a))}})},mounted:Do,beforeUpdate(e,t,n){e[Io]=Mo(n),Do(e,t,n)}};function Do(e,{value:t,oldValue:n},a){let i;if(e._modelValue=t,E(t))i=ce(t,a.props.value)>-1;else{let r;if("[object Set]"===(r=t,I.call(r)))i=t.has(a.props.value);else{if(t===n)return;i=ue(t,Uo(e,!0))}}e.checked!==i&&(e.checked=i)}let qo={created(e,{value:t},n){e.checked=ue(t,n.props.value),e[Io]=Mo(n),uo(e,"change",()=>{e[Io](Vo(e))})},beforeUpdate(e,{value:t,oldValue:n},a){e[Io]=Mo(a),t!==n&&(e.checked=ue(t,a.props.value))}},Bo={deep:!0,created(e,{value:t,modifiers:{number:n}},a){let i,r="[object Set]"===(i=t,I.call(i));uo(e,"change",()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?K(Vo(e)):Vo(e));e[Io](e.multiple?r?new Set(t):t:t[0]),e._assigning=!0,nn(()=>{e._assigning=!1})}),e[Io]=Mo(a)},mounted(e,{value:t}){Fo(e,t)},beforeUpdate(e,t,n){e[Io]=Mo(n)},updated(e,{value:t}){e._assigning||Fo(e,t)}};function Fo(e,t){let n,a=e.multiple,i=E(t);if(!a||i||"[object Set]"===(n=t,I.call(n))){for(let n=0,r=e.options.length;nString(e)===String(o)):ce(t,o)>-1}else r.selected=t.has(o);else if(ue(Vo(r),t))return void(e.selectedIndex!==n&&(e.selectedIndex=n))}a||-1===e.selectedIndex||(e.selectedIndex=-1)}}function Vo(e){return"_value"in e?e._value:e.value}function Uo(e,t){let n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}function $o(e,t,n,a,i){let r=function(e,t){switch(e){case"SELECT":return Bo;case"TEXTAREA":return Oo;default:switch(t){case"checkbox":return jo;case"radio":return qo;default:return Oo}}}(e.tagName,n.props&&n.props.type)[i];r&&r(e,t,n,a)}let Ho=["ctrl","shift","alt","meta"],Wo={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>Ho.some(n=>e[`${n}Key`]&&!t.includes(n))},Go={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Ko=S({patchProp:_o},Mr),Yo=!1;function Qo(){return p=Yo?p:wi(Ko),Yo=!0,p}let Zo=(...e)=>{(p||(p=ki(Ko))).render(...e)},Jo=(...e)=>{let t=(p||(p=ki(Ko))).createApp(...e),{mount:n}=t;return t.mount=e=>{let a=ts(e);if(!a)return;let i=t._component;A(i)||i.render||i.template||(i.template=a.innerHTML),1===a.nodeType&&(a.textContent="");let r=n(a,!1,es(a));return a instanceof Element&&(a.removeAttribute("v-cloak"),a.setAttribute("data-v-app","")),r},t},Xo=(...e)=>{let t=Qo().createApp(...e),{mount:n}=t;return t.mount=e=>{let t=ts(e);if(t)return n(t,!0,es(t))},t};function es(e){return e instanceof SVGElement?"svg":"function"==typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}function ts(e){return L(e)?document.querySelector(e):e}let ns=Symbol(""),as=Symbol(""),is=Symbol(""),rs=Symbol(""),os=Symbol(""),ss=Symbol(""),ls=Symbol(""),us=Symbol(""),cs=Symbol(""),ds=Symbol(""),hs=Symbol(""),ps=Symbol(""),fs=Symbol(""),ms=Symbol(""),_s=Symbol(""),gs=Symbol(""),vs=Symbol(""),bs=Symbol(""),ys=Symbol(""),ws=Symbol(""),ks=Symbol(""),xs=Symbol(""),Ss=Symbol(""),Cs=Symbol(""),Ts=Symbol(""),Ps=Symbol(""),Es=Symbol(""),As=Symbol(""),Ls=Symbol(""),Ms=Symbol(""),Rs=Symbol(""),zs=Symbol(""),Is=Symbol(""),Ns=Symbol(""),Os=Symbol(""),js=Symbol(""),Ds=Symbol(""),qs=Symbol(""),Bs=Symbol(""),Fs={[ns]:"Fragment",[as]:"Teleport",[is]:"Suspense",[rs]:"KeepAlive",[os]:"BaseTransition",[ss]:"openBlock",[ls]:"createBlock",[us]:"createElementBlock",[cs]:"createVNode",[ds]:"createElementVNode",[hs]:"createCommentVNode",[ps]:"createTextVNode",[fs]:"createStaticVNode",[ms]:"resolveComponent",[_s]:"resolveDynamicComponent",[gs]:"resolveDirective",[vs]:"resolveFilter",[bs]:"withDirectives",[ys]:"renderList",[ws]:"renderSlot",[ks]:"createSlots",[xs]:"toDisplayString",[Ss]:"mergeProps",[Cs]:"normalizeClass",[Ts]:"normalizeStyle",[Ps]:"normalizeProps",[Es]:"guardReactiveProps",[As]:"toHandlers",[Ls]:"camelize",[Ms]:"capitalize",[Rs]:"toHandlerKey",[zs]:"setBlockTracking",[Is]:"pushScopeId",[Ns]:"popScopeId",[Os]:"withCtx",[js]:"unref",[Ds]:"isRef",[qs]:"withMemo",[Bs]:"isMemoSame"},Vs={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:""};function Us(e,t,n,a,i,r,o,s=!1,l=!1,u=!1,c=Vs){return e&&(s?(e.helper(ss),e.helper(e.inSSR||u?ls:us)):e.helper(e.inSSR||u?cs:ds),o&&e.helper(bs)),{type:13,tag:t,props:n,children:a,patchFlag:i,dynamicProps:r,directives:o,isBlock:s,disableTracking:l,isComponent:u,loc:c}}function $s(e,t=Vs){return{type:17,loc:t,elements:e}}function Hs(e,t=Vs){return{type:15,loc:t,properties:e}}function Ws(e,t){return{type:16,loc:Vs,key:L(e)?Gs(e,!0):e,value:t}}function Gs(e,t=!1,n=Vs,a=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:a}}function Ks(e,t=Vs){return{type:8,loc:t,children:e}}function Ys(e,t=[],n=Vs){return{type:14,loc:n,callee:e,arguments:t}}function Qs(e,t,n=!1,a=!1,i=Vs){return{type:18,params:e,returns:t,newline:n,isSlot:a,loc:i}}function Zs(e,t,n,a=!0){return{type:19,test:e,consequent:t,alternate:n,newline:a,loc:Vs}}function Js(e,{helper:t,removeHelper:n,inSSR:a}){var i,r;e.isBlock||(e.isBlock=!0,n((i=e.isComponent,a||i?cs:ds)),t(ss),t((r=e.isComponent,a||r?ls:us)))}let Xs=new Uint8Array([123,123]),el=new Uint8Array([125,125]);function tl(e){return e>=97&&e<=122||e>=65&&e<=90}function nl(e){return 32===e||10===e||9===e||12===e||13===e}function al(e){return 47===e||62===e||nl(e)}function il(e){let t=new Uint8Array(e.length);for(let n=0;n4===e.type&&e.isStatic;function cl(e){switch(e){case"Teleport":case"teleport":return as;case"Suspense":case"suspense":return is;case"KeepAlive":case"keep-alive":return rs;case"BaseTransition":case"base-transition":return os}}let dl=/^$|^\d|[^\$\w\xA0-\uFFFF]/,hl=/[A-Za-z_$\xA0-\uFFFF]/,pl=/[\.\?\w$\xA0-\uFFFF]/,fl=/\s+[.[]\s*|\s*[.[]\s+/g,ml=e=>4===e.type?e.content:e.loc.source,_l=e=>{let t=ml(e).trim().replace(fl,e=>e.trim()),n=0,a=[],i=0,r=0,o=null;for(let e=0;e|^\s*(?:async\s+)?function(?:\s+[\w$]+)?\s*\(/;function vl(e,t,n=!1){for(let a=0;a4===e.key.type&&e.key.content===a)}return n}function Al(e,t){return`_${t}_${e.replace(/[^\w]/g,(t,n)=>"-"===t?"_":e.charCodeAt(n).toString())}`}let Ll=/([\s\S]*?)\s+(?:in|of)\s+(\S[\s\S]*)/;function Ml(e){for(let t=0;t0,isVoidTag:w,isPreTag:w,isIgnoreNewlineTag:w,isCustomElement:w,onError:ol,onWarn:sl,comments:!1,prefixIdentifiers:!1},Nl=Il,Ol=null,jl="",Dl=null,ql=null,Bl="",Fl=-1,Vl=-1,Ul=0,$l=!1,Hl=null,Wl=[],Gl=new class{constructor(e,t){this.stack=e,this.cbs=t,this.state=1,this.buffer="",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=1,this.inRCDATA=!1,this.inXML=!1,this.inVPre=!1,this.newlines=[],this.mode=0,this.delimiterOpen=Xs,this.delimiterClose=el,this.delimiterIndex=-1,this.currentSequence=void 0,this.sequenceIndex=0}get inSFCRoot(){return 2===this.mode&&0===this.stack.length}reset(){this.state=1,this.mode=0,this.buffer="",this.sectionStart=0,this.index=0,this.baseState=1,this.inRCDATA=!1,this.currentSequence=void 0,this.newlines.length=0,this.delimiterOpen=Xs,this.delimiterClose=el}getPos(e){let t=1,n=e+1,a=this.newlines.length,i=-1;if(a>100){let t=-1,n=a;for(;t+1>>1;this.newlines[a]=0;t--)if(e>this.newlines[t]){i=t;break}return i>=0&&(t=i+2,n=e-this.newlines[i]),{column:n,line:t,offset:e}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(e){60===e?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):this.inVPre||e!==this.delimiterOpen[0]||(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(e))}stateInterpolationOpen(e){if(e===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){let e=this.index+1-this.delimiterOpen.length;e>this.sectionStart&&this.cbs.ontext(this.sectionStart,e),this.state=3,this.sectionStart=e}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(e)):(this.state=1,this.stateText(e))}stateInterpolation(e){e===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(e))}stateInterpolationClose(e){e===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(e))}stateSpecialStartSequence(e){let t=this.sequenceIndex===this.currentSequence.length;if(t?al(e):(32|e)===this.currentSequence[this.sequenceIndex]){if(!t)return void this.sequenceIndex++}else this.inRCDATA=!1;this.sequenceIndex=0,this.state=6,this.stateInTagName(e)}stateInRCDATA(e){if(this.sequenceIndex===this.currentSequence.length){if(62===e||nl(e)){let t=this.index-this.currentSequence.length;if(this.sectionStart=e||(28===this.state?this.currentSequence===rl.CdataEnd?this.cbs.oncdata(this.sectionStart,e):this.cbs.oncomment(this.sectionStart,e):6===this.state||11===this.state||18===this.state||17===this.state||12===this.state||13===this.state||14===this.state||15===this.state||16===this.state||20===this.state||19===this.state||21===this.state||9===this.state||this.cbs.ontext(this.sectionStart,e))}emitCodePoint(e,t){}}(Wl,{onerr:uu,ontext(e,t){Jl(Ql(e,t),e,t)},ontextentity(e,t,n){Jl(e,t,n)},oninterpolation(e,t){if($l)return Jl(Ql(e,t),e,t);let n=e+Gl.delimiterOpen.length,a=t-Gl.delimiterClose.length;for(;nl(jl.charCodeAt(n));)n++;for(;nl(jl.charCodeAt(a-1));)a--;let i=Ql(n,a);i.includes("&")&&(i=Nl.decodeEntities(i,!1)),ru({type:5,content:lu(i,!1,ou(n,a)),loc:ou(e,t)})},onopentagname(e,t){let n=Ql(e,t);Dl={type:1,tag:n,ns:Nl.getNamespace(n,Wl[0],Nl.ns),tagType:0,props:[],children:[],loc:ou(e-1,t),codegenNode:void 0}},onopentagend(e){Zl(e)},onclosetag(e,t){let n=Ql(e,t);if(!Nl.isVoidTag(n)){let a=!1;for(let e=0;e0&&Wl[0].loc.start.offset;for(let n=0;n<=e;n++)Xl(Wl.shift(),t,n(7===e.type?e.rawName:e.name)===t)},onattribend(e,t){Dl&&ql&&(su(ql.loc,t),0!==e&&(Bl.includes("&")&&(Bl=Nl.decodeEntities(Bl,!0)),6===ql.type?("class"===ql.name&&(Bl=iu(Bl).trim()),ql.value={type:2,content:Bl,loc:1===e?ou(Fl,Vl):ou(Fl-1,Vl+1)},Gl.inSFCRoot&&"template"===Dl.tag&&"lang"===ql.name&&Bl&&"html"!==Bl&&Gl.enterRCDATA(il("{let i=t.start.offset+n;return lu(e,!1,ou(i,i+e.length),0,+!!a)},s={source:o(r.trim(),n.indexOf(r,i.length)),value:void 0,key:void 0,index:void 0,finalized:!1},l=i.trim().replace(Yl,"").trim(),u=i.indexOf(l),c=l.match(Kl);if(c){let e;l=l.replace(Kl,"").trim();let t=c[1].trim();if(t&&(e=n.indexOf(t,u+l.length),s.key=o(t,e,!0)),c[2]){let a=c[2].trim();a&&(s.index=o(a,n.indexOf(a,s.key?e+t.length:u+l.length),!0))}}return l&&(s.value=o(l,u,!0)),s}(ql.exp)))),(7!==ql.type||"pre"!==ql.name)&&Dl.props.push(ql)),Bl="",Fl=Vl=-1},oncomment(e,t){Nl.comments&&ru({type:3,content:Ql(e,t),loc:ou(e-4,t+3)})},onend(){let e=jl.length;for(let t=0;t64&&n<91||cl(e)||Nl.isBuiltInComponent&&Nl.isBuiltInComponent(e)||Nl.isNativeTag&&!Nl.isNativeTag(e))return!0;for(let e=0;e=0;)n--;return n}let tu=new Set(["if","else","else-if","for","slot"]),nu=/\r\n/g;function au(e){let t="preserve"!==Nl.whitespace,n=!1;for(let a=0;a3!==e.type);return 1!==t.length||1!==t[0].type||Cl(t[0])?null:t[0]}function du(e,t){let{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;let s=n.get(e);if(void 0!==s)return s;let l=e.codegenNode;if(13!==l.type||l.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag&&"math"!==e.tag)return 0;if(void 0!==l.patchFlag)return n.set(e,0),0;{let s=3,u=pu(e,t);if(0===u)return n.set(e,0),0;u1)for(let a=0;a{n--};for(;nt===e:t=>e.test(t);return(e,a)=>{if(1===e.type){let{props:i}=e;if(3===e.tagType&&i.some(xl))return;let r=[];for(let o=0;o`${Fs[e]}: _${Fs[e]}`;function bu(e,t,{helper:n,push:a,newline:i,isTS:r}){let o=n("component"===t?ms:gs);for(let n=0;n3;t.push("["),n&&t.indent(),wu(e,t,n),n&&t.deindent(),t.push("]")}function wu(e,t,n=!1,a=!0){let{push:i,newline:r}=t;for(let o=0;oe||"null")}([o,s,l,n,c]),t),a(")"),h&&a(")"),d&&(a(", "),ku(d,t),a(")"))}(e,t);break;case 14:!function(e,t){let{push:n,helper:a,pure:i}=t,r=L(e.callee)?e.callee:a(e.callee);i&&n(gu),n(r+"(",-2,e),wu(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){let{push:n,indent:a,deindent:i,newline:r}=t,{properties:o}=e;if(!o.length)return n("{}",-2,e);let s=o.length>1;n(s?"{":"{ "),s&&a();for(let e=0;e "),(l||s)&&(n("{"),a()),o?(l&&n("return "),E(o)?yu(o,t):ku(o,t)):s&&ku(s,t),(l||s)&&(i(),n("}")),u&&n(")")}(e,t);break;case 19:!function(e,t){let{test:n,consequent:a,alternate:i,newline:r}=e,{push:o,indent:s,deindent:l,newline:u}=t;if(4===n.type){let e,a=(e=n.content,!!dl.test(e));a&&o("("),xu(n,t),a&&o(")")}else o("("),ku(n,t),o(")");r&&s(),t.indentLevel++,r||o(" "),o("? "),ku(a,t),t.indentLevel--,r&&u(),r||o(" "),o(": ");let c=19===i.type;!c&&t.indentLevel++,ku(i,t),!c&&t.indentLevel--,r&&l(!0)}(e,t);break;case 20:!function(e,t){let{push:n,helper:a,indent:i,deindent:r,newline:o}=t,{needPauseTracking:s,needArraySpread:l}=e;l&&n("[...("),n(`_cache[${e.index}] || (`),s&&(i(),n(`${a(zs)}(-1`),e.inVOnce&&n(", true"),n("),"),o(),n("(")),n(`_cache[${e.index}] = `),ku(e.value,t),s&&(n(`).cacheIndex = ${e.index},`),o(),n(`${a(zs)}(1),`),o(),n(`_cache[${e.index}]`),r()),n(")"),l&&n(")]")}(e,t);break;case 21:wu(e.body,t,!0,!1)}}function xu(e,t){let{content:n,isStatic:a}=e;t.push(a?JSON.stringify(n):n,-3,e)}function Su(e,t){for(let n=0;nfunction(e,t,n,a){if(!("else"===t.name||t.exp&&t.exp.content.trim())){let a=t.exp?t.exp.loc:e.loc;n.onError(ll(28,t.loc)),t.exp=Gs("true",!1,a)}if("if"===t.name){var i;let r=Tu(e,t),o={type:9,loc:ou((i=e.loc).start.offset,i.end.offset),branches:[r]};if(n.replaceNode(o),a)return a(o,r,!0)}else{let i=n.parent.children,r=i.indexOf(e);for(;r-- >=-1;){let o=i[r];if(!o||!zl(o)){if(o&&9===o.type){("else-if"===t.name||"else"===t.name)&&void 0===o.branches[o.branches.length-1].condition&&n.onError(ll(30,e.loc)),n.removeNode();let i=Tu(e,t);o.branches.push(i);let r=a&&a(o,i,!1);mu(i,n),r&&r(),n.currentNode=null}else n.onError(ll(30,e.loc));break}n.removeNode(o)}}}(e,t,n,(e,t,a)=>{let i=n.parent.children,r=i.indexOf(e),o=0;for(;r-- >=0;){let e=i[r];e&&9===e.type&&(o+=e.branches.length)}return()=>{a?e.codegenNode=Pu(t,o,n):(function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode)).alternate=Pu(t,o+e.branches.length-1,n)}}));function Tu(e,t){let n=3===e.tagType;return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:n&&!vl(e,"for")?e.children:[e],userKey:bl(e,"key"),isTemplateIf:n}}function Pu(e,t,n){return e.condition?Zs(e.condition,Eu(e,t,n),Ys(n.helper(hs),['""',"true"])):Eu(e,t,n)}function Eu(e,t,n){let{helper:a}=n,i=Ws("key",Gs(`${t}`,!1,Vs,2)),{children:r}=e,o=r[0];if(1!==r.length||1!==o.type){if(1!==r.length||11!==o.type)return Us(n,a(ns),Hs([i]),r,64,void 0,void 0,!0,!1,!1,e.loc);{let e=o.codegenNode;return Pl(e,i,n),e}}{let e=o.codegenNode,t=14===e.type&&e.callee===qs?e.arguments[1].returns:e;return 13===t.type&&Js(t,n),Pl(t,i,n),e}}let Au=_u("for",(e,t,n)=>{let{helper:a,removeHelper:i}=n;return function(e,t,n,a){if(!t.exp)return void n.onError(ll(31,t.loc));let i=t.forParseResult;if(!i)return void n.onError(ll(32,t.loc));Lu(i);let{scopes:r}=n,{source:o,value:s,key:l,index:u}=i,c={type:11,loc:t.loc,source:o,valueAlias:s,keyAlias:l,objectIndexAlias:u,parseResult:i,children:Sl(e)?e.children:[e]};n.replaceNode(c),r.vFor++;let d=a&&a(c);return()=>{r.vFor--,d&&d()}}(e,t,n,t=>{let r=Ys(a(ys),[t.source]),o=Sl(e),s=vl(e,"memo"),l=bl(e,"key",!1,!0);l&&l.type;let u=l&&(6===l.type?l.value?Gs(l.value.content,!0):void 0:l.exp),c=l&&u?Ws("key",u):null,d=4===t.source.type&&t.source.constType>0,h=d?64:l?128:256;return t.codegenNode=Us(n,a(ns),void 0,r,h,void 0,void 0,!0,!d,!1,e.loc),()=>{let l,{children:h}=t,p=1!==h.length||1!==h[0].type,f=Cl(e)?e:o&&1===e.children.length&&Cl(e.children[0])?e.children[0]:null;if(f)l=f.codegenNode,o&&c&&Pl(l,c,n);else if(p)l=Us(n,a(ns),c?Hs([c]):void 0,e.children,64,void 0,void 0,!0,void 0,!1);else{var m,_,g,v,b,y,w,k;l=h[0].codegenNode,o&&c&&Pl(l,c,n),!d!==l.isBlock&&(l.isBlock?(i(ss),i((m=n.inSSR,_=l.isComponent,m||_?ls:us))):i((g=n.inSSR,v=l.isComponent,g||v?cs:ds))),l.isBlock=!d,l.isBlock?(a(ss),a((b=n.inSSR,y=l.isComponent,b||y?ls:us))):a((w=n.inSSR,k=l.isComponent,w||k?cs:ds))}if(s){let e=Qs(Mu(t.parseResult,[Gs("_cached")]));e.body={type:21,body:[Ks(["const _memo = (",s.exp,")"]),Ks(["if (_cached && _cached.el",...u?[" && _cached.key === ",u]:[],` && ${n.helperString(Bs)}(_cached, _memo)) return _cached`]),Ks(["const _item = ",l]),Gs("_item.memo = _memo"),Gs("return _item")],loc:Vs},r.arguments.push(e,Gs("_cache"),Gs(String(n.cached.length))),n.cached.push(null)}else r.arguments.push(Qs(Mu(t.parseResult),l,!0))}})});function Lu(e,t){e.finalized||(e.finalized=!0)}function Mu({value:e,key:t,index:n},a=[]){var i=[e,t,n,...a];let r=i.length;for(;r--&&!i[r];);return i.slice(0,r+1).map((e,t)=>e||Gs("_".repeat(t+1),!1))}let Ru=Gs("undefined",!1),zu=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){let n=vl(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}};function Iu(e,t,n){let a=[Ws("name",e),Ws("fn",t)];return null!=n&&a.push(Ws("key",Gs(String(n),!0))),Hs(a)}let Nu=new WeakMap,Ou=(e,t)=>function(){let n,a,i,r,o;if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;let{tag:s,props:l}=e,u=1===e.tagType,c=u?function(e,t,n=!1){let{tag:a}=e,i=qu(a),r=bl(e,"is",!1,!0);if(r)if(i){let e;if(6===r.type?e=r.value&&Gs(r.value.content,!0):(e=r.exp)||(e=Gs("is",!1,r.arg.loc)),e)return Ys(t.helper(_s),[e])}else 6===r.type&&r.value.content.startsWith("vue:")&&(a=r.value.content.slice(4));let o=cl(a)||t.isBuiltInComponent(a);return o?(n||t.helper(o),o):(t.helper(ms),t.components.add(a),Al(a,"component"))}(e,t):`"${s}"`,d=R(c)&&c.callee===_s,h=0,p=d||c===as||c===is||!u&&("svg"===s||"foreignObject"===s||"math"===s);if(l.length>0){let a=ju(e,t,void 0,u,d);n=a.props,h=a.patchFlag,r=a.dynamicPropNames;let i=a.directives;o=i&&i.length?$s(i.map(e=>function(e,t){let n=[],a=Nu.get(e);a?n.push(t.helperString(a)):(t.helper(gs),t.directives.add(e.name),n.push(Al(e.name,"directive")));let{loc:i}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push("void 0"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));let t=Gs("true",!1,i);n.push(Hs(e.modifiers.map(e=>Ws(e,t)),i))}return $s(n,e.loc)}(e,t))):void 0,a.shouldUseBlock&&(p=!0)}if(e.children.length>0)if(c===rs&&(p=!0,h|=1024),u&&c!==as&&c!==rs){let{slots:n,hasDynamicSlots:i}=function(e,t,n=(e,t,n,a)=>Qs(e,n,!1,!0,n.length?n[0].loc:a)){t.helper(Os);let{children:a,loc:i}=e,r=[],o=[],s=t.scopes.vSlot>0||t.scopes.vFor>0,l=vl(e,"slot",!0);if(l){let{arg:e,exp:t}=l;e&&!ul(e)&&(s=!0),r.push(Ws(e||Gs("default",!0),n(t,void 0,a,i)))}let u=!1,c=!1,d=[],h=new Set,p=0;for(let e=0;eWs("default",n(e,void 0,t,i));u?d.length&&!d.every(Rl)&&(c?t.onError(ll(39,d[0].loc)):r.push(e(void 0,d))):r.push(e(void 0,a))}let f=s?2:function e(t){for(let n=0;n0,f=!1,m=0,_=!1,g=!1,v=!1,b=!1,y=!1,w=!1,x=[],S=e=>{c.length&&(d.push(Hs(Du(c),l)),c=[]),e&&d.push(e)},C=()=>{t.scopes.vFor>0&&c.push(Ws(Gs("ref_for",!0),Gs("true")))},T=({key:e,value:n})=>{if(ul(e)){let r=e.content,o=k(r);o&&(!a||i)&&"onclick"!==r.toLowerCase()&&"onUpdate:modelValue"!==r&&!O(r)&&(b=!0),o&&O(r)&&(w=!0),o&&14===n.type&&(n=n.arguments[0]),20===n.type||(4===n.type||8===n.type)&&du(n,t)>0||("ref"===r?_=!0:"class"===r?g=!0:"style"===r?v=!0:"key"===r||x.includes(r)||x.push(r),a&&("class"===r||"style"===r)&&!x.includes(r)&&x.push(r))}else y=!0};for(let i=0;i"prop"===e.content)&&(m|=32);let w=t.directiveTransforms[n];if(w){let{props:n,needRuntime:a}=w(o,e,t);r||n.forEach(T),b&&i&&!ul(i)?S(Hs(n,l)):c.push(...n),a&&(h.push(o),M(a)&&Nu.set(o,a))}else!j(n)&&(h.push(o),p&&(f=!0))}}if(d.length?(S(),o=d.length>1?Ys(t.helper(Ss),d,l):d[0]):c.length&&(o=Hs(Du(c),l)),y?m|=16:(g&&!a&&(m|=2),v&&!a&&(m|=4),x.length&&(m|=8),b&&(m|=32)),!f&&(0===m||32===m)&&(_||w||h.length>0)&&(m|=512),!t.inSSR&&o)switch(o.type){case 15:let e=-1,n=-1,a=!1;for(let t=0;t{if(Cl(e)){let{children:n,loc:a}=e,{slotName:i,slotProps:r}=function(e,t){let n,a='"default"',i=[];for(let t=0;t0){let{props:a,directives:r}=ju(e,t,i,!1,!1);n=a,r.length&&t.onError(ll(36,r[0].loc))}return{slotName:a,slotProps:n}}(e,t),o=[t.prefixIdentifiers?"_ctx.$slots":"$slots",i,"{}","undefined","true"],s=2;r&&(o[2]=r,s=3),n.length&&(o[3]=Qs([],n,!1,!1,a),s=4),t.scopeId&&!t.slotted&&(s=5),o.splice(s),e.codegenNode=Ys(t.helper(ws),o,a)}},Fu=(e,t,n,a)=>{let i,{loc:r,modifiers:o,arg:s}=e;if(!e.exp&&o.length,4===s.type)if(s.isStatic){let e=s.content;e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`),i=Gs(0!==t.tagType||e.startsWith("vnode")||!/[A-Z]/.test(e)?$(B(e)):`on:${e}`,!0,s.loc)}else i=Ks([`${n.helperString(Rs)}(`,s,")"]);else(i=s).children.unshift(`${n.helperString(Rs)}(`),i.children.push(")");let l=e.exp;l&&!l.content.trim()&&(l=void 0);let u=n.cacheHandlers&&!l&&!n.inVOnce;if(l){let e,t=_l(l),n=!(t||(e=l,gl.test(ml(e)))),a=l.content.includes(";");(n||u&&t)&&(l=Ks([`${n?"$event":"(...args)"} => ${a?"{":"("}`,l,a?"}":")"]))}let c={props:[Ws(i,l||Gs("() => {}",!1,r))]};return a&&(c=a(c)),u&&(c.props[0].value=n.cache(c.props[0].value)),c.props.forEach(e=>e.key.isHandlerKey=!0),c},Vu=(e,t,n)=>{let{modifiers:a}=e,i=e.arg,{exp:r}=e;return r&&4===r.type&&!r.content.trim()&&(r=void 0),4!==i.type?(i.children.unshift("("),i.children.push(') || ""')):i.isStatic||(i.content=i.content?`${i.content} || ""`:'""'),a.some(e=>"camel"===e.content)&&(4===i.type?i.isStatic?i.content=B(i.content):i.content=`${n.helperString(Ls)}(${i.content})`:(i.children.unshift(`${n.helperString(Ls)}(`),i.children.push(")"))),!n.inSSR&&(a.some(e=>"prop"===e.content)&&Uu(i,"."),a.some(e=>"attr"===e.content)&&Uu(i,"^")),{props:[Ws(i,r)]}},Uu=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},$u=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{let n,a=e.children,i=!1;for(let e=0;e7===e.type&&!t.directiveTransforms[e.name]))))for(let e=0;e{if(1===e.type&&vl(e,"once",!0)&&!Hu.has(e)&&!t.inVOnce&&!t.inSSR)return Hu.add(e),t.inVOnce=!0,t.helper(zs),()=>{t.inVOnce=!1;let e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0,!0))}},Gu=(e,t,n)=>{let a,{exp:i,arg:r}=e;if(!i)return n.onError(ll(41,e.loc)),Ku();let o=i.loc.source.trim(),s=4===i.type?i.content:o,l=n.bindingMetadata[o];if("props"===l||"props-aliased"===l||"literal-const"===l||"setup-const"===l)return i.loc,Ku();if(!s.trim()||!_l(i))return n.onError(ll(42,i.loc)),Ku();let u=r||Gs("modelValue",!0),c=r?ul(r)?`onUpdate:${B(r.content)}`:Ks(['"onUpdate:" + ',r]):"onUpdate:modelValue";a=Ks([`${n.isTS?"($event: any)":"$event"} => ((`,i,") = $event)"]);let d=[Ws(u,e.exp),Ws(c,a)];if(e.modifiers.length&&1===t.tagType){let t=e.modifiers.map(e=>e.content).map(e=>(dl.test(e)?JSON.stringify(e):e)+": true").join(", "),n=r?ul(r)?`${r.content}Modifiers`:Ks([r,' + "Modifiers"']):"modelModifiers";d.push(Ws(n,Gs(`{ ${t} }`,!1,e.loc,2)))}return Ku(d)};function Ku(e=[]){return{props:e}}let Yu=new WeakSet,Qu=(e,t)=>{if(1===e.type){let n=vl(e,"memo");if(n&&!Yu.has(e)&&!t.inSSR)return Yu.add(e),()=>{let a=e.codegenNode||t.currentNode.codegenNode;a&&13===a.type&&(1!==e.tagType&&Js(a,t),e.codegenNode=Ys(t.helper(qs),[n.exp,Qs(void 0,a),"_cache",String(t.cached.length)]),t.cached.push(null))}}},Zu=(e,t)=>{if(1===e.type)for(let n of e.props)if(7===n.type&&"bind"===n.name&&(!n.exp||4===n.exp.type&&!n.exp.content.trim())&&n.arg){let e=n.arg;if(4===e.type&&e.isStatic){let t=B(e.content);(hl.test(t[0])||"-"===t[0])&&(n.exp=Gs(t,!1,e.loc))}else t.onError(ll(53,e.loc)),n.exp=Gs("",!0,e.loc)}},Ju=Symbol(""),Xu=Symbol(""),ec=Symbol(""),tc=Symbol(""),nc=Symbol(""),ac=Symbol(""),ic=Symbol(""),rc=Symbol(""),oc=Symbol(""),sc=Symbol("");Object.getOwnPropertySymbols(a={[Ju]:"vModelRadio",[Xu]:"vModelCheckbox",[ec]:"vModelText",[tc]:"vModelSelect",[nc]:"vModelDynamic",[ac]:"withModifiers",[ic]:"withKeys",[rc]:"vShow",[oc]:"Transition",[sc]:"TransitionGroup"}).forEach(e=>{Fs[e]=a[e]});let lc={parseMode:"html",isVoidTag:se,isNativeTag:e=>ie(e)||re(e)||oe(e),isPreTag:e=>"pre"===e,isIgnoreNewlineTag:e=>"pre"===e||"textarea"===e,decodeEntities:function(e,t=!1){return f||(f=document.createElement("div")),t?(f.innerHTML=`
`,f.children[0].getAttribute("foo")):(f.innerHTML=e,f.textContent)},isBuiltInComponent:e=>"Transition"===e||"transition"===e?oc:"TransitionGroup"===e||"transition-group"===e?sc:void 0,getNamespace(e,t,n){let a=t?t.ns:n;if(t&&2===a)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some(e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content))&&(a=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(a=0);else t&&1===a&&("foreignObject"===t.tag||"desc"===t.tag||"title"===t.tag)&&(a=0);if(0===a){if("svg"===e)return 1;if("math"===e)return 2}return a}},uc=g("passive,once,capture"),cc=g("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),dc=g("left,right"),hc=g("onkeyup,onkeydown,onkeypress"),pc=(e,t)=>ul(e)&&"onclick"===e.content.toLowerCase()?Gs(t,!0):4!==e.type?Ks(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,fc=(e,t)=>{1===e.type&&0===e.tagType&&("script"===e.tag||"style"===e.tag)&&t.removeNode()},mc=[e=>{1===e.type&&e.props.forEach((t,n)=>{let a,i;6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:Gs("style",!0,t.loc),exp:(a=t.value.content,i=t.loc,Gs(JSON.stringify(ne(a)),!1,i,3)),modifiers:[],loc:t.loc})})}],_c={cloak:()=>({props:[]}),html:(e,t,n)=>{let{exp:a,loc:i}=e;return a||n.onError(ll(54,i)),t.children.length&&(n.onError(ll(55,i)),t.children.length=0),{props:[Ws(Gs("innerHTML",!0,i),a||Gs("",!0))]}},text:(e,t,n)=>{let{exp:a,loc:i}=e;return a||n.onError(ll(56,i)),t.children.length&&(n.onError(ll(57,i)),t.children.length=0),{props:[Ws(Gs("textContent",!0),a?du(a,n)>0?a:Ys(n.helperString(xs),[a],i):Gs("",!0))]}},model:(e,t,n)=>{let a=Gu(e,t,n);if(!a.props.length||1===t.tagType)return a;e.arg&&n.onError(ll(59,e.arg.loc));let{tag:i}=t,r=n.isCustomElement(i);if("input"===i||"textarea"===i||"select"===i||r){let o=ec,s=!1;if("input"===i||r){let a=bl(t,"type");if(a){if(7===a.type)o=nc;else if(a.value)switch(a.value.content){case"radio":o=Ju;break;case"checkbox":o=Xu;break;case"file":s=!0,n.onError(ll(60,e.loc))}}else t.props.some(e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic))&&(o=nc)}else"select"===i&&(o=tc);s||(a.needRuntime=n.helper(o))}else n.onError(ll(58,e.loc));return a.props=a.props.filter(e=>4!==e.key.type||"modelValue"!==e.key.content),a},on:(e,t,n)=>Fu(e,t,n,t=>{let{modifiers:a}=e;if(!a.length)return t;let{key:i,value:r}=t.props[0],{keyModifiers:o,nonKeyModifiers:s,eventOptionModifiers:l}=((e,t)=>{let n=[],a=[],i=[];for(let r=0;r{let{exp:a,loc:i}=e;return a||n.onError(ll(62,i)),{props:[],needRuntime:n.helper(rc)}}},gc=Object.create(null);function vc(e,t){if(!L(e)){if(!e.nodeType)return y;e=e.innerHTML}let n=e+JSON.stringify(t,(e,t)=>"function"==typeof t?t.toString():t),a=gc[n];if(a)return a;if("#"===e[0]){let t=document.querySelector(e);e=t?t.innerHTML:""}let i=S({hoistStatic:!0,onError:void 0,onWarn:y},t);!i.isCustomElement&&"u">typeof customElements&&(i.isCustomElement=e=>!!customElements.get(e));let{code:r}=function(e,t={}){return function(e,t={}){var n;let a,i=t.onError||ol,r="module"===t.mode;!0===t.prefixIdentifiers?i(ll(48)):r&&i(ll(49)),t.cacheHandlers&&i(ll(50)),t.scopeId&&!r&&i(ll(51));let o=S({},t,{prefixIdentifiers:!1}),s=L(e)?function(e,t){if(Gl.reset(),Dl=null,ql=null,Bl="",Fl=-1,Vl=-1,Wl.length=0,jl=e,Nl=S({},Il),t){let e;for(e in t)null!=t[e]&&(Nl[e]=t[e])}Gl.mode="html"===Nl.parseMode?1:2*("sfc"===Nl.parseMode),Gl.inXML=1===Nl.ns||2===Nl.ns;let n=t&&t.delimiters;n&&(Gl.delimiterOpen=il(n[0]),Gl.delimiterClose=il(n[1]));let a=Ol=function(e,t=""){return{type:0,source:t,children:[],helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:[],temps:0,codegenNode:void 0,loc:Vs}}(0,e);return Gl.parse(jl),a.loc=ou(0,e.length),a.children=au(a.children),Ol=null,a}(e,o):e,[l,u]=[[Zu,Wu,Cu,Qu,Au,Bu,Ou,zu,$u],{on:Fu,bind:Vu,model:Gu}];return a=function(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:a=!1,hmr:i=!1,cacheHandlers:r=!1,nodeTransforms:o=[],directiveTransforms:s={},transformHoist:l=null,isBuiltInComponent:u=y,isCustomElement:c=y,expressionPlugins:d=[],scopeId:h=null,slotted:p=!0,ssr:f=!1,inSSR:m=!1,ssrCssVars:_="",bindingMetadata:g=v,inline:b=!1,isTS:w=!1,onError:k=ol,onWarn:x=sl,compatConfig:S}){let C=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),T={filename:t,selfName:C&&U(B(C[1])),prefixIdentifiers:n,hoistStatic:a,hmr:i,cacheHandlers:r,nodeTransforms:o,directiveTransforms:s,transformHoist:l,isBuiltInComponent:u,isCustomElement:c,expressionPlugins:d,scopeId:h,slotted:p,ssr:f,inSSR:m,ssrCssVars:_,bindingMetadata:g,inline:b,isTS:w,onError:k,onWarn:x,compatConfig:S,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],cached:[],constantCache:new WeakMap,temps:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,grandParent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){let t=T.helpers.get(e)||0;return T.helpers.set(e,t+1),e},removeHelper(e){let t=T.helpers.get(e);if(t){let n=t-1;n?T.helpers.set(e,n):T.helpers.delete(e)}},helperString:e=>`_${Fs[T.helper(e)]}`,replaceNode(e){T.parent.children[T.childIndex]=T.currentNode=e},removeNode(e){let t=T.parent.children,n=e?t.indexOf(e):T.currentNode?T.childIndex:-1;e&&e!==T.currentNode?T.childIndex>n&&(T.childIndex--,T.onNodeRemoved()):(T.currentNode=null,T.onNodeRemoved()),T.parent.children.splice(n,1)},onNodeRemoved:y,addIdentifiers(e){},removeIdentifiers(e){},hoist(e){L(e)&&(e=Gs(e)),T.hoists.push(e);let t=Gs(`_hoisted_${T.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache(e,t=!1,n=!1){let a=function(e,t,n=!1,a=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:a,needArraySpread:!1,loc:Vs}}(T.cached.length,e,t,n);return T.cached.push(a),a}};return T}(s,n=S({},o,{nodeTransforms:[...l,...t.nodeTransforms||[]],directiveTransforms:S({},u,t.directiveTransforms||{})})),mu(s,a),n.hoistStatic&&function e(t,n,a,i=!1,r=!1){let{children:o}=t,s=[];for(let n=0;n0){if(e>=2){l.codegenNode.patchFlag=-1,s.push(l);continue}}else{let e=l.codegenNode;if(13===e.type){let t=e.patchFlag;if((void 0===t||512===t||1===t)&&pu(l,a)>=2){let t=fu(l);t&&(e.props=a.hoist(t))}e.dynamicProps&&(e.dynamicProps=a.hoist(e.dynamicProps))}}}else if(12===l.type&&(i?0:du(l,a))>=2){14===l.codegenNode.type&&l.codegenNode.arguments.length>0&&l.codegenNode.arguments.push("-1"),s.push(l);continue}if(1===l.type){let n=1===l.tagType;n&&a.scopes.vSlot++,e(l,t,a,!1,r),n&&a.scopes.vSlot--}else if(11===l.type)e(l,t,a,1===l.children.length,!0);else if(9===l.type)for(let n=0;ne.key===t||e.key.content===t);return n&&n.value}}s.length&&a.transformHoist&&a.transformHoist(o,a,t)}(s,void 0,a,!!cu(s)),n.ssr||function(e,t){let{helper:n}=t,{children:a}=e;if(1===a.length){let n=cu(e);if(n&&n.codegenNode){let a=n.codegenNode;13===a.type&&Js(a,t),e.codegenNode=a}else e.codegenNode=a[0]}else a.length>1&&(e.codegenNode=Us(t,n(ns),void 0,e.children,64,void 0,void 0,!0,void 0,!1))}(s,a),s.helpers=new Set([...a.helpers.keys()]),s.components=[...a.components],s.directives=[...a.directives],s.imports=a.imports,s.hoists=a.hoists,s.temps=a.temps,s.cached=a.cached,s.transformed=!0,function(e,t={}){let n=function(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:a=!1,filename:i="template.vue.html",scopeId:r=null,optimizeImports:o=!1,runtimeGlobalName:s="Vue",runtimeModuleName:l="vue",ssrRuntimeModuleName:u="vue/server-renderer",ssr:c=!1,isTS:d=!1,inSSR:h=!1}){let p={mode:t,prefixIdentifiers:n,sourceMap:a,filename:i,scopeId:r,optimizeImports:o,runtimeGlobalName:s,runtimeModuleName:l,ssrRuntimeModuleName:u,ssr:c,isTS:d,inSSR:h,source:e.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${Fs[e]}`,push(e,t=-2,n){p.code+=e},indent(){f(++p.indentLevel)},deindent(e=!1){e?--p.indentLevel:f(--p.indentLevel)},newline(){f(p.indentLevel)}};function f(e){p.push("\n"+" ".repeat(e),0)}return p}(e,t);t.onContextCreated&&t.onContextCreated(n);let{mode:a,push:i,prefixIdentifiers:r,indent:o,deindent:s,newline:l,ssr:u}=n,c=Array.from(e.helpers),d=c.length>0,h=!r&&"module"!==a;if(function(e,t){let{push:n,newline:a,runtimeGlobalName:i}=t,r=Array.from(e.helpers);if(r.length>0&&(n(`const _Vue = ${i}\n`,-1),e.hoists.length)){n(`const { ${[cs,ds,hs,ps,fs].filter(e=>r.includes(e)).map(vu).join(", ")} } = _Vue\n`,-1)}(function(e,t){if(!e.length)return;t.pure=!0;let{push:n,newline:a}=t;a();for(let i=0;i0)&&l()),e.directives.length&&(bu(e.directives,"directive",n),e.temps>0&&l()),e.temps>0){i("let ");for(let t=0;t0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(i("\n",0),l()),u||i("return "),e.codegenNode?ku(e.codegenNode,n):i("null"),h&&(s(),i("}")),s(),i("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}(s,o)}(e,S({},lc,t,{nodeTransforms:[fc,...mc,...t.nodeTransforms||[]],directiveTransforms:S({},_c,t.directiveTransforms||{}),transformHoist:null}))}(e,i),o=Function(r)();return o._rc=!0,gc[n]=o}return gr(vc),e.BaseTransition=Dn,e.BaseTransitionPropsValidators=Nn,e.Comment=ji,e.DeprecationTypes=null,e.EffectScope=me,e.ErrorCodes={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},e.ErrorTypeStrings=null,e.Fragment=Ni,e.KeepAlive={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){let n=dr(),a=n.ctx,i=new Map,r=new Set,o=null,s=n.suspense,{renderer:{p:l,m:u,um:c,o:{createElement:d}}}=a,h=d("div");function p(e){fa(e),c(e,n,s,!0)}function f(e){i.forEach((t,n)=>{let a=kr(sa(t)?t.type.__asyncResolved||{}:t.type);a&&!e(a)&&m(n)})}function m(e){let t=i.get(e);!t||o&&Ki(t,o)?o&&fa(o):p(t),i.delete(e),r.delete(e)}a.activate=(e,t,n,a,i)=>{let r=e.component;u(e,t,n,0,s),l(r.vnode,e,t,n,r,s,a,e.slotScopeIds,i),yi(()=>{r.isDeactivated=!1,r.a&&W(r.a);let t=e.props&&e.props.onVnodeMounted;t&&sr(t,r.parent,e)},s)},a.deactivate=e=>{let t=e.component;Pi(t.m),Pi(t.a),u(e,h,null,1,s),yi(()=>{t.da&&W(t.da);let n=e.props&&e.props.onVnodeUnmounted;n&&sr(n,t.parent,e),t.isDeactivated=!0},s)},bn(()=>[e.include,e.exclude],([e,t])=>{e&&f(t=>ca(e,t)),t&&f(e=>!ca(t,e))},{flush:"post",deep:!0});let _=null,g=()=>{null!=_&&(Ei(n.subTree.type)?yi(()=>{i.set(_,ma(n.subTree))},n.subTree.suspense):i.set(_,ma(n.subTree)))};return ba(g),wa(g),ka(()=>{i.forEach(e=>{let{subTree:t,suspense:a}=n,i=ma(t);if(e.type===i.type&&e.key===i.key){fa(i);let e=i.component.da;return void(e&&yi(e,a))}p(e)})}),()=>{if(_=null,!t.default)return o=null;let n=t.default(),a=n[0];if(n.length>1)return o=null,n;if(!(Gi(a)&&(4&a.shapeFlag||128&a.shapeFlag)))return o=null,a;let s=ma(a);if(s.type===ji)return o=null,s;let l=s.type,u=kr(sa(s)?s.type.__asyncResolved||{}:l),{include:c,exclude:d,max:h}=e;if(c&&(!u||!ca(c,u))||d&&u&&ca(d,u))return s.shapeFlag&=-257,o=s,a;let p=null==s.key?l:s.key,f=i.get(p);return s.el&&(s=er(s),128&a.shapeFlag&&(a.ssContent=s)),_=p,f?(s.el=f.el,s.component=f.component,s.transition&&Un(s,s.transition),s.shapeFlag|=512,r.delete(p),r.add(p)):(r.add(p),h&&r.size>parseInt(h,10)&&m(r.values().next().value)),s.shapeFlag|=256,o=s,Ei(a.type)?a:s}}},e.ReactiveEffect=ge,e.Static=Di,e.Suspense={name:"Suspense",__isSuspense:!0,process(e,t,n,a,i,r,o,s,l,u){if(null==e)!function(e,t,n,a,i,r,o,s,l){let{p:u,o:{createElement:c}}=l,d=c("div"),h=e.suspense=Mi(e,i,a,t,d,n,r,o,s,l);u(null,h.pendingBranch=e.ssContent,d,null,a,h,r,o),h.deps>0?(Li(e,"onPending"),Li(e,"onFallback"),u(null,e.ssFallback,t,n,a,null,r,o),Ii(h,e.ssFallback)):h.resolve(!1,!0)}(t,n,a,i,r,o,s,l,u);else{if(r&&r.deps>0&&!e.suspense.isInFallback)return t.suspense=e.suspense,t.suspense.vnode=t,void(t.el=e.el);!function(e,t,n,a,i,r,o,s,{p:l,um:u,o:{createElement:c}}){let d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;let h=t.ssContent,p=t.ssFallback,{activeBranch:f,pendingBranch:m,isInFallback:_,isHydrating:g}=d;if(m)d.pendingBranch=h,Ki(m,h)?(l(m,h,d.hiddenContainer,null,i,d,r,o,s),d.deps<=0?d.resolve():_&&!g&&(l(f,p,n,a,i,null,r,o,s),Ii(d,p))):(d.pendingId=Ai++,g?(d.isHydrating=!1,d.activeBranch=m):u(m,i,d),d.deps=0,d.effects.length=0,d.hiddenContainer=c("div"),_?(l(null,h,d.hiddenContainer,null,i,d,r,o,s),d.deps<=0?d.resolve():(l(f,p,n,a,i,null,r,o,s),Ii(d,p))):f&&Ki(f,h)?(l(f,h,n,a,i,d,r,o,s),d.resolve(!0)):(l(null,h,d.hiddenContainer,null,i,d,r,o,s),d.deps<=0&&d.resolve()));else if(f&&Ki(f,h))l(f,h,n,a,i,d,r,o,s),Ii(d,h);else if(Li(t,"onPending"),d.pendingBranch=h,512&h.shapeFlag?d.pendingId=h.component.suspenseId:d.pendingId=Ai++,l(null,h,d.hiddenContainer,null,i,d,r,o,s),d.deps<=0)d.resolve();else{let{timeout:e,pendingId:t}=d;e>0?setTimeout(()=>{d.pendingId===t&&d.fallback(p)},e):0===e&&d.fallback(p)}}(e,t,n,a,i,o,s,l,u)}},hydrate:function(e,t,n,a,i,r,o,s,l){let u=t.suspense=Mi(t,a,n,e.parentNode,document.createElement("div"),null,i,r,o,s,!0),c=l(e,u.pendingBranch=t.ssContent,n,u,r,o);return 0===u.deps&&u.resolve(!1,!0),c},normalize:function(e){let{shapeFlag:t,children:n}=e,a=32&t;e.ssContent=Ri(a?n.default:n),e.ssFallback=a?Ri(n.fallback):Ji(ji)}},e.Teleport={name:"Teleport",__isTeleport:!0,process(e,t,n,a,i,r,o,s,l,u){let{mc:c,pc:d,pbc:h,o:{insert:p,querySelector:f,createText:m,parentNode:_}}=u,g=Sn(t.props),{dynamicChildren:v}=t,b=(e,t,n)=>{16&e.shapeFlag&&c(e.children,t,n,i,r,o,s,l)},y=(e=t)=>{let n=Sn(e.props),a=e.target=Pn(e.props,f),r=Ln(a,e,m,p);a&&("svg"!==o&&Cn(a)?o="svg":"mathml"!==o&&Tn(a)&&(o="mathml"),i&&i.isCE&&(i.ce._teleportTargets||(i.ce._teleportTargets=new Set)).add(a),n||(b(e,a,r),An(e,!1)))},w=e=>{let t=()=>{if(kn.get(e)===t){if(kn.delete(e),Sn(e.props)){let t=_(e.el)||n;b(e,t,e.anchor),An(e,!0)}y(e)}};kn.set(e,t),yi(t,r)};if(null==e){let e,i=t.el=m(""),o=t.anchor=m("");if(p(i,n,a),p(o,n,a),(e=t.props)&&(e.defer||""===e.defer)||r&&r.pendingBranch)return void w(t);g&&(b(t,n,o),An(t,!0)),y()}else{t.el=e.el;let a=t.anchor=e.anchor,c=kn.get(e);if(c)return c.flags|=8,kn.delete(e),void w(t);t.targetStart=e.targetStart;let p=t.target=e.target,m=t.targetAnchor=e.targetAnchor,_=Sn(e.props),b=_?n:p,y=_?a:m;if("svg"===o||Cn(p)?o="svg":("mathml"===o||Tn(p))&&(o="mathml"),v?(h(e.dynamicChildren,v,b,i,r,o,s),Ti(e,t,!0)):l||d(e,t,b,y,i,r,o,s,!1),g)_?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):En(t,n,a,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){let e=t.target=Pn(t.props,f);e&&En(t,e,null,u,0)}else _&&En(t,p,m,u,1);An(t,g)}},remove(e,t,n,{um:a,o:{remove:i}},r){let{shapeFlag:o,children:s,anchor:l,targetStart:u,targetAnchor:c,target:d,props:h}=e,p=r||!Sn(h),f=kn.get(e);if(f&&(f.flags|=8,kn.delete(e),p=!1),d&&(i(u),i(c)),r&&i(l),16&o)for(let e=0;ee[a]});return n},e.createRenderer=function(e){return ki(e)},e.createSSRApp=Xo,e.createSlots=function(e,t){for(let n=0;n{let t=a.fn(...e);return t&&(t.key=a.key),t}:a.fn)}return e},e.createStaticVNode=function(e,t){let n=Ji(Di,null,e);return n.staticCount=t,n},e.createTextVNode=tr,e.createVNode=Ji,e.customRef=Dt,e.defineAsyncComponent=function(e){let t;A(e)&&(e={loader:e});let{loader:n,loadingComponent:a,errorComponent:i,delay:r=200,hydrate:o,timeout:s,suspensible:l=!0,onError:u}=e,c=null,d=0,h=()=>{let e;return c||(e=c=n().catch(e=>{if(e=e instanceof Error?e:Error(String(e)),u)return new Promise((t,n)=>{u(e,()=>t((d++,c=null,h())),()=>n(e),d+1)});throw e}).then(n=>e!==c&&c?c:(n&&(n.__esModule||"Module"===n[Symbol.toStringTag])&&(n=n.default),t=n,n)))};return Hn({name:"AsyncComponentWrapper",__asyncLoader:h,__asyncHydrate(e,n,a){let i=!1;(n.bu||(n.bu=[])).push(()=>i=!0);let r=()=>{i||a()},s=o?()=>{let t=o(r,t=>function(e,t){if(ea(e)&&"["===e.data){let n=1,a=e.nextSibling;for(;a;){if(1===a.nodeType){if(!1===t(a))break}else if(ea(a))if("]"===a.data){if(0==--n)break}else"["===a.data&&n++;a=a.nextSibling}}else t(e)}(e,t));t&&(n.bum||(n.bum=[])).push(t)}:r;t?s():h().then(()=>!n.isUnmounted&&s())},get __asyncResolved(){return t},setup(){let e=cr;if(Wn(e),t)return()=>la(t,e);let n=t=>{c=null,Kt(t,e,13,!i)};if(l&&e.suspense)return h().then(t=>()=>la(t,e)).catch(e=>(n(e),()=>i?Ji(i,{error:e}):null));let o=Lt(!1),u=Lt(),d=Lt(!!r);return r&&setTimeout(()=>{d.value=!1},r),null!=s&&setTimeout(()=>{if(!o.value&&!u.value){let e=Error(`Async component timed out after ${s}ms.`);n(e),u.value=e}},s),h().then(()=>{o.value=!0,e.parent&&ua(e.parent.vnode)&&e.parent.update()}).catch(e=>{n(e),u.value=e}),()=>o.value&&t?la(t,e):u.value&&i?Ji(i,{error:u.value}):a&&!d.value?la(a,e):void 0}})},e.defineComponent=Hn,e.defineCustomElement=vo,e.defineEmits=function(){return null},e.defineExpose=function(e){},e.defineModel=function(){},e.defineOptions=function(e){},e.defineProps=function(){return null},e.defineSSRCustomElement=(e,t)=>vo(e,t,Xo),e.defineSlots=function(){return null},e.devtools=void 0,e.effect=function(e,t){e.effect instanceof ge&&(e=e.effect.fn);let n=new ge(e);t&&S(n,t);try{n.run()}catch(e){throw n.stop(),e}let a=n.run.bind(n);return a.effect=n,a},e.effectScope=function(e){return new me(e)},e.getCurrentInstance=dr,e.getCurrentScope=function(){return r},e.getCurrentWatcher=function(){return m},e.getTransitionRawChildren=$n,e.guardReactiveProps=Xi,e.h=Sr,e.handleError=Kt,e.hasInjectionContext=function(){return!(!dr()&&!Za)},e.hydrate=(...e)=>{Qo().hydrate(...e)},e.hydrateOnIdle=(e=1e4)=>t=>{let n=ra(t,{timeout:e});return()=>oa(n)},e.hydrateOnInteraction=(e=[])=>(t,n)=>{L(e)&&(e=[e]);let a=!1,i=e=>{a||(a=!0,r(),t(),e.target.dispatchEvent(new e.constructor(e.type,e)))},r=()=>{n(t=>{for(let n of e)t.removeEventListener(n,i)})};return n(t=>{for(let n of e)t.addEventListener(n,i,{once:!0})}),r},e.hydrateOnMediaQuery=e=>t=>{if(e){let n=matchMedia(e);if(!n.matches)return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t);t()}},e.hydrateOnVisible=e=>(t,n)=>{let a=new IntersectionObserver(e=>{for(let n of e)if(n.isIntersecting){a.disconnect(),t();break}},e);return n(e=>{if(e instanceof Element){if(function(e){let{top:t,left:n,bottom:a,right:i}=e.getBoundingClientRect(),{innerHeight:r,innerWidth:o}=window;return(t>0&&t0&&a0&&n0&&ia.disconnect()},e.initCustomFormatter=function(){},e.initDirectivesForSSR=y,e.inject=_n,e.isMemoSame=Cr,e.isProxy=St,e.isReactive=wt,e.isReadonly=kt,e.isRef=At,e.isRuntimeOnly=()=>!d,e.isShallow=xt,e.isVNode=Gi,e.markRaw=Tt,e.mergeDefaults=function(e,t){let n=Da(e);for(let e in t){if(e.startsWith("__skip"))continue;let a=n[e];a?E(a)||A(a)?a=n[e]={type:a,default:t[e]}:a.default=t[e]:null===a&&(a=n[e]={default:t[e]}),a&&t[`__skip_${e}`]&&(a.skipFactory=!0)}return n},e.mergeModels=function(e,t){return e&&t?E(e)&&E(t)?e.concat(t):S({},Da(e),Da(t)):e||t},e.mergeProps=or,e.nextTick=nn,e.nodeOps=Mr,e.normalizeClass=ae,e.normalizeProps=function(e){if(!e)return null;let{class:t,style:n}=e;return t&&!L(t)&&(e.class=ae(t)),n&&(e.style=J(n)),e},e.normalizeStyle=J,e.onActivated=da,e.onBeforeMount=va,e.onBeforeUnmount=ka,e.onBeforeUpdate=ya,e.onDeactivated=ha,e.onErrorCaptured=Pa,e.onMounted=ba,e.onRenderTracked=Ta,e.onRenderTriggered=Ca,e.onScopeDispose=function(e,t=!1){r&&r.cleanups.push(e)},e.onServerPrefetch=Sa,e.onUnmounted=xa,e.onUpdated=wa,e.onWatcherCleanup=$t,e.openBlock=Fi,e.patchProp=_o,e.popScopeId=function(){dn=null},e.provide=mn,e.proxyRefs=Ot,e.pushScopeId=function(e){dn=e},e.queuePostFlushCb=on,e.reactive=gt,e.readonly=bt,e.ref=Lt,e.registerRuntimeCompiler=gr,e.render=Zo,e.renderList=function(e,t,n,a){let i,r=n&&n[a],o=E(e);if(o||L(e)){let n=!1,a=!1;o&&wt(e)&&(n=!xt(e),a=kt(e),e=Fe(e)),i=Array(e.length);for(let o=0,s=e.length;ot(e,n,void 0,r&&r[n]));else{let n=Object.keys(e);i=Array(n.length);for(let a=0,o=n.length;a0;return"default"!==t&&(n.name=t),Fi(),Wi(Ni,null,[Ji("slot",n,a&&a())],e?-2:64)}let r=e[t];r&&r._c&&(r._d=!1),Fi();let o=r&&function e(t){return t.some(t=>!Gi(t)||t.type!==ji&&(t.type!==Ni||!!e(t.children)))?t:null}(r(n)),s=n.key||o&&o.key,l=Wi(Ni,{key:(s&&!M(s)?s:`_${t}`)+(!o&&a?"_fb":"")},o||(a?a():[]),o&&1===e._?64:-2);return!i&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),r&&r._c&&(r._d=!0),l},e.resolveComponent=function(e,t){return La(Ea,e,!0,t)||e},e.resolveDirective=function(e){return La("directives",e)},e.resolveDynamicComponent=function(e){return L(e)?La(Ea,e,!1)||e:e||Aa},e.resolveFilter=null,e.resolveTransitionHooks=Bn,e.setBlockTracking=$i,e.setDevtoolsHook=y,e.setTransitionHooks=Un,e.shallowReactive=vt,e.shallowReadonly=function(e){return yt(e,!0,rt,ht,_t)},e.shallowRef=Mt,e.ssrContextKey=gn,e.ssrUtils=null,e.stop=function(e){e.effect.stop()},e.toDisplayString=he,e.toHandlerKey=$,e.toHandlers=function(e,t){let n={};for(let a in e)n[t&&/[A-Z]/.test(a)?`on:${a}`:$(a)]=e[a];return n},e.toRaw=Ct,e.toRef=function(e,t,n){return At(e)?e:A(e)?new Bt(e):R(e)&&arguments.length>1?new qt(e,t,n):Lt(e)},e.toRefs=function(e){let t=E(e)?Array(e.length):{};for(let n in e)t[n]=new qt(e,n,void 0);return t},e.toValue=function(e){return A(e)?e():It(e)},e.transformVNodeArgs=function(e){},e.triggerRef=function(e){e.dep&&e.dep.trigger()},e.unref=It,e.useAttrs=function(){return ja().attrs},e.useCssModule=function(e="$style"){return v},e.useCssVars=function(e){let t=dr();if(!t)return;let n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(e=>eo(e,n))},a=()=>{let a=e(t.proxy);t.ce?eo(t.ce,a):function e(t,n){if(128&t.shapeFlag){let a=t.suspense;t=a.activeBranch,a.pendingBranch&&!a.isHydrating&&a.effects.push(()=>{e(a.activeBranch,n)})}for(;t.component;)t=t.component.subTree;if(1&t.shapeFlag&&t.el)eo(t.el,n);else if(t.type===Ni)t.children.forEach(t=>e(t,n));else if(t.type===Di){let{el:e,anchor:a}=t;for(;e&&(eo(e,n),e!==a);)e=e.nextSibling}}(t.subTree,a),n(a)};ya(()=>{on(a)}),ba(()=>{bn(a,y,{flush:"post"});let e=new MutationObserver(a);e.observe(t.subTree.el.parentNode,{childList:!0}),xa(()=>e.disconnect())})},e.useHost=wo,e.useId=function(){let e=dr();return e?(e.appContext.config.idPrefix||"v")+"-"+e.ids[0]+e.ids[1]++:""},e.useModel=function(e,t,n=v){let a=dr(),i=B(t),r=V(t),o=Ja(e,i),s=Dt((o,s)=>{let l,u,c=v;return vn(()=>{let t=e[i];H(l,t)&&(l=t,s())}),{get:()=>(o(),n.get?n.get(l):l),set(e){let o=n.set?n.set(e):e;if(!(H(o,l)||c!==v&&H(e,c)))return;let d=a.vnode.props;d&&(t in d||i in d||r in d)&&(`onUpdate:${t}`in d||`onUpdate:${i}`in d||`onUpdate:${r}`in d)||(l=e,s()),a.emit(`update:${t}`,o),H(e,o)&&H(e,c)&&!H(o,u)&&s(),c=e,u=o}}});return s[Symbol.iterator]=()=>{let e=0;return{next:()=>e<2?{value:e++?o||v:s,done:!1}:{done:!0}}},s},e.useSSRContext=()=>{},e.useShadowRoot=function(){let e=wo();return e&&e.shadowRoot},e.useSlots=function(){return ja().slots},e.useTemplateRef=function(e){let t=dr(),n=Mt(null);return t&&Object.defineProperty(t.refs===v?t.refs={}:t.refs,e,{enumerable:!0,get:()=>n.value,set:e=>n.value=e}),n},e.useTransitionState=zn,e.vModelCheckbox=jo,e.vModelDynamic={created(e,t,n){$o(e,t,n,null,"created")},mounted(e,t,n){$o(e,t,n,null,"mounted")},beforeUpdate(e,t,n,a){$o(e,t,n,a,"beforeUpdate")},updated(e,t,n,a){$o(e,t,n,a,"updated")}},e.vModelRadio=qo,e.vModelSelect=Bo,e.vModelText=Oo,e.vShow={name:"show",beforeMount(e,{value:t},{transition:n}){e[Qr]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):Jr(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:a}){!t!=!n&&(a?t?(a.beforeEnter(e),Jr(e,!0),a.enter(e)):a.leave(e,()=>{Jr(e,!1)}):Jr(e,t))},beforeUnmount(e,{value:t}){Jr(e,t)}},e.version=Tr,e.warn=y,e.watch=function(e,t,n){return bn(e,t,n)},e.watchEffect=function(e,t){return bn(e,null,t)},e.watchPostEffect=function(e,t){return bn(e,null,{flush:"post"})},e.watchSyncEffect=vn,e.withAsyncContext=function(e){let t=dr(),n=mr,a=e();pr(),n&&c(!1);let i=()=>{hr(t),n&&c(!0)},r=()=>{dr()!==t&&t.scope.off(),pr(),n&&c(!1)};return z(a)&&(a=a.catch(e=>{throw i(),Promise.resolve().then(()=>Promise.resolve().then(r)),e})),[a,()=>{i(),Promise.resolve().then(r)}]},e.withCtx=pn,e.withDefaults=function(e,t){return null},e.withDirectives=function(e,t){if(null===cn)return e;let n=wr(cn),a=e.dirs||(e.dirs=[]);for(let e=0;e{let n=e._withKeys||(e._withKeys={}),a=t.join(".");return n[a]||(n[a]=n=>{if(!("key"in n))return;let a=V(n.key);return t.some(e=>e===a||Go[e]===a)?e(n):void 0})},e.withMemo=function(e,t,n,a){let i=n[a];if(i&&Cr(i,e))return i;let r=t();return r.memo=e.slice(),r.cacheIndex=a,n[a]=r},e.withModifiers=(e,t)=>{if(!e)return e;let n=e._withMods||(e._withMods={}),a=t.join(".");return n[a]||(n[a]=(n,...a)=>{for(let e=0;epn,e}({}); +var Vue=function(e){"use strict";var t,n,a;let i,o,r,s,l,u,c,d,h,p,f,m,_;function g(e){let t=Object.create(null);for(let n of e.split(","))t[n]=1;return e=>e in t}let v={},b=[],y=()=>{},w=()=>!1,k=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||97>e.charCodeAt(2)),x=e=>e.startsWith("onUpdate:"),S=Object.assign,C=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},T=Object.prototype.hasOwnProperty,P=(e,t)=>T.call(e,t),E=Array.isArray,A=e=>"function"==typeof e,L=e=>"string"==typeof e,M=e=>"symbol"==typeof e,R=e=>null!==e&&"object"==typeof e,z=e=>(R(e)||A(e))&&A(e.then)&&A(e.catch),O=Object.prototype.toString,I=e=>L(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,N=g(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),D=g("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),q=e=>{let t=Object.create(null);return n=>t[n]||(t[n]=e(n))},j=/-\w/g,B=q(e=>e.replace(j,e=>e.slice(1).toUpperCase())),F=/\B([A-Z])/g,$=q(e=>e.replace(F,"-$1").toLowerCase()),V=q(e=>e.charAt(0).toUpperCase()+e.slice(1)),U=q(e=>e?`on${V(e)}`:""),H=(e,t)=>!Object.is(e,t),W=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:a,value:n})},K=e=>{let t=parseFloat(e);return isNaN(t)?e:t},Y=e=>{let t=L(e)?Number(e):NaN;return isNaN(t)?e:t},Q=()=>i||(i="u">typeof globalThis?globalThis:"u">typeof self?self:"u">typeof window?window:"u">typeof global?global:{}),Z=g("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol");function J(e){if(E(e)){let t={};for(let n=0;n{if(e){let n=e.split(ee);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function ae(e){let t="";if(L(e))t=e;else if(E(e))for(let n=0;nue(e,t))}let de=e=>!(!e||!0!==e.__v_isRef),he=e=>L(e)?e:null==e?"":E(e)||R(e)&&(e.toString===O||!A(e.toString))?de(e)?he(e.value):JSON.stringify(e,pe,2):String(e),pe=(e,t)=>{let n;if(de(t))return pe(e,t.value);if("[object Map]"===(n=t,O.call(n)))return{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],a)=>(e[fe(t,a)+" =>"]=n,e),{})};{let e;if("[object Set]"===(e=t,O.call(e)))return{[`Set(${t.size})`]:[...t.values()].map(e=>fe(e))};{if(M(t))return fe(t);let e;if(R(t)&&!E(t)&&"[object Object]"!==(e=t,O.call(e)))return String(t)}}return t},fe=(e,t="")=>{var n;return M(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};class me{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&o&&(o.active?(this.parent=o,this.index=(o.scopes||(o.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){let e,t;if(this._isPaused=!0,this.scopes)for(e=0,t=this.scopes.length;e0&&0==--this._on){if(o===this)o=this.prevScope;else{let e=o;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){let t,n;for(this._active=!1,t=0,n=this.effects.length;t0)){if(l){let e=l;for(l=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}for(;s;){let t=s;for(s=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,1&t.flags)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}}function we(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function ke(e){let t,n=e.depsTail,a=n;for(;a;){let e=a.prevDep;-1===a.version?(a===n&&(n=e),Ce(a),function(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}(a)):t=a,a.dep.activeLink=a.prevActiveLink,a.prevActiveLink=void 0,a=e}e.deps=t,e.depsTail=n}function xe(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Se(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Se(e){if(4&e.flags&&!(16&e.flags)||(e.flags&=-17,e.globalVersion===Me)||(e.globalVersion=Me,!e.isSSR&&128&e.flags&&(!e.deps&&!e._dirty||!xe(e))))return;e.flags|=2;let t=e.dep,n=r,a=Te;r=e,Te=!0;try{we(e);let n=e.fn(e._value);(0===t.version||H(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{r=n,Te=a,ke(e),e.flags&=-3}}function Ce(e,t=!1){let{dep:n,prevSub:a,nextSub:i}=e;if(a&&(a.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=a,e.nextSub=void 0),n.subs===e&&(n.subs=a,!a&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)Ce(e,!0)}t||--n.sc||!n.map||n.map.delete(n.key)}let Te=!0,Pe=[];function Ee(){Pe.push(Te),Te=!1}function Ae(){let e=Pe.pop();Te=void 0===e||e}function Le(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=r;r=void 0;try{t()}finally{r=e}}}let Me=0;class Re{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class ze{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!r||!Te||r===this.computed)return;let t=this.activeLink;if(void 0===t||t.sub!==r)t=this.activeLink=new Re(r,this),r.deps?(t.prevDep=r.depsTail,r.depsTail.nextDep=t,r.depsTail=t):r.deps=r.depsTail=t,function e(t){if(t.dep.sc++,4&t.sub.flags){let n=t.dep.computed;if(n&&!t.dep.subs){n.flags|=20;for(let t=n.deps;t;t=t.nextDep)e(t)}let a=t.dep.subs;a!==t&&(t.prevSub=a,a&&(a.nextSub=t)),t.dep.subs=t}}(t);else if(-1===t.version&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=r.depsTail,t.nextDep=void 0,r.depsTail.nextDep=t,r.depsTail=t,r.deps===t&&(r.deps=e)}return t}trigger(e){this.version++,Me++,this.notify(e)}notify(e){ve++;try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{ye()}}}let Oe=new WeakMap,Ie=Symbol(""),Ne=Symbol(""),De=Symbol("");function qe(e,t,n){if(Te&&r){let t=Oe.get(e);t||Oe.set(e,t=new Map);let a=t.get(n);a||(t.set(n,a=new ze),a.map=t,a.key=n),a.track()}}function je(e,t,n,a,i,o){let r=Oe.get(e);if(!r)return void Me++;let s=e=>{e&&e.trigger()};if(ve++,"clear"===t)r.forEach(s);else{let i=E(e),o=i&&I(n);if(i&&"length"===n){let e=Number(a);r.forEach((t,n)=>{("length"===n||n===De||!M(n)&&n>=e)&&s(t)})}else switch((void 0!==n||r.has(void 0))&&s(r.get(n)),o&&s(r.get(De)),t){case"add":if(i)o&&s(r.get("length"));else{let t;s(r.get(Ie)),"[object Map]"===(t=e,O.call(t))&&s(r.get(Ne))}break;case"delete":if(!i){let t;s(r.get(Ie)),"[object Map]"===(t=e,O.call(t))&&s(r.get(Ne))}break;case"set":let t;"[object Map]"===(t=e,O.call(t))&&s(r.get(Ie))}}ye()}function Be(e){let t=Ct(e);return t===e?t:(qe(t,0,De),xt(e)?t:t.map(Pt))}function Fe(e){return qe(e=Ct(e),0,De),e}function $e(e,t){return kt(e)?wt(e)?Et(Pt(t)):Et(t):Pt(t)}let Ve={__proto__:null,[Symbol.iterator](){return Ue(this,Symbol.iterator,e=>$e(this,e))},concat(...e){return Be(this).concat(...e.map(e=>E(e)?Be(e):e))},entries(){return Ue(this,"entries",e=>(e[1]=$e(this,e[1]),e))},every(e,t){return We(this,"every",e,t,void 0,arguments)},filter(e,t){return We(this,"filter",e,t,e=>e.map(e=>$e(this,e)),arguments)},find(e,t){return We(this,"find",e,t,e=>$e(this,e),arguments)},findIndex(e,t){return We(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return We(this,"findLast",e,t,e=>$e(this,e),arguments)},findLastIndex(e,t){return We(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return We(this,"forEach",e,t,void 0,arguments)},includes(...e){return Ke(this,"includes",e)},indexOf(...e){return Ke(this,"indexOf",e)},join(e){return Be(this).join(e)},lastIndexOf(...e){return Ke(this,"lastIndexOf",e)},map(e,t){return We(this,"map",e,t,void 0,arguments)},pop(){return Ye(this,"pop")},push(...e){return Ye(this,"push",e)},reduce(e,...t){return Ge(this,"reduce",e,t)},reduceRight(e,...t){return Ge(this,"reduceRight",e,t)},shift(){return Ye(this,"shift")},some(e,t){return We(this,"some",e,t,void 0,arguments)},splice(...e){return Ye(this,"splice",e)},toReversed(){return Be(this).toReversed()},toSorted(e){return Be(this).toSorted(e)},toSpliced(...e){return Be(this).toSpliced(...e)},unshift(...e){return Ye(this,"unshift",e)},values(){return Ue(this,"values",e=>$e(this,e))}};function Ue(e,t,n){let a=Fe(e),i=a[t]();return a===e||xt(e)||(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}let He=Array.prototype;function We(e,t,n,a,i,o){let r=Fe(e),s=r!==e&&!xt(e),l=r[t];if(l!==He[t]){let t=l.apply(e,o);return s?Pt(t):t}let u=n;r!==e&&(s?u=function(t,a){return n.call(this,$e(e,t),a,e)}:n.length>2&&(u=function(t,a){return n.call(this,t,a,e)}));let c=l.call(r,u,a);return s&&i?i(c):c}function Ge(e,t,n,a){let i=Fe(e),o=i!==e&&!xt(e),r=n,s=!1;i!==e&&(o?(s=0===a.length,r=function(t,a,i){return s&&(s=!1,t=$e(e,t)),n.call(this,t,$e(e,a),i,e)}):n.length>3&&(r=function(t,a,i){return n.call(this,t,a,i,e)}));let l=i[t](r,...a);return s?$e(e,l):l}function Ke(e,t,n){let a=Ct(e);qe(a,0,De);let i=a[t](...n);return-1!==i&&!1!==i||!St(n[0])?i:(n[0]=Ct(n[0]),a[t](...n))}function Ye(e,t,n=[]){Ee(),ve++;let a=Ct(e)[t].apply(e,n);return ye(),Ae(),a}let Qe=g("__proto__,__v_isRef,__isVue"),Ze=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>"arguments"!==e&&"caller"!==e).map(e=>Symbol[e]).filter(M));function Je(e){M(e)||(e=String(e));let t=Ct(this);return qe(t,0,e),t.hasOwnProperty(e)}class Xe{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if("__v_skip"===t)return e.__v_skip;let a=this._isReadonly,i=this._isShallow;if("__v_isReactive"===t)return!a;if("__v_isReadonly"===t)return a;if("__v_isShallow"===t)return i;if("__v_raw"===t)return n===(a?i?_t:mt:i?ft:pt).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let o=E(e);if(!a){let e;if(o&&(e=Ve[t]))return e;if("hasOwnProperty"===t)return Je}let r=Reflect.get(e,t,At(e)?e:n);if((M(t)?Ze.has(t):Qe(t))||(a||qe(e,0,t),i))return r;if(At(r)){let e=o&&I(t)?r:r.value;return a&&R(e)?bt(e):e}return R(r)?a?bt(r):gt(r):r}}class et extends Xe{constructor(e=!1){super(!1,e)}set(e,t,n,a){let i=e[t],o=E(e)&&I(t);if(!this._isShallow){let e=kt(i);if(xt(n)||kt(n)||(i=Ct(i),n=Ct(n)),!o&&At(i)&&!At(n))return e||(i.value=n),!0}let r=o?Number(t)e;function st(e){return function(){return"delete"!==e&&("clear"===e?void 0:this)}}function lt(e,t){let n,a=(S(n={get(n){let a=this.__v_raw,i=Ct(a),o=Ct(n);e||(H(n,o)&&qe(i,0,n),qe(i,0,o));let{has:r}=Reflect.getPrototypeOf(i),s=t?rt:e?Et:Pt;return r.call(i,n)?s(a.get(n)):r.call(i,o)?s(a.get(o)):void(a!==i&&a.get(n))},get size(){let t=this.__v_raw;return e||qe(Ct(t),0,Ie),t.size},has(t){let n=this.__v_raw,a=Ct(n),i=Ct(t);return e||(H(t,i)&&qe(a,0,t),qe(a,0,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,a){let i=this,o=i.__v_raw,r=Ct(o),s=t?rt:e?Et:Pt;return e||qe(r,0,Ie),o.forEach((e,t)=>n.call(a,s(e),s(t),i))}},e?{add:st("add"),set:st("set"),delete:st("delete"),clear:st("clear")}:{add(e){let n=Ct(this),a=Reflect.getPrototypeOf(n),i=Ct(e),o=t||xt(e)||kt(e)?e:i;return a.has.call(n,o)||H(e,o)&&a.has.call(n,e)||H(i,o)&&a.has.call(n,i)||(n.add(o),je(n,"add",o,o)),this},set(e,n){t||xt(n)||kt(n)||(n=Ct(n));let a=Ct(this),{has:i,get:o}=Reflect.getPrototypeOf(a),r=i.call(a,e);r||(e=Ct(e),r=i.call(a,e));let s=o.call(a,e);return a.set(e,n),r?H(n,s)&&je(a,"set",e,n):je(a,"add",e,n),this},delete(e){let t=Ct(this),{has:n,get:a}=Reflect.getPrototypeOf(t),i=n.call(t,e);i||(e=Ct(e),i=n.call(t,e)),a&&a.call(t,e);let o=t.delete(e);return i&&je(t,"delete",e,void 0),o},clear(){let e=Ct(this),t=0!==e.size,n=e.clear();return t&&je(e,"clear",void 0,void 0),n}}),["keys","values","entries",Symbol.iterator].forEach(a=>{n[a]=function(...n){let i,o=this.__v_raw,r=Ct(o),s="[object Map]"===(i=r,O.call(i)),l="entries"===a||a===Symbol.iterator&&s,u=o[a](...n),c=t?rt:e?Et:Pt;return e||qe(r,0,"keys"===a&&s?Ne:Ie),S(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:l?[c(e[0]),c(e[1])]:c(e),done:t}}})}}),n);return(t,n,i)=>"__v_isReactive"===n?!e:"__v_isReadonly"===n?e:"__v_raw"===n?t:Reflect.get(P(a,n)&&n in t?a:t,n,i)}let ut={get:lt(!1,!1)},ct={get:lt(!1,!0)},dt={get:lt(!0,!1)},ht={get:lt(!0,!0)},pt=new WeakMap,ft=new WeakMap,mt=new WeakMap,_t=new WeakMap;function gt(e){return kt(e)?e:yt(e,!1,nt,ut,pt)}function vt(e){return yt(e,!1,it,ct,ft)}function bt(e){return yt(e,!0,at,dt,mt)}function yt(e,t,n,a,i){var o;let r;if(!R(e)||e.__v_raw&&(!t||!e.__v_isReactive))return e;let s=(o=e).__v_skip||!Object.isExtensible(o)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((r=o,O.call(r)).slice(8,-1));if(0===s)return e;let l=i.get(e);if(l)return l;let u=new Proxy(e,2===s?a:n);return i.set(e,u),u}function wt(e){return kt(e)?wt(e.__v_raw):!(!e||!e.__v_isReactive)}function kt(e){return!(!e||!e.__v_isReadonly)}function xt(e){return!(!e||!e.__v_isShallow)}function St(e){return!!e&&!!e.__v_raw}function Ct(e){let t=e&&e.__v_raw;return t?Ct(t):e}function Tt(e){return!P(e,"__v_skip")&&Object.isExtensible(e)&&G(e,"__v_skip",!0),e}let Pt=e=>R(e)?gt(e):e,Et=e=>R(e)?bt(e):e;function At(e){return!!e&&!0===e.__v_isRef}function Lt(e){return Rt(e,!1)}function Mt(e){return Rt(e,!0)}function Rt(e,t){return At(e)?e:new zt(e,t)}class zt{constructor(e,t){this.dep=new ze,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:Ct(e),this._value=t?e:Pt(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||xt(e)||kt(e);H(e=n?e:Ct(e),t)&&(this._rawValue=e,this._value=n?e:Pt(e),this.dep.trigger())}}function Ot(e){return At(e)?e.value:e}let It={get:(e,t,n)=>"__v_raw"===t?e:Ot(Reflect.get(e,t,n)),set:(e,t,n,a)=>{let i=e[t];return At(i)&&!At(n)?(i.value=n,!0):Reflect.set(e,t,n,a)}};function Nt(e){return wt(e)?e:new Proxy(e,It)}class Dt{constructor(e){this.__v_isRef=!0,this._value=void 0;const t=this.dep=new ze,{get:n,set:a}=e(t.track.bind(t),t.trigger.bind(t));this._get=n,this._set=a}get value(){return this._value=this._get()}set value(e){this._set(e)}}function qt(e){return new Dt(e)}class jt{constructor(e,t,n){this._object=e,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=M(t)?t:String(t),this._raw=Ct(e);let a=!0,i=e;if(!E(e)||M(this._key)||!I(this._key))do{a=!St(i)||xt(i)}while(a&&(i=i.__v_raw));this._shallow=a}get value(){let e=this._object[this._key];return this._shallow&&(e=Ot(e)),this._value=void 0===e?this._defaultValue:e}set value(e){if(this._shallow&&At(this._raw[this._key])){let t=this._object[this._key];if(At(t))return void(t.value=e)}this._object[this._key]=e}get dep(){var e,t;let n;return e=this._raw,t=this._key,(n=Oe.get(e))&&n.get(t)}}class Bt{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}class Ft{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new ze(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Me-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(8&this.flags)&&r!==this)return be(this,!0),!0}get value(){let e=this.dep.track();return Se(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}let $t={},Vt=new WeakMap;function Ut(e,t=!1,n=m){if(n){let t=Vt.get(n);t||Vt.set(n,t=[]),t.push(e)}}function Ht(e,t=1/0,n){if(t<=0||!R(e)||e.__v_skip||((n=n||new Map).get(e)||0)>=t)return e;if(n.set(e,t),t--,At(e))Ht(e.value,t,n);else if(E(e))for(let a=0;a{Ht(e,t,n)});else{let a;if("[object Object]"===(a=e,O.call(a))){for(let a in e)Ht(e[a],t,n);for(let a of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,a)&&Ht(e[a],t,n)}}}return e}function Wt(e,t,n,a){try{return a?e(...a):e()}catch(e){Kt(e,t,n)}}function Gt(e,t,n,a){if(A(e)){let i=Wt(e,t,n,a);return i&&z(i)&&i.catch(e=>{Kt(e,t,n)}),i}if(E(e)){let i=[];for(let o=0;o=un(n)?Yt.push(e):Yt.splice(function(e){let t=Qt+1,n=Yt.length;for(;t>>1,i=Yt[a],o=un(i);oun(e)-un(t));if(Zt.length=0,Jt)return void Jt.push(...e);for(Jt=e,Xt=0;Xtnull==e.id?2&e.flags?-1:1/0:e.id,cn=null,dn=null;function hn(e){let t=cn;return cn=e,dn=e&&e.type.__scopeId||null,t}function pn(e,t=cn,n){if(!t||e._n)return e;let a=(...n)=>{let i;a._d&&Ui(-1);let o=hn(t);try{i=e(...n)}finally{hn(o),a._d&&Ui(1)}return i};return a._n=!0,a._c=!0,a._d=!0,a}function fn(e,t,n,a){let i=e.dirs,o=t&&t.dirs;for(let r=0;r1)return n&&A(t)?t.call(a&&a.proxy):t}}let gn=Symbol.for("v-scx");function vn(e,t){return bn(e,null,{flush:"sync"})}function bn(e,t,n=v){let{flush:a}=n,i=S({},n),r=co;i.call=(e,t,n)=>Gt(e,r,t,n);let s=!1;return"post"===a?i.scheduler=e=>{yi(e,r&&r.suspense)}:"sync"!==a&&(s=!0,i.scheduler=(e,t)=>{t?e():an(e)}),i.augmentJob=e=>{t&&(e.flags|=4),s&&(e.flags|=2,r&&(e.id=r.uid,e.i=r))},function(e,t,n=v){let a,i,r,s,{immediate:l,deep:u,once:c,scheduler:d,augmentJob:h,call:p}=n,f=e=>u?e:xt(e)||!1===u||0===u?Ht(e,1):Ht(e),_=!1,g=!1;if(At(e)?(i=()=>e.value,_=xt(e)):wt(e)?(i=()=>f(e),_=!0):E(e)?(g=!0,_=e.some(e=>wt(e)||xt(e)),i=()=>e.map(e=>At(e)?e.value:wt(e)?f(e):A(e)?p?p(e,2):e():void 0)):i=A(e)?t?p?()=>p(e,2):e:()=>{if(r){Ee();try{r()}finally{Ae()}}let t=m;m=a;try{return p?p(e,3,[s]):e(s)}finally{m=t}}:y,t&&u){let e=i,t=!0===u?1/0:u;i=()=>Ht(e(),t)}let b=o,w=()=>{a.stop(),b&&b.active&&C(b.effects,a)};if(c&&t){let e=t;t=(...t)=>{e(...t),w()}}let k=g?Array(e.length).fill($t):$t,x=e=>{if(1&a.flags&&(a.dirty||e))if(t){let e=a.run();if(u||_||(g?e.some((e,t)=>H(e,k[t])):H(e,k))){r&&r();let n=m;m=a;try{let n=[e,k===$t?void 0:g&&k[0]===$t?[]:k,s];k=e,p?p(t,3,n):t(...n)}finally{m=n}}}else a.run()};return h&&h(x),(a=new ge(i)).scheduler=d?()=>d(x,!1):x,s=e=>Ut(e,!1,a),r=a.onStop=()=>{let e=Vt.get(a);if(e){if(p)p(e,4);else for(let t of e)t();Vt.delete(a)}},t?l?x(!0):k=a.run():d?d(x.bind(null,!0),!0):a.run(),w.pause=a.pause.bind(a),w.resume=a.resume.bind(a),w.stop=w,w}(e,t,i)}function yn(e,t,n){let a,i=this.proxy,o=L(e)?e.includes(".")?wn(i,e):()=>i[e]:e.bind(i,i);A(t)?a=t:(a=t.handler,n=t);let r=po(this),s=bn(o,a.bind(i),n);return r(),s}function wn(e,t){let n=t.split(".");return()=>{let t=e;for(let e=0;ee&&(e.disabled||""===e.disabled),Cn=e=>"u">typeof SVGElement&&e instanceof SVGElement,Tn=e=>"function"==typeof MathMLElement&&e instanceof MathMLElement,Pn=(e,t)=>{let n=e&&e.to;return L(n)?t?t(n):null:n};function En(e,t,n,{o:{insert:a},m:i},o=2){0===o&&a(e.targetAnchor,t,n);let{el:r,anchor:s,shapeFlag:l,children:u,props:c}=e,d=2===o;if(d&&a(r,t,n),!kn.has(e)&&(!d||Sn(c))&&16&l)for(let e=0;e{e.isMounted=!0}),ka(()=>{e.isUnmounting=!0}),e}let On=[Function,Array],In={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:On,onEnter:On,onAfterEnter:On,onEnterCancelled:On,onBeforeLeave:On,onLeave:On,onAfterLeave:On,onLeaveCancelled:On,onBeforeAppear:On,onAppear:On,onAfterAppear:On,onAppearCancelled:On},Nn=e=>{let t=e.subTree;return t.component?Nn(t.component):t};function Dn(e){let t=e[0];if(e.length>1)for(let n of e)if(n.type!==Di){t=n;break}return t}let qn={name:"BaseTransition",props:In,setup(e,{slots:t}){let n=ho(),a=zn();return()=>{let i=t.default&&Un(t.default(),!0),o=i&&i.length?Dn(i):n.subTree?no():void 0;if(!o)return;let r=Ct(e),{mode:s}=r;if(a.isLeaving)return Fn(o);let l=$n(o);if(!l)return Fn(o);let u=Bn(l,r,a,n,e=>u=e);l.type!==Di&&Vn(l,u);let c=n.subTree&&$n(n.subTree);if(c&&c.type!==Di&&!Ki(c,l)&&Nn(n).type!==Di){let e=Bn(c,r,a,n);if(Vn(c,e),"out-in"===s&&l.type!==Di)return a.isLeaving=!0,e.afterLeave=()=>{a.isLeaving=!1,8&n.job.flags||n.update(),delete e.afterLeave,c=void 0},Fn(o);"in-out"===s&&l.type!==Di?e.delayLeave=(e,t,n)=>{jn(a,c)[String(c.key)]=c,e[Mn]=()=>{t(),e[Mn]=void 0,delete u.delayedLeave,c=void 0},u.delayedLeave=()=>{n(),delete u.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return o}}};function jn(e,t){let{leavingVNodes:n}=e,a=n.get(t.type);return a||(a=Object.create(null),n.set(t.type,a)),a}function Bn(e,t,n,a,i){let{appear:o,mode:r,persisted:s=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:c,onEnterCancelled:d,onBeforeLeave:h,onLeave:p,onAfterLeave:f,onLeaveCancelled:m,onBeforeAppear:_,onAppear:g,onAfterAppear:v,onAppearCancelled:b}=t,y=String(e.key),w=jn(n,e),k=(e,t)=>{e&&Gt(e,a,9,t)},x=(e,t)=>{let n=t[1];k(e,t),E(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},S={mode:r,persisted:s,beforeEnter(t){let a=l;if(!n.isMounted){if(!o)return;a=_||l}t[Mn]&&t[Mn](!0);let i=w[y];i&&Ki(e,i)&&i.el[Mn]&&i.el[Mn](),k(a,[t])},enter(t){if(w[y]===e)return;let a=u,i=c,r=d;if(!n.isMounted){if(!o)return;a=g||u,i=v||c,r=b||d}let s=!1;t[Rn]=e=>{s||(s=!0,k(e?r:i,[t]),S.delayedLeave&&S.delayedLeave(),t[Rn]=void 0)};let l=t[Rn].bind(null,!1);a?x(a,[t,l]):l()},leave(t,a){let i=String(e.key);if(t[Rn]&&t[Rn](!0),n.isUnmounting)return a();k(h,[t]);let o=!1;t[Mn]=n=>{o||(o=!0,a(),k(n?m:f,[t]),t[Mn]=void 0,w[i]===e&&delete w[i])};let r=t[Mn].bind(null,!1);w[i]=e,p?x(p,[t,r]):r()},clone(e){let o=Bn(e,t,n,a,i);return i&&i(o),o}};return S}function Fn(e){if(ua(e))return(e=eo(e)).children=null,e}function $n(e){if(!ua(e))return e.type.__isTeleport&&e.children?Dn(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(16&t)return n[0];if(32&t&&A(n.default))return n.default()}}function Vn(e,t){6&e.shapeFlag&&e.component?(e.transition=t,Vn(e.component.subTree,t)):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Un(e,t=!1,n){let a=[],i=0;for(let o=0;o1)for(let e=0;eYn(e,t&&(E(t)?t[o]:t),n,a,i));if(sa(a)&&!i)return void(512&a.shapeFlag&&a.type.__asyncResolved&&a.component.subTree.component&&Yn(e,t,n,a.component.subTree));let o=4&a.shapeFlag?ko(a.component):a.el,r=i?null:o,{i:s,r:l}=e,u=t&&t.r,c=s.refs===v?s.refs={}:s.refs,d=s.setupState,h=Ct(d),p=d===v?w:e=>!Gn(c,e)&&P(h,e),f=(e,t)=>!(t&&Gn(c,t));if(null!=u&&u!==l&&(Qn(t),L(u)?(c[u]=null,p(u)&&(d[u]=null)):At(u)&&(f(0,t.k)&&(u.value=null),t.k&&(c[t.k]=null))),A(l))Wt(l,s,12,[r,c]);else{let t=L(l),a=At(l);if(t||a){let s=()=>{if(e.f){let n=t?p(l)?d[l]:c[l]:f()||!e.k?l.value:c[e.k];if(i)E(n)&&C(n,o);else if(E(n))n.includes(o)||n.push(o);else if(t)c[l]=[o],p(l)&&(d[l]=c[l]);else{let t=[o];f(0,e.k)&&(l.value=t),e.k&&(c[e.k]=t)}}else t?(c[l]=r,p(l)&&(d[l]=r)):a&&(f(0,e.k)&&(l.value=r),e.k&&(c[e.k]=r))};if(r){let t=()=>{s(),Kn.delete(e)};t.id=-1,Kn.set(e,t),yi(t,n)}else Qn(e),s()}}}function Qn(e){let t=Kn.get(e);t&&(t.flags|=8,Kn.delete(e))}let Zn=!1,Jn=()=>{Zn||(console.error("Hydration completed but contains mismatches."),Zn=!0)},Xn=e=>{if(1===e.nodeType){if(e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName)return"svg";if(e.namespaceURI.includes("MathML"))return"mathml"}},ea=e=>8===e.nodeType;function ta(e){let{mt:t,p:n,o:{patchProp:a,createText:i,nextSibling:o,parentNode:r,remove:s,insert:l,createComment:u}}=e,c=(n,a,s,u,v,b=!1)=>{b=b||!!a.dynamicChildren;let y=ea(n)&&"["===n.data,w=()=>f(n,a,s,u,v,y),{type:k,ref:x,shapeFlag:S,patchFlag:C}=a,T=n.nodeType;a.el=n,-2===C&&(b=!1,a.dynamicChildren=null);let P=null;switch(k){case Ni:3!==T?""===a.children?(l(a.el=i(""),r(n),n),P=n):P=w():(n.data!==a.children&&(Jn(),n.data=a.children),P=o(n));break;case Di:g(n)?(P=o(n),_(a.el=n.content.firstChild,n,s)):P=8!==T||y?w():o(n);break;case qi:if(y&&(T=(n=o(n)).nodeType),1===T||3===T){P=n;let e=!a.children.length;for(let t=0;t{r=r||!!t.dynamicChildren;let{type:l,props:u,patchFlag:c,shapeFlag:d,dirs:p,transition:f}=t,m="input"===l||"option"===l;if(m||-1!==c){let l;p&&fn(t,null,n,"created");let v=!1;if(g(e)){v=Ci(null,f)&&n&&n.vnode.props&&n.vnode.props.appear;let a=e.content.firstChild;if(v){let e=a.getAttribute("class");e&&(a.$cls=e),f.beforeEnter(a)}_(a,e,n),t.el=e=a}if(16&d&&(!u||!u.innerHTML&&!u.textContent)){let a=h(e.firstChild,t,e,n,i,o,r);for(;a;){ia(e,1)||Jn();let t=a;a=a.nextSibling,s(t)}}else if(8&d){let n=t.children;"\n"===n[0]&&("PRE"===e.tagName||"TEXTAREA"===e.tagName)&&(n=n.slice(1));let{textContent:a}=e;a!==n&&a!==n.replace(/\r\n|\r/g,"\n")&&(ia(e,0)||Jn(),e.textContent=t.children)}if(u)if(m||!r||48&c){let t=e.tagName.includes("-");for(let i in u)(m&&(i.endsWith("value")||"indeterminate"===i)||k(i)&&!N(i)||"."===i[0]||t&&!N(i))&&a(e,i,null,u[i],void 0,n)}else if(u.onClick)a(e,"onClick",null,u.onClick,void 0,n);else if(4&c&&wt(u.style))for(let e in u.style)u.style[e];(l=u&&u.onVnodeBeforeMount)&&so(l,n,t),p&&fn(t,null,n,"beforeMount"),((l=u&&u.onVnodeMounted)||p||v)&&zi(()=>{l&&so(l,n,t),v&&f.enter(e),p&&fn(t,null,n,"mounted")},i)}return e.nextSibling},h=(e,t,a,r,s,u,d)=>{d=d||!!t.dynamicChildren;let h=t.children,p=h.length;for(let t=0;t{let{slotScopeIds:c}=t;c&&(i=i?i.concat(c):c);let d=r(e),p=h(o(e),t,d,n,a,i,s);return p&&ea(p)&&"]"===p.data?o(t.anchor=p):(Jn(),l(t.anchor=u("]"),d,p),p)},f=(e,t,a,i,l,u)=>{if(ia(e.parentElement,1)||Jn(),t.el=null,u){let t=m(e);for(;;){let n=o(e);if(!n||n===t)break;s(n)}}let c=o(e),d=r(e);return s(e),n(null,t,d,c,a,i,Xn(d),l),a&&(a.vnode.el=t.el,si(a,t.el)),c},m=(e,t="[",n="]")=>{let a=0;for(;e;)if((e=o(e))&&ea(e)&&(e.data===t&&a++,e.data===n)){if(0===a)return o(e);a--}return e},_=(e,t,n)=>{let a=t.parentNode;a&&a.replaceChild(e,t);let i=n;for(;i;)i.vnode.el===t&&(i.vnode.el=i.subTree.el=e),i=i.parent},g=e=>1===e.nodeType&&"TEMPLATE"===e.tagName;return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),ln(),void(t._vnode=e);c(t.firstChild,e,null,null,null),ln(),t._vnode=e},c]}let na="data-allow-mismatch",aa={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function ia(e,t){if(0===t||1===t)for(;e&&!e.hasAttribute(na);)e=e.parentElement;let n=e&&e.getAttribute(na);if(null==n)return!1;{if(""===n)return!0;let e=n.split(",");return!(0!==t||!e.includes("children"))||e.includes(aa[t])}}let oa=Q().requestIdleCallback||(e=>setTimeout(e,1)),ra=Q().cancelIdleCallback||(e=>clearTimeout(e)),sa=e=>!!e.type.__asyncLoader;function la(e,t){let{ref:n,props:a,children:i,ce:o}=t.vnode,r=Ji(e,a,i);return r.ref=n,r.ce=o,delete t.vnode.ce,r}let ua=e=>e.type.__isKeepAlive;function ca(e,t){let n;return E(e)?e.some(e=>ca(e,t)):L(e)?e.split(",").includes(t):"[object RegExp]"===(n=e,O.call(n))&&(e.lastIndex=0,e.test(t))}function da(e,t){pa(e,"a",t)}function ha(e,t){pa(e,"da",t)}function pa(e,t,n=co){let a=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(_a(t,a,n),n){let e=n.parent;for(;e&&e.parent;)ua(e.parent.vnode)&&function(e,t,n,a){let i=_a(t,e,a,!0);xa(()=>{C(a[t],i)},n)}(a,t,n,e),e=e.parent}}function fa(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ma(e){return 128&e.shapeFlag?e.ssContent:e}function _a(e,t,n=co,a=!1){if(n){let i=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...a)=>{Ee();let i=po(n),o=Gt(t,n,e,a);return i(),Ae(),o});return a?i.unshift(o):i.push(o),o}}let ga=e=>(t,n=co)=>{_o&&"sp"!==e||_a(e,(...e)=>t(...e),n)},va=ga("bm"),ba=ga("m"),ya=ga("bu"),wa=ga("u"),ka=ga("bum"),xa=ga("um"),Sa=ga("sp"),Ca=ga("rtg"),Ta=ga("rtc");function Pa(e,t=co){_a("ec",e,t)}let Ea="components",Aa=Symbol.for("v-ndc");function La(e,t,n=!0,a=!1){let i=cn||co;if(i){let n=i.type;if(e===Ea){let e=xo(n,!1);if(e&&(e===t||e===B(t)||e===V(B(t))))return n}let o=Ma(i[e]||n[e],t)||Ma(i.appContext[e],t);return!o&&a?n:o}}function Ma(e,t){return e&&(e[t]||e[B(t)]||e[V(B(t))])}let Ra=e=>e?mo(e)?ko(e):Ra(e.parent):null,za=S(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ra(e.parent),$root:e=>Ra(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Fa(e),$forceUpdate:e=>e.f||(e.f=()=>{an(e.update)}),$nextTick:e=>e.n||(e.n=nn.bind(e.proxy)),$watch:e=>yn.bind(e)}),Oa=(e,t)=>e!==v&&!e.__isScriptSetup&&P(e,t),Ia={get({_:e},t){let n,a;if("__v_skip"===t)return!0;let{ctx:i,setupState:o,data:r,props:s,accessCache:l,type:u,appContext:c}=e;if("$"!==t[0]){let e=l[t];if(void 0!==e)switch(e){case 1:return o[t];case 2:return r[t];case 4:return i[t];case 3:return s[t]}else{if(Oa(o,t))return l[t]=1,o[t];if(r!==v&&P(r,t))return l[t]=2,r[t];if(P(s,t))return l[t]=3,s[t];if(i!==v&&P(i,t))return l[t]=4,i[t];ja&&(l[t]=0)}}let d=za[t];return d?("$attrs"===t&&qe(e.attrs,0,""),d(e)):(n=u.__cssModules)&&(n=n[t])?n:i!==v&&P(i,t)?(l[t]=4,i[t]):P(a=c.config.globalProperties,t)?a[t]:void 0},set({_:e},t,n){let{data:a,setupState:i,ctx:o}=e;return Oa(i,t)?(i[t]=n,!0):a!==v&&P(a,t)?(a[t]=n,!0):!(P(e.props,t)||"$"===t[0]&&t.slice(1)in e||(o[t]=n,0))},has({_:{data:e,setupState:t,accessCache:n,ctx:a,appContext:i,props:o,type:r}},s){let l;return!!(n[s]||e!==v&&"$"!==s[0]&&P(e,s)||Oa(t,s)||P(o,s)||P(a,s)||P(za,s)||P(i.config.globalProperties,s)||(l=r.__cssModules)&&l[s])},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:P(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},Na=S({},Ia,{get(e,t){if(t!==Symbol.unscopables)return Ia.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!Z(t)});function Da(e){let t=ho();return t.setupContext||(t.setupContext=wo(t))}function qa(e){return E(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}let ja=!0;function Ba(e,t,n){Gt(E(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function Fa(e){let t,n=e.type,{mixins:a,extends:i}=n,{mixins:o,optionsCache:r,config:{optionMergeStrategies:s}}=e.appContext,l=r.get(n);return l?t=l:o.length||a||i?(t={},o.length&&o.forEach(e=>$a(t,e,s,!0)),$a(t,n,s)):t=n,R(n)&&r.set(n,t),t}function $a(e,t,n,a=!1){let{mixins:i,extends:o}=t;for(let r in o&&$a(e,o,n,!0),i&&i.forEach(t=>$a(e,t,n,!0)),t)if(a&&"expose"===r);else{let a=Va[r]||n&&n[r];e[r]=a?a(e[r],t[r]):t[r]}return e}let Va={data:Ua,props:Ka,emits:Ka,methods:Ga,computed:Ga,beforeCreate:Wa,created:Wa,beforeMount:Wa,mounted:Wa,beforeUpdate:Wa,updated:Wa,beforeDestroy:Wa,beforeUnmount:Wa,destroyed:Wa,unmounted:Wa,activated:Wa,deactivated:Wa,errorCaptured:Wa,serverPrefetch:Wa,components:Ga,directives:Ga,watch:function(e,t){if(!e)return t;if(!t)return e;let n=S(Object.create(null),e);for(let a in t)n[a]=Wa(e[a],t[a]);return n},provide:Ua,inject:function(e,t){return Ga(Ha(e),Ha(t))}};function Ua(e,t){return t?e?function(){return S(A(e)?e.call(this,this):e,A(t)?t.call(this,this):t)}:t:e}function Ha(e){if(E(e)){let t={};for(let n=0;n"modelValue"===t||"model-value"===t?e.modelModifiers:e[`${t}Modifiers`]||e[`${B(t)}Modifiers`]||e[`${$(t)}Modifiers`];function Xa(e,t,...n){let a;if(e.isUnmounted)return;let i=e.vnode.props||v,o=n,r=t.startsWith("update:"),s=r&&Ja(i,t.slice(7));s&&(s.trim&&(o=n.map(e=>L(e)?e.trim():e)),s.number&&(o=n.map(K)));let l=i[a=U(t)]||i[a=U(B(t))];!l&&r&&(l=i[a=U($(t))]),l&&Gt(l,e,6,o);let u=i[a+"Once"];if(u){if(e.emitted){if(e.emitted[a])return}else e.emitted={};e.emitted[a]=!0,Gt(u,e,6,o)}}let ei=new WeakMap;function ti(e,t){return!!e&&!!k(t)&&(P(e,(t=t.slice(2).replace(/Once$/,""))[0].toLowerCase()+t.slice(1))||P(e,$(t))||P(e,t))}function ni(e){let t,n,{type:a,vnode:i,proxy:o,withProxy:r,propsOptions:[s],slots:l,attrs:u,emit:c,render:d,renderCache:h,props:p,data:f,setupState:m,ctx:_,inheritAttrs:g}=e,v=hn(e);try{if(4&i.shapeFlag){let e=r||o;t=ao(d.call(e,e,h,p,m,f,_)),n=u}else t=ao(a.length>1?a(p,{attrs:u,slots:l,emit:c}):a(p,null)),n=a.props?u:ai(u)}catch(n){ji.length=0,Kt(n,e,1),t=Ji(Di)}let b=t;if(n&&!1!==g){let e=Object.keys(n),{shapeFlag:t}=b;e.length&&7&t&&(s&&e.some(x)&&(n=ii(n,s)),b=eo(b,n,!1,!0))}return i.dirs&&((b=eo(b,null,!1,!0)).dirs=b.dirs?b.dirs.concat(i.dirs):i.dirs),i.transition&&Vn(b,i.transition),t=b,hn(v),t}let ai=e=>{let t;for(let n in e)("class"===n||"style"===n||k(n))&&((t||(t={}))[n]=e[n]);return t},ii=(e,t)=>{let n={};for(let a in e)x(a)&&a.slice(9)in t||(n[a]=e[a]);return n};function oi(e,t,n){let a=Object.keys(t);if(a.length!==Object.keys(e).length)return!0;for(let i=0;iObject.getPrototypeOf(e)===li;function ci(e,t,n,a){let i,[o,r]=e.propsOptions,s=!1;if(t)for(let l in t){let u;if(N(l))continue;let c=t[l];o&&P(o,u=B(l))?r&&r.includes(u)?(i||(i={}))[u]=c:n[u]=c:ti(e.emitsOptions,l)||l in a&&c===a[l]||(a[l]=c,s=!0)}if(r){let t=Ct(n),a=i||v;for(let i=0;i"_"===e||"_ctx"===e||"$stable"===e,mi=e=>E(e)?e.map(ao):[ao(e)],_i=(e,t,n)=>{if(t._n)return t;let a=pn((...e)=>mi(t(...e)),n);return a._c=!1,a},gi=(e,t,n)=>{let a=e._ctx;for(let n in e){if(fi(n))continue;let i=e[n];if(A(i))t[n]=_i(0,i,a);else if(null!=i){let e=mi(i);t[n]=()=>e}}},vi=(e,t)=>{let n=mi(t);e.slots.default=()=>n},bi=(e,t,n)=>{for(let a in t)(n||!fi(a))&&(e[a]=t[a])},yi=zi;function wi(e){return ki(e,ta)}function ki(e,t){var n;let a,i;Q().__VUE__=!0;let{insert:o,remove:r,patchProp:s,createElement:l,createText:u,createComment:d,setText:h,setElementText:p,parentNode:f,nextSibling:m,setScopeId:_=y,insertStaticContent:g}=e,w=(e,t,n,a=null,i=null,o=null,r,s=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!Ki(e,t)&&(a=oe(e),ee(e,i,o,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);let{type:u,ref:c,shapeFlag:d}=t;switch(u){case Ni:k(e,t,n,a);break;case Di:x(e,t,n,a);break;case qi:null==e&&C(t,n,a,r);break;case Ii:j(e,t,n,a,i,o,r,s,l);break;default:1&d?T(e,t,n,a,i,o,r,s,l):6&d?F(e,t,n,a,i,o,r,s,l):(64&d||128&d)&&u.process(e,t,n,a,i,o,r,s,l,le)}null!=c&&i?Yn(c,e&&e.ref,o,t||e,!t):null==c&&e&&null!=e.ref&&Yn(e.ref,null,o,e,!0)},k=(e,t,n,a)=>{if(null==e)o(t.el=u(t.children),n,a);else{let n=t.el=e.el;t.children!==e.children&&h(n,t.children)}},x=(e,t,n,a)=>{null==e?o(t.el=d(t.children||""),n,a):t.el=e.el},C=(e,t,n,a)=>{[e.el,e.anchor]=g(e.children,t,n,a,e.el,e.anchor)},T=(e,t,n,a,i,o,r,s,l)=>{if("svg"===t.type?r="svg":"math"===t.type&&(r="mathml"),null==e)L(t,n,a,i,o,r,s,l);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),I(e,t,i,o,r,s,l)}finally{n&&n._endPatch()}}},L=(e,t,n,a,i,r,u,c)=>{let d,h,{props:f,shapeFlag:m,transition:_,dirs:g}=e;if(d=e.el=l(e.type,r,f&&f.is,f),8&m?p(d,e.children):16&m&&O(e.children,d,null,a,i,xi(e,r),u,c),g&&fn(e,null,a,"created"),M(d,e,e.scopeId,u,a),f){for(let e in f)"value"===e||N(e)||s(d,e,null,f[e],r,a);"value"in f&&s(d,"value",null,f.value,r),(h=f.onVnodeBeforeMount)&&so(h,a,e)}g&&fn(e,null,a,"beforeMount");let v=Ci(i,_);v&&_.beforeEnter(d),o(d,t,n),((h=f&&f.onVnodeMounted)||v||g)&&yi(()=>{h&&so(h,a,e),v&&_.enter(d),g&&fn(e,null,a,"mounted")},i)},M=(e,t,n,a,i)=>{if(n&&_(e,n),a)for(let t=0;t{for(let u=l;u{let l,u=t.el=e.el,{patchFlag:c,dynamicChildren:d,dirs:h}=t;c|=16&e.patchFlag;let f=e.props||v,m=t.props||v;if(n&&Si(n,!1),(l=m.onVnodeBeforeUpdate)&&so(l,n,t,e),h&&fn(t,e,n,"beforeUpdate"),n&&Si(n,!0),(f.innerHTML&&null==m.innerHTML||f.textContent&&null==m.textContent)&&p(u,""),d?D(e.dynamicChildren,d,u,n,a,xi(t,i),o):r||Y(e,t,u,null,n,a,xi(t,i),o,!1),c>0){if(16&c)q(u,f,m,n,i);else if(2&c&&f.class!==m.class&&s(u,"class",null,m.class,i),4&c&&s(u,"style",f.style,m.style,i),8&c){let e=t.dynamicProps;for(let t=0;t{l&&so(l,n,t,e),h&&fn(t,e,n,"updated")},a)},D=(e,t,n,a,i,o,r)=>{for(let s=0;s{if(t!==n){if(t!==v)for(let o in t)N(o)||o in n||s(e,o,t[o],null,i,a);for(let o in n){if(N(o))continue;let r=n[o],l=t[o];r!==l&&"value"!==o&&s(e,o,l,r,i,a)}"value"in n&&s(e,"value",t.value,n.value,i)}},j=(e,t,n,a,i,r,s,l,c)=>{let d=t.el=e?e.el:u(""),h=t.anchor=e?e.anchor:u(""),{patchFlag:p,dynamicChildren:f,slotScopeIds:m}=t;m&&(l=l?l.concat(m):m),null==e?(o(d,n,a),o(h,n,a),O(t.children||[],n,h,i,r,s,l,c)):p>0&&64&p&&f&&e.dynamicChildren&&e.dynamicChildren.length===f.length?(D(e.dynamicChildren,f,n,i,r,s,l),(null!=t.key||i&&t===i.subTree)&&Ti(e,t,!0)):Y(e,t,n,h,i,r,s,l,c)},F=(e,t,n,a,i,o,r,s,l)=>{t.slotScopeIds=s,null==e?512&t.shapeFlag?i.ctx.activate(t,n,a,r,l):V(t,n,a,i,o,r,l):U(e,t,l)},V=(e,t,n,a,i,o,r)=>{var s,l,u;let d,h,p,f=(l=a,u=i,d=(s=e).type,h=(l?l.appContext:s.appContext)||lo,(p={uid:uo++,vnode:s,type:d,parent:l,appContext:h,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new me(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:l?l.provides:Object.create(h.provides),ids:l?l.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:function e(t,n,a=!1){let i=a?hi:n.propsCache,o=i.get(t);if(o)return o;let r=t.props,s={},l=[],u=!1;if(!A(t)){let i=t=>{u=!0;let[a,i]=e(t,n,!0);S(s,a),i&&l.push(...i)};!a&&n.mixins.length&&n.mixins.forEach(i),t.extends&&i(t.extends),t.mixins&&t.mixins.forEach(i)}if(!r&&!u)return R(t)&&i.set(t,b),b;if(E(r))for(let e=0;e{let a=e(t,n,!0);a&&(l=!0,S(s,a))};!a&&n.mixins.length&&n.mixins.forEach(i),t.extends&&i(t.extends),t.mixins&&t.mixins.forEach(i)}return r||l?(E(r)?r.forEach(e=>s[e]=null):S(s,r),R(t)&&i.set(t,s),s):(R(t)&&i.set(t,null),null)}(d,h),emit:null,emitted:null,propsDefaults:v,inheritAttrs:d.inheritAttrs,ctx:v,data:v,props:v,attrs:v,slots:v,refs:v,setupState:v,setupContext:null,suspense:u,suspenseId:u?u.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null}).ctx={_:p},p.root=l?l.root:p,p.emit=Xa.bind(null,p),s.ce&&s.ce(p),e.component=p);if(ua(e)&&(f.ctx.renderer=le),function(e,t=!1,n=!1){t&&c(t);let{props:a,children:i}=e.vnode,o=mo(e);!function(e,t,n,a=!1){let i={},o=Object.create(li);for(let n in e.propsDefaults=Object.create(null),ci(e,t,i,o),e.propsOptions[0])n in i||(i[n]=void 0);n?e.props=a?i:vt(i):e.type.props?e.props=i:e.props=o,e.attrs=o}(e,a,o,t);var r=n||t;let s=e.slots=Object.create(li);if(32&e.vnode.shapeFlag){let e=i._;e?(bi(s,i,r),r&&G(s,"_",e,!0)):gi(i,s)}else i&&vi(e,i);o&&function(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ia);let{setup:a}=n;if(a){Ee();let n=e.setupContext=a.length>1?wo(e):null,i=po(e),o=Wt(a,e,0,[e.props,n]),r=z(o);if(Ae(),i(),(r||e.sp)&&!sa(e)&&Wn(e),r){if(o.then(fo,fo),t)return o.then(n=>{go(e,n,t)}).catch(t=>{Kt(t,e,0)});e.asyncDep=o}else go(e,o,t)}else bo(e,t)}(e,t),t&&c(!1)}(f,!1,r),f.asyncDep){if(i&&i.registerDep(f,H,r),!e.el){let a=f.subTree=Ji(Di);x(null,a,t,n),e.placeholder=a.el}}else H(f,e,t,n,i,o,r)},U=(e,t,n)=>{let a=t.component=e.component;if(function(e,t,n){let{props:a,children:i,component:o}=e,{props:r,children:s,patchFlag:l}=t,u=o.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return(!!i||!!s)&&(!s||!s.$stable)||a!==r&&(a?!r||oi(a,r,u):!!r);if(1024&l)return!0;if(16&l)return a?oi(a,r,u):!!r;if(8&l){let e=t.dynamicProps;for(let t=0;t{e.scope.on();let l=e.effect=new ge(()=>{if(e.isMounted){let t,{next:n,bu:a,u:i,parent:l,vnode:c}=e;{let t=function e(t){let n=t.subTree.component;if(n)return n.asyncDep&&!n.asyncResolved?n:e(n)}(e);if(t)return n&&(n.el=c.el,K(e,n,s)),void t.asyncDep.then(()=>{yi(()=>{e.isUnmounted||u()},o)})}let d=n;Si(e,!1),n?(n.el=c.el,K(e,n,s)):n=c,a&&W(a),(t=n.props&&n.props.onVnodeBeforeUpdate)&&so(t,l,n,c),Si(e,!0);let h=ni(e),p=e.subTree;e.subTree=h,w(p,h,f(p.el),oe(p),e,o,r),n.el=h.el,null===d&&si(e,h.el),i&&yi(i,o),(t=n.props&&n.props.onVnodeUpdated)&&yi(()=>so(t,l,n,c),o)}else{let s,{el:l,props:u}=t,{bm:c,m:d,parent:h,root:p,type:f}=e,m=sa(t);if(Si(e,!1),c&&W(c),!m&&(s=u&&u.onVnodeBeforeMount)&&so(s,h,t),Si(e,!0),l&&i){let t=()=>{e.subTree=ni(e),i(l,e.subTree,e,o,null)};m&&f.__asyncHydrate?f.__asyncHydrate(l,e,t):t()}else{p.ce&&p.ce._hasShadowRoot()&&p.ce._injectChildStyle(f,e.parent?e.parent.type:void 0);let i=e.subTree=ni(e);w(null,i,n,a,e,o,r),t.el=i.el}if(d&&yi(d,o),!m&&(s=u&&u.onVnodeMounted)){let e=t;yi(()=>so(s,h,e),o)}(256&t.shapeFlag||h&&sa(h.vnode)&&256&h.vnode.shapeFlag)&&e.a&&yi(e.a,o),e.isMounted=!0,t=n=a=null}});e.scope.off();let u=e.update=l.run.bind(l),c=e.job=l.runIfDirty.bind(l);c.i=e,c.id=e.uid,l.scheduler=()=>an(c),Si(e,!0),u()},K=(e,t,n)=>{t.component=e;let a=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,a){let{props:i,attrs:o,vnode:{patchFlag:r}}=e,s=Ct(i),[l]=e.propsOptions,u=!1;if(!(a||r>0)||16&r){let a;for(let r in ci(e,t,i,o)&&(u=!0),s)t&&(P(t,r)||(a=$(r))!==r&&P(t,a))||(l?n&&(void 0!==n[r]||void 0!==n[a])&&(i[r]=di(l,s,r,void 0,e,!0)):delete i[r]);if(o!==s)for(let e in o)t&&P(t,e)||(delete o[e],u=!0)}else if(8&r){let n=e.vnode.dynamicProps;for(let a=0;a{let{vnode:a,slots:i}=e,o=!0,r=v;if(32&a.shapeFlag){let e=t._;e?n&&1===e?o=!1:bi(i,t,n):(o=!t.$stable,gi(t,i)),r=t}else t&&(vi(e,t),r={default:1});if(o)for(let e in i)fi(e)||null!=r[e]||delete i[e]})(e,t.children,n),Ee(),sn(e),Ae()},Y=(e,t,n,a,i,o,r,s,l=!1)=>{let u=e&&e.children,c=e?e.shapeFlag:0,d=t.children,{patchFlag:h,shapeFlag:f}=t;if(h>0){if(128&h)return void J(u,d,n,a,i,o,r,s,l);if(256&h)return void Z(u,d,n,a,i,o,r,s,l)}8&f?(16&c&&ie(u,i,o),d!==u&&p(n,d)):16&c?16&f?J(u,d,n,a,i,o,r,s,l):ie(u,i,o,!0):(8&c&&p(n,""),16&f&&O(d,n,a,i,o,r,s,l))},Z=(e,t,n,a,i,o,r,s,l)=>{let u;t=t||b;let c=(e=e||b).length,d=t.length,h=Math.min(c,d);for(u=0;ud?ie(e,i,o,!0,!1,h):O(t,n,a,i,o,r,s,l,h)},J=(e,t,n,a,i,o,r,s,l)=>{let u=0,c=t.length,d=e.length-1,h=c-1;for(;u<=d&&u<=h;){let a=e[u],c=t[u]=l?io(t[u]):ao(t[u]);if(!Ki(a,c))break;w(a,c,n,null,i,o,r,s,l),u++}for(;u<=d&&u<=h;){let a=e[d],u=t[h]=l?io(t[h]):ao(t[h]);if(!Ki(a,u))break;w(a,u,n,null,i,o,r,s,l),d--,h--}if(u>d){if(u<=h){let e=h+1,d=eh)for(;u<=d;)ee(e[u],i,o,!0),u++;else{let p,f=u,m=u,_=new Map;for(u=m;u<=h;u++){let e=t[u]=l?io(t[u]):ao(t[u]);null!=e.key&&_.set(e.key,u)}let g=0,v=h-m+1,y=!1,k=0,x=Array(v);for(u=0;u=v)ee(c,i,o,!0);else{if(null!=c.key)a=_.get(c.key);else for(p=m;p<=h;p++)if(0===x[p-m]&&Ki(c,t[p])){a=p;break}void 0===a?ee(c,i,o,!0):(x[a-m]=u+1,a>=k?k=a:y=!0,w(c,t[a],n,null,i,o,r,s,l),g++)}}let S=y?function(e){let t,n,a,i,o,r=e.slice(),s=[0],l=e.length;for(t=0;t>1]]0&&(r[t]=s[a-1]),s[a]=t)}}for(a=s.length,i=s[a-1];a-- >0;)s[a]=i,i=r[i];return s}(x):b;for(p=S.length-1,u=v-1;u>=0;u--){let e=m+u,d=t[e],h=t[e+1],f=e+1{let{el:s,type:l,transition:u,children:c,shapeFlag:d}=e;if(6&d)X(e.component.subTree,t,n,a);else if(128&d)e.suspense.move(t,n,a);else if(64&d)l.move(e,t,n,le);else if(l!==Ii)if(l!==qi)if(2!==a&&1&d&&u)if(0===a)u.beforeEnter(s),o(s,t,n),yi(()=>u.enter(s),i);else{let{leave:a,delayLeave:i,afterLeave:l}=u,c=()=>{e.ctx.isUnmounted?r(s):o(s,t,n)},d=()=>{s._isLeaving&&s[Mn](!0),a(s,()=>{c(),l&&l()})};i?i(s,c,d):d()}else o(s,t,n);else(({el:e,anchor:t},n,a)=>{let i;for(;e&&e!==t;)i=m(e),o(e,n,a),e=i;o(t,n,a)})(e,t,n);else{o(s,t,n);for(let e=0;e{let o,{type:r,props:s,ref:l,children:u,dynamicChildren:c,shapeFlag:d,patchFlag:h,dirs:p,cacheIndex:f,memo:m}=e;if(-2===h&&(i=!1),null!=l&&(Ee(),Yn(l,null,n,e,!0),Ae()),null!=f&&(t.renderCache[f]=void 0),256&d)return void t.ctx.deactivate(e);let _=1&d&&p,g=!sa(e);if(g&&(o=s&&s.onVnodeBeforeUnmount)&&so(o,t,e),6&d)ae(e.component,n,a);else{if(128&d)return void e.suspense.unmount(n,a);_&&fn(e,null,t,"beforeUnmount"),64&d?e.type.remove(e,t,n,le,a):c&&!c.hasOnce&&(r!==Ii||h>0&&64&h)?ie(c,t,n,!1,!0):(r===Ii&&384&h||!i&&16&d)&&ie(u,t,n),a&&te(e)}let v=null!=m&&null==f;(g&&(o=s&&s.onVnodeUnmounted)||_||v)&&yi(()=>{o&&so(o,t,e),_&&fn(e,null,t,"unmounted"),v&&(e.el=null)},n)},te=e=>{let{type:t,el:n,anchor:a,transition:i}=e;if(t===Ii)return void ne(n,a);if(t===qi)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=m(e),r(e),e=n;r(t)})(e);let o=()=>{r(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){let{leave:t,delayLeave:a}=i,r=()=>t(n,o);a?a(e.el,o,r):r()}else o()},ne=(e,t)=>{let n;for(;e!==t;)n=m(e),r(e),e=n;r(t)},ae=(e,t,n)=>{let{bum:a,scope:i,job:o,subTree:r,um:s,m:l,a:u}=e;Pi(l),Pi(u),a&&W(a),i.stop(),o&&(o.flags|=8,ee(r,e,t,n)),s&&yi(s,t),yi(()=>{e.isUnmounted=!0},t)},ie=(e,t,n,a=!1,i=!1,o=0)=>{for(let r=o;r{if(6&e.shapeFlag)return oe(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();let t=m(e.anchor||e.el),n=t&&t[xn];return n?m(n):t},re=!1,se=(e,t,n)=>{let a;null==e?t._vnode&&(ee(t._vnode,null,null,!0),a=t._vnode.component):w(t._vnode||null,e,t,null,null,null,n),t._vnode=e,re||(re=!0,sn(a),ln(),re=!1)},le={p:w,um:ee,m:X,r:te,mt:V,mc:O,pc:Y,pbc:D,n:oe,o:e};return t&&([a,i]=t(le)),{render:se,hydrate:a,createApp:(n=a,function(e,t=null){A(e)||(e=S({},e)),null==t||R(t)||(t=null);let a=Ya(),i=new WeakSet,o=[],r=!1,s=a.app={_uid:Qa++,_component:e,_props:t,_container:null,_context:a,_instance:null,version:Po,get config(){return a.config},set config(e){},use:(e,...t)=>(i.has(e)||(e&&A(e.install)?(i.add(e),e.install(s,...t)):A(e)&&(i.add(e),e(s,...t))),s),mixin:e=>(a.mixins.includes(e)||a.mixins.push(e),s),component:(e,t)=>t?(a.components[e]=t,s):a.components[e],directive:(e,t)=>t?(a.directives[e]=t,s):a.directives[e],mount(i,o,l){if(!r){let u=s._ceVNode||Ji(e,t);return u.appContext=a,!0===l?l="svg":!1===l&&(l=void 0),o&&n?n(u,i):se(u,i,l),r=!0,s._container=i,i.__vue_app__=s,ko(u.component)}},onUnmount(e){o.push(e)},unmount(){r&&(Gt(o,s._instance,16),se(null,s._container),delete s._container.__vue_app__)},provide:(e,t)=>(a.provides[e]=t,s),runWithContext(e){let t=Za;Za=s;try{return e()}finally{Za=t}}};return s})}}function xi({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Si({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Ci(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ti(e,t,n=!1){let a=e.children,i=t.children;if(E(a)&&E(i))for(let e=0;ee.__isSuspense,Ai=0;function Li(e,t){let n=e.props&&e.props[t];A(n)&&n()}function Mi(e,t,n,a,i,o,r,s,l,u,c=!1){var d;let h,p,{p:f,m:m,um:_,n:g,o:{parentNode:v,remove:b}}=u,y=null!=(h=(d=e).props&&d.props.suspensible)&&!1!==h;y&&t&&t.pendingBranch&&(p=t.pendingId,t.deps++);let w=e.props?Y(e.props.timeout):void 0,k=o,x={vnode:e,parent:t,parentComponent:n,namespace:r,container:a,hiddenContainer:i,deps:0,pendingId:Ai++,timeout:"number"==typeof w?w:-1,activeBranch:null,isFallbackMountPending:!1,pendingBranch:null,isInFallback:!c,isHydrating:c,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){let{vnode:a,activeBranch:i,pendingBranch:r,pendingId:s,effects:l,parentComponent:u,container:c,isInFallback:d}=x,h=!1;if(x.isHydrating)x.isHydrating=!1;else if(!e){h=i&&r.transition&&"out-in"===r.transition.mode;let e=!1;h&&(i.transition.afterLeave=()=>{s===x.pendingId&&(m(r,c,o!==k||e?o:g(i),0),rn(l),d&&a.ssFallback&&(a.ssFallback.el=null))}),i&&!x.isFallbackMountPending&&(v(i.el)===c&&(o=g(i),e=!0),_(i,u,x,!0),!h&&d&&a.ssFallback&&yi(()=>a.ssFallback.el=null,x)),h||m(r,c,o,0)}x.isFallbackMountPending=!1,Oi(x,r),x.pendingBranch=null,x.isInFallback=!1;let f=x.parent,b=!1;for(;f;){if(f.pendingBranch){f.effects.push(...l),b=!0;break}f=f.parent}b||h||rn(l),x.effects=[],y&&t&&t.pendingBranch&&p===t.pendingId&&(t.deps--,0!==t.deps||n||t.resolve()),Li(a,"onResolve")},fallback(e){if(!x.pendingBranch)return;let{vnode:t,activeBranch:n,parentComponent:a,container:i,namespace:o}=x;Li(t,"onFallback");let r=g(n),u=()=>{x.isFallbackMountPending=!1,x.isInFallback&&(f(null,e,i,r,a,null,o,s,l),Oi(x,e))},c=e.transition&&"out-in"===e.transition.mode;c&&(x.isFallbackMountPending=!0,n.transition.afterLeave=u),x.isInFallback=!0,_(n,a,null,!0),c||u()},move(e,t,n){x.activeBranch&&m(x.activeBranch,e,t,n),x.container=e},next:()=>x.activeBranch&&g(x.activeBranch),registerDep(e,t,n){let a=!!x.pendingBranch;a&&x.deps++;let i=e.vnode.el;e.asyncDep.catch(t=>{Kt(t,e,0)}).then(o=>{if(e.isUnmounted||x.isUnmounted||x.pendingId!==e.suspenseId)return;fo(),e.asyncResolved=!0;let{vnode:s}=e;go(e,o,!1),i&&(s.el=i);let l=!i&&e.subTree.el;t(e,s,v(i||e.subTree.el),i?null:g(e.subTree),x,r,n),l&&(s.placeholder=null,b(l)),si(e,s.el),a&&0==--x.deps&&x.resolve()})},unmount(e,t){x.isUnmounted=!0,x.activeBranch&&_(x.activeBranch,n,e,t),x.pendingBranch&&_(x.pendingBranch,n,e,t)}};return x}function Ri(e){let t;if(A(e)){let n=Vi&&e._c;n&&(e._d=!1,Fi()),e=e(),n&&(e._d=!0,t=Bi,$i())}return E(e)&&(e=function(e){let t;for(let n=0;nt!==e)),e}function zi(e,t){t&&t.pendingBranch?E(e)?t.effects.push(...e):t.effects.push(e):rn(e)}function Oi(e,t){e.activeBranch=t;let{vnode:n,parentComponent:a}=e,i=t.el;for(;!i&&t.component;)i=(t=t.component.subTree).el;n.el=i,a&&a.subTree===n&&(a.vnode.el=i,si(a,i))}let Ii=Symbol.for("v-fgt"),Ni=Symbol.for("v-txt"),Di=Symbol.for("v-cmt"),qi=Symbol.for("v-stc"),ji=[],Bi=null;function Fi(e=!1){ji.push(Bi=e?null:[])}function $i(){ji.pop(),Bi=ji[ji.length-1]||null}let Vi=1;function Ui(e,t=!1){Vi+=e,e<0&&Bi&&t&&(Bi.hasOnce=!0)}function Hi(e){return e.dynamicChildren=Vi>0?Bi||b:null,$i(),Vi>0&&Bi&&Bi.push(e),e}function Wi(e,t,n,a,i){return Hi(Ji(e,t,n,a,i,!0))}function Gi(e){return!!e&&!0===e.__v_isVNode}function Ki(e,t){return e.type===t.type&&e.key===t.key}let Yi=({key:e})=>null!=e?e:null,Qi=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?L(e)||At(e)||A(e)?{i:cn,r:e,k:t,f:!!n}:e:null);function Zi(e,t=null,n=null,a=0,i=null,o=+(e!==Ii),r=!1,s=!1){let l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Yi(t),ref:t&&Qi(t),scopeId:dn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:a,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:cn};return s?(oo(l,n),128&o&&e.normalize(l)):n&&(l.shapeFlag|=L(n)?8:16),Vi>0&&!r&&Bi&&(l.patchFlag>0||6&o)&&32!==l.patchFlag&&Bi.push(l),l}let Ji=function(e,t=null,n=null,a=0,i=null,o=!1){var r;if(e&&e!==Aa||(e=Di),Gi(e)){let a=eo(e,t,!0);return n&&oo(a,n),Vi>0&&!o&&Bi&&(6&a.shapeFlag?Bi[Bi.indexOf(e)]=a:Bi.push(a)),a.patchFlag=-2,a}if(A(r=e)&&"__vccOpts"in r&&(e=e.__vccOpts),t){let{class:e,style:n}=t=Xi(t);e&&!L(e)&&(t.class=ae(e)),R(n)&&(St(n)&&!E(n)&&(n=S({},n)),t.style=J(n))}return Zi(e,t,n,a,i,L(e)?1:Ei(e)?128:e.__isTeleport?64:R(e)?4:2*!!A(e),o,!0)};function Xi(e){return e?St(e)||ui(e)?S({},e):e:null}function eo(e,t,n=!1,a=!1){let{props:i,ref:o,patchFlag:r,children:s,transition:l}=e,u=t?ro(i||{},t):i,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Yi(u),ref:t&&t.ref?n&&o?E(o)?o.concat(Qi(t)):[o,Qi(t)]:Qi(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ii?-1===r?16:16|r:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&eo(e.ssContent),ssFallback:e.ssFallback&&eo(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&a&&Vn(c,l.clone(c)),c}function to(e=" ",t=0){return Ji(Ni,null,e,t)}function no(e="",t=!1){return t?(Fi(),Wi(Di,null,e)):Ji(Di,null,e)}function ao(e){return null==e||"boolean"==typeof e?Ji(Di):E(e)?Ji(Ii,null,e.slice()):Gi(e)?io(e):Ji(Ni,null,String(e))}function io(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:eo(e)}function oo(e,t){let n=0,{shapeFlag:a}=e;if(null==t)t=null;else if(E(t))n=16;else if("object"==typeof t){if(65&a){let n=t.default;return void(n&&(n._c&&(n._d=!1),oo(e,n()),n._c&&(n._d=!0)))}{n=32;let a=t._;a||ui(t)?3===a&&cn&&(1===cn.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=cn}}else A(t)?(t={default:t,_ctx:cn},n=32):(t=String(t),64&a?(n=16,t=[to(t)]):n=8);e.children=t,e.shapeFlag|=n}function ro(...e){let t={};for(let n=0;nco||cn;u=e=>{co=e},c=e=>{_o=e};let po=e=>{let t=co;return u(e),e.scope.on(),()=>{e.scope.off(),u(t)}},fo=()=>{co&&co.scope.off(),u(null)};function mo(e){return 4&e.vnode.shapeFlag}let _o=!1;function go(e,t,n){A(t)?e.render=t:R(t)&&(e.setupState=Nt(t)),bo(e,n)}function vo(e){d=e,h=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,Na))}}function bo(e,t,n){let a=e.type;if(!e.render){if(!t&&d&&!a.render){let t=a.template||Fa(e).template;if(t){let{isCustomElement:n,compilerOptions:i}=e.appContext.config,{delimiters:o,compilerOptions:r}=a,s=S(S({isCustomElement:n,delimiters:o},i),r);a.render=d(t,s)}}e.render=a.render||y,h&&h(e)}{let t=po(e);Ee();try{!function(e){let t=Fa(e),n=e.proxy,a=e.ctx;ja=!1,t.beforeCreate&&Ba(t.beforeCreate,e,"bc");let{data:i,computed:o,methods:r,watch:s,provide:l,inject:u,created:c,beforeMount:d,mounted:h,beforeUpdate:p,updated:f,activated:m,deactivated:_,beforeUnmount:g,unmounted:v,render:b,renderTracked:w,renderTriggered:k,errorCaptured:x,serverPrefetch:S,expose:C,inheritAttrs:T,components:P,directives:M}=t;if(u&&function(e,t){for(let n in E(e)&&(e=Ha(e)),e){let a,i=e[n];At(a=R(i)?"default"in i?_n(i.from||n,i.default,!0):_n(i.from||n):_n(i))?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e}):t[n]=a}}(u,a),r)for(let e in r){let t=r[e];A(t)&&(a[e]=t.bind(n))}if(i){let t=i.call(n,n);R(t)&&(e.data=gt(t))}if(ja=!0,o)for(let e in o){let t=o[e],i=A(t)?t.bind(n,n):A(t.get)?t.get.bind(n,n):y,r=So({get:i,set:!A(t)&&A(t.set)?t.set.bind(n):y});Object.defineProperty(a,e,{enumerable:!0,configurable:!0,get:()=>r.value,set:e=>r.value=e})}if(s)for(let e in s)!function e(t,n,a,i){let o=i.includes(".")?wn(a,i):()=>a[i];if(L(t)){let e=n[t];A(e)&&bn(o,e,void 0)}else if(A(t))bn(o,t.bind(a),void 0);else if(R(t))if(E(t))t.forEach(t=>e(t,n,a,i));else{let e=A(t.handler)?t.handler.bind(a):n[t.handler];A(e)&&bn(o,e,t)}}(s[e],a,n,e);if(l){let e=A(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{mn(t,e[t])})}function z(e,t){E(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(c&&Ba(c,e,"c"),z(va,d),z(ba,h),z(ya,p),z(wa,f),z(da,m),z(ha,_),z(Pa,x),z(Ta,w),z(Ca,k),z(ka,g),z(xa,v),z(Sa,S),E(C))if(C.length){let t=e.exposed||(e.exposed={});C.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});b&&e.render===y&&(e.render=b),null!=T&&(e.inheritAttrs=T),P&&(e.components=P),M&&(e.directives=M)}(e)}finally{Ae(),t()}}}let yo={get:(e,t)=>(qe(e,0,""),e[t])};function wo(e){return{attrs:new Proxy(e.attrs,yo),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function ko(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Nt(Tt(e.exposed)),{get:(t,n)=>n in t?t[n]:n in za?za[n](e):void 0,has:(e,t)=>t in e||t in za})):e.proxy}function xo(e,t=!0){return A(e)?e.displayName||e.name:e.name||t&&e.__name}let So=(e,t)=>function(e,t=!1){let n,a;return A(e)?n=e:(n=e.get,a=e.set),new Ft(n,a,t)}(e,_o);function Co(e,t,n){try{Ui(-1);let a=arguments.length;return 2!==a?(a>3?n=Array.prototype.slice.call(arguments,2):3===a&&Gi(n)&&(n=[n]),Ji(e,t,n)):!R(t)||E(t)?Ji(e,null,t):Gi(t)?Ji(e,null,[t]):Ji(e,t)}finally{Ui(1)}}function To(e,t){let n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e0&&Bi&&Bi.push(e),!0}let Po="3.5.34",Eo="u">typeof window&&window.trustedTypes;if(Eo)try{_=Eo.createPolicy("vue",{createHTML:e=>e})}catch(e){}let Ao=_?e=>_.createHTML(e):e=>e,Lo="u">typeof document?document:null,Mo=Lo&&Lo.createElement("template"),Ro={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,a)=>{let i="svg"===t?Lo.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?Lo.createElementNS("http://www.w3.org/1998/Math/MathML",e):n?Lo.createElement(e,{is:n}):Lo.createElement(e);return"select"===e&&a&&null!=a.multiple&&i.setAttribute("multiple",a.multiple),i},createText:e=>Lo.createTextNode(e),createComment:e=>Lo.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Lo.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,a,i,o){let r=n?n.previousSibling:t.lastChild;if(i&&(i===o||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),i!==o&&(i=i.nextSibling););else{Mo.innerHTML=Ao("svg"===a?`${e}`:"mathml"===a?`${e}`:e);let i=Mo.content;if("svg"===a||"mathml"===a){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},zo="transition",Oo="animation",Io=Symbol("_vtc"),No={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Do=S({},In,No),qo=((t=(e,{slots:t})=>Co(qn,Fo(e),t)).displayName="Transition",t.props=Do,t),jo=(e,t=[])=>{E(e)?e.forEach(e=>e(...t)):e&&e(...t)},Bo=e=>!!e&&(E(e)?e.some(e=>e.length>1):e.length>1);function Fo(e){let t={};for(let n in e)n in No||(t[n]=e[n]);if(!1===e.css)return t;let{name:n="v",type:a,duration:i,enterFromClass:o=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:l=o,appearActiveClass:u=r,appearToClass:c=s,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,f=function(e){if(null==e)return null;{if(R(e))return[function(e){return Y(e)}(e.enter),function(e){return Y(e)}(e.leave)];let t=function(e){return Y(e)}(e);return[t,t]}}(i),m=f&&f[0],_=f&&f[1],{onBeforeEnter:g,onEnter:v,onEnterCancelled:b,onLeave:y,onLeaveCancelled:w,onBeforeAppear:k=g,onAppear:x=v,onAppearCancelled:C=b}=t,T=(e,t,n,a)=>{e._enterCancelled=a,Vo(e,t?c:s),Vo(e,t?u:r),n&&n()},P=(e,t)=>{e._isLeaving=!1,Vo(e,d),Vo(e,p),Vo(e,h),t&&t()},E=e=>(t,n)=>{let i=e?x:v,r=()=>T(t,e,n);jo(i,[t,r]),Uo(()=>{Vo(t,e?l:o),$o(t,e?c:s),Bo(i)||Wo(t,a,m,r)})};return S(t,{onBeforeEnter(e){jo(g,[e]),$o(e,o),$o(e,r)},onBeforeAppear(e){jo(k,[e]),$o(e,l),$o(e,u)},onEnter:E(!1),onAppear:E(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>P(e,t);$o(e,d),e._enterCancelled?($o(e,h),Qo(e)):(Qo(e),$o(e,h)),Uo(()=>{e._isLeaving&&(Vo(e,d),$o(e,p),Bo(y)||Wo(e,a,_,n))}),jo(y,[e,n])},onEnterCancelled(e){T(e,!1,void 0,!0),jo(b,[e])},onAppearCancelled(e){T(e,!0,void 0,!0),jo(C,[e])},onLeaveCancelled(e){P(e),jo(w,[e])}})}function $o(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[Io]||(e[Io]=new Set)).add(t)}function Vo(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[Io];n&&(n.delete(t),n.size||(e[Io]=void 0))}function Uo(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Ho=0;function Wo(e,t,n,a){let i=e._endId=++Ho,o=()=>{i===e._endId&&a()};if(null!=n)return setTimeout(o,n);let{type:r,timeout:s,propCount:l}=Go(e,t);if(!r)return a();let u=r+"end",c=0,d=()=>{e.removeEventListener(u,h),o()},h=t=>{t.target===e&&++c>=l&&d()};setTimeout(()=>{c(n[e]||"").split(", "),i=a(`${zo}Delay`),o=a(`${zo}Duration`),r=Ko(i,o),s=a(`${Oo}Delay`),l=a(`${Oo}Duration`),u=Ko(s,l),c=null,d=0,h=0;return t===zo?r>0&&(c=zo,d=r,h=o.length):t===Oo?u>0&&(c=Oo,d=u,h=l.length):h=(c=(d=Math.max(r,u))>0?r>u?zo:Oo:null)?c===zo?o.length:l.length:0,{type:c,timeout:d,propCount:h,hasTransform:c===zo&&/\b(?:transform|all)(?:,|$)/.test(a(`${zo}Property`).toString())}}function Ko(e,t){for(;e.lengthYo(t)+Yo(e[n])))}function Yo(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function Qo(e){return(e?e.ownerDocument:document).body.offsetHeight}let Zo=Symbol("_vod"),Jo=Symbol("_vsh");function Xo(e,t){e.style.display=t?e[Zo]:"none",e[Jo]=!t}let er=Symbol("");function tr(e,t){if(1===e.nodeType){let a=e.style,i="";for(let e in t){var n;let o=null==(n=t[e])?"initial":"string"==typeof n?""===n?" ":n:String(n);a.setProperty(`--${e}`,o),i+=`--${e}: ${o};`}a[er]=i}}let nr=/(?:^|;)\s*display\s*:/,ar=/\s*!important$/;function ir(e,t,n){if(E(n))n.forEach(n=>ir(e,t,n));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{let a=function(e,t){let n=rr[t];if(n)return n;let a=B(t);if("filter"!==a&&a in e)return rr[t]=a;a=V(a);for(let n=0;n111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&123>e.charCodeAt(2),_r=(e,t,n,a,i,o)=>{let r="svg"===i;if("class"===t){var s;let t;s=a,(t=e[Io])&&(s=(s?[s,...t]:[...t]).join(" ")),null==s?e.removeAttribute("class"):r?e.setAttribute("class",s):e.className=s}else"style"===t?function(e,t,n){let a=e.style,i=L(n),o=!1;if(n&&!i){if(t)if(L(t))for(let e of t.split(";")){let t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&ir(a,t,"")}else for(let e in t)null==n[e]&&ir(a,e,"");for(let i in n){var r,s,l,u;"display"===i&&(o=!0);let c=n[i];null!=c?(r=e,s=i,l=!L(t)&&t?t[i]:void 0,u=c,"TEXTAREA"===r.tagName&&("width"===s||"height"===s)&&L(u)&&l===u||ir(a,i,c)):ir(a,i,"")}}else if(i){if(t!==n){let e=a[er];e&&(n+=";"+e),a.cssText=n,o=nr.test(n)}}else t&&e.removeAttribute("style");Zo in e&&(e[Zo]=o?a.display:"",e[Jo]&&(a.display="none"))}(e,n,a):k(t)?x(t)||function(e,t,n,a=null){let i=e[dr]||(e[dr]={}),o=i[t];if(n&&o)o.value=n;else{let[s,l]=function(e){let t;if(hr.test(e)){let n;for(t={};n=e.match(hr);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):$(e.slice(2)),t]}(t);if(n){var r;let o;cr(e,s,i[t]=(r=a,(o=e=>{if(e._vts){if(e._vts<=o.attached)return}else e._vts=Date.now();Gt(function(e,t){if(!E(t))return t;{let n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(e=>t=>!t._stopped&&e&&e(t))}}(e,o.value),r,5,[e])}).value=n,o.attached=pr||(fr.then(()=>pr=0),pr=Date.now()),o),l)}else o&&(e.removeEventListener(s,o,l),i[t]=void 0)}}(e,t,a,o):("."===t[0]?(t=t.slice(1),0):"^"===t[0]?(t=t.slice(1),1):!function(e,t,n,a){if(a)return!!("innerHTML"===t||"textContent"===t||t in e&&mr(t)&&A(n));if("spellcheck"===t||"draggable"===t||"translate"===t||"autocorrect"===t||"sandbox"===t&&"IFRAME"===e.tagName||"form"===t||"list"===t&&"INPUT"===e.tagName||"type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){let t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return!(mr(t)&&L(n))&&t in e}(e,t,a,r))?e._isVueCE&&(function(e,t){let n=e._def.props;if(!n)return!1;let a=B(t);return Array.isArray(n)?n.some(e=>B(e)===a):Object.keys(n).some(e=>B(e)===a)}(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!L(a)))?ur(e,B(t),a,0,t):("true-value"===t?e._trueValue=a:"false-value"===t&&(e._falseValue=a),lr(e,t,a,r)):(ur(e,t,a),e.tagName.includes("-")||"value"!==t&&"checked"!==t&&"selected"!==t||lr(e,t,a,r,0,"value"!==t))},gr={};function vr(e,t,n){let a,i=Hn(e,t);"[object Object]"===(a=i,O.call(a))&&(i=S({},i,t));class o extends yr{constructor(e){super(i,e,n)}}return o.def=i,o}let br="u">typeof HTMLElement?HTMLElement:class{};class yr extends br{constructor(e,t={},n=Jr){super(),this._def=e,this._props=t,this._createApp=n,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._patching=!1,this._dirty=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._styleAnchors=new WeakMap,this._ob=null,this.shadowRoot&&n!==Jr?this._root=this.shadowRoot:!1!==e.shadowRoot?(this.attachShadow(S({},e.shadowRootOptions,{mode:"open"})),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._resolved||this._parseSlots(),this._connected=!0;let e=this;for(;e=e&&(e.assignedSlot||e.parentNode||e.host);)if(e instanceof yr){this._parent=e;break}this._instance||(this._resolved?this._mount(this._def):e&&e._pendingResolve?this._pendingResolve=e._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(e=this._parent){e&&(this._instance.parent=e._instance,this._inheritParentContext(e))}_inheritParentContext(e=this._parent){e&&this._app&&Object.setPrototypeOf(this._app._context.provides,e._instance.provides)}disconnectedCallback(){this._connected=!1,nn(()=>{!this._connected&&(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null,this._teleportTargets&&(this._teleportTargets.clear(),this._teleportTargets=void 0))})}_processMutations(e){for(let t of e)this._setAttr(t.attributeName)}_resolveDef(){if(this._pendingResolve)return;for(let e=0;e{let n;this._resolved=!0,this._pendingResolve=void 0;let{props:a,styles:i}=e;if(a&&!E(a))for(let e in a){let t=a[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=Y(this._props[e])),(n||(n=Object.create(null)))[B(e)]=!0)}this._numberProps=n,this._resolveProps(e),this.shadowRoot&&this._applyStyles(i),this._mount(e)},t=this._def.__asyncLoader;t?this._pendingResolve=t().then(t=>{t.configureApp=this._def.configureApp,e(this._def=t,!0)}):e(this._def)}_mount(e){this._app=this._createApp(e),this._inheritParentContext(),e.configureApp&&e.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);let t=this._instance&&this._instance.exposed;if(t)for(let e in t)P(this,e)||Object.defineProperty(this,e,{get:()=>Ot(t[e])})}_resolveProps(e){let{props:t}=e,n=E(t)?t:Object.keys(t||{});for(let e of Object.keys(this))"_"!==e[0]&&n.includes(e)&&this._setProp(e,this[e]);for(let e of n.map(B))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t,!0,!this._patching)}})}_setAttr(e){if(e.startsWith("data-v-"))return;let t=this.hasAttribute(e),n=t?this.getAttribute(e):gr,a=B(e);t&&this._numberProps&&this._numberProps[a]&&(n=Y(n)),this._setProp(a,n,!1,!0)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,a=!1){if(t!==this._props[e]&&(this._dirty=!0,t===gr?delete this._props[e]:(this._props[e]=t,"key"===e&&this._app&&(this._app._ceVNode.key=t)),a&&this._instance&&this._update(),n)){let n=this._ob;n&&(this._processMutations(n.takeRecords()),n.disconnect()),!0===t?this.setAttribute($(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute($(e),t+""):t||this.removeAttribute($(e)),n&&n.observe(this,{attributes:!0})}}_update(){let e=this._createVNode();this._app&&(e.appContext=this._app._context),Zr(e,this._root)}_createVNode(){let e={};this.shadowRoot||(e.onVnodeMounted=e.onVnodeUpdated=this._renderSlots.bind(this));let t=Ji(this._def,S(e,this._props));return this._instance||(t.ce=e=>{this._instance=e,e.ce=this,e.isCE=!0;let t=(e,t)=>{let n;this.dispatchEvent(new CustomEvent(e,"[object Object]"===(n=t[0],O.call(n))?S({detail:t},t[0]):{detail:t}))};e.emit=(e,...n)=>{t(e,n),$(e)!==e&&t($(e),n)},this._setParent()}),t}_applyStyles(e,t,n){if(!e)return;if(t){if(t===this._def||this._styleChildren.has(t))return;this._styleChildren.add(t)}let a=this._nonce,i=this.shadowRoot,o=n?this._getStyleAnchor(n)||this._getStyleAnchor(this._def):this._getRootStyleInsertionAnchor(i),r=null;for(let s=e.length-1;s>=0;s--){let l=document.createElement("style");a&&l.setAttribute("nonce",a),l.textContent=e[s],i.insertBefore(l,r||o),r=l,0===s&&(n||this._styleAnchors.set(this._def,l),t&&this._styleAnchors.set(t,l))}}_getStyleAnchor(e){if(!e)return null;let t=this._styleAnchors.get(e);return t&&t.parentNode===this.shadowRoot?t:(t&&this._styleAnchors.delete(e),null)}_getRootStyleInsertionAnchor(e){for(let t=0;t{if(!n.length)return;let t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){let a=e.cloneNode(),i=e[Io];i&&i.forEach(e=>{e.split(/\s+/).forEach(e=>e&&a.classList.remove(e))}),n.split(/\s+/).forEach(e=>e&&a.classList.add(e)),a.style.display="none";let o=1===t.nodeType?t:t.parentNode;o.appendChild(a);let{hasTransform:r}=Go(a);return o.removeChild(a),r}(n[0].el,i.vnode.el,t))return void(n=[]);n.forEach(Pr),n.forEach(Er);let a=n.filter(Ar);Qo(i.vnode.el),a.forEach(e=>{let n=e.el,a=n.style;$o(n,t),a.transform=a.webkitTransform=a.transitionDuration="";let i=n[Sr]=e=>{(!e||e.target===n)&&(!e||e.propertyName.endsWith("transform"))&&(n.removeEventListener("transitionend",i),n[Sr]=null,Vo(n,t))};n.addEventListener("transitionend",i)}),n=[]}),()=>{let r=Ct(e),s=Fo(r),l=r.tag||Ii;if(n=[],a)for(let e=0;eMath.abs(r-1)&&(r=1),.01>Math.abs(s-1)&&(s=1),n.transform=n.webkitTransform=`translate(${a/r}px,${i/s}px)`,n.transitionDuration="0s",e}}function Lr(e){let t=e.getBoundingClientRect();return{left:t.left,top:t.top}}let Mr=e=>{let t=e.props["onUpdate:modelValue"]||!1;return E(t)?e=>W(t,e):t};function Rr(e){e.target.composing=!0}function zr(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}let Or=Symbol("_assign");function Ir(e,t,n){return t&&(e=e.trim()),n&&(e=K(e)),e}let Nr={created(e,{modifiers:{lazy:t,trim:n,number:a}},i){e[Or]=Mr(i);let o=a||i.props&&"number"===i.props.type;cr(e,t?"change":"input",t=>{t.target.composing||e[Or](Ir(e.value,n,o))}),(n||o)&&cr(e,"change",()=>{e.value=Ir(e.value,n,o)}),t||(cr(e,"compositionstart",Rr),cr(e,"compositionend",zr),cr(e,"change",zr))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:a,trim:i,number:o}},r){if(e[Or]=Mr(r),e.composing)return;let s=null==t?"":t;if((!o&&"number"!==e.type||/^0\d/.test(e.value)?e.value:K(e.value))===s)return;let l=e.getRootNode();(l instanceof Document||l instanceof ShadowRoot)&&l.activeElement===e&&"range"!==e.type&&(a&&t===n||i&&e.value.trim()===s)||(e.value=s)}},Dr={deep:!0,created(e,t,n){e[Or]=Mr(n),cr(e,"change",()=>{let t=e._modelValue,n=$r(e),a=e.checked,i=e[Or];if(E(t)){let e=ce(t,n),o=-1!==e;if(a&&!o)i(t.concat(n));else if(!a&&o){let n=[...t];n.splice(e,1),i(n)}}else{let o;if("[object Set]"===(o=t,O.call(o))){let e=new Set(t);a?e.add(n):e.delete(n),i(e)}else i(Vr(e,a))}})},mounted:qr,beforeUpdate(e,t,n){e[Or]=Mr(n),qr(e,t,n)}};function qr(e,{value:t,oldValue:n},a){let i;if(e._modelValue=t,E(t))i=ce(t,a.props.value)>-1;else{let o;if("[object Set]"===(o=t,O.call(o)))i=t.has(a.props.value);else{if(t===n)return;i=ue(t,Vr(e,!0))}}e.checked!==i&&(e.checked=i)}let jr={created(e,{value:t},n){e.checked=ue(t,n.props.value),e[Or]=Mr(n),cr(e,"change",()=>{e[Or]($r(e))})},beforeUpdate(e,{value:t,oldValue:n},a){e[Or]=Mr(a),t!==n&&(e.checked=ue(t,a.props.value))}},Br={deep:!0,created(e,{value:t,modifiers:{number:n}},a){let i,o="[object Set]"===(i=t,O.call(i));cr(e,"change",()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?K($r(e)):$r(e));e[Or](e.multiple?o?new Set(t):t:t[0]),e._assigning=!0,nn(()=>{e._assigning=!1})}),e[Or]=Mr(a)},mounted(e,{value:t}){Fr(e,t)},beforeUpdate(e,t,n){e[Or]=Mr(n)},updated(e,{value:t}){e._assigning||Fr(e,t)}};function Fr(e,t){let n,a=e.multiple,i=E(t);if(!a||i||"[object Set]"===(n=t,O.call(n))){for(let n=0,o=e.options.length;nString(e)===String(r)):ce(t,r)>-1}else o.selected=t.has(r);else if(ue($r(o),t))return void(e.selectedIndex!==n&&(e.selectedIndex=n))}a||-1===e.selectedIndex||(e.selectedIndex=-1)}}function $r(e){return"_value"in e?e._value:e.value}function Vr(e,t){let n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}function Ur(e,t,n,a,i){let o=function(e,t){switch(e){case"SELECT":return Br;case"TEXTAREA":return Nr;default:switch(t){case"checkbox":return Dr;case"radio":return jr;default:return Nr}}}(e.tagName,n.props&&n.props.type)[i];o&&o(e,t,n,a)}let Hr=["ctrl","shift","alt","meta"],Wr={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>Hr.some(n=>e[`${n}Key`]&&!t.includes(n))},Gr={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Kr=S({patchProp:_r},Ro),Yr=!1;function Qr(){return p=Yr?p:wi(Kr),Yr=!0,p}let Zr=(...e)=>{(p||(p=ki(Kr))).render(...e)},Jr=(...e)=>{let t=(p||(p=ki(Kr))).createApp(...e),{mount:n}=t;return t.mount=e=>{let a=ts(e);if(!a)return;let i=t._component;A(i)||i.render||i.template||(i.template=a.innerHTML),1===a.nodeType&&(a.textContent="");let o=n(a,!1,es(a));return a instanceof Element&&(a.removeAttribute("v-cloak"),a.setAttribute("data-v-app","")),o},t},Xr=(...e)=>{let t=Qr().createApp(...e),{mount:n}=t;return t.mount=e=>{let t=ts(e);if(t)return n(t,!0,es(t))},t};function es(e){return e instanceof SVGElement?"svg":"function"==typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}function ts(e){return L(e)?document.querySelector(e):e}let ns=Symbol(""),as=Symbol(""),is=Symbol(""),os=Symbol(""),rs=Symbol(""),ss=Symbol(""),ls=Symbol(""),us=Symbol(""),cs=Symbol(""),ds=Symbol(""),hs=Symbol(""),ps=Symbol(""),fs=Symbol(""),ms=Symbol(""),_s=Symbol(""),gs=Symbol(""),vs=Symbol(""),bs=Symbol(""),ys=Symbol(""),ws=Symbol(""),ks=Symbol(""),xs=Symbol(""),Ss=Symbol(""),Cs=Symbol(""),Ts=Symbol(""),Ps=Symbol(""),Es=Symbol(""),As=Symbol(""),Ls=Symbol(""),Ms=Symbol(""),Rs=Symbol(""),zs=Symbol(""),Os=Symbol(""),Is=Symbol(""),Ns=Symbol(""),Ds=Symbol(""),qs=Symbol(""),js=Symbol(""),Bs=Symbol(""),Fs={[ns]:"Fragment",[as]:"Teleport",[is]:"Suspense",[os]:"KeepAlive",[rs]:"BaseTransition",[ss]:"openBlock",[ls]:"createBlock",[us]:"createElementBlock",[cs]:"createVNode",[ds]:"createElementVNode",[hs]:"createCommentVNode",[ps]:"createTextVNode",[fs]:"createStaticVNode",[ms]:"resolveComponent",[_s]:"resolveDynamicComponent",[gs]:"resolveDirective",[vs]:"resolveFilter",[bs]:"withDirectives",[ys]:"renderList",[ws]:"renderSlot",[ks]:"createSlots",[xs]:"toDisplayString",[Ss]:"mergeProps",[Cs]:"normalizeClass",[Ts]:"normalizeStyle",[Ps]:"normalizeProps",[Es]:"guardReactiveProps",[As]:"toHandlers",[Ls]:"camelize",[Ms]:"capitalize",[Rs]:"toHandlerKey",[zs]:"setBlockTracking",[Os]:"pushScopeId",[Is]:"popScopeId",[Ns]:"withCtx",[Ds]:"unref",[qs]:"isRef",[js]:"withMemo",[Bs]:"isMemoSame"},$s={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:""};function Vs(e,t,n,a,i,o,r,s=!1,l=!1,u=!1,c=$s){return e&&(s?(e.helper(ss),e.helper(e.inSSR||u?ls:us)):e.helper(e.inSSR||u?cs:ds),r&&e.helper(bs)),{type:13,tag:t,props:n,children:a,patchFlag:i,dynamicProps:o,directives:r,isBlock:s,disableTracking:l,isComponent:u,loc:c}}function Us(e,t=$s){return{type:17,loc:t,elements:e}}function Hs(e,t=$s){return{type:15,loc:t,properties:e}}function Ws(e,t){return{type:16,loc:$s,key:L(e)?Gs(e,!0):e,value:t}}function Gs(e,t=!1,n=$s,a=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:a}}function Ks(e,t=$s){return{type:8,loc:t,children:e}}function Ys(e,t=[],n=$s){return{type:14,loc:n,callee:e,arguments:t}}function Qs(e,t,n=!1,a=!1,i=$s){return{type:18,params:e,returns:t,newline:n,isSlot:a,loc:i}}function Zs(e,t,n,a=!0){return{type:19,test:e,consequent:t,alternate:n,newline:a,loc:$s}}function Js(e,{helper:t,removeHelper:n,inSSR:a}){var i,o;e.isBlock||(e.isBlock=!0,n((i=e.isComponent,a||i?cs:ds)),t(ss),t((o=e.isComponent,a||o?ls:us)))}let Xs=new Uint8Array([123,123]),el=new Uint8Array([125,125]);function tl(e){return e>=97&&e<=122||e>=65&&e<=90}function nl(e){return 32===e||10===e||9===e||12===e||13===e}function al(e){return 47===e||62===e||nl(e)}function il(e){let t=new Uint8Array(e.length);for(let n=0;n4===e.type&&e.isStatic;function cl(e){switch(e){case"Teleport":case"teleport":return as;case"Suspense":case"suspense":return is;case"KeepAlive":case"keep-alive":return os;case"BaseTransition":case"base-transition":return rs}}let dl=/^$|^\d|[^\$\w\xA0-\uFFFF]/,hl=/[A-Za-z_$\xA0-\uFFFF]/,pl=/[\.\?\w$\xA0-\uFFFF]/,fl=/\s+[.[]\s*|\s*[.[]\s+/g,ml=e=>4===e.type?e.content:e.loc.source,_l=e=>{let t=ml(e).trim().replace(fl,e=>e.trim()),n=0,a=[],i=0,o=0,r=null;for(let e=0;e|^\s*(?:async\s+)?function(?:\s+[\w$]+)?\s*\(/;function vl(e,t,n=!1){for(let a=0;a4===e.key.type&&e.key.content===a)}return n}function Al(e,t){return`_${t}_${e.replace(/[^\w]/g,(t,n)=>"-"===t?"_":e.charCodeAt(n).toString())}`}let Ll=/([\s\S]*?)\s+(?:in|of)\s+(\S[\s\S]*)/;function Ml(e){for(let t=0;t0,isVoidTag:w,isPreTag:w,isIgnoreNewlineTag:w,isCustomElement:w,onError:rl,onWarn:sl,comments:!1,prefixIdentifiers:!1},Il=Ol,Nl=null,Dl="",ql=null,jl=null,Bl="",Fl=-1,$l=-1,Vl=0,Ul=!1,Hl=null,Wl=[],Gl=new class{constructor(e,t){this.stack=e,this.cbs=t,this.state=1,this.buffer="",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=1,this.inRCDATA=!1,this.inXML=!1,this.inVPre=!1,this.newlines=[],this.mode=0,this.delimiterOpen=Xs,this.delimiterClose=el,this.delimiterIndex=-1,this.currentSequence=void 0,this.sequenceIndex=0}get inSFCRoot(){return 2===this.mode&&0===this.stack.length}reset(){this.state=1,this.mode=0,this.buffer="",this.sectionStart=0,this.index=0,this.baseState=1,this.inRCDATA=!1,this.currentSequence=void 0,this.newlines.length=0,this.delimiterOpen=Xs,this.delimiterClose=el}getPos(e){let t=1,n=e+1,a=this.newlines.length,i=-1;if(a>100){let t=-1,n=a;for(;t+1>>1;this.newlines[a]=0;t--)if(e>this.newlines[t]){i=t;break}return i>=0&&(t=i+2,n=e-this.newlines[i]),{column:n,line:t,offset:e}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(e){60===e?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):this.inVPre||e!==this.delimiterOpen[0]||(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(e))}stateInterpolationOpen(e){if(e===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){let e=this.index+1-this.delimiterOpen.length;e>this.sectionStart&&this.cbs.ontext(this.sectionStart,e),this.state=3,this.sectionStart=e}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(e)):(this.state=1,this.stateText(e))}stateInterpolation(e){e===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(e))}stateInterpolationClose(e){e===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(e))}stateSpecialStartSequence(e){let t=this.sequenceIndex===this.currentSequence.length;if(t?al(e):(32|e)===this.currentSequence[this.sequenceIndex]){if(!t)return void this.sequenceIndex++}else this.inRCDATA=!1;this.sequenceIndex=0,this.state=6,this.stateInTagName(e)}stateInRCDATA(e){if(this.sequenceIndex===this.currentSequence.length){if(62===e||nl(e)){let t=this.index-this.currentSequence.length;if(this.sectionStart=e||(28===this.state?this.currentSequence===ol.CdataEnd?this.cbs.oncdata(this.sectionStart,e):this.cbs.oncomment(this.sectionStart,e):6===this.state||11===this.state||18===this.state||17===this.state||12===this.state||13===this.state||14===this.state||15===this.state||16===this.state||20===this.state||19===this.state||21===this.state||9===this.state||this.cbs.ontext(this.sectionStart,e))}emitCodePoint(e,t){}}(Wl,{onerr:uu,ontext(e,t){Jl(Ql(e,t),e,t)},ontextentity(e,t,n){Jl(e,t,n)},oninterpolation(e,t){if(Ul)return Jl(Ql(e,t),e,t);let n=e+Gl.delimiterOpen.length,a=t-Gl.delimiterClose.length;for(;nl(Dl.charCodeAt(n));)n++;for(;nl(Dl.charCodeAt(a-1));)a--;let i=Ql(n,a);i.includes("&")&&(i=Il.decodeEntities(i,!1)),ou({type:5,content:lu(i,!1,ru(n,a)),loc:ru(e,t)})},onopentagname(e,t){let n=Ql(e,t);ql={type:1,tag:n,ns:Il.getNamespace(n,Wl[0],Il.ns),tagType:0,props:[],children:[],loc:ru(e-1,t),codegenNode:void 0}},onopentagend(e){Zl(e)},onclosetag(e,t){let n=Ql(e,t);if(!Il.isVoidTag(n)){let a=!1;for(let e=0;e0&&Wl[0].loc.start.offset;for(let n=0;n<=e;n++)Xl(Wl.shift(),t,n(7===e.type?e.rawName:e.name)===t)},onattribend(e,t){ql&&jl&&(su(jl.loc,t),0!==e&&(Bl.includes("&")&&(Bl=Il.decodeEntities(Bl,!0)),6===jl.type?("class"===jl.name&&(Bl=iu(Bl).trim()),jl.value={type:2,content:Bl,loc:1===e?ru(Fl,$l):ru(Fl-1,$l+1)},Gl.inSFCRoot&&"template"===ql.tag&&"lang"===jl.name&&Bl&&"html"!==Bl&&Gl.enterRCDATA(il("{let i=t.start.offset+n;return lu(e,!1,ru(i,i+e.length),0,+!!a)},s={source:r(o.trim(),n.indexOf(o,i.length)),value:void 0,key:void 0,index:void 0,finalized:!1},l=i.trim().replace(Yl,"").trim(),u=i.indexOf(l),c=l.match(Kl);if(c){let e;l=l.replace(Kl,"").trim();let t=c[1].trim();if(t&&(e=n.indexOf(t,u+l.length),s.key=r(t,e,!0)),c[2]){let a=c[2].trim();a&&(s.index=r(a,n.indexOf(a,s.key?e+t.length:u+l.length),!0))}}return l&&(s.value=r(l,u,!0)),s}(jl.exp)))),(7!==jl.type||"pre"!==jl.name)&&ql.props.push(jl)),Bl="",Fl=$l=-1},oncomment(e,t){Il.comments&&ou({type:3,content:Ql(e,t),loc:ru(e-4,t+3)})},onend(){let e=Dl.length;for(let t=0;t64&&n<91||cl(e)||Il.isBuiltInComponent&&Il.isBuiltInComponent(e)||Il.isNativeTag&&!Il.isNativeTag(e))return!0;for(let e=0;e=0;)n--;return n}let tu=new Set(["if","else","else-if","for","slot"]),nu=/\r\n/g;function au(e){let t="preserve"!==Il.whitespace,n=!1;for(let a=0;a3!==e.type);return 1!==t.length||1!==t[0].type||Cl(t[0])?null:t[0]}function du(e,t){let{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;let s=n.get(e);if(void 0!==s)return s;let l=e.codegenNode;if(13!==l.type||l.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag&&"math"!==e.tag)return 0;if(void 0!==l.patchFlag)return n.set(e,0),0;{let s=3,u=pu(e,t);if(0===u)return n.set(e,0),0;u1)for(let a=0;a{n--};for(;nt===e:t=>e.test(t);return(e,a)=>{if(1===e.type){let{props:i}=e;if(3===e.tagType&&i.some(xl))return;let o=[];for(let r=0;r`${Fs[e]}: _${Fs[e]}`;function bu(e,t,{helper:n,push:a,newline:i,isTS:o}){let r=n("component"===t?ms:gs);for(let n=0;n3;t.push("["),n&&t.indent(),wu(e,t,n),n&&t.deindent(),t.push("]")}function wu(e,t,n=!1,a=!0){let{push:i,newline:o}=t;for(let r=0;re||"null")}([r,s,l,n,c]),t),a(")"),h&&a(")"),d&&(a(", "),ku(d,t),a(")"))}(e,t);break;case 14:!function(e,t){let{push:n,helper:a,pure:i}=t,o=L(e.callee)?e.callee:a(e.callee);i&&n(gu),n(o+"(",-2,e),wu(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){let{push:n,indent:a,deindent:i,newline:o}=t,{properties:r}=e;if(!r.length)return n("{}",-2,e);let s=r.length>1;n(s?"{":"{ "),s&&a();for(let e=0;e "),(l||s)&&(n("{"),a()),r?(l&&n("return "),E(r)?yu(r,t):ku(r,t)):s&&ku(s,t),(l||s)&&(i(),n("}")),u&&n(")")}(e,t);break;case 19:!function(e,t){let{test:n,consequent:a,alternate:i,newline:o}=e,{push:r,indent:s,deindent:l,newline:u}=t;if(4===n.type){let e,a=(e=n.content,!!dl.test(e));a&&r("("),xu(n,t),a&&r(")")}else r("("),ku(n,t),r(")");o&&s(),t.indentLevel++,o||r(" "),r("? "),ku(a,t),t.indentLevel--,o&&u(),o||r(" "),r(": ");let c=19===i.type;!c&&t.indentLevel++,ku(i,t),!c&&t.indentLevel--,o&&l(!0)}(e,t);break;case 20:!function(e,t){let{push:n,helper:a,indent:i,deindent:o,newline:r}=t,{needPauseTracking:s,needArraySpread:l}=e;l&&n("[...("),n(`_cache[${e.index}] || (`),s&&(i(),n(`${a(zs)}(-1`),e.inVOnce&&n(", true"),n("),"),r(),n("(")),n(`_cache[${e.index}] = `),ku(e.value,t),s&&(n(`).cacheIndex = ${e.index},`),r(),n(`${a(zs)}(1),`),r(),n(`_cache[${e.index}]`),o()),n(")"),l&&n(")]")}(e,t);break;case 21:wu(e.body,t,!0,!1)}}function xu(e,t){let{content:n,isStatic:a}=e;t.push(a?JSON.stringify(n):n,-3,e)}function Su(e,t){for(let n=0;nfunction(e,t,n,a){if(!("else"===t.name||t.exp&&t.exp.content.trim())){let a=t.exp?t.exp.loc:e.loc;n.onError(ll(28,t.loc)),t.exp=Gs("true",!1,a)}if("if"===t.name){var i;let o=Tu(e,t),r={type:9,loc:ru((i=e.loc).start.offset,i.end.offset),branches:[o]};if(n.replaceNode(r),a)return a(r,o,!0)}else{let i=n.parent.children,o=i.indexOf(e);for(;o-- >=-1;){let r=i[o];if(!r||!zl(r)){if(r&&9===r.type){("else-if"===t.name||"else"===t.name)&&void 0===r.branches[r.branches.length-1].condition&&n.onError(ll(30,e.loc)),n.removeNode();let i=Tu(e,t);r.branches.push(i);let o=a&&a(r,i,!1);mu(i,n),o&&o(),n.currentNode=null}else n.onError(ll(30,e.loc));break}n.removeNode(r)}}}(e,t,n,(e,t,a)=>{let i=n.parent.children,o=i.indexOf(e),r=0;for(;o-- >=0;){let e=i[o];e&&9===e.type&&(r+=e.branches.length)}return()=>{a?e.codegenNode=Pu(t,r,n):(function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode)).alternate=Pu(t,r+e.branches.length-1,n)}}));function Tu(e,t){let n=3===e.tagType;return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:n&&!vl(e,"for")?e.children:[e],userKey:bl(e,"key"),isTemplateIf:n}}function Pu(e,t,n){return e.condition?Zs(e.condition,Eu(e,t,n),Ys(n.helper(hs),['""',"true"])):Eu(e,t,n)}function Eu(e,t,n){let{helper:a}=n,i=Ws("key",Gs(`${t}`,!1,$s,2)),{children:o}=e,r=o[0];if(1!==o.length||1!==r.type){if(1!==o.length||11!==r.type)return Vs(n,a(ns),Hs([i]),o,64,void 0,void 0,!0,!1,!1,e.loc);{let e=r.codegenNode;return Pl(e,i,n),e}}{let e=r.codegenNode,t=14===e.type&&e.callee===js?e.arguments[1].returns:e;return 13===t.type&&Js(t,n),Pl(t,i,n),e}}let Au=_u("for",(e,t,n)=>{let{helper:a,removeHelper:i}=n;return function(e,t,n,a){if(!t.exp)return void n.onError(ll(31,t.loc));let i=t.forParseResult;if(!i)return void n.onError(ll(32,t.loc));Lu(i);let{scopes:o}=n,{source:r,value:s,key:l,index:u}=i,c={type:11,loc:t.loc,source:r,valueAlias:s,keyAlias:l,objectIndexAlias:u,parseResult:i,children:Sl(e)?e.children:[e]};n.replaceNode(c),o.vFor++;let d=a&&a(c);return()=>{o.vFor--,d&&d()}}(e,t,n,t=>{let o=Ys(a(ys),[t.source]),r=Sl(e),s=vl(e,"memo"),l=bl(e,"key",!1,!0);l&&l.type;let u=l&&(6===l.type?l.value?Gs(l.value.content,!0):void 0:l.exp),c=l&&u?Ws("key",u):null,d=4===t.source.type&&t.source.constType>0,h=d?64:l?128:256;return t.codegenNode=Vs(n,a(ns),void 0,o,h,void 0,void 0,!0,!d,!1,e.loc),()=>{let l,{children:h}=t,p=1!==h.length||1!==h[0].type,f=Cl(e)?e:r&&1===e.children.length&&Cl(e.children[0])?e.children[0]:null;if(f)l=f.codegenNode,r&&c&&Pl(l,c,n);else if(p)l=Vs(n,a(ns),c?Hs([c]):void 0,e.children,64,void 0,void 0,!0,void 0,!1);else{var m,_,g,v,b,y,w,k;l=h[0].codegenNode,r&&c&&Pl(l,c,n),!d!==l.isBlock&&(l.isBlock?(i(ss),i((m=n.inSSR,_=l.isComponent,m||_?ls:us))):i((g=n.inSSR,v=l.isComponent,g||v?cs:ds))),l.isBlock=!d,l.isBlock?(a(ss),a((b=n.inSSR,y=l.isComponent,b||y?ls:us))):a((w=n.inSSR,k=l.isComponent,w||k?cs:ds))}if(s){let e=Qs(Mu(t.parseResult,[Gs("_cached")]));e.body={type:21,body:[Ks(["const _memo = (",s.exp,")"]),Ks(["if (_cached && _cached.el",...u?[" && _cached.key === ",u]:[],` && ${n.helperString(Bs)}(_cached, _memo)) return _cached`]),Ks(["const _item = ",l]),Gs("_item.memo = _memo"),Gs("return _item")],loc:$s},o.arguments.push(e,Gs("_cache"),Gs(String(n.cached.length))),n.cached.push(null)}else o.arguments.push(Qs(Mu(t.parseResult),l,!0))}})});function Lu(e,t){e.finalized||(e.finalized=!0)}function Mu({value:e,key:t,index:n},a=[]){var i=[e,t,n,...a];let o=i.length;for(;o--&&!i[o];);return i.slice(0,o+1).map((e,t)=>e||Gs("_".repeat(t+1),!1))}let Ru=Gs("undefined",!1),zu=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){let n=vl(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}};function Ou(e,t,n){let a=[Ws("name",e),Ws("fn",t)];return null!=n&&a.push(Ws("key",Gs(String(n),!0))),Hs(a)}let Iu=new WeakMap,Nu=(e,t)=>function(){let n,a,i,o,r;if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;let{tag:s,props:l}=e,u=1===e.tagType,c=u?function(e,t,n=!1){let{tag:a}=e,i=ju(a),o=bl(e,"is",!1,!0);if(o)if(i){let e;if(6===o.type?e=o.value&&Gs(o.value.content,!0):(e=o.exp)||(e=Gs("is",!1,o.arg.loc)),e)return Ys(t.helper(_s),[e])}else 6===o.type&&o.value.content.startsWith("vue:")&&(a=o.value.content.slice(4));let r=cl(a)||t.isBuiltInComponent(a);return r?(n||t.helper(r),r):(t.helper(ms),t.components.add(a),Al(a,"component"))}(e,t):`"${s}"`,d=R(c)&&c.callee===_s,h=0,p=d||c===as||c===is||!u&&("svg"===s||"foreignObject"===s||"math"===s);if(l.length>0){let a=Du(e,t,void 0,u,d);n=a.props,h=a.patchFlag,o=a.dynamicPropNames;let i=a.directives;r=i&&i.length?Us(i.map(e=>function(e,t){let n=[],a=Iu.get(e);a?n.push(t.helperString(a)):(t.helper(gs),t.directives.add(e.name),n.push(Al(e.name,"directive")));let{loc:i}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push("void 0"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));let t=Gs("true",!1,i);n.push(Hs(e.modifiers.map(e=>Ws(e,t)),i))}return Us(n,e.loc)}(e,t))):void 0,a.shouldUseBlock&&(p=!0)}if(e.children.length>0)if(c===os&&(p=!0,h|=1024),u&&c!==as&&c!==os){let{slots:n,hasDynamicSlots:i}=function(e,t,n=(e,t,n,a)=>Qs(e,n,!1,!0,n.length?n[0].loc:a)){t.helper(Ns);let{children:a,loc:i}=e,o=[],r=[],s=t.scopes.vSlot>0||t.scopes.vFor>0,l=vl(e,"slot",!0);if(l){let{arg:e,exp:t}=l;e&&!ul(e)&&(s=!0),o.push(Ws(e||Gs("default",!0),n(t,void 0,a,i)))}let u=!1,c=!1,d=[],h=new Set,p=0;for(let e=0;eWs("default",n(e,void 0,t,i));u?d.length&&!d.every(Rl)&&(c?t.onError(ll(39,d[0].loc)):o.push(e(void 0,d))):o.push(e(void 0,a))}let f=s?2:function e(t){for(let n=0;n0,f=!1,m=0,_=!1,g=!1,v=!1,b=!1,y=!1,w=!1,x=[],S=e=>{c.length&&(d.push(Hs(qu(c),l)),c=[]),e&&d.push(e)},C=()=>{t.scopes.vFor>0&&c.push(Ws(Gs("ref_for",!0),Gs("true")))},T=({key:e,value:n})=>{if(ul(e)){let o=e.content,r=k(o);r&&(!a||i)&&"onclick"!==o.toLowerCase()&&"onUpdate:modelValue"!==o&&!N(o)&&(b=!0),r&&N(o)&&(w=!0),r&&14===n.type&&(n=n.arguments[0]),20===n.type||(4===n.type||8===n.type)&&du(n,t)>0||("ref"===o?_=!0:"class"===o?g=!0:"style"===o?v=!0:"key"===o||x.includes(o)||x.push(o),a&&("class"===o||"style"===o)&&!x.includes(o)&&x.push(o))}else y=!0};for(let i=0;i"prop"===e.content)&&(m|=32);let w=t.directiveTransforms[n];if(w){let{props:n,needRuntime:a}=w(r,e,t);o||n.forEach(T),b&&i&&!ul(i)?S(Hs(n,l)):c.push(...n),a&&(h.push(r),M(a)&&Iu.set(r,a))}else!D(n)&&(h.push(r),p&&(f=!0))}}if(d.length?(S(),r=d.length>1?Ys(t.helper(Ss),d,l):d[0]):c.length&&(r=Hs(qu(c),l)),y?m|=16:(g&&!a&&(m|=2),v&&!a&&(m|=4),x.length&&(m|=8),b&&(m|=32)),!f&&(0===m||32===m)&&(_||w||h.length>0)&&(m|=512),!t.inSSR&&r)switch(r.type){case 15:let e=-1,n=-1,a=!1;for(let t=0;t{if(Cl(e)){let{children:n,loc:a}=e,{slotName:i,slotProps:o}=function(e,t){let n,a='"default"',i=[];for(let t=0;t0){let{props:a,directives:o}=Du(e,t,i,!1,!1);n=a,o.length&&t.onError(ll(36,o[0].loc))}return{slotName:a,slotProps:n}}(e,t),r=[t.prefixIdentifiers?"_ctx.$slots":"$slots",i,"{}","undefined","true"],s=2;o&&(r[2]=o,s=3),n.length&&(r[3]=Qs([],n,!1,!1,a),s=4),t.scopeId&&!t.slotted&&(s=5),r.splice(s),e.codegenNode=Ys(t.helper(ws),r,a)}},Fu=(e,t,n,a)=>{let i,{loc:o,modifiers:r,arg:s}=e;if(!e.exp&&r.length,4===s.type)if(s.isStatic){let e=s.content;e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`),i=Gs(0!==t.tagType||e.startsWith("vnode")||!/[A-Z]/.test(e)?U(B(e)):`on:${e}`,!0,s.loc)}else i=Ks([`${n.helperString(Rs)}(`,s,")"]);else(i=s).children.unshift(`${n.helperString(Rs)}(`),i.children.push(")");let l=e.exp;l&&!l.content.trim()&&(l=void 0);let u=n.cacheHandlers&&!l&&!n.inVOnce;if(l){let e,t=_l(l),n=!(t||(e=l,gl.test(ml(e)))),a=l.content.includes(";");(n||u&&t)&&(l=Ks([`${n?"$event":"(...args)"} => ${a?"{":"("}`,l,a?"}":")"]))}let c={props:[Ws(i,l||Gs("() => {}",!1,o))]};return a&&(c=a(c)),u&&(c.props[0].value=n.cache(c.props[0].value)),c.props.forEach(e=>e.key.isHandlerKey=!0),c},$u=(e,t,n)=>{let{modifiers:a}=e,i=e.arg,{exp:o}=e;return o&&4===o.type&&!o.content.trim()&&(o=void 0),4!==i.type?(i.children.unshift("("),i.children.push(') || ""')):i.isStatic||(i.content=i.content?`${i.content} || ""`:'""'),a.some(e=>"camel"===e.content)&&(4===i.type?i.isStatic?i.content=B(i.content):i.content=`${n.helperString(Ls)}(${i.content})`:(i.children.unshift(`${n.helperString(Ls)}(`),i.children.push(")"))),!n.inSSR&&(a.some(e=>"prop"===e.content)&&Vu(i,"."),a.some(e=>"attr"===e.content)&&Vu(i,"^")),{props:[Ws(i,o)]}},Vu=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},Uu=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{let n,a=e.children,i=!1;for(let e=0;e7===e.type&&!t.directiveTransforms[e.name]))))for(let e=0;e{if(1===e.type&&vl(e,"once",!0)&&!Hu.has(e)&&!t.inVOnce&&!t.inSSR)return Hu.add(e),t.inVOnce=!0,t.helper(zs),()=>{t.inVOnce=!1;let e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0,!0))}},Gu=(e,t,n)=>{let a,{exp:i,arg:o}=e;if(!i)return n.onError(ll(41,e.loc)),Ku();let r=i.loc.source.trim(),s=4===i.type?i.content:r,l=n.bindingMetadata[r];if("props"===l||"props-aliased"===l||"literal-const"===l||"setup-const"===l)return i.loc,Ku();if(!s.trim()||!_l(i))return n.onError(ll(42,i.loc)),Ku();let u=o||Gs("modelValue",!0),c=o?ul(o)?`onUpdate:${B(o.content)}`:Ks(['"onUpdate:" + ',o]):"onUpdate:modelValue";a=Ks([`${n.isTS?"($event: any)":"$event"} => ((`,i,") = $event)"]);let d=[Ws(u,e.exp),Ws(c,a)];if(e.modifiers.length&&1===t.tagType){let t=e.modifiers.map(e=>e.content).map(e=>(dl.test(e)?JSON.stringify(e):e)+": true").join(", "),n=o?ul(o)?`${o.content}Modifiers`:Ks([o,' + "Modifiers"']):"modelModifiers";d.push(Ws(n,Gs(`{ ${t} }`,!1,e.loc,2)))}return Ku(d)};function Ku(e=[]){return{props:e}}let Yu=new WeakSet,Qu=(e,t)=>{if(1===e.type){let n=vl(e,"memo");if(n&&!Yu.has(e)&&!t.inSSR)return Yu.add(e),()=>{let a=e.codegenNode||t.currentNode.codegenNode;a&&13===a.type&&(1!==e.tagType&&Js(a,t),e.codegenNode=Ys(t.helper(js),[n.exp,Qs(void 0,a),"_cache",String(t.cached.length)]),t.cached.push(null))}}},Zu=(e,t)=>{if(1===e.type)for(let n of e.props)if(7===n.type&&"bind"===n.name&&(!n.exp||4===n.exp.type&&!n.exp.content.trim())&&n.arg){let e=n.arg;if(4===e.type&&e.isStatic){let t=B(e.content);(hl.test(t[0])||"-"===t[0])&&(n.exp=Gs(t,!1,e.loc))}else t.onError(ll(53,e.loc)),n.exp=Gs("",!0,e.loc)}},Ju=Symbol(""),Xu=Symbol(""),ec=Symbol(""),tc=Symbol(""),nc=Symbol(""),ac=Symbol(""),ic=Symbol(""),oc=Symbol(""),rc=Symbol(""),sc=Symbol("");Object.getOwnPropertySymbols(a={[Ju]:"vModelRadio",[Xu]:"vModelCheckbox",[ec]:"vModelText",[tc]:"vModelSelect",[nc]:"vModelDynamic",[ac]:"withModifiers",[ic]:"withKeys",[oc]:"vShow",[rc]:"Transition",[sc]:"TransitionGroup"}).forEach(e=>{Fs[e]=a[e]});let lc={parseMode:"html",isVoidTag:se,isNativeTag:e=>ie(e)||oe(e)||re(e),isPreTag:e=>"pre"===e,isIgnoreNewlineTag:e=>"pre"===e||"textarea"===e,decodeEntities:function(e,t=!1){return f||(f=document.createElement("div")),t?(f.innerHTML=`
`,f.children[0].getAttribute("foo")):(f.innerHTML=e,f.textContent)},isBuiltInComponent:e=>"Transition"===e||"transition"===e?rc:"TransitionGroup"===e||"transition-group"===e?sc:void 0,getNamespace(e,t,n){let a=t?t.ns:n;if(t&&2===a)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some(e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content))&&(a=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(a=0);else t&&1===a&&("foreignObject"===t.tag||"desc"===t.tag||"title"===t.tag)&&(a=0);if(0===a){if("svg"===e)return 1;if("math"===e)return 2}return a}},uc=g("passive,once,capture"),cc=g("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),dc=g("left,right"),hc=g("onkeyup,onkeydown,onkeypress"),pc=(e,t)=>ul(e)&&"onclick"===e.content.toLowerCase()?Gs(t,!0):4!==e.type?Ks(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,fc=(e,t)=>{1===e.type&&0===e.tagType&&("script"===e.tag||"style"===e.tag)&&t.removeNode()},mc=[e=>{1===e.type&&e.props.forEach((t,n)=>{let a,i;6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:Gs("style",!0,t.loc),exp:(a=t.value.content,i=t.loc,Gs(JSON.stringify(ne(a)),!1,i,3)),modifiers:[],loc:t.loc})})}],_c={cloak:()=>({props:[]}),html:(e,t,n)=>{let{exp:a,loc:i}=e;return a||n.onError(ll(54,i)),t.children.length&&(n.onError(ll(55,i)),t.children.length=0),{props:[Ws(Gs("innerHTML",!0,i),a||Gs("",!0))]}},text:(e,t,n)=>{let{exp:a,loc:i}=e;return a||n.onError(ll(56,i)),t.children.length&&(n.onError(ll(57,i)),t.children.length=0),{props:[Ws(Gs("textContent",!0),a?du(a,n)>0?a:Ys(n.helperString(xs),[a],i):Gs("",!0))]}},model:(e,t,n)=>{let a=Gu(e,t,n);if(!a.props.length||1===t.tagType)return a;e.arg&&n.onError(ll(59,e.arg.loc));let{tag:i}=t,o=n.isCustomElement(i);if("input"===i||"textarea"===i||"select"===i||o){let r=ec,s=!1;if("input"===i||o){let a=bl(t,"type");if(a){if(7===a.type)r=nc;else if(a.value)switch(a.value.content){case"radio":r=Ju;break;case"checkbox":r=Xu;break;case"file":s=!0,n.onError(ll(60,e.loc))}}else t.props.some(e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic))&&(r=nc)}else"select"===i&&(r=tc);s||(a.needRuntime=n.helper(r))}else n.onError(ll(58,e.loc));return a.props=a.props.filter(e=>4!==e.key.type||"modelValue"!==e.key.content),a},on:(e,t,n)=>Fu(e,t,n,t=>{let{modifiers:a}=e;if(!a.length)return t;let{key:i,value:o}=t.props[0],{keyModifiers:r,nonKeyModifiers:s,eventOptionModifiers:l}=((e,t)=>{let n=[],a=[],i=[];for(let o=0;o{let{exp:a,loc:i}=e;return a||n.onError(ll(62,i)),{props:[],needRuntime:n.helper(oc)}}},gc=Object.create(null);function vc(e,t){if(!L(e)){if(!e.nodeType)return y;e=e.innerHTML}let n=e+JSON.stringify(t,(e,t)=>"function"==typeof t?t.toString():t),a=gc[n];if(a)return a;if("#"===e[0]){let t=document.querySelector(e);e=t?t.innerHTML:""}let i=S({hoistStatic:!0,onError:void 0,onWarn:y},t);!i.isCustomElement&&"u">typeof customElements&&(i.isCustomElement=e=>!!customElements.get(e));let{code:o}=function(e,t={}){return function(e,t={}){var n;let a,i=t.onError||rl,o="module"===t.mode;!0===t.prefixIdentifiers?i(ll(48)):o&&i(ll(49)),t.cacheHandlers&&i(ll(50)),t.scopeId&&!o&&i(ll(51));let r=S({},t,{prefixIdentifiers:!1}),s=L(e)?function(e,t){if(Gl.reset(),ql=null,jl=null,Bl="",Fl=-1,$l=-1,Wl.length=0,Dl=e,Il=S({},Ol),t){let e;for(e in t)null!=t[e]&&(Il[e]=t[e])}Gl.mode="html"===Il.parseMode?1:2*("sfc"===Il.parseMode),Gl.inXML=1===Il.ns||2===Il.ns;let n=t&&t.delimiters;n&&(Gl.delimiterOpen=il(n[0]),Gl.delimiterClose=il(n[1]));let a=Nl=function(e,t=""){return{type:0,source:t,children:[],helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:[],temps:0,codegenNode:void 0,loc:$s}}(0,e);return Gl.parse(Dl),a.loc=ru(0,e.length),a.children=au(a.children),Nl=null,a}(e,r):e,[l,u]=[[Zu,Wu,Cu,Qu,Au,Bu,Nu,zu,Uu],{on:Fu,bind:$u,model:Gu}];return a=function(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:a=!1,hmr:i=!1,cacheHandlers:o=!1,nodeTransforms:r=[],directiveTransforms:s={},transformHoist:l=null,isBuiltInComponent:u=y,isCustomElement:c=y,expressionPlugins:d=[],scopeId:h=null,slotted:p=!0,ssr:f=!1,inSSR:m=!1,ssrCssVars:_="",bindingMetadata:g=v,inline:b=!1,isTS:w=!1,onError:k=rl,onWarn:x=sl,compatConfig:S}){let C=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),T={filename:t,selfName:C&&V(B(C[1])),prefixIdentifiers:n,hoistStatic:a,hmr:i,cacheHandlers:o,nodeTransforms:r,directiveTransforms:s,transformHoist:l,isBuiltInComponent:u,isCustomElement:c,expressionPlugins:d,scopeId:h,slotted:p,ssr:f,inSSR:m,ssrCssVars:_,bindingMetadata:g,inline:b,isTS:w,onError:k,onWarn:x,compatConfig:S,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],cached:[],constantCache:new WeakMap,temps:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,grandParent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){let t=T.helpers.get(e)||0;return T.helpers.set(e,t+1),e},removeHelper(e){let t=T.helpers.get(e);if(t){let n=t-1;n?T.helpers.set(e,n):T.helpers.delete(e)}},helperString:e=>`_${Fs[T.helper(e)]}`,replaceNode(e){T.parent.children[T.childIndex]=T.currentNode=e},removeNode(e){let t=T.parent.children,n=e?t.indexOf(e):T.currentNode?T.childIndex:-1;e&&e!==T.currentNode?T.childIndex>n&&(T.childIndex--,T.onNodeRemoved()):(T.currentNode=null,T.onNodeRemoved()),T.parent.children.splice(n,1)},onNodeRemoved:y,addIdentifiers(e){},removeIdentifiers(e){},hoist(e){L(e)&&(e=Gs(e)),T.hoists.push(e);let t=Gs(`_hoisted_${T.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache(e,t=!1,n=!1){let a=function(e,t,n=!1,a=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:a,needArraySpread:!1,loc:$s}}(T.cached.length,e,t,n);return T.cached.push(a),a}};return T}(s,n=S({},r,{nodeTransforms:[...l,...t.nodeTransforms||[]],directiveTransforms:S({},u,t.directiveTransforms||{})})),mu(s,a),n.hoistStatic&&function e(t,n,a,i=!1,o=!1){let{children:r}=t,s=[];for(let n=0;n0){if(e>=2){l.codegenNode.patchFlag=-1,s.push(l);continue}}else{let e=l.codegenNode;if(13===e.type){let t=e.patchFlag;if((void 0===t||512===t||1===t)&&pu(l,a)>=2){let t=fu(l);t&&(e.props=a.hoist(t))}e.dynamicProps&&(e.dynamicProps=a.hoist(e.dynamicProps))}}}else if(12===l.type&&(i?0:du(l,a))>=2){14===l.codegenNode.type&&l.codegenNode.arguments.length>0&&l.codegenNode.arguments.push("-1"),s.push(l);continue}if(1===l.type){let n=1===l.tagType;n&&a.scopes.vSlot++,e(l,t,a,!1,o),n&&a.scopes.vSlot--}else if(11===l.type)e(l,t,a,1===l.children.length,!0);else if(9===l.type)for(let n=0;ne.key===t||e.key.content===t);return n&&n.value}}s.length&&a.transformHoist&&a.transformHoist(r,a,t)}(s,void 0,a,!!cu(s)),n.ssr||function(e,t){let{helper:n}=t,{children:a}=e;if(1===a.length){let n=cu(e);if(n&&n.codegenNode){let a=n.codegenNode;13===a.type&&Js(a,t),e.codegenNode=a}else e.codegenNode=a[0]}else a.length>1&&(e.codegenNode=Vs(t,n(ns),void 0,e.children,64,void 0,void 0,!0,void 0,!1))}(s,a),s.helpers=new Set([...a.helpers.keys()]),s.components=[...a.components],s.directives=[...a.directives],s.imports=a.imports,s.hoists=a.hoists,s.temps=a.temps,s.cached=a.cached,s.transformed=!0,function(e,t={}){let n=function(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:a=!1,filename:i="template.vue.html",scopeId:o=null,optimizeImports:r=!1,runtimeGlobalName:s="Vue",runtimeModuleName:l="vue",ssrRuntimeModuleName:u="vue/server-renderer",ssr:c=!1,isTS:d=!1,inSSR:h=!1}){let p={mode:t,prefixIdentifiers:n,sourceMap:a,filename:i,scopeId:o,optimizeImports:r,runtimeGlobalName:s,runtimeModuleName:l,ssrRuntimeModuleName:u,ssr:c,isTS:d,inSSR:h,source:e.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${Fs[e]}`,push(e,t=-2,n){p.code+=e},indent(){f(++p.indentLevel)},deindent(e=!1){e?--p.indentLevel:f(--p.indentLevel)},newline(){f(p.indentLevel)}};function f(e){p.push("\n"+" ".repeat(e),0)}return p}(e,t);t.onContextCreated&&t.onContextCreated(n);let{mode:a,push:i,prefixIdentifiers:o,indent:r,deindent:s,newline:l,ssr:u}=n,c=Array.from(e.helpers),d=c.length>0,h=!o&&"module"!==a;if(function(e,t){let{push:n,newline:a,runtimeGlobalName:i}=t,o=Array.from(e.helpers);if(o.length>0&&(n(`const _Vue = ${i}\n`,-1),e.hoists.length)){n(`const { ${[cs,ds,hs,ps,fs].filter(e=>o.includes(e)).map(vu).join(", ")} } = _Vue\n`,-1)}(function(e,t){if(!e.length)return;t.pure=!0;let{push:n,newline:a}=t;a();for(let i=0;i0)&&l()),e.directives.length&&(bu(e.directives,"directive",n),e.temps>0&&l()),e.temps>0){i("let ");for(let t=0;t0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(i("\n",0),l()),u||i("return "),e.codegenNode?ku(e.codegenNode,n):i("null"),h&&(s(),i("}")),s(),i("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}(s,r)}(e,S({},lc,t,{nodeTransforms:[fc,...mc,...t.nodeTransforms||[]],directiveTransforms:S({},_c,t.directiveTransforms||{}),transformHoist:null}))}(e,i),r=Function(o)();return r._rc=!0,gc[n]=r}return vo(vc),e.BaseTransition=qn,e.BaseTransitionPropsValidators=In,e.Comment=Di,e.DeprecationTypes=null,e.EffectScope=me,e.ErrorCodes={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},e.ErrorTypeStrings=null,e.Fragment=Ii,e.KeepAlive={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){let n=ho(),a=n.ctx,i=new Map,o=new Set,r=null,s=n.suspense,{renderer:{p:l,m:u,um:c,o:{createElement:d}}}=a,h=d("div");function p(e){fa(e),c(e,n,s,!0)}function f(e){i.forEach((t,n)=>{let a=xo(sa(t)?t.type.__asyncResolved||{}:t.type);a&&!e(a)&&m(n)})}function m(e){let t=i.get(e);!t||r&&Ki(t,r)?r&&fa(r):p(t),i.delete(e),o.delete(e)}a.activate=(e,t,n,a,i)=>{let o=e.component;u(e,t,n,0,s),l(o.vnode,e,t,n,o,s,a,e.slotScopeIds,i),yi(()=>{o.isDeactivated=!1,o.a&&W(o.a);let t=e.props&&e.props.onVnodeMounted;t&&so(t,o.parent,e)},s)},a.deactivate=e=>{let t=e.component;Pi(t.m),Pi(t.a),u(e,h,null,1,s),yi(()=>{t.da&&W(t.da);let n=e.props&&e.props.onVnodeUnmounted;n&&so(n,t.parent,e),t.isDeactivated=!0},s)},bn(()=>[e.include,e.exclude],([e,t])=>{e&&f(t=>ca(e,t)),t&&f(e=>!ca(t,e))},{flush:"post",deep:!0});let _=null,g=()=>{null!=_&&(Ei(n.subTree.type)?yi(()=>{i.set(_,ma(n.subTree))},n.subTree.suspense):i.set(_,ma(n.subTree)))};return ba(g),wa(g),ka(()=>{i.forEach(e=>{let{subTree:t,suspense:a}=n,i=ma(t);if(e.type===i.type&&e.key===i.key){fa(i);let e=i.component.da;return void(e&&yi(e,a))}p(e)})}),()=>{if(_=null,!t.default)return r=null;let n=t.default(),a=n[0];if(n.length>1)return r=null,n;if(!(Gi(a)&&(4&a.shapeFlag||128&a.shapeFlag)))return r=null,a;let s=ma(a);if(s.type===Di)return r=null,s;let l=s.type,u=xo(sa(s)?s.type.__asyncResolved||{}:l),{include:c,exclude:d,max:h}=e;if(c&&(!u||!ca(c,u))||d&&u&&ca(d,u))return s.shapeFlag&=-257,r=s,a;let p=null==s.key?l:s.key,f=i.get(p);return s.el&&(s=eo(s),128&a.shapeFlag&&(a.ssContent=s)),_=p,f?(s.el=f.el,s.component=f.component,s.transition&&Vn(s,s.transition),s.shapeFlag|=512,o.delete(p),o.add(p)):(o.add(p),h&&o.size>parseInt(h,10)&&m(o.values().next().value)),s.shapeFlag|=256,r=s,Ei(a.type)?a:s}}},e.ReactiveEffect=ge,e.Static=qi,e.Suspense={name:"Suspense",__isSuspense:!0,process(e,t,n,a,i,o,r,s,l,u){if(null==e)!function(e,t,n,a,i,o,r,s,l){let{p:u,o:{createElement:c}}=l,d=c("div"),h=e.suspense=Mi(e,i,a,t,d,n,o,r,s,l);u(null,h.pendingBranch=e.ssContent,d,null,a,h,o,r),h.deps>0?(Li(e,"onPending"),Li(e,"onFallback"),u(null,e.ssFallback,t,n,a,null,o,r),Oi(h,e.ssFallback)):h.resolve(!1,!0)}(t,n,a,i,o,r,s,l,u);else{if(o&&o.deps>0&&!e.suspense.isInFallback)return t.suspense=e.suspense,t.suspense.vnode=t,void(t.el=e.el);!function(e,t,n,a,i,o,r,s,{p:l,um:u,o:{createElement:c}}){let d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;let h=t.ssContent,p=t.ssFallback,{activeBranch:f,pendingBranch:m,isInFallback:_,isHydrating:g}=d;if(m)d.pendingBranch=h,Ki(m,h)?(l(m,h,d.hiddenContainer,null,i,d,o,r,s),d.deps<=0?d.resolve():_&&!g&&(l(f,p,n,a,i,null,o,r,s),Oi(d,p))):(d.pendingId=Ai++,g?(d.isHydrating=!1,d.activeBranch=m):u(m,i,d),d.deps=0,d.effects.length=0,d.hiddenContainer=c("div"),_?(l(null,h,d.hiddenContainer,null,i,d,o,r,s),d.deps<=0?d.resolve():(l(f,p,n,a,i,null,o,r,s),Oi(d,p))):f&&Ki(f,h)?(l(f,h,n,a,i,d,o,r,s),d.resolve(!0)):(l(null,h,d.hiddenContainer,null,i,d,o,r,s),d.deps<=0&&d.resolve()));else if(f&&Ki(f,h))l(f,h,n,a,i,d,o,r,s),Oi(d,h);else if(Li(t,"onPending"),d.pendingBranch=h,512&h.shapeFlag?d.pendingId=h.component.suspenseId:d.pendingId=Ai++,l(null,h,d.hiddenContainer,null,i,d,o,r,s),d.deps<=0)d.resolve();else{let{timeout:e,pendingId:t}=d;e>0?setTimeout(()=>{d.pendingId===t&&d.fallback(p)},e):0===e&&d.fallback(p)}}(e,t,n,a,i,r,s,l,u)}},hydrate:function(e,t,n,a,i,o,r,s,l){let u=t.suspense=Mi(t,a,n,e.parentNode,document.createElement("div"),null,i,o,r,s,!0),c=l(e,u.pendingBranch=t.ssContent,n,u,o,r);return 0===u.deps&&u.resolve(!1,!0),c},normalize:function(e){let{shapeFlag:t,children:n}=e,a=32&t;e.ssContent=Ri(a?n.default:n),e.ssFallback=a?Ri(n.fallback):Ji(Di)}},e.Teleport={name:"Teleport",__isTeleport:!0,process(e,t,n,a,i,o,r,s,l,u){let{mc:c,pc:d,pbc:h,o:{insert:p,querySelector:f,createText:m,parentNode:_}}=u,g=Sn(t.props),{dynamicChildren:v}=t,b=(e,t,n)=>{16&e.shapeFlag&&c(e.children,t,n,i,o,r,s,l)},y=(e=t)=>{let n=Sn(e.props),a=e.target=Pn(e.props,f),o=Ln(a,e,m,p);a&&("svg"!==r&&Cn(a)?r="svg":"mathml"!==r&&Tn(a)&&(r="mathml"),i&&i.isCE&&(i.ce._teleportTargets||(i.ce._teleportTargets=new Set)).add(a),n||(b(e,a,o),An(e,!1)))},w=e=>{let t=()=>{if(kn.get(e)===t){if(kn.delete(e),Sn(e.props)){let t=_(e.el)||n;b(e,t,e.anchor),An(e,!0)}y(e)}};kn.set(e,t),yi(t,o)};if(null==e){let e,i=t.el=m(""),r=t.anchor=m("");if(p(i,n,a),p(r,n,a),(e=t.props)&&(e.defer||""===e.defer)||o&&o.pendingBranch)return void w(t);g&&(b(t,n,r),An(t,!0)),y()}else{t.el=e.el;let a=t.anchor=e.anchor,c=kn.get(e);if(c)return c.flags|=8,kn.delete(e),void w(t);t.targetStart=e.targetStart;let p=t.target=e.target,m=t.targetAnchor=e.targetAnchor,_=Sn(e.props),b=_?n:p,y=_?a:m;if("svg"===r||Cn(p)?r="svg":("mathml"===r||Tn(p))&&(r="mathml"),v?(h(e.dynamicChildren,v,b,i,o,r,s),Ti(e,t,!0)):l||d(e,t,b,y,i,o,r,s,!1),g)_?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):En(t,n,a,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){let e=t.target=Pn(t.props,f);e&&En(t,e,null,u,0)}else _&&En(t,p,m,u,1);An(t,g)}},remove(e,t,n,{um:a,o:{remove:i}},o){let{shapeFlag:r,children:s,anchor:l,targetStart:u,targetAnchor:c,target:d,props:h}=e,p=o||!Sn(h),f=kn.get(e);if(f&&(f.flags|=8,kn.delete(e),p=!1),d&&(i(u),i(c)),o&&i(l),16&r)for(let e=0;ee[a]});return n},e.createRenderer=function(e){return ki(e)},e.createSSRApp=Xr,e.createSlots=function(e,t){for(let n=0;n{let t=a.fn(...e);return t&&(t.key=a.key),t}:a.fn)}return e},e.createStaticVNode=function(e,t){let n=Ji(qi,null,e);return n.staticCount=t,n},e.createTextVNode=to,e.createVNode=Ji,e.customRef=qt,e.defineAsyncComponent=function(e){let t;A(e)&&(e={loader:e});let{loader:n,loadingComponent:a,errorComponent:i,delay:o=200,hydrate:r,timeout:s,suspensible:l=!0,onError:u}=e,c=null,d=0,h=()=>{let e;return c||(e=c=n().catch(e=>{if(e=e instanceof Error?e:Error(String(e)),u)return new Promise((t,n)=>{u(e,()=>t((d++,c=null,h())),()=>n(e),d+1)});throw e}).then(n=>e!==c&&c?c:(n&&(n.__esModule||"Module"===n[Symbol.toStringTag])&&(n=n.default),t=n,n)))};return Hn({name:"AsyncComponentWrapper",__asyncLoader:h,__asyncHydrate(e,n,a){let i=!1;(n.bu||(n.bu=[])).push(()=>i=!0);let o=()=>{i||a()},s=r?()=>{let t=r(o,t=>function(e,t){if(ea(e)&&"["===e.data){let n=1,a=e.nextSibling;for(;a;){if(1===a.nodeType){if(!1===t(a))break}else if(ea(a))if("]"===a.data){if(0==--n)break}else"["===a.data&&n++;a=a.nextSibling}}else t(e)}(e,t));t&&(n.bum||(n.bum=[])).push(t)}:o;t?s():h().then(()=>!n.isUnmounted&&s())},get __asyncResolved(){return t},setup(){let e=co;if(Wn(e),t)return()=>la(t,e);let n=t=>{c=null,Kt(t,e,13,!i)};if(l&&e.suspense)return h().then(t=>()=>la(t,e)).catch(e=>(n(e),()=>i?Ji(i,{error:e}):null));let r=Lt(!1),u=Lt(),d=Lt(!!o);return o&&setTimeout(()=>{d.value=!1},o),null!=s&&setTimeout(()=>{if(!r.value&&!u.value){let e=Error(`Async component timed out after ${s}ms.`);n(e),u.value=e}},s),h().then(()=>{r.value=!0,e.parent&&ua(e.parent.vnode)&&e.parent.update()}).catch(e=>{n(e),u.value=e}),()=>r.value&&t?la(t,e):u.value&&i?Ji(i,{error:u.value}):a&&!d.value?la(a,e):void 0}})},e.defineComponent=Hn,e.defineCustomElement=vr,e.defineEmits=function(){return null},e.defineExpose=function(e){},e.defineModel=function(){},e.defineOptions=function(e){},e.defineProps=function(){return null},e.defineSSRCustomElement=(e,t)=>vr(e,t,Xr),e.defineSlots=function(){return null},e.devtools=void 0,e.effect=function(e,t){e.effect instanceof ge&&(e=e.effect.fn);let n=new ge(e);t&&S(n,t);try{n.run()}catch(e){throw n.stop(),e}let a=n.run.bind(n);return a.effect=n,a},e.effectScope=function(e){return new me(e)},e.getCurrentInstance=ho,e.getCurrentScope=function(){return o},e.getCurrentWatcher=function(){return m},e.getTransitionRawChildren=Un,e.guardReactiveProps=Xi,e.h=Co,e.handleError=Kt,e.hasInjectionContext=function(){return!(!ho()&&!Za)},e.hydrate=(...e)=>{Qr().hydrate(...e)},e.hydrateOnIdle=(e=1e4)=>t=>{let n=oa(t,{timeout:e});return()=>ra(n)},e.hydrateOnInteraction=(e=[])=>(t,n)=>{L(e)&&(e=[e]);let a=!1,i=e=>{a||(a=!0,o(),t(),e.target.dispatchEvent(new e.constructor(e.type,e)))},o=()=>{n(t=>{for(let n of e)t.removeEventListener(n,i)})};return n(t=>{for(let n of e)t.addEventListener(n,i,{once:!0})}),o},e.hydrateOnMediaQuery=e=>t=>{if(e){let n=matchMedia(e);if(!n.matches)return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t);t()}},e.hydrateOnVisible=e=>(t,n)=>{let a=new IntersectionObserver(e=>{for(let n of e)if(n.isIntersecting){a.disconnect(),t();break}},e);return n(e=>{if(e instanceof Element){if(function(e){let{top:t,left:n,bottom:a,right:i}=e.getBoundingClientRect(),{innerHeight:o,innerWidth:r}=window;return(t>0&&t0&&a0&&n0&&ia.disconnect()},e.initCustomFormatter=function(){},e.initDirectivesForSSR=y,e.inject=_n,e.isMemoSame=To,e.isProxy=St,e.isReactive=wt,e.isReadonly=kt,e.isRef=At,e.isRuntimeOnly=()=>!d,e.isShallow=xt,e.isVNode=Gi,e.markRaw=Tt,e.mergeDefaults=function(e,t){let n=qa(e);for(let e in t){if(e.startsWith("__skip"))continue;let a=n[e];a?E(a)||A(a)?a=n[e]={type:a,default:t[e]}:a.default=t[e]:null===a&&(a=n[e]={default:t[e]}),a&&t[`__skip_${e}`]&&(a.skipFactory=!0)}return n},e.mergeModels=function(e,t){return e&&t?E(e)&&E(t)?e.concat(t):S({},qa(e),qa(t)):e||t},e.mergeProps=ro,e.nextTick=nn,e.nodeOps=Ro,e.normalizeClass=ae,e.normalizeProps=function(e){if(!e)return null;let{class:t,style:n}=e;return t&&!L(t)&&(e.class=ae(t)),n&&(e.style=J(n)),e},e.normalizeStyle=J,e.onActivated=da,e.onBeforeMount=va,e.onBeforeUnmount=ka,e.onBeforeUpdate=ya,e.onDeactivated=ha,e.onErrorCaptured=Pa,e.onMounted=ba,e.onRenderTracked=Ta,e.onRenderTriggered=Ca,e.onScopeDispose=function(e,t=!1){o&&o.cleanups.push(e)},e.onServerPrefetch=Sa,e.onUnmounted=xa,e.onUpdated=wa,e.onWatcherCleanup=Ut,e.openBlock=Fi,e.patchProp=_r,e.popScopeId=function(){dn=null},e.provide=mn,e.proxyRefs=Nt,e.pushScopeId=function(e){dn=e},e.queuePostFlushCb=rn,e.reactive=gt,e.readonly=bt,e.ref=Lt,e.registerRuntimeCompiler=vo,e.render=Zr,e.renderList=function(e,t,n,a){let i,o=n&&n[a],r=E(e);if(r||L(e)){let n=!1,a=!1;r&&wt(e)&&(n=!xt(e),a=kt(e),e=Fe(e)),i=Array(e.length);for(let r=0,s=e.length;rt(e,n,void 0,o&&o[n]));else{let n=Object.keys(e);i=Array(n.length);for(let a=0,r=n.length;a0;return"default"!==t&&(n.name=t),Fi(),Wi(Ii,null,[Ji("slot",n,a&&a())],e?-2:64)}let o=e[t];o&&o._c&&(o._d=!1),Fi();let r=o&&function e(t){return t.some(t=>!Gi(t)||t.type!==Di&&(t.type!==Ii||!!e(t.children)))?t:null}(o(n)),s=n.key||r&&r.key,l=Wi(Ii,{key:(s&&!M(s)?s:`_${t}`)+(!r&&a?"_fb":"")},r||(a?a():[]),r&&1===e._?64:-2);return!i&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),o&&o._c&&(o._d=!0),l},e.resolveComponent=function(e,t){return La(Ea,e,!0,t)||e},e.resolveDirective=function(e){return La("directives",e)},e.resolveDynamicComponent=function(e){return L(e)?La(Ea,e,!1)||e:e||Aa},e.resolveFilter=null,e.resolveTransitionHooks=Bn,e.setBlockTracking=Ui,e.setDevtoolsHook=y,e.setTransitionHooks=Vn,e.shallowReactive=vt,e.shallowReadonly=function(e){return yt(e,!0,ot,ht,_t)},e.shallowRef=Mt,e.ssrContextKey=gn,e.ssrUtils=null,e.stop=function(e){e.effect.stop()},e.toDisplayString=he,e.toHandlerKey=U,e.toHandlers=function(e,t){let n={};for(let a in e)n[t&&/[A-Z]/.test(a)?`on:${a}`:U(a)]=e[a];return n},e.toRaw=Ct,e.toRef=function(e,t,n){return At(e)?e:A(e)?new Bt(e):R(e)&&arguments.length>1?new jt(e,t,n):Lt(e)},e.toRefs=function(e){let t=E(e)?Array(e.length):{};for(let n in e)t[n]=new jt(e,n,void 0);return t},e.toValue=function(e){return A(e)?e():Ot(e)},e.transformVNodeArgs=function(e){},e.triggerRef=function(e){e.dep&&e.dep.trigger()},e.unref=Ot,e.useAttrs=function(){return Da().attrs},e.useCssModule=function(e="$style"){return v},e.useCssVars=function(e){let t=ho();if(!t)return;let n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(e=>tr(e,n))},a=()=>{let a=e(t.proxy);t.ce?tr(t.ce,a):function e(t,n){if(128&t.shapeFlag){let a=t.suspense;t=a.activeBranch,a.pendingBranch&&!a.isHydrating&&a.effects.push(()=>{e(a.activeBranch,n)})}for(;t.component;)t=t.component.subTree;if(1&t.shapeFlag&&t.el)tr(t.el,n);else if(t.type===Ii)t.children.forEach(t=>e(t,n));else if(t.type===qi){let{el:e,anchor:a}=t;for(;e&&(tr(e,n),e!==a);)e=e.nextSibling}}(t.subTree,a),n(a)};ya(()=>{rn(a)}),ba(()=>{bn(a,y,{flush:"post"});let e=new MutationObserver(a);e.observe(t.subTree.el.parentNode,{childList:!0}),xa(()=>e.disconnect())})},e.useHost=wr,e.useId=function(){let e=ho();return e?(e.appContext.config.idPrefix||"v")+"-"+e.ids[0]+e.ids[1]++:""},e.useModel=function(e,t,n=v){let a=ho(),i=B(t),o=$(t),r=Ja(e,i),s=qt((r,s)=>{let l,u,c=v;return vn(()=>{let t=e[i];H(l,t)&&(l=t,s())}),{get:()=>(r(),n.get?n.get(l):l),set(e){let r=n.set?n.set(e):e;if(!(H(r,l)||c!==v&&H(e,c)))return;let d=a.vnode.props;d&&(t in d||i in d||o in d)&&(`onUpdate:${t}`in d||`onUpdate:${i}`in d||`onUpdate:${o}`in d)||(l=e,s()),a.emit(`update:${t}`,r),H(e,r)&&H(e,c)&&!H(r,u)&&s(),c=e,u=r}}});return s[Symbol.iterator]=()=>{let e=0;return{next:()=>e<2?{value:e++?r||v:s,done:!1}:{done:!0}}},s},e.useSSRContext=()=>{},e.useShadowRoot=function(){let e=wr();return e&&e.shadowRoot},e.useSlots=function(){return Da().slots},e.useTemplateRef=function(e){let t=ho(),n=Mt(null);return t&&Object.defineProperty(t.refs===v?t.refs={}:t.refs,e,{enumerable:!0,get:()=>n.value,set:e=>n.value=e}),n},e.useTransitionState=zn,e.vModelCheckbox=Dr,e.vModelDynamic={created(e,t,n){Ur(e,t,n,null,"created")},mounted(e,t,n){Ur(e,t,n,null,"mounted")},beforeUpdate(e,t,n,a){Ur(e,t,n,a,"beforeUpdate")},updated(e,t,n,a){Ur(e,t,n,a,"updated")}},e.vModelRadio=jr,e.vModelSelect=Br,e.vModelText=Nr,e.vShow={name:"show",beforeMount(e,{value:t},{transition:n}){e[Zo]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):Xo(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:a}){!t!=!n&&(a?t?(a.beforeEnter(e),Xo(e,!0),a.enter(e)):a.leave(e,()=>{Xo(e,!1)}):Xo(e,t))},beforeUnmount(e,{value:t}){Xo(e,t)}},e.version=Po,e.warn=y,e.watch=function(e,t,n){return bn(e,t,n)},e.watchEffect=function(e,t){return bn(e,null,t)},e.watchPostEffect=function(e,t){return bn(e,null,{flush:"post"})},e.watchSyncEffect=vn,e.withAsyncContext=function(e){let t=ho(),n=_o,a=e();fo(),n&&c(!1);let i=()=>{po(t),n&&c(!0)},o=()=>{ho()!==t&&t.scope.off(),fo(),n&&c(!1)};return z(a)&&(a=a.catch(e=>{throw i(),Promise.resolve().then(()=>Promise.resolve().then(o)),e})),[a,()=>{i(),Promise.resolve().then(o)}]},e.withCtx=pn,e.withDefaults=function(e,t){return null},e.withDirectives=function(e,t){if(null===cn)return e;let n=ko(cn),a=e.dirs||(e.dirs=[]);for(let e=0;e{let n=e._withKeys||(e._withKeys={}),a=t.join(".");return n[a]||(n[a]=n=>{if(!("key"in n))return;let a=$(n.key);return t.some(e=>e===a||Gr[e]===a)?e(n):void 0})},e.withMemo=function(e,t,n,a){let i=n[a];if(i&&To(i,e))return i;let o=t();return o.memo=e.slice(),o.cacheIndex=a,n[a]=o},e.withModifiers=(e,t)=>{if(!e)return e;let n=e._withMods||(e._withMods={}),a=t.join(".");return n[a]||(n[a]=(n,...a)=>{for(let e=0;epn,e}({}); /*! -* Quasar Framework v2.22.0 +* Quasar Framework v2.19.3 * (c) 2015-present Razvan Stoenescu * Released under the MIT License. -*/!function(e){var t=Object.defineProperty,n=(e,n)=>{let a={};for(var i in e)t(a,i,{get:e[i],enumerable:!0});return n||t(a,Symbol.toStringTag,{value:"Module"}),a};function a(e,t,n,a){return Object.defineProperty(e,t,{get:n,set:a,enumerable:!0}),e}function i(e,t){for(let n in t)a(e,n,t[n]);return e}let r,o=(0,e.ref)(!1);let s="ontouchstart"in window||window.navigator.maxTouchPoints>0;let l=navigator.userAgent||navigator.vendor||window.opera,u={has:{touch:!1,webStorage:!1},within:{iframe:!1}},c={userAgent:l,is:function(e){let t=e.toLowerCase(),n=function(e,t){let n=/(edg|edge|edga|edgios)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(vivaldi)[\/]([\w.]+)/.exec(e)||/(chrome|crios)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(e)||/(webkit)[\/]([\w.]+).*(version)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(e)||/(firefox|fxios)[\/]([\w.]+)/.exec(e)||/(webkit)[\/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[\/]([\w.]+)/.exec(e)||[];return{browser:n[5]||n[3]||n[1]||"",version:n[4]||n[2]||"0",platform:t[0]||""}}(t,function(e){return/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(silk)/.exec(e)||/(android)/.exec(e)||/(win)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||/(playbook)/.exec(e)||/(bb)/.exec(e)||/(blackberry)/.exec(e)||[]}(t)),a={mobile:!1,desktop:!1,cordova:!1,capacitor:!1,nativeMobile:!1,electron:!1,bex:!1,linux:!1,mac:!1,win:!1,cros:!1,chrome:!1,firefox:!1,opera:!1,safari:!1,vivaldi:!1,edge:!1,edgeChromium:!1,ie:!1,webkit:!1,android:!1,ios:!1,ipad:!1,iphone:!1,ipod:!1,kindle:!1,winphone:!1,blackberry:!1,playbook:!1,silk:!1};n.browser&&(a[n.browser]=!0,a.version=n.version,a.versionNumber=Number.parseInt(n.version,10)),n.platform&&(a[n.platform]=!0);let i=a.android||a.ios||a.bb||a.blackberry||a.ipad||a.iphone||a.ipod||a.kindle||a.playbook||a.silk||a["windows phone"];if(!0===i||t.includes("mobile")?a.mobile=!0:a.desktop=!0,a["windows phone"]&&(a.winphone=!0,delete a["windows phone"]),a.edga||a.edgios||a.edg?(a.edge=!0,n.browser="edge"):a.crios?(a.chrome=!0,n.browser="chrome"):a.fxios&&(a.firefox=!0,n.browser="firefox"),(a.ipod||a.ipad||a.iphone)&&(a.ios=!0),a.vivaldi&&=(n.browser="vivaldi",!0),(a.chrome||a.opr||a.safari||a.vivaldi||a.mobile&&!a.ios&&!i)&&(a.webkit=!0),a.opr&&(n.browser="opera",a.opera=!0),a.safari&&(a.blackberry||a.bb?(n.browser="blackberry",a.blackberry=!0):a.playbook?(n.browser="playbook",a.playbook=!0):a.android?(n.browser="android",a.android=!0):a.kindle?(n.browser="kindle",a.kindle=!0):a.silk&&=(n.browser="silk",!0)),a.name=n.browser,a.platform=n.platform,t.includes("electron"))a.electron=!0;else if(document.location.href.includes("-extension://"))a.bex=!0;else{if(void 0===window.Capacitor?(void 0!==window._cordovaNative||void 0!==window.cordova)&&(a.cordova=!0,a.nativeMobile=!0,a.nativeMobileWrapper="cordova"):(a.capacitor=!0,a.nativeMobile=!0,a.nativeMobileWrapper="capacitor"),o.value&&(r={is:{...a}}),s&&a.mac&&(a.desktop&&a.safari||a.nativeMobile&&!a.android&&!a.ios&&!a.ipad)){delete a.mac,delete a.desktop;let e=Math.min(window.innerHeight,window.innerWidth)>414?"ipad":"iphone";Object.assign(a,{mobile:!0,ios:!0,platform:e,[e]:!0})}!a.mobile&&window.navigator.userAgentData&&window.navigator.userAgentData.mobile&&(delete a.desktop,a.mobile=!0)}return a}(l),has:{touch:s},within:{iframe:window.self!==window.top}},d={install(t){let{$q:n}=t;o.value?(t.onSSRHydrated.push(()=>{Object.assign(n.platform,c),o.value=!1}),n.platform=(0,e.reactive)(this)):n.platform=this}};{let e;a(c.has,"webStorage",()=>{if(void 0!==e)return e;try{if(window.localStorage)return e=!0,!0}catch{}return e=!1,!1}),Object.assign(d,c),o.value&&(Object.assign(d,r,u),r=null)}function h(t){return(0,e.markRaw)((0,e.defineComponent)(t))}function p(t){return(0,e.markRaw)(t)}let f=(t,n)=>{let i=(0,e.reactive)(t);for(let e in t)a(n,e,()=>i[e],t=>{i[e]=t});return n},m={hasPassive:!1,passiveCapture:!0,notPassiveCapture:!0};try{let e=Object.defineProperty({},"passive",{get(){Object.assign(m,{hasPassive:!0,passive:{passive:!0},notPassive:{passive:!1},passiveCapture:{passive:!0,capture:!0},notPassiveCapture:{passive:!1,capture:!0}})}});window.addEventListener("qtest",null,e),window.removeEventListener("qtest",null,e)}catch{}function _(){}function g(e){return 0===e.button}function v(e){return e.touches&&e.touches[0]?e=e.touches[0]:e.changedTouches&&e.changedTouches[0]?e=e.changedTouches[0]:e.targetTouches&&e.targetTouches[0]&&(e=e.targetTouches[0]),{top:e.clientY,left:e.clientX}}function b(e){e.stopPropagation()}function y(e){!1!==e.cancelable&&e.preventDefault()}function w(e){!1!==e.cancelable&&e.preventDefault(),e.stopPropagation()}function k(e,t){if(void 0===e||t&&e.__dragPrevented)return;let n=t?e=>{e.__dragPrevented=!0,e.addEventListener("dragstart",y,m.notPassiveCapture)}:e=>{delete e.__dragPrevented,e.removeEventListener("dragstart",y,m.notPassiveCapture)};e.querySelectorAll("a, img").forEach(n)}function x(e,t,n){let a=`__q_${t}_evt`;e[a]=[...e[a]??[],...n],n.forEach(t=>{t[0].addEventListener(t[1],e[t[2]],m[t[3]])})}function S(e,t){let n=`__q_${t}_evt`;void 0!==e[n]&&(e[n].forEach(t=>{t[0].removeEventListener(t[1],e[t[2]],m[t[3]])}),e[n]=void 0)}var C={listenOpts:m,leftClick:g,middleClick:function(e){return 1===e.button},rightClick:function(e){return 2===e.button},position:v,getEventPath:function(e){if(e.path)return e.path;if(e.composedPath)return e.composedPath();let t=[],n=e.target;for(;n;){if(t.push(n),"HTML"===n.tagName)return t.push(document,window),t;n=n.parentElement}},getMouseWheelDistance:function(e){let t=e.deltaX,n=e.deltaY;if((t||n)&&e.deltaMode){let a=1===e.deltaMode?40:800;t*=a,n*=a}return e.shiftKey&&!t&&([n,t]=[t,n]),{x:t,y:n}},stop:b,prevent:y,stopAndPrevent:w,preventDraggable:k};function T(e,t=250,n){let a=null;function i(...i){null===a?n&&e.apply(this,i):clearTimeout(a),a=setTimeout(()=>{a=null,n||e.apply(this,i)},t)}return i.cancel=()=>{null!==a&&clearTimeout(a)},i}let P=["sm","md","lg","xl"],{passive:E}=m;var A=f({width:0,height:0,name:"xs",sizes:{sm:600,md:1024,lg:1440,xl:1920},lt:{sm:!0,md:!0,lg:!0,xl:!0},gt:{xs:!1,sm:!1,md:!1,lg:!1},xs:!0,sm:!1,md:!1,lg:!1,xl:!1},{setSizes:_,setDebounce:_,install({$q:e,onSSRHydrated:t}){if(e.screen=this,this.__installed)return void(void 0!==e.config.screen&&(e.config.screen.bodyClasses?this.__update(!0):document.body.classList.remove(`screen--${this.name}`)));let{visualViewport:n}=window,a=n||window,i=document.scrollingElement||document.documentElement,r=void 0===n||c.is.mobile?()=>[Math.max(window.innerWidth,i.clientWidth),Math.max(window.innerHeight,i.clientHeight)]:()=>[n.width*n.scale+window.innerWidth-i.clientWidth,n.height*n.scale+window.innerHeight-i.clientHeight],s=!0===e.config.screen?.bodyClasses;this.__update=e=>{let[t,n]=r();if(n!==this.height&&(this.height=n),t!==this.width)this.width=t;else if(!0!==e)return;let a=this.sizes;this.gt.xs=t>=a.sm,this.gt.sm=t>=a.md,this.gt.md=t>=a.lg,this.gt.lg=t>=a.xl,this.lt.sm=t{P.forEach(t=>{void 0!==e[t]&&(u[t]=e[t])})},this.setDebounce=e=>{d=e};let h=()=>{let e=getComputedStyle(document.body);e.getPropertyValue("--q-size-sm")&&P.forEach(t=>{this.sizes[t]=Number.parseInt(e.getPropertyValue(`--q-size-${t}`),10)}),this.setSizes=e=>{P.forEach(t=>{e[t]&&(this.sizes[t]=e[t])}),this.__update(!0)},this.setDebounce=e=>{void 0!==l&&a.removeEventListener("resize",l,E),l=e>0?T(this.__update,e):this.__update,a.addEventListener("resize",l,E)},this.setDebounce(d),0===Object.keys(u).length?this.__update():(this.setSizes(u),u=void 0),s&&"xs"===this.name&&document.body.classList.add("screen--xs")};o.value?t.push(h):h()}});let L=f({isActive:!1,mode:!1},{__media:void 0,set(e){L.mode=e,"auto"===e?(void 0===L.__media&&(L.__media=window.matchMedia("(prefers-color-scheme: dark)"),L.__updateMedia=()=>{L.set("auto")},L.__media.addListener(L.__updateMedia)),e=L.__media.matches):void 0!==L.__media&&(L.__media.removeListener(L.__updateMedia),L.__media=void 0),L.isActive=!0===e,document.body.classList.remove("body--"+(!0===e?"light":"dark")),document.body.classList.add("body--"+(!0===e?"dark":"light"))},toggle(){L.set(!L.isActive)},install({$q:e,ssrContext:t}){let n=e.config.dark;e.dark=this,this.__installed||this.set(void 0!==n&&n)}});function M(e,t,n=document.body){if("string"!=typeof e)throw TypeError("Expected a string as propName");if("string"!=typeof t)throw TypeError("Expected a string as value");if(!(n instanceof Element))throw TypeError("Expected a DOM element");n.style.setProperty(`--q-${e}`,t)}let R=!1;function z(e){R=!0===e.isComposing}function I(e){return R||e!==Object(e)||e.isComposing||e.qKeyEvent}function N(e,t){return!I(e)&&[t].flat().includes(e.keyCode)}function O(e){return e.ios?"ios":e.android?"android":void 0}var j={install(e){if(!this.__installed){if(o.value)!function(){let{is:e}=c,t=document.body.className,n=new Set(t.replaceAll(/ {2}/g," ").split(" "));if(!e.nativeMobile&&!e.electron&&!e.bex)if(e.desktop)n.delete("mobile"),n.delete("platform-ios"),n.delete("platform-android"),n.add("desktop");else if(e.mobile){n.delete("desktop"),n.add("mobile"),n.delete("platform-ios"),n.delete("platform-android");let t=O(e);void 0!==t&&n.add(`platform-${t}`)}c.has.touch&&(n.delete("no-touch"),n.add("touch")),c.within.iframe&&n.add("within-iframe");let a=[...n].join(" ");t!==a&&(document.body.className=a)}();else{let{$q:t}=e;void 0!==t.config.brand&&function(e){for(let t in e)M(t,e[t])}(t.config.brand),document.body.classList.add(...function({is:e,has:t,within:n},a){let i=[e.desktop?"desktop":"mobile",(t.touch?"":"no-")+"touch"];if(e.mobile){let t=O(e);void 0!==t&&i.push("platform-"+t)}if(e.nativeMobile){let t=e.nativeMobileWrapper;i.push(t,"native-mobile"),e.ios&&(void 0===a[t]||a[t].iosStatusBarPadding)&&i.push("q-ios-padding")}else e.electron?i.push("electron"):e.bex&&i.push("bex");return n.iframe&&i.push("within-iframe"),i}(c,t.config))}c.is.ios&&document.body.addEventListener("touchstart",_),window.addEventListener("keydown",z,!0)}}};let D=()=>!0;function q(e){return"string"==typeof e&&""!==e&&"/"!==e&&"#/"!==e}function B(e){return e.startsWith("#")&&(e=e.slice(1)),e.startsWith("/")||(e="/"+e),e.endsWith("/")&&(e=e.slice(0,-1)),"#"+e}var F={__history:[],add:_,remove:_,install({$q:e}){if(this.__installed)return;let{cordova:t,capacitor:n}=c.is;if(!t&&!n)return;let a=e.config[t?"cordova":"capacitor"];if(!1===a?.backButton||n&&(void 0===window.Capacitor||void 0===window.Capacitor.Plugins.App))return;this.add=e=>{void 0===e.condition&&(e.condition=D),this.__history.push(e)},this.remove=e=>{let t=this.__history.indexOf(e);-1!==t&&this.__history.splice(t,1)};let i=function(e){if(!1===e.backButtonExit)return()=>!1;if("*"===e.backButtonExit)return D;let t=["#/"];return Array.isArray(e.backButtonExit)&&t.push(...e.backButtonExit.filter(q).map(B)),()=>t.includes(window.location.hash)}({backButtonExit:!0,...a}),r=()=>{if(0!==this.__history.length){let e=this.__history.at(-1);e.condition()&&(this.__history.pop(),e.handler())}else i()?navigator.app.exitApp():window.history.back()};t?document.addEventListener("deviceready",()=>{document.addEventListener("backbutton",r,!1)}):window.Capacitor.Plugins.App.addListener("backButton",r)}},V={isoName:"en-US",nativeName:"English (US)",label:{clear:"Clear",ok:"OK",cancel:"Cancel",close:"Close",set:"Set",select:"Select",reset:"Reset",remove:"Remove",update:"Update",create:"Create",search:"Search",filter:"Filter",refresh:"Refresh",expand:e=>e?`Expand "${e}"`:"Expand",collapse:e=>e?`Collapse "${e}"`:"Collapse"},date:{days:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),daysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),firstDayOfWeek:0,format24h:!1,pluralDay:"days",prevMonth:"Previous month",nextMonth:"Next month",prevYear:"Previous year",nextYear:"Next year",today:"Today",prevRangeYears:e=>`Previous ${e} years`,nextRangeYears:e=>`Next ${e} years`},table:{noData:"No data available",noResults:"No matching records found",loading:"Loading...",selectedRecords:e=>1===e?"1 record selected.":(0===e?"No":e)+" records selected.",recordsPerPage:"Records per page:",allRows:"All",pagination:(e,t,n)=>e+"–"+t+" of "+n,columns:"Columns"},pagination:{first:"First page",prev:"Previous page",next:"Next page",last:"Last page"},editor:{url:"URL",bold:"Bold",italic:"Italic",strikethrough:"Strikethrough",underline:"Underline",unorderedList:"Unordered List",orderedList:"Ordered List",subscript:"Subscript",superscript:"Superscript",hyperlink:"Hyperlink",toggleFullscreen:"Toggle Fullscreen",quote:"Quote",left:"Left align",center:"Center align",right:"Right align",justify:"Justify align",print:"Print",outdent:"Decrease indentation",indent:"Increase indentation",removeFormat:"Remove formatting",formatting:"Formatting",fontSize:"Font Size",align:"Align",hr:"Insert Horizontal Rule",undo:"Undo",redo:"Redo",heading1:"Heading 1",heading2:"Heading 2",heading3:"Heading 3",heading4:"Heading 4",heading5:"Heading 5",heading6:"Heading 6",paragraph:"Paragraph",code:"Code",size1:"Very small",size2:"A bit small",size3:"Normal",size4:"Medium-large",size5:"Big",size6:"Very big",size7:"Maximum",defaultFont:"Default Font",viewSource:"View Source"},tree:{noNodes:"No nodes available",noResults:"No matching nodes found"}};function U(){let e=Array.isArray(navigator.languages)&&0!==navigator.languages.length?navigator.languages[0]:navigator.language;if("string"==typeof e)return e.split(/[-_]/).map((e,t)=>0===t?e.toLowerCase():t>1||e.length<4?e.toUpperCase():e[0].toUpperCase()+e.slice(1).toLowerCase()).join("-")}let $=f({__qLang:{}},{getLocale:U,set(e=V,t){let n={...e,rtl:!0===e.rtl,getLocale:U};if(n.set=$.set,void 0===$.__langConfig||!$.__langConfig.noHtmlAttrs){let e=document.documentElement;e.setAttribute("dir",n.rtl?"rtl":"ltr"),e.setAttribute("lang",n.isoName)}Object.assign($.__qLang,n)},install({$q:e,lang:t,ssrContext:n}){e.lang=$.__qLang,$.__langConfig=e.config.lang,this.__installed?void 0!==t&&this.set(t):(this.props=new Proxy(this.__qLang,{get:Reflect.get,ownKeys:e=>Reflect.ownKeys(e).filter(e=>"set"!==e&&"getLocale"!==e)}),this.set(t||V))}});var H={name:"material-icons",type:{positive:"check_circle",negative:"warning",info:"info",warning:"priority_high"},arrow:{up:"arrow_upward",right:"arrow_forward",down:"arrow_downward",left:"arrow_back",dropdown:"arrow_drop_down"},chevron:{left:"chevron_left",right:"chevron_right"},colorPicker:{spectrum:"gradient",tune:"tune",palette:"style"},pullToRefresh:{icon:"refresh"},carousel:{left:"chevron_left",right:"chevron_right",up:"keyboard_arrow_up",down:"keyboard_arrow_down",navigationIcon:"lens"},chip:{remove:"cancel",selected:"check"},datetime:{arrowLeft:"chevron_left",arrowRight:"chevron_right",now:"access_time",today:"today"},editor:{bold:"format_bold",italic:"format_italic",strikethrough:"strikethrough_s",underline:"format_underlined",unorderedList:"format_list_bulleted",orderedList:"format_list_numbered",subscript:"vertical_align_bottom",superscript:"vertical_align_top",hyperlink:"link",toggleFullscreen:"fullscreen",quote:"format_quote",left:"format_align_left",center:"format_align_center",right:"format_align_right",justify:"format_align_justify",print:"print",outdent:"format_indent_decrease",indent:"format_indent_increase",removeFormat:"format_clear",formatting:"text_format",fontSize:"format_size",align:"format_align_left",hr:"remove",undo:"undo",redo:"redo",heading:"format_size",code:"code",size:"format_size",font:"font_download",viewSource:"code"},expansionItem:{icon:"keyboard_arrow_down",denseIcon:"arrow_drop_down"},fab:{icon:"add",activeIcon:"close"},field:{clear:"cancel",error:"error"},pagination:{first:"first_page",prev:"keyboard_arrow_left",next:"keyboard_arrow_right",last:"last_page"},rating:{icon:"grade"},stepper:{done:"check",active:"edit",error:"warning"},tabs:{left:"chevron_left",right:"chevron_right",up:"keyboard_arrow_up",down:"keyboard_arrow_down"},table:{arrowUp:"arrow_upward",warning:"warning",firstPage:"first_page",prevPage:"chevron_left",nextPage:"chevron_right",lastPage:"last_page"},tree:{icon:"play_arrow"},uploader:{done:"done",clear:"clear",add:"add_box",upload:"cloud_upload",removeQueue:"clear_all",removeUploaded:"done_all"}};let W=f({iconMapFn:null,__qIconSet:{}},{set(e,t){let n={...e};n.set=W.set,Object.assign(W.__qIconSet,n)},install({$q:e,iconSet:t,ssrContext:n}){void 0!==e.config.iconMapFn&&(this.iconMapFn=e.config.iconMapFn),e.iconSet=this.__qIconSet,a(e,"iconMapFn",()=>this.iconMapFn,e=>{this.iconMapFn=e}),this.__installed?void 0!==t&&this.set(t):(this.props=new Proxy(this.__qIconSet,{get:Reflect.get,ownKeys:e=>Reflect.ownKeys(e).filter(e=>"set"!==e)}),this.set(t||H))}}),G="_q_t_",K="_q_s_",Y="_q_l_",Q="_q_f_",Z="_q_fo_",J="_q_tabs_",X="_q_u_";function ee(){}function te(e,t){if(e===t)return!0;if(null!==e&&null!==t&&"object"==typeof e&&"object"==typeof t){if(e.constructor!==t.constructor)return!1;let n,a;if(e.constructor===Array){if(n=e.length,n!==t.length)return!1;for(a=n;0!==a--;)if(!te(e[a],t[a]))return!1;return!0}if(e.constructor===Map){if(e.size!==t.size)return!1;let n=e.entries();for(a=n.next();!a.done;){if(!t.has(a.value[0]))return!1;a=n.next()}for(n=e.entries(),a=n.next();!a.done;){if(!te(a.value[1],t.get(a.value[0])))return!1;a=n.next()}return!0}if(e.constructor===Set){if(e.size!==t.size)return!1;let n=e.entries();for(a=n.next();!a.done;){if(!t.has(a.value[0]))return!1;a=n.next()}return!0}if(null!=e.buffer&&e.buffer.constructor===ArrayBuffer){if(n=e.length,n!==t.length)return!1;for(a=n;0!==a--;)if(e[a]!==t[a])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();let i=Object.keys(e).filter(t=>void 0!==e[t]);if(n=i.length,n!==Object.keys(t).filter(e=>void 0!==t[e]).length)return!1;for(a=n;0!==a--;){let n=i[a];if(!te(e[n],t[n]))return!1}return!0}return e!=e&&t!=t}function ne(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function ae(e){return"[object Date]"===Object.prototype.toString.call(e)}function ie(e){return"[object RegExp]"===Object.prototype.toString.call(e)}function re(e){return"number"==typeof e&&Number.isFinite(e)}var oe={deepEqual:te,object:ne,date:ae,regexp:ie,number:re};let se={},le=!1;let ue=[d,j,L,A,F,$,W];function ce(t,n){let a=(0,e.createApp)(t);a.config.globalProperties=n.config.globalProperties;let{reload:i,...r}=n._context;return Object.assign(a._context,r),a}function de(e,t){t.forEach(t=>{t.install(e),t.__installed=!0})}var he=function(e,t={}){let n={version:"2.22.0"};le?n.config=t.config||{}:(void 0!==t.config&&Object.assign(se,t.config),n.config={...se},le=!0),function(e,t,n){e.config.globalProperties.$q=n.$q,e.provide("_q_",n.$q),de(n,ue),void 0!==t.components&&Object.values(t.components).forEach(t=>{ne(t)&&void 0!==t.name&&e.component(t.name,t)}),void 0!==t.directives&&Object.values(t.directives).forEach(t=>{ne(t)&&void 0!==t.name&&e.directive(t.name,t)}),void 0!==t.plugins&&de(n,Object.values(t.plugins).filter(e=>"function"==typeof e.install&&!ue.includes(e))),o.value&&(n.$q.onSSRHydrated=()=>{n.onSSRHydrated.forEach(e=>{e()}),n.$q.onSSRHydrated=()=>{}})}(e,t,{parentApp:e,$q:n,lang:t.lang,iconSet:t.iconSet,onSSRHydrated:[]})};let pe=["B","KB","MB","GB","TB","PB"];function fe(e,t=1){let n=0;for(;Number.parseInt(e,10)>=1024&&nke.includes(e)},size:{type:String,default:"2px"},color:String,skipHijack:Boolean,reverse:Boolean,hijackFilter:Function},emits:["start","stop"],setup(t,{emit:n}){let a,{proxy:i}=(0,e.getCurrentInstance)(),r=(0,e.ref)(0),o=(0,e.ref)(!1),s=(0,e.ref)(!0),l=0,u=null,c=(0,e.computed)(()=>`q-loading-bar q-loading-bar--${t.position}`+(void 0===t.color?"":` bg-${t.color}`)+(s.value?"":" no-transition")),d=(0,e.computed)(()=>"top"===t.position||"bottom"===t.position),h=(0,e.computed)(()=>d.value?"height":"width"),p=(0,e.computed)(()=>{let e=o.value,n=function({p:e,pos:t,active:n,horiz:a,reverse:i,dir:r}){let o=1,s=1;return a?(i&&(o=-1),"bottom"===t&&(s=-1),{transform:`translate3d(${o*(e-100)}%,${n?0:-200*s}%,0)`}):(i&&(s=-1),"right"===t&&(o=-1),{transform:`translate3d(${n?0:r*o*-200}%,${s*(e-100)}%,0)`})}({p:r.value,pos:t.position,active:e,horiz:d.value,reverse:i.$q.lang.rtl&&["top","bottom"].includes(t.position)?!t.reverse:t.reverse,dir:i.$q.lang.rtl?-1:1});return n[h.value]=t.size,n.opacity=+!!e,n}),f=(0,e.computed)(()=>o.value?{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":r.value}:{"aria-hidden":"true"});function m(e=300){let t=a;return a=Math.max(0,e)||0,l++,l>1?(0===t&&e>0?v():null!==u&&t>0&&e<=0&&(clearTimeout(u),u=null),l):(null!==u&&clearTimeout(u),n("start"),r.value=0,u=setTimeout(()=>{u=null,s.value=!0,e>0&&v()},!0===o._value?500:1),!0!==o._value&&(o.value=!0,s.value=!1),l)}function _(e){return l>0&&(r.value=function(e,t){return"number"!=typeof t&&(t=e<25?3*Math.random()+3:e<65?3*Math.random():e<85?2*Math.random():e<99?.6:0),_e(e+t,0,100)}(r.value,e)),l}function g(){if(l=Math.max(0,l-1),l>0)return l;null!==u&&(clearTimeout(u),u=null),n("stop");let e=()=>{s.value=!0,r.value=100,u=setTimeout(()=>{u=null,o.value=!1},1e3)};return 0===r.value?u=setTimeout(e,1):e(),l}function v(){r.value<100&&(u=setTimeout(()=>{u=null,_(),v()},a))}let b=!1;return(0,e.onMounted)(()=>{t.skipHijack||(b=!0,function(e){Se++,xe.push(e),!(Se>1)&&(ye.prototype.open=function(e,t,...n){let a=[];this.addEventListener("loadstart",()=>{xe.forEach(e=>{(null===e.hijackFilter.value||e.hijackFilter.value(t))&&(e.start(),a.push(e.stop))})},{once:!0}),this.addEventListener("loadend",()=>{a.forEach(e=>{e()})},{once:!0}),we.call(this,e,t,...n)})}({start:m,stop:g,hijackFilter:(0,e.computed)(()=>t.hijackFilter||null)}))}),(0,e.onBeforeUnmount)(()=>{null!==u&&clearTimeout(u),b&&function(e){xe=xe.filter(t=>t.start!==e),Se=Math.max(0,Se-1),0===Se&&(ye.prototype.open=we)}(m)}),Object.assign(i,{start:m,stop:g,increment:_}),()=>(0,e.h)("div",{class:c.value,style:p.value,...f.value})}});let Te={xs:18,sm:24,md:32,lg:38,xl:46},Pe={size:String};function Ee(t,n=Te){return(0,e.computed)(()=>void 0===t.size?null:{fontSize:t.size in n?`${n[t.size]}px`:t.size})}function Ae(e,t){return void 0===e?t:e()||t}function Le(e,t){if(void 0!==e){let t=e();if(null!=t)return[...t]}return t}function Me(e,t){return void 0===e?t:t.concat(e())}function Re(e,t){return void 0===e?t:void 0===t?e():t.concat(e())}function ze(t,n,a,i,r,o){n.key=i+r;let s=(0,e.h)(t,n,a);return r?(0,e.withDirectives)(s,o()):s}let Ie="0 0 24 24",Ne=e=>e,Oe=e=>`ionicons ${e}`,je={"mdi-":e=>`mdi ${e}`,"icon-":Ne,"bt-":e=>`bt ${e}`,"eva-":e=>`eva ${e}`,"ion-md":Oe,"ion-ios":Oe,"ion-logo":Oe,"iconfont ":Ne,"ti-":e=>`themify-icon ${e}`,"bi-":e=>`bootstrap-icons ${e}`,"i-":Ne},De={o_:"-outlined",r_:"-round",s_:"-sharp"},qe={sym_o_:"-outlined",sym_r_:"-rounded",sym_s_:"-sharp"},Be=RegExp("^("+Object.keys(je).join("|")+")"),Fe=RegExp("^("+Object.keys(De).join("|")+")"),Ve=RegExp("^("+Object.keys(qe).join("|")+")"),Ue=/^[Mm]\s?[-+]?\.?\d/,$e=/^img:/,He=/^svguse:/,We=/^ion-/,Ge=/^(fa-(classic|sharp|solid|regular|light|brands|duotone|thin)|[lf]a[srlbdk]?) /;var Ke=h({name:"QIcon",props:{...Pe,tag:{type:String,default:"i"},name:String,color:String,left:Boolean,right:Boolean},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=Ee(t),r=(0,e.computed)(()=>"q-icon"+(t.left?" on-left":"")+(t.right?" on-right":"")+(void 0===t.color?"":` text-${t.color}`)),o=(0,e.computed)(()=>{let n,i=t.name;if("none"===i||!i)return{none:!0};if(null!==a.iconMapFn){let e=a.iconMapFn(i);if(void 0!==e){if(void 0===e.icon)return{cls:e.cls,content:void 0===e.content?" ":e.content};if(i=e.icon,"none"===i||!i)return{none:!0}}}if(Ue.test(i)){let[t,n=Ie]=i.split("|");return{svg:!0,viewBox:n,nodes:t.split("&&").map(t=>{let[n,a,i]=t.split("@@");return(0,e.h)("path",{style:a,d:n,transform:i})})}}if($e.test(i))return{img:!0,src:i.slice(4)};if(He.test(i)){let[e,t=Ie]=i.split("|");return{svguse:!0,src:e.slice(7),viewBox:t}}let r=" ",o=i.match(Be);if(null!==o)n=je[o[1]](i);else if(Ge.test(i))n=i;else if(We.test(i))n=`ionicons ion-${a.platform.is.ios?"ios":"md"}${i.slice(3)}`;else if(Ve.test(i)){n="notranslate material-symbols";let e=i.match(Ve);null!==e&&(i=i.slice(6),n+=qe[e[1]]),r=i}else{n="notranslate material-icons";let e=i.match(Fe);null!==e&&(i=i.slice(2),n+=De[e[1]]),r=i}return{cls:n,content:r}});return()=>{let a={class:r.value,style:i.value,"aria-hidden":"true"};return o.value.none?(0,e.h)(t.tag,a,Ae(n.default)):o.value.img?(0,e.h)(t.tag,a,Me(n.default,[(0,e.h)("img",{src:o.value.src})])):o.value.svg?(0,e.h)(t.tag,a,Me(n.default,[(0,e.h)("svg",{viewBox:o.value.viewBox||"0 0 24 24"},o.value.nodes)])):o.value.svguse?(0,e.h)(t.tag,a,Me(n.default,[(0,e.h)("svg",{viewBox:o.value.viewBox},[(0,e.h)("use",{"xlink:href":o.value.src})])])):(void 0!==o.value.cls&&(a.class+=" "+o.value.cls),(0,e.h)(t.tag,a,Me(n.default,[o.value.content])))}}}),Ye=h({name:"QAvatar",props:{...Pe,fontSize:String,color:String,textColor:String,icon:String,square:Boolean,rounded:Boolean},setup(t,{slots:n}){let a=Ee(t),i=(0,e.computed)(()=>"q-avatar"+(t.color?` bg-${t.color}`:"")+(t.textColor?` text-${t.textColor} q-chip--colored`:"")+(t.square?" q-avatar--square":t.rounded?" rounded-borders":"")),r=(0,e.computed)(()=>t.fontSize?{fontSize:t.fontSize}:null);return()=>{let o=void 0===t.icon?void 0:[(0,e.h)(Ke,{name:t.icon})];return(0,e.h)("div",{class:i.value,style:a.value},[(0,e.h)("div",{class:"q-avatar__content row flex-center overflow-hidden",style:r.value},Re(n.default,o))])}}});let Qe=["top","middle","bottom"];var Ze=h({name:"QBadge",props:{color:String,textColor:String,floating:Boolean,transparent:Boolean,multiLine:Boolean,outline:Boolean,rounded:Boolean,label:[Number,String],align:{type:String,validator:e=>Qe.includes(e)}},setup(t,{slots:n}){let a=(0,e.computed)(()=>void 0===t.align?null:{verticalAlign:t.align}),i=(0,e.computed)(()=>{let e=t.outline&&t.color||t.textColor;return`q-badge flex inline items-center no-wrap q-badge--${t.multiLine?"multi":"single"}-line`+(t.outline?" q-badge--outline":void 0===t.color?"":` bg-${t.color}`)+(void 0===e?"":` text-${e}`)+(t.floating?" q-badge--floating":"")+(t.rounded?" q-badge--rounded":"")+(t.transparent?" q-badge--transparent":"")});return()=>(0,e.h)("div",{class:i.value,style:a.value,role:"status","aria-label":t.label},Me(n.default,void 0===t.label?[]:[t.label]))}});let Je={dark:{type:Boolean,default:null}};function Xe(t,n){return(0,e.computed)(()=>null===t.dark?n.dark.isActive:t.dark)}var et=h({name:"QBanner",props:{...Je,inlineActions:Boolean,dense:Boolean,rounded:Boolean},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=Xe(t,a),r=(0,e.computed)(()=>"q-banner row items-center"+(t.dense?" q-banner--dense":"")+(i.value?" q-banner--dark q-dark":"")+(t.rounded?" rounded-borders":"")),o=(0,e.computed)(()=>"q-banner__actions row items-center justify-end col-"+(t.inlineActions?"auto":"all"));return()=>{let a=[(0,e.h)("div",{class:"q-banner__avatar col-auto row items-center self-start"},Ae(n.avatar)),(0,e.h)("div",{class:"q-banner__content col text-body2"},Ae(n.default))],i=Ae(n.action);return void 0!==i&&a.push((0,e.h)("div",{class:o.value},i)),(0,e.h)("div",{class:r.value+(t.inlineActions||void 0===i?"":" q-banner--top-padding"),role:"alert"},a)}}}),tt=h({name:"QBar",props:{...Je,dense:Boolean},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=Xe(t,a),r=(0,e.computed)(()=>`q-bar row no-wrap items-center q-bar--${t.dense?"dense":"standard"} q-bar--${i.value?"dark":"light"}`);return()=>(0,e.h)("div",{class:r.value,role:"toolbar"},Ae(n.default))}});let nt={left:"start",center:"center",right:"end",between:"between",around:"around",evenly:"evenly",stretch:"stretch"},at=Object.keys(nt),it={align:{type:String,validator:e=>at.includes(e)}};function rt(t){return(0,e.computed)(()=>{let e=void 0===t.align?t.vertical?"stretch":"left":t.align;return`${t.vertical?"items":"justify"}-${nt[e]}`})}function ot(e){if(Object(e.$parent)===e.$parent)return e.$parent;let{parent:t}=e.$;for(;Object(t)===t;){if(Object(t.proxy)===t.proxy)return t.proxy;t=t.parent}}function st(e,t){"symbol"==typeof t.type?Array.isArray(t.children)&&t.children.forEach(t=>{st(e,t)}):e.add(t)}function lt(e){let t=new Set;return e.forEach(e=>{st(t,e)}),[...t]}function ut(e){return void 0!==e.appContext.config.globalProperties.$router}function ct(e){return!0===e.isUnmounted||!0===e.isDeactivated}let dt=["",!0];var ht=h({name:"QBreadcrumbs",props:{...it,separator:{type:String,default:"/"},separatorColor:String,activeColor:{type:String,default:"primary"},gutter:{type:String,validator:e=>["none","xs","sm","md","lg","xl"].includes(e),default:"sm"}},setup(t,{slots:n}){let a=rt(t),i=(0,e.computed)(()=>`flex items-center ${a.value}${"none"===t.gutter?"":` q-gutter-${t.gutter}`}`),r=(0,e.computed)(()=>t.separatorColor?` text-${t.separatorColor}`:""),o=(0,e.computed)(()=>` text-${t.activeColor}`);return()=>{if(void 0===n.default)return;let a=lt(Ae(n.default));if(0===a.length)return;let s=1,l=[],u=a.filter(e=>"QBreadcrumbsEl"===e.type?.name).length,c=void 0===n.separator?()=>t.separator:n.separator;return a.forEach(t=>{if("QBreadcrumbsEl"===t.type?.name){let n=se===t[n]):1===e.length&&e[0]===t}function _t(e,t){return Array.isArray(e)?mt(e,t):Array.isArray(t)?mt(t,e):e===t}let gt={to:[String,Object],replace:Boolean,href:String,target:String,disable:Boolean},vt={...gt,exact:Boolean,activeClass:{type:String,default:"q-router-link--active"},exactActiveClass:{type:String,default:"q-router-link--exact-active"}};function bt({fallbackTag:t,useDisableForRouterLinkProps:n=!0}={}){let a=(0,e.getCurrentInstance)(),{props:i,proxy:r,emit:o}=a,s=ut(a),l=(0,e.computed)(()=>!i.disable&&void 0!==i.href),u=n?(0,e.computed)(()=>s&&!i.disable&&!l.value&&void 0!==i.to&&null!==i.to&&""!==i.to):(0,e.computed)(()=>s&&!l.value&&void 0!==i.to&&null!==i.to&&""!==i.to),c=(0,e.computed)(()=>u.value?b(i.to):null),d=(0,e.computed)(()=>null!==c.value),h=(0,e.computed)(()=>l.value||d.value),p=(0,e.computed)(()=>"a"===i.type||h.value?"a":i.tag||t||"div"),f=(0,e.computed)(()=>l.value?{href:i.href,target:i.target}:d.value?{href:c.value.href,target:i.target}:{}),m=(0,e.computed)(()=>{if(!d.value)return-1;let{matched:e}=c.value,{length:t}=e,n=e[t-1];if(void 0===n)return-1;let a=r.$route.matched;if(0===a.length)return-1;let i=a.findIndex(ft.bind(null,n));if(-1!==i)return i;let o=pt(e[t-2]);return t>1&&pt(n)===o&&a.at(-1).path!==o?a.findIndex(ft.bind(null,e[t-2])):i}),_=(0,e.computed)(()=>d.value&&-1!==m.value&&function(e,t){for(let n in t){let a=t[n],i=e[n];if("string"==typeof a){if(a!==i)return!1}else if(!Array.isArray(i)||i.length!==a.length||a.some((e,t)=>e!==i[t]))return!1}return!0}(r.$route.params,c.value.params)),g=(0,e.computed)(()=>_.value&&m.value===r.$route.matched.length-1&&function(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(!_t(e[n],t[n]))return!1;return!0}(r.$route.params,c.value.params)),v=(0,e.computed)(()=>d.value?g.value?` ${i.exactActiveClass} ${i.activeClass}`:i.exact?"":_.value?` ${i.activeClass}`:"":"");function b(e){try{return r.$router.resolve(e)}catch{}return null}function y(e,{returnRouterError:t,to:n=i.to,replace:a=i.replace}={}){if(i.disable)return e.preventDefault(),Promise.resolve(!1);if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||void 0!==e.button&&0!==e.button||"_blank"===i.target)return Promise.resolve(!1);e.preventDefault();let o=r.$router[a?"replace":"push"](n);return t?o:o.then(()=>{}).catch(()=>{})}return{hasRouterLink:d,hasHrefLink:l,hasLink:h,linkTag:p,resolvedLink:c,linkIsActive:_,linkIsExactActive:g,linkClass:v,linkAttrs:f,getLink:b,navigateToRouterLink:y,navigateOnClick:function(e){if(d.value){let t=t=>y(e,t);o("click",e,t),e.defaultPrevented||t()}else o("click",e)}}}var yt=h({name:"QBreadcrumbsEl",props:{...vt,label:String,icon:String,tag:{type:String,default:"span"}},emits:["click"],setup(t,{slots:n}){let{linkTag:a,linkAttrs:i,linkClass:r,navigateOnClick:o}=bt(),s=(0,e.computed)(()=>({class:"q-breadcrumbs__el q-link flex inline items-center relative-position "+(t.disable?"q-breadcrumbs__el--disable":"q-link--focusable"+r.value),...i.value,onClick:o})),l=(0,e.computed)(()=>"q-breadcrumbs__el-icon"+(void 0===t.label?"":" q-breadcrumbs__el-icon--with-label"));return()=>{let i=[];return void 0!==t.icon&&i.push((0,e.h)(Ke,{class:l.value,name:t.icon})),void 0!==t.label&&i.push(t.label),(0,e.h)(a.value,{...s.value},Me(n.default,i))}}});let wt={size:{type:[String,Number],default:"1em"},color:String};function kt(t){return{cSize:(0,e.computed)(()=>t.size in Te?`${Te[t.size]}px`:t.size),classes:(0,e.computed)(()=>"q-spinner"+(t.color?` text-${t.color}`:""))}}var xt=h({name:"QSpinner",props:{...wt,thickness:{type:Number,default:5}},setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value+" q-spinner-mat",width:n.value,height:n.value,viewBox:"25 25 50 50"},[(0,e.h)("circle",{class:"path",cx:"50",cy:"50",r:"20",fill:"none",stroke:"currentColor","stroke-width":t.thickness,"stroke-miterlimit":"10"})])}});function St(e){if(e===window)return{top:0,left:0};let{top:t,left:n}=e.getBoundingClientRect();return{top:t,left:n}}function Ct(e){return e===window?window.innerHeight:e.getBoundingClientRect().height}function Tt(e,t){let n=e.style;for(let e in t)n[e]=t[e]}function Pt(t){if(null==t)return;if("string"==typeof t)try{return document.querySelector(t)||void 0}catch{return}let n=(0,e.unref)(t);return n?n.$el||n:void 0}function Et(e,t){if(null==e||e.contains(t))return!0;for(let n=e.nextElementSibling;null!==n;n=n.nextElementSibling)if(n.contains(t))return!0;return!1}var At={offset:St,style:function(e,t){return window.getComputedStyle(e).getPropertyValue(t)},height:Ct,width:function(e){return e===window?window.innerWidth:e.getBoundingClientRect().width},css:Tt,cssBatch:function(e,t){e.forEach(e=>Tt(e,t))},ready:function(e){if("function"==typeof e){if("loading"!==document.readyState)return e();document.addEventListener("DOMContentLoaded",e,!1)}}};function Lt(e,t=250){let n,a=!1;return function(...i){return a||(a=!0,setTimeout(()=>{a=!1},t),n=e.apply(this,i)),n}}function Mt(e,t,n,a){n.modifiers.stop&&b(e);let i=n.modifiers.color,r=n.modifiers.center||!0===a,o=document.createElement("span"),s=document.createElement("span"),l=v(e),{left:u,top:c,width:d,height:h}=t.getBoundingClientRect(),p=Math.hypot(d,h),f=p/2,m=(d-p)/2+"px",_=r?m:l.left-u-f+"px",g=(h-p)/2+"px",y=r?g:l.top-c-f+"px";s.className="q-ripple__inner",Tt(s,{height:`${p}px`,width:`${p}px`,transform:`translate3d(${_},${y},0) scale3d(.2,.2,1)`,opacity:0}),o.className="q-ripple"+(i?" text-"+i:""),o.setAttribute("dir","ltr"),o.append(s),t.append(o);let w=()=>{o.remove(),clearTimeout(k)};n.abort.push(w);let k=setTimeout(()=>{s.classList.add("q-ripple__inner--enter"),s.style.transform=`translate3d(${m},${g},0) scale3d(1,1,1)`,s.style.opacity=.2,k=setTimeout(()=>{s.classList.remove("q-ripple__inner--enter"),s.classList.add("q-ripple__inner--leave"),s.style.opacity=0,k=setTimeout(()=>{o.remove(),n.abort.splice(n.abort.indexOf(w),1)},275)},250)},50)}function Rt(e,{modifiers:t,value:n,arg:a}){let i={...e.cfg.ripple,...t,...n};e.modifiers={early:!0===i.early,stop:!0===i.stop,center:!0===i.center,color:i.color||a,keyCodes:[i.keyCodes||13].flat()}}var zt=p({name:"ripple",beforeMount(e,t){let n=t.instance.$.appContext.config.globalProperties.$q.config||{};if(!1===n.ripple)return;let a={cfg:n,enabled:!1!==t.value,modifiers:{},abort:[],start(t){a.enabled&&!t.qSkipRipple&&t.type===(a.modifiers.early?"pointerdown":"click")&&Mt(t,e,a,!0===t.qKeyEvent)},keystart:Lt(t=>{a.enabled&&!t.qSkipRipple&&N(t,a.modifiers.keyCodes)&&t.type==="key"+(a.modifiers.early?"down":"up")&&Mt(t,e,a,!0)},300)};Rt(a,t),e.__qripple=a,x(a,"main",[[e,"pointerdown","start","passive"],[e,"click","start","passive"],[e,"keydown","keystart","passive"],[e,"keyup","keystart","passive"]])},updated(e,t){if(t.oldValue!==t.value){let n=e.__qripple;void 0!==n&&(n.enabled=!1!==t.value,n.enabled&&Object(t.value)===t.value&&Rt(n,t))}},beforeUnmount(e){let t=e.__qripple;void 0!==t&&(t.abort.forEach(e=>{e()}),S(t,"main"),delete e.__qripple)}});let It={none:0,xs:4,sm:8,md:16,lg:24,xl:32},Nt={xs:8,sm:10,md:14,lg:20,xl:24},Ot=["button","submit","reset"],jt=/[^\s]\/[^\s]/,Dt=["flat","outline","push","unelevated"];function qt(e,t){return e.flat?"flat":e.outline?"outline":e.push?"push":e.unelevated?"unelevated":t}function Bt(e){let t=qt(e);return void 0===t?{}:{[t]:!0}}let Ft={...Pe,...gt,type:{type:String,default:"button"},label:[Number,String],icon:String,iconRight:String,...Dt.reduce((e,t)=>(e[t]=Boolean)&&e,{}),square:Boolean,rounded:Boolean,glossy:Boolean,size:String,fab:Boolean,fabMini:Boolean,padding:String,color:String,textColor:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,tabindex:[Number,String],ripple:{type:[Boolean,Object],default:!0},align:{...it.align,default:"center"},stack:Boolean,stretch:Boolean,loading:{type:Boolean,default:null},disable:Boolean},Vt={...Ft,round:Boolean};let{passiveCapture:Ut}=m,$t=null,Ht=null,Wt=null;function Gt(e){w(e),e.qSkipRipple=!0}var Kt=h({name:"QBtn",props:{...Vt,percentage:Number,darkPercentage:Boolean,onTouchstart:[Function,Array]},emits:["click","keydown","mousedown","keyup"],setup(t,{slots:n,emit:a}){let i,{proxy:r}=(0,e.getCurrentInstance)(),{classes:o,style:s,innerClasses:l,attributes:u,hasLink:c,linkTag:d,navigateOnClick:h,isActionable:p}=function(t){let n=Ee(t,Nt),a=rt(t),{hasRouterLink:i,hasLink:r,linkTag:o,linkAttrs:s,navigateOnClick:l}=bt({fallbackTag:"button"}),u=(0,e.computed)(()=>{let e=t.fab||t.fabMini?{}:n.value;return void 0===t.padding?e:{...e,padding:t.padding.split(/\s+/).map(e=>e in It?It[e]+"px":e).join(" "),minWidth:"0",minHeight:"0"}}),c=(0,e.computed)(()=>t.rounded||t.fab||t.fabMini),d=(0,e.computed)(()=>!t.disable&&!t.loading),h=(0,e.computed)(()=>d.value?t.tabindex||0:-1),p=(0,e.computed)(()=>qt(t,"standard")),f=(0,e.computed)(()=>{let e={tabindex:h.value};return r.value?Object.assign(e,s.value):Ot.includes(t.type)&&(e.type=t.type),"a"===o.value?(t.disable?e["aria-disabled"]="true":void 0===e.href&&(e.role="button"),!i.value&&jt.test(t.type)&&(e.type=t.type)):t.disable&&(e.disabled="",e["aria-disabled"]="true"),t.loading&&void 0!==t.percentage&&Object.assign(e,{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":t.percentage}),e});return{classes:(0,e.computed)(()=>{let e;void 0===t.color?t.textColor&&(e=`text-${t.textColor}`):e=t.flat||t.outline?`text-${t.textColor||t.color}`:`bg-${t.color} text-${t.textColor||"white"}`;let n=t.round?"round":"rectangle"+(c.value?" q-btn--rounded":t.square?" q-btn--square":"");return`q-btn--${p.value} q-btn--${n}`+(void 0===e?"":" "+e)+(d.value?" q-btn--actionable q-focusable q-hoverable":t.disable?" disabled":"")+(t.fab?" q-btn--fab":t.fabMini?" q-btn--fab-mini":"")+(t.noCaps?" q-btn--no-uppercase":"")+(t.dense?" q-btn--dense":"")+(t.stretch?" no-border-radius self-stretch":"")+(t.glossy?" glossy":"")+(t.square?" q-btn--square":"")}),style:u,innerClasses:(0,e.computed)(()=>a.value+(t.stack?" column":" row")+(t.noWrap?" no-wrap text-no-wrap":"")+(t.loading?" q-btn__content--hidden":"")),attributes:f,hasLink:r,linkTag:o,navigateOnClick:l,isActionable:d}}(t),f=(0,e.ref)(null),m=(0,e.ref)(null),_=null,g=null,v=(0,e.computed)(()=>void 0!==t.label&&null!==t.label&&""!==t.label),k=(0,e.computed)(()=>!t.disable&&!1!==t.ripple&&{keyCodes:c.value?[13,32]:[13],...!0===t.ripple?{}:t.ripple}),x=(0,e.computed)(()=>({center:t.round})),S=(0,e.computed)(()=>{let e=Math.max(0,Math.min(100,t.percentage));return e>0?{transition:"transform 0.6s",transform:`translateX(${e-100}%)`}:{}}),C=(0,e.computed)(()=>{if(t.loading)return{onMousedown:Gt,onTouchstart:Gt,onClick:Gt,onKeydown:Gt,onKeyup:Gt};if(p.value){let e={onClick:P,onKeydown:E,onMousedown:L};if(r.$q.platform.has.touch){e[`onTouchstart${void 0===t.onTouchstart?"Passive":""}`]=A}return e}return{onClick:w}}),T=(0,e.computed)(()=>({ref:f,class:"q-btn q-btn-item non-selectable no-outline "+o.value,style:s.value,...u.value,...C.value}));function P(e){if(null!==f.value){if(void 0!==e){if(e.defaultPrevented)return;let n=document.activeElement;if("submit"===t.type&&n!==document.body&&!f.value.contains(n)&&!n.contains(f.value)){e.qAvoidFocus||f.value.focus();let t=()=>{document.removeEventListener("keydown",w,!0),document.removeEventListener("keyup",t,Ut),f.value?.removeEventListener("blur",t,Ut)};document.addEventListener("keydown",w,!0),document.addEventListener("keyup",t,Ut),f.value.addEventListener("blur",t,Ut)}}h(e)}}function E(e){null!==f.value&&(a("keydown",e),N(e,[13,32])&&Ht!==f.value&&(null!==Ht&&R(),e.defaultPrevented||(e.qAvoidFocus||f.value.focus(),Ht=f.value,f.value.classList.add("q-btn--active"),document.addEventListener("keyup",M,!0),f.value.addEventListener("blur",M,Ut)),w(e)))}function A(e){null!==f.value&&(a("touchstart",e),!e.defaultPrevented&&($t!==f.value&&(null!==$t&&R(),$t=f.value,_=e.target,_.addEventListener("touchcancel",M,Ut),_.addEventListener("touchend",M,Ut)),i=!0,null!==g&&clearTimeout(g),g=setTimeout(()=>{g=null,i=!1},200)))}function L(e){null!==f.value&&(e.qSkipRipple=!0===i,a("mousedown",e),!e.defaultPrevented&&Wt!==f.value&&(null!==Wt&&R(),Wt=f.value,f.value.classList.add("q-btn--active"),document.addEventListener("mouseup",M,Ut)))}function M(e){if(null!==f.value&&("blur"!==e?.type||document.activeElement!==f.value)){if("keyup"===e?.type){if(Ht===f.value&&N(e,[13,32])){let t=new MouseEvent("click",e);t.qKeyEvent=!0,e.defaultPrevented&&y(t),e.cancelBubble&&b(t),f.value.dispatchEvent(t),w(e),e.qKeyEvent=!0}a("keyup",e)}R()}}function R(e){let t=m.value;!e&&($t===f.value||Wt===f.value)&&null!==t&&t!==document.activeElement&&(t.setAttribute("tabindex",-1),t.focus()),$t===f.value&&(null!==_&&(_.removeEventListener("touchcancel",M,Ut),_.removeEventListener("touchend",M,Ut)),$t=_=null),Wt===f.value&&(document.removeEventListener("mouseup",M,Ut),Wt=null),Ht===f.value&&(document.removeEventListener("keyup",M,!0),f.value?.removeEventListener("blur",M,Ut),Ht=null),f.value?.classList.remove("q-btn--active")}return(0,e.onBeforeUnmount)(()=>{R(!0)}),Object.assign(r,{click:e=>{p.value&&P(e)}}),()=>{let a=[];void 0!==t.icon&&a.push((0,e.h)(Ke,{name:t.icon,left:!t.stack&&v.value,role:"img"})),v.value&&a.push((0,e.h)("span",{class:"block"},[t.label])),a=Me(n.default,a),void 0!==t.iconRight&&!t.round&&a.push((0,e.h)(Ke,{name:t.iconRight,right:!t.stack&&v.value,role:"img"}));let i=[(0,e.h)("span",{class:"q-focus-helper",ref:m})];return t.loading&&void 0!==t.percentage&&i.push((0,e.h)("span",{class:"q-btn__progress absolute-full overflow-hidden"+(t.darkPercentage?" q-btn__progress--dark":"")},[(0,e.h)("span",{class:"q-btn__progress-indicator fit block",style:S.value})])),i.push((0,e.h)("span",{class:"q-btn__content text-center col items-center q-anchor--skip "+l.value},a)),null!==t.loading&&i.push((0,e.h)(e.Transition,{name:"q-transition--fade"},()=>t.loading?[(0,e.h)("span",{key:"loading",class:"absolute-full flex flex-center"},void 0===n.loading?[(0,e.h)(xt)]:n.loading())]:null)),(0,e.withDirectives)((0,e.h)(d.value,T.value,i),[[zt,k.value,void 0,x.value]])}}}),Yt=h({name:"QBtnGroup",props:{unelevated:Boolean,outline:Boolean,flat:Boolean,rounded:Boolean,square:Boolean,push:Boolean,stretch:Boolean,glossy:Boolean,spread:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>{let e=["unelevated","outline","flat","rounded","square","push","stretch","glossy"].filter(e=>t[e]).map(e=>`q-btn-group--${e}`).join(" ");return"q-btn-group row no-wrap"+(0===e.length?"":" "+e)+(t.spread?" q-btn-group--spread":" inline")});return()=>(0,e.h)("div",{class:a.value},Ae(n.default))}});function Qt(){if(void 0!==window.getSelection){let e=window.getSelection();void 0===e.empty?void 0!==e.removeAllRanges&&(e.removeAllRanges(),d.is.mobile||e.addRange(document.createRange())):e.empty()}else void 0!==document.selection&&document.selection.empty()}let Zt={target:{type:[Boolean,String,Element],default:!0},noParentEvent:Boolean},Jt={...Zt,contextMenu:Boolean};function Xt({showing:t,avoidEmit:n,configureAnchorEl:a}){let{props:i,proxy:r,emit:o}=(0,e.getCurrentInstance)(),s=(0,e.ref)(null),l=null;function u(e){return null!==s.value&&(void 0===e||void 0===e.touches||e.touches.length<=1)}let c={};function d(){S(c,"anchor")}function h(){if(!1===i.target||""===i.target||null===r.$el.parentNode)s.value=null;else if(!0===i.target)!function(e){for(s.value=e;s.value.classList.contains("q-anchor--skip");)s.value=s.value.parentNode;a()}(r.$el.parentNode);else{let e=i.target;if("string"==typeof i.target)try{e=document.querySelector(i.target)}catch{e=void 0}null==e?(s.value=null,console.error(`Anchor: target "${i.target}" not found`)):(s.value=e.$el||e,a())}}return void 0===a&&(Object.assign(c,{hide(e){r.hide(e)},toggle(e){r.toggle(e),e.qAnchorHandled=!0},toggleKey(e){N(e,13)&&c.toggle(e)},contextClick(t){r.hide(t),y(t),(0,e.nextTick)(()=>{r.show(t),t.qAnchorHandled=!0})},prevent:y,mobileTouch(e){if(c.mobileCleanup(e),!u(e))return;r.hide(e),s.value.classList.add("non-selectable");let t=e.target;x(c,"anchor",[[t,"touchmove","mobileCleanup","passive"],[t,"touchend","mobileCleanup","passive"],[t,"touchcancel","mobileCleanup","passive"],[s.value,"contextmenu","prevent","notPassive"]]),l=setTimeout(()=>{l=null,r.show(e),e.qAnchorHandled=!0},300)},mobileCleanup(e){s.value.classList.remove("non-selectable"),null!==l&&(clearTimeout(l),l=null),t.value&&void 0!==e&&Qt()}}),a=function(e=i.contextMenu){if(i.noParentEvent||null===s.value)return;let t=e?r.$q.platform.is.mobile?[[s.value,"touchstart","mobileTouch","passive"]]:[[s.value,"mousedown","hide","passive"],[s.value,"contextmenu","contextClick","notPassive"]]:[[s.value,"click","toggle","passive"],[s.value,"keyup","toggleKey","passive"]];x(c,"anchor",t)}),(0,e.watch)(()=>i.contextMenu,e=>{null!==s.value&&(d(),a(e))}),(0,e.watch)(()=>i.target,()=>{null!==s.value&&d(),h()}),(0,e.watch)(()=>i.noParentEvent,e=>{null!==s.value&&(e?d():a())}),(0,e.onMounted)(()=>{h(),!n&&i.modelValue&&null===s.value&&o("update:modelValue",!1)}),(0,e.onBeforeUnmount)(()=>{null!==l&&clearTimeout(l),d()}),{anchorEl:s,canShow:u,anchorEvents:c}}function en(t,n){let a,i=(0,e.ref)(null);function r(e,t){let n=(void 0===t?"remove":"add")+"EventListener",i=void 0===t?a:t;e!==window&&e[n]("scroll",i,m.passive),window[n]("scroll",i,m.passive),a=t}function o(){null!==i.value&&(r(i.value),i.value=null)}return(0,e.onBeforeUnmount)((0,e.watch)(()=>t.noParentEvent,()=>{null!==i.value&&(o(),n())})),{localScrollTarget:i,unconfigureScrollTarget:o,changeScrollEvent:r}}let tn={modelValue:{type:Boolean,default:null},"onUpdate:modelValue":[Function,Array]},nn=["beforeShow","show","beforeHide","hide"];function an({showing:t,canShow:n,hideOnRouteChange:a,handleShow:i,handleHide:r,handleRouteChange:o,processOnMount:s}){let l,u=(0,e.getCurrentInstance)(),{props:c,emit:d,proxy:h}=u;function p(t){if(c.disable||!0===t?.qAnchorHandled||void 0!==n&&!n(t))return;let a=void 0!==c["onUpdate:modelValue"];a&&(d("update:modelValue",!0),l=t,(0,e.nextTick)(()=>{l===t&&(l=void 0)})),(null===c.modelValue||!a)&&f(t)}function f(e){t.value||(t.value=!0,d("beforeShow",e),void 0===i?d("show",e):i(e))}function m(t){if(c.disable)return;let n=void 0!==c["onUpdate:modelValue"];n&&(d("update:modelValue",!1),l=t,(0,e.nextTick)(()=>{l===t&&(l=void 0)})),(null===c.modelValue||!n)&&_(t)}function _(e){t.value&&(t.value=!1,d("beforeHide",e),void 0===r?d("hide",e):r(e))}function g(e){c.disable&&e?void 0!==c["onUpdate:modelValue"]&&d("update:modelValue",!1):!0===e!==t.value&&(e?f:_)(l)}(0,e.watch)(()=>c.modelValue,g),void 0!==a&&ut(u)&&(0,e.watch)(()=>h.$route.fullPath,()=>{a.value&&t.value&&(o?.(),m())}),s&&(0,e.onMounted)(()=>{g(c.modelValue)});let v={show:p,hide:m,toggle:function(e){t.value?m(e):p(e)}};return Object.assign(h,v),v}let rn=[];function on(e,t){do{if("QMenu"===e.$options.name){if(e.hide(t),e.$props.separateClosePopup)return ot(e)}else if(e.__qPortal){let n=ot(e);return"QPopupProxy"===n?.$options.name?(e.hide(t),n):e}e=ot(e)}while(null!=e)}let sn=[],ln=[];function un(e){ln=ln.filter(t=>t!==e)}function cn(e){un(e),0===ln.length&&0!==sn.length&&(sn.at(-1)(),sn=[])}function dn(e){0===ln.length?e():sn.push(e)}let hn=[],pn=[],fn=1,mn=document.body;function _n(e,t){let n=document.createElement("div");if(n.id=void 0===t?e:`q-portal--${t}--${fn++}`,void 0!==se.globalNodes){let e=se.globalNodes.class;void 0!==e&&(n.className=e)}return mn.append(n),hn.push(n),pn.push(t),n}function gn(e){let t=hn.indexOf(e);hn.splice(t,1),pn.splice(t,1),e.remove()}let vn=h({name:"QPortal",setup:(e,{slots:t})=>()=>t.default()});function bn(t,n,i,r){let o=(0,e.ref)(!1),s=(0,e.ref)(!1),l=null,u={},c="dialog"===r&&function(e){for(e=e.parent;null!=e;){if("QGlobalDialog"===e.type.name)return!0;if("QDialog"===e.type.name||"QMenu"===e.type.name)return!1;e=e.parent}return!1}(t);function d(e){if(s.value=!1,!e)return;cn(u),o.value=!1;let n=rn.indexOf(t.proxy);-1!==n&&rn.splice(n,1),null!==l&&(gn(l),l=null)}return(0,e.onUnmounted)(()=>{d(!0)}),t.proxy.__qPortal=!0,a(t.proxy,"contentEl",()=>n.value),{showPortal:function(e){if(e)return cn(u),void(s.value=!0);s.value=!1,o.value||(!c&&null===l&&(l=_n(!1,r)),o.value=!0,rn.push(t.proxy),function(e){un(e),ln.push(e)}(u))},hidePortal:d,portalIsActive:o,portalIsAccessible:s,renderPortal:()=>c?i():o.value?[(0,e.h)(e.Teleport,{to:l},(0,e.h)(vn,i))]:void 0}}let yn={transitionShow:{type:String,default:"fade"},transitionHide:{type:String,default:"fade"},transitionDuration:{type:[String,Number],default:300}};function wn(t,n=()=>{},a=()=>{}){return{transitionProps:(0,e.computed)(()=>{let e=`q-transition--${t.transitionShow||n()}`,i=`q-transition--${t.transitionHide||a()}`;return{appear:!0,enterFromClass:`${e}-enter-from`,enterActiveClass:`${e}-enter-active`,enterToClass:`${e}-enter-to`,leaveFromClass:`${i}-leave-from`,leaveActiveClass:`${i}-leave-active`,leaveToClass:`${i}-leave-to`}}),transitionStyle:(0,e.computed)(()=>`--q-transition-duration: ${t.transitionDuration}ms`)}}function kn(){let t,n=(0,e.getCurrentInstance)();function a(){t=void 0}return(0,e.onDeactivated)(a),(0,e.onBeforeUnmount)(a),{removeTick:a,registerTick(a){t=a,(0,e.nextTick)(()=>{t===a&&(ct(n)||t(),t=void 0)})}}}function xn(){let t=null,n=(0,e.getCurrentInstance)();function a(){null!==t&&(clearTimeout(t),t=null)}return(0,e.onDeactivated)(a),(0,e.onBeforeUnmount)(a),{removeTimeout:a,registerTimeout(e,i){a(),ct(n)||(t=setTimeout(()=>{t=null,e()},i))}}}let Sn,Cn=[Element,String],Tn=[null,document,document.body,document.scrollingElement,document.documentElement];function Pn(e,t){let n=Pt(t);if(void 0===n){if(null==e)return window;n=e.closest(".scroll,.scroll-y,.overflow-auto")}return Tn.includes(n)?window:n}function En(e){return(e===window?document.body:e).scrollHeight}function An(e){return e===window?window.pageYOffset||window.scrollY||document.body.scrollTop||0:e.scrollTop}function Ln(e){return e===window?window.pageXOffset||window.scrollX||document.body.scrollLeft||0:e.scrollLeft}function Mn(e,t,n=0,a){let i=void 0===a?performance.now():a,r=An(e);n<=0?r!==t&&zn(e,t):requestAnimationFrame(a=>{let o=a-i,s=r+(t-r)/Math.max(o,n)*o;zn(e,s),s!==t&&Mn(e,t,n-o,a)})}function Rn(e,t,n=0,a){let i=void 0===a?performance.now():a,r=Ln(e);n<=0?r!==t&&In(e,t):requestAnimationFrame(a=>{let o=a-i,s=r+(t-r)/Math.max(o,n)*o;In(e,s),s!==t&&Rn(e,t,n-o,a)})}function zn(e,t){e!==window?e.scrollTop=t:window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,t)}function In(e,t){e!==window?e.scrollLeft=t:window.scrollTo(t,window.pageYOffset||window.scrollY||document.body.scrollTop||0)}function Nn(e,t,n){n?Mn(e,t,n):zn(e,t)}function On(e,t,n){n?Rn(e,t,n):In(e,t)}function jn(){if(void 0!==Sn)return Sn;let e=document.createElement("p"),t=document.createElement("div");Tt(e,{width:"100%",height:"200px"}),Tt(t,{position:"absolute",top:"0px",left:"0px",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),t.append(e),document.body.append(t);let n=e.offsetWidth;t.style.overflow="scroll";let a=e.offsetWidth;return n===a&&(a=t.clientWidth),t.remove(),Sn=n-a,Sn}let Dn=["auto","scroll"];var qn={getScrollTarget:Pn,getScrollHeight:En,getScrollWidth:function(e){return(e===window?document.body:e).scrollWidth},getVerticalScrollPosition:An,getHorizontalScrollPosition:Ln,animVerticalScrollTo:Mn,animHorizontalScrollTo:Rn,setVerticalScrollPosition:Nn,setHorizontalScrollPosition:On,getScrollbarWidth:jn,hasScrollbar:function(e,t=!0){return!(!e||e.nodeType!==Node.ELEMENT_NODE)&&(t?e.scrollHeight>e.clientHeight&&(e.classList.contains("scroll")||e.classList.contains("overflow-auto")||Dn.includes(window.getComputedStyle(e)["overflow-y"])):e.scrollWidth>e.clientWidth&&(e.classList.contains("scroll")||e.classList.contains("overflow-auto")||Dn.includes(window.getComputedStyle(e)["overflow-x"])))}};let Bn,Fn=[];function Vn(e){Bn=27===e.keyCode}function Un(){Bn&&=!1}function $n(e){Bn&&(Bn=!1,N(e,27)&&Fn.at(-1)(e))}function Hn(e){window[e]("keydown",Vn),window[e]("blur",Un),window[e]("keyup",$n),Bn=!1}function Wn(e){c.is.desktop&&(Fn.push(e),1===Fn.length&&Hn("addEventListener"))}function Gn(e){let t=Fn.indexOf(e);-1!==t&&(Fn.splice(t,1),0===Fn.length&&Hn("removeEventListener"))}let Kn=[];function Yn(e){Kn.at(-1)(e)}function Qn(e){c.is.desktop&&(Kn.push(e),1===Kn.length&&document.body.addEventListener("focusin",Yn))}function Zn(e){let t=Kn.indexOf(e);-1!==t&&(Kn.splice(t,1),0===Kn.length&&document.body.removeEventListener("focusin",Yn))}let Jn=null,{notPassiveCapture:Xn}=m,ea=[];function ta(e){null!==Jn&&(clearTimeout(Jn),Jn=null);let t=e.target;if(void 0===t||8===t.nodeType||t.classList.contains("no-pointer-events"))return;let n=rn.length-1;for(;n>=0;){let e=rn[n].$;if("QTooltip"!==e.type.name){if("QDialog"!==e.type.name)break;if(!e.props.seamless)return;n--}else n--}for(let n=ea.length-1;n>=0;n--){let a=ea[n];if(null!==a.anchorEl.value&&a.anchorEl.value.contains(t)||t!==document.body&&(null===a.innerRef.value||a.innerRef.value.contains(t)))return;e.qClickOutside=!0,a.onClickOutside(e)}}function na(e){ea.push(e),1===ea.length&&(document.addEventListener("mousedown",ta,Xn),document.addEventListener("touchstart",ta,Xn))}function aa(e){let t=ea.indexOf(e);-1!==t&&(ea.splice(t,1),0===ea.length&&(null!==Jn&&(clearTimeout(Jn),Jn=null),document.removeEventListener("mousedown",ta,Xn),document.removeEventListener("touchstart",ta,Xn)))}let ia,ra,oa=["top","center","bottom"],sa=["left","middle","right","start","end"];function la(e){let t=e.split(" ");return 2===t.length&&(oa.includes(t[0])?!!sa.includes(t[1])||(console.error("Anchor/Self position must end with one of left/middle/right/start/end"),!1):(console.error("Anchor/Self position must start with one of top/center/bottom"),!1))}function ua(e){return!e||2===e.length&&"number"==typeof e[0]&&"number"==typeof e[1]}let ca={"start#ltr":"left","start#rtl":"right","end#ltr":"right","end#rtl":"left"};function da(e,t){let n=e.split(" ");return{vertical:n[0],horizontal:ca[`${n[1]}#${t?"rtl":"ltr"}`]}}function ha(e,t,n,a){return{top:e[n.vertical]-t[a.vertical],left:e[n.horizontal]-t[a.horizontal]}}function pa(e,t=0){if(null===e.targetEl||null===e.anchorEl||t>5)return;if(0===e.targetEl.offsetHeight||0===e.targetEl.offsetWidth)return void setTimeout(()=>{pa(e,t+1)},10);let{targetEl:n,offset:a,anchorEl:i,anchorOrigin:r,selfOrigin:o,absoluteOffset:s,fit:l,cover:u,maxHeight:d,maxWidth:h}=e;if(c.is.ios&&void 0!==window.visualViewport){let e=document.body.style,{offsetLeft:t,offsetTop:n}=window.visualViewport;t!==ia&&(e.setProperty("--q-pe-left",t+"px"),ia=t),n!==ra&&(e.setProperty("--q-pe-top",n+"px"),ra=n)}let{scrollLeft:p,scrollTop:f}=n,m=void 0===s?function(e,t){let{top:n,left:a,right:i,bottom:r,width:o,height:s}=e.getBoundingClientRect();return void 0!==t&&(n-=t[1],a-=t[0],r+=t[1],i+=t[0],o+=t[0],s+=t[1]),{top:n,bottom:r,height:s,left:a,right:i,width:o,middle:a+(i-a)/2,center:n+(r-n)/2}}(i,u?[0,0]:a):function(e,t,n){let{top:a,left:i}=e.getBoundingClientRect();return a+=t.top,i+=t.left,void 0!==n&&(a+=n[1],i+=n[0]),{top:a,bottom:a+1,height:1,left:i,right:i+1,width:1,middle:i,center:a}}(i,s,a);Object.assign(n.style,{top:0,left:0,minWidth:null,minHeight:null,maxWidth:h,maxHeight:d,visibility:"visible"});let{offsetWidth:_,offsetHeight:g}=n,{elWidth:v,elHeight:b}=l||u?{elWidth:Math.max(m.width,_),elHeight:u?Math.max(m.height,g):g}:{elWidth:_,elHeight:g},y={maxWidth:h,maxHeight:d};(l||u)&&(y.minWidth=m.width+"px",u&&(y.minHeight=m.height+"px")),Object.assign(n.style,y);let w=function(e,t){return{top:0,center:t/2,bottom:t,left:0,middle:e/2,right:e}}(v,b),k=ha(m,w,r,o);if(void 0===s||void 0===a)fa(k,m,w,r,o);else{let{top:e,left:t}=k;fa(k,m,w,r,o);let n=!1;if(k.top!==e){n=!0;let e=2*a[1];m.center=m.top-=e,m.bottom-=e+2}if(k.left!==t){n=!0;let e=2*a[0];m.middle=m.left-=e,m.right-=e+2}n&&(k=ha(m,w,r,o),fa(k,m,w,r,o))}y={top:k.top+"px",left:k.left+"px"},void 0!==k.maxHeight&&(y.maxHeight=k.maxHeight+"px",m.height>k.maxHeight&&(y.minHeight=y.maxHeight)),void 0!==k.maxWidth&&(y.maxWidth=k.maxWidth+"px",m.width>k.maxWidth&&(y.minWidth=y.maxWidth)),Object.assign(n.style,y),n.scrollTop!==f&&(n.scrollTop=f),n.scrollLeft!==p&&(n.scrollLeft=p)}function fa(e,t,n,a,i){let r=n.bottom,o=n.right,s=jn(),l=window.innerHeight-s,u=document.body.clientWidth;if(e.top<0||e.top+r>l)if("center"===i.vertical)e.top=t[a.vertical]>l/2?Math.max(0,l-r):0,e.maxHeight=Math.min(r,l);else if(t[a.vertical]>l/2){let n=Math.min(l,"center"===a.vertical?t.center:a.vertical===i.vertical?t.bottom:t.top);e.maxHeight=Math.min(r,n),e.top=Math.max(0,n-r)}else e.top=Math.max(0,"center"===a.vertical?t.center:a.vertical===i.vertical?t.top:t.bottom),e.maxHeight=Math.min(r,l-e.top);if(e.left<0||e.left+o>u)if(e.maxWidth=Math.min(o,u),"middle"===i.horizontal)e.left=t[a.horizontal]>u/2?Math.max(0,u-o):0;else if(t[a.horizontal]>u/2){let n=Math.min(u,"middle"===a.horizontal?t.middle:a.horizontal===i.horizontal?t.right:t.left);e.maxWidth=Math.min(o,n),e.left=Math.max(0,n-e.maxWidth)}else e.left=Math.max(0,"middle"===a.horizontal?t.middle:a.horizontal===i.horizontal?t.left:t.right),e.maxWidth=Math.min(o,u-e.left)}["left","middle","right"].forEach(e=>{ca[`${e}#ltr`]=e,ca[`${e}#rtl`]=e});var ma=h({name:"QMenu",inheritAttrs:!1,props:{...Jt,...tn,...Je,...yn,persistent:Boolean,autoClose:Boolean,separateClosePopup:Boolean,noEscDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,fit:Boolean,cover:Boolean,square:Boolean,anchor:{type:String,validator:la},self:{type:String,validator:la},offset:{type:Array,validator:ua},scrollTarget:Cn,touchPosition:Boolean,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null}},emits:[...nn,"click","escapeKey"],setup(t,{slots:n,emit:a,attrs:i}){let r,o,s,l=null,u=(0,e.getCurrentInstance)(),{proxy:c}=u,{$q:d}=c,h=(0,e.ref)(null),p=(0,e.ref)(!1),f=(0,e.computed)(()=>!t.persistent&&!t.noRouteDismiss),m=Xe(t,d),{registerTick:_,removeTick:g}=kn(),{registerTimeout:b}=xn(),{transitionProps:y,transitionStyle:k}=wn(t),{localScrollTarget:x,changeScrollEvent:S,unconfigureScrollTarget:C}=en(t,B),{anchorEl:T,canShow:P}=Xt({showing:p}),{hide:E}=an({showing:p,canShow:P,handleShow:function(n){if(l=t.noRefocus?null:document.activeElement,Qn(V),A(),B(),r=void 0,void 0!==n&&(t.touchPosition||t.contextMenu)){let e=v(n);if(void 0!==e.left){let{top:t,left:n}=T.value.getBoundingClientRect();r={left:e.left-n,top:e.top-t}}}void 0===o&&(o=(0,e.watch)(()=>d.screen.width+"|"+d.screen.height+"|"+t.self+"|"+t.anchor+"|"+d.lang.rtl,$)),t.noFocus||document.activeElement.blur(),_(()=>{$(),t.noFocus||D()}),b(()=>{d.platform.is.ios&&(s=t.autoClose,h.value.click()),$(),A(!0),a("show",n)},t.transitionDuration)},handleHide:function(e){if(g(),L(),q(!0),null!==l&&(void 0===e||!e.qClickOutside)){let t=(0===e?.type.indexOf("key")?l.closest('[tabindex]:not([tabindex^="-"])'):void 0)||l;l=null,dn(()=>{t.isConnected&&t.focus()})}b(()=>{L(!0),a("hide",e)},t.transitionDuration)},handleRouteChange:function(){l=null},hideOnRouteChange:f,processOnMount:!0}),{showPortal:A,hidePortal:L,renderPortal:M}=bn(u,h,function(){return(0,e.h)(e.Transition,y.value,()=>p.value?(0,e.h)("div",{role:"menu",...i,ref:h,tabindex:-1,class:["q-menu q-position-engine scroll"+N.value,i.class],style:[i.style,k.value],...O.value},Ae(n.default)):null)},"menu"),R={anchorEl:T,innerRef:h,onClickOutside(e){if(!t.persistent&&p.value)return E(e),("touchstart"===e.type||e.target.classList.contains("q-dialog__backdrop"))&&w(e),!0}},z=(0,e.computed)(()=>da(t.anchor||(t.cover?"center middle":"bottom start"),d.lang.rtl)),I=(0,e.computed)(()=>t.cover?z.value:da(t.self||"top start",d.lang.rtl)),N=(0,e.computed)(()=>(t.square?" q-menu--square":"")+(m.value?" q-menu--dark q-dark":"")),O=(0,e.computed)(()=>t.autoClose?{onClick:F}:{}),j=(0,e.computed)(()=>p.value&&!t.persistent);function D(){dn(()=>{let e=h.value;e&&!e.contains(document.activeElement)&&(e=e.querySelector("[autofocus][tabindex], [data-autofocus][tabindex]")||e.querySelector("[autofocus] [tabindex], [data-autofocus] [tabindex]")||e.querySelector("[autofocus], [data-autofocus]")||e,e.focus({preventScroll:!0}))})}function q(e){r=void 0,void 0!==o&&(o(),o=void 0),(e||p.value)&&(Zn(V),C(),aa(R),Gn(U)),e||(l=null)}function B(){(null!==T.value||void 0!==t.scrollTarget)&&(x.value=Pn(T.value,t.scrollTarget),S(x.value,$))}function F(e){s?s=!1:(on(c,e),a("click",e))}function V(e){j.value&&!t.noFocus&&!Et(h.value,e.target)&&D()}function U(e){t.noEscDismiss||(a("escapeKey"),E(e))}function $(){pa({targetEl:h.value,offset:t.offset,anchorEl:T.value,anchorOrigin:z.value,selfOrigin:I.value,absoluteOffset:r,fit:t.fit,cover:t.cover,maxHeight:t.maxHeight,maxWidth:t.maxWidth})}return(0,e.watch)(j,e=>{e?(Wn(U),na(R)):(Gn(U),aa(R))}),(0,e.onBeforeUnmount)(()=>{q()}),Object.assign(c,{focus:D,updatePosition:$}),M}});var _a=function(){if(typeof crypto>"u")return()=>{throw Error("[Quasar uid()] Secure RNG not available. Cannot generate collision-resistant UUID.")};if(crypto.randomUUID)return()=>crypto.randomUUID();let e,t,n=Array.from({length:256},(e,t)=>(t+256).toString(16).slice(1));return()=>{(void 0===e||t+16>4096)&&(t=0,e=new Uint8Array(4096),crypto.getRandomValues(e));let a=t;return t+=16,e[a+6]=15&e[a+6]|64,e[a+8]=63&e[a+8]|128,n[e[a]]+n[e[a+1]]+n[e[a+2]]+n[e[a+3]]+"-"+n[e[a+4]]+n[e[a+5]]+"-"+n[e[a+6]]+n[e[a+7]]+"-"+n[e[a+8]]+n[e[a+9]]+"-"+n[e[a+10]]+n[e[a+11]]+n[e[a+12]]+n[e[a+13]]+n[e[a+14]]+n[e[a+15]]}}();function ga(e,t){return e??(t?`f_${_a()}`:null)}function va({getValue:t,required:n=!0}={}){if(o.value){let a=void 0===t?(0,e.ref)(null):(0,e.ref)(function(e){return e??null}(t()));return n&&null===a.value&&(0,e.onMounted)(()=>{a.value=`f_${_a()}`}),void 0!==t&&(0,e.watch)(t,e=>{a.value=ga(e,n)}),a}return void 0===t?(0,e.ref)(`f_${_a()}`):(0,e.computed)(()=>ga(t(),n))}let ba=Object.keys(Ft);var ya=h({name:"QBtnDropdown",props:{...Ft,...yn,modelValue:Boolean,split:Boolean,dropdownIcon:String,contentClass:[Array,String,Object],contentStyle:[Array,String,Object],cover:Boolean,persistent:Boolean,noEscDismiss:Boolean,noRouteDismiss:Boolean,autoClose:Boolean,noRefocus:Boolean,noFocus:Boolean,menuAnchor:{type:String,default:"bottom end"},menuSelf:{type:String,default:"top end"},menuOffset:Array,disableMainBtn:Boolean,disableDropdown:Boolean,noIconAnimation:Boolean,toggleAriaLabel:String},emits:["update:modelValue","click","beforeShow","show","beforeHide","hide"],setup(t,{slots:n,emit:a}){let{proxy:i}=(0,e.getCurrentInstance)(),r=(0,e.ref)(t.modelValue),o=(0,e.ref)(null),s=va(),l=(0,e.computed)(()=>{let e={"aria-expanded":r.value?"true":"false","aria-haspopup":"true","aria-controls":s.value,"aria-label":t.toggleAriaLabel||i.$q.lang.label[r.value?"collapse":"expand"](t.label)};return(t.disable||!t.split&&t.disableMainBtn||t.disableDropdown)&&(e["aria-disabled"]="true"),e}),u=(0,e.computed)(()=>"q-btn-dropdown__arrow"+(r.value&&!t.noIconAnimation?" rotate-180":"")+(t.split?"":" q-btn-dropdown__arrow-container")),c=(0,e.computed)(()=>Bt(t)),d=(0,e.computed)(()=>function(e){return ba.reduce((t,n)=>{let a=e[n];return void 0!==a&&(t[n]=a),t},{})}(t));function h(e){r.value=!0,a("beforeShow",e)}function p(e){a("show",e),a("update:modelValue",!0)}function f(e){r.value=!1,a("beforeHide",e)}function m(e){a("hide",e),a("update:modelValue",!1)}function _(e){a("click",e)}function g(e){b(e),y(),a("click",e)}function v(e){o.value?.show(e)}function y(e){o.value?.hide(e)}return(0,e.watch)(()=>t.modelValue,e=>{o.value?.[e?"show":"hide"]()}),(0,e.watch)(()=>t.split,y),Object.assign(i,{show:v,hide:y,toggle:function(e){o.value?.toggle(e)}}),(0,e.onMounted)(()=>{t.modelValue&&v()}),()=>{let a=[(0,e.h)(Ke,{class:u.value,name:t.dropdownIcon||i.$q.iconSet.arrow.dropdown})];return t.disableDropdown||a.push((0,e.h)(ma,{ref:o,id:s.value,class:t.contentClass,style:t.contentStyle,cover:t.cover,fit:!0,persistent:t.persistent,noEscDismiss:t.noEscDismiss,noRouteDismiss:t.noRouteDismiss,autoClose:t.autoClose,noFocus:t.noFocus,noRefocus:t.noRefocus,anchor:t.menuAnchor,self:t.menuSelf,offset:t.menuOffset,separateClosePopup:!0,transitionShow:t.transitionShow,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,onBeforeShow:h,onShow:p,onBeforeHide:f,onHide:m},n.default)),t.split?(0,e.h)(Yt,{class:"q-btn-dropdown q-btn-dropdown--split no-wrap q-btn-item",rounded:t.rounded,square:t.square,...c.value,glossy:t.glossy,stretch:t.stretch},()=>[(0,e.h)(Kt,{class:"q-btn-dropdown--current",...d.value,disable:t.disable||t.disableMainBtn,noWrap:!0,round:!1,onClick:g},{default:n.label,loading:n.loading}),(0,e.h)(Kt,{class:"q-btn-dropdown__arrow-container q-anchor--skip",...l.value,...c.value,disable:t.disable||t.disableDropdown,rounded:t.rounded,color:t.color,textColor:t.textColor,dense:t.dense,size:t.size,padding:t.padding,ripple:t.ripple},()=>a)]):(0,e.h)(Kt,{class:"q-btn-dropdown q-btn-dropdown--simple",...d.value,...l.value,disable:t.disable||t.disableMainBtn,noWrap:!0,round:!1,onClick:_},{default:()=>Ae(n.label,[]).concat(a),loading:n.loading})}}});let wa={name:String};function ka(t){return(0,e.computed)(()=>({type:"hidden",name:t.name,value:t.modelValue}))}function xa(t={}){return(n,a,i)=>{n[a]((0,e.h)("input",{class:"hidden"+(i||""),...t.value}))}}function Sa(t){return(0,e.computed)(()=>t.name||t.for)}var Ca=h({name:"QBtnToggle",props:{...wa,modelValue:{required:!0},options:{type:Array,required:!0,validator:e=>e.every(e=>("label"in e||"icon"in e||"slot"in e)&&"value"in e)},color:String,textColor:String,toggleColor:{type:String,default:"primary"},toggleTextColor:String,outline:Boolean,flat:Boolean,unelevated:Boolean,rounded:Boolean,push:Boolean,glossy:Boolean,size:String,padding:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,readonly:Boolean,disable:Boolean,stack:Boolean,stretch:Boolean,spread:Boolean,clearable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:["update:modelValue","clear","click"],setup(t,{slots:n,emit:a}){let i=(0,e.computed)(()=>void 0!==t.options.find(e=>e.value===t.modelValue)),r=xa((0,e.computed)(()=>({type:"hidden",name:t.name,value:t.modelValue}))),o=(0,e.computed)(()=>Bt(t)),s=(0,e.computed)(()=>({rounded:t.rounded,dense:t.dense,...o.value})),l=(0,e.computed)(()=>t.options.map((e,n)=>{let{attrs:a,value:i,slot:r,...o}=e;return{slot:r,props:{key:n,"aria-pressed":i===t.modelValue?"true":"false",...a,...o,...s.value,disable:t.disable||!0===o.disable,color:i===t.modelValue?c(o,"toggleColor"):c(o,"color"),textColor:i===t.modelValue?c(o,"toggleTextColor"):c(o,"textColor"),noCaps:!0===c(o,"noCaps"),noWrap:!0===c(o,"noWrap"),size:c(o,"size"),padding:c(o,"padding"),ripple:c(o,"ripple"),stack:!0===c(o,"stack"),stretch:!0===c(o,"stretch"),onClick(t){u(i,e,t)}}}}));function u(e,n,i){t.readonly||(t.modelValue===e?t.clearable&&(a("update:modelValue",null,null),a("clear")):a("update:modelValue",e,n),a("click",i))}function c(e,n){return void 0===e[n]?t[n]:e[n]}function d(){let a=l.value.map(t=>(0,e.h)(Kt,t.props,void 0===t.slot?void 0:n[t.slot]));return void 0!==t.name&&!t.disable&&i.value&&r(a,"push"),Me(n.default,a)}return()=>(0,e.h)(Yt,{class:"q-btn-toggle",...o.value,rounded:t.rounded,stretch:t.stretch,glossy:t.glossy,spread:t.spread},d)}}),Ta=h({name:"QCard",props:{...Je,tag:{type:String,default:"div"},square:Boolean,flat:Boolean,bordered:Boolean},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=Xe(t,a),r=(0,e.computed)(()=>"q-card"+(i.value?" q-card--dark q-dark":"")+(t.bordered?" q-card--bordered":"")+(t.square?" q-card--square no-border-radius":"")+(t.flat?" q-card--flat no-shadow":""));return()=>(0,e.h)(t.tag,{class:r.value},Ae(n.default))}}),Pa=h({name:"QCardSection",props:{tag:{type:String,default:"div"},horizontal:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>"q-card__section q-card__section--"+(t.horizontal?"horiz row no-wrap":"vert"));return()=>(0,e.h)(t.tag,{class:a.value},Ae(n.default))}}),Ea=h({name:"QCardActions",props:{...it,vertical:Boolean},setup(t,{slots:n}){let a=rt(t),i=(0,e.computed)(()=>`q-card__actions ${a.value} q-card__actions--${t.vertical?"vert column":"horiz row"}`);return()=>(0,e.h)("div",{class:i.value},Ae(n.default))}});let Aa={left:!0,right:!0,up:!0,down:!0,horizontal:!0,vertical:!0},La=Object.keys(Aa);function Ma(e){let t={};for(let n of La)e[n]&&(t[n]=!0);return 0===Object.keys(t).length?Aa:(t.horizontal?t.left=t.right=!0:t.left&&t.right&&(t.horizontal=!0),t.vertical?t.up=t.down=!0:t.up&&t.down&&(t.vertical=!0),t.horizontal&&t.vertical&&(t.all=!0),t)}Aa.all=!0;let Ra=["INPUT","TEXTAREA"];function za(e,t){return!(void 0!==t.event||void 0===e.target||e.target.draggable||"function"!=typeof t.handler||Ra.includes(e.target.nodeName.toUpperCase())||void 0!==e.qClonedBy&&e.qClonedBy.includes(t.uid))}function Ia(e){let t=[.06,6,50];return"string"==typeof e&&0!==e.length&&e.split(":").forEach((e,n)=>{let a=Number.parseFloat(e);a&&(t[n]=a)}),t}function Na(){document.body.classList.remove("no-pointer-events--children")}var Oa=p({name:"touch-swipe",beforeMount(e,{value:t,arg:n,modifiers:a}){if(!a.mouse&&!c.has.touch)return;let i=a.mouseCapture||a.mousecapture?"Capture":"",r={handler:t,sensitivity:Ia(n),direction:Ma(a),noop:_,mouseStart(e){za(e,r)&&g(e)&&(x(r,"temp",[[document,"mousemove","move",`notPassive${i}`],[document,"mouseup","end","notPassiveCapture"]]),r.start(e,!0))},touchStart(e){if(za(e,r)){let t=e.target;x(r,"temp",[[t,"touchmove","move","notPassiveCapture"],[t,"touchcancel","end","notPassiveCapture"],[t,"touchend","end","notPassiveCapture"]]),r.start(e)}},start(t,n){c.is.firefox&&k(e,!0);let a=v(t);r.event={x:a.left,y:a.top,time:Date.now(),mouse:!0===n,dir:!1}},move(e){if(void 0===r.event)return;if(!1!==r.event.dir)return void w(e);let t=Date.now()-r.event.time;if(0===t)return;let n=v(e),a=n.left-r.event.x,i=Math.abs(a),o=n.top-r.event.y,s=Math.abs(o);if(r.event.mouse){if(""!==window.getSelection().toString())return void r.end(e);if(ir.sensitivity[0]&&(r.event.dir=o<0?"up":"down"),r.direction.horizontal&&i>s&&s<100&&l>r.sensitivity[0]&&(r.event.dir=a<0?"left":"right"),r.direction.up&&ir.sensitivity[0]&&(r.event.dir="up"),r.direction.down&&i0&&i<100&&u>r.sensitivity[0]&&(r.event.dir="down"),r.direction.left&&i>s&&a<0&&s<100&&l>r.sensitivity[0]&&(r.event.dir="left"),r.direction.right&&i>s&&a>0&&s<100&&l>r.sensitivity[0]&&(r.event.dir="right"),!1===r.event.dir?r.end(e):(w(e),r.event.mouse&&(document.body.classList.add("no-pointer-events--children","non-selectable"),Qt(),r.styleCleanup=e=>{r.styleCleanup=void 0,document.body.classList.remove("non-selectable"),!0===e?setTimeout(Na,50):Na()}),r.handler({evt:e,touch:!0!==r.event.mouse,mouse:r.event.mouse,direction:r.event.dir,duration:t,distance:{x:i,y:s}}))},end(t){void 0!==r.event&&(S(r,"temp"),c.is.firefox&&k(e,!1),r.styleCleanup?.(!0),void 0!==t&&!1!==r.event.dir&&w(t),r.event=void 0)}};e.__qtouchswipe=r,a.mouse&&x(r,"main",[[e,"mousedown","mouseStart","passive"+(a.mouseCapture||a.mousecapture?"Capture":"")]]),c.has.touch&&x(r,"main",[[e,"touchstart","touchStart","passive"+(a.capture?"Capture":"")],[e,"touchmove","noop","notPassiveCapture"]])},updated(e,t){let n=e.__qtouchswipe;void 0!==n&&(t.oldValue!==t.value&&("function"!=typeof t.value&&n.end(),n.handler=t.value),n.direction=Ma(t.modifiers))},beforeUnmount(e){let t=e.__qtouchswipe;void 0!==t&&(S(t,"main"),S(t,"temp"),c.is.firefox&&k(e,!1),t.styleCleanup?.(),delete e.__qtouchswipe)}});function ja(){let e=Object.create(null);return{getCache:(t,n)=>Object.hasOwn(e,t)?e[t]:e[t]="function"==typeof n?n():n,setCache(t,n){e[t]=n},hasCache:t=>Object.hasOwn(e,t),clearCache(t){void 0===t?e=Object.create(null):delete e[t]}}}let Da={name:{required:!0},disable:Boolean},qa={setup:(t,{slots:n})=>()=>(0,e.h)("div",{class:"q-panel scroll",role:"tabpanel"},Ae(n.default))},Ba={modelValue:{required:!0},animated:Boolean,infinite:Boolean,swipeable:Boolean,vertical:Boolean,transitionPrev:String,transitionNext:String,transitionDuration:{type:[String,Number],default:300},keepAlive:Boolean,keepAliveInclude:[String,Array,RegExp],keepAliveExclude:[String,Array,RegExp],keepAliveMax:Number},Fa=["update:modelValue","beforeTransition","transition"];function Va(e){return null!=e&&""!==e}function Ua(){let t,n,{props:a,emit:i,proxy:r}=(0,e.getCurrentInstance)(),{getCache:o}=ja(),{registerTimeout:s}=xn(),l=(0,e.ref)(null),u={value:null};function c(e){let t=a.vertical?"up":"left";x((r.$q.lang.rtl?-1:1)*(e.direction===t?1:-1))}let d=(0,e.computed)(()=>[[Oa,c,void 0,{horizontal:!a.vertical,vertical:a.vertical,mouse:!0}]]),h=(0,e.computed)(()=>a.transitionPrev||"slide-"+(a.vertical?"down":r.$q.lang.rtl?"left":"right")),p=(0,e.computed)(()=>a.transitionNext||"slide-"+(a.vertical?"up":r.$q.lang.rtl?"right":"left")),f=(0,e.computed)(()=>`--q-transition-duration: ${a.transitionDuration}ms`),m=(0,e.computed)(()=>"string"==typeof a.modelValue||"number"==typeof a.modelValue?a.modelValue:String(a.modelValue)),_=(0,e.computed)(()=>({include:a.keepAliveInclude,exclude:a.keepAliveExclude,max:a.keepAliveMax})),g=(0,e.computed)(()=>void 0!==a.keepAliveInclude||void 0!==a.keepAliveExclude);function v(){x(1)}function b(){x(-1)}function y(e){i("update:modelValue",e)}function w(e){return t.findIndex(t=>t.props.name===e&&""!==t.props.disable&&!0!==t.props.disable)}function k(e){let t=0!==e&&a.animated&&-1!==u.value?"q-transition--"+(-1===e?h.value:p.value):null;l.value!==t&&(l.value=t)}function x(e,r=u.value){let o=r+e;for(;-1!==o&&o{n=!1},0);o+=e}a.infinite&&0!==t.length&&-1!==r&&r!==t.length&&x(e,-1===e?t.length:-1)}function S(){let e=w(a.modelValue);return u.value!==e&&(u.value=e),!0}function C(){let n=Va(a.modelValue)&&S()&&t[u.value];return a.keepAlive?[(0,e.h)(e.KeepAlive,_.value,[(0,e.h)(g.value?o(m.value,()=>({...qa,name:m.value})):qa,{key:m.value,style:f.value},()=>n)])]:[(0,e.h)("div",{class:"q-panel scroll",style:f.value,key:m.value,role:"tabpanel"},[n])]}return(0,e.watch)(()=>a.modelValue,(e,t)=>{let r=Va(e)?w(e):-1;n||k(-1===r?0:r{i("transition",e,t)},a.transitionDuration))}),Object.assign(r,{next:v,previous:b,goTo:y}),{panelIndex:u,panelDirectives:d,updatePanelsList:function(e){return t=lt(Ae(e.default,[])).filter(e=>null!==e.props&&void 0===e.props.slot&&Va(e.props.name)),t.length},updatePanelIndex:S,getPanelContent:function(){if(0!==t.length)return a.animated?[(0,e.h)(e.Transition,{name:l.value},C)]:C()},getEnabledPanels:function(){return t.filter(e=>""!==e.props.disable&&!0!==e.props.disable)},getPanels:function(){return t},isValidPanelName:Va,keepAliveProps:_,needsUniqueKeepAliveWrapper:g,goToPanelByOffset:x,goToPanel:y,nextPanel:v,previousPanel:b}}let $a=0,Ha={fullscreen:Boolean,noRouteFullscreenExit:Boolean},Wa=["update:fullscreen","fullscreen"];function Ga(){let t,n,a=(0,e.getCurrentInstance)(),{props:i,emit:r,proxy:o}=a,s=!1,l=(0,e.ref)(!1);function u(){l.value?d():c()}function c(){l.value||(l.value=!0,o.$el.replaceWith(n),document.body.append(o.$el),$a++,1===$a&&document.body.classList.add("q-body--fullscreen-mixin"),t={handler:d},F.add(t))}function d(){l.value&&(void 0!==t&&(F.remove(t),t=void 0),n.replaceWith(o.$el),l.value=!1,$a=Math.max(0,$a-1),0===$a&&(document.body.classList.remove("q-body--fullscreen-mixin"),!s&&void 0!==o.$el.scrollIntoView&&setTimeout(()=>{o.$el.scrollIntoView()},0)))}return ut(a)&&(0,e.watch)(()=>o.$route.fullPath,()=>{i.noRouteFullscreenExit||d()}),(0,e.watch)(()=>i.fullscreen,e=>{l.value!==e&&u()}),(0,e.watch)(l,e=>{r("update:fullscreen",e),r("fullscreen",e)}),(0,e.onBeforeMount)(()=>{n=document.createElement("span")}),(0,e.onMounted)(()=>{i.fullscreen&&c()}),(0,e.onBeforeUnmount)(()=>{s=!0,d()}),Object.assign(o,{toggleFullscreen:u,setFullscreen:c,exitFullscreen:d}),{inFullscreen:l,toggleFullscreen:u}}let Ka=["top","right","bottom","left"],Ya=["regular","flat","outline","push","unelevated"];var Qa=h({name:"QCarousel",props:{...Je,...Ba,...Ha,transitionPrev:{type:String,default:"fade"},transitionNext:{type:String,default:"fade"},height:String,padding:Boolean,controlColor:String,controlTextColor:String,controlType:{type:String,validator:e=>Ya.includes(e),default:"flat"},autoplay:[Number,Boolean],arrows:Boolean,prevIcon:String,nextIcon:String,navigation:Boolean,navigationPosition:{type:String,validator:e=>Ka.includes(e)},navigationIcon:String,navigationActiveIcon:String,thumbnails:Boolean},emits:[...Wa,...Fa],setup(t,{slots:n}){let a,{proxy:{$q:i}}=(0,e.getCurrentInstance)(),r=Xe(t,i),o=null,{updatePanelsList:s,updatePanelIndex:l,getPanelContent:u,panelDirectives:c,goToPanel:d,previousPanel:h,nextPanel:p,getEnabledPanels:f,panelIndex:m}=Ua(),{inFullscreen:_}=Ga(),g=(0,e.computed)(()=>_.value||void 0===t.height?{}:{height:t.height}),v=(0,e.computed)(()=>t.vertical?"vertical":"horizontal"),b=(0,e.computed)(()=>t.navigationPosition||(t.vertical?"right":"bottom")),y=(0,e.computed)(()=>`q-carousel q-panel-parent q-carousel--with${t.padding?"":"out"}-padding`+(_.value?" fullscreen":"")+(r.value?" q-carousel--dark q-dark":"")+(t.arrows?` q-carousel--arrows-${v.value}`:"")+(t.navigation?` q-carousel--navigation-${b.value}`:"")),w=(0,e.computed)(()=>{let e=[t.prevIcon||i.iconSet.carousel[t.vertical?"up":"left"],t.nextIcon||i.iconSet.carousel[t.vertical?"down":"right"]];return!t.vertical&&i.lang.rtl?e.reverse():e}),k=(0,e.computed)(()=>t.navigationIcon||i.iconSet.carousel.navigationIcon),x=(0,e.computed)(()=>t.navigationActiveIcon||k.value),S=(0,e.computed)(()=>({color:t.controlColor,textColor:t.controlTextColor,round:!0,[t.controlType]:!0,dense:!0}));function C(){let e=re(t.autoplay)?Math.abs(t.autoplay):5e3;null!==o&&clearTimeout(o),o=setTimeout(()=>{o=null,e>=0?p():h()},e)}function T(n,a){return(0,e.h)("div",{class:`q-carousel__control q-carousel__navigation no-wrap absolute flex q-carousel__navigation--${n} q-carousel__navigation--${b.value}`+(void 0===t.controlColor?"":` text-${t.controlColor}`)},[(0,e.h)("div",{class:"q-carousel__navigation-inner flex flex-center no-wrap"},f().map(a))])}function P(){let i=[];if(t.navigation){let t=void 0===n["navigation-icon"]?t=>(0,e.h)(Kt,{key:"nav"+t.name,class:`q-carousel__navigation-icon q-carousel__navigation-icon--${!0===t.active?"":"in"}active`,...t.btnProps,onClick:t.onClick}):n["navigation-icon"],r=a-1;i.push(T("buttons",(e,n)=>{let a=e.props.name,i=m.value===n;return t({index:n,maxIndex:r,name:a,active:i,btnProps:{icon:i?x.value:k.value,size:"sm",...S.value},onClick:()=>{d(a)}})}))}else if(t.thumbnails){let n=void 0===t.controlColor?"":` text-${t.controlColor}`;i.push(T("thumbnails",a=>{let i=a.props;return(0,e.h)("img",{key:"tmb#"+i.name,class:`q-carousel__thumbnail q-carousel__thumbnail--${i.name===t.modelValue?"":"in"}active`+n,src:i.imgSrc||i["img-src"],onClick:()=>{d(i.name)}})}))}return t.arrows&&m.value>=0&&((t.infinite||m.value>0)&&i.push((0,e.h)("div",{key:"prev",class:`q-carousel__control q-carousel__arrow q-carousel__prev-arrow q-carousel__prev-arrow--${v.value} absolute flex flex-center`},[(0,e.h)(Kt,{icon:w.value[0],...S.value,onClick:h})])),(t.infinite||m.valuet.modelValue,()=>{t.autoplay&&C()}),(0,e.watch)(()=>t.autoplay,e=>{e?C():null!==o&&(clearTimeout(o),o=null)}),(0,e.onMounted)(()=>{t.autoplay&&C()}),(0,e.onBeforeUnmount)(()=>{null!==o&&clearTimeout(o)}),()=>(a=s(n),l(),(0,e.h)("div",{class:y.value,style:g.value},[ze("div",{class:"q-carousel__slides-container"},u(),"sl-cont",t.swipeable,()=>c.value),...P()]))}}),Za=h({name:"QCarouselSlide",props:{...Da,imgSrc:String},setup(t,{slots:n}){let a=(0,e.computed)(()=>t.imgSrc?{backgroundImage:`url("${t.imgSrc}")`}:{});return()=>(0,e.h)("div",{class:"q-carousel__slide",style:a.value},Ae(n.default))}}),Ja=h({name:"QCarouselControl",props:{position:{type:String,default:"bottom-right",validator:e=>["top-right","top-left","bottom-right","bottom-left","top","right","bottom","left"].includes(e)},offset:{type:Array,default:()=>[18,18],validator:e=>2===e.length}},setup(t,{slots:n}){let a=(0,e.computed)(()=>`q-carousel__control absolute absolute-${t.position}`),i=(0,e.computed)(()=>({margin:`${t.offset[1]}px ${t.offset[0]}px`}));return()=>(0,e.h)("div",{class:a.value,style:i.value},Ae(n.default))}}),Xa=h({name:"QChatMessage",props:{sent:Boolean,label:String,bgColor:String,textColor:String,name:String,avatar:String,text:Array,stamp:String,size:String,labelHtml:Boolean,nameHtml:Boolean,textHtml:Boolean,stampHtml:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>t.sent?"sent":"received"),i=(0,e.computed)(()=>`q-message-text-content q-message-text-content--${a.value}`+(void 0===t.textColor?"":` text-${t.textColor}`)),r=(0,e.computed)(()=>`q-message-text q-message-text--${a.value}`+(void 0===t.bgColor?"":` text-${t.bgColor}`)),o=(0,e.computed)(()=>"q-message-container row items-end no-wrap"+(t.sent?" reverse":"")),s=(0,e.computed)(()=>void 0===t.size?"":`col-${t.size}`),l=(0,e.computed)(()=>({msg:t.textHtml?"innerHTML":"textContent",stamp:t.stampHtml?"innerHTML":"textContent",name:t.nameHtml?"innerHTML":"textContent",label:t.labelHtml?"innerHTML":"textContent"}));function u(a){return void 0===n.stamp?t.stamp?[a,(0,e.h)("div",{class:"q-message-stamp",[l.value.stamp]:t.stamp})]:[a]:[a,(0,e.h)("div",{class:"q-message-stamp"},n.stamp())]}function c(t,n){let a=n?t.length>1?e=>e:t=>(0,e.h)("div",[t]):t=>(0,e.h)("div",{[l.value.msg]:t});return t.map((t,n)=>(0,e.h)("div",{key:n,class:r.value},[(0,e.h)("div",{class:i.value},u(a(t)))]))}return()=>{let i=[];void 0===n.avatar?void 0!==t.avatar&&i.push((0,e.h)("img",{class:`q-message-avatar q-message-avatar--${a.value}`,src:t.avatar,"aria-hidden":"true"})):i.push(n.avatar());let r=[];void 0===n.name?void 0!==t.name&&r.push((0,e.h)("div",{class:`q-message-name q-message-name--${a.value}`,[l.value.name]:t.name})):r.push((0,e.h)("div",{class:`q-message-name q-message-name--${a.value}`},n.name())),void 0===n.default?void 0!==t.text&&r.push(c(t.text,!1)):r.push(c(lt(n.default()),!0)),i.push((0,e.h)("div",{class:s.value},r));let u=[];return void 0===n.label?void 0!==t.label&&u.push((0,e.h)("div",{class:"q-message-label",[l.value.label]:t.label})):u.push((0,e.h)("div",{class:"q-message-label"},n.label())),u.push((0,e.h)("div",{class:o.value},i)),(0,e.h)("div",{class:`q-message q-message-${a.value}`},u)}}});function ei(t,n){let a=(0,e.ref)(null);return{refocusTargetEl:(0,e.computed)(()=>t.disable?null:(0,e.h)("span",{ref:a,class:"no-outline",tabindex:-1})),refocusTarget:function(e){let t=n.value;!0!==e?.qAvoidFocus&&(0===e?.type.indexOf("key")?document.activeElement!==t&&!0===t?.contains(document.activeElement)&&t.focus():null!==a.value&&(void 0===e||!0===t?.contains(e.target))&&a.value.focus())}}}var ti={xs:30,sm:35,md:40,lg:50,xl:60};let ni={...Je,...Pe,...wa,modelValue:{required:!0,default:null},val:{},trueValue:{default:!0},falseValue:{default:!1},indeterminateValue:{default:null},checkedIcon:String,uncheckedIcon:String,indeterminateIcon:String,toggleOrder:{type:String,validator:e=>"tf"===e||"ft"===e},toggleIndeterminate:Boolean,label:String,leftLabel:Boolean,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},ai=["update:modelValue"];function ii(e){(13===e.keyCode||32===e.keyCode)&&w(e)}function ri(t,n){let{props:a,slots:i,emit:r,proxy:o}=(0,e.getCurrentInstance)(),{$q:s}=o,l=Xe(a,s),u=(0,e.ref)(null),{refocusTargetEl:c,refocusTarget:d}=ei(a,u),h=Ee(a,ti),p=(0,e.computed)(()=>void 0!==a.val&&Array.isArray(a.modelValue)),f=(0,e.computed)(()=>{let t=(0,e.toRaw)(a.val);return p.value?a.modelValue.findIndex(n=>(0,e.toRaw)(n)===t):-1}),m=(0,e.computed)(()=>p.value?-1!==f.value:(0,e.toRaw)(a.modelValue)===(0,e.toRaw)(a.trueValue)),_=(0,e.computed)(()=>p.value?-1===f.value:(0,e.toRaw)(a.modelValue)===(0,e.toRaw)(a.falseValue)),g=(0,e.computed)(()=>!m.value&&!_.value),v=(0,e.computed)(()=>a.disable?-1:a.tabindex||0),b=(0,e.computed)(()=>`q-${t} cursor-pointer no-outline row inline no-wrap items-center`+(a.disable?" disabled":"")+(l.value?` q-${t}--dark`:"")+(a.dense?` q-${t}--dense`:"")+(a.leftLabel?" reverse":"")),y=(0,e.computed)(()=>`q-${t}__inner relative-position non-selectable q-${t}__inner--${m.value?"truthy":_.value?"falsy":"indet"}${void 0===a.color||!a.keepColor&&("toggle"===t?!m.value:_.value)?"":` text-${a.color}`}`),k=xa((0,e.computed)(()=>{let e={type:"checkbox"};return void 0!==a.name&&Object.assign(e,{".checked":m.value,"^checked":m.value?"checked":void 0,name:a.name,value:p.value?a.val:a.trueValue}),e})),x=(0,e.computed)(()=>{let e={tabindex:v.value,role:"toggle"===t?"switch":"checkbox","aria-label":a.label,"aria-checked":g.value?"mixed":m.value?"true":"false"};return a.disable&&(e["aria-disabled"]="true"),e});function S(e){void 0!==e&&(w(e),d(e)),a.disable||r("update:modelValue",function(){if(p.value){if(m.value){let e=[...a.modelValue];return e.splice(f.value,1),e}return[...a.modelValue,a.val]}if(m.value){if("ft"!==a.toggleOrder||!a.toggleIndeterminate)return a.falseValue}else{if(!_.value)return"ft"===a.toggleOrder?a.falseValue:a.trueValue;if("ft"===a.toggleOrder||!a.toggleIndeterminate)return a.trueValue}return a.indeterminateValue}(),e)}function C(e){(13===e.keyCode||32===e.keyCode)&&S(e)}let T=n(m,g);return Object.assign(o,{toggle:S}),()=>{let n=T();a.disable||k(n,"unshift",` q-${t}__native absolute q-ma-none q-pa-none`);let r=[(0,e.h)("div",{class:y.value,style:h.value,"aria-hidden":"true"},n)];null!==c.value&&r.push(c.value);let o=void 0===a.label?Ae(i.default):Me(i.default,[a.label]);return void 0!==o&&r.push((0,e.h)("div",{class:`q-${t}__label q-anchor--skip`},o)),(0,e.h)("div",{ref:u,class:b.value,...x.value,onClick:S,onKeydown:ii,onKeyup:C},r)}}var oi=h({name:"QCheckbox",props:ni,emits:ai,setup(t){let n=(0,e.h)("div",{key:"svg",class:"q-checkbox__bg absolute"},[(0,e.h)("svg",{class:"q-checkbox__svg fit absolute-full",viewBox:"0 0 24 24"},[(0,e.h)("path",{class:"q-checkbox__truthy",fill:"none",d:"M1.73,12.91 8.1,19.28 22.79,4.59"}),(0,e.h)("path",{class:"q-checkbox__indet",d:"M4,14H20V10H4"})])]);return ri("checkbox",function(a,i){let r=(0,e.computed)(()=>(a.value?t.checkedIcon:i.value?t.indeterminateIcon:t.uncheckedIcon)||null);return()=>null===r.value?[n]:[(0,e.h)("div",{key:"icon",class:"q-checkbox__icon-container absolute-full flex flex-center no-wrap"},[(0,e.h)(Ke,{class:"q-checkbox__icon",name:r.value})])]})}});function si(e){32===e.keyCode&&w(e)}let li={xs:8,sm:10,md:14,lg:20,xl:24};var ui=h({name:"QChip",props:{...Je,...Pe,dense:Boolean,icon:String,iconRight:String,iconRemove:String,iconSelected:String,label:[String,Number],color:String,textColor:String,modelValue:{type:Boolean,default:!0},selected:{type:Boolean,default:null},square:Boolean,outline:Boolean,clickable:Boolean,removable:Boolean,removeAriaLabel:String,tabindex:[String,Number],disable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:["update:modelValue","update:selected","remove","click"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),r=Xe(t,i),o=Ee(t,li),s=(0,e.computed)(()=>t.selected||void 0!==t.icon),l=(0,e.computed)(()=>t.selected?t.iconSelected||i.iconSet.chip.selected:t.icon),u=(0,e.computed)(()=>t.iconRemove||i.iconSet.chip.remove),c=(0,e.computed)(()=>!t.disable&&(t.clickable||null!==t.selected)),d=(0,e.computed)(()=>{let e=t.outline&&t.color||t.textColor;return"q-chip row inline no-wrap items-center"+(t.outline||void 0===t.color?"":` bg-${t.color}`)+(e?` text-${e} q-chip--colored`:"")+(t.disable?" disabled":"")+(t.dense?" q-chip--dense":"")+(t.outline?" q-chip--outline":"")+(t.selected?" q-chip--selected":"")+(c.value?" q-chip--clickable cursor-pointer non-selectable q-hoverable":"")+(t.square?" q-chip--square":"")+(r.value?" q-chip--dark q-dark":"")}),h=(0,e.computed)(()=>{let e=t.disable?{tabindex:-1,"aria-disabled":"true"}:{tabindex:t.tabindex||0,role:"button","aria-pressed":t.selected?"true":"false"};return{chip:e,remove:{...e,role:"button","aria-hidden":"false","aria-label":t.removeAriaLabel||i.lang.label.remove}}});function p(e){[13,32].includes(e.keyCode)&&(f(e),w(e))}function f(e){t.disable||(a("update:selected",!t.selected),a("click",e))}function m(e){(void 0===e.keyCode||[13,32].includes(e.keyCode))&&(w(e),t.disable||(a("update:modelValue",!1),a("remove")))}function _(){let a=[];c.value&&a.push((0,e.h)("div",{class:"q-focus-helper"})),s.value&&a.push((0,e.h)(Ke,{class:"q-chip__icon q-chip__icon--left",name:l.value}));let i=void 0===t.label?void 0:[(0,e.h)("div",{class:"ellipsis"},[t.label])];return a.push((0,e.h)("div",{class:"q-chip__content col row no-wrap items-center q-anchor--skip"},Re(n.default,i))),t.iconRight&&a.push((0,e.h)(Ke,{class:"q-chip__icon q-chip__icon--right",name:t.iconRight})),t.removable&&a.push((0,e.h)(Ke,{class:"q-chip__icon q-chip__icon--remove cursor-pointer",name:u.value,...h.value.remove,onClick:m,onKeydown:si,onKeyup:m})),a}return()=>{if(!t.modelValue)return;let e={class:d.value,style:o.value};return c.value&&Object.assign(e,h.value.chip,{onClick:f,onKeydown:si,onKeyup:p}),ze("div",e,_(),"ripple",!1!==t.ripple&&!t.disable,()=>[[zt,t.ripple]])}}});let ci={...Pe,min:{type:Number,default:0},max:{type:Number,default:100},color:String,centerColor:String,trackColor:String,fontSize:String,rounded:Boolean,thickness:{type:Number,default:.2,validator:e=>e>=0&&e<=1},angle:{type:Number,default:0},showValue:Boolean,reverse:Boolean,instantFeedback:Boolean},di=100*Math.PI,hi=Math.round(1e3*di)/1e3;var pi=h({name:"QCircularProgress",props:{...ci,value:{type:Number,default:0},animationSpeed:{type:[String,Number],default:600},indeterminate:Boolean},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=Ee(t),r=(0,e.computed)(()=>{let e=(a.lang.rtl?-1:1)*t.angle;return{transform:t.reverse===(!0===a.lang.rtl)?`rotate3d(0, 0, 1, ${e-90}deg)`:`scale3d(-1, 1, 1) rotate3d(0, 0, 1, ${-90-e}deg)`}}),o=(0,e.computed)(()=>t.instantFeedback||t.indeterminate?"":{transition:`stroke-dashoffset ${t.animationSpeed}ms ease 0s, stroke ${t.animationSpeed}ms ease`}),s=(0,e.computed)(()=>100/(1-t.thickness/2)),l=(0,e.computed)(()=>`${s.value/2} ${s.value/2} ${s.value} ${s.value}`),u=(0,e.computed)(()=>_e(t.value,t.min,t.max)),c=(0,e.computed)(()=>t.max-t.min),d=(0,e.computed)(()=>t.thickness/2*s.value),h=(0,e.computed)(()=>{let e=(t.max-u.value)/c.value,n=t.rounded&&u.value{let a=[];void 0!==t.centerColor&&"transparent"!==t.centerColor&&a.push((0,e.h)("circle",{class:`q-circular-progress__center text-${t.centerColor}`,fill:"currentColor",r:50-d.value/2,cx:s.value,cy:s.value})),void 0!==t.trackColor&&"transparent"!==t.trackColor&&a.push(p({cls:"track",thickness:d.value,offset:0,color:t.trackColor})),a.push(p({cls:"circle",thickness:d.value,offset:h.value,color:t.color,rounded:t.rounded?"round":void 0}));let o=[(0,e.h)("svg",{class:"q-circular-progress__svg",style:r.value,viewBox:l.value,"aria-hidden":"true"},a)];return t.showValue&&o.push((0,e.h)("div",{class:"q-circular-progress__text absolute-full row flex-center content-center",style:{fontSize:t.fontSize}},void 0===n.default?[(0,e.h)("div",u.value)]:n.default())),(0,e.h)("div",{class:`q-circular-progress q-circular-progress--${t.indeterminate?"in":""}determinate`,style:i.value,role:"progressbar","aria-valuemin":t.min,"aria-valuemax":t.max,"aria-valuenow":t.indeterminate?void 0:u.value},Re(n.internal,o))}}});function fi(e,t,n){let a,i=v(e),r=i.left-t.event.x,o=i.top-t.event.y,s=Math.abs(r),l=Math.abs(o),u=t.direction;u.horizontal&&!u.vertical?a=r<0?"left":"right":!u.horizontal&&u.vertical?a=o<0?"up":"down":u.up&&o<0?(a="up",s>l&&(u.left&&r<0?a="left":u.right&&r>0&&(a="right"))):u.down&&o>0?(a="down",s>l&&(u.left&&r<0?a="left":u.right&&r>0&&(a="right"))):u.left&&r<0?(a="left",s0&&(a="down"))):u.right&&r>0&&(a="right",s0&&(a="down")));let c=!1;if(void 0===a&&!1===n){if(t.event.isFirst||void 0===t.event.lastDir)return{};a=t.event.lastDir,c=!0,"left"===a||"right"===a?(i.left-=r,s=0,r=0):(i.top-=o,l=0,o=0)}return{synthetic:c,payload:{evt:e,touch:!0!==t.event.mouse,mouse:!0===t.event.mouse,position:i,direction:a,isFirst:t.event.isFirst,isFinal:!0===n,duration:Date.now()-t.event.time,distance:{x:s,y:l},offset:{x:r,y:o},delta:{x:i.left-t.event.lastX,y:i.top-t.event.lastY}}}}function mi(){document.body.classList.remove("no-pointer-events--children")}let _i=0;var gi=p({name:"touch-pan",beforeMount(e,{value:t,modifiers:n}){if(!n.mouse&&!c.has.touch)return;function a(e,t){n.mouse&&t?w(e):(n.stop&&b(e),n.prevent&&y(e))}let i={uid:"qvtp_"+_i++,handler:t,modifiers:n,direction:Ma(n),noop:_,mouseStart(e){za(e,i)&&g(e)&&(x(i,"temp",[[document,"mousemove","move","notPassiveCapture"],[document,"mouseup","end","passiveCapture"]]),i.start(e,!0))},touchStart(e){if(za(e,i)){let t=e.target;x(i,"temp",[[t,"touchmove","move","notPassiveCapture"],[t,"touchcancel","end","passiveCapture"],[t,"touchend","end","passiveCapture"]]),i.start(e)}},start(t,a){if(c.is.firefox&&k(e,!0),i.lastEvt=t,a||n.stop){if(!(i.direction.all||a&&(i.modifiers.mouseAllDir||i.modifiers.mousealldir))){let e=t.type.includes("mouse")?new MouseEvent(t.type,t):new TouchEvent(t.type,t);t.defaultPrevented&&y(e),t.cancelBubble&&b(e),Object.assign(e,{qKeyEvent:t.qKeyEvent,qClickOutside:t.qClickOutside,qAnchorHandled:t.qAnchorHandled,qClonedBy:void 0===t.qClonedBy?[i.uid]:t.qClonedBy.concat(i.uid)}),i.initialEvent={target:t.target,event:e}}b(t)}let{left:r,top:o}=v(t);i.event={x:r,y:o,time:Date.now(),mouse:!0===a,detected:!1,isFirst:!0,isFinal:!1,lastX:r,lastY:o}},move(e){if(void 0===i.event)return;let t=v(e),r=t.left-i.event.x,o=t.top-i.event.y;if(0===r&&0===o)return;i.lastEvt=e;let s=!0===i.event.mouse,l=()=>{let t;a(e,s),!n.preserveCursor&&!n.preservecursor&&(t=document.documentElement.style.cursor||"",document.documentElement.style.cursor="grabbing"),s&&document.body.classList.add("no-pointer-events--children"),document.body.classList.add("non-selectable"),Qt(),i.styleCleanup=e=>{i.styleCleanup=void 0,void 0!==t&&(document.documentElement.style.cursor=t),document.body.classList.remove("non-selectable"),s?void 0===e?mi():setTimeout(()=>{mi(),e()},50):void 0!==e&&e()}};if(i.event.detected){i.event.isFirst||a(e,i.event.mouse);let{payload:t,synthetic:n}=fi(e,i,!1);return void(void 0!==t&&(!1===i.handler(t)?i.end(e):(void 0===i.styleCleanup&&i.event.isFirst&&l(),i.event.lastX=t.position.left,i.event.lastY=t.position.top,i.event.lastDir=n?void 0:t.direction,i.event.isFirst=!1)))}if(i.direction.all||s&&(i.modifiers.mouseAllDir||i.modifiers.mousealldir))return l(),i.event.detected=!0,void i.move(e);let u=Math.abs(r),c=Math.abs(o);u!==c&&(i.direction.horizontal&&u>c||i.direction.vertical&&u0||i.direction.left&&u>c&&r<0||i.direction.right&&u>c&&r>0?(i.event.detected=!0,i.move(e)):i.end(e,!0))},end(t,n){if(void 0!==i.event){if(S(i,"temp"),c.is.firefox&&k(e,!1),n)i.styleCleanup?.(),!i.event.detected&&void 0!==i.initialEvent&&i.initialEvent.target.dispatchEvent(i.initialEvent.event);else if(i.event.detected){i.event.isFirst&&i.handler(fi(void 0===t?i.lastEvt:t,i).payload);let{payload:e}=fi(void 0===t?i.lastEvt:t,i,!0),n=()=>{i.handler(e)};void 0===i.styleCleanup?n():i.styleCleanup(n)}i.event=void 0,i.initialEvent=void 0,i.lastEvt=void 0}}};e.__qtouchpan=i,n.mouse&&x(i,"main",[[e,"mousedown","mouseStart","passive"+(n.mouseCapture||n.mousecapture?"Capture":"")]]),c.has.touch&&x(i,"main",[[e,"touchstart","touchStart","passive"+(n.capture?"Capture":"")],[e,"touchmove","noop","notPassiveCapture"]])},updated(e,t){let n=e.__qtouchpan;void 0!==n&&(t.oldValue!==t.value&&("function"!=typeof value&&n.end(),n.handler=t.value),n.direction=Ma(t.modifiers))},beforeUnmount(e){let t=e.__qtouchpan;void 0!==t&&(void 0!==t.event&&t.end(),S(t,"main"),S(t,"temp"),c.is.firefox&&k(e,!1),t.styleCleanup?.(),delete e.__qtouchpan)}});let vi=e=>({value:e}),bi=({marker:t})=>(0,e.h)("div",{key:t.value,style:t.style,class:t.classes},t.label),yi=[34,37,40,33,39,38],wi={...Je,...wa,min:{type:Number,default:0},max:{type:Number,default:100},innerMin:Number,innerMax:Number,step:{type:Number,default:1,validator:e=>e>=0},snap:Boolean,vertical:Boolean,reverse:Boolean,color:String,markerLabelsClass:String,label:Boolean,labelColor:String,labelTextColor:String,labelAlways:Boolean,switchLabelSide:Boolean,markers:[Boolean,Number],markerLabels:[Boolean,Array,Object,Function],switchMarkerLabelsSide:Boolean,trackImg:String,trackColor:String,innerTrackImg:String,innerTrackColor:String,selectionColor:String,selectionImg:String,thumbSize:{type:String,default:"20px"},trackSize:{type:String,default:"4px"},disable:Boolean,readonly:Boolean,dense:Boolean,tabindex:[String,Number],thumbColor:String,thumbPath:{type:String,default:"M 4, 10 a 6,6 0 1,0 12,0 a 6,6 0 1,0 -12,0"}},ki=["pan","update:modelValue","change"];function xi({updateValue:t,updatePosition:n,getDragging:a,formAttrs:i}){let{props:r,emit:o,slots:s,proxy:{$q:l}}=(0,e.getCurrentInstance)(),u=Xe(r,l),c=xa(i),d=(0,e.ref)(!1),h=(0,e.ref)(!1),p=(0,e.ref)(!1),f=(0,e.ref)(!1),m=(0,e.computed)(()=>r.vertical?"--v":"--h"),_=(0,e.computed)(()=>"-"+(r.switchLabelSide?"switched":"standard")),g=(0,e.computed)(()=>r.vertical?r.reverse:r.reverse!==(!0===l.lang.rtl)),b=(0,e.computed)(()=>!Number.isFinite(r.innerMin)||r.innerMin!Number.isFinite(r.innerMax)||r.innerMax>r.max?r.max:r.innerMax),w=(0,e.computed)(()=>!r.disable&&!r.readonly&&b.value{if(0===r.step)return e=>e;let e=(String(r.step).trim().split(".")[1]||"").length;return t=>Number.parseFloat(t.toFixed(e))}),x=(0,e.computed)(()=>0===r.step?1:r.step),S=(0,e.computed)(()=>w.value?r.tabindex||0:-1),C=(0,e.computed)(()=>r.max-r.min),T=(0,e.computed)(()=>y.value-b.value),P=(0,e.computed)(()=>K(b.value)),E=(0,e.computed)(()=>K(y.value)),A=(0,e.computed)(()=>r.vertical?g.value?"bottom":"top":g.value?"right":"left"),L=(0,e.computed)(()=>r.vertical?"height":"width"),M=(0,e.computed)(()=>r.vertical?"width":"height"),R=(0,e.computed)(()=>r.vertical?"vertical":"horizontal"),z=(0,e.computed)(()=>{let e={role:"slider","aria-valuemin":b.value,"aria-valuemax":y.value,"aria-orientation":R.value,"data-step":r.step};return r.disable?e["aria-disabled"]="true":r.readonly&&(e["aria-readonly"]="true"),e}),I=(0,e.computed)(()=>`q-slider q-slider${m.value} q-slider--${d.value?"":"in"}active inline no-wrap `+(r.vertical?"row":"column")+(r.disable?" disabled":" q-slider--enabled"+(w.value?" q-slider--editable":""))+("both"===p.value?" q-slider--focus":"")+(r.label||r.labelAlways?" q-slider--label":"")+(r.labelAlways?" q-slider--label-always":"")+(u.value?" q-slider--dark":"")+(r.dense?" q-slider--dense q-slider--dense"+m.value:""));function N(e){let t="q-slider__"+e;return`${t} ${t}${m.value} ${t}${m.value}${_.value}`}function O(e){let t="q-slider__"+e;return`${t} ${t}${m.value}`}let j=(0,e.computed)(()=>{let e=r.selectionColor||r.color;return"q-slider__selection absolute"+(void 0===e?"":` text-${e}`)}),D=(0,e.computed)(()=>O("markers")+" absolute overflow-hidden"),q=(0,e.computed)(()=>O("track-container")),B=(0,e.computed)(()=>N("pin")),F=(0,e.computed)(()=>N("label")),V=(0,e.computed)(()=>N("text-container")),U=(0,e.computed)(()=>N("marker-labels-container")+(void 0===r.markerLabelsClass?"":` ${r.markerLabelsClass}`)),$=(0,e.computed)(()=>"q-slider__track relative-position no-outline"+(void 0===r.trackColor?"":` bg-${r.trackColor}`)),H=(0,e.computed)(()=>{let e={[M.value]:r.trackSize};return void 0!==r.trackImg&&(e.backgroundImage=`url(${r.trackImg}) !important`),e}),W=(0,e.computed)(()=>"q-slider__inner absolute"+(void 0===r.innerTrackColor?"":` bg-${r.innerTrackColor}`)),G=(0,e.computed)(()=>{let e=E.value-P.value,t={[A.value]:100*P.value+"%",[L.value]:0===e?"2px":100*e+"%"};return void 0!==r.innerTrackImg&&(t.backgroundImage=`url(${r.innerTrackImg}) !important`),t});function K(e){return 0===C.value?0:(e-r.min)/C.value}let Y=(0,e.computed)(()=>re(r.markers)?r.markers:x.value),Q=(0,e.computed)(()=>{let e=[],t=Y.value,n=r.max,a=r.min;do{e.push(a),a+=t}while(a{let e=` q-slider__marker-labels${m.value}-`;return`q-slider__marker-labels${e}${r.switchMarkerLabelsSide?"switched":"standard"}${e}${g.value?"rtl":"ltr"}`}),J=(0,e.computed)(()=>!1===r.markerLabels?null:function(e){if(!1===e)return null;if(!0===e)return Q.value.map(vi);if("function"==typeof e)return Q.value.map(t=>{let n=e(t);return ne(n)?{...n,value:t}:{value:t,label:n}});let t=({value:e})=>e>=r.min&&e<=r.max;return Array.isArray(e)?e.map(e=>ne(e)?e:{value:e}).filter(t):Object.keys(e).map(t=>{let n=e[t],a=Number(t);return ne(n)?{...n,value:a}:{value:a,label:n}}).filter(t)}(r.markerLabels).map((e,t)=>({index:t,value:e.value,label:e.label||e.value,classes:Z.value+(void 0===e.classes?"":" "+e.classes),style:{...te(e.value),...e.style}}))),X=(0,e.computed)(()=>({markerList:J.value,markerMap:ae.value,classes:Z.value,getStyle:te})),ee=(0,e.computed)(()=>{let e=0===T.value?"2px":100*Y.value/T.value;return{...G.value,backgroundSize:r.vertical?`2px ${e}%`:`${e}% 2px`}});function te(e){return{[A.value]:100*(e-r.min)/C.value+"%"}}let ae=(0,e.computed)(()=>{if(!1===r.markerLabels)return null;let e={};return J.value.forEach(t=>{e[t.value]=t}),e});function ie(){if(void 0!==s["marker-label-group"])return s["marker-label-group"](X.value);let e=s["marker-label"]||bi;return J.value.map(t=>e({marker:t,...X.value}))}let oe=(0,e.computed)(()=>[[gi,se,void 0,{[R.value]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]);function se(e){e.isFinal?(void 0!==f.value&&(n(e.evt),e.touch&&t(!0),f.value=void 0,o("pan","end")),d.value=!1,p.value=!1):e.isFirst?(f.value=a(e.evt),n(e.evt),t(),d.value=!0,o("pan","start")):(n(e.evt),t())}function le(){p.value=!1}function ue(){h.value=!1,d.value=!1,t(!0),le(),document.removeEventListener("mouseup",ue,!0)}function ce(e){if(r.vertical)return null;let t=l.lang.rtl===r.reverse?e:1-e;return{transform:`translateX(calc(${2*t-1} * ${r.thumbSize} / 2 + ${50-100*t}%))`}}return(0,e.onBeforeUnmount)(()=>{document.removeEventListener("mouseup",ue,!0)}),{state:{active:d,focus:p,preventFocus:h,dragging:f,editable:w,classes:I,tabindex:S,attributes:z,roundValueFn:k,keyStep:x,trackLen:C,innerMin:b,innerMinRatio:P,innerMax:y,innerMaxRatio:E,positionProp:A,sizeProp:L,isReversed:g},methods:{onActivate:function(e){n(e,a(e)),t(),h.value=!0,d.value=!0,document.addEventListener("mouseup",ue,!0)},onMobileClick:function(e){n(e,a(e)),t(!0)},onBlur:le,onKeyup:function(e){yi.includes(e.keyCode)&&t(!0)},getContent:function(t,n,a,i){let o=[];"transparent"!==r.innerTrackColor&&o.push((0,e.h)("div",{key:"inner",class:W.value,style:G.value})),"transparent"!==r.selectionColor&&o.push((0,e.h)("div",{key:"selection",class:j.value,style:t.value})),!1!==r.markers&&o.push((0,e.h)("div",{key:"marker",class:D.value,style:ee.value})),i(o);let s=[ze("div",{key:"trackC",class:q.value,tabindex:n.value,...a.value},[(0,e.h)("div",{class:$.value,style:H.value},o)],"slide",w.value,()=>oe.value)];return!1!==r.markerLabels&&s[r.switchMarkerLabelsSide?"unshift":"push"]((0,e.h)("div",{key:"markerL",class:U.value},ie())),s},getThumbRenderFn:function(t){let n=(0,e.computed)(()=>h.value||p.value!==t.focusValue&&"both"!==p.value?"":" q-slider--focus"),a=(0,e.computed)(()=>`q-slider__thumb q-slider__thumb${m.value} q-slider__thumb${m.value}-${g.value?"rtl":"ltr"} absolute non-selectable`+n.value+(void 0===t.thumbColor.value?"":` text-${t.thumbColor.value}`)),i=(0,e.computed)(()=>({width:r.thumbSize,height:r.thumbSize,[A.value]:100*t.ratio.value+"%",zIndex:p.value===t.focusValue?2:void 0})),o=(0,e.computed)(()=>void 0===t.labelColor.value?"":` text-${t.labelColor.value}`),s=(0,e.computed)(()=>ce(t.ratio.value)),l=(0,e.computed)(()=>"q-slider__text"+(void 0===t.labelTextColor.value?"":` text-${t.labelTextColor.value}`));return()=>{let n=[(0,e.h)("svg",{class:"q-slider__thumb-shape absolute-full",viewBox:"0 0 20 20","aria-hidden":"true"},[(0,e.h)("path",{d:r.thumbPath})]),(0,e.h)("div",{class:"q-slider__focus-ring fit"})];return(r.label||r.labelAlways)&&n.push((0,e.h)("div",{class:B.value+" absolute fit no-pointer-events"+o.value},[(0,e.h)("div",{class:F.value,style:{minWidth:r.thumbSize}},[(0,e.h)("div",{class:V.value,style:s.value},[(0,e.h)("span",{class:l.value},t.label.value)])])])),!1!==t.injectFormInput&&void 0!==r.name&&!r.disable&&c(n,"push"),(0,e.h)("div",{class:a.value,style:i.value,...t.getNodeData()},n)}},convertRatioToModel:function(e){let{min:t,max:n,step:a}=r,i=t+e*(n-t);if(a>0){let e=(i-b.value)%a;i+=(Math.abs(e)>=a/2?(e<0?-1:1)*a:0)-e}return i=k.value(i),_e(i,b.value,y.value)},convertModelToRatio:K,getDraggingRatio:function(e,t){let n=v(e),a=r.vertical?_e((n.top-t.top)/t.height,0,1):_e((n.left-t.left)/t.width,0,1);return _e(g.value?1-a:a,P.value,E.value)}}}}let Si=()=>({});var Ci=h({name:"QSlider",props:{...wi,modelValue:{required:!0,default:null,validator:e=>"number"==typeof e||null===e},labelValue:[String,Number]},emits:ki,setup(t,{emit:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),{state:i,methods:r}=xi({updateValue:f,updatePosition:function(e,n=i.dragging.value){let a=r.getDraggingRatio(e,n);l.value=r.convertRatioToModel(a),s.value=t.snap&&0!==t.step?r.convertModelToRatio(l.value):a},getDragging:function(){return o.value.getBoundingClientRect()},formAttrs:ka(t)}),o=(0,e.ref)(null),s=(0,e.ref)(0),l=(0,e.ref)(0);(0,e.watch)(()=>`${t.modelValue}|${i.innerMin.value}|${i.innerMax.value}`,function(){l.value=null===t.modelValue?i.innerMin.value:_e(t.modelValue,i.innerMin.value,i.innerMax.value)},{immediate:!0});let u=(0,e.computed)(()=>r.convertModelToRatio(l.value)),c=(0,e.computed)(()=>i.active.value?s.value:u.value),d=(0,e.computed)(()=>{let e={[i.positionProp.value]:100*i.innerMinRatio.value+"%",[i.sizeProp.value]:100*(c.value-i.innerMinRatio.value)+"%"};return void 0!==t.selectionImg&&(e.backgroundImage=`url(${t.selectionImg}) !important`),e}),h=r.getThumbRenderFn({focusValue:!0,getNodeData:Si,ratio:c,label:(0,e.computed)(()=>void 0===t.labelValue?l.value:t.labelValue),thumbColor:(0,e.computed)(()=>t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.labelColor),labelTextColor:(0,e.computed)(()=>t.labelTextColor)}),p=(0,e.computed)(()=>i.editable.value?a.platform.is.mobile?{onClick:r.onMobileClick}:{onMousedown:r.onActivate,onFocus:m,onBlur:r.onBlur,onKeydown:_,onKeyup:r.onKeyup}:{});function f(e){l.value!==t.modelValue&&n("update:modelValue",l.value),e&&n("change",l.value)}function m(){i.focus.value=!0}function _(e){if(!yi.includes(e.keyCode))return;w(e);let n=([34,33].includes(e.keyCode)?10:1)*i.keyStep.value,a=([34,37,40].includes(e.keyCode)?-1:1)*(i.isReversed.value?-1:1)*(t.vertical?-1:1)*n;l.value=_e(i.roundValueFn.value(l.value+a),i.innerMin.value,i.innerMax.value),f()}return()=>{let n=r.getContent(d,i.tabindex,p,e=>{e.push(h())});return(0,e.h)("div",{ref:o,class:i.classes.value+(null===t.modelValue?" q-slider--no-value":""),...i.attributes.value,"aria-valuenow":t.modelValue},n)}}});function Ti(){let t=(0,e.ref)(!o.value);return t.value||(0,e.onMounted)(()=>{t.value=!0}),{isHydrated:t}}let Pi=typeof ResizeObserver<"u",Ei=Pi?{}:{style:"display:block;position:absolute;top:0;left:0;right:0;bottom:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1;",url:"about:blank"};var Ai=h({name:"QResizeObserver",props:{debounce:{type:[String,Number],default:100}},emits:["resize"],setup(t,{emit:n}){let a,i=null,r={width:-1,height:-1};function o(e){!0===e||0===t.debounce||"0"===t.debounce?s():null===i&&(i=setTimeout(s,t.debounce))}function s(){if(null!==i&&(clearTimeout(i),i=null),a){let{offsetWidth:e,offsetHeight:t}=a;(e!==r.width||t!==r.height)&&(r={width:e,height:t},n("resize",r))}}let{proxy:l}=(0,e.getCurrentInstance)();if(l.trigger=o,Pi){let t,n=!1,r=i=>{n||(a=l.$el.parentNode,a?(t=new ResizeObserver(o),t.observe(a),s()):i||(0,e.nextTick)(()=>{r(!0)}))};return(0,e.onMounted)(()=>{r()}),(0,e.onBeforeUnmount)(()=>{n=!0,null!==i&&clearTimeout(i),void 0!==t&&(void 0===t.disconnect?a&&t.unobserve(a):t.disconnect())}),_}let u,{isHydrated:c}=Ti(),d=!1,h=()=>{null!==i&&(clearTimeout(i),i=null),void 0!==u&&(void 0!==u.removeEventListener&&u.removeEventListener("resize",o,m.passive),u=void 0)},p=()=>{h(),a?.contentDocument&&(u=a.contentDocument.defaultView,u.addEventListener("resize",o,m.passive),s())};return(0,e.onMounted)(()=>{(0,e.nextTick)(()=>{d||(a=l.$el,a&&p())})}),(0,e.onBeforeUnmount)(()=>{d=!0,h()}),()=>{if(c.value)return(0,e.h)("object",{class:"q--avoid-card-border",style:Ei.style,tabindex:-1,type:"text/html",data:Ei.url,"aria-hidden":"true",onLoad:p})}}});let Li=!1;{let e=document.createElement("div");e.setAttribute("dir","rtl"),Object.assign(e.style,{width:"1px",height:"1px",overflow:"auto"});let t=document.createElement("div");Object.assign(t.style,{width:"1000px",height:"1px"}),document.body.append(e),e.append(t),e.scrollLeft=-1e3,Li=e.scrollLeft>=0,e.remove()}function Mi(e,t,n){let a=n?["left","right"]:["top","bottom"];return`absolute-${t?a[0]:a[1]}${e?` text-${e}`:""}`}function Ri(e,t){for(let n in e)if(e[n]!==t[n])return!1;return!0}let zi=["left","center","right","justify"];var Ii=h({name:"QTabs",props:{modelValue:[Number,String],align:{type:String,default:"center",validator:e=>zi.includes(e)},breakpoint:{type:[String,Number],default:600},vertical:Boolean,shrink:Boolean,stretch:Boolean,activeClass:String,activeColor:String,activeBgColor:String,indicatorColor:String,leftIcon:String,rightIcon:String,outsideArrows:Boolean,mobileArrows:Boolean,switchIndicator:Boolean,narrowIndicator:Boolean,inlineLabel:Boolean,noCaps:Boolean,dense:Boolean,contentClass:String,"onUpdate:modelValue":[Function,Array]},setup(t,{slots:n,emit:a}){let i,{proxy:r}=(0,e.getCurrentInstance)(),{$q:o}=r,{registerTick:s}=kn(),{registerTick:l}=kn(),{registerTick:u}=kn(),{registerTimeout:c,removeTimeout:d}=xn(),{registerTimeout:h,removeTimeout:p}=xn(),f=(0,e.ref)(null),m=(0,e.ref)(null),_=(0,e.ref)(t.modelValue),g=(0,e.ref)(!1),v=(0,e.ref)(!0),b=(0,e.ref)(!1),y=(0,e.ref)(!1),w=[],k=(0,e.ref)(0),x=(0,e.ref)(!1),S=null,C=null,T=(0,e.computed)(()=>({activeClass:t.activeClass,activeColor:t.activeColor,activeBgColor:t.activeBgColor,indicatorClass:Mi(t.indicatorColor,t.switchIndicator,t.vertical),narrowIndicator:t.narrowIndicator,inlineLabel:t.inlineLabel,noCaps:t.noCaps})),P=(0,e.computed)(()=>{let e=k.value,t=_.value;for(let n=0;n`q-tabs__content--align-${g.value?"left":y.value?"justify":t.align}`),A=(0,e.computed)(()=>`q-tabs row no-wrap items-center q-tabs--${g.value?"":"not-"}scrollable q-tabs--${t.vertical?"vertical":"horizontal"} q-tabs__arrows--${t.outsideArrows?"outside":"inside"} q-tabs--mobile-with${t.mobileArrows?"":"out"}-arrows`+(t.dense?" q-tabs--dense":"")+(t.shrink?" col-shrink":"")+(t.stretch?" self-stretch":"")),L=(0,e.computed)(()=>"q-tabs__content scroll--mobile row no-wrap items-center self-stretch hide-scrollbar relative-position "+E.value+(void 0===t.contentClass?"":` ${t.contentClass}`)),M=(0,e.computed)(()=>t.vertical?{container:"height",content:"offsetHeight",scroll:"scrollHeight"}:{container:"width",content:"offsetWidth",scroll:"scrollWidth"}),R=(0,e.computed)(()=>!t.vertical&&!0===o.lang.rtl),z=(0,e.computed)(()=>!Li&&R.value);function I({name:e,setCurrent:n,skipEmit:i}){_.value!==e&&(!i&&void 0!==t["onUpdate:modelValue"]&&a("update:modelValue",e),(n||void 0===t["onUpdate:modelValue"])&&(function(e,n){let a=null!=e&&""!==e?w.find(t=>t.name.value===e):null,i=null!=n&&""!==n?w.find(e=>e.name.value===n):null;if(X)X=!1;else if(a&&i){let e=a.tabIndicatorRef.value,n=i.tabIndicatorRef.value;null!==S&&(clearTimeout(S),S=null),e.style.transition="none",e.style.transform="none",n.style.transition="none",n.style.transform="none";let r=e.getBoundingClientRect(),o=n.getBoundingClientRect();n.style.transform=t.vertical?`translate3d(0,${r.top-o.top}px,0) scale3d(1,${o.height?r.height/o.height:1},1)`:`translate3d(${r.left-o.left}px,0,0) scale3d(${o.width?r.width/o.width:1},1,1)`,u(()=>{S=setTimeout(()=>{S=null,n.style.transition="transform .25s cubic-bezier(.4, 0, .2, 1)",n.style.transform="none"},70)})}i&&g.value&&j(i.rootRef.value)}(_.value,e),_.value=e))}function N(){s(()=>{f.value&&O({width:f.value.offsetWidth,height:f.value.offsetHeight})})}function O(e){if(void 0===M.value||null===m.value)return;let n=e[M.value.container],a=Math.min(m.value[M.value.scroll],Array.prototype.reduce.call(m.value.children,(e,t)=>e+(t[M.value.content]||0),0)),i=n>0&&a>n;g.value=i,i&&l(D),y.value=n0&&(m.value[t.vertical?"scrollTop":"scrollLeft"]+=Math.ceil(s),D())}function D(){let e=m.value;if(null===e)return;let n=e.getBoundingClientRect(),a=t.vertical?e.scrollTop:Math.abs(e.scrollLeft);R.value?(v.value=Math.ceil(a+n.width)0):(v.value=a>0,b.value=t.vertical?Math.ceil(a+n.height){(function(e){let t=m.value,{get:n,set:a}=U.value,i=!1,r=n(t),o=e=e)&&(i=!0,r=e),a(t,r),D(),i})(e)&&V()},5)}function B(){q(z.value?2**53-1:0)}function F(){q(z.value?0:2**53-1)}function V(){null!==C&&(clearInterval(C),C=null)}(0,e.watch)(R,D),(0,e.watch)(()=>t.modelValue,e=>{I({name:e,setCurrent:!0,skipEmit:!0})}),(0,e.watch)(()=>t.outsideArrows,N);let U=(0,e.computed)(()=>z.value?{get:e=>Math.abs(e.scrollLeft),set:(e,t)=>{e.scrollLeft=-t}}:t.vertical?{get:e=>e.scrollTop,set:(e,t)=>{e.scrollTop=t}}:{get:e=>e.scrollLeft,set:(e,t)=>{e.scrollLeft=t}});function $(){let e=null,t={matchedLen:0,queryDiff:9999,hrefLen:0},n=w.filter(e=>!0===e.routeData?.hasRouterLink.value),{hash:a,query:i}=r.$route,o=Object.keys(i).length;for(let r of n){let n=!0===r.routeData.exact.value;if(!r.routeData[n?"linkIsExactActive":"linkIsActive"].value)continue;let{hash:s,query:l,matched:u,href:c}=r.routeData.resolvedLink.value,d=Object.keys(l).length;if(n){if(s!==a||d!==o||!Ri(i,l))continue;e=r.name.value;break}if(""!==s&&s!==a||0!==d&&!Ri(l,i))continue;let h={matchedLen:u.length,queryDiff:o-d,hrefLen:c.length-s.length};if(h.matchedLen>t.matchedLen)e=r.name.value,t=h;else if(h.matchedLen===t.matchedLen){if(h.queryDifft.hrefLen&&(e=r.name.value,t=h)}}null===e&&w.some(e=>void 0===e.routeData&&e.name.value===_.value)?X=!1:I({name:e,setCurrent:!0})}function H(e){if(d(),!x.value&&null!==f.value&&e.target&&"function"==typeof e.target.closest){let t=e.target.closest(".q-tab");t&&f.value.contains(t)&&(x.value=!0,g.value&&j(t))}}function W(){c(()=>{x.value=!1},30)}function G(){!1===Y.avoidRouteWatcher?h($):p()}function K(){if(void 0===i){let t=(0,e.watch)(()=>r.$route.fullPath,G);i=()=>{t(),i=void 0}}}let Y={currentModel:_,tabProps:T,hasFocus:x,hasActiveTab:P,registerTab:function(e){w.push(e),k.value++,N(),void 0===e.routeData||void 0===r.$route?h(()=>{if(g.value){let e=_.value,t=null!=e&&""!==e?w.find(t=>t.name.value===e):null;t&&j(t.rootRef.value)}}):(K(),e.routeData.hasRouterLink.value&&G())},unregisterTab:function(e){w.splice(w.indexOf(e),1),k.value--,N(),void 0!==i&&void 0!==e.routeData&&(w.every(e=>void 0===e.routeData)&&i(),G())},verifyRouteModel:G,updateModel:I,onKbdNavigate:function(e,n){let a=Array.prototype.filter.call(m.value.children,e=>e===n||e.matches?.(".q-tab.q-focusable")),i=a.length;if(0===i)return;if(36===e)return j(a[0]),a[0].focus(),!0;if(35===e)return j(a[i-1]),a[i-1].focus(),!0;let r=e===(t.vertical?38:37),o=e===(t.vertical?40:39),s=r?-1:o?1:void 0;if(void 0!==s){let e=!0!==t.vertical&&R.value?-1:1,r=(a.indexOf(n)+s*e+i)%i;return j(a[r]),a[r].focus({preventScroll:!0}),!0}},avoidRouteWatcher:!1};function Q(){null!==S&&clearTimeout(S),V(),i?.()}(0,e.provide)(J,Y);let Z=!1,X=!1;return(0,e.onBeforeUnmount)(Q),(0,e.onDeactivated)(()=>{Z=void 0!==i,Q()}),(0,e.onActivated)(()=>{Z&&(K(),X=!0,G()),N()}),()=>(0,e.h)("div",{ref:f,class:A.value,role:"tablist","aria-orientation":t.vertical?"vertical":"horizontal",onFocusin:H,onFocusout:W},[(0,e.h)(Ai,{onResize:O}),(0,e.h)("div",{ref:m,class:L.value,onScroll:D},Ae(n.default)),(0,e.h)(Ke,{class:"q-tabs__arrow q-tabs__arrow--left absolute q-tab__icon"+(v.value?"":" q-tabs__arrow--faded"),name:t.leftIcon||o.iconSet.tabs[t.vertical?"up":"left"],onMousedownPassive:B,onTouchstartPassive:B,onMouseupPassive:V,onMouseleavePassive:V,onTouchendPassive:V}),(0,e.h)(Ke,{class:"q-tabs__arrow q-tabs__arrow--right absolute q-tab__icon"+(b.value?"":" q-tabs__arrow--faded"),name:t.rightIcon||o.iconSet.tabs[t.vertical?"down":"right"],onMousedownPassive:F,onTouchstartPassive:F,onMouseupPassive:V,onMouseleavePassive:V,onTouchendPassive:V})])}});let Ni=0,Oi=["click","keydown"],ji={icon:String,label:[Number,String],alert:[Boolean,String],alertIcon:String,name:{type:[Number,String],default:()=>"t_"+Ni++},noCaps:Boolean,tabindex:[String,Number],disable:Boolean,contentClass:String,ripple:{type:[Boolean,Object],default:!0}};function Di(t,n,a,i){let r=(0,e.inject)(J,ee);if(r===ee)return console.error("QTab/QRouteTab component needs to be child of QTabs"),ee;let{proxy:o}=(0,e.getCurrentInstance)(),s=(0,e.ref)(null),l=(0,e.ref)(null),u=(0,e.ref)(null),c=(0,e.computed)(()=>!t.disable&&!1!==t.ripple&&{keyCodes:[13,32],early:!0,...!0===t.ripple?{}:t.ripple}),d=(0,e.computed)(()=>r.currentModel.value===t.name),h=(0,e.computed)(()=>"q-tab relative-position self-stretch flex flex-center text-center"+(d.value?" q-tab--active"+(r.tabProps.value.activeClass?" "+r.tabProps.value.activeClass:"")+(r.tabProps.value.activeColor?` text-${r.tabProps.value.activeColor}`:"")+(r.tabProps.value.activeBgColor?` bg-${r.tabProps.value.activeBgColor}`:""):" q-tab--inactive")+(t.icon&&t.label&&!r.tabProps.value.inlineLabel?" q-tab--full":"")+(t.noCaps||r.tabProps.value.noCaps?" q-tab--no-caps":"")+(t.disable?" disabled":" q-focusable q-hoverable cursor-pointer")+(void 0===i?"":i.linkClass.value)),p=(0,e.computed)(()=>"q-tab__content self-stretch flex-center relative-position q-anchor--skip non-selectable "+(r.tabProps.value.inlineLabel?"row no-wrap q-tab__content--inline":"column")+(void 0===t.contentClass?"":` ${t.contentClass}`)),f=(0,e.computed)(()=>t.disable||r.hasFocus.value||!d.value&&r.hasActiveTab.value?-1:t.tabindex||0);function m(e,n){if(!n&&!e?.qAvoidFocus&&s.value?.focus(),t.disable)!0===i?.hasRouterLink.value&&w(e);else{if(void 0===i)return r.updateModel({name:t.name}),void a("click",e);if(i.hasRouterLink.value){let n=(n={})=>{let a,o=void 0===n.to||te(n.to,t.to)?r.avoidRouteWatcher=_a():null;return i.navigateToRouterLink(e,{...n,returnRouterError:!0}).catch(e=>{a=e}).then(e=>{if(o===r.avoidRouteWatcher&&(r.avoidRouteWatcher=!1,void 0===a&&(void 0===e||!0===e.message?.startsWith("Avoided redundant navigation"))&&r.updateModel({name:t.name})),n.returnRouterError)return void 0===a?e:Promise.reject(a)})};return a("click",e,n),void(e.defaultPrevented||n())}a("click",e)}}function _(e){N(e,[13,32])?m(e,!0):!I(e)&&e.keyCode>=35&&e.keyCode<=40&&!e.altKey&&!e.metaKey&&r.onKbdNavigate(e.keyCode,o.$el)&&w(e),a("keydown",e)}function g(){let a=r.tabProps.value.narrowIndicator,i=[],o=(0,e.h)("div",{ref:u,class:["q-tab__indicator",r.tabProps.value.indicatorClass]});void 0!==t.icon&&i.push((0,e.h)(Ke,{class:"q-tab__icon",name:t.icon})),void 0!==t.label&&i.push((0,e.h)("div",{class:"q-tab__label"},t.label)),t.alert&&i.push(void 0===t.alertIcon?(0,e.h)("div",{class:"q-tab__alert"+(!0===t.alert?"":` text-${t.alert}`)}):(0,e.h)(Ke,{class:"q-tab__alert-icon",color:!0===t.alert?void 0:t.alert,name:t.alertIcon})),a&&i.push(o);let l=[(0,e.h)("div",{class:"q-focus-helper",tabindex:-1,ref:s}),(0,e.h)("div",{class:p.value},Me(n.default,i))];return a||l.push(o),l}let v={name:(0,e.computed)(()=>t.name),rootRef:l,tabIndicatorRef:u,routeData:i};return(0,e.onBeforeUnmount)(()=>{r.unregisterTab(v)}),(0,e.onMounted)(()=>{r.registerTab(v)}),{renderTab:function(n,a){return(0,e.withDirectives)((0,e.h)(n,{ref:l,class:h.value,tabindex:f.value,role:"tab","aria-selected":d.value?"true":"false","aria-disabled":t.disable?"true":void 0,onClick:m,onKeydown:_,...a},g()),[[zt,c.value]])},$tabs:r}}var qi=h({name:"QTab",props:ji,emits:Oi,setup(e,{slots:t,emit:n}){let{renderTab:a}=Di(e,t,n);return()=>a("div")}}),Bi=h({name:"QTabPanels",props:{...Ba,...Je},emits:Fa,setup(t,{slots:n}){let a=Xe(t,(0,e.getCurrentInstance)().proxy.$q),{updatePanelsList:i,getPanelContent:r,panelDirectives:o}=Ua(),s=(0,e.computed)(()=>"q-tab-panels q-panel-parent"+(a.value?" q-tab-panels--dark q-dark":""));return()=>(i(n),ze("div",{class:s.value},r(),"pan",t.swipeable,()=>o.value))}}),Fi=h({name:"QTabPanel",props:Da,setup:(t,{slots:n})=>()=>(0,e.h)("div",{class:"q-tab-panel",role:"tabpanel"},Ae(n.default))});let Vi=/^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/,Ui=/^#[0-9a-fA-F]{4}([0-9a-fA-F]{4})?$/,$i=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,Hi=/^rgb\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5])\)$/,Wi=/^rgba\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),(0|0\.[0-9]+[1-9]|0\.[1-9]+|1)\)$/,Gi=/^-?[\d]+\/[0-1]\d\/[0-3]\d$/,Ki=/^([0-1]?\d|2[0-3]):[0-5]\d$/,Yi=/^([0-1]?\d|2[0-3]):[0-5]\d:[0-5]\d$/,Qi=/^([0-1]?\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/,Zi=/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,Ji={date:e=>Gi.test(e),time:e=>Ki.test(e),fulltime:e=>Yi.test(e),timeOrFulltime:e=>Qi.test(e),email:e=>Zi.test(e),hexColor:e=>Vi.test(e),hexaColor:e=>Ui.test(e),hexOrHexaColor:e=>$i.test(e),rgbColor:e=>Hi.test(e),rgbaColor:e=>Wi.test(e),rgbOrRgbaColor:e=>Hi.test(e)||Wi.test(e),hexOrRgbColor:e=>Vi.test(e)||Hi.test(e),hexaOrRgbaColor:e=>Ui.test(e)||Wi.test(e),anyColor:e=>$i.test(e)||Hi.test(e)||Wi.test(e)};var Xi={testPattern:Ji};let er=/^rgb(a)?\((\d{1,3}),(\d{1,3}),(\d{1,3}),?([01]?\.?\d*?)?\)$/;function tr({r:e,g:t,b:n,a:a}){let i=void 0!==a;if(e=Math.round(e),t=Math.round(t),n=Math.round(n),e>255||t>255||n>255||i&&a>100)throw TypeError("Expected 3 numbers below 256 (and optionally one below 100)");return a=i?(256|Math.round(255*a/100)).toString(16).slice(1):"","#"+(n|t<<8|e<<16|1<<24).toString(16).slice(1)+a}function nr({r:e,g:t,b:n,a:a}){return`rgb${void 0===a?"":"a"}(${e},${t},${n}${void 0===a?"":","+a/100})`}function ar(e){if("string"!=typeof e)throw TypeError("Expected a string");3===(e=e.replace(/^#/,"")).length?e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]:4===e.length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]+e[3]+e[3]);let t=Number.parseInt(e,16);return e.length>6?{r:t>>24&255,g:t>>16&255,b:t>>8&255,a:Math.round((255&t)/2.55)}:{r:t>>16,g:t>>8&255,b:255&t}}function ir({h:e,s:t,v:n,a:a}){let i,r,o;t/=100,n/=100,e/=360;let s=Math.floor(6*e),l=6*e-s,u=n*(1-t),c=n*(1-l*t),d=n*(1-(1-l)*t);switch(s%6){case 0:i=n,r=d,o=u;break;case 1:i=c,r=n,o=u;break;case 2:i=u,r=n,o=d;break;case 3:i=u,r=c,o=n;break;case 4:i=d,r=u,o=n;break;case 5:i=n,r=u,o=c}return{r:Math.round(255*i),g:Math.round(255*r),b:Math.round(255*o),a:a}}function rr({r:e,g:t,b:n,a:a}){let i,r=Math.max(e,t,n),o=Math.min(e,t,n),s=r-o,l=0===r?0:s/r,u=r/255;switch(r){case o:i=0;break;case e:i=t-n+s*(t1)throw TypeError("Expected offset to be between -1 and 1");let{r:n,g:a,b:i,a:r}=or(e),o=void 0===r?0:r/100;return tr({r:n,g:a,b:i,a:Math.round(100*Math.min(1,Math.max(0,o+t)))})},getPaletteColor:function(e){if("string"!=typeof e)throw TypeError("Expected a string as color");let t=document.createElement("div");t.className=`text-${e} invisible fixed no-pointer-events`,document.body.append(t);let n=getComputedStyle(t).getPropertyValue("color");return t.remove(),tr(or(n))}};let ur="rgb(255,204,204).rgb(255,230,204).rgb(255,255,204).rgb(204,255,204).rgb(204,255,230).rgb(204,255,255).rgb(204,230,255).rgb(204,204,255).rgb(230,204,255).rgb(255,204,255).rgb(255,153,153).rgb(255,204,153).rgb(255,255,153).rgb(153,255,153).rgb(153,255,204).rgb(153,255,255).rgb(153,204,255).rgb(153,153,255).rgb(204,153,255).rgb(255,153,255).rgb(255,102,102).rgb(255,179,102).rgb(255,255,102).rgb(102,255,102).rgb(102,255,179).rgb(102,255,255).rgb(102,179,255).rgb(102,102,255).rgb(179,102,255).rgb(255,102,255).rgb(255,51,51).rgb(255,153,51).rgb(255,255,51).rgb(51,255,51).rgb(51,255,153).rgb(51,255,255).rgb(51,153,255).rgb(51,51,255).rgb(153,51,255).rgb(255,51,255).rgb(255,0,0).rgb(255,128,0).rgb(255,255,0).rgb(0,255,0).rgb(0,255,128).rgb(0,255,255).rgb(0,128,255).rgb(0,0,255).rgb(128,0,255).rgb(255,0,255).rgb(245,0,0).rgb(245,123,0).rgb(245,245,0).rgb(0,245,0).rgb(0,245,123).rgb(0,245,245).rgb(0,123,245).rgb(0,0,245).rgb(123,0,245).rgb(245,0,245).rgb(214,0,0).rgb(214,108,0).rgb(214,214,0).rgb(0,214,0).rgb(0,214,108).rgb(0,214,214).rgb(0,108,214).rgb(0,0,214).rgb(108,0,214).rgb(214,0,214).rgb(163,0,0).rgb(163,82,0).rgb(163,163,0).rgb(0,163,0).rgb(0,163,82).rgb(0,163,163).rgb(0,82,163).rgb(0,0,163).rgb(82,0,163).rgb(163,0,163).rgb(92,0,0).rgb(92,46,0).rgb(92,92,0).rgb(0,92,0).rgb(0,92,46).rgb(0,92,92).rgb(0,46,92).rgb(0,0,92).rgb(46,0,92).rgb(92,0,92).rgb(255,255,255).rgb(205,205,205).rgb(178,178,178).rgb(153,153,153).rgb(127,127,127).rgb(102,102,102).rgb(76,76,76).rgb(51,51,51).rgb(25,25,25).rgb(0,0,0)".split("."),cr="M5 5 h10 v10 h-10 v-10 z",dr=/^[0-9]+$/,hr=/^#[0-9A-Fa-f]+$/,pr=/^rgb\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3}\)$/,fr=/^rgba\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},(0|0\.[0-9]+[1-9]|0\.[1-9]+|1)\)$/;var mr=h({name:"QColor",props:{...Je,...wa,modelValue:String,defaultValue:String,defaultView:{type:String,default:"spectrum",validator:e=>["spectrum","tune","palette"].includes(e)},formatModel:{type:String,default:"auto",validator:e=>["auto","hex","rgb","hexa","rgba"].includes(e)},palette:Array,noHeader:Boolean,noHeaderTabs:Boolean,noFooter:Boolean,square:Boolean,flat:Boolean,bordered:Boolean,disable:Boolean,readonly:Boolean},emits:["update:modelValue","change"],setup(t,{emit:n}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:i}=a,r=Xe(t,i),{getCache:o}=ja(),s=(0,e.ref)(null),l=(0,e.ref)(null),u=(0,e.computed)(()=>"auto"===t.formatModel?null:t.formatModel.includes("hex")),c=(0,e.computed)(()=>"auto"===t.formatModel?null:t.formatModel.includes("a")),d=(0,e.ref)("auto"===t.formatModel?void 0===t.modelValue||null===t.modelValue||""===t.modelValue||t.modelValue.startsWith("#")?"hex":"rgb":t.formatModel.startsWith("hex")?"hex":"rgb"),h=(0,e.ref)(t.defaultView),p=(0,e.ref)(A(t.modelValue||t.defaultValue)),f=(0,e.computed)(()=>!t.disable&&!t.readonly),m=(0,e.computed)(()=>void 0===t.modelValue||null===t.modelValue||""===t.modelValue||t.modelValue.startsWith("#")),_=(0,e.computed)(()=>null===u.value?m.value:u.value),g=xa((0,e.computed)(()=>({type:"hidden",name:t.name,value:p.value[_.value?"hex":"rgb"]}))),v=(0,e.computed)(()=>null===c.value?void 0!==p.value.a:c.value),y=(0,e.computed)(()=>({backgroundColor:p.value.rgb||"#000"})),w=(0,e.computed)(()=>"q-color-picker__header-content q-color-picker__header-content--"+(void 0!==p.value.a&&p.value.a<65||sr(p.value)>.4?"light":"dark")),k=(0,e.computed)(()=>({background:`hsl(${p.value.h},100%,50%)`})),x=(0,e.computed)(()=>({top:100-p.value.v+"%",[i.lang.rtl?"right":"left"]:`${p.value.s}%`})),S=(0,e.computed)(()=>void 0!==t.palette&&0!==t.palette.length?t.palette:ur),C=(0,e.computed)(()=>"q-color-picker"+(t.bordered?" q-color-picker--bordered":"")+(t.square?" q-color-picker--square no-border-radius":"")+(t.flat?" q-color-picker--flat no-shadow":"")+(t.disable?" disabled":"")+(r.value?" q-color-picker--dark q-dark":"")),T=(0,e.computed)(()=>t.disable?{"aria-disabled":"true"}:{}),P=(0,e.computed)(()=>[[gi,N,void 0,{prevent:!0,stop:!0,mouse:!0}]]);function E(e,t){p.value.hex=tr(e),p.value.rgb=nr(e),p.value.r=e.r,p.value.g=e.g,p.value.b=e.b,p.value.a=e.a;let a=p.value[_.value?"hex":"rgb"];n("update:modelValue",a),t&&n("change",a)}function A(e){let n=void 0===c.value?"auto"===t.formatModel?null:t.formatModel.includes("a"):c.value;if("string"!=typeof e||0===e.length||!Ji.anyColor(e.replaceAll(" ","")))return{h:0,s:0,v:0,r:0,g:0,b:0,a:n?100:void 0,hex:void 0,rgb:void 0};let a=or(e);return n&&void 0===a.a&&(a.a=100),a.hex=tr(a),a.rgb=nr(a),Object.assign(a,rr(a))}function L(e,t,n){let a=s.value;if(null===a)return;let r=a.clientWidth,o=a.clientHeight,l=a.getBoundingClientRect(),u=Math.min(r,Math.max(0,e-l.left));i.lang.rtl&&(u=r-u);let c=Math.min(o,Math.max(0,t-l.top)),d=Math.round(100*u/r),h=Math.round(100*Math.max(0,Math.min(1,-c/o+1))),f=ir({h:p.value.h,s:d,v:h,a:v.value?p.value.a:void 0});p.value.s=d,p.value.v=h,E(f,n)}function M(e,t){let n=Math.round(e),a=ir({h:n,s:p.value.s,v:p.value.v,a:v.value?p.value.a:void 0});p.value.h=n,E(a,t)}function R(e){M(e,!0)}function z(t,n,i,r,o){if(void 0!==r&&b(r),!dr.test(t))return void(o&&a.$forceUpdate());let s=Math.floor(Number(t));if(s<0||s>i)return void(o&&a.$forceUpdate());let l={r:"r"===n?s:p.value.r,g:"g"===n?s:p.value.g,b:"b"===n?s:p.value.b,a:v.value?"a"===n?s:p.value.a:void 0};if("a"!==n){let e=rr(l);p.value.h=e.h,p.value.s=e.s,p.value.v=e.v}if(E(l,o),!o&&void 0!==r?.target.selectionEnd){let t=r.target.selectionEnd;(0,e.nextTick)(()=>{r.target.setSelectionRange(t,t)})}}function I(t,n){let a,i=t.target.value;if(b(t),"hex"===d.value){if(i.length!==(v.value?9:7)||!hr.test(i))return!0;a=ar(i)}else{let e;if(!i.endsWith(")"))return!0;if(!v.value&&i.startsWith("rgb(")){if(e=i.slice(4,-1).split(",").map(e=>Number.parseInt(e,10)),3!==e.length||!pr.test(i))return!0}else{if(!v.value||!i.startsWith("rgba("))return!0;{if(e=i.slice(5,-1).split(","),4!==e.length||!fr.test(i))return!0;for(let t=0;t<3;t++){let n=Number.parseInt(e[t],10);if(n<0||n>255)return!0;e[t]=n}let t=Number.parseFloat(e[3]);if(t<0||t>1)return!0;e[3]=t}}if(e[0]<0||e[0]>255||e[1]<0||e[1]>255||e[2]<0||e[2]>255||v.value&&(e[3]<0||e[3]>1))return!0;a={r:e[0],g:e[1],b:e[2],a:v.value?100*e[3]:void 0}}let r=rr(a);if(p.value.h=r.h,p.value.s=r.s,p.value.v=r.v,E(a,n),!n){let n=t.target.selectionEnd;(0,e.nextTick)(()=>{t.target.setSelectionRange(n,n)})}}function N(e){e.isFinal?L(e.position.left,e.position.top,!0):O(e)}(0,e.watch)(()=>t.modelValue,e=>{let n=A(e||t.defaultValue);n.hex!==p.value.hex&&(p.value=n)}),(0,e.watch)(()=>t.defaultValue,e=>{if(!t.modelValue&&e){let t=A(e);t.hex!==p.value.hex&&(p.value=t)}});let O=Lt(e=>{L(e.position.left,e.position.top)},20);function j(e){L(e.pageX-window.pageXOffset,e.pageY-window.pageYOffset,!0)}function D(e){L(e.pageX-window.pageXOffset,e.pageY-window.pageYOffset)}function q(e){null!==l.value&&(l.value.$el.style.opacity=+!!e)}function B(e){d.value=e}function F(e){h.value=e}function V(){let t={ref:s,class:"q-color-picker__spectrum non-selectable relative-position cursor-pointer"+(f.value?"":" readonly"),style:k.value,...f.value?{onClick:j,onMousedown:D}:{}},n=[(0,e.h)("div",{style:{paddingBottom:"100%"}}),(0,e.h)("div",{class:"q-color-picker__spectrum-white absolute-full"}),(0,e.h)("div",{class:"q-color-picker__spectrum-black absolute-full"}),(0,e.h)("div",{class:"absolute",style:x.value},[void 0===p.value.hex?null:(0,e.h)("div",{class:"q-color-picker__spectrum-circle"})])],a=[(0,e.h)(Ci,{class:"q-color-picker__hue non-selectable",modelValue:p.value.h,min:0,max:360,trackSize:"8px",innerTrackColor:"transparent",selectionColor:"transparent",readonly:!f.value,thumbPath:cr,"onUpdate:modelValue":M,onChange:R})];return v.value&&a.push((0,e.h)(Ci,{class:"q-color-picker__alpha non-selectable",modelValue:p.value.a,min:0,max:100,trackSize:"8px",trackColor:"white",innerTrackColor:"transparent",selectionColor:"transparent",trackImg:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAH0lEQVQoU2NkYGAwZkAFZ5G5jPRRgOYEVDeB3EBjBQBOZwTVugIGyAAAAABJRU5ErkJggg==",readonly:!f.value,hideSelection:!0,thumbPath:cr,...o("alphaSlide",{"onUpdate:modelValue":e=>z(e,"a",100),onChange:e=>z(e,"a",100,void 0,!0)})})),[ze("div",t,n,"spec",f.value,()=>P.value),(0,e.h)("div",{class:"q-color-picker__sliders"},a)]}function U(){return[(0,e.h)("div",{class:"row items-center no-wrap"},[(0,e.h)("div","R"),(0,e.h)(Ci,{modelValue:p.value.r,min:0,max:255,color:"red",dark:r.value,readonly:!f.value,...o("rSlide",{"onUpdate:modelValue":e=>z(e,"r",255),onChange:e=>z(e,"r",255,void 0,!0)})}),(0,e.h)("input",{value:p.value.r,maxlength:3,readonly:!f.value,onChange:b,...o("rIn",{onInput:e=>z(e.target.value,"r",255,e),onBlur:e=>z(e.target.value,"r",255,e,!0)})})]),(0,e.h)("div",{class:"row items-center no-wrap"},[(0,e.h)("div","G"),(0,e.h)(Ci,{modelValue:p.value.g,min:0,max:255,color:"green",dark:r.value,readonly:!f.value,...o("gSlide",{"onUpdate:modelValue":e=>z(e,"g",255),onChange:e=>z(e,"g",255,void 0,!0)})}),(0,e.h)("input",{value:p.value.g,maxlength:3,readonly:!f.value,onChange:b,...o("gIn",{onInput:e=>z(e.target.value,"g",255,e),onBlur:e=>z(e.target.value,"g",255,e,!0)})})]),(0,e.h)("div",{class:"row items-center no-wrap"},[(0,e.h)("div","B"),(0,e.h)(Ci,{modelValue:p.value.b,min:0,max:255,color:"blue",readonly:!f.value,dark:r.value,...o("bSlide",{"onUpdate:modelValue":e=>z(e,"b",255),onChange:e=>z(e,"b",255,void 0,!0)})}),(0,e.h)("input",{value:p.value.b,maxlength:3,readonly:!f.value,onChange:b,...o("bIn",{onInput:e=>z(e.target.value,"b",255,e),onBlur:e=>z(e.target.value,"b",255,e,!0)})})]),v.value?(0,e.h)("div",{class:"row items-center no-wrap"},[(0,e.h)("div","A"),(0,e.h)(Ci,{modelValue:p.value.a,color:"grey",readonly:!f.value,dark:r.value,...o("aSlide",{"onUpdate:modelValue":e=>z(e,"a",100),onChange:e=>z(e,"a",100,void 0,!0)})}),(0,e.h)("input",{value:p.value.a,maxlength:3,readonly:!f.value,onChange:b,...o("aIn",{onInput:e=>z(e.target.value,"a",100,e),onBlur:e=>z(e.target.value,"a",100,e,!0)})})]):null]}function $(){return[(0,e.h)("div",{class:"row items-center q-color-picker__palette-rows"+(f.value?" q-color-picker__palette-rows--editable":"")},S.value.map(t=>(0,e.h)("div",{class:"q-color-picker__cube col-auto",style:{backgroundColor:t},...f.value?o("palette#"+t,{onClick:()=>{!function(e){let t=A(e),n={r:t.r,g:t.g,b:t.b,a:t.a};void 0===n.a&&(n.a=p.value.a),p.value.h=t.h,p.value.s=t.s,p.value.v=t.v,E(n,!0)}(t)}}):{}})))]}return()=>{let n=[(0,e.h)(Bi,{modelValue:h.value,animated:!0},()=>[(0,e.h)(Fi,{class:"q-color-picker__spectrum-tab overflow-hidden",name:"spectrum"},V),(0,e.h)(Fi,{class:"q-pa-md q-color-picker__tune-tab",name:"tune"},U),(0,e.h)(Fi,{class:"q-color-picker__palette-tab",name:"palette"},$)])];return void 0!==t.name&&!t.disable&&g(n,"push"),t.noHeader||n.unshift(function(){let n=[];return t.noHeaderTabs||n.push((0,e.h)(Ii,{class:"q-color-picker__header-tabs",modelValue:d.value,dense:!0,align:"justify","onUpdate:modelValue":B},()=>[(0,e.h)(qi,{label:"HEX"+(v.value?"A":""),name:"hex",ripple:!1}),(0,e.h)(qi,{label:"RGB"+(v.value?"A":""),name:"rgb",ripple:!1})])),n.push((0,e.h)("div",{class:"q-color-picker__header-banner row flex-center no-wrap"},[(0,e.h)("input",{class:"fit",value:p.value[d.value],...f.value?{}:{readonly:!0},...o("topIn",{onInput:e=>{q(I(e))},onChange:b,onBlur:e=>{I(e,!0)&&a.$forceUpdate(),q(!1)}})}),(0,e.h)(Ke,{ref:l,class:"q-color-picker__error-icon absolute no-pointer-events",name:i.iconSet.type.negative})])),(0,e.h)("div",{class:"q-color-picker__header relative-position overflow-hidden"},[(0,e.h)("div",{class:"q-color-picker__header-bg absolute-full"}),(0,e.h)("div",{class:w.value,style:y.value},n)])}()),t.noFooter||n.push((0,e.h)("div",{class:"q-color-picker__footer relative-position overflow-hidden"},[(0,e.h)(Ii,{class:"absolute-full",modelValue:h.value,dense:!0,align:"justify","onUpdate:modelValue":F},()=>[(0,e.h)(qi,{icon:i.iconSet.colorPicker.spectrum,name:"spectrum",ripple:!1}),(0,e.h)(qi,{icon:i.iconSet.colorPicker.tune,name:"tune",ripple:!1}),(0,e.h)(qi,{icon:i.iconSet.colorPicker.palette,name:"palette",ripple:!1})])])),(0,e.h)("div",{class:C.value,...T.value},n)}}});let _r=[-61,9,38,199,426,686,756,818,1111,1181,1210,1635,2060,2097,2192,2262,2324,2394,2456,3178];function gr(e,t,n){return"[object Date]"===Object.prototype.toString.call(e)&&(n=e.getDate(),t=e.getMonth()+1,e=e.getFullYear()),function(e){let t,n,a,i=xr(e).gy,r=i-621,o=wr(r,!1);if(a=e-kr(i,3,o.march),a>=0){if(a<=185)return n=1+Sr(a,31),t=Cr(a,31)+1,{jy:r,jm:n,jd:t};a-=186}else--r,a+=179,1===o.leap&&(a+=1);return n=7+Sr(a,30),t=Cr(a,30)+1,{jy:r,jm:n,jd:t}}(kr(e,t,n))}function vr(e,t,n){return xr(function(e,t,n){let a=wr(e,!0);return kr(a.gy,3,a.march)+31*(t-1)-Sr(t,7)*(t-7)+n-1}(e,t,n))}function br(e){return 0===function(e){let t,n,a,i,r,o=_r.length,s=_r[0];if(e=_r[o-1])throw Error("Invalid Jalaali year "+e);for(r=1;r=_r[s-1])throw Error("Invalid Jalaali year "+e);for(o=1;oTr.includes(e),default:"gregorian"},landscape:Boolean,color:String,textColor:String,square:Boolean,flat:Boolean,bordered:Boolean,readonly:Boolean,disable:Boolean},Er=["update:modelValue"];function Ar(e){return e.year+"/"+ve(e.month)+"/"+ve(e.day)}function Lr(t,n){let a=(0,e.computed)(()=>!t.disable&&!t.readonly),i=(0,e.computed)(()=>a.value?0:-1),r=(0,e.computed)(()=>{let e=[];return void 0!==t.color&&e.push(`bg-${t.color}`),void 0!==t.textColor&&e.push(`text-${t.textColor}`),e.join(" ")});return{editable:a,tabindex:i,headerClass:r,getLocale:function(){return void 0===t.locale?n.lang.date:{...n.lang.date,...t.locale}},getCurrentDate:function(e){let n=new Date,a=e?null:0;if("persian"===t.calendar){let e=gr(n);return{year:e.jy,month:e.jm,day:e.jd}}return{year:n.getFullYear(),month:n.getMonth()+1,day:n.getDate(),hour:a,minute:a,second:a,millisecond:a}}}}let Mr=864e5,Rr=6e4,zr="YYYY-MM-DDTHH:mm:ss.SSSZ",Ir=/\[((?:[^\]\\]|\\]|\\)*)\]|do|d{1,4}|Mo|M{1,4}|m{1,2}|wo|w{1,2}|Qo|Do|DDDo|D{1,4}|YY(?:YY)?|H{1,2}|h{1,2}|s{1,2}|S{1,3}|Z{1,2}|a{1,2}|[AQExX]/g,Nr=/(\[[^\]]*\])|do|d{1,4}|Mo|M{1,4}|m{1,2}|wo|w{1,2}|Qo|Do|DDDo|D{1,4}|YY(?:YY)?|H{1,2}|h{1,2}|s{1,2}|S{1,3}|Z{1,2}|a{1,2}|[AQExX]|([.*+:?^,\s${}()|\\]+)/g,Or={};function jr(e,t){return void 0===e?void 0===t?V.date:t.date:e}function Dr(e,t=""){let n=e>0?"-":"+",a=Math.abs(e),i=a%60;return n+ve(Math.floor(a/60))+t+ve(i)}function qr(e,t,n){let a=Br(t),i=new Date(e),r=void 0!==a.year||void 0!==a.month||void 0!==a.date?function(e,t,n){let a=e.getFullYear(),i=e.getMonth(),r=e.getDate();return void 0!==t.year&&(a+=n*t.year,delete t.year),void 0!==t.month&&(i+=n*t.month,delete t.month),e.setDate(1),e.setMonth(2),e.setFullYear(a),e.setMonth(i),e.setDate(Math.min(r,Yr(e))),void 0!==t.date&&(e.setDate(e.getDate()+n*t.date),delete t.date),e}(i,a,n):i;for(let e in a){let t=me(e);r[`set${t}`](r[`get${t}`]()+n*a[e])}return r}function Br(e){let t={...e};return void 0!==e.years&&(t.year=e.years,delete t.years),void 0!==e.months&&(t.month=e.months,delete t.months),void 0!==e.days&&(t.date=e.days,delete t.days),void 0!==e.day&&(t.date=e.day,delete t.day),void 0!==e.hour&&(t.hours=e.hour,delete t.hour),void 0!==e.minute&&(t.minutes=e.minute,delete t.minute),void 0!==e.second&&(t.seconds=e.second,delete t.second),void 0!==e.millisecond&&(t.milliseconds=e.millisecond,delete t.millisecond),t}function Fr(e,t,n){let a=Br(t),i=n?"UTC":"",r=new Date(e),o=void 0!==a.year||void 0!==a.month||void 0!==a.date?function(e,t,n){let a=void 0===t.year?e[`get${n}FullYear`]():t.year,i=void 0===t.month?e[`get${n}Month`]():t.month-1,r=new Date(a,i+1,0).getDate(),o=Math.min(r,void 0===t.date?e[`get${n}Date`]():t.date);return e[`set${n}Date`](1),e[`set${n}Month`](2),e[`set${n}FullYear`](a),e[`set${n}Month`](i),e[`set${n}Date`](o),delete t.year,delete t.month,delete t.date,e}(r,a,i):r;for(let e in a)o[`set${i}${e.at(0).toUpperCase()+e.slice(1)}`](a[e]);return o}function Vr(e,t,n,a,i){let r={year:null,month:null,day:null,hour:null,minute:null,second:null,millisecond:null,timezoneOffset:null,dateHash:null,timeHash:null};if(void 0!==i&&Object.assign(r,i),null==e||""===e||"string"!=typeof e)return r;void 0===t&&(t=zr);let o=jr(n,$.props),s=o.months,l=o.monthsShort,{regex:u,map:c}=function(e,t){let n="("+t.days.join("|")+")",a=e+n;if(void 0!==Or[a])return Or[a];let i="("+t.daysShort.join("|")+")",r="("+t.months.join("|")+")",o="("+t.monthsShort.join("|")+")",s={},l=0,u=e.replace(Nr,e=>{switch(l++,e){case"YY":return s.YY=l,String.raw`(-?\d{1,2})`;case"YYYY":return s.YYYY=l,String.raw`(-?\d{1,4})`;case"M":return s.M=l,String.raw`(\d{1,2})`;case"Mo":return s.M=l++,String.raw`(\d{1,2}(st|nd|rd|th))`;case"MM":return s.M=l,String.raw`(\d{2})`;case"MMM":return s.MMM=l,o;case"MMMM":return s.MMMM=l,r;case"D":return s.D=l,String.raw`(\d{1,2})`;case"Do":return s.D=l++,String.raw`(\d{1,2}(st|nd|rd|th))`;case"DD":return s.D=l,String.raw`(\d{2})`;case"H":return s.H=l,String.raw`(\d{1,2})`;case"HH":return s.H=l,String.raw`(\d{2})`;case"h":return s.h=l,String.raw`(\d{1,2})`;case"hh":return s.h=l,String.raw`(\d{2})`;case"m":return s.m=l,String.raw`(\d{1,2})`;case"mm":return s.m=l,String.raw`(\d{2})`;case"s":return s.s=l,String.raw`(\d{1,2})`;case"ss":return s.s=l,String.raw`(\d{2})`;case"S":return s.S=l,String.raw`(\d{1})`;case"SS":return s.S=l,String.raw`(\d{2})`;case"SSS":return s.S=l,String.raw`(\d{3})`;case"A":return s.A=l,"(AM|PM)";case"a":return s.a=l,"(am|pm)";case"aa":return s.aa=l,String.raw`(a\.m\.|p\.m\.)`;case"ddd":return i;case"dddd":return n;case"Q":case"d":case"E":return String.raw`(\d{1})`;case"do":return l++,String.raw`(\d{1}(st|nd|rd|th))`;case"Qo":return"(1st|2nd|3rd|4th)";case"DDD":case"DDDD":return String.raw`(\d{1,3})`;case"DDDo":return l++,String.raw`(\d{1,3}(st|nd|rd|th))`;case"w":return String.raw`(\d{1,2})`;case"wo":return l++,String.raw`(\d{1,2}(st|nd|rd|th))`;case"ww":return String.raw`(\d{2})`;case"Z":return s.Z=l,String.raw`(Z|[+-]\d{2}:\d{2})`;case"ZZ":return s.ZZ=l,String.raw`(Z|[+-]\d{2}\d{2})`;case"X":return s.X=l,String.raw`(-?\d+)`;case"x":return s.x=l,String.raw`(-?\d{4,})`;default:return l--,"["===e[0]&&(e=e.slice(1,-1)),e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}}),c={map:s,regex:RegExp("^"+u)};return Or[a]=c,c}(t,o),d=e.match(u);if(null===d)return r;let h="";if(void 0!==c.X||void 0!==c.x){let e=Number.parseInt(d[c.X??c.x],10);if(Number.isNaN(e)||e<0)return r;let t=new Date(e*(void 0===c.X?1:1e3));r.year=t.getFullYear(),r.month=t.getMonth()+1,r.day=t.getDate(),r.hour=t.getHours(),r.minute=t.getMinutes(),r.second=t.getSeconds(),r.millisecond=t.getMilliseconds()}else{if(void 0!==c.YYYY)r.year=Number.parseInt(d[c.YYYY],10);else if(void 0!==c.YY){let e=Number.parseInt(d[c.YY],10);r.year=e<0?e:2e3+e}if(void 0!==c.M){if(r.month=Number.parseInt(d[c.M],10),r.month<1||r.month>12)return r}else void 0===c.MMM?void 0!==c.MMMM&&(r.month=s.indexOf(d[c.MMMM])+1):r.month=l.indexOf(d[c.MMM])+1;if(void 0!==c.D){if(r.day=Number.parseInt(d[c.D],10),null===r.year||null===r.month||r.day<1)return r;let e="persian"===a?yr(r.year,r.month):new Date(r.year,r.month,0).getDate();if(r.day>e)return r}void 0===c.H?void 0!==c.h&&(r.hour=Number.parseInt(d[c.h],10)%12,(c.A&&"PM"===d[c.A]||c.a&&"pm"===d[c.a]||c.aa&&"p.m."===d[c.aa])&&(r.hour+=12),r.hour%=24):r.hour=Number.parseInt(d[c.H],10)%24,void 0!==c.m&&(r.minute=Number.parseInt(d[c.m],10)%60),void 0!==c.s&&(r.second=Number.parseInt(d[c.s],10)%60),void 0!==c.S&&(r.millisecond=Number.parseInt(d[c.S],10)*10**(3-d[c.S].length)),(void 0!==c.Z||void 0!==c.ZZ)&&(h=void 0===c.Z?d[c.ZZ]:d[c.Z].replace(":",""),r.timezoneOffset=("+"===h[0]?-1:1)*(60*h.slice(1,3)+Number(h.slice(3,5))))}return r.dateHash=ve(r.year,4)+"/"+ve(r.month)+"/"+ve(r.day),r.timeHash=ve(r.hour)+":"+ve(r.minute)+":"+ve(r.second)+h,r}function Ur(e){let t=new Date(e.getFullYear(),e.getMonth(),e.getDate());t.setDate(t.getDate()-(t.getDay()+6)%7+3);let n=new Date(t.getFullYear(),0,4);n.setDate(n.getDate()-(n.getDay()+6)%7+3);let a=t.getTimezoneOffset()-n.getTimezoneOffset();t.setHours(t.getHours()-a);let i=(t-n)/(7*Mr);return 1+Math.floor(i)}function $r(e,t){let n=new Date(e);return t?function(e){return 1e4*e.getFullYear()+100*e.getMonth()+e.getDate()}(n):n.getTime()}function Hr(e,t,n){let a=new Date(e),i="set"+(n?"UTC":"");switch(t){case"year":case"years":a[`${i}Month`](0);case"month":case"months":a[`${i}Date`](1);case"day":case"days":case"date":a[`${i}Hours`](0);case"hour":case"hours":a[`${i}Minutes`](0);case"minute":case"minutes":a[`${i}Seconds`](0);case"second":case"seconds":a[`${i}Milliseconds`](0)}return a}function Wr(e,t,n){return(e.getTime()-e.getTimezoneOffset()*Rr-(t.getTime()-t.getTimezoneOffset()*Rr))/n}function Gr(e,t,n="days"){let a=new Date(e),i=new Date(t);switch(n){case"years":case"year":return a.getFullYear()-i.getFullYear();case"months":case"month":return 12*(a.getFullYear()-i.getFullYear())+a.getMonth()-i.getMonth();case"days":case"day":case"date":return Wr(Hr(a,"day"),Hr(i,"day"),Mr);case"hours":case"hour":return Wr(Hr(a,"hour"),Hr(i,"hour"),36e5);case"minutes":case"minute":return Wr(Hr(a,"minute"),Hr(i,"minute"),Rr);case"seconds":case"second":return Wr(Hr(a,"second"),Hr(i,"second"),1e3)}}function Kr(e){return Gr(e,Hr(e,"year"),"days")+1}function Yr(e){return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()}function Qr(e){if(e>=11&&e<=13)return`${e}th`;switch(e%10){case 1:return`${e}st`;case 2:return`${e}nd`;case 3:return`${e}rd`}return`${e}th`}let Zr={YY(e,t,n){let a=this.YYYY(e,t,n)%100;return a>=0?ve(a):"-"+ve(Math.abs(a))},YYYY:(e,t,n)=>n??e.getFullYear(),M:e=>e.getMonth()+1,Mo:e=>Qr(e.getMonth()+1),MM:e=>ve(e.getMonth()+1),MMM:(e,t)=>t.monthsShort[e.getMonth()],MMMM:(e,t)=>t.months[e.getMonth()],Q:e=>Math.ceil((e.getMonth()+1)/3),Qo(e){return Qr(this.Q(e))},D:e=>e.getDate(),Do:e=>Qr(e.getDate()),DD:e=>ve(e.getDate()),DDD:e=>Kr(e),DDDo:e=>Qr(Kr(e)),DDDD:e=>ve(Kr(e),3),d:e=>e.getDay(),do:e=>Qr(e.getDay()),dd:(e,t)=>t.days[e.getDay()].slice(0,2),ddd:(e,t)=>t.daysShort[e.getDay()],dddd:(e,t)=>t.days[e.getDay()],E:e=>e.getDay()||7,w:e=>Ur(e),wo:e=>Qr(Ur(e)),ww:e=>ve(Ur(e)),H:e=>e.getHours(),HH:e=>ve(e.getHours()),h(e){let t=e.getHours();return 0===t?12:t>12?t%12:t},hh(e){return ve(this.h(e))},m:e=>e.getMinutes(),mm:e=>ve(e.getMinutes()),s:e=>e.getSeconds(),ss:e=>ve(e.getSeconds()),S:e=>Math.floor(e.getMilliseconds()/100),SS:e=>ve(Math.floor(e.getMilliseconds()/10)),SSS:e=>ve(e.getMilliseconds(),3),A:e=>e.getHours()<12?"AM":"PM",a:e=>e.getHours()<12?"am":"pm",aa:e=>e.getHours()<12?"a.m.":"p.m.",Z:(e,t,n,a)=>Dr(a??e.getTimezoneOffset(),":"),ZZ:(e,t,n,a)=>Dr(a??e.getTimezoneOffset()),X:e=>Math.floor(e.getTime()/1e3),x:e=>e.getTime()};function Jr(e,t,n,a,i){if(0!==e&&!e||e===1/0||e===-1/0)return;let r=new Date(e);if(Number.isNaN(r))return;void 0===t&&(t=zr);let o=jr(n,$.props);return t.replace(Ir,(e,t)=>e in Zr?Zr[e](r,o,a,i):void 0===t?e:t.split(String.raw`\]`).join("]"))}var Xr={isValid:function(e){return Number.isFinite(e)||Number.isFinite(Date.parse(e))},extractDate:function(e,t,n){let a=Vr(e,t,n),i=new Date(a.year,null===a.month?null:a.month-1,null===a.day?1:a.day,a.hour,a.minute,a.second,a.millisecond),r=i.getTimezoneOffset();return null===a.timezoneOffset||a.timezoneOffset===r?i:qr(i,{minutes:a.timezoneOffset-r},1)},buildDate:function(e,t){return Fr(new Date,e,t)},getDayOfWeek:function(e){let t=new Date(e).getDay();return 0===t?7:t},getWeekOfYear:Ur,isBetweenDates:function(e,t,n,a={}){let i=$r(t,a.onlyDate),r=$r(n,a.onlyDate),o=$r(e,a.onlyDate);return(o>i||a.inclusiveFrom&&o===i)&&(onew Date(e).getTime()));return new Date(n)},getMinDate:function(e,...t){let n=Math.min(new Date(e).getTime(),...t.map(e=>new Date(e).getTime()));return new Date(n)},getDateDiff:Gr,getDayOfYear:Kr,inferDateFormat:function(e){return ae(e)?"date":"number"==typeof e?"number":"string"},getDateBetween:function(e,t,n){let a=new Date(e);if(t){let e=new Date(t);if(ae)return e}return a},isSameDate:function(e,t,n){let a=new Date(e),i=new Date(t);if(void 0===n)return a.getTime()===i.getTime();switch(n){case"second":case"seconds":if(a.getSeconds()!==i.getSeconds())return!1;case"minute":case"minutes":if(a.getMinutes()!==i.getMinutes())return!1;case"hour":case"hours":if(a.getHours()!==i.getHours())return!1;case"day":case"days":case"date":if(a.getDate()!==i.getDate())return!1;case"month":case"months":if(a.getMonth()!==i.getMonth())return!1;case"year":case"years":if(a.getFullYear()!==i.getFullYear())return!1;break;default:throw Error(`date isSameDate unknown unit ${n}`)}return!0},daysInMonth:Yr,formatDate:Jr,clone:function(e){return ae(e)?new Date(e):e}};let eo=["Calendar","Years","Months"],to=e=>eo.includes(e),no=/^-?[\d]+\/[0-1]\d$/,ao=e=>no.test(e),io=" — ";function ro(e){return e.year+"/"+ve(e.month)}function oo(e){return{year:e.year,month:e.month,day:e.day}}var so=h({name:"QDate",props:{...Pr,...wa,...Je,modelValue:{required:!0,validator:e=>"string"==typeof e||Array.isArray(e)||Object(e)===e||null===e},multiple:Boolean,range:Boolean,title:String,subtitle:String,mask:{...Pr.mask,default:"YYYY/MM/DD"},defaultYearMonth:{type:String,validator:ao},yearsInMonthView:Boolean,events:[Array,Function],eventColor:[String,Function],emitImmediately:Boolean,options:[Array,Function],navigationMinYearMonth:{type:String,validator:ao},navigationMaxYearMonth:{type:String,validator:ao},noUnset:Boolean,firstDayOfWeek:[String,Number],todayBtn:Boolean,minimal:Boolean,defaultView:{type:String,default:"Calendar",validator:to}},emits:[...Er,"rangeStart","rangeEnd","navigation"],setup(t,{slots:n,emit:a}){let i,{proxy:r}=(0,e.getCurrentInstance)(),{$q:o}=r,s=Xe(t,o),{getCache:l}=ja(),{isHydrated:u}=Ti(),{tabindex:c,headerClass:d,getLocale:h,getCurrentDate:p}=Lr(t,o),f=xa(ka(t)),m=(0,e.ref)(null),_=(0,e.ref)(ce()),g=(0,e.ref)(h()),v=(0,e.computed)(()=>ce()),b=(0,e.computed)(()=>h()),y=(0,e.computed)(()=>p()),w=(0,e.ref)(he(_.value,g.value)),k=(0,e.ref)(t.defaultView),x=(0,e.computed)(()=>o.lang.rtl?"right":"left"),S=(0,e.ref)(x.value),C=(0,e.ref)(x.value),T=w.value.year,P=(0,e.ref)(T-T%20-(T<0?20:0)),E=(0,e.ref)(null),A=(0,e.computed)(()=>{let e=t.landscape?"landscape":"portrait";return`q-date q-date--${e} q-date--${e}-${t.minimal?"minimal":"standard"}`+(s.value?" q-date--dark q-dark":"")+(t.bordered?" q-date--bordered":"")+(t.square?" q-date--square no-border-radius":"")+(t.flat?" q-date--flat no-shadow":"")+(t.disable?" disabled":t.readonly?" q-date--readonly":"")}),L=(0,e.computed)(()=>t.color||"primary"),M=(0,e.computed)(()=>t.textColor||"white"),R=(0,e.computed)(()=>t.emitImmediately&&!t.multiple&&!t.range),z=(0,e.computed)(()=>Array.isArray(t.modelValue)?t.modelValue:null!==t.modelValue&&void 0!==t.modelValue?[t.modelValue]:[]),I=(0,e.computed)(()=>z.value.filter(e=>"string"==typeof e).map(e=>de(e,_.value,g.value)).filter(e=>null!==e.dateHash&&null!==e.day&&null!==e.month&&null!==e.year)),N=(0,e.computed)(()=>{let e=e=>de(e,_.value,g.value);return z.value.filter(e=>ne(e)&&void 0!==e.from&&void 0!==e.to).map(t=>({from:e(t.from),to:e(t.to)})).filter(e=>null!==e.from.dateHash&&null!==e.to.dateHash&&e.from.dateHash"persian"===t.calendar?e=>{let t=vr(e.year,e.month,e.day);return new Date(t.gy,t.gm-1,t.gd)}:e=>new Date(e.year,e.month-1,e.day)),j=(0,e.computed)(()=>"persian"===t.calendar?Ar:(e,t,n)=>Jr(new Date(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond),void 0===t?_.value:t,void 0===n?g.value:n,e.year,e.timezoneOffset)),D=(0,e.computed)(()=>I.value.length+N.value.reduce((e,t)=>e+1+Gr(O.value(t.to),O.value(t.from)),0)),q=(0,e.computed)(()=>{if(void 0!==t.title&&null!==t.title&&0!==t.title.length)return t.title;if(null!==E.value){let e=E.value.init,t=O.value(e);return g.value.daysShort[t.getDay()]+", "+g.value.monthsShort[e.month-1]+" "+e.day+" — ?"}if(0===D.value)return io;if(D.value>1)return`${D.value} ${g.value.pluralDay}`;let e=I.value[0],n=O.value(e);return Number.isNaN(n.valueOf())?io:void 0===g.value.headerTitle?g.value.daysShort[n.getDay()]+", "+g.value.monthsShort[e.month-1]+" "+e.day:g.value.headerTitle(n,e)}),B=(0,e.computed)(()=>[...I.value,...N.value.map(e=>e.from)].sort((e,t)=>e.year-t.year||e.month-t.month)[0]),F=(0,e.computed)(()=>[...I.value,...N.value.map(e=>e.to)].sort((e,t)=>t.year-e.year||t.month-e.month)[0]),V=(0,e.computed)(()=>{if(void 0!==t.subtitle&&null!==t.subtitle&&0!==t.subtitle.length)return t.subtitle;if(0===D.value)return io;if(D.value>1){let e=B.value,t=F.value,n=g.value.monthsShort;return n[e.month-1]+(e.year===t.year?e.month===t.month?"":io+n[t.month-1]:" "+e.year+io+n[t.month-1]+" ")+" "+t.year}return I.value[0].year}),U=(0,e.computed)(()=>{let e=[o.iconSet.datetime.arrowLeft,o.iconSet.datetime.arrowRight];return o.lang.rtl?e.reverse():e}),$=(0,e.computed)(()=>void 0===t.firstDayOfWeek?g.value.firstDayOfWeek:Number(t.firstDayOfWeek)),H=(0,e.computed)(()=>{let e=g.value.daysShort,t=$.value;return t>0?[...e.slice(t,7),...e.slice(0,t)]:e}),W=(0,e.computed)(()=>{let e=w.value;return"persian"===t.calendar?yr(e.year,e.month):new Date(e.year,e.month,0).getDate()}),G=(0,e.computed)(()=>"function"==typeof t.eventColor?t.eventColor:()=>t.eventColor),K=(0,e.computed)(()=>{if(void 0===t.navigationMinYearMonth)return null;let e=t.navigationMinYearMonth.split("/");return{year:Number.parseInt(e[0],10),month:Number.parseInt(e[1],10)}}),Y=(0,e.computed)(()=>{if(void 0===t.navigationMaxYearMonth)return null;let e=t.navigationMaxYearMonth.split("/");return{year:Number.parseInt(e[0],10),month:Number.parseInt(e[1],10)}}),Q=(0,e.computed)(()=>{let e={month:{prev:!0,next:!0},year:{prev:!0,next:!0}};return null!==K.value&&K.value.year>=w.value.year&&(e.year.prev=!1,K.value.year===w.value.year&&K.value.month>=w.value.month&&(e.month.prev=!1)),null!==Y.value&&Y.value.year<=w.value.year&&(e.year.next=!1,Y.value.year===w.value.year&&Y.value.month<=w.value.month&&(e.month.next=!1)),e}),Z=(0,e.computed)(()=>{let e={};return I.value.forEach(t=>{let n=ro(t);void 0===e[n]&&(e[n]=[]),e[n].push(t.day)}),e}),J=(0,e.computed)(()=>{let e={};return N.value.forEach(t=>{let n=ro(t.from),a=ro(t.to);if(void 0===e[n]&&(e[n]=[]),e[n].push({from:t.from.day,to:n===a?t.to.day:void 0,range:t}),n12&&(o.year++,o.month=1)}}),e}),X=(0,e.computed)(()=>{if(null===E.value)return;let{init:e,initHash:t,final:n,finalHash:a}=E.value,[i,r]=t<=a?[e,n]:[n,e],o=ro(i),s=ro(r);if(o!==ee.value&&s!==ee.value)return;let l={};return o===ee.value?(l.from=i.day,l.includeFrom=!0):l.from=1,s===ee.value?(l.to=r.day,l.includeTo=!0):l.to=W.value,l}),ee=(0,e.computed)(()=>ro(w.value)),te=(0,e.computed)(()=>{let e={};if(void 0===t.options){for(let t=1;t<=W.value;t++)e[t]=!0;return e}let n="function"==typeof t.options?t.options:e=>t.options.includes(e);for(let t=1;t<=W.value;t++)e[t]=n(ee.value+"/"+ve(t));return e}),ae=(0,e.computed)(()=>{let e={};if(void 0===t.events)for(let t=1;t<=W.value;t++)e[t]=!1;else{let n="function"==typeof t.events?t.events:e=>t.events.includes(e);for(let t=1;t<=W.value;t++){let a=ee.value+"/"+ve(t);e[t]=n(a)&&G.value(a)}}return e}),ie=(0,e.computed)(()=>{let e,n,{year:a,month:i}=w.value;if("persian"!==t.calendar)e=new Date(a,i-1,1),n=new Date(a,i-1,0).getDate();else{let t=vr(a,i,1);e=new Date(t.gy,t.gm-1,t.gd);let r=i-1,o=a;0===r&&(r=12,o--),n=yr(o,r)}return{days:e.getDay()-$.value-1,endDay:n}}),re=(0,e.computed)(()=>{let e=[],{days:t,endDay:n}=ie.value,a=t<0?t+7:t;if(a<6)for(let t=n-a;t<=n;t++)e.push({i:t,fill:!0});let i=e.length;for(let t=1;t<=W.value;t++){let n={i:t,event:ae.value[t],classes:[]};te.value[t]&&(n.in=!0,n.flat=!0),e.push(n)}if(void 0!==Z.value[ee.value]&&Z.value[ee.value].forEach(t=>{let n=i+t-1;Object.assign(e[n],{selected:!0,unelevated:!0,flat:!1,color:L.value,textColor:M.value})}),void 0!==J.value[ee.value]&&J.value[ee.value].forEach(t=>{if(void 0!==t.from){let n=i+t.from-1,a=i+(t.to||W.value)-1;for(let i=n;i<=a;i++)Object.assign(e[i],{range:t.range,unelevated:!0,color:L.value,textColor:M.value});Object.assign(e[n],{rangeFrom:!0,flat:!1}),void 0!==t.to&&Object.assign(e[a],{rangeTo:!0,flat:!1})}else if(void 0!==t.to){let n=i+t.to-1;for(let a=i;a<=n;a++)Object.assign(e[a],{range:t.range,unelevated:!0,color:L.value,textColor:M.value});Object.assign(e[n],{flat:!1,rangeTo:!0})}else{let n=i+W.value-1;for(let a=i;a<=n;a++)Object.assign(e[a],{range:t.range,unelevated:!0,color:L.value,textColor:M.value})}}),void 0!==X.value){let t=i+X.value.from-1,n=i+X.value.to-1;for(let a=t;a<=n;a++)e[a].color=L.value,e[a].editRange=!0;X.value.includeFrom&&(e[t].editRangeFrom=!0),X.value.includeTo&&(e[n].editRangeTo=!0)}u.value&&w.value.year===y.value.year&&w.value.month===y.value.month&&(e[i+y.value.day-1].today=!0);let r=e.length%7;if(r>0){let t=7-r;for(let n=1;n<=t;n++)e.push({i:n,fill:!0})}return e.forEach(e=>{let t="q-date__calendar-item ";e.fill?t+="q-date__calendar-item--fill":(t+="q-date__calendar-item--"+(e.in?"in":"out"),void 0!==e.range&&(t+=" q-date__range"+(e.rangeTo?"-to":e.rangeFrom?"-from":"")),e.editRange&&(t+=` q-date__edit-range${e.editRangeFrom?"-from":""}${e.editRangeTo?"-to":""}`),(void 0!==e.range||e.editRange)&&(t+=` text-${e.color}`)),e.classes=t}),e}),oe=(0,e.computed)(()=>t.disable?{"aria-disabled":"true"}:{});function se(e){i=JSON.stringify(e)}function le(){let{year:e,month:t,day:n}=y.value,a={...w.value,year:e,month:t,day:n},i=Z.value[ro(a)];(void 0===i||!i.includes(a.day))&&xe(a),ue(a.year,a.month)}function ue(e,t){k.value="Calendar",ge(e,t)}function ce(){return"persian"===t.calendar?"YYYY/MM/DD":t.mask}function de(e,n,a){return Vr(e,n,a,t.calendar,{hour:0,minute:0,second:0,millisecond:0})}function he(e,n){let a=Array.isArray(t.modelValue)?t.modelValue:t.modelValue?[t.modelValue]:[];if(0===a.length)return pe();let i=a.at(-1),r=de(void 0===i.from?i:i.from,e,n);return null===r.dateHash?pe():r}function pe(){let e,n;if(void 0!==t.defaultYearMonth){let a=t.defaultYearMonth.split("/");e=Number.parseInt(a[0],10),n=Number.parseInt(a[1],10)}else{let t=void 0===y.value?p():y.value;e=t.year,n=t.month}return{year:e,month:n,day:1,hour:0,minute:0,second:0,millisecond:0,dateHash:e+"/"+ve(n)+"/01"}}function fe(e){let t=w.value.year,n=Number(w.value.month)+e;13===n?(n=1,t++):0===n&&(n=12,t--),ge(t,n),R.value&&ye("month")}function me(e){ge(Number(w.value.year)+e,w.value.month),R.value&&ye("year")}function _e(e){ge(e,w.value.month),k.value="Years"===t.defaultView?"Months":"Calendar",R.value&&ye("year")}function ge(t,n,a){if(null!==K.value&&t<=K.value.year&&((n=Y.value.year&&((n>Y.value.month||t>Y.value.year)&&(n=Y.value.month),t=Y.value.year),void 0!==a){let{hour:e,minute:t,second:n,millisecond:i,timezoneOffset:r,timeHash:o}=a;Object.assign(w.value,{hour:e,minute:t,second:n,millisecond:i,timezoneOffset:r,timeHash:o})}let i=t+"/"+ve(n)+"/01";i!==w.value.dateHash&&(S.value=w.value.dateHash{P.value=t-t%20-(t<0?20:0),Object.assign(w.value,{year:t,month:n,day:1,dateHash:i})}))}function be(e,n,i){let r=null===e||1!==e.length||t.multiple?e:e[0],{reason:o,details:s}=we(n,i);se(r),a("update:modelValue",r,o,s)}function ye(n){let i=void 0!==I.value[0]&&null!==I.value[0].dateHash?{...I.value[0]}:{...w.value};(0,e.nextTick)(()=>{i.year=w.value.year,i.month=w.value.month;let e="persian"===t.calendar?yr(i.year,i.month):new Date(i.year,i.month,0).getDate();i.day=Math.min(Math.max(1,i.day),e);let r=ke(i),{details:o}=we("",i);se(r),a("update:modelValue",r,n,o)})}function we(e,t){return void 0===t.from?{reason:`${e}-day`,details:oo(t)}:{reason:`${e}-range`,details:{...oo(t.target),from:oo(t.from),to:oo(t.to)}}}function ke(e,t,n){return void 0===e.from?j.value(e,t,n):{from:j.value(e.from,t,n),to:j.value(e.to,t,n)}}function xe(e){let n;if(t.multiple)if(void 0!==e.from){let t=Ar(e.from),a=Ar(e.to),i=I.value.filter(e=>e.dateHasha),r=N.value.filter(({from:e,to:n})=>n.dateHasha);n=[...i,...r,e].map(e=>ke(e))}else n=[...z.value,ke(e)];else n=ke(e);be(n,"add",e)}function Se(e){if(t.noUnset)return;let n=null;if(t.multiple&&Array.isArray(t.modelValue)){let a=ke(e);n=void 0===e.from?t.modelValue.filter(e=>e!==a):t.modelValue.filter(e=>void 0===e.from||e.from!==a.from&&e.to!==a.to),0===n.length&&(n=null)}be(n,"remove",e)}function Ce(e,n,i){let r=[...I.value,...N.value].map(t=>ke(t,e,n)).filter(e=>void 0===e.from?null!==e.dateHash:null!==e.from.dateHash&&null!==e.to.dateHash),o=(t.multiple?r:r[0])||null;se(o),a("update:modelValue",o,i)}function Te(){if(!t.minimal)return(0,e.h)("div",{class:"q-date__header "+d.value},[(0,e.h)("div",{class:"relative-position"},[(0,e.h)(e.Transition,{name:"q-transition--fade"},()=>(0,e.h)("div",{key:"h-yr-"+V.value,class:"q-date__header-subtitle q-date__header-link "+("Years"===k.value?"q-date__header-link--active":"cursor-pointer"),tabindex:c.value,...l("vY",{onClick(){k.value="Years"},onKeyup(e){13===e.keyCode&&(k.value="Years")}})},[V.value]))]),(0,e.h)("div",{class:"q-date__header-title relative-position flex no-wrap"},[(0,e.h)("div",{class:"relative-position col"},[(0,e.h)(e.Transition,{name:"q-transition--fade"},()=>(0,e.h)("div",{key:"h-sub"+q.value,class:"q-date__header-title-label q-date__header-link "+("Calendar"===k.value?"q-date__header-link--active":"cursor-pointer"),tabindex:c.value,...l("vC",{onClick(){k.value="Calendar"},onKeyup(e){13===e.keyCode&&(k.value="Calendar")}})},[q.value]))]),t.todayBtn?(0,e.h)(Kt,{class:"q-date__header-today self-start",icon:o.iconSet.datetime.today,"aria-label":o.lang.date.today,flat:!0,size:"sm",round:!0,tabindex:c.value,onClick:le}):null])])}function Pe({label:t,type:n,key:a,dir:i,goTo:r,boundaries:s,cls:u}){return[(0,e.h)("div",{class:"row items-center q-date__arrow"},[(0,e.h)(Kt,{round:!0,dense:!0,size:"sm",flat:!0,icon:U.value[0],"aria-label":"Years"===n?o.lang.date.prevYear:o.lang.date.prevMonth,tabindex:c.value,disable:!s.prev,...l("go-#"+n,{onClick(){r(-1)}})})]),(0,e.h)("div",{class:"relative-position overflow-hidden flex flex-center"+u},[(0,e.h)(e.Transition,{name:"q-transition--jump-"+i},()=>(0,e.h)("div",{key:a},[(0,e.h)(Kt,{flat:!0,dense:!0,noCaps:!0,label:t,tabindex:c.value,...l("view#"+n,{onClick:()=>{k.value=n}})})]))]),(0,e.h)("div",{class:"row items-center q-date__arrow"},[(0,e.h)(Kt,{round:!0,dense:!0,size:"sm",flat:!0,icon:U.value[1],"aria-label":"Years"===n?o.lang.date.nextYear:o.lang.date.nextMonth,tabindex:c.value,disable:!s.next,...l("go+#"+n,{onClick(){r(1)}})})])]}(0,e.watch)(()=>t.modelValue,e=>{if(i===JSON.stringify(e))i=0;else{let e=he(_.value,g.value);ge(e.year,e.month,e)}}),(0,e.watch)(k,()=>{null!==m.value&&r.$el.contains(document.activeElement)&&m.value.focus()}),(0,e.watch)(()=>w.value.year+"|"+w.value.month,()=>{a("navigation",{year:w.value.year,month:w.value.month})}),(0,e.watch)(v,e=>{Ce(e,g.value,"mask"),_.value=e}),(0,e.watch)(b,e=>{Ce(_.value,e,"locale"),g.value=e});let Ee={Calendar:()=>[(0,e.h)("div",{key:"calendar-view",class:"q-date__view q-date__calendar"},[(0,e.h)("div",{class:"q-date__navigation row items-center no-wrap"},[...Pe({label:g.value.months[w.value.month-1],type:"Months",key:w.value.month,dir:S.value,goTo:fe,boundaries:Q.value.month,cls:" col"}),...Pe({label:w.value.year,type:"Years",key:w.value.year,dir:C.value,goTo:me,boundaries:Q.value.year,cls:""})]),(0,e.h)("div",{class:"q-date__calendar-weekdays row items-center no-wrap"},H.value.map(t=>(0,e.h)("div",{class:"q-date__calendar-item"},[(0,e.h)("div",t)]))),(0,e.h)("div",{class:"q-date__calendar-days-container relative-position overflow-hidden"},[(0,e.h)(e.Transition,{name:"q-transition--slide-"+S.value},()=>(0,e.h)("div",{key:ee.value,class:"q-date__calendar-days fit"},re.value.map(t=>(0,e.h)("div",{class:t.classes},[t.in?(0,e.h)(Kt,{class:t.today?"q-date__today":"",dense:!0,flat:t.flat,unelevated:t.unelevated,color:t.color,textColor:t.textColor,label:t.i,tabindex:c.value,...l("day#"+t.i,{onClick:()=>{Le(t.i)},onMouseover:()=>{!function(e){if(null!==E.value){let t={...w.value,day:e};Object.assign(E.value,{final:t,finalHash:Ar(t)})}}(t.i)}})},t.event?()=>(0,e.h)("div",{class:"q-date__event bg-"+t.event}):null):(0,e.h)("div",String(t.i))]))))])])],Months(){let n=u.value&&w.value.year===y.value.year,a=e=>null!==K.value&&w.value.year===K.value.year&&K.value.month>e||null!==Y.value&&w.value.year===Y.value.year&&Y.value.month{let r=w.value.month===i+1;return(0,e.h)("div",{class:"q-date__months-item flex flex-center"},[(0,e.h)(Kt,{class:n&&y.value.month===i+1?"q-date__today":null,flat:!r,label:t,unelevated:r,color:r?L.value:null,textColor:r?M.value:null,tabindex:c.value,disable:a(i+1),...l("month#"+i,{onClick:()=>{!function(e){ge(w.value.year,e),k.value="Calendar",R.value&&ye("month")}(i+1)}})})])});return t.yearsInMonthView&&i.unshift((0,e.h)("div",{class:"row no-wrap full-width"},[Pe({label:w.value.year,type:"Years",key:w.value.year,dir:C.value,goTo:me,boundaries:Q.value.year,cls:" col"})])),(0,e.h)("div",{key:"months-view",class:"q-date__view q-date__months flex flex-center"},i)},Years(){let t=P.value,n=t+20,a=[],i=e=>null!==K.value&&K.value.year>e||null!==Y.value&&Y.value.year{_e(r)}})})]))}return(0,e.h)("div",{class:"q-date__view q-date__years flex flex-center"},[(0,e.h)("div",{class:"col-auto"},[(0,e.h)(Kt,{round:!0,dense:!0,flat:!0,icon:U.value[0],"aria-label":o.lang.date.prevRangeYears(20),tabindex:c.value,disable:i(t),...l("y-",{onClick:()=>{P.value-=20}})})]),(0,e.h)("div",{class:"q-date__years-content col self-stretch row items-center"},a),(0,e.h)("div",{class:"col-auto"},[(0,e.h)(Kt,{round:!0,dense:!0,flat:!0,icon:U.value[1],"aria-label":o.lang.date.nextRangeYears(20),tabindex:c.value,disable:i(n),...l("y+",{onClick:()=>{P.value+=20}})})])])}};function Le(e){let n={...w.value,day:e};if(t.range)if(null===E.value){let i=re.value.find(t=>!t.fill&&t.i===e);if(!t.noUnset&&void 0!==i.range)return void Se({target:n,from:i.range.from,to:i.range.to});if(i.selected)return void Se(n);let r=Ar(n);E.value={init:n,initHash:r,final:n,finalHash:r},a("rangeStart",oo(n))}else{let e=E.value.initHash,t=Ar(n),i=e<=t?{from:E.value.init,to:n}:{from:n,to:E.value.init};E.value=null,xe(e===t?n:{target:n,...i}),a("rangeEnd",{from:oo(i.from),to:oo(i.to)})}else!function(e,t){(!0===Z.value[t]?.includes(e.day)?Se:xe)(e)}(n,ee.value)}return Object.assign(r,{setToday:le,setView:function(e){to(e)&&(k.value=e)},offsetCalendar:function(e,t){["month","year"].includes(e)&&("month"===e?fe:me)(t?-1:1)},setCalendarTo:ue,setEditingRange:function(e,n){if(!t.range||!e)return void(E.value=null);let a={...w.value,...e},i=void 0===n?a:{...w.value,...n};E.value={init:a,initHash:Ar(a),final:i,finalHash:Ar(i)},ue(a.year,a.month)}}),()=>{let a=[(0,e.h)("div",{class:"q-date__content col relative-position"},[(0,e.h)(e.Transition,{name:"q-transition--fade"},Ee[k.value])])],i=Ae(n.default);return void 0!==i&&a.push((0,e.h)("div",{class:"q-date__actions"},i)),void 0!==t.name&&!t.disable&&f(a,"push"),(0,e.h)("div",{class:A.value,...oe.value},[Te(),(0,e.h)("div",{ref:m,class:"q-date__main col column",tabindex:-1},a)])}}});function lo(t,n,a){let i;function r(){void 0!==i&&(F.remove(i),i=void 0)}return(0,e.onBeforeUnmount)(()=>{t.value&&r()}),{removeFromHistory:r,addToHistory(){i={condition:()=>a.value,handler:n},F.add(i)}}}let uo,co,ho,po,fo,mo,_o=0,go=!1,vo=null;function bo(e){e.target===document&&(document.scrollingElement.scrollTop=document.scrollingElement.scrollTop)}function yo(e){go||(go=!0,requestAnimationFrame(()=>{go=!1;let{height:t}=e.target,{clientHeight:n,scrollTop:a}=document.scrollingElement;(void 0===ho||t!==window.innerHeight)&&(ho=n-t,document.scrollingElement.scrollTop=a),a>ho&&(document.scrollingElement.scrollTop-=Math.ceil((a-ho)/8))}))}function wo(e){let t=document.body,n=void 0!==window.visualViewport;if("add"===e){let{overflowY:e,overflowX:a}=window.getComputedStyle(t);uo=Ln(window),co=An(window),po=t.style.left,fo=t.style.top,mo=window.location.pathname,t.style.left=`-${uo}px`,t.style.top=`-${co}px`,"hidden"!==a&&("scroll"===a||t.scrollWidth>window.innerWidth)&&t.classList.add("q-body--force-scrollbar-x"),"hidden"!==e&&("scroll"===e||t.scrollHeight>window.innerHeight)&&t.classList.add("q-body--force-scrollbar-y"),document.documentElement.classList.add("q-document--prevent-scroll"),document.qScrollPrevented=!0,c.is.ios&&(n?(window.scrollTo(0,0),window.visualViewport.addEventListener("resize",yo,m.passiveCapture),window.visualViewport.addEventListener("scroll",yo,m.passiveCapture),window.scrollTo(0,0)):window.addEventListener("scroll",bo,m.passiveCapture))}else c.is.ios&&(n?(window.visualViewport.removeEventListener("resize",yo,m.passiveCapture),window.visualViewport.removeEventListener("scroll",yo,m.passiveCapture)):window.removeEventListener("scroll",bo,m.passiveCapture)),document.documentElement.classList.remove("q-document--prevent-scroll"),t.classList.remove("q-body--force-scrollbar-x","q-body--force-scrollbar-y"),document.qScrollPrevented=!1,t.style.left=po,t.style.top=fo,window.location.pathname===mo&&window.scrollTo(uo,co),ho=void 0}function ko(e){let t="add";if(!0===e){if(_o++,null!==vo)return clearTimeout(vo),void(vo=null);if(_o>1)return}else{if(0===_o||(_o--,_o>0))return;if(t="remove",c.is.ios&&c.is.nativeMobile)return null!==vo&&clearTimeout(vo),void(vo=setTimeout(()=>{wo(t),vo=null},100))}wo(t)}function xo(){let e;return{preventBodyScroll(t){t!==e&&(void 0!==e||t)&&(e=t,ko(t))}}}let So=0,Co={standard:"fixed-full flex-center",top:"fixed-top justify-center",bottom:"fixed-bottom justify-center",right:"fixed-right items-center",left:"fixed-left items-center"},To={standard:["scale","scale"],top:["slide-down","slide-up"],bottom:["slide-up","slide-down"],right:["slide-left","slide-right"],left:["slide-right","slide-left"]};var Po=h({name:"QDialog",inheritAttrs:!1,props:{...tn,...yn,transitionShow:String,transitionHide:String,persistent:Boolean,autoClose:Boolean,allowFocusOutside:Boolean,noEscDismiss:Boolean,noBackdropDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,noShake:Boolean,seamless:Boolean,maximized:Boolean,fullWidth:Boolean,fullHeight:Boolean,square:Boolean,backdropFilter:String,position:{type:String,default:"standard",validator:e=>["standard","top","bottom","left","right"].includes(e)}},emits:[...nn,"shake","click","escapeKey"],setup(t,{slots:n,emit:a,attrs:i}){let r=(0,e.getCurrentInstance)(),o=(0,e.ref)(null),s=(0,e.ref)(!1),l=(0,e.ref)(!1),u=null,c=null,d=!1,h=!1,p=(0,e.computed)(()=>!t.persistent&&!t.noRouteDismiss&&!t.seamless),{preventBodyScroll:f}=xo(),{registerTimeout:m}=xn(),{registerTick:_,removeTick:g}=kn(),{transitionProps:v,transitionStyle:b}=wn(t,()=>To[t.position][0],()=>To[t.position][1]),y=(0,e.computed)(()=>b.value+(void 0===t.backdropFilter?"":`;backdrop-filter:${t.backdropFilter};-webkit-backdrop-filter:${t.backdropFilter}`)),{showPortal:w,hidePortal:k,portalIsAccessible:x,renderPortal:S}=bn(r,o,function(){return(0,e.h)("div",{role:"dialog","aria-modal":A.value?"true":"false",...i,class:M.value},[(0,e.h)(e.Transition,{name:"q-transition--fade",appear:!0},()=>A.value?(0,e.h)("div",{class:"q-dialog__backdrop fixed-full",style:y.value,"aria-hidden":"true",onClick:D}):null),(0,e.h)(e.Transition,v.value,()=>s.value?(0,e.h)("div",{ref:o,class:E.value,style:b.value,tabindex:-1,...L.value},Ae(n.default)):null)])},"dialog"),{hide:C}=an({showing:s,hideOnRouteChange:p,handleShow:function(e){T(),c=t.noRefocus||null===document.activeElement?null:document.activeElement,O(t.maximized),w(),l.value=!0,t.noFocus?g():(document.activeElement?.blur(),_(R)),m(()=>{if(r.proxy.$q.platform.is.ios){if(!t.seamless&&document.activeElement){let{top:e,bottom:t}=document.activeElement.getBoundingClientRect(),{innerHeight:n}=window,a=void 0===window.visualViewport?n:window.visualViewport.height;e>0&&t>a/2&&(document.scrollingElement.scrollTop=Math.min(document.scrollingElement.scrollHeight-a,t>=n?1/0:Math.ceil(document.scrollingElement.scrollTop+t-a/2))),document.activeElement.scrollIntoView()}h=!0,o.value.click(),h=!1}w(!0),l.value=!1,a("show",e)},t.transitionDuration)},handleHide:function(e){if(g(),P(),N(!0),l.value=!0,k(),null!==c){let t=(0===e?.type.indexOf("key")?c.closest('[tabindex]:not([tabindex^="-"])'):void 0)||c;c=null,dn(()=>{t.isConnected&&t.focus()})}m(()=>{k(!0),l.value=!1,a("hide",e)},t.transitionDuration)},handleRouteChange:function(){c=null},processOnMount:!0}),{addToHistory:T,removeFromHistory:P}=lo(s,C,p),E=(0,e.computed)(()=>`q-dialog__inner flex no-pointer-events q-dialog__inner--${t.maximized?"maximized":"minimized"} q-dialog__inner--${t.position} ${Co[t.position]}`+(l.value?" q-dialog__inner--animating":"")+(t.fullWidth?" q-dialog__inner--fullwidth":"")+(t.fullHeight?" q-dialog__inner--fullheight":"")+(t.square?" q-dialog__inner--square":"")),A=(0,e.computed)(()=>s.value&&!t.seamless),L=(0,e.computed)(()=>t.autoClose?{onClick:j}:{}),M=(0,e.computed)(()=>["q-dialog fullscreen no-pointer-events q-dialog--"+(A.value?"modal":"seamless"),i.class]);function R(e){dn(()=>{let t=o.value;if(null!==t){if(void 0!==e){let n=t.querySelector(e);if(null!==n)return void n.focus({preventScroll:!0})}t.contains(document.activeElement)||(t=t.querySelector("[autofocus][tabindex], [data-autofocus][tabindex]")||t.querySelector("[autofocus] [tabindex], [data-autofocus] [tabindex]")||t.querySelector("[autofocus], [data-autofocus]")||t,t.focus({preventScroll:!0}))}})}function z(e){e&&"function"==typeof e.focus?e.focus({preventScroll:!0}):R(),a("shake");let t=o.value;null!==t&&(t.classList.remove("q-animate--scale"),t.classList.add("q-animate--scale"),null!==u&&clearTimeout(u),u=setTimeout(()=>{u=null,null!==o.value&&(t.classList.remove("q-animate--scale"),R())},170))}function I(){t.seamless||(t.persistent||t.noEscDismiss?!t.maximized&&!t.noShake&&z():(a("escapeKey"),C()))}function N(e){null!==u&&(clearTimeout(u),u=null),(e||s.value)&&(O(!1),t.seamless||(f(!1),Zn(q),Gn(I))),e||(c=null)}function O(e){e?d||=(So<1&&document.body.classList.add("q-body--dialog"),So++,!0):d&&=(So<2&&document.body.classList.remove("q-body--dialog"),So--,!1)}function j(e){h||(C(e),a("click",e))}function D(e){t.persistent||t.noBackdropDismiss?t.noShake||z():C(e)}function q(e){!t.allowFocusOutside&&x.value&&!Et(o.value,e.target)&&R('[tabindex]:not([tabindex="-1"])')}return(0,e.watch)(()=>t.maximized,e=>{s.value&&O(e)}),(0,e.watch)(A,e=>{f(e),e?(Qn(q),Wn(I)):(Zn(q),Gn(I))}),Object.assign(r.proxy,{focus:R,shake:z,__updateRefocusTarget(e){c=e||null}}),(0,e.onBeforeUnmount)(N),S}});var Eo=h({name:"QDrawer",inheritAttrs:!1,props:{...tn,...Je,side:{type:String,default:"left",validator:e=>["left","right"].includes(e)},width:{type:Number,default:300},mini:Boolean,miniToOverlay:Boolean,miniWidth:{type:Number,default:57},noMiniAnimation:Boolean,breakpoint:{type:Number,default:1023},showIfAbove:Boolean,behavior:{type:String,validator:e=>["default","desktop","mobile"].includes(e),default:"default"},bordered:Boolean,elevated:Boolean,overlay:Boolean,persistent:Boolean,noSwipeOpen:Boolean,noSwipeClose:Boolean,noSwipeBackdrop:Boolean},emits:[...nn,"onLayout","miniState"],setup(t,{slots:n,emit:a,attrs:i}){let r=(0,e.getCurrentInstance)(),{proxy:{$q:o}}=r,s=Xe(t,o),{preventBodyScroll:l}=xo(),{registerTimeout:u,removeTimeout:c}=xn(),d=(0,e.inject)(Y,ee);if(d===ee)return console.error("QDrawer needs to be child of QLayout"),ee;let h,p,f=null,m=(0,e.ref)("mobile"===t.behavior||"desktop"!==t.behavior&&d.totalWidth.value<=t.breakpoint),_=(0,e.computed)(()=>t.mini&&!m.value),g=(0,e.computed)(()=>_.value?t.miniWidth:t.width),v=(0,e.computed)(()=>t.overlay||t.miniToOverlay||d.view.value.includes(L.value?"R":"L")||o.platform.is.ios&&d.isContainer.value),b=(0,e.ref)(t.showIfAbove&&!m.value||!0===t.modelValue),y=(0,e.computed)(()=>!t.overlay&&b.value&&!m.value),w=(0,e.computed)(()=>t.overlay&&b.value&&!m.value),k=(0,e.computed)(()=>!t.persistent&&(m.value||w.value));function x(e,t){if(P(),!1!==e&&d.animate(),Z(0),m.value){let e=d.instances[O.value];!0===e?.belowBreakpoint&&e.hide(!1),J(1),d.isContainer.value||l(!0)}else J(0),!1!==e&&X(!1);u(()=>{!1!==e&&X(!0),t||a("show",e)},150)}function S(e,t){E(),!1!==e&&d.animate(),J(0),Z(M.value*g.value),ae(),t?c():u(()=>{a("hide",e)},150)}let{show:C,hide:T}=an({showing:b,hideOnRouteChange:k,handleShow:x,handleHide:S}),{addToHistory:P,removeFromHistory:E}=lo(b,T,k),A={belowBreakpoint:m,hide:T},L=(0,e.computed)(()=>"right"===t.side),M=(0,e.computed)(()=>(o.lang.rtl?-1:1)*(L.value?1:-1)),R=(0,e.ref)(0),z=(0,e.ref)(!1),I=(0,e.ref)(!1),N=(0,e.ref)(g.value*M.value),O=(0,e.computed)(()=>L.value?"left":"right"),j=(0,e.computed)(()=>!b.value||m.value||t.overlay?0:t.miniToOverlay?t.miniWidth:g.value),D=(0,e.computed)(()=>"fullscreen q-drawer__backdrop"+(b.value||z.value?"":" hidden")),q=(0,e.computed)(()=>({backgroundColor:`rgba(0,0,0,${.4*R.value})`})),B=(0,e.computed)(()=>L.value?"r"===d.rows.value.top[2]:"l"===d.rows.value.top[0]),F=(0,e.computed)(()=>L.value?"r"===d.rows.value.bottom[2]:"l"===d.rows.value.bottom[0]),V=(0,e.computed)(()=>{let e={};return d.header.space&&!B.value&&(v.value?e.top=`${d.header.offset}px`:d.header.space&&(e.top=`${d.header.size}px`)),d.footer.space&&!F.value&&(v.value?e.bottom=`${d.footer.offset}px`:d.footer.space&&(e.bottom=`${d.footer.size}px`)),e}),U=(0,e.computed)(()=>{let e={width:`${g.value}px`,transform:`translateX(${N.value}px)`};return m.value?e:Object.assign(e,V.value)}),$=(0,e.computed)(()=>"q-drawer__content fit "+(d.isContainer.value?"overflow-auto":"scroll")),H=(0,e.computed)(()=>`q-drawer q-drawer--${t.side}`+(I.value?" q-drawer--mini-animate":"")+(t.bordered?" q-drawer--bordered":"")+(s.value?" q-drawer--dark q-dark":"")+(z.value?" no-transition":b.value?"":" q-layout--prevent-focus")+(m.value?" fixed q-drawer--on-top q-drawer--mobile q-drawer--top-padding":" q-drawer--"+(_.value?"mini":"standard")+(v.value||!y.value?" fixed":"")+(t.overlay||t.miniToOverlay?" q-drawer--on-top":"")+(B.value?" q-drawer--top-padding":""))),W=(0,e.computed)(()=>[[gi,te,void 0,{[o.lang.rtl?t.side:O.value]:!0,mouse:!0}]]),G=(0,e.computed)(()=>[[gi,ne,void 0,{[o.lang.rtl?O.value:t.side]:!0,mouse:!0}]]),K=(0,e.computed)(()=>[[gi,ne,void 0,{[o.lang.rtl?O.value:t.side]:!0,mouse:!0,mouseAllDir:!0}]]);function Q(){!function(e,t){e.value!==t&&(e.value=t)}(m,"mobile"===t.behavior||"desktop"!==t.behavior&&d.totalWidth.value<=t.breakpoint)}function Z(t){void 0===t?(0,e.nextTick)(()=>{t=b.value?0:g.value,Z(M.value*t)}):(d.isContainer.value&&L.value&&(m.value||Math.abs(t)===g.value)&&(t+=M.value*d.scrollbarWidth.value),N.value=t)}function J(e){R.value=e}function X(e){let t=e?"remove":d.isContainer.value?"":"add";""!==t&&document.body.classList[t]("q-body--drawer-toggle")}function te(e){if(b.value)return;let t=g.value,n=_e(e.distance.x,0,t);if(e.isFinal)return n>=Math.min(75,t)?C():(d.animate(),J(0),Z(M.value*t)),void(z.value=!1);Z((o.lang.rtl?!L.value:L.value)?Math.max(t-n,0):Math.min(0,n-t)),J(_e(n/t,0,1)),e.isFirst&&(z.value=!0)}function ne(e){if(!b.value)return;let n=g.value,a=e.direction===t.side,i=(o.lang.rtl?!a:a)?_e(e.distance.x,0,n):0;if(e.isFinal)return Math.abs(i){e?(h=b.value,b.value&&T(!1)):!t.overlay&&"mobile"!==t.behavior&&!1!==h&&(b.value?(Z(0),J(0),ae()):C(!1))}),(0,e.watch)(()=>t.side,(e,t)=>{d.instances[t]===A&&(d.instances[t]=void 0,d[t].space=!1,d[t].offset=0),d.instances[e]=A,d[e].size=g.value,d[e].space=y.value,d[e].offset=j.value}),(0,e.watch)(d.totalWidth,()=>{(d.isContainer.value||!document.qScrollPrevented)&&Q()}),(0,e.watch)(()=>t.behavior+t.breakpoint,Q),(0,e.watch)(d.isContainer,e=>{b.value&&l(!e),e&&Q()}),(0,e.watch)(d.scrollbarWidth,()=>{Z(b.value?0:void 0)}),(0,e.watch)(j,e=>{ie("offset",e)}),(0,e.watch)(y,e=>{a("onLayout",e),ie("space",e)}),(0,e.watch)(L,()=>{Z()}),(0,e.watch)(g,e=>{Z(),re(t.miniToOverlay,e)}),(0,e.watch)(()=>t.miniToOverlay,e=>{re(e,g.value)}),(0,e.watch)(()=>o.lang.rtl,()=>{Z()}),(0,e.watch)(()=>t.mini,()=>{t.noMiniAnimation||t.modelValue&&(null!==f&&clearTimeout(f),r.proxy&&r.proxy.$el&&r.proxy.$el.classList.add("q-drawer--mini-animate"),I.value=!0,f=setTimeout(()=>{f=null,I.value=!1,r?.proxy?.$el?.classList.remove("q-drawer--mini-animate")},150),d.animate())}),(0,e.watch)(_,e=>{a("miniState",e)}),d.instances[t.side]=A,re(t.miniToOverlay,g.value),ie("space",y.value),ie("offset",j.value),t.showIfAbove&&!t.modelValue&&b.value&&void 0!==t["onUpdate:modelValue"]&&a("update:modelValue",!0),(0,e.onMounted)(()=>{a("onLayout",y.value),a("miniState",_.value),h=t.showIfAbove;let n=()=>{(b.value?x:S)(!1,!0)};0===d.totalWidth.value?p=(0,e.watch)(d.totalWidth,()=>{p(),p=void 0,b.value||!t.showIfAbove||m.value?n():C(!1)}):(0,e.nextTick)(n)}),(0,e.onBeforeUnmount)(()=>{p?.(),null!==f&&(clearTimeout(f),f=null),b.value&&ae(),d.instances[t.side]===A&&(d.instances[t.side]=void 0,ie("size",0),ie("offset",0),ie("space",!1))}),()=>{let a=[];m.value&&(t.noSwipeOpen||a.push((0,e.withDirectives)((0,e.h)("div",{key:"open",class:`q-drawer__opener fixed-${t.side}`,"aria-hidden":"true"}),W.value)),a.push(ze("div",{ref:"backdrop",class:D.value,style:q.value,"aria-hidden":"true",onClick:T},void 0,"backdrop",!t.noSwipeBackdrop&&b.value,()=>K.value)));let r=_.value&&void 0!==n.mini,o=[(0,e.h)("div",{...i,key:String(r),class:[$.value,i.class]},r?n.mini():Ae(n.default))];return t.elevated&&b.value&&o.push((0,e.h)("div",{class:"q-layout__shadow absolute-full overflow-hidden no-pointer-events"})),a.push(ze("aside",{ref:"content",class:H.value,style:U.value},o,"contentclose",!t.noSwipeClose&&m.value,()=>G.value)),(0,e.h)("div",{class:"q-drawer-container"},a)}}});let Ao=["div","li","ul","ol","blockquote"];function Lo(e,t){if(t&&e===t)return null;let n=e.nodeName.toLowerCase();if(Ao.includes(n))return e;let a=(window.getComputedStyle?window.getComputedStyle(e):e.currentStyle).display;return"block"===a||"table"===a?e:Lo(e.parentNode)}function Mo(e,t,n){return!(!e||e===document.body)&&(n&&e===t||(t===document?document.body:t).contains(e.parentNode))}function Ro(e,t,n){if(n||((n=document.createRange()).selectNode(e),n.setStart(e,0)),0===t.count)n.setEnd(e,t.count);else if(t.count>0)if(e.nodeType===Node.TEXT_NODE)e.textContent.length0&&this.savedPos\n \n \n Print - ${document.title}\n \n \n
${this.el.innerHTML}
\n \n \n `),e.print(),void e.close()}if("link"===e){let e=this.getParentAttribute("href");if(null===e){let e=this.selectWord(this.selection),t=e?e.toString():"";if(!(0!==t.length||this.range&&this.range.cloneContents().querySelector("img")))return;this.eVm.editLinkUrl.value=zo.test(t)?t:"https://",this.save(e.getRangeAt(0)),document.execCommand("createLink",!1,this.eVm.editLinkUrl.value)}else this.eVm.editLinkUrl.value=e,this.range.selectNodeContents(this.parent),this.save();return}if("fullscreen"===e)return this.eVm.toggleFullscreen(),void n();if("viewsource"===e)return this.eVm.isViewingSource.value=!this.eVm.isViewingSource.value,this.eVm.setContent(this.eVm.props.modelValue),void n()}document.execCommand(e,!1,t),n()}selectWord(e){if(null===e||!e.isCollapsed)return e;let t=document.createRange();t.setStart(e.anchorNode,e.anchorOffset),t.setEnd(e.focusNode,e.focusOffset);let n=t.collapsed?["backward","forward"]:["forward","backward"];t.detach();let a=e.focusNode,i=e.focusOffset;return e.collapse(e.anchorNode,e.anchorOffset),e.modify("move",n[0],"character"),e.modify("move",n[1],"word"),e.extend(a,i),e.modify("extend",n[1],"character"),e.modify("extend",n[0],"word"),e}};let No=0;var Oo=h({name:"QTooltip",inheritAttrs:!1,props:{...Zt,...tn,...yn,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null},transitionShow:{...yn.transitionShow,default:"jump-down"},transitionHide:{...yn.transitionHide,default:"jump-up"},anchor:{type:String,default:"bottom middle",validator:la},self:{type:String,default:"top middle",validator:la},offset:{type:Array,default:()=>[14,14],validator:ua},scrollTarget:Cn,delay:{type:Number,default:0},hideDelay:{type:Number,default:0},persistent:Boolean},emits:[...nn],setup(t,{slots:n,emit:a,attrs:i}){let r,o,s,l,u=!1,c=(0,e.getCurrentInstance)(),{proxy:{$q:d}}=c,h=(0,e.ref)(null),p=(0,e.ref)(!1),f=va(),m=(0,e.computed)(()=>i.id||f.value),_=(0,e.computed)(()=>da(t.anchor,d.lang.rtl)),g=(0,e.computed)(()=>da(t.self,d.lang.rtl)),v=(0,e.computed)(()=>!t.persistent),{registerTick:b,removeTick:y}=kn(),{registerTimeout:k}=xn(),{transitionProps:C,transitionStyle:T}=wn(t),{localScrollTarget:P,changeScrollEvent:E,unconfigureScrollTarget:A}=en(t,U),{anchorEl:L,canShow:M,anchorEvents:R}=Xt({showing:p,configureAnchorEl:function(){if(t.noParentEvent||null===L.value)return;let e=d.platform.is.mobile?[[L.value,"touchstart","delayShow","passive"]]:[[L.value,"mouseenter","delayShow","passive"],[L.value,"mouseleave","delayHide","passive"],[L.value,"focusin","onFocusin","passive"],[L.value,"focusout","delayHide","passive"]];x(R,"anchor",e)}}),{show:z,hide:I}=an({showing:p,canShow:M,handleShow:function(n){N(),function(){let e=L.value,t=m.value;if(null===e||void 0===t)return;let n=(e.getAttribute("aria-describedby")||"").split(/\s+/).filter(Boolean);l={el:e,id:t,added:!n.includes(t)},l.added&&(n.push(t),e.setAttribute("aria-describedby",n.join(" ")))}(),b(()=>{o?.disconnect(),null!==h.value?(o=new MutationObserver(()=>q()),o.observe(h.value,{attributes:!1,childList:!0,characterData:!0,subtree:!0}),q(),U()):o=void 0}),void 0===r&&(r=(0,e.watch)(()=>d.screen.width+"|"+d.screen.height+"|"+t.self+"|"+t.anchor+"|"+d.lang.rtl,q)),k(()=>{N(!0),a("show",n)},t.transitionDuration)},handleHide:function(e){y(),O(),D(),k(()=>{O(!0),a("hide",e)},t.transitionDuration)},hideOnRouteChange:v,processOnMount:!0});Object.assign(R,{delayShow:B,delayHide:function(e){d.platform.is.mobile&&(S(R,"tooltipTemp"),Qt(),s=setTimeout(()=>{s=void 0,V(!1)},10)),k(()=>{I(e)},t.hideDelay)},onFocusin:function(e){let t=e.target;if(t){try{if(!1===t.matches(":focus-visible"))return}catch{}B(e)}}});let{showPortal:N,hidePortal:O,renderPortal:j}=bn(c,h,function(){return(0,e.h)(e.Transition,C.value,$)},"tooltip");if(d.platform.is.mobile){let n={anchorEl:L,innerRef:h,onClickOutside:e=>(I(e),e.target.classList.contains("q-dialog__backdrop")&&w(e),!0)};(0,e.watch)((0,e.computed)(()=>null===t.modelValue&&!t.persistent&&p.value),e=>{(e?na:aa)(n)}),(0,e.onBeforeUnmount)(()=>{aa(n)})}else(0,e.watch)(()=>(null===t.modelValue||t["onUpdate:modelValue"])&&!0===p.value&&!0!==t.persistent,e=>{(!0===e?Wn:Gn)(F)});function D(){void 0!==o&&(o.disconnect(),o=void 0),void 0!==r&&(r(),r=void 0),A(),Gn(F),S(R,"tooltipTemp"),function(){if(!0===l?.added){let{el:e,id:t}=l,n=(e.getAttribute("aria-describedby")||"").split(/\s+/).filter(e=>""!==e&&e!==t);0===n.length?e.removeAttribute("aria-describedby"):e.setAttribute("aria-describedby",n.join(" "))}l=void 0}(),V(!1)}function q(){pa({targetEl:h.value,offset:t.offset,anchorEl:L.value,anchorOrigin:_.value,selfOrigin:g.value,maxHeight:t.maxHeight,maxWidth:t.maxWidth})}function B(e){if(d.platform.is.mobile){void 0!==s&&(clearTimeout(s),s=void 0),Qt(),V(!0);let e=L.value,t=["touchmove","touchcancel","touchend","click"].map(t=>[e,t,"delayHide","passiveCapture"]);x(R,"tooltipTemp",t)}k(()=>{z(e)},t.delay)}function F(e){I(e)}function V(e){u!==e&&(u=e,No+=e?1:-1,document.body.classList.toggle("non-selectable",No>0),!e&&void 0!==s&&(clearTimeout(s),s=void 0))}function U(){if(null!==L.value||void 0!==t.scrollTarget){P.value=Pn(L.value,t.scrollTarget);let e=t.noParentEvent?q:I;E(P.value,e)}}function $(){return p.value?(0,e.h)("div",{...i,id:m.value,ref:h,class:["q-tooltip q-tooltip--style q-position-engine no-pointer-events",i.class],style:[i.style,T.value],role:"tooltip"},Ae(n.default)):null}return(0,e.onBeforeUnmount)(D),Object.assign(c.proxy,{updatePosition:q}),j}}),jo=h({name:"QItem",props:{...Je,...vt,tag:{type:String,default:"div"},active:{type:Boolean,default:null},clickable:Boolean,dense:Boolean,insetLevel:Number,tabindex:[String,Number],focused:Boolean,manualFocus:Boolean},emits:["click","keyup"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),r=Xe(t,i),{hasLink:o,linkAttrs:s,linkClass:l,linkTag:u,navigateOnClick:c}=bt(),d=(0,e.ref)(null),h=(0,e.ref)(null),p=(0,e.computed)(()=>t.clickable||o.value||"label"===t.tag),f=(0,e.computed)(()=>!t.disable&&p.value),m=(0,e.computed)(()=>"q-item q-item-type row no-wrap"+(t.dense?" q-item--dense":"")+(r.value?" q-item--dark":"")+(o.value&&null===t.active?l.value:t.active?" q-item--active"+(void 0===t.activeClass?"":` ${t.activeClass}`):"")+(t.disable?" disabled":"")+(f.value?" q-item--clickable q-link cursor-pointer "+(t.manualFocus?"q-manual-focusable":"q-focusable q-hoverable")+(t.focused?" q-manual-focusable--focused":""):"")),_=(0,e.computed)(()=>void 0===t.insetLevel?null:{["padding"+(i.lang.rtl?"Right":"Left")]:16+56*t.insetLevel+"px"});function g(e){f.value&&(null!==h.value&&!e.qAvoidFocus&&(e.qKeyEvent||document.activeElement!==d.value?document.activeElement===h.value&&d.value.focus():h.value.focus()),c(e))}function v(e){if(f.value&&N(e,[13,32])){w(e),e.qKeyEvent=!0;let t=new MouseEvent("click",e);t.qKeyEvent=!0,d.value.dispatchEvent(t)}a("keyup",e)}function b(e){f.value&&32===e.keyCode&&w(e)}function y(){let t=Le(n.default,[]);return f.value&&t.unshift((0,e.h)("div",{class:"q-focus-helper",tabindex:-1,ref:h})),t}return()=>{let n={ref:d,class:m.value,style:_.value,role:o.value?void 0:f.value?"button":"listitem",onClick:g,onKeydown:b,onKeyup:v};return f.value?(n.tabindex=t.tabindex||"0",Object.assign(n,s.value)):p.value&&(n["aria-disabled"]="true"),(0,e.h)(u.value,n,y())}}}),Do=h({name:"QItemSection",props:{avatar:Boolean,thumbnail:Boolean,side:Boolean,top:Boolean,noWrap:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>"q-item__section column q-item__section--"+(t.avatar||t.side||t.thumbnail?"side":"main")+(t.top?" q-item__section--top justify-start":" justify-center")+(t.avatar?" q-item__section--avatar":"")+(t.thumbnail?" q-item__section--thumbnail":"")+(t.noWrap?" q-item__section--nowrap":""));return()=>(0,e.h)("div",{class:a.value},Ae(n.default))}});function qo(e,t,n){t.handler?t.handler(e,n,n.caret):n.runCmd(t.cmd,t.param)}function Bo(t){return(0,e.h)("div",{class:"q-editor__toolbar-group"},t)}function Fo(t,n,a,i=!1){let r=i||"toggle"===n.type&&(n.toggled?n.toggled(t):n.cmd&&t.caret.is(n.cmd,n.param)),o=[];if(t.$q.platform.is.desktop&&(n.tip||n.htmlTip)){let t=n.key?(0,e.h)("div",[(0,e.h)("small",`(CTRL + ${String.fromCodePoint(n.key)})`)]):null;o.push((0,e.h)(Oo,{delay:1e3},()=>[(0,e.h)("div",n.htmlTip?{innerHTML:n.htmlTip}:n.tip),t]))}return(0,e.h)(Kt,{...t.buttonProps.value,icon:null===n.icon?void 0:n.icon,color:r?n.toggleColor||t.props.toolbarToggleColor:n.color||t.props.toolbarColor,textColor:r&&!t.props.toolbarPush?null:n.textColor||t.props.toolbarTextColor,label:n.label,"aria-label":null===n.label?n.tip:void 0,disable:!!n.disable&&("function"!=typeof n.disable||n.disable(t)),size:"sm",onClick(e){a?.(),qo(e,n,t)}},()=>o)}function Vo(t,n){let a,i,r="only-icons"===n.list,o=n.label,s=null===n.icon?void 0:n.icon;function l(){c.component.proxy.hide()}if(r)i=n.options.map(e=>{let n=void 0===e.type&&t.caret.is(e.cmd,e.param);return n&&(o=e.tip,s=null===e.icon?void 0:e.icon),Fo(t,e,l,n)}),a=t.toolbarBackgroundClass.value,i=[Bo(i)];else{let r=void 0===t.props.toolbarToggleColor?null:`text-${t.props.toolbarToggleColor}`,u=void 0===t.props.toolbarTextColor?null:`text-${t.props.toolbarTextColor}`,c="no-icons"===n.list;i=n.options.map(n=>{let a=!!n.disable&&n.disable(t),i=void 0===n.type&&t.caret.is(n.cmd,n.param);i&&(o=n.tip,s=null===n.icon?void 0:n.icon);let d=n.htmlTip;return(0,e.h)(jo,{active:i,activeClass:r,clickable:!0,disable:a,dense:!0,onClick(e){l(),!0!==e?.qAvoidFocus&&t.contentRef.value?.focus(),t.caret.restore(),qo(e,n,t)}},()=>[c?null:(0,e.h)(Do,{class:i?r:u,side:!0},()=>(0,e.h)(Ke,{name:null===n.icon?void 0:n.icon})),(0,e.h)(Do,d?()=>(0,e.h)("div",{class:"text-no-wrap",innerHTML:n.htmlTip}):n.tip?()=>(0,e.h)("div",{class:"text-no-wrap"},n.tip):void 0)])}),a=[t.toolbarBackgroundClass.value,u]}let u=n.highlight&&o!==n.label,c=(0,e.h)(ya,{...t.buttonProps.value,noCaps:!0,noWrap:!0,color:u?t.props.toolbarToggleColor:t.props.toolbarColor,textColor:u&&!t.props.toolbarPush?null:t.props.toolbarTextColor,label:n.fixedLabel?n.label:o,icon:n.fixedIcon?null===n.icon?void 0:n.icon:s,contentClass:a,onShow:e=>t.emit("dropdownShow",e),onHide:e=>t.emit("dropdownHide",e),onBeforeShow:e=>t.emit("dropdownBeforeShow",e),onBeforeHide:e=>t.emit("dropdownBeforeHide",e)},()=>i);return c}function Uo(e){if(e.caret)return e.buttons.value.filter(t=>!e.isViewingSource.value||t.find(e=>"viewsource"===e.cmd)).map(t=>Bo(t.map(t=>(!e.isViewingSource.value||"viewsource"===t.cmd)&&("slot"===t.type?Ae(e.slots[t.slot]):"dropdown"===t.type?Vo(e,t):Fo(e,t)))))}function $o(t){if(t.caret){let n=t.props.toolbarColor||t.props.toolbarTextColor,a=t.editLinkUrl.value,i=()=>{t.caret.restore(),a!==t.editLinkUrl.value&&document.execCommand("createLink",!1,""===a?" ":a),t.editLinkUrl.value=null};return[(0,e.h)("div",{class:`q-mx-xs text-${n}`},`${t.$q.lang.editor.url}: `),(0,e.h)("input",{key:"qedt_btm_input",class:"col q-editor__link-input",value:a,onInput:e=>{b(e),a=e.target.value},onKeydown:e=>{if(!I(e))switch(e.keyCode){case 13:return y(e),i();case 27:y(e),t.caret.restore(),(!t.editLinkUrl.value||"https://"===t.editLinkUrl.value)&&document.execCommand("unlink"),t.editLinkUrl.value=null}}}),Bo([(0,e.h)(Kt,{key:"qedt_btm_rem",...t.buttonProps.value,label:t.$q.lang.label.remove,noCaps:!0,onClick:()=>{t.caret.restore(),document.execCommand("unlink"),t.editLinkUrl.value=null}}),(0,e.h)(Kt,{key:"qedt_btm_upd",...t.buttonProps.value,label:t.$q.lang.label.update,noCaps:!0,onClick:i})])]}}let Ho=/^on[A-Z]/;function Wo(){let{attrs:t,vnode:n}=(0,e.getCurrentInstance)(),a={listeners:(0,e.ref)({}),attributes:(0,e.ref)({})};function i(){let e={},i={};for(let n in t)"class"!==n&&"style"!==n&&!Ho.test(n)&&(e[n]=t[n]);for(let e in n.props)Ho.test(e)&&(i[e]=n.props[e]);a.attributes.value=e,a.listeners.value=i}return(0,e.onBeforeUpdate)(i),i(),a}let Go=Object.prototype.toString,Ko=Object.prototype.hasOwnProperty,Yo=new Set(["Boolean","Number","String","Function","Array","Date","RegExp"].map(e=>"[object "+e+"]"));function Qo(e){if(e!==Object(e)||Yo.has(Go.call(e))||e.constructor&&!Ko.call(e,"constructor")&&!Ko.call(e.constructor.prototype,"isPrototypeOf"))return!1;let t;for(t in e);return void 0===t||Ko.call(e,t)}function Zo(...e){let t,n,a,i,r,o,s=e[0]||{},l=1,u=!1,c=e.length;for("boolean"==typeof s&&(u=s,s=e[1]||{},l=2),Object(s)!==s&&"function"!=typeof s&&(s={}),c===l&&(s=this,l--);le.every(e=>e.length),default:()=>[["left","center","right","justify"],["bold","italic","underline","strike"],["undo","redo"]]},toolbarColor:String,toolbarBg:String,toolbarTextColor:String,toolbarToggleColor:{type:String,default:"primary"},toolbarOutline:Boolean,toolbarPush:Boolean,toolbarRounded:Boolean,paragraphTag:{type:String,validator:e=>["div","p"].includes(e),default:"div"},contentStyle:Object,contentClass:[Object,Array,String],square:Boolean,flat:Boolean,dense:Boolean},emits:[...Wa,"update:modelValue","keydown","click","focus","blur","dropdownShow","dropdownHide","dropdownBeforeShow","dropdownBeforeHide","linkShow","linkHide"],setup(t,{slots:n,emit:a}){let i,r,{proxy:s}=(0,e.getCurrentInstance)(),{$q:l}=s,u=Xe(t,l),{inFullscreen:c,toggleFullscreen:d}=Ga(),h=Wo(),p=(0,e.ref)(null),f=(0,e.ref)(null),m=(0,e.ref)(null),_=(0,e.ref)(!1),g=(0,e.computed)(()=>!t.readonly&&!t.disable),v=null,b=t.modelValue,y=o.value;document.execCommand("defaultParagraphSeparator",!1,t.paragraphTag),i=window.getComputedStyle(document.body).fontFamily;let k=(0,e.computed)(()=>t.toolbarBg?` bg-${t.toolbarBg}`:""),x=(0,e.computed)(()=>({type:"a",flat:!t.toolbarOutline&&!t.toolbarPush,noWrap:!0,outline:t.toolbarOutline,push:t.toolbarPush,rounded:t.toolbarRounded,dense:!0,color:t.toolbarColor,disable:!g.value,size:"sm"})),S=(0,e.computed)(()=>{let e=l.lang.editor,n=l.iconSet.editor;return{bold:{cmd:"bold",icon:n.bold,tip:e.bold,key:66},italic:{cmd:"italic",icon:n.italic,tip:e.italic,key:73},strike:{cmd:"strikeThrough",icon:n.strikethrough,tip:e.strikethrough,key:83},underline:{cmd:"underline",icon:n.underline,tip:e.underline,key:85},unordered:{cmd:"insertUnorderedList",icon:n.unorderedList,tip:e.unorderedList},ordered:{cmd:"insertOrderedList",icon:n.orderedList,tip:e.orderedList},subscript:{cmd:"subscript",icon:n.subscript,tip:e.subscript,htmlTip:"x2"},superscript:{cmd:"superscript",icon:n.superscript,tip:e.superscript,htmlTip:"x2"},link:{cmd:"link",disable:e=>e.caret&&!e.caret.can("link"),icon:n.hyperlink,tip:e.hyperlink,key:76},fullscreen:{cmd:"fullscreen",icon:n.toggleFullscreen,tip:e.toggleFullscreen,key:70},viewsource:{cmd:"viewsource",icon:n.viewSource,tip:e.viewSource},quote:{cmd:"formatBlock",param:"BLOCKQUOTE",icon:n.quote,tip:e.quote,key:81},left:{cmd:"justifyLeft",icon:n.left,tip:e.left},center:{cmd:"justifyCenter",icon:n.center,tip:e.center},right:{cmd:"justifyRight",icon:n.right,tip:e.right},justify:{cmd:"justifyFull",icon:n.justify,tip:e.justify},print:{type:"no-state",cmd:"print",icon:n.print,tip:e.print,key:80},outdent:{type:"no-state",disable:e=>e.caret&&!e.caret.can("outdent"),cmd:"outdent",icon:n.outdent,tip:e.outdent},indent:{type:"no-state",disable:e=>e.caret&&!e.caret.can("indent"),cmd:"indent",icon:n.indent,tip:e.indent},removeFormat:{type:"no-state",cmd:"removeFormat",icon:n.removeFormat,tip:e.removeFormat},hr:{type:"no-state",cmd:"insertHorizontalRule",icon:n.hr,tip:e.hr},undo:{type:"no-state",cmd:"undo",icon:n.undo,tip:e.undo,key:90},redo:{type:"no-state",cmd:"redo",icon:n.redo,tip:e.redo,key:89},h1:{cmd:"formatBlock",param:"H1",icon:n.heading1||n.heading,tip:e.heading1,htmlTip:`

${e.heading1}

`},h2:{cmd:"formatBlock",param:"H2",icon:n.heading2||n.heading,tip:e.heading2,htmlTip:`

${e.heading2}

`},h3:{cmd:"formatBlock",param:"H3",icon:n.heading3||n.heading,tip:e.heading3,htmlTip:`

${e.heading3}

`},h4:{cmd:"formatBlock",param:"H4",icon:n.heading4||n.heading,tip:e.heading4,htmlTip:`

${e.heading4}

`},h5:{cmd:"formatBlock",param:"H5",icon:n.heading5||n.heading,tip:e.heading5,htmlTip:`
${e.heading5}
`},h6:{cmd:"formatBlock",param:"H6",icon:n.heading6||n.heading,tip:e.heading6,htmlTip:`
${e.heading6}
`},p:{cmd:"formatBlock",param:t.paragraphTag,icon:n.heading,tip:e.paragraph},code:{cmd:"formatBlock",param:"PRE",icon:n.code,htmlTip:`${e.code}`},"size-1":{cmd:"fontSize",param:"1",icon:n.size1||n.size,tip:e.size1,htmlTip:`${e.size1}`},"size-2":{cmd:"fontSize",param:"2",icon:n.size2||n.size,tip:e.size2,htmlTip:`${e.size2}`},"size-3":{cmd:"fontSize",param:"3",icon:n.size3||n.size,tip:e.size3,htmlTip:`${e.size3}`},"size-4":{cmd:"fontSize",param:"4",icon:n.size4||n.size,tip:e.size4,htmlTip:`${e.size4}`},"size-5":{cmd:"fontSize",param:"5",icon:n.size5||n.size,tip:e.size5,htmlTip:`${e.size5}`},"size-6":{cmd:"fontSize",param:"6",icon:n.size6||n.size,tip:e.size6,htmlTip:`${e.size6}`},"size-7":{cmd:"fontSize",param:"7",icon:n.size7||n.size,tip:e.size7,htmlTip:`${e.size7}`}}}),C=(0,e.computed)(()=>{let e=t.definitions||{},n=t.definitions||t.fonts?Zo(!0,{},S.value,e,function(e,t,n,a={}){let i=Object.keys(a);if(0===i.length)return{};let r={default_font:{cmd:"fontName",param:e,icon:n,tip:t}};return i.forEach(e=>{let t=a[e];r[e]={cmd:"fontName",param:t,icon:n,tip:t,htmlTip:`${t}`}}),r}(i,l.lang.editor.defaultFont,l.iconSet.editor.font,t.fonts)):S.value;return t.toolbar.map(t=>t.map(t=>{if(t.options)return{type:"dropdown",icon:t.icon,label:t.label,size:"sm",dense:!0,fixedLabel:t.fixedLabel,fixedIcon:t.fixedIcon,highlight:t.highlight,list:t.list,options:t.options.map(e=>n[e])};let a=n[t];return a?"no-state"===a.type||e[t]&&(void 0===a.cmd||S.value[a.cmd]&&"no-state"===S.value[a.cmd].type)?a:{type:"toggle",...a}:{type:"slot",slot:t}}))}),T={$q:l,props:t,slots:n,emit:a,inFullscreen:c,toggleFullscreen:d,runCmd:$,isViewingSource:_,editLinkUrl:m,toolbarBackgroundClass:k,buttonProps:x,contentRef:f,buttons:C,setContent:U};(0,e.watch)(()=>t.modelValue,e=>{b!==e&&(b=e,U(e,!0))}),(0,e.watch)(m,e=>{a("link"+(e?"Show":"Hide"))});let P=(0,e.computed)(()=>t.toolbar&&0!==t.toolbar.length),E=(0,e.computed)(()=>{let e={},t=t=>{t.key&&(e[t.key]={cmd:t.cmd,param:t.param})};return C.value.forEach(e=>{e.forEach(e=>{e.options?e.options.forEach(t):t(e)})}),e}),A=(0,e.computed)(()=>c.value?t.contentStyle:[{minHeight:t.minHeight,height:t.height,maxHeight:t.maxHeight},t.contentStyle]),L=(0,e.computed)(()=>"q-editor q-editor--"+(_.value?"source":"default")+(t.disable?" disabled":"")+(c.value?" fullscreen column":"")+(t.square?" q-editor--square no-border-radius":"")+(t.flat?" q-editor--flat":"")+(t.dense?" q-editor--dense":"")+(u.value?" q-editor--dark q-dark":"")),M=(0,e.computed)(()=>[t.contentClass,"q-editor__content",{col:c.value,"overflow-auto":c.value||t.maxHeight}]),R=(0,e.computed)(()=>t.disable?{"aria-disabled":"true"}:{});function z(){if(null!==f.value){let e="inner"+(_.value?"Text":"HTML"),n=f.value[e];n!==t.modelValue&&(b=n,a("update:modelValue",n))}}function N(e){if(a("keydown",e),!e.ctrlKey||I(e))return void H();let t=e.keyCode,n=E.value[t];if(void 0!==n){let{cmd:t,param:a}=n;w(e),$(t,a,!1)}}function O(e){H(),a("click",e)}function j(e){if(null!==f.value){let{scrollTop:e,scrollHeight:t}=f.value;r=t-e}T.caret.save(),a("blur",e)}function D(t){(0,e.nextTick)(()=>{null!==f.value&&void 0!==r&&(f.value.scrollTop=f.value.scrollHeight-r)}),a("focus",t)}function q(e){let t=p.value;if(null!==t&&t.contains(e.target)&&(null===e.relatedTarget||!t.contains(e.relatedTarget))){let e="inner"+(_.value?"Text":"HTML");T.caret.restorePosition(f.value[e].length),H()}}function B(e){let t=p.value;null!==t&&t.contains(e.target)&&(null===e.relatedTarget||!t.contains(e.relatedTarget))&&(T.caret.savePosition(),H())}function F(){r=void 0}function V(){T.caret.save()}function U(e,t){if(null!==f.value){t&&T.caret.savePosition();let n="inner"+(_.value?"Text":"HTML");f.value[n]=e,t&&(T.caret.restorePosition(f.value[n].length),H())}}function $(e,t,n=!0){W(),T.caret.restore(),T.caret.apply(e,t,()=>{W(),T.caret.save(),n&&H()})}function H(){null!==v&&clearTimeout(v),v=setTimeout(()=>{v=null,m.value=null,s.$forceUpdate()},1)}function W(){dn(()=>{f.value?.focus({preventScroll:!0})})}return(0,e.onMounted)(()=>{T.caret=s.caret=new Io(f.value,T),U(t.modelValue),H(),document.addEventListener("selectionchange",V)}),(0,e.onBeforeUnmount)(()=>{null!==v&&clearTimeout(v),document.removeEventListener("selectionchange",V)}),Object.assign(s,{runCmd:$,refreshToolbar:H,focus:W,getContentEl:function(){return f.value}}),()=>{let n;if(P.value){let t=[(0,e.h)("div",{key:"qedt_top",class:"q-editor__toolbar row no-wrap scroll-x"+k.value},Uo(T))];null!==m.value&&t.push((0,e.h)("div",{key:"qedt_btm",class:"q-editor__toolbar row no-wrap items-center scroll-x"+k.value},$o(T))),n=(0,e.h)("div",{key:"toolbar_ctainer",class:"q-editor__toolbars-container"},t)}return(0,e.h)("div",{ref:p,class:L.value,style:{height:c.value?"100%":null},...R.value,onFocusin:q,onFocusout:B},[n,(0,e.h)("div",{ref:f,style:A.value,class:M.value,contenteditable:g.value,placeholder:t.placeholder,...y?{innerHTML:t.modelValue}:{},...h.listeners.value,onInput:z,onKeydown:N,onClick:O,onBlur:j,onFocus:D,onMousedown:F,onTouchstartPassive:F})])}}}),Xo=h({name:"QItemLabel",props:{overline:Boolean,caption:Boolean,header:Boolean,lines:[Number,String]},setup(t,{slots:n}){let a=(0,e.computed)(()=>Number.parseInt(t.lines,10)),i=(0,e.computed)(()=>"q-item__label"+(t.overline?" q-item__label--overline text-overline":"")+(t.caption?" q-item__label--caption text-caption":"")+(t.header?" q-item__label--header":"")+(1===a.value?" ellipsis":"")),r=(0,e.computed)(()=>void 0!==t.lines&&a.value>1?{overflow:"hidden",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":a.value}:null);return()=>(0,e.h)("div",{style:r.value,class:i.value},Ae(n.default))}}),es=h({name:"QSlideTransition",props:{appear:Boolean,duration:{type:Number,default:300}},emits:["show","hide"],setup(t,{slots:n,emit:a}){let i,r,o,s,l=!1,u=null,c=null;function d(){i?.(),i=null,l=!1,null!==u&&(clearTimeout(u),u=null),null!==c&&(clearTimeout(c),c=null),r?.removeEventListener("transitionend",o),o=null}function h(e,n,a){void 0!==n&&(e.style.height=`${n}px`),e.style.transition=`height ${t.duration}ms cubic-bezier(.25, .8, .50, 1)`,l=!0,i=a}function p(e,t){e.style.overflowY=null,e.style.height=null,e.style.transition=null,d(),t!==s&&a(t)}function f(e,n){let a=0;r=e,l?(d(),a=e.offsetHeight===e.scrollHeight?0:void 0):(s="hide",e.style.overflowY="hidden"),h(e,a,n),u=setTimeout(()=>{u=null,e.style.height=`${e.scrollHeight}px`,o=t=>{c=null,(Object(t)!==t||t.target===e)&&p(e,"show")},e.addEventListener("transitionend",o),c=setTimeout(o,1.1*t.duration)},100)}function m(e,n){let a;r=e,l?d():(s="show",e.style.overflowY="hidden",a=e.scrollHeight),h(e,a,n),u=setTimeout(()=>{u=null,e.style.height=0,o=t=>{c=null,(Object(t)!==t||t.target===e)&&p(e,"hide")},e.addEventListener("transitionend",o),c=setTimeout(o,1.1*t.duration)},100)}return(0,e.onBeforeUnmount)(()=>{l&&d()}),()=>(0,e.h)(e.Transition,{css:!1,appear:t.appear,onEnter:f,onLeave:m},n.default)}});let ts={true:"inset",item:"item-inset","item-thumbnail":"item-thumbnail-inset"},ns={xs:2,sm:4,md:8,lg:16,xl:24};var as=h({name:"QSeparator",props:{...Je,spaced:[Boolean,String],inset:[Boolean,String],vertical:Boolean,color:String,size:String},setup(t){let n=Xe(t,(0,e.getCurrentInstance)().proxy.$q),a=(0,e.computed)(()=>t.vertical?"vertical":"horizontal"),i=(0,e.computed)(()=>` q-separator--${a.value}`),r=(0,e.computed)(()=>t.inset?`${i.value}-${ts[t.inset]}`:""),o=(0,e.computed)(()=>`q-separator${i.value}${r.value}`+(void 0===t.color?"":` bg-${t.color}`)+(n.value?" q-separator--dark":"")),s=(0,e.computed)(()=>{let e={};if(void 0!==t.size&&(e[t.vertical?"width":"height"]=t.size),t.spaced){let n=!0===t.spaced?`${ns.md}px`:t.spaced in ns?`${ns[t.spaced]}px`:t.spaced,a=t.vertical?["Left","Right"]:["Top","Bottom"];e[`margin${a[0]}`]=e[`margin${a[1]}`]=n}return e});return()=>(0,e.h)("hr",{class:o.value,style:s.value,"aria-orientation":a.value})}});let is=(0,e.shallowReactive)({});function rs(e){32===e.keyCode&&w(e)}let os=Object.keys(vt);var ss=h({name:"QExpansionItem",props:{...vt,...tn,...Je,icon:String,label:String,labelLines:[Number,String],caption:String,captionLines:[Number,String],dense:Boolean,toggleAriaLabel:String,expandIcon:String,expandedIcon:String,expandIconClass:[Array,String,Object],duration:{},headerInsetLevel:Number,contentInsetLevel:Number,expandSeparator:Boolean,defaultOpened:Boolean,hideExpandIcon:Boolean,expandIconToggle:Boolean,switchToggleSide:Boolean,denseToggle:Boolean,group:String,popup:Boolean,headerStyle:[Array,String,Object],headerClass:[Array,String,Object]},emits:[...nn,"click","afterShow","afterHide"],setup(t,{slots:n,emit:a}){let i,r,{proxy:{$q:o}}=(0,e.getCurrentInstance)(),s=Xe(t,o),l=(0,e.ref)(null===t.modelValue?t.defaultOpened:t.modelValue),u=(0,e.ref)(null),c=va(),{show:d,hide:h,toggle:p}=an({showing:l}),f=(0,e.computed)(()=>`q-expansion-item q-item-type q-expansion-item--${l.value?"expanded":"collapsed"} q-expansion-item--${t.popup?"popup":"standard"}`),m=(0,e.computed)(()=>void 0===t.contentInsetLevel?null:{["padding"+(o.lang.rtl?"Right":"Left")]:56*t.contentInsetLevel+"px"}),_=(0,e.computed)(()=>!t.disable&&(void 0!==t.href||void 0!==t.to&&null!==t.to&&""!==t.to)),g=(0,e.computed)(()=>{let e={};return os.forEach(n=>{e[n]=t[n]}),e}),v=(0,e.computed)(()=>_.value||!t.expandIconToggle),b=(0,e.computed)(()=>void 0!==t.expandedIcon&&l.value?t.expandedIcon:t.expandIcon||o.iconSet.expansionItem[t.denseToggle?"denseIcon":"icon"]),y=(0,e.computed)(()=>!t.disable&&(_.value||t.expandIconToggle)),k=(0,e.computed)(()=>({expanded:l.value,detailsId:c.value,toggle:p,show:d,hide:h})),x=(0,e.computed)(()=>{let e=void 0===t.toggleAriaLabel?o.lang.label[l.value?"collapse":"expand"](t.label):t.toggleAriaLabel;return{role:"button","aria-expanded":l.value?"true":"false","aria-controls":c.value,"aria-label":e}});function S(e){_.value||p(e),a("click",e)}function C(e){[13,32].includes(e.keyCode)&&T(e,!0)}function T(e,t){!t&&!e.qAvoidFocus&&u.value?.focus(),p(e),w(e)}function P(){a("afterShow")}function E(){a("afterHide")}function A(){void 0===i&&(i=_a()),l.value&&(is[t.group]=i);let n=(0,e.watch)(l,e=>{e?is[t.group]=i:is[t.group]===i&&delete is[t.group]}),a=(0,e.watch)(()=>is[t.group],(e,t)=>{t===i&&void 0!==e&&e!==i&&h()});r=()=>{n(),a(),is[t.group]===i&&delete is[t.group],r=void 0}}function L(){let a;return void 0===n.header?(a=[(0,e.h)(Do,()=>[(0,e.h)(Xo,{lines:t.labelLines},()=>t.label||""),t.caption?(0,e.h)(Xo,{lines:t.captionLines,caption:!0},()=>t.caption):null])],t.icon&&a[t.switchToggleSide?"push":"unshift"]((0,e.h)(Do,{side:t.switchToggleSide,avatar:!t.switchToggleSide},()=>(0,e.h)(Ke,{name:t.icon})))):a=[n.header(k.value)].flat(),!t.disable&&!t.hideExpandIcon&&a[t.switchToggleSide?"unshift":"push"](function(){let n={class:["q-focusable relative-position cursor-pointer"+(t.denseToggle&&t.switchToggleSide?" items-end":""),t.expandIconClass],side:!t.switchToggleSide,avatar:t.switchToggleSide},a=[(0,e.h)(Ke,{class:"q-expansion-item__toggle-icon"+(void 0===t.expandedIcon&&l.value?" q-expansion-item__toggle-icon--rotated":""),name:b.value})];return y.value&&(Object.assign(n,{tabindex:0,...x.value,onClick:T,onKeydown:rs,onKeyup:C}),a.unshift((0,e.h)("div",{ref:u,class:"q-expansion-item__toggle-focus q-icon q-focus-helper q-focus-helper--rounded",tabindex:-1}))),(0,e.h)(Do,n,()=>a)}()),a}function M(){let n={ref:"item",style:t.headerStyle,class:t.headerClass,dark:s.value,disable:t.disable,dense:t.dense,insetLevel:t.headerInsetLevel};return v.value&&(n.clickable=!0,n.onClick=S,Object.assign(n,_.value?g.value:x.value)),(0,e.h)(jo,n,L)}function R(){return(0,e.withDirectives)((0,e.h)("div",{key:"e-content",class:"q-expansion-item__content relative-position",style:m.value,id:c.value},Ae(n.default)),[[e.vShow,l.value]])}function z(){let n=[M(),(0,e.h)(es,{duration:t.duration,onShow:P,onHide:E},R)];return t.expandSeparator&&n.push((0,e.h)(as,{class:"q-expansion-item__border q-expansion-item__border--top absolute-top",dark:s.value}),(0,e.h)(as,{class:"q-expansion-item__border q-expansion-item__border--bottom absolute-bottom",dark:s.value})),n}return(0,e.watch)(()=>t.group,e=>{r?.(),void 0!==e&&A()}),void 0!==t.group&&A(),(0,e.onBeforeUnmount)(()=>{r?.()}),()=>(0,e.h)("div",{class:f.value},[(0,e.h)("div",{class:"q-expansion-item__container relative-position"},z())])}});let ls=["top","right","bottom","left"],us={type:{type:String,default:"a"},outline:Boolean,push:Boolean,flat:Boolean,unelevated:Boolean,color:String,textColor:String,glossy:Boolean,square:Boolean,padding:String,label:{type:[String,Number],default:""},labelPosition:{type:String,default:"right",validator:e=>ls.includes(e)},externalLabel:Boolean,hideLabel:{type:Boolean},labelClass:[Array,String,Object],labelStyle:[Array,String,Object],disable:Boolean,tabindex:[Number,String]};function cs(t,n){return{formClass:(0,e.computed)(()=>"q-fab--form-"+(t.square?"square":"rounded")),stacked:(0,e.computed)(()=>!t.externalLabel&&["top","bottom"].includes(t.labelPosition)),labelProps:(0,e.computed)(()=>{if(t.externalLabel){let e=null===t.hideLabel?!n.value:t.hideLabel;return{action:"push",data:{class:[t.labelClass,`q-fab__label q-tooltip--style q-fab__label--external q-fab__label--external-${t.labelPosition}`+(e?" q-fab__label--external-hidden":"")],style:t.labelStyle}}}return{action:["left","top"].includes(t.labelPosition)?"unshift":"push",data:{class:[t.labelClass,`q-fab__label q-fab__label--internal q-fab__label--internal-${t.labelPosition}`+(t.hideLabel?" q-fab__label--internal-hidden":"")],style:t.labelStyle}}})}}let ds=["up","right","down","left"],hs=["left","center","right"];var ps=h({name:"QFab",props:{...us,...tn,icon:String,activeIcon:String,hideIcon:Boolean,hideLabel:{...us.hideLabel,default:null},direction:{type:String,default:"right",validator:e=>ds.includes(e)},persistent:Boolean,verticalActionsAlign:{type:String,default:"center",validator:e=>hs.includes(e)}},emits:nn,setup(t,{slots:n}){let a=(0,e.ref)(null),i=(0,e.ref)(!0===t.modelValue),r=va(),{proxy:{$q:o}}=(0,e.getCurrentInstance)(),{formClass:s,labelProps:l}=cs(t,i),{hide:u,toggle:c}=an({showing:i,hideOnRouteChange:(0,e.computed)(()=>!t.persistent)}),d=(0,e.computed)(()=>({opened:i.value})),h=(0,e.computed)(()=>`q-fab z-fab row inline justify-center q-fab--align-${t.verticalActionsAlign} ${s.value}`+(i.value?" q-fab--opened":" q-fab--closed")),p=(0,e.computed)(()=>`q-fab__actions flex no-wrap inline q-fab__actions--${t.direction} q-fab__actions--${i.value?"opened":"closed"}`),f=(0,e.computed)(()=>{let e={id:r.value,role:"menu"};return i.value||(e["aria-hidden"]="true"),e}),m=(0,e.computed)(()=>"q-fab__icon-holder q-fab__icon-holder--"+(i.value?"opened":"closed"));function _(a,i){let r=n[a],s=`q-fab__${a} absolute-full`;return void 0===r?(0,e.h)(Ke,{class:s,name:t[i]||o.iconSet.fab[i]}):(0,e.h)("div",{class:s},r(d.value))}function g(){let a=[];return t.hideIcon||a.push((0,e.h)("div",{class:m.value},[_("icon","icon"),_("active-icon","activeIcon")])),(""!==t.label||void 0!==n.label)&&a[l.value.action]((0,e.h)("div",l.value.data,void 0===n.label?[t.label]:n.label(d.value))),Me(n.tooltip,a)}return(0,e.provide)(Q,{showing:i,onChildClick(e){u(e),!0!==e?.qAvoidFocus&&a.value?.$el.focus()}}),()=>(0,e.h)("div",{class:h.value},[(0,e.h)(Kt,{ref:a,class:s.value,...t,noWrap:!0,stack:t.stacked,align:void 0,icon:void 0,label:void 0,noCaps:!0,fab:!0,"aria-expanded":i.value?"true":"false","aria-haspopup":"true","aria-controls":r.value,onClick:c},g),(0,e.h)("div",{class:p.value,...f.value},Ae(n.default))])}});let fs={start:"self-end",center:"self-center",end:"self-start"},ms=Object.keys(fs);var _s=h({name:"QFabAction",props:{...us,icon:{type:String,default:""},anchor:{type:String,validator:e=>ms.includes(e)},to:[String,Object],replace:Boolean},emits:["click"],setup(t,{slots:n,emit:a}){let i=(0,e.inject)(Q,()=>({showing:{value:!0},onChildClick:_})),{formClass:r,labelProps:o}=cs(t,i.showing),s=(0,e.computed)(()=>{let e=fs[t.anchor];return r.value+(void 0===e?"":` ${e}`)}),l=(0,e.computed)(()=>t.disable||!i.showing.value);function u(e){i.onChildClick(e),a("click",e)}function c(){let a=[];return void 0===n.icon?""!==t.icon&&a.push((0,e.h)(Ke,{name:t.icon})):a.push(n.icon()),(""!==t.label||void 0!==n.label)&&a[o.value.action]((0,e.h)("div",o.value.data,void 0===n.label?[t.label]:n.label())),Me(n.default,a)}let d=(0,e.getCurrentInstance)();return Object.assign(d.proxy,{click:u}),()=>(0,e.h)(Kt,{class:s.value,...t,noWrap:!0,stack:t.stacked,icon:void 0,label:void 0,noCaps:!0,fabMini:!0,disable:l.value,onClick:u},c)}});function gs({validate:t,resetValidation:n,requiresQForm:a}){let i=(0,e.inject)(Z,!1);if(!1!==i){let{props:a,proxy:r}=(0,e.getCurrentInstance)();Object.assign(r,{validate:t,resetValidation:n}),(0,e.watch)(()=>a.disable,e=>{e?("function"==typeof n&&n(),i.unbindComponent(r)):i.bindComponent(r)}),(0,e.onMounted)(()=>{a.disable||i.bindComponent(r)}),(0,e.onBeforeUnmount)(()=>{a.disable||i.unbindComponent(r)})}else a&&console.error("Parent QForm not found on useFormChild()!")}let vs=[!0,!1,"ondemand"],bs={modelValue:{},error:{type:Boolean,default:null},errorMessage:String,noErrorIcon:Boolean,rules:Array,reactiveRules:Boolean,lazyRules:{type:[Boolean,String],default:!1,validator:e=>vs.includes(e)}};function ys(t,n){let{props:i,proxy:r}=(0,e.getCurrentInstance)(),o=(0,e.ref)(!1),s=(0,e.ref)(null),l=(0,e.ref)(!1);gs({validate:g,resetValidation:_});let u,c=0,d=(0,e.computed)(()=>void 0!==i.rules&&null!==i.rules&&0!==i.rules.length),h=(0,e.computed)(()=>!i.disable&&d.value&&!n.value),p=(0,e.computed)(()=>!0===i.error||o.value),f=(0,e.computed)(()=>"string"==typeof i.errorMessage&&0!==i.errorMessage.length?i.errorMessage:s.value);function m(){"ondemand"!==i.lazyRules&&h.value&&l.value&&v()}function _(){c++,n.value=!1,l.value=!1,o.value=!1,s.value=null,v.cancel()}function g(e=i.modelValue){if(i.disable||!d.value)return!0;let t=++c,a=n.value?()=>{}:()=>{l.value=!0},r=(e,t)=>{e&&a(),o.value=e,s.value=t||null,n.value=!1},u=[];for(let t=0;t{if(void 0===e||!Array.isArray(e)||0===e.length)return t===c&&r(!1),!0;let n=e.find(e=>!1===e||"string"==typeof e);return t===c&&r(void 0!==n,n),void 0===n},e=>(t===c&&(console.error(e),r(!0)),!1)))}(0,e.watch)(()=>i.modelValue,()=>{l.value=!0,h.value&&!1===i.lazyRules&&v()}),(0,e.watch)(()=>i.reactiveRules,t=>{t?void 0===u&&(u=(0,e.watch)(()=>i.rules,m,{immediate:!0,deep:!0})):void 0!==u&&(u(),u=void 0)},{immediate:!0}),(0,e.watch)(()=>i.lazyRules,m),(0,e.watch)(t,e=>{e?l.value=!0:h.value&&"ondemand"!==i.lazyRules&&v()});let v=T(g,0);return(0,e.onBeforeUnmount)(()=>{u?.(),v.cancel()}),Object.assign(r,{resetValidation:_,validate:g}),a(r,"hasError",()=>p.value),{isDirtyModel:l,hasRules:d,hasError:p,errorMessage:f,validate:g,resetValidation:_}}function ws(e){return null!=e&&0!==String(e).length}let ks={...Je,...bs,label:String,stackLabel:Boolean,hint:String,hideHint:Boolean,prefix:String,suffix:String,labelColor:String,color:String,bgColor:String,filled:Boolean,outlined:Boolean,borderless:Boolean,standout:[Boolean,String],square:Boolean,loading:Boolean,labelSlot:Boolean,bottomSlots:Boolean,hideBottomSpace:Boolean,rounded:Boolean,dense:Boolean,itemAligned:Boolean,counter:Boolean,clearable:Boolean,clearIcon:String,disable:Boolean,readonly:Boolean,autofocus:Boolean,for:String},xs={...ks,maxlength:[Number,String]},Ss=["update:modelValue","clear","focus","blur"];function Cs({requiredForAttr:t=!0,tagProp:n,changeEvent:a=!1}={}){let{props:i,proxy:r}=(0,e.getCurrentInstance)(),o=Xe(i,r.$q),s=va({required:t,getValue:()=>i.for});return{requiredForAttr:t,changeEvent:a,tag:n?(0,e.computed)(()=>i.tag):{value:"label"},isDark:o,editable:(0,e.computed)(()=>!i.disable&&!i.readonly),innerLoading:(0,e.ref)(!1),focused:(0,e.ref)(!1),hasPopupOpen:!1,splitAttrs:Wo(),targetUid:s,rootRef:(0,e.ref)(null),targetRef:(0,e.ref)(null),controlRef:(0,e.ref)(null)}}function Ts(t,n){return null===n?null:(0,e.h)("div",{key:t,class:"q-field__append q-field__marginal row no-wrap items-center q-anchor--skip"},n)}function Ps(t){let{props:n,emit:a,slots:i,attrs:r,proxy:o}=(0,e.getCurrentInstance)(),{$q:s}=o,l=null;void 0===t.hasValue&&(t.hasValue=(0,e.computed)(()=>ws(n.modelValue))),void 0===t.emitValue&&(t.emitValue=e=>{a("update:modelValue",e)}),void 0===t.controlEvents&&(t.controlEvents={onFocusin:P,onFocusout:E}),Object.assign(t,{clearValue:A,onControlFocusin:P,onControlFocusout:E,focus:T}),void 0===t.computedCounter&&(t.computedCounter=(0,e.computed)(()=>{if(n.counter){let e="string"==typeof n.modelValue||"number"==typeof n.modelValue?String(n.modelValue).length:Array.isArray(n.modelValue)?n.modelValue.length:0,t=void 0===n.maxlength?n.maxValues:n.maxlength;return e+(void 0===t?"":" / "+t)}}));let{isDirtyModel:u,hasRules:c,hasError:d,errorMessage:h,resetValidation:p}=ys(t.focused,t.innerLoading),f=void 0===t.floatingLabel?(0,e.computed)(()=>n.stackLabel||t.focused.value||t.hasValue.value):(0,e.computed)(()=>n.stackLabel||t.focused.value||t.floatingLabel.value),m=(0,e.computed)(()=>n.bottomSlots||void 0!==n.hint||c.value||n.counter||null!==n.error),_=(0,e.computed)(()=>n.filled?"filled":n.outlined?"outlined":n.borderless?"borderless":n.standout?"standout":"standard"),g=(0,e.computed)(()=>`q-field row no-wrap items-start q-field--${_.value}`+(void 0===t.fieldClass?"":` ${t.fieldClass.value}`)+(n.rounded?" q-field--rounded":"")+(n.square?" q-field--square":"")+(f.value?" q-field--float":"")+(b.value?" q-field--labeled":"")+(n.dense?" q-field--dense":"")+(n.itemAligned?" q-field--item-aligned q-item-type":"")+(t.isDark.value?" q-field--dark":"")+(void 0===t.getControl?" q-field--auto-height":"")+(t.focused.value?" q-field--focused":"")+(d.value?" q-field--error":"")+(d.value||t.focused.value?" q-field--highlighted":"")+(!n.hideBottomSpace&&m.value?" q-field--with-bottom":"")+(n.disable?" q-field--disabled":n.readonly?" q-field--readonly":"")),v=(0,e.computed)(()=>"q-field__control relative-position row no-wrap"+(void 0===n.bgColor?"":` bg-${n.bgColor}`)+(d.value?" text-negative":"string"==typeof n.standout&&0!==n.standout.length&&t.focused.value?` ${n.standout}`:void 0===n.color?"":` text-${n.color}`)),b=(0,e.computed)(()=>n.labelSlot||void 0!==n.label),k=(0,e.computed)(()=>"q-field__label no-pointer-events absolute ellipsis"+(void 0===n.labelColor||d.value?"":` text-${n.labelColor}`)),x=(0,e.computed)(()=>({id:t.targetUid.value,editable:t.editable.value,focused:t.focused.value,floatingLabel:f.value,modelValue:n.modelValue,emitValue:t.emitValue})),S=(0,e.computed)(()=>{let e={};return t.targetUid.value&&(e.for=t.targetUid.value),n.disable&&(e["aria-disabled"]="true"),e});function C(){let e=document.activeElement,n=t.targetRef?.value;n&&(null===e||e.id!==t.targetUid.value)&&(n.hasAttribute("tabindex")||(n=n.querySelector("[tabindex]")),n!==e&&n?.focus({preventScroll:!0}))}function T(){dn(C)}function P(e){null!==l&&(clearTimeout(l),l=null),t.editable.value&&!t.focused.value&&(t.focused.value=!0,a("focus",e))}function E(e,n){null!==l&&clearTimeout(l),l=setTimeout(()=>{l=null,(!document.hasFocus()||!t.hasPopupOpen&&void 0!==t.controlRef&&null!==t.controlRef.value&&!t.controlRef.value.contains(document.activeElement))&&(t.focused.value&&(t.focused.value=!1,a("blur",e)),n?.())},0)}function A(i){w(i),s.platform.is.mobile?t.rootRef.value.contains(document.activeElement)&&document.activeElement.blur():(t.targetRef?.value||t.rootRef.value).focus(),"file"===n.type&&(t.inputRef.value.value=null),t.onClear?.(),a("update:modelValue",null),t.changeEvent&&a("change",null),a("clear",n.modelValue),(0,e.nextTick)(()=>{let e=u.value;p(),u.value=e})}function L(e){[13,32].includes(e.keyCode)&&A(e)}function M(){let a=[];return void 0!==i.prepend&&a.push((0,e.h)("div",{class:"q-field__prepend q-field__marginal row no-wrap items-center",key:"prepend",onClick:y},i.prepend())),a.push((0,e.h)("div",{class:"q-field__control-container col relative-position row no-wrap q-anchor--skip"},function(){let a=[];return void 0!==n.prefix&&null!==n.prefix&&a.push((0,e.h)("div",{class:"q-field__prefix no-pointer-events row items-center"},n.prefix)),void 0!==t.getShadowControl&&t.hasShadow.value&&a.push(t.getShadowControl()),b.value&&a.push((0,e.h)("div",{class:k.value},Ae(i.label,n.label))),void 0===t.getControl?void 0===i.rawControl?void 0!==i.control&&a.push((0,e.h)("div",{ref:t.targetRef,class:"q-field__native row",tabindex:-1,...t.splitAttrs.attributes.value,"data-autofocus":n.autofocus||void 0},i.control(x.value))):a.push(i.rawControl()):a.push(t.getControl()),void 0!==n.suffix&&null!==n.suffix&&a.push((0,e.h)("div",{class:"q-field__suffix no-pointer-events row items-center"},n.suffix)),a.concat(Ae(i.default))}())),d.value&&!n.noErrorIcon&&a.push(Ts("error",[(0,e.h)(Ke,{name:s.iconSet.field.error,color:"negative"})])),n.loading||t.innerLoading.value?a.push(Ts("inner-loading-append",void 0===i.loading?[(0,e.h)(xt,{color:n.color})]:i.loading())):n.clearable&&t.hasValue.value&&t.editable.value&&a.push(Ts("inner-clearable-append",[(0,e.h)(Ke,{class:"q-field__focusable-action",name:n.clearIcon||s.iconSet.field.clear,tabindex:0,role:"button","aria-hidden":"false","aria-label":s.lang.label.clear,onKeyup:L,onClick:A})])),void 0!==i.append&&a.push((0,e.h)("div",{class:"q-field__append q-field__marginal row no-wrap items-center",key:"append",onClick:y},i.append())),void 0!==t.getInnerAppend&&a.push(Ts("inner-append",t.getInnerAppend())),void 0!==t.getControlChild&&a.push(t.getControlChild()),a}function R(){let a,r;d.value?null===h.value?(a=Ae(i.error),r="q--slot-error"):(a=[(0,e.h)("div",{role:"alert"},h.value)],r=`q--slot-error-${h.value}`):(!n.hideHint||t.focused.value)&&(void 0===n.hint?(a=Ae(i.hint),r="q--slot-hint"):(a=[(0,e.h)("div",n.hint)],r=`q--slot-hint-${n.hint}`));let o=n.counter||void 0!==i.counter;if(n.hideBottomSpace&&!o&&void 0===a)return;let s=(0,e.h)("div",{key:r,class:"q-field__messages col"},a);return(0,e.h)("div",{class:"q-field__bottom row items-start q-field__bottom--"+(n.hideBottomSpace?"stale":"animated"),onClick:y},[n.hideBottomSpace?s:(0,e.h)(e.Transition,{name:"q-transition--field-message"},()=>s),o?(0,e.h)("div",{class:"q-field__counter"},void 0===i.counter?t.computedCounter.value:i.counter()):null])}let z=!1;return(0,e.onDeactivated)(()=>{z=!0}),(0,e.onActivated)(()=>{z&&n.autofocus&&o.focus()}),n.autofocus&&(0,e.onMounted)(()=>{o.focus()}),(0,e.onBeforeUnmount)(()=>{null!==l&&clearTimeout(l)}),Object.assign(o,{focus:T,blur:function(){!function(e){sn=sn.filter(t=>t!==e)}(C);let e=document.activeElement;null!==e&&t.rootRef.value.contains(e)&&e.blur()}}),function(){let a=void 0===t.getControl&&void 0===i.control?{...t.splitAttrs.attributes.value,"data-autofocus":n.autofocus||void 0,...S.value}:S.value;return(0,e.h)(t.tag.value,{ref:t.rootRef,class:[g.value,r.class],style:r.style,...a},[void 0===i.before?null:(0,e.h)("div",{class:"q-field__before q-field__marginal row no-wrap items-center",onClick:y},i.before()),(0,e.h)("div",{class:"q-field__inner relative-position col self-stretch"},[(0,e.h)("div",{ref:t.controlRef,class:v.value,tabindex:-1,...t.controlEvents},M()),m.value?R():null]),void 0===i.after?null:(0,e.h)("div",{class:"q-field__after q-field__marginal row no-wrap items-center",onClick:y},i.after())])}}var Es=h({name:"QField",inheritAttrs:!1,props:{...xs,tag:{type:String,default:"label"}},emits:Ss,setup:()=>Ps(Cs({tagProp:!0}))});function As(e,t,n,a){let i=[];return e.forEach(e=>{a(e)?i.push(e):t.push({failedPropValidation:n,file:e})}),i}function Ls(e){e?.dataTransfer&&(e.dataTransfer.dropEffect="copy"),w(e)}let Ms={multiple:Boolean,accept:String,capture:String,maxFileSize:[Number,String],maxTotalSize:[Number,String],maxFiles:[Number,String],filter:Function},Rs=["rejected"];function zs({editable:t,dnd:n,getFileInput:a,addFilesToQueue:i}){let{props:r,emit:o,proxy:s}=(0,e.getCurrentInstance)(),l=(0,e.ref)(null),u=(0,e.computed)(()=>void 0===r.accept?null:r.accept.split(",").map(e=>"*"===(e=e.trim())?"*/":(e.endsWith("/*")&&(e=e.slice(0,-1)),e.toUpperCase()))),d=(0,e.computed)(()=>Number.parseInt(r.maxFiles,10)),h=(0,e.computed)(()=>Number.parseInt(r.maxTotalSize,10));function p(e){if(t.value)if(e!==Object(e)&&(e={target:null}),!0===e.target?.matches('input[type="file"]'))0===e.clientX&&0===e.clientY&&b(e);else{let t=a();t!==e.target&&t?.click(e)}}function f(e){t.value&&e&&i(null,e)}function m(e){w(e),(null===e.relatedTarget&&c.is.safari?!document.elementsFromPoint(e.clientX,e.clientY).includes(l.value):e.relatedTarget!==l.value)&&(n.value=!1)}function _(e){Ls(e);let t=e.dataTransfer.files;0!==t.length&&i(null,t),n.value=!1}return Object.assign(s,{pickFiles:p,addFiles:f}),{pickFiles:p,addFiles:f,onDragover:function(e){Ls(e),n.value||=!0},onDragleave:m,processFiles:function(e,t,n,a){let i=[...t||e.target.files],s=[],l=()=>{0!==s.length&&o("rejected",s)};if(void 0!==r.accept&&!u.value.includes("*/")&&(i=As(i,s,"accept",e=>u.value.some(t=>(t.endsWith("/")?e.type.toUpperCase().startsWith(t):e.type.toUpperCase()===t)||e.name.toUpperCase().endsWith(t))),0===i.length))return l();if(void 0!==r.maxFileSize){let e=Number.parseInt(r.maxFileSize,10);if(i=As(i,s,"max-file-size",t=>t.size<=e),0===i.length)return l()}if(!r.multiple&&0!==i.length&&(i=[i[0]]),i.forEach(e=>{e.__key=JSON.stringify([e.webkitRelativePath,e.lastModified,e.name,e.size])}),a){let e=new Set(n.map(e=>e.__key));i=As(i,s,"duplicate",t=>!e.has(t.__key)&&(e.add(t.__key),!0))}if(0===i.length)return l();if(void 0!==r.maxTotalSize){let e=a?n.reduce((e,t)=>e+t.size,0):0;if(i=As(i,s,"max-total-size",t=>{let n=e+t.size;return!(n>h.value)&&(e=n,!0)}),0===i.length)return l()}if("function"==typeof r.filter){let e=r.filter(i);i=As(i,s,"filter",t=>e.includes(t))}if(void 0!==r.maxFiles){let e=a?n.length:0;if(i=As(i,s,"max-files",()=>(e++,e<=d.value)),0===i.length)return l()}return l(),0!==i.length?i:void 0},getDndNode:function(t){if(n.value)return(0,e.h)("div",{ref:l,class:`q-${t}__dnd absolute-full`,onDragenter:Ls,onDragover:Ls,onDragleave:m,onDrop:_})},maxFilesNumber:d,maxTotalSizeNumber:h}}function Is(t,n){function a(){let e=t.modelValue;try{let t="DataTransfer"in window?new DataTransfer:"ClipboardEvent"in window?new ClipboardEvent("").clipboardData:void 0;return Object(e)===e&&("length"in e?[...e]:[e]).forEach(e=>{t.items.add(e)}),{files:t.files}}catch{return{files:void 0}}}return n?(0,e.computed)(()=>{if("file"===t.type)return a()}):(0,e.computed)(a)}function Ns(e){13===e.keyCode&&y(e)}var Os=h({name:"QFile",inheritAttrs:!1,props:{...ks,...wa,...Ms,modelValue:[File,FileList,Array],append:Boolean,useChips:Boolean,displayValue:[String,Number],tabindex:{type:[String,Number],default:0},counterLabel:Function,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...Ss,...Rs],setup(t,{slots:n,emit:i,attrs:r}){let{proxy:o}=(0,e.getCurrentInstance)(),s=Cs(),l=(0,e.ref)(null),u=(0,e.ref)(!1),c=Sa(t),{pickFiles:d,onDragover:h,onDragleave:p,processFiles:f,getDndNode:m}=zs({editable:s.editable,dnd:u,getFileInput:E,addFilesToQueue:A}),_=Is(t),g=(0,e.computed)(()=>Object(t.modelValue)===t.modelValue?"length"in t.modelValue?[...t.modelValue]:[t.modelValue]:[]),v=(0,e.computed)(()=>ws(g.value)),b=(0,e.computed)(()=>g.value.map(e=>e.name).join(", ")),y=(0,e.computed)(()=>fe(g.value.reduce((e,t)=>e+t.size,0))),w=(0,e.computed)(()=>({totalSize:y.value,filesNumber:g.value.length,maxFiles:t.maxFiles})),k=(0,e.computed)(()=>({tabindex:-1,type:"file",title:"",accept:t.accept,capture:t.capture,name:c.value,...r,id:s.targetUid.value,disabled:!s.editable.value})),x=(0,e.computed)(()=>"q-file q-field--auto-height"+(u.value?" q-file--dnd":"")),S=(0,e.computed)(()=>t.multiple&&t.append);function C(e){let t=[...g.value];t.splice(e,1),T(t)}function T(e){i("update:modelValue",t.multiple?e:e[0])}function P(e){(13===e.keyCode||32===e.keyCode)&&d(e)}function E(){return l.value}function A(e,n){let a=f(e,n,g.value,S.value),i=E();null!=i&&(i.value=""),void 0!==a&&((t.multiple?t.modelValue&&a.every(e=>g.value.includes(e)):t.modelValue===a[0])||T(S.value?[...g.value,...a]:a))}function L(){return[(0,e.h)("input",{class:[t.inputClass,"q-file__filler"],style:t.inputStyle})]}function M(){if(void 0!==n.file)return 0===g.value.length?L():g.value.map((e,t)=>n.file({index:t,file:e,ref:this}));if(void 0!==n.selected)return 0===g.value.length?L():n.selected({files:g.value,ref:this});if(t.useChips)return 0===g.value.length?L():g.value.map((n,a)=>(0,e.h)(ui,{key:"file-"+a,removable:s.editable.value,dense:!0,textColor:t.color,tabindex:t.tabindex,onRemove:()=>{C(a)}},()=>(0,e.h)("span",{class:"ellipsis",textContent:n.name})));let a=void 0===t.displayValue?b.value:t.displayValue;return 0===a.length?L():[(0,e.h)("div",{class:t.inputClass,style:t.inputStyle,textContent:a})]}function R(){let n={ref:l,...k.value,..._.value,class:"q-field__input fit absolute-full cursor-pointer",onChange:A};return t.multiple&&(n.multiple=!0),(0,e.h)("input",n)}return Object.assign(s,{fieldClass:x,emitValue:T,hasValue:v,inputRef:l,innerValue:g,floatingLabel:(0,e.computed)(()=>v.value||ws(t.displayValue)),computedCounter:(0,e.computed)(()=>{if(void 0!==t.counterLabel)return t.counterLabel(w.value);let e=t.maxFiles;return`${g.value.length}${void 0===e?"":" / "+e} (${y.value})`}),getControlChild:()=>m("file"),getControl:()=>{let n={ref:s.targetRef,class:"q-field__native row items-center cursor-pointer",tabindex:t.tabindex};return s.editable.value&&Object.assign(n,{onDragover:h,onDragleave:p,onKeydown:Ns,onKeyup:P}),(0,e.h)("div",n,[R()].concat(M()))}}),Object.assign(o,{removeAtIndex:C,removeFile:function(e){let t=g.value.indexOf(e);-1!==t&&C(t)},getNativeElement:()=>l.value}),a(o,"nativeEl",()=>l.value),Ps(s)}});function js(e,t){e.value!==t&&(e.value=t)}var Ds=h({name:"QFooter",props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:["reveal","focusin"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),r=(0,e.inject)(Y,ee);if(r===ee)return console.error("QFooter needs to be child of QLayout"),ee;let s=(0,e.ref)(Number.parseInt(t.heightHint,10)),l=(0,e.ref)(!0),u=(0,e.ref)(o.value||r.isContainer.value?0:window.innerHeight),c=(0,e.computed)(()=>t.reveal||r.view.value.includes("F")||i.platform.is.ios&&r.isContainer.value),d=(0,e.computed)(()=>r.isContainer.value?r.containerHeight.value:u.value),h=(0,e.computed)(()=>{if(!t.modelValue)return 0;if(c.value)return l.value?s.value:0;let e=r.scroll.value.position+d.value+s.value-r.height.value;return Math.max(e,0)}),p=(0,e.computed)(()=>!t.modelValue||c.value&&!l.value),f=(0,e.computed)(()=>t.modelValue&&p.value&&t.reveal),m=(0,e.computed)(()=>"q-footer q-layout__section--marginal "+(c.value?"fixed":"absolute")+"-bottom"+(t.bordered?" q-footer--bordered":"")+(p.value?" q-footer--hidden":"")+(t.modelValue?"":" q-layout--prevent-focus"+(c.value?"":" hidden"))),_=(0,e.computed)(()=>{let e=r.rows.value.bottom,t={};return"l"===e[0]&&r.left.space&&(t[i.lang.rtl?"right":"left"]=`${r.left.size}px`),"r"===e[2]&&r.right.space&&(t[i.lang.rtl?"left":"right"]=`${r.right.size}px`),t});function g(e,t){r.update("footer",e,t)}function v({height:e}){js(s,e),g("size",e)}function b(e){f.value&&js(l,!0),a("focusin",e)}(0,e.watch)(()=>t.modelValue,e=>{g("space",e),js(l,!0),r.animate()}),(0,e.watch)(h,e=>{g("offset",e)}),(0,e.watch)(()=>t.reveal,e=>{e||js(l,t.modelValue)}),(0,e.watch)(l,e=>{r.animate(),a("reveal",e)}),(0,e.watch)([s,r.scroll,r.height],function(){if(!t.reveal)return;let{direction:e,position:n,inflectionPoint:a}=r.scroll.value;js(l,"up"===e||n-a<100||r.height.value-d.value-n-s.value<300)}),(0,e.watch)(()=>i.screen.height,e=>{r.isContainer.value||js(u,e)});let y={};return r.instances.footer=y,t.modelValue&&g("size",s.value),g("space",t.modelValue),g("offset",h.value),(0,e.onBeforeUnmount)(()=>{r.instances.footer===y&&(r.instances.footer=void 0,g("size",0),g("offset",0),g("space",!1))}),()=>{let a=Me(n.default,[(0,e.h)(Ai,{debounce:0,onResize:v})]);return t.elevated&&a.push((0,e.h)("div",{class:"q-layout__shadow absolute-full overflow-hidden no-pointer-events"})),(0,e.h)("footer",{class:m.value,style:_.value,onFocusin:b},a)}}});function qs(e){let t=e.validate();return"function"==typeof t.then?t.then(t=>({valid:t,comp:e}),t=>({valid:!1,comp:e,err:t})):Promise.resolve({valid:t,comp:e})}var Bs=h({name:"QForm",props:{autofocus:Boolean,noErrorFocus:Boolean,noResetFocus:Boolean,greedy:Boolean,onSubmit:Function},emits:["reset","validationSuccess","validationError"],setup(t,{slots:n,emit:a}){let i=(0,e.getCurrentInstance)(),r=(0,e.ref)(null),o=0,s=[];function l(e){let n="boolean"==typeof e?e:!t.noErrorFocus,i=++o,r=(e,t)=>{a("validation"+(e?"Success":"Error"),t)};return(t.greedy?Promise.all(s.map(qs)).then(e=>e.filter(e=>!e.valid)):s.reduce((e,t)=>e.then(()=>qs(t)).then(e=>{if(!e.valid)throw e}),Promise.resolve()).catch(e=>[e])).then(e=>{if(void 0===e||0===e.length)return i===o&&r(!0),!0;if(i===o){let{comp:t,err:a}=e[0];if(void 0!==a&&console.error(a),r(!1,t),n){let t=e.find(({comp:e})=>"function"==typeof e.focus&&!ct(e.$));void 0!==t&&t.comp.focus()}}return!1})}function u(){o++,s.forEach(e=>{"function"==typeof e.resetValidation&&e.resetValidation()})}function c(e){void 0!==e&&w(e);let n=o+1;l().then(i=>{n===o&&i&&(void 0===t.onSubmit?void 0!==e?.target&&"function"==typeof e.target.submit&&e.target.submit():a("submit",e))})}function d(n){void 0!==n&&w(n),a("reset"),(0,e.nextTick)(()=>{u(),t.autofocus&&!t.noResetFocus&&h()})}function h(){dn(()=>{null!==r.value&&(r.value.querySelector("[autofocus][tabindex], [data-autofocus][tabindex]")||r.value.querySelector("[autofocus] [tabindex], [data-autofocus] [tabindex]")||r.value.querySelector("[autofocus], [data-autofocus]")||Array.prototype.find.call(r.value.querySelectorAll("[tabindex]"),e=>-1!==e.tabIndex))?.focus({preventScroll:!0})})}(0,e.provide)(Z,{bindComponent(e){s.push(e)},unbindComponent(e){let t=s.indexOf(e);-1!==t&&s.splice(t,1)}});let p=!1;return(0,e.onDeactivated)(()=>{p=!0}),(0,e.onActivated)(()=>{p&&t.autofocus&&h()}),(0,e.onMounted)(()=>{t.autofocus&&h()}),Object.assign(i.proxy,{validate:l,resetValidation:u,submit:c,reset:d,focus:h,getValidationComponents:()=>s}),()=>(0,e.h)("form",{class:"q-form",ref:r,onSubmit:c,onReset:d},Ae(n.default))}}),Fs={inject:{[Z]:{default:_}},watch:{disable(e){let t=this.$.provides[Z];void 0!==t&&(e?(this.resetValidation(),t.unbindComponent(this)):t.bindComponent(this))}},methods:{validate(){},resetValidation(){}},mounted(){this.disable||this.$.provides[Z]?.bindComponent(this)},beforeUnmount(){this.disable||this.$.provides[Z]?.unbindComponent(this)}};function Vs(e,t){e.value!==t&&(e.value=t)}var Us=h({name:"QHeader",props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,revealOffset:{type:Number,default:250},bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:["reveal","focusin"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),r=(0,e.inject)(Y,ee);if(r===ee)return console.error("QHeader needs to be child of QLayout"),ee;let o=(0,e.ref)(Number.parseInt(t.heightHint,10)),s=(0,e.ref)(!0),l=(0,e.computed)(()=>t.reveal||r.view.value.includes("H")||i.platform.is.ios&&r.isContainer.value),u=(0,e.computed)(()=>{if(!t.modelValue)return 0;if(l.value)return s.value?o.value:0;let e=o.value-r.scroll.value.position;return Math.max(e,0)}),c=(0,e.computed)(()=>!t.modelValue||l.value&&!s.value),d=(0,e.computed)(()=>t.modelValue&&c.value&&t.reveal),h=(0,e.computed)(()=>"q-header q-layout__section--marginal "+(l.value?"fixed":"absolute")+"-top"+(t.bordered?" q-header--bordered":"")+(c.value?" q-header--hidden":"")+(t.modelValue?"":" q-layout--prevent-focus")),p=(0,e.computed)(()=>{let e=r.rows.value.top,t={};return"l"===e[0]&&r.left.space&&(t[i.lang.rtl?"right":"left"]=`${r.left.size}px`),"r"===e[2]&&r.right.space&&(t[i.lang.rtl?"left":"right"]=`${r.right.size}px`),t});function f(e,t){r.update("header",e,t)}function m({height:e}){Vs(o,e),f("size",e)}function _(e){d.value&&Vs(s,!0),a("focusin",e)}(0,e.watch)(()=>t.modelValue,e=>{f("space",e),Vs(s,!0),r.animate()}),(0,e.watch)(u,e=>{f("offset",e)}),(0,e.watch)(()=>t.reveal,e=>{e||Vs(s,t.modelValue)}),(0,e.watch)(s,e=>{r.animate(),a("reveal",e)}),(0,e.watch)(r.scroll,e=>{t.reveal&&Vs(s,"up"===e.direction||e.position<=t.revealOffset||e.position-e.inflectionPoint<100)});let g={};return r.instances.header=g,t.modelValue&&f("size",o.value),f("space",t.modelValue),f("offset",u.value),(0,e.onBeforeUnmount)(()=>{r.instances.header===g&&(r.instances.header=void 0,f("size",0),f("offset",0),f("space",!1))}),()=>{let a=Le(n.default,[]);return t.elevated&&a.push((0,e.h)("div",{class:"q-layout__shadow absolute-full overflow-hidden no-pointer-events"})),a.push((0,e.h)(Ai,{debounce:0,onResize:m})),(0,e.h)("header",{class:h.value,style:p.value,onFocusin:_},a)}}});let $s={ratio:[String,Number]};function Hs(t,n){return(0,e.computed)(()=>{let e=t.ratio||n?.value;if("string"==typeof e&&""===e.trim())return null;let a=Number(e);return Number.isFinite(a)&&a>0?{paddingBottom:100/a+"%"}:null})}var Ws=h({name:"QImg",props:{...$s,src:String,srcset:String,sizes:String,alt:String,crossorigin:String,decoding:String,referrerpolicy:String,draggable:Boolean,loading:{type:String,default:"lazy"},loadingShowDelay:{type:[Number,String],default:0},fetchpriority:{type:String,default:"auto"},width:String,height:String,initialRatio:{type:[Number,String],default:1.7778},placeholderSrc:String,errorSrc:String,fit:{type:String,default:"cover"},position:{type:String,default:"50% 50%"},imgClass:String,imgStyle:Object,noSpinner:Boolean,noNativeMenu:Boolean,noTransition:Boolean,spinnerColor:String,spinnerSize:String},emits:["load","error"],setup(t,{slots:n,emit:a}){let i=(0,e.ref)(t.initialRatio),r=Hs(t,i),s=(0,e.getCurrentInstance)(),{registerTimeout:l,removeTimeout:u}=xn(),{registerTimeout:c,removeTimeout:d}=xn(),h=(0,e.computed)(()=>void 0===t.placeholderSrc?null:{src:t.placeholderSrc}),p=(0,e.computed)(()=>void 0===t.errorSrc?null:{src:t.errorSrc,__qerror:!0}),f=[(0,e.ref)(null),(0,e.ref)(h.value)],m=(0,e.ref)(0),_=(0,e.ref)(!1),g=(0,e.ref)(!1),v=(0,e.computed)(()=>`q-img q-img--${t.noNativeMenu?"no-":""}menu`),b=(0,e.computed)(()=>({width:t.width,height:t.height})),y=(0,e.computed)(()=>`q-img__image ${void 0===t.imgClass?"":t.imgClass+" "}q-img__image--with${t.noTransition?"out":""}-transition q-img__image--`),w=(0,e.computed)(()=>({...t.imgStyle,objectFit:t.fit,objectPosition:t.position}));function k(){d(),_.value=!1}function x({target:e}){ct(s)||(u(),i.value=0===e.naturalHeight?.5:e.naturalWidth/e.naturalHeight,S(e,1))}function S(e,t){1e3===t||ct(s)||(e.complete?function(e){ct(s)||(m.value^=1,f[m.value].value=null,k(),"true"!==e.getAttribute("__qerror")&&(g.value=!1),a("load",e.currentSrc||e.src))}(e):l(()=>{S(e,t+1)},50))}function C(e){u(),k(),g.value=!0,f[m.value].value=p.value,f[1^m.value].value=h.value,a("error",e)}function T(n){let a=f[n].value,i={key:"img_"+n,class:y.value,style:w.value,alt:t.alt,crossorigin:t.crossorigin,decoding:t.decoding,referrerpolicy:t.referrerpolicy,height:t.height,width:t.width,loading:t.loading,fetchpriority:t.fetchpriority,"aria-hidden":"true",draggable:t.draggable,...a};return m.value===n?Object.assign(i,{class:i.class+"current",onLoad:x,onError:C}):i.class+="loaded",(0,e.h)("div",{class:"q-img__container absolute-full",key:"img"+n},(0,e.h)("img",i))}function P(){return _.value?(0,e.h)("div",{key:"loading",class:"q-img__loading absolute-full flex flex-center"},void 0===n.loading?t.noSpinner?void 0:[(0,e.h)(xt,{color:t.spinnerColor,size:t.spinnerSize})]:n.loading()):(0,e.h)("div",{key:"content",class:"q-img__content absolute-full q-anchor--skip"},Ae(n[g.value?"error":"default"]))}{let n=()=>{(0,e.watch)(()=>t.src||t.srcset||t.sizes?{src:t.src,srcset:t.srcset,sizes:t.sizes}:null,e=>{u(),g.value=!1,null===e?(k(),f[1^m.value].value=h.value):(d(),0!==t.loadingShowDelay?c(()=>{_.value=!0},t.loadingShowDelay):_.value=!0),f[m.value].value=e},{immediate:!0})};o.value?(0,e.onMounted)(n):n()}return()=>{let n=[];return null!==r.value&&n.push((0,e.h)("div",{key:"filler",style:r.value})),null!==f[0].value&&n.push(T(0)),null!==f[1].value&&n.push(T(1)),n.push((0,e.h)(e.Transition,{name:"q-transition--fade"},P)),(0,e.h)("div",{key:"main",class:v.value,style:b.value,role:"img","aria-label":t.alt},n)}}});let{passive:Gs}=m;var Ks=h({name:"QInfiniteScroll",props:{offset:{type:Number,default:500},debounce:{type:[String,Number],default:100},scrollTarget:Cn,initialIndex:{type:Number,default:0},disable:Boolean,reverse:Boolean},emits:["load"],setup(t,{slots:n,emit:a}){let i,r,o=(0,e.ref)(!1),s=(0,e.ref)(!0),l=(0,e.ref)(null),u=(0,e.ref)(null),c=t.initialIndex,d=(0,e.computed)(()=>"q-infinite-scroll__loading"+(o.value?"":" invisible"));function h(){if(t.disable||o.value||!s.value)return;let e=En(i),n=An(i),a=Ct(i);t.reverse?Math.round(n)<=t.offset&&p():Math.round(n+a+t.offset)>=Math.round(e)&&p()}function p(){if(t.disable||o.value||!s.value)return;c++,o.value=!0;let n=En(i);a("load",c,a=>{s.value&&(o.value=!1,(0,e.nextTick)(()=>{if(t.reverse){let e=En(i),t=An(i);Nn(i,t+(e-n))}!0===a?m():l.value?.closest("body")&&r()}))})}function f(){s.value||(s.value=!0,i.addEventListener("scroll",r,Gs)),h()}function m(){s.value&&(s.value=!1,o.value=!1,i.removeEventListener("scroll",r,Gs),r?.cancel?.())}function _(){if(i&&s.value&&i.removeEventListener("scroll",r,Gs),i=Pn(l.value,t.scrollTarget),s.value){if(i.addEventListener("scroll",r,Gs),t.reverse){let e=En(i),t=Ct(i);Nn(i,e-t)}h()}}function g(e){e=Number.parseInt(e,10);let t=r;r=e<=0?h:T(h,Number.isNaN(e)?100:e),i&&s.value&&(void 0!==t&&i.removeEventListener("scroll",t,Gs),i.addEventListener("scroll",r,Gs))}function v(t){if(b.value){if(null===u.value)return void(t||(0,e.nextTick)(()=>{v(!0)}));let n=(o.value?"un":"")+"pauseAnimations";[...u.value.getElementsByTagName("svg")].forEach(e=>{e[n]()})}}let b=(0,e.computed)(()=>!t.disable&&s.value);(0,e.watch)([o,b],()=>{v()}),(0,e.watch)(()=>t.disable,e=>{e?m():f()}),(0,e.watch)(()=>t.reverse,()=>{!o.value&&s.value&&h()}),(0,e.watch)(()=>t.scrollTarget,_),(0,e.watch)(()=>t.debounce,g);let y=!1;(0,e.onActivated)(()=>{!1!==y&&i&&Nn(i,y)}),(0,e.onDeactivated)(()=>{y=!!i&&An(i)}),(0,e.onBeforeUnmount)(()=>{s.value&&i.removeEventListener("scroll",r,Gs)}),(0,e.onMounted)(()=>{g(t.debounce),_(),o.value||v()});let w=(0,e.getCurrentInstance)();return Object.assign(w.proxy,{poll:()=>{r?.()},trigger:p,stop:m,reset:function(){c=0},resume:f,setIndex:function(e){c=e},updateScrollTarget:_}),()=>{let a=Le(n.default,[]);return b.value&&a[t.reverse?"unshift":"push"]((0,e.h)("div",{ref:u,class:d.value},Ae(n.loading))),(0,e.h)("div",{class:"q-infinite-scroll",ref:l},a)}}}),Ys=h({name:"QInnerLoading",props:{...Je,...yn,showing:Boolean,color:String,size:{type:[String,Number],default:"42px"},label:String,labelClass:String,labelStyle:[String,Array,Object]},setup(t,{slots:n}){let a=Xe(t,(0,e.getCurrentInstance)().proxy.$q),{transitionProps:i,transitionStyle:r}=wn(t),o=(0,e.computed)(()=>"q-inner-loading q--avoid-card-border absolute-full column flex-center"+(a.value?" q-inner-loading--dark":"")),s=(0,e.computed)(()=>"q-inner-loading__label"+(void 0===t.labelClass?"":` ${t.labelClass}`));function l(){return t.showing?(0,e.h)("div",{class:o.value,style:r.value},void 0===n.default?function(){let n=[(0,e.h)(xt,{size:t.size,color:t.color})];return void 0!==t.label&&n.push((0,e.h)("div",{class:s.value,style:t.labelStyle},[t.label])),n}():n.default()):null}return()=>(0,e.h)(e.Transition,i.value,l)}});let Qs={date:"####/##/##",datetime:"####/##/## ##:##",time:"##:##",fulltime:"##:##:##",phone:"(###) ### - ####",card:"#### #### #### ####"},{tokenMap:Zs,tokenKeys:Js}=Xs({"#":{pattern:"[\\d]",negate:"[^\\d]"},S:{pattern:"[a-zA-Z]",negate:"[^a-zA-Z]"},N:{pattern:"[0-9a-zA-Z]",negate:"[^0-9a-zA-Z]"},A:{pattern:"[a-zA-Z]",negate:"[^a-zA-Z]",transform:e=>e.toLocaleUpperCase()},a:{pattern:"[a-zA-Z]",negate:"[^a-zA-Z]",transform:e=>e.toLocaleLowerCase()},X:{pattern:"[0-9a-zA-Z]",negate:"[^0-9a-zA-Z]",transform:e=>e.toLocaleUpperCase()},x:{pattern:"[0-9a-zA-Z]",negate:"[^0-9a-zA-Z]",transform:e=>e.toLocaleLowerCase()}});function Xs(e){let t=Object.keys(e),n={};return t.forEach(t=>{let a=e[t];n[t]={...a,regex:new RegExp(a.pattern)}}),{tokenMap:n,tokenKeys:t}}function el(e){return RegExp("\\\\([^.*+?^${}()|([\\]])|([.*+?^${}()|[\\]])|(["+e.join("")+"])|(.)","g")}let tl=/[.*+?^${}()|[\]\\]/g,nl=el(Js),al=String.fromCodePoint(1),il={mask:String,reverseFillMask:Boolean,fillMask:[Boolean,String],unmaskedValue:Boolean,maskTokens:Object};function rl(t,n,a,i){let r,o,s,l,u,c,d=(0,e.computed)(()=>{if(void 0===t.maskTokens||null===t.maskTokens)return{tokenMap:Zs,tokenRegexMask:nl};let{tokenMap:e}=Xs(t.maskTokens),n={...Zs,...e};return{tokenMap:n,tokenRegexMask:el(Object.keys(n))}}),h=(0,e.ref)(null),p=(0,e.ref)(function(){if(m(),h.value){let e=v(y(t.modelValue));return!1===t.fillMask?e:w(e)}return t.modelValue}());function f(e){if(e0;a--)t+=al;n=n.slice(0,a)+t+n.slice(a)}return n}function m(){if(h.value=void 0!==t.mask&&0!==t.mask.length&&(t.autogrow||["textarea","text","search","url","tel","password"].includes(t.type)),!h.value)return l=void 0,r="",void(o="");let e=void 0===Qs[t.mask]?t.mask:Qs[t.mask],n="string"==typeof t.fillMask&&0!==t.fillMask.length?t.fillMask.slice(0,1):"_",a=n.replace(tl,String.raw`\$&`),i=[],u=[],c=[],p=t.reverseFillMask,f="",m="";e.replace(d.value.tokenRegexMask,(e,t,n,a,r)=>{if(void 0!==a){let e=d.value.tokenMap[a];return c.push(e),m=e.negate,p&&=(u.push("(?:"+m+"+)?("+e.pattern+"+)?(?:"+m+"+)?("+e.pattern+"+)?"),!1),void u.push("(?:"+m+"+)?("+e.pattern+")?")}if(void 0!==n)f="\\"+("\\"===n?"":n),c.push(n);else{let e=void 0===t?r:t;f="\\"===e?String.raw`\\\\`:e.replace(tl,String.raw`\\$&`),c.push(e)}i.push("([^"+f+"]+)?"+f+"?")});let _=RegExp("^"+i.join("")+"("+(""===f?".":"[^"+f+"]")+"+)?"+(""===f?"":"["+f+"]*")+"$"),g=u.length-1,v=u.map((e,n)=>0===n&&t.reverseFillMask?RegExp("^"+a+"*"+e):RegExp(n===g?"^"+e+"("+(""===m?".":m)+"+)?"+(t.reverseFillMask?"$":a+"*"):"^"+e));s=c,l=e=>{let n=_.exec(t.reverseFillMask?e:e.slice(0,c.length+1));null!==n&&(e=n.slice(1).join(""));let a=[],i=v.length;for(let t=0,n=e;t"string"==typeof e?e:al).join(""),o=r.split(al).join(n)}function _(n,s,l){let c=i.value,d=c?.selectionEnd??0,h=null===c?0:c.value.length-d,f=y(n);!0===s&&m();let _=v(f,s),b=!1===t.fillMask?_:w(_),k=p.value!==b;null!==c&&c.value!==b&&(c.value=b),k&&(p.value=b),null!==c&&document.activeElement===c&&(0,e.nextTick)(()=>{if(b===o){let e=t.reverseFillMask?o.length:0;return void c.setSelectionRange(e,e,"forward")}if("insertFromPaste"===l&&!t.reverseFillMask){let e=c.selectionEnd,t=d-1;for(let n=u;n<=t&&n_.length):Math.max(0,b.length-(b===o?0:Math.min(_.length,h)+1))+1:d;return void c.setSelectionRange(e,e,"forward")}if(t.reverseFillMask)if(k){let e=Math.max(0,b.length-(b===o?0:Math.min(_.length,h+1)));1===e&&1===d?c.setSelectionRange(e,e,"forward"):g.rightReverse(c,e)}else{let e=b.length-h;c.setSelectionRange(e,e,"backward")}else if(k){let e=Math.max(0,r.indexOf(al),Math.min(_.length,d)-1);g.right(c,e)}else{let e=d-1;g.right(c,e)}});let x=t.unmaskedValue?y(b):b;String(t.modelValue)!==x&&(null!==t.modelValue||""!==x)&&a(x,!0)}(0,e.watch)(()=>t.type+t.autogrow,m),(0,e.watch)(()=>t.mask,e=>{if(void 0!==e)_(p.value,!0);else{let e=y(p.value);m(),t.modelValue!==e&&n("update:modelValue",e)}}),(0,e.watch)(()=>t.fillMask+t.reverseFillMask,()=>{h.value&&_(p.value,!0)}),(0,e.watch)(()=>t.unmaskedValue,()=>{h.value&&_(p.value)}),(0,e.watch)(()=>t.maskTokens,()=>{h.value&&_(p.value,!0)},{deep:!0});let g={left(e,t){let n=!r.slice(t-1).includes(al),a=Math.max(0,t-1);for(;a>=0;a--)if(r[a]===al){t=a,n&&t++;break}if(a<0&&void 0!==r[t]&&r[t]!==al)return g.right(e,0);t>=0&&e.setSelectionRange(t,t,"backward")},right(e,t){let n=e.value.length,a=Math.min(n,t+1);for(;a<=n;a++){if(r[a]===al){t=a;break}r[a-1]===al&&(t=a)}if(a>n&&void 0!==r[t-1]&&r[t-1]!==al)return g.left(e,n);e.setSelectionRange(t,t,"forward")},leftReverse(e,t){let n=f(e.value.length),a=Math.max(0,t-1);for(;a>=0;a--){if(n[a-1]===al){t=a;break}if(n[a]===al&&(t=a,0===a))break}if(a<0&&void 0!==n[t]&&n[t]!==al)return g.rightReverse(e,0);t>=0&&e.setSelectionRange(t,t,"backward")},rightReverse(e,t){let n=e.value.length,a=f(n),i=!a.slice(0,t+1).includes(al),r=Math.min(n,t+1);for(;r<=n;r++)if(a[r-1]===al){(t=r)>0&&i&&t--;break}if(r>n&&void 0!==a[t-1]&&a[t-1]!==al)return g.leftReverse(e,n);e.setSelectionRange(t,t,"forward")}};function v(e,n){if(null==e||""===e)return"";if(t.reverseFillMask)return b(e,n);let a=s,i=0,r="";for(let t=0;t=0&&-1!==i;r--){let s=n[r],l=e[i];if("string"==typeof s)o=s+o,!0===t&&l===s&&i--;else{if(void 0===l||!s.regex.test(l))return o;do{o=(void 0===s.transform?l:s.transform(l))+o,i--,l=e[i]}while(a===r&&void 0!==l&&s.regex.test(l))}}return o}function y(e){return"string"!=typeof e||void 0===l?"number"==typeof e?l(String(e)):e:l(e)}function w(e){return o.length-e.length<=0?e:t.reverseFillMask&&0!==e.length?o.slice(0,-e.length)+e:e+o.slice(e.length)}return{innerValue:p,hasMask:h,moveCursorForPaste:function(e,t,n){let a=v(y(e.value));t=Math.max(0,r.indexOf(al),Math.min(a.length,t)),u=t,e.setSelectionRange(t,n,"forward")},updateMaskValue:_,onMaskedKeydown:function(e){if(n("keydown",e),I(e)||e.altKey)return;let a=i.value,r=a.selectionStart,o=a.selectionEnd;if(e.shiftKey||(c=void 0),37===e.keyCode||39===e.keyCode){e.shiftKey&&void 0===c&&(c="forward"===a.selectionDirection?r:o);let n=g[(39===e.keyCode?"right":"left")+(t.reverseFillMask?"Reverse":"")];if(e.preventDefault(),n(a,c===r?o:r),e.shiftKey){let e=a.selectionStart;a.setSelectionRange(Math.min(c,e),Math.max(c,e),"forward")}}else 8!==e.keyCode||t.reverseFillMask||r!==o?46===e.keyCode&&t.reverseFillMask&&r===o&&(g.rightReverse(a,o),a.setSelectionRange(r,a.selectionEnd,"forward")):(g.left(a,r),a.setSelectionRange(a.selectionStart,o,"backward"))},onMaskedClick:function(e){n("click",e),c=void 0}}}let ol=/[\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFF9F\u4E00-\u9FAF\u3400-\u4DBF]/,sl=/[\u4E00-\u9FFF\u3400-\u4DBF\u{20000}-\u{2A6DF}\u{2A700}-\u{2B73F}\u{2B740}-\u{2B81F}\u{2B820}-\u{2CEAF}\uF900-\uFAFF\u3300-\u33FF\uFE30-\uFE4F\uF900-\uFAFF\u{2F800}-\u{2FA1F}]/u,ll=/[\u3131-\u314E\u314F-\u3163\uAC00-\uD7A3]/,ul=/[a-z0-9_ -]$/i;function cl(e){return function(t){if("compositionend"===t.type||"change"===t.type){if(!t.target.qComposing)return;t.target.qComposing=!1,e(t)}else"compositionupdate"===t.type&&!t.target.qComposing&&"string"==typeof t.data&&(c.is.firefox?!ul.test(t.data):ol.test(t.data)||sl.test(t.data)||ll.test(t.data))&&(t.target.qComposing=!0)}}var dl=h({name:"QInput",inheritAttrs:!1,props:{...xs,...il,...wa,modelValue:[String,Number,FileList],modelModifiers:Object,shadowText:String,type:{type:String,default:"text"},debounce:[String,Number],autogrow:Boolean,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...Ss,"paste","change","keydown","click","animationend"],setup(t,{emit:n,attrs:i}){let r,{proxy:o}=(0,e.getCurrentInstance)(),{$q:s}=o,l={},u=NaN,c=!1,d=!1,h=null,p=(0,e.ref)(null),f=Sa(t),{innerValue:m,hasMask:_,moveCursorForPaste:g,updateMaskValue:v,onMaskedKeydown:y,onMaskedClick:w}=rl(t,n,z,p),k=Is(t,!0),x=(0,e.computed)(()=>ws(m.value)),S=cl(M),C=Cs({changeEvent:!0}),T=(0,e.computed)(()=>"textarea"===t.type||t.autogrow),P=(0,e.computed)(()=>T.value||["text","search","url","tel","password"].includes(t.type)),E=(0,e.computed)(()=>{let e={...C.splitAttrs.listeners.value,onInput:M,onPaste:L,onChange:O,onBlur:j,onFocus:b};return e.onCompositionstart=e.onCompositionupdate=e.onCompositionend=S,_.value&&(e.onKeydown=y,e.onClick=w),t.autogrow&&(e.onAnimationend=R),e}),A=(0,e.computed)(()=>{let e={tabindex:0,"data-autofocus":t.autofocus||void 0,rows:"textarea"===t.type?6:void 0,"aria-label":t.label,name:f.value,...C.splitAttrs.attributes.value,id:C.targetUid.value,maxlength:t.maxlength,disabled:t.disable,readonly:t.readonly};return T.value||(e.type=t.type),t.autogrow&&(e.rows=1),e});function L(e){if(_.value&&!0!==t.reverseFillMask){let t=e.target;g(t,t.selectionStart,t.selectionEnd)}n("paste",e)}function M(a){if(!a||!a.target)return;if("file"===t.type)return void n("update:modelValue",a.target.files);let i=a.target.value;if(a.target.qComposing)l.value=i;else{if(_.value)v(i,!1,a.inputType);else if(!0===t.modelModifiers?.trim&&(l.value=i),z(i),P.value&&a.target===document.activeElement){let{selectionStart:t,selectionEnd:n}=a.target;void 0!==t&&void 0!==n&&(0,e.nextTick)(()=>{a.target===document.activeElement&&0===i.indexOf(a.target.value)&&a.target.setSelectionRange(t,n)})}t.autogrow&&N()}}function R(e){n("animationend",e),N()}function z(a,i){r=()=>{h=null,"number"!==t.type&&(!0!==t.modelModifiers?.trim||_.value)&&Object.hasOwn(l,"value")&&delete l.value,t.modelValue!==a&&u!==a&&(u=a,!0===i&&(d=!0),n("update:modelValue",a),(0,e.nextTick)(()=>{u===a&&(u=NaN)})),r=void 0},"number"===t.type&&(c=!0,l.value=a),void 0===t.debounce?r():(null!==h&&clearTimeout(h),l.value=a,h=setTimeout(r,t.debounce))}function I(){null!==h&&(clearTimeout(h),h=null),r=void 0}function N(){requestAnimationFrame(()=>{let e=p.value;if(null!==e){let t=e.parentNode.style,{scrollTop:n}=e,{overflowY:a,maxHeight:i}=s.platform.is.firefox?{}:window.getComputedStyle(e),r=void 0!==a&&"scroll"!==a;r&&(e.style.overflowY="hidden"),t.marginBottom=e.scrollHeight-1+"px",e.style.height="1px",e.style.height=e.scrollHeight+"px",r&&(e.style.overflowY=Number.parseInt(i,10){null!==p.value&&(p.value.value=void 0===m.value?"":m.value)},0)}function D(){return Object.hasOwn(l,"value")?l.value:void 0===m.value?"":m.value}(0,e.watch)(()=>t.type,()=>{p.value&&(p.value.value=t.modelValue)}),(0,e.watch)(()=>t.modelValue,n=>{if(null!==h&&(I(),c=!1,d=!1,delete l.value),_.value){if(d&&(d=!1,String(n)===u))return;v(n)}else m.value!==n&&(m.value=n,"number"===t.type&&Object.hasOwn(l,"value")&&(c?c=!1:delete l.value),!0===t.modelModifiers?.trim&&Object.hasOwn(l,"value")&&("string"!=typeof l.value||l.value.trim()!==n)&&delete l.value);t.autogrow&&(0,e.nextTick)(N)}),(0,e.watch)(()=>t.autogrow,t=>{t?(0,e.nextTick)(N):null!==p.value&&i.rows>0&&(p.value.style.height="auto")}),(0,e.watch)(()=>t.dense,()=>{t.autogrow&&(0,e.nextTick)(N)}),(0,e.onBeforeUnmount)(()=>{j()}),(0,e.onMounted)(()=>{t.autogrow&&N()}),Object.assign(C,{innerValue:m,fieldClass:(0,e.computed)(()=>"q-"+(T.value?"textarea":"input")+(t.autogrow?" q-textarea--autogrow":"")),hasShadow:(0,e.computed)(()=>"file"!==t.type&&"string"==typeof t.shadowText&&0!==t.shadowText.length),inputRef:p,emitValue:z,onClear:function(){I(),c=!1,d=!1,delete l.value},hasValue:x,floatingLabel:(0,e.computed)(()=>x.value&&("number"!==t.type||Number.isFinite(Number(m.value)))||ws(t.displayValue)),getControl:()=>(0,e.h)(T.value?"textarea":"input",{ref:p,class:["q-field__native q-placeholder",t.inputClass],style:t.inputStyle,...A.value,...E.value,..."file"===t.type?k.value:{value:D()}}),getShadowControl:()=>(0,e.h)("div",{class:"q-field__native q-field__shadow absolute-bottom no-pointer-events"+(T.value?"":" text-no-wrap")},[(0,e.h)("span",{class:"invisible"},D()),(0,e.h)("span",t.shadowText)])});let q=Ps(C);return Object.assign(o,{focus:function(){dn(()=>{let e=document.activeElement;null!==p.value&&p.value!==e&&(null===e||e.id!==C.targetUid.value)&&p.value.focus({preventScroll:!0})})},select:function(){p.value?.select()},getNativeElement:()=>p.value}),a(o,"nativeEl",()=>p.value),q}});let hl={threshold:0,root:null,rootMargin:"0px"};function pl(e,t,n){let a,i,r;"function"==typeof n?(a=n,i=hl,r=void 0===t.cfg):(a=n.handler,i={...hl,...n.cfg},r=void 0===t.cfg||!te(t.cfg,i)),t.handler!==a&&(t.handler=a),r&&(t.cfg=i,t.observer?.disconnect(),t.observer=new IntersectionObserver(([n])=>{if("function"==typeof t.handler){if(null===n.rootBounds&&document.body.contains(e))return t.observer.unobserve(e),void t.observer.observe(e);(!1===t.handler(n,t.observer)||t.once&&n.isIntersecting)&&fl(e)}},i),t.observer.observe(e))}function fl(e){let t=e.__qvisible;void 0!==t&&(t.observer?.disconnect(),delete e.__qvisible)}var ml=p({name:"intersection",mounted(e,{modifiers:t,value:n}){let a={once:!0===t.once};pl(e,a,n),e.__qvisible=a},updated(e,t){let n=e.__qvisible;void 0!==n&&pl(e,n,t.value)},beforeUnmount:fl}),_l=h({name:"QIntersection",props:{tag:{type:String,default:"div"},once:Boolean,transition:String,transitionDuration:{type:[String,Number],default:300},ssrPrerender:Boolean,margin:String,threshold:[Number,Array],root:{default:null},disable:Boolean,onVisibility:Function},setup(t,{slots:n,emit:a}){let i=(0,e.ref)(!!o.value&&t.ssrPrerender),r=(0,e.computed)(()=>void 0!==t.root||void 0!==t.margin||void 0!==t.threshold?{handler:c,cfg:{root:t.root,rootMargin:t.margin,threshold:t.threshold}}:c),s=(0,e.computed)(()=>!(t.disable||o.value&&t.once&&t.ssrPrerender)),l=(0,e.computed)(()=>[[ml,r.value,void 0,{once:t.once}]]),u=(0,e.computed)(()=>`--q-transition-duration: ${t.transitionDuration}ms`);function c(e){i.value!==e.isIntersecting&&(i.value=e.isIntersecting,void 0!==t.onVisibility&&a("visibility",i.value))}function d(){return i.value?[(0,e.h)("div",{key:"content",style:u.value},Ae(n.default))]:void 0!==n.hidden?[(0,e.h)("div",{key:"hidden",style:u.value},n.hidden())]:void 0}return()=>{let n=t.transition?[(0,e.h)(e.Transition,{name:"q-transition--"+t.transition},d)]:d();return ze(t.tag,{class:"q-intersection"},n,"main",s.value,()=>l.value)}}});let gl=["ul","ol"];var vl=h({name:"QList",props:{...Je,bordered:Boolean,dense:Boolean,separator:Boolean,padding:Boolean,tag:{type:String,default:"div"}},setup(t,{slots:n}){let a=Xe(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>gl.includes(t.tag)?null:"list"),r=(0,e.computed)(()=>"q-list"+(t.bordered?" q-list--bordered":"")+(t.dense?" q-list--dense":"")+(t.separator?" q-list--separator":"")+(a.value?" q-list--dark":"")+(t.padding?" q-list--padding":""));return()=>(0,e.h)(t.tag,{class:r.value,role:i.value},Ae(n.default))}});let bl=[34,37,40,33,39,38],yl=Object.keys(ci);var wl=h({name:"QKnob",props:{...wa,...ci,modelValue:{type:Number,required:!0},innerMin:Number,innerMax:Number,step:{type:Number,default:1,validator:e=>e>=0},tabindex:{type:[Number,String],default:0},disable:Boolean,readonly:Boolean},emits:["update:modelValue","change","dragValue"],setup(t,{slots:n,emit:a}){let i,{proxy:r}=(0,e.getCurrentInstance)(),{$q:o}=r,s=(0,e.ref)(t.modelValue),l=(0,e.ref)(!1),u=(0,e.computed)(()=>!Number.isFinite(t.innerMin)||t.innerMin!Number.isFinite(t.innerMax)||t.innerMax>t.max?t.max:t.innerMax);function d(){s.value=null===t.modelValue?u.value:_e(t.modelValue,u.value,c.value),L(!0)}(0,e.watch)(()=>`${t.modelValue}|${u.value}|${c.value}`,d),d();let h=(0,e.computed)(()=>!t.disable&&!t.readonly),p=(0,e.computed)(()=>"q-knob non-selectable"+(h.value?" q-knob--editable":t.disable?" disabled":"")),f=(0,e.computed)(()=>(String(t.step).trim().split(".")[1]||"").length),m=(0,e.computed)(()=>0===t.step?1:t.step),_=(0,e.computed)(()=>t.instantFeedback||l.value),g=o.platform.is.mobile?(0,e.computed)(()=>h.value?{onClick:T}:{}):(0,e.computed)(()=>h.value?{onMousedown:C,onClick:T,onKeydown:P,onKeyup:A}:{}),b=(0,e.computed)(()=>h.value?{tabindex:t.tabindex}:{["aria-"+(t.disable?"disabled":"readonly")]:"true"}),y=(0,e.computed)(()=>{let e={};return yl.forEach(n=>{e[n]=t[n]}),e});function k(e){if(e.isFinal)return E(e.evt,!0),void(l.value=!1);e.isFirst&&(S(),l.value=!0),E(e.evt,!1)}let x=(0,e.computed)(()=>[[gi,k,void 0,{prevent:!0,stop:!0,mouse:!0}]]);function S(){let{top:e,left:t,width:n,height:a}=r.$el.getBoundingClientRect();i={top:e+a/2,left:t+n/2}}function C(e){S(),E(e,!1)}function T(e){S(),E(e,!0)}function P(e){if(!bl.includes(e.keyCode))return;w(e);let t=([34,33].includes(e.keyCode)?10:1)*m.value,n=[34,37,40].includes(e.keyCode)?-t:t;s.value=_e(Number.parseFloat((s.value+n).toFixed(f.value)),u.value,c.value),L(!1)}function E(e,n){let r=v(e),l=Math.abs(r.top-i.top),d=Math.hypot(l,r.left-i.left),h=Math.asin(l/d)*(180/Math.PI);h=r.top=m.value/2?(e<0?-1:1)*m.value:0),p=Number.parseFloat(p.toFixed(f.value))}p=_e(p,u.value,c.value),a("dragValue",p),s.value!==p&&(s.value=p),L(n)}function A(e){bl.includes(e.keyCode)&&L(!0)}function L(e){t.modelValue!==s.value&&a("update:modelValue",s.value),e&&a("change",s.value)}let M=ka(t);function R(){return(0,e.h)("input",M.value)}return()=>{let e={class:p.value,role:"slider","aria-valuemin":u.value,"aria-valuemax":c.value,"aria-valuenow":t.modelValue,...b.value,...y.value,value:s.value,instantFeedback:_.value,...g.value},a={default:n.default};return h.value&&void 0!==t.name&&(a.internal=R),ze(pi,e,a,"knob",h.value,()=>x.value)}}});let{passive:kl}=m,xl=["both","horizontal","vertical"];var Sl=h({name:"QScrollObserver",props:{axis:{type:String,validator:e=>xl.includes(e),default:"vertical"},debounce:[String,Number],scrollTarget:Cn},emits:["scroll"],setup(t,{emit:n}){let a,i,r={position:{top:0,left:0},direction:"down",directionChanged:!1,delta:{top:0,left:0},inflectionPoint:{top:0,left:0}},o=null;function s(){o?.();let e=Math.max(0,An(a)),i=Ln(a),s={top:e-r.position.top,left:i-r.position.left};if("vertical"===t.axis&&0===s.top||"horizontal"===t.axis&&0===s.left)return;let l=Math.abs(s.top)>=Math.abs(s.left)?s.top<0?"up":"down":s.left<0?"left":"right";r.position={top:e,left:i},r.directionChanged=r.direction!==l,r.delta=s,r.directionChanged&&(r.direction=l,r.inflectionPoint=r.position),n("scroll",{...r})}function l(){a=Pn(i,t.scrollTarget),a.addEventListener("scroll",c,kl),c(!0)}function u(){void 0!==a&&(a.removeEventListener("scroll",c,kl),a=void 0)}function c(e){if(!0===e||0===t.debounce||"0"===t.debounce)s();else if(null===o){let[e,n]=t.debounce?[setTimeout(s,t.debounce),clearTimeout]:[requestAnimationFrame(s),cancelAnimationFrame];o=()=>{n(e),o=null}}}(0,e.watch)(()=>t.scrollTarget,()=>{u(),l()});let{proxy:d}=(0,e.getCurrentInstance)();return(0,e.watch)(()=>d.$q.lang.rtl,s),(0,e.onMounted)(()=>{i=d.$el.parentNode,l()}),(0,e.onBeforeUnmount)(()=>{o?.(),u()}),Object.assign(d,{trigger:c,getPosition:()=>r}),_}});let Cl=/^(h|l)h(h|r) lpr (f|l)f(f|r)$/;var Tl=h({name:"QLayout",props:{container:Boolean,view:{type:String,default:"hhh lpr fff",validator:e=>Cl.test(e.toLowerCase())},onScroll:Function,onScrollHeight:Function,onResize:Function},setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),r=(0,e.ref)(null),s=(0,e.ref)(i.screen.height),l=(0,e.ref)(t.container?0:i.screen.width),u=(0,e.ref)({position:0,direction:"down",inflectionPoint:0}),c=(0,e.ref)(0),d=(0,e.ref)(o.value?0:jn()),h=(0,e.computed)(()=>"q-layout q-layout--"+(t.container?"containerized":"standard")),p=(0,e.computed)(()=>t.container?null:{minHeight:i.screen.height+"px"}),f=(0,e.computed)(()=>0===d.value?null:{[i.lang.rtl?"left":"right"]:`${d.value}px`}),m=(0,e.computed)(()=>0===d.value?null:{[i.lang.rtl?"right":"left"]:0,[i.lang.rtl?"left":"right"]:`-${d.value}px`,width:`calc(100% + ${d.value}px)`});function _(e){if(t.container||!document.qScrollPrevented){let n={position:e.position.top,direction:e.direction,directionChanged:e.directionChanged,inflectionPoint:e.inflectionPoint.top,delta:e.delta.top};u.value=n,void 0!==t.onScroll&&a("scroll",n)}}function g(e){let{height:n,width:i}=e,r=!1;s.value!==n&&(r=!0,s.value=n,void 0!==t.onScrollHeight&&a("scrollHeight",n),b()),l.value!==i&&(r=!0,l.value=i),r&&void 0!==t.onResize&&a("resize",e)}function v({height:e}){c.value!==e&&(c.value=e,b())}function b(){if(t.container){let e=s.value>c.value?jn():0;d.value!==e&&(d.value=e)}}let y=null,w={instances:{},view:(0,e.computed)(()=>t.view),isContainer:(0,e.computed)(()=>t.container),rootRef:r,height:s,containerHeight:c,scrollbarWidth:d,totalWidth:(0,e.computed)(()=>l.value+d.value),rows:(0,e.computed)(()=>{let e=t.view.toLowerCase().split(" ");return{top:[...e[0]],middle:[...e[1]],bottom:[...e[2]]}}),header:(0,e.reactive)({size:0,offset:0,space:!1}),right:(0,e.reactive)({size:300,offset:0,space:!1}),footer:(0,e.reactive)({size:0,offset:0,space:!1}),left:(0,e.reactive)({size:300,offset:0,space:!1}),scroll:u,animate(){null===y?document.body.classList.add("q-body--layout-animate"):clearTimeout(y),y=setTimeout(()=>{y=null,document.body.classList.remove("q-body--layout-animate")},155)},update(e,t,n){w[e][t]=n}};if((0,e.provide)(Y,w),jn()>0){let n=null,a=document.body,r=()=>{n=null,a.classList.remove("hide-scrollbar")},o=()=>{if(null===n){if(a.scrollHeight>i.screen.height)return;a.classList.add("hide-scrollbar")}else clearTimeout(n);n=setTimeout(r,300)},s=e=>{null!==n&&"remove"===e&&(clearTimeout(n),r()),window[`${e}EventListener`]("resize",o)};(0,e.watch)(()=>t.container?"remove":"add",s),t.container||s("add"),(0,e.onUnmounted)(()=>{s("remove")})}return()=>{let a=Me(n.default,[(0,e.h)(Sl,{onScroll:_}),(0,e.h)(Ai,{onResize:g})]),i=(0,e.h)("div",{class:h.value,style:p.value,ref:t.container?void 0:r,tabindex:-1},a);return t.container?(0,e.h)("div",{class:"q-layout-container overflow-hidden",ref:r},[(0,e.h)(Ai,{onResize:v}),(0,e.h)("div",{class:"absolute-full",style:f.value},[(0,e.h)("div",{class:"scroll",style:m.value},[i])])]):i}}});let Pl={xs:2,sm:4,md:6,lg:10,xl:14};function El(e,t,n){return{transform:t?`translateX(${n.lang.rtl?"-":""}100%) scale3d(${-e},1,1)`:`scale3d(${e},1,1)`}}var Al=h({name:"QLinearProgress",props:{...Je,...Pe,value:{type:Number,default:0},buffer:Number,color:String,trackColor:String,reverse:Boolean,stripe:Boolean,indeterminate:Boolean,query:Boolean,rounded:Boolean,animationSpeed:{type:[String,Number],default:2100},instantFeedback:Boolean},setup(t,{slots:n}){let{proxy:a}=(0,e.getCurrentInstance)(),i=Xe(t,a.$q),r=Ee(t,Pl),o=(0,e.computed)(()=>t.indeterminate||t.query),s=(0,e.computed)(()=>t.reverse!==t.query),l=(0,e.computed)(()=>({...null===r.value?{}:r.value,"--q-linear-progress-speed":`${t.animationSpeed}ms`})),u=(0,e.computed)(()=>"q-linear-progress"+(void 0===t.color?"":` text-${t.color}`)+(t.reverse||t.query?" q-linear-progress--reverse":"")+(t.rounded?" rounded-borders":"")),c=(0,e.computed)(()=>El(void 0===t.buffer?1:t.buffer,s.value,a.$q)),d=(0,e.computed)(()=>`with${t.instantFeedback?"out":""}-transition`),h=(0,e.computed)(()=>`q-linear-progress__track absolute-full q-linear-progress__track--${d.value} q-linear-progress__track--${i.value?"dark":"light"}`+(void 0===t.trackColor?"":` bg-${t.trackColor}`)),p=(0,e.computed)(()=>El(o.value?1:t.value,s.value,a.$q)),f=(0,e.computed)(()=>`q-linear-progress__model absolute-full q-linear-progress__model--${d.value} q-linear-progress__model--${o.value?"in":""}determinate`),m=(0,e.computed)(()=>({width:100*t.value+"%"})),_=(0,e.computed)(()=>`q-linear-progress__stripe absolute-${t.reverse?"right":"left"} q-linear-progress__stripe--${d.value}`);return()=>{let a=[(0,e.h)("div",{class:h.value,style:c.value}),(0,e.h)("div",{class:f.value,style:p.value})];return t.stripe&&!o.value&&a.push((0,e.h)("div",{class:_.value,style:m.value})),(0,e.h)("div",{class:u.value,style:l.value,role:"progressbar","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":t.indeterminate?void 0:t.value},Me(n.default,a))}}});let Ll=["horizontal","vertical","cell","none"];var Ml=h({name:"QMarkupTable",props:{...Je,dense:Boolean,flat:Boolean,bordered:Boolean,square:Boolean,wrapCells:Boolean,separator:{type:String,default:"horizontal",validator:e=>Ll.includes(e)}},setup(t,{slots:n}){let a=Xe(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>`q-markup-table q-table__container q-table__card q-table--${t.separator}-separator`+(a.value?" q-table--dark q-table__card--dark q-dark":"")+(t.dense?" q-table--dense":"")+(t.flat?" q-table--flat":"")+(t.bordered?" q-table--bordered":"")+(t.square?" q-table--square":"")+(t.wrapCells?"":" q-table--no-wrap"));return()=>(0,e.h)("div",{class:i.value},[(0,e.h)("table",{class:"q-table"},Ae(n.default))])}}),Rl=h({name:"QNoSsr",props:{tag:{type:String,default:"div"},placeholder:String},setup(t,{slots:n}){let{isHydrated:a}=Ti();return()=>{if(a.value){let a=Ae(n.default);return void 0===a?a:a.length>1?(0,e.h)(t.tag,{},a):a[0]}let i={class:"q-no-ssr-placeholder"},r=Ae(n.placeholder);return void 0!==r?r.length>1?(0,e.h)(t.tag,i,r):r[0]:void 0!==t.placeholder?(0,e.h)(t.tag,i,t.placeholder):void 0}}});function zl(e){(13===e.keyCode||32===e.keyCode)&&w(e)}var Il=h({name:"QRadio",props:{...Je,...Pe,...wa,modelValue:{required:!0},val:{required:!0},label:String,leftLabel:Boolean,checkedIcon:String,uncheckedIcon:String,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},emits:["update:modelValue"],setup(t,{slots:n,emit:a}){let{proxy:i}=(0,e.getCurrentInstance)(),r=Xe(t,i.$q),o=Ee(t,ti),s=(0,e.ref)(null),{refocusTargetEl:l,refocusTarget:u}=ei(t,s),c=(0,e.computed)(()=>(0,e.toRaw)(t.modelValue)===(0,e.toRaw)(t.val)),d=(0,e.computed)(()=>"q-radio cursor-pointer no-outline row inline no-wrap items-center"+(t.disable?" disabled":"")+(r.value?" q-radio--dark":"")+(t.dense?" q-radio--dense":"")+(t.leftLabel?" reverse":"")),h=(0,e.computed)(()=>{let e=void 0!==t.color&&(t.keepColor||c.value)?` text-${t.color}`:"";return`q-radio__inner relative-position q-radio__inner--${c.value?"truthy":"falsy"}${e}`}),p=(0,e.computed)(()=>(c.value?t.checkedIcon:t.uncheckedIcon)||null),f=(0,e.computed)(()=>t.disable?-1:t.tabindex||0),m=xa((0,e.computed)(()=>{let e={type:"radio"};return void 0!==t.name&&Object.assign(e,{".checked":c.value,"^checked":c.value?"checked":void 0,name:t.name,value:t.val}),e}));function _(e){void 0!==e&&(w(e),u(e)),!t.disable&&!c.value&&a("update:modelValue",t.val,e)}function g(e){(13===e.keyCode||32===e.keyCode)&&_(e)}Object.assign(i,{set:_});let v=(0,e.h)("svg",{key:"svg",class:"q-radio__bg absolute non-selectable",viewBox:"0 0 24 24"},[(0,e.h)("path",{d:"M12,22a10,10 0 0 1 -10,-10a10,10 0 0 1 10,-10a10,10 0 0 1 10,10a10,10 0 0 1 -10,10m0,-22a12,12 0 0 0 -12,12a12,12 0 0 0 12,12a12,12 0 0 0 12,-12a12,12 0 0 0 -12,-12"}),(0,e.h)("path",{class:"q-radio__check",d:"M12,6a6,6 0 0 0 -6,6a6,6 0 0 0 6,6a6,6 0 0 0 6,-6a6,6 0 0 0 -6,-6"})]);return()=>{let a=null===p.value?[v]:[(0,e.h)("div",{key:"icon",class:"q-radio__icon-container absolute-full flex flex-center no-wrap"},[(0,e.h)(Ke,{class:"q-radio__icon",name:p.value})])];t.disable||m(a,"unshift"," q-radio__native q-ma-none q-pa-none");let i=[(0,e.h)("div",{class:h.value,style:o.value,"aria-hidden":"true"},a)];null!==l.value&&i.push(l.value);let r=void 0===t.label?Ae(n.default):Me(n.default,[t.label]);return void 0!==r&&i.push((0,e.h)("div",{class:"q-radio__label q-anchor--skip"},r)),(0,e.h)("div",{ref:s,class:d.value,tabindex:f.value,role:"radio","aria-label":t.label,"aria-checked":c.value?"true":"false","aria-disabled":t.disable?"true":void 0,onClick:_,onKeydown:zl,onKeyup:g},i)}}}),Nl=h({name:"QToggle",props:{...ni,icon:String,iconColor:String},emits:ai,setup:t=>ri("toggle",function(n,a){let i=(0,e.computed)(()=>(n.value?t.checkedIcon:a.value?t.indeterminateIcon:t.uncheckedIcon)||t.icon),r=(0,e.computed)(()=>n.value?t.iconColor:null);return()=>[(0,e.h)("div",{class:"q-toggle__track"}),(0,e.h)("div",{class:"q-toggle__thumb absolute flex flex-center no-wrap"},void 0===i.value?void 0:[(0,e.h)(Ke,{name:i.value,color:r.value})])]})});let Ol={radio:Il,checkbox:oi,toggle:Nl},jl=Object.keys(Ol);function Dl(e,t){if("function"==typeof e)return e;let n=void 0===e?t:e;return e=>e[n]}var ql=h({name:"QOptionGroup",props:{...Je,modelValue:{required:!0},options:{type:Array,validator:e=>e.every(ne),default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],name:String,type:{type:String,default:"radio",validator:e=>jl.includes(e)},color:String,keepColor:Boolean,dense:Boolean,size:String,leftLabel:Boolean,inline:Boolean,disable:Boolean},emits:["update:modelValue"],setup(t,{emit:n,slots:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),r=Array.isArray(t.modelValue);"radio"===t.type?r&&console.error("q-option-group: model should not be array"):r||console.error("q-option-group: model should be array in your case");let o=Xe(t,i),s=(0,e.computed)(()=>Ol[t.type]),l=(0,e.computed)(()=>Dl(t.optionValue,"value")),u=(0,e.computed)(()=>Dl(t.optionLabel,"label")),c=(0,e.computed)(()=>Dl(t.optionDisable,"disable")),d=(0,e.computed)(()=>t.options.map(e=>({val:l.value(e),name:void 0===e.name?t.name:e.name,disable:t.disable||c.value(e),leftLabel:void 0===e.leftLabel?t.leftLabel:e.leftLabel,color:void 0===e.color?t.color:e.color,checkedIcon:e.checkedIcon,uncheckedIcon:e.uncheckedIcon,dark:void 0===e.dark?o.value:e.dark,size:void 0===e.size?t.size:e.size,dense:t.dense,keepColor:void 0===e.keepColor?t.keepColor:e.keepColor}))),h=(0,e.computed)(()=>"q-option-group q-gutter-x-sm"+(t.inline?" q-option-group--inline":"")),p=(0,e.computed)(()=>{let e={role:"group"};return"radio"===t.type&&(e.role="radiogroup",t.disable&&(e["aria-disabled"]="true")),e});function f(e){n("update:modelValue",e)}return()=>(0,e.h)("div",{class:h.value,...p.value},t.options.map((n,i)=>{let r=void 0===a["label-"+i]?void 0===a.label?void 0:()=>a.label(n):()=>a["label-"+i](n);return(0,e.h)("div",[(0,e.h)(s.value,{label:void 0===r?u.value(n):null,modelValue:t.modelValue,"onUpdate:modelValue":f,...d.value[i]},r)])}))}}),Bl=h({name:"QPage",props:{padding:Boolean,styleFn:Function},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=(0,e.inject)(Y,ee);if(i===ee)return console.error("QPage needs to be a deep child of QLayout"),ee;if((0,e.inject)("_q_pc_",ee)===ee)return console.error("QPage needs to be child of QPageContainer"),ee;let r=(0,e.computed)(()=>{let e=(i.header.space?i.header.size:0)+(i.footer.space?i.footer.size:0);if("function"==typeof t.styleFn){let n=i.isContainer.value?i.containerHeight.value:a.screen.height;return t.styleFn(e,n)}return{minHeight:i.isContainer.value?i.containerHeight.value-e+"px":0===a.screen.height?0===e?"100vh":`calc(100vh - ${e}px)`:a.screen.height-e+"px"}}),o=(0,e.computed)(()=>"q-page"+(t.padding?" q-layout-padding":""));return()=>(0,e.h)("main",{class:o.value,style:r.value},Ae(n.default))}}),Fl=h({name:"QPageContainer",setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=(0,e.inject)(Y,ee);if(i===ee)return console.error("QPageContainer needs to be child of QLayout"),ee;(0,e.provide)("_q_pc_",!0);let r=(0,e.computed)(()=>{let e={};return i.header.space&&(e.paddingTop=`${i.header.size}px`),i.right.space&&(e["padding"+(a.lang.rtl?"Left":"Right")]=`${i.right.size}px`),i.footer.space&&(e.paddingBottom=`${i.footer.size}px`),i.left.space&&(e["padding"+(a.lang.rtl?"Right":"Left")]=`${i.left.size}px`),e});return()=>(0,e.h)("div",{class:"q-page-container",style:r.value},Ae(n.default))}});let Vl={position:{type:String,default:"bottom-right",validator:e=>["top-right","top-left","bottom-right","bottom-left","top","right","bottom","left"].includes(e)},offset:{type:Array,validator:e=>2===e.length},expand:Boolean};function Ul(){let{props:t,proxy:{$q:n}}=(0,e.getCurrentInstance)(),a=(0,e.inject)(Y,ee);if(a===ee)return console.error("QPageSticky needs to be child of QLayout"),ee;let i=(0,e.computed)(()=>{let e=t.position;return{top:e.includes("top"),right:e.includes("right"),bottom:e.includes("bottom"),left:e.includes("left"),vertical:"top"===e||"bottom"===e,horizontal:"left"===e||"right"===e}}),r=(0,e.computed)(()=>a.header.offset),o=(0,e.computed)(()=>a.right.offset),s=(0,e.computed)(()=>a.footer.offset),l=(0,e.computed)(()=>a.left.offset),u=(0,e.computed)(()=>{let e=0,a=0,u=i.value,c=n.lang.rtl?-1:1;u.top&&0!==r.value?a=`${r.value}px`:u.bottom&&0!==s.value&&(a=-s.value+"px"),u.left&&0!==l.value?e=c*l.value+"px":u.right&&0!==o.value&&(e=-c*o.value+"px");let d={transform:`translate(${e}, ${a})`};return t.offset&&(d.margin=`${t.offset[1]}px ${t.offset[0]}px`),u.vertical?(0!==l.value&&(d[n.lang.rtl?"right":"left"]=`${l.value}px`),0!==o.value&&(d[n.lang.rtl?"left":"right"]=`${o.value}px`)):u.horizontal&&(0!==r.value&&(d.top=`${r.value}px`),0!==s.value&&(d.bottom=`${s.value}px`)),d}),c=(0,e.computed)(()=>`q-page-sticky row flex-center fixed-${t.position} q-page-sticky--${t.expand?"expand":"shrink"}`);return{$layout:a,getStickyContent:function(n){let a=Ae(n.default);return(0,e.h)("div",{class:c.value,style:u.value},t.expand?a:[(0,e.h)("div",a)])}}}var $l=h({name:"QPageScroller",props:{...Vl,scrollOffset:{type:Number,default:1e3},reverse:Boolean,duration:{type:Number,default:300},offset:{...Vl.offset,default:()=>[18,18]}},emits:["click"],setup(t,{slots:n,emit:a}){let i,{proxy:{$q:r}}=(0,e.getCurrentInstance)(),{$layout:o,getStickyContent:s}=Ul(),l=(0,e.ref)(null),u=(0,e.computed)(()=>o.height.value-(o.isContainer.value?o.containerHeight.value:r.screen.height));function c(){return t.reverse?u.value-o.scroll.value.position>t.scrollOffset:o.scroll.value.position>t.scrollOffset}let d=(0,e.ref)(c());function h(){let e=c();d.value!==e&&(d.value=e)}function p(){t.reverse?void 0===i&&(i=(0,e.watch)(u,h)):f()}function f(){void 0!==i&&(i(),i=void 0)}function m(e){Nn(Pn(o.isContainer.value?l.value:o.rootRef.value),t.reverse?o.height.value:0,t.duration),a("click",e)}function _(){return d.value?(0,e.h)("div",{ref:l,class:"q-page-scroller",onClick:m},s(n)):null}return(0,e.watch)(o.scroll,h),(0,e.watch)(()=>t.reverse,p),p(),(0,e.onBeforeUnmount)(f),()=>(0,e.h)(e.Transition,{name:"q-transition--fade"},_)}}),Hl=h({name:"QPageSticky",props:Vl,setup(e,{slots:t}){let{getStickyContent:n}=Ul();return()=>n(t)}});function Wl(e,t){return!0===e||!1===e?e:t}var Gl=h({name:"QPagination",props:{...Je,modelValue:{type:Number,required:!0},min:{type:[Number,String],default:1},max:{type:[Number,String],required:!0},maxPages:{type:[Number,String],default:0,validator:e=>("string"==typeof e?Number.parseInt(e,10):e)>=0},inputStyle:[Array,String,Object],inputClass:[Array,String,Object],size:String,disable:Boolean,input:Boolean,iconPrev:String,iconNext:String,iconFirst:String,iconLast:String,toFn:Function,boundaryLinks:{type:Boolean,default:null},boundaryNumbers:{type:Boolean,default:null},directionLinks:{type:Boolean,default:null},ellipses:{type:Boolean,default:null},ripple:{type:[Boolean,Object],default:null},round:Boolean,rounded:Boolean,flat:Boolean,outline:Boolean,unelevated:Boolean,push:Boolean,glossy:Boolean,color:{type:String,default:"primary"},textColor:String,activeDesign:{type:String,default:"",values:e=>""===e||Dt.includes(e)},activeColor:String,activeTextColor:String,gutter:String,padding:{type:String,default:"3px 2px"}},emits:["update:modelValue"],setup(t,{emit:n}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:i}=a,r=Xe(t,i),o=(0,e.computed)(()=>Number.parseInt(t.min,10)),s=(0,e.computed)(()=>Number.parseInt(t.max,10)),l=(0,e.computed)(()=>Number.parseInt(t.maxPages,10)),u=(0,e.computed)(()=>m.value+" / "+s.value),c=(0,e.computed)(()=>Wl(t.boundaryLinks,t.input)),d=(0,e.computed)(()=>Wl(t.boundaryNumbers,!t.input)),h=(0,e.computed)(()=>Wl(t.directionLinks,t.input)),p=(0,e.computed)(()=>Wl(t.ellipses,!t.input)),f=(0,e.ref)(null),m=(0,e.computed)({get:()=>t.modelValue,set:e=>{if(e=Number.parseInt(e,10),t.disable||!Number.isFinite(e))return;let a=_e(e,o.value,s.value);t.modelValue!==a&&n("update:modelValue",a)}});(0,e.watch)(()=>`${o.value}|${s.value}`,()=>{m.value=t.modelValue});let _=(0,e.computed)(()=>"q-pagination row no-wrap items-center"+(t.disable?" disabled":"")),g=(0,e.computed)(()=>t.gutter in It?`${It[t.gutter]}px`:t.gutter||null),v=(0,e.computed)(()=>null===g.value?null:`--q-pagination-gutter-parent:-${g.value};--q-pagination-gutter-child:${g.value}`),b=(0,e.computed)(()=>{let e=[t.iconFirst||i.iconSet.pagination.first,t.iconPrev||i.iconSet.pagination.prev,t.iconNext||i.iconSet.pagination.next,t.iconLast||i.iconSet.pagination.last];return i.lang.rtl?e.reverse():e}),y=(0,e.computed)(()=>({"aria-disabled":t.disable?"true":"false",role:"navigation"})),w=(0,e.computed)(()=>qt(t,"flat")),k=(0,e.computed)(()=>({[w.value]:!0,round:t.round,rounded:t.rounded,padding:t.padding,color:t.color,textColor:t.textColor,size:t.size,ripple:null===t.ripple||t.ripple})),x=(0,e.computed)(()=>{let e={[w.value]:!1};return""!==t.activeDesign&&(e[t.activeDesign]=!0),e}),S=(0,e.computed)(()=>({...x.value,color:t.activeColor||t.color,textColor:t.activeTextColor||t.textColor})),C=(0,e.computed)(()=>{let e=Math.max(l.value,1+(p.value?2:0)+(d.value?2:0)),n={pgFrom:o.value,pgTo:s.value,ellipsesStart:!1,ellipsesEnd:!1,boundaryStart:!1,boundaryEnd:!1,marginalStyle:{minWidth:`${Math.max(2,String(s.value).length)}em`}};return l.value&&eo.value+ +!!d.value&&(n.ellipsesStart=!0,n.pgFrom++),d.value&&(n.boundaryEnd=!0,n.pgTo--),p.value&&n.pgTo{T(a)}:r.to=t.toFn(a)),(0,e.h)(Kt,r)}return Object.assign(a,{set:T,setByOffset:function(e){m.value+=e}}),()=>{let n,a=[],l=[];if(c.value&&(a.push(L({key:"bls",disable:t.disable||t.modelValue<=o.value,icon:b.value[0],"aria-label":i.lang.pagination.first},o.value)),l.unshift(L({key:"ble",disable:t.disable||t.modelValue>=s.value,icon:b.value[3],"aria-label":i.lang.pagination.last},s.value))),h.value&&(a.push(L({key:"bdp",disable:t.disable||t.modelValue<=o.value,icon:b.value[1],"aria-label":i.lang.pagination.prev},t.modelValue-1)),l.unshift(L({key:"bdn",disable:t.disable||t.modelValue>=s.value,icon:b.value[2],"aria-label":i.lang.pagination.next},t.modelValue+1))),!t.input){n=[];let{pgFrom:e,pgTo:i,marginalStyle:r}=C.value;C.value.boundaryStart&&a.push(L({key:"bns",style:r,disable:t.disable,label:o.value},o.value,o.value===t.modelValue)),C.value.boundaryEnd&&l.unshift(L({key:"bne",style:r,disable:t.disable,label:s.value},s.value,s.value===t.modelValue)),C.value.ellipsesStart&&a.push(L({key:"bes",style:r,disable:t.disable,label:"…",ripple:!1},e-1)),C.value.ellipsesEnd&&l.unshift(L({key:"bee",style:r,disable:t.disable,label:"…",ripple:!1},i+1));for(let a=e;a<=i;a++)n.push(L({key:`bpg${a}`,style:r,disable:t.disable,label:a},a,a===t.modelValue))}return(0,e.h)("div",{class:_.value,...y.value},[(0,e.h)("div",{class:"q-pagination__content row no-wrap items-center",style:v.value},[...a,t.input?(0,e.h)(dl,{class:"inline",style:{width:u.value.length/1.5+"em"},type:"number",dense:!0,value:f.value,disable:t.disable,dark:r.value,borderless:!0,inputClass:t.inputClass,inputStyle:t.inputStyle,placeholder:u.value,min:o.value,max:s.value,"onUpdate:modelValue":E,onKeyup:A,onBlur:P}):(0,e.h)("div",{class:"q-pagination__middle row justify-center"},n),...l])])}}});function Kl(e){let t=null,n=null,a=null;function i(...i){n=i,a=this,null===t&&(t=window.requestAnimationFrame(()=>{e.apply(a,n),t=null,n=null,a=null}))}return i.cancel=()=>{null!==t&&(window.cancelAnimationFrame(t),t=null),n=null,a=null},i}let{passive:Yl}=m,Ql=["load","loadstart","loadedmetadata"];var Zl=h({name:"QParallax",props:{src:String,height:{type:Number,default:500},speed:{type:Number,default:1,validator:e=>e>=0&&e<=1},scrollTarget:Cn,onScroll:Function},setup(t,{slots:n,emit:a}){let i,r,o,s,l,u=(0,e.ref)(0),c=(0,e.ref)(null),d=(0,e.ref)(null),h=(0,e.ref)(null),p=!1;(0,e.watch)(()=>t.height,()=>{p&&m()}),(0,e.watch)(()=>t.scrollTarget,()=>{p&&(b(),v())});let f=e=>{u.value=e,void 0!==t.onScroll&&a("scroll",e)};function m(){let e,n,a;l===window?(e=0,a=n=window.innerHeight):(e=St(l).top,n=Ct(l),a=e+n);let i=St(c.value).top,o=i+t.height;if(void 0!==s||o>e&&i{i.style.transform=`translate3d(-50%,${Math.round(e)}px,0)`};function g(){r=i.naturalHeight||i.videoHeight||Ct(i),p&&m()}function v(){p=!0,l=Pn(c.value,t.scrollTarget),l.addEventListener("scroll",m,Yl),window.addEventListener("resize",o,Yl),m()}function b(){p&&(p=!1,l.removeEventListener("scroll",m,Yl),window.removeEventListener("resize",o,Yl),l=void 0,_.cancel(),f.cancel(),o.cancel())}return(0,e.onMounted)(()=>{_=Kl(_),f=Kl(f),o=Kl(g),i=void 0===n.media?h.value:d.value.children[0],Ql.forEach(e=>{i.addEventListener(e,g)}),g(),i.style.display="initial",void 0===window.IntersectionObserver?v():(s=new IntersectionObserver(e=>{(e[0].isIntersecting?v:b)()}),s.observe(c.value))}),(0,e.onBeforeUnmount)(()=>{b(),s?.disconnect(),Ql.forEach(e=>{i.removeEventListener(e,g)})}),()=>(0,e.h)("div",{ref:c,class:"q-parallax",style:{height:`${t.height}px`}},[(0,e.h)("div",{ref:d,class:"q-parallax__media absolute-full"},void 0===n.media?[(0,e.h)("img",{ref:h,src:t.src})]:n.media()),(0,e.h)("div",{class:"q-parallax__content absolute-full column flex-center"},void 0===n.content?Ae(n.default):n.content({percentScrolled:u.value}))])}});function Jl(e,t=new WeakMap){if(Object(e)!==e)return e;if(t.has(e))return t.get(e);let n=e instanceof Date?new Date(e):e instanceof RegExp?new RegExp(e.source,e.flags):e instanceof Set?new Set:e instanceof Map?new Map:"function"==typeof e.constructor?void 0!==e.prototype&&"function"==typeof e.prototype.constructor?e:new e.constructor:Object.create(null);if("function"==typeof e.constructor&&"function"==typeof e.valueOf){let n=e.valueOf();if(Object(n)!==n){let a=new e.constructor(n);return t.set(e,a),a}}return t.set(e,n),e instanceof Set?e.forEach(e=>{n.add(Jl(e,t))}):e instanceof Map&&e.forEach((e,a)=>{n.set(a,Jl(e,t))}),Object.assign(n,...Object.keys(e).map(n=>({[n]:Jl(e[n],t)})))}var Xl=h({name:"QPopupEdit",props:{modelValue:{required:!0},title:String,buttons:Boolean,labelSet:String,labelCancel:String,color:{type:String,default:"primary"},validate:{type:Function,default:()=>!0},autoSave:Boolean,cover:{type:Boolean,default:!0},disable:Boolean},emits:["update:modelValue","save","cancel","beforeShow","show","beforeHide","hide"],setup(t,{slots:n,emit:i}){let{proxy:r}=(0,e.getCurrentInstance)(),{$q:o}=r,s=(0,e.ref)(null),l=(0,e.ref)(""),u=(0,e.ref)(""),c=!1,d=(0,e.computed)(()=>a({initialValue:l.value,validate:t.validate,set:h,cancel:p,updatePosition:f},"value",()=>u.value,e=>{u.value=e}));function h(){t.validate(u.value)&&(m()&&(i("save",u.value,l.value),i("update:modelValue",u.value)),_())}function p(){m()&&i("cancel",u.value,l.value),_()}function f(){(0,e.nextTick)(()=>{s.value.updatePosition()})}function m(){return!te(u.value,l.value)}function _(){c=!0,s.value.hide()}function g(){c=!1,l.value=Jl(t.modelValue),u.value=Jl(t.modelValue),i("beforeShow")}function v(){i("show")}function b(){!c&&m()&&(t.autoSave&&t.validate(u.value)?(i("save",u.value,l.value),i("update:modelValue",u.value)):i("cancel",u.value,l.value)),i("beforeHide")}function y(){i("hide")}function w(){let a=void 0===n.default?[]:[n.default(d.value)].flat();return t.title&&a.unshift((0,e.h)("div",{class:"q-dialog__title q-mt-sm q-mb-sm"},t.title)),t.buttons&&a.push((0,e.h)("div",{class:"q-popup-edit__buttons row justify-center no-wrap"},[(0,e.h)(Kt,{flat:!0,color:t.color,label:t.labelCancel||o.lang.label.cancel,onClick:p}),(0,e.h)(Kt,{flat:!0,color:t.color,label:t.labelSet||o.lang.label.set,onClick:h})])),a}return Object.assign(r,{set:h,cancel:p,show(e){s.value?.show(e)},hide(e){s.value?.hide(e)},updatePosition:f}),()=>{if(!t.disable)return(0,e.h)(ma,{ref:s,class:"q-popup-edit",cover:t.cover,onBeforeShow:g,onShow:v,onBeforeHide:b,onHide:y,onEscapeKey:p},w)}}}),eu=h({name:"QPopupProxy",props:{...Jt,breakpoint:{type:[String,Number],default:450}},emits:["show","hide"],setup(t,{slots:n,emit:i,attrs:r}){let{proxy:o}=(0,e.getCurrentInstance)(),{$q:s}=o,l=(0,e.ref)(!1),u=(0,e.ref)(null),c=(0,e.computed)(()=>Number.parseInt(t.breakpoint,10)),{canShow:d}=Xt({showing:l,avoidEmit:!0});function h(){return s.screen.width"menu"===p.value?{maxHeight:"99vh"}:{});function m(e){l.value=!0,i("show",e)}function _(e){l.value=!1,p.value=h(),i("hide",e)}return(0,e.watch)(()=>h(),e=>{l.value||(p.value=e)}),Object.assign(o,{show(e){d(e)&&u.value.show(e)},hide(e){u.value.hide(e)},toggle(e){u.value.toggle(e)}}),a(o,"currentComponent",()=>({type:p.value,ref:u.value})),()=>{let a,i={ref:u,...f.value,...r,onShow:m,onHide:_};return"dialog"===p.value?a=Po:(a=ma,Object.assign(i,{target:t.target,contextMenu:t.contextMenu,noParentEvent:!0,separateClosePopup:!0})),(0,e.h)(a,i,n.default)}}}),tu=h({name:"QPullToRefresh",props:{color:String,bgColor:String,icon:String,noMouse:Boolean,disable:Boolean,scrollTarget:Cn},emits:["refresh"],setup(t,{slots:n,emit:a}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:r}=i,o=(0,e.ref)("pull"),s=(0,e.ref)(0),l=(0,e.ref)(!1),u=(0,e.ref)(-40),c=(0,e.ref)(!1),d=(0,e.ref)({}),h=(0,e.computed)(()=>({opacity:s.value,transform:`translateY(${u.value}px) rotate(${360*s.value}deg)`})),p=(0,e.computed)(()=>"q-pull-to-refresh__puller row flex-center"+(c.value?" q-pull-to-refresh__puller--animating":"")+(void 0===t.bgColor?"":` bg-${t.bgColor}`));function f(e){if(e.isFinal)return void(l.value&&(l.value=!1,"pulled"===o.value?(o.value="refreshing",w({pos:20}),g()):"pull"===o.value&&w({pos:-40,ratio:0})));if(c.value||"refreshing"===o.value)return!1;if(e.isFirst){if(0!==An(v)||"down"!==e.direction)return l.value&&(l.value=!1,o.value="pull",w({pos:-40,ratio:0})),!1;l.value=!0;let{top:t,left:n}=i.$el.getBoundingClientRect();d.value={top:t+"px",left:n+"px",width:window.getComputedStyle(i.$el).getPropertyValue("width")}}y(e.evt);let t=Math.min(140,Math.max(0,e.distance.y));u.value=t-40,s.value=_e(t/60,0,1);let n=u.value>20?"pulled":"pull";o.value!==n&&(o.value=n)}let m=(0,e.computed)(()=>{let e={down:!0};return t.noMouse||(e.mouse=!0),[[gi,f,void 0,e]]}),_=(0,e.computed)(()=>"q-pull-to-refresh__content"+(l.value?" no-pointer-events":""));function g(){a("refresh",()=>{w({pos:-40,ratio:0},()=>{o.value="pull"})})}let v,b=null;function w({pos:e,ratio:t},n){c.value=!0,u.value=e,void 0!==t&&(s.value=t),null!==b&&clearTimeout(b),b=setTimeout(()=>{b=null,c.value=!1,n?.()},300)}function k(){v=Pn(i.$el,t.scrollTarget)}return(0,e.watch)(()=>t.scrollTarget,k),(0,e.onMounted)(k),(0,e.onBeforeUnmount)(()=>{null!==b&&clearTimeout(b)}),Object.assign(i,{trigger:g,updateScrollTarget:k}),()=>ze("div",{class:"q-pull-to-refresh"},[(0,e.h)("div",{class:_.value},Ae(n.default)),(0,e.h)("div",{class:"q-pull-to-refresh__puller-container fixed row flex-center no-pointer-events z-top",style:d.value},[(0,e.h)("div",{class:p.value,style:h.value},["refreshing"===o.value?(0,e.h)(xt,{size:"24px",color:t.color}):(0,e.h)(Ke,{name:t.icon||r.iconSet.pullToRefresh.icon,color:t.color,size:"32px"})])])],"main",!t.disable,()=>m.value)}});let nu=0,au=1,iu=2;var ru=h({name:"QRange",props:{...wi,modelValue:{type:Object,default:()=>({min:null,max:null}),validator:e=>"min"in e&&"max"in e},dragRange:Boolean,dragOnlyRange:Boolean,leftLabelColor:String,leftLabelTextColor:String,rightLabelColor:String,rightLabelTextColor:String,leftLabelValue:[String,Number],rightLabelValue:[String,Number],leftThumbColor:String,rightThumbColor:String},emits:ki,setup(t,{emit:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),{state:i,methods:r}=xi({updateValue:T,updatePosition:function(e,n=i.dragging.value){let a,o=r.getDraggingRatio(e,n),c=r.convertRatioToModel(o);switch(n.type){case nu:o<=n.ratioMax?(a={minR:o,maxR:n.ratioMax,min:c,max:n.valueMax},i.focus.value="min"):(a={minR:n.ratioMax,maxR:o,min:n.valueMax,max:c},i.focus.value="max");break;case iu:o>=n.ratioMin?(a={minR:n.ratioMin,maxR:o,min:n.valueMin,max:c},i.focus.value="max"):(a={minR:o,maxR:n.ratioMin,min:c,max:n.valueMin},i.focus.value="min");break;case au:{let e=o-n.offsetRatio,t=_e(n.ratioMin+e,i.innerMinRatio.value,i.innerMaxRatio.value-n.rangeRatio),r=c-n.offsetModel,s=_e(n.valueMin+r,i.innerMin.value,i.innerMax.value-n.rangeValue);a={minR:t,maxR:t+n.rangeRatio,min:i.roundValueFn.value(s),max:i.roundValueFn.value(s+n.rangeValue)},i.focus.value="both";break}}u.value=null===u.value.min||null===u.value.max?{min:a.min??t.min,max:a.max??t.max}:{min:a.min,max:a.max},t.snap&&0!==t.step?(s.value=r.convertModelToRatio(u.value.min),l.value=r.convertModelToRatio(u.value.max)):(s.value=a.minR,l.value=a.maxR)},getDragging:function(e){let{left:n,top:a,width:i,height:s}=o.value.getBoundingClientRect(),l=t.dragOnlyRange?0:t.vertical?y.value.offsetHeight/(2*s):y.value.offsetWidth/(2*i),c={left:n,top:a,width:i,height:s,valueMin:u.value.min,valueMax:u.value.max,ratioMin:d.value,ratioMax:h.value},p=r.getDraggingRatio(e,c);return!t.dragOnlyRange&&p({type:"hidden",name:t.name,value:`${t.modelValue.min}|${t.modelValue.max}`}))}),o=(0,e.ref)(null),s=(0,e.ref)(0),l=(0,e.ref)(0),u=(0,e.ref)({min:0,max:0});function c(){u.value.min=null===t.modelValue.min?i.innerMin.value:_e(t.modelValue.min,i.innerMin.value,i.innerMax.value),u.value.max=null===t.modelValue.max?i.innerMax.value:_e(t.modelValue.max,i.innerMin.value,i.innerMax.value)}(0,e.watch)(()=>`${t.modelValue.min}|${t.modelValue.max}|${i.innerMin.value}|${i.innerMax.value}`,c),c();let d=(0,e.computed)(()=>r.convertModelToRatio(u.value.min)),h=(0,e.computed)(()=>r.convertModelToRatio(u.value.max)),p=(0,e.computed)(()=>i.active.value?s.value:d.value),f=(0,e.computed)(()=>i.active.value?l.value:h.value),m=(0,e.computed)(()=>{let e={[i.positionProp.value]:100*p.value+"%",[i.sizeProp.value]:100*(f.value-p.value)+"%"};return void 0!==t.selectionImg&&(e.backgroundImage=`url(${t.selectionImg}) !important`),e}),_=(0,e.computed)(()=>{if(!i.editable.value)return{};if(a.platform.is.mobile)return{onClick:r.onMobileClick};let e={onMousedown:r.onActivate};return(t.dragRange||t.dragOnlyRange)&&Object.assign(e,{onFocus:()=>{i.focus.value="both"},onBlur:r.onBlur,onKeydown:P,onKeyup:r.onKeyup}),e});function g(e){return a.platform.is.mobile||!i.editable.value||t.dragOnlyRange?{}:{onFocus:()=>{i.focus.value=e},onBlur:r.onBlur,onKeydown:P,onKeyup:r.onKeyup}}let v=(0,e.computed)(()=>t.dragOnlyRange?null:i.tabindex.value),b=(0,e.computed)(()=>a.platform.is.mobile||!t.dragRange&&!t.dragOnlyRange?null:i.tabindex.value),y=(0,e.ref)(null),k=(0,e.computed)(()=>g("min")),x=r.getThumbRenderFn({focusValue:"min",getNodeData:()=>({ref:y,key:"tmin",...k.value,tabindex:v.value}),ratio:p,label:(0,e.computed)(()=>void 0===t.leftLabelValue?u.value.min:t.leftLabelValue),thumbColor:(0,e.computed)(()=>t.leftThumbColor||t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.leftLabelColor||t.labelColor),labelTextColor:(0,e.computed)(()=>t.leftLabelTextColor||t.labelTextColor)}),S=(0,e.computed)(()=>g("max")),C=r.getThumbRenderFn({injectFormInput:!1,focusValue:"max",getNodeData:()=>({...S.value,key:"tmax",tabindex:v.value}),ratio:f,label:(0,e.computed)(()=>void 0===t.rightLabelValue?u.value.max:t.rightLabelValue),thumbColor:(0,e.computed)(()=>t.rightThumbColor||t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.rightLabelColor||t.labelColor),labelTextColor:(0,e.computed)(()=>t.rightLabelTextColor||t.labelTextColor)});function T(e){(u.value.min!==t.modelValue.min||u.value.max!==t.modelValue.max)&&n("update:modelValue",{...u.value}),e&&n("change",{...u.value})}function P(e){if(!yi.includes(e.keyCode))return;w(e);let n=([34,33].includes(e.keyCode)?10:1)*i.keyStep.value,a=([34,37,40].includes(e.keyCode)?-1:1)*(i.isReversed.value?-1:1)*(t.vertical?-1:1)*n;if("both"===i.focus.value){let e=u.value.max-u.value.min,t=_e(i.roundValueFn.value(u.value.min+a),i.innerMin.value,i.innerMax.value-e);u.value={min:t,max:i.roundValueFn.value(t+e)}}else{if(!i.focus.value)return;{let e=i.focus.value;u.value={...u.value,[e]:_e(i.roundValueFn.value(u.value[e]+a),"min"===e?i.innerMin.value:u.value.min,"max"===e?i.innerMax.value:u.value.max)}}}T()}return()=>{let n=r.getContent(m,b,_,e=>{e.push(x(),C())});return(0,e.h)("div",{ref:o,class:"q-range "+i.classes.value+(null===t.modelValue.min||null===t.modelValue.max?" q-slider--no-value":""),...i.attributes.value,"aria-valuenow":t.modelValue.min+"|"+t.modelValue.max},n)}}}),ou=h({name:"QRating",props:{...Pe,...wa,modelValue:{type:Number,required:!0},max:{type:[String,Number],default:5},icon:[String,Array],iconHalf:[String,Array],iconSelected:[String,Array],iconAriaLabel:[String,Array],color:[String,Array],colorHalf:[String,Array],colorSelected:[String,Array],noReset:Boolean,noDimming:Boolean,readonly:Boolean,disable:Boolean},emits:["update:modelValue"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),r=Ee(t),o=xa(ka(t)),s=(0,e.ref)(0),l={},u=(0,e.computed)(()=>!t.readonly&&!t.disable),c=(0,e.computed)(()=>`q-rating row inline items-center q-rating--${u.value?"":"non-"}editable`+(t.noDimming?" q-rating--no-dimming":"")+(t.disable?" disabled":"")+(void 0===t.color||Array.isArray(t.color)?"":` text-${t.color}`)),d=(0,e.computed)(()=>{let e=Array.isArray(t.icon)?t.icon.length:0,n=Array.isArray(t.iconSelected)?t.iconSelected.length:0,a=Array.isArray(t.iconHalf)?t.iconHalf.length:0,i=Array.isArray(t.color)?t.color.length:0,r=Array.isArray(t.colorSelected)?t.colorSelected.length:0,o=Array.isArray(t.colorHalf)?t.colorHalf.length:0;return{iconLen:e,icon:e>0?t.icon[e-1]:t.icon,selIconLen:n,selIcon:n>0?t.iconSelected[n-1]:t.iconSelected,halfIconLen:a,halfIcon:a>0?t.iconHalf[a-1]:t.iconHalf,colorLen:i,color:i>0?t.color[i-1]:t.color,selColorLen:r,selColor:r>0?t.colorSelected[r-1]:t.colorSelected,halfColorLen:o,halfColor:o>0?t.colorHalf[o-1]:t.colorHalf}}),h=(0,e.computed)(()=>{if("string"==typeof t.iconAriaLabel){let e=0===t.iconAriaLabel.length?"":`${t.iconAriaLabel} `;return t=>`${e}${t}`}if(Array.isArray(t.iconAriaLabel)){let e=t.iconAriaLabel.length;if(e>0)return n=>t.iconAriaLabel[Math.min(n,e)-1]}return(e,t)=>`${t} ${e}`}),p=(0,e.computed)(()=>{let e=[],n=d.value,a=Math.ceil(t.modelValue),r=Number.isInteger(t.modelValue)&&t.modelValue>=1&&t.modelValue<=t.max?t.modelValue:1,o=void 0===t.iconHalf||a===t.modelValue?-1:a;for(let l=1;l<=t.max;l++){let c=0===s.value&&t.modelValue>=l||s.value>0&&s.value>=l,d=o===l&&s.value0&&(d?a:t.modelValue)>=l&&s.value{let e={role:"radiogroup"};return t.disable&&(e["aria-disabled"]="true"),t.readonly&&(e["aria-readonly"]="true"),e});function m(e){if(u.value){let n=_e(Number.parseInt(e,10),1,Number.parseInt(t.max,10)),i=t.noReset||t.modelValue!==n?n:0;i!==t.modelValue&&a("update:modelValue",i),s.value=0}}function _(e){u.value&&(s.value=e)}function g(e,t){switch(e.keyCode){case 13:case 32:return m(t),w(e);case 37:{let n=t+(i.lang.rtl?1:-1);return l[`rt${n}`]&&l[`rt${n}`].focus(),w(e)}case 39:{let n=t+(i.lang.rtl?-1:1);return l[`rt${n}`]&&l[`rt${n}`].focus(),w(e)}case 40:return l["rt"+(t-1)]&&l["rt"+(t-1)].focus(),w(e);case 38:return l[`rt${t+1}`]&&l[`rt${t+1}`].focus(),w(e)}}function v(){s.value=0}return(0,e.onBeforeUpdate)(()=>{l={}}),()=>{let a=[];return p.value.forEach(({iconClass:t,name:i,attrs:r},o)=>{let s=o+1;a.push((0,e.h)("div",{key:s,ref:e=>{l[`rt${s}`]=e},class:"q-rating__icon-container flex flex-center",...r,onClick(){m(s)},onMouseover(){_(s)},onMouseout:v,onFocus(){_(s)},onBlur:v,onKeydown(e){g(e,s)}},Me(n[`tip-${s}`],[(0,e.h)(Ke,{class:t,name:i})])))}),void 0!==t.name&&!t.disable&&o(a,"push"),(0,e.h)("div",{class:c.value,style:r.value,...f.value},a)}}}),su=h({name:"QResponsive",props:$s,setup(t,{slots:n}){let a=Hs(t);return()=>(0,e.h)("div",{class:"q-responsive"},[(0,e.h)("div",{class:"q-responsive__filler overflow-hidden"},[(0,e.h)("div",{style:a.value})]),(0,e.h)("div",{class:"q-responsive__content absolute-full fit"},Ae(n.default))])}}),lu=h({props:["store","barStyle","verticalBarStyle","horizontalBarStyle"],setup:t=>()=>[(0,e.h)("div",{class:t.store.scroll.vertical.barClass.value,style:[t.barStyle,t.verticalBarStyle],"aria-hidden":"true",onMousedown:t.store.onVerticalMousedown}),(0,e.h)("div",{class:t.store.scroll.horizontal.barClass.value,style:[t.barStyle,t.horizontalBarStyle],"aria-hidden":"true",onMousedown:t.store.onHorizontalMousedown}),(0,e.withDirectives)((0,e.h)("div",{ref:t.store.scroll.vertical.ref,class:t.store.scroll.vertical.thumbClass.value,style:t.store.scroll.vertical.style.value,"aria-hidden":"true"}),t.store.thumbVertDir),(0,e.withDirectives)((0,e.h)("div",{ref:t.store.scroll.horizontal.ref,class:t.store.scroll.horizontal.thumbClass.value,style:t.store.scroll.horizontal.style.value,"aria-hidden":"true"}),t.store.thumbHorizDir)]});let uu=["vertical","horizontal"],cu={vertical:{offset:"offsetY",scroll:"scrollTop",dir:"down",dist:"y"},horizontal:{offset:"offsetX",scroll:"scrollLeft",dir:"right",dist:"x"}},du={prevent:!0,mouse:!0,mouseAllDir:!0},hu=e=>e>=250?50:Math.ceil(e/5);var pu=h({name:"QScrollArea",props:{...Je,thumbStyle:Object,verticalThumbStyle:Object,horizontalThumbStyle:Object,barStyle:[Array,String,Object],verticalBarStyle:[Array,String,Object],horizontalBarStyle:[Array,String,Object],verticalOffset:{type:Array,default:()=>[0,0]},horizontalOffset:{type:Array,default:()=>[0,0]},contentStyle:[Array,String,Object],contentActiveStyle:[Array,String,Object],delay:{type:[String,Number],default:1e3},visible:{type:Boolean,default:null},tabindex:[String,Number],onScroll:Function},setup(t,{slots:n,emit:a}){let i,r=(0,e.ref)(!1),o=(0,e.ref)(!1),s=(0,e.ref)(!1),l={vertical:(0,e.ref)(0),horizontal:(0,e.ref)(0)},u={vertical:{ref:(0,e.ref)(null),position:(0,e.ref)(0),size:(0,e.ref)(0)},horizontal:{ref:(0,e.ref)(null),position:(0,e.ref)(0),size:(0,e.ref)(0)}},{proxy:c}=(0,e.getCurrentInstance)(),d=Xe(t,c.$q),h=null,p=(0,e.ref)(null),f=(0,e.computed)(()=>"q-scrollarea"+(d.value?" q-scrollarea--dark":""));Object.assign(l,{verticalInner:(0,e.computed)(()=>l.vertical.value-t.verticalOffset[0]-t.verticalOffset[1]),horizontalInner:(0,e.computed)(()=>l.horizontal.value-t.horizontalOffset[0]-t.horizontalOffset[1])}),u.vertical.percentage=(0,e.computed)(()=>{let e=u.vertical.size.value-l.vertical.value;if(e<=0)return 0;let t=_e(u.vertical.position.value/e,0,1);return Math.round(1e4*t)/1e4}),u.vertical.thumbHidden=(0,e.computed)(()=>!(null===t.visible?s.value:t.visible)&&!r.value&&!o.value||u.vertical.size.value<=l.vertical.value+1),u.vertical.thumbStart=(0,e.computed)(()=>t.verticalOffset[0]+u.vertical.percentage.value*(l.verticalInner.value-u.vertical.thumbSize.value)),u.vertical.thumbSize=(0,e.computed)(()=>Math.round(_e(l.verticalInner.value*l.verticalInner.value/u.vertical.size.value,hu(l.verticalInner.value),l.verticalInner.value))),u.vertical.style=(0,e.computed)(()=>({...t.thumbStyle,...t.verticalThumbStyle,top:`${u.vertical.thumbStart.value}px`,height:`${u.vertical.thumbSize.value}px`,right:`${t.horizontalOffset[1]}px`})),u.vertical.thumbClass=(0,e.computed)(()=>"q-scrollarea__thumb q-scrollarea__thumb--v absolute-right"+(u.vertical.thumbHidden.value?" q-scrollarea__thumb--invisible":"")),u.vertical.barClass=(0,e.computed)(()=>"q-scrollarea__bar q-scrollarea__bar--v absolute-right"+(u.vertical.thumbHidden.value?" q-scrollarea__bar--invisible":"")),u.horizontal.percentage=(0,e.computed)(()=>{let e=u.horizontal.size.value-l.horizontal.value;if(e<=0)return 0;let t=_e(P(u.horizontal.position.value)/e,0,1);return Math.round(1e4*t)/1e4}),u.horizontal.thumbHidden=(0,e.computed)(()=>!(null===t.visible?s.value:t.visible)&&!r.value&&!o.value||u.horizontal.size.value<=l.horizontal.value+1),u.horizontal.thumbStart=(0,e.computed)(()=>t.horizontalOffset[+!!c.$q.lang.rtl]+u.horizontal.percentage.value*(l.horizontalInner.value-u.horizontal.thumbSize.value)),u.horizontal.thumbSize=(0,e.computed)(()=>Math.round(_e(l.horizontalInner.value*l.horizontalInner.value/u.horizontal.size.value,hu(l.horizontalInner.value),l.horizontalInner.value))),u.horizontal.style=(0,e.computed)(()=>({...t.thumbStyle,...t.horizontalThumbStyle,[c.$q.lang.rtl?"right":"left"]:`${u.horizontal.thumbStart.value}px`,width:`${u.horizontal.thumbSize.value}px`,bottom:`${t.verticalOffset[1]}px`})),u.horizontal.thumbClass=(0,e.computed)(()=>"q-scrollarea__thumb q-scrollarea__thumb--h absolute-bottom"+(u.horizontal.thumbHidden.value?" q-scrollarea__thumb--invisible":"")),u.horizontal.barClass=(0,e.computed)(()=>"q-scrollarea__bar q-scrollarea__bar--h absolute-bottom"+(u.horizontal.thumbHidden.value?" q-scrollarea__bar--invisible":""));let m=(0,e.computed)(()=>u.vertical.thumbHidden.value&&u.horizontal.thumbHidden.value?t.contentStyle:t.contentActiveStyle);function _(){let e={};return uu.forEach(t=>{let n=u[t];Object.assign(e,{[t+"Position"]:n.position.value,[t+"Percentage"]:n.percentage.value,[t+"Size"]:n.size.value,[t+"ContainerSize"]:l[t].value,[t+"ContainerInnerSize"]:l[t+"Inner"].value})}),e}let g=T(()=>{let e=_();e.ref=c,a("scroll",e)},0);function v(e,t,n){uu.includes(e)?("vertical"===e?Nn:On)(p.value,t,n):console.error("[QScrollArea]: wrong first param of setScrollPosition (vertical/horizontal)")}function b({height:e,width:t}){let n=!1;l.vertical.value!==e&&(l.vertical.value=e,n=!0),l.horizontal.value!==t&&(l.horizontal.value=t,n=!0),n&&S()}function y({position:e}){let t=!1;u.vertical.position.value!==e.top&&(u.vertical.position.value=e.top,t=!0),u.horizontal.position.value!==e.left&&(u.horizontal.position.value=e.left,t=!0),t&&S()}function w({height:e,width:t}){u.horizontal.size.value!==t&&(u.horizontal.size.value=t,S()),u.vertical.size.value!==e&&(u.vertical.size.value=e,S())}function k(e,t){let n=u[t];if(e.isFirst){if(n.thumbHidden.value)return;i="horizontal"===t?P(n.position.value):n.position.value,o.value=!0}else if(!o.value)return;e.isFinal&&(o.value=!1);let a=cu[t],r=(n.size.value-l[t].value)/(l[t+"Inner"].value-n.thumbSize.value),s=e.distance[a.dist],d=(e.direction===a.dir?1:-1)*("horizontal"===t&&c.$q.lang.rtl?-1:1),h=i+d*s*r;C("horizontal"===t?E(h):h,t)}function x(e,n){let a=u[n];if(!a.thumbHidden.value){let i="horizontal"===n&&c.$q.lang.rtl,r="vertical"===n?t.verticalOffset[0]:t.horizontalOffset[+!!i],o=(i?l.horizontal.value-e.offsetX:e[cu[n].offset])-r,s=a.thumbStart.value-r;if(os+a.thumbSize.value){let e=_e((o-a.thumbSize.value/2)/(l[n+"Inner"].value-a.thumbSize.value),0,1);C(i?E(e*Math.max(0,a.size.value-l[n].value)):e*Math.max(0,a.size.value-l[n].value),n)}null!==a.ref.value&&a.ref.value.dispatchEvent(new MouseEvent(e.type,e))}}function S(){r.value=!0,null!==h&&clearTimeout(h),h=setTimeout(()=>{h=null,r.value=!1},t.delay),void 0!==t.onScroll&&g()}function C(e,t){p.value[cu[t].scroll]=e}function P(e,t=c.$q.lang.rtl){return t?Li?Math.max(0,u.horizontal.size.value-l.horizontal.value)-e:-e:e}function E(e,t=c.$q.lang.rtl){return t?Li?Math.max(0,u.horizontal.size.value-l.horizontal.value)-e:-e:e}let A=null;function L(){null!==A&&clearTimeout(A),A=setTimeout(()=>{A=null,s.value=!0},c.$q.platform.is.ios?50:0)}function M(){null!==A&&(clearTimeout(A),A=null),s.value=!1}let R=null;(0,e.watch)(()=>c.$q.lang.rtl,(e,t)=>{null!==p.value&&On(p.value,E(P(u.horizontal.position.value,t),e))}),(0,e.onDeactivated)(()=>{R={top:u.vertical.position.value,left:u.horizontal.position.value}}),(0,e.onActivated)(()=>{if(null===R)return;let e=p.value;null!==e&&(On(e,R.left),Nn(e,R.top))}),(0,e.onBeforeUnmount)(g.cancel),Object.assign(c,{getScrollTarget:()=>p.value,getScroll:_,getScrollPosition:()=>({top:u.vertical.position.value,left:u.horizontal.position.value}),getScrollPercentage:()=>({top:u.vertical.percentage.value,left:u.horizontal.percentage.value}),setScrollPosition:v,setScrollPercentage(e,t,n){let a=t*(u[e].size.value-l[e].value);v(e,"horizontal"===e?E(a):a,n)}});let z={scroll:u,thumbVertDir:[[gi,e=>{k(e,"vertical")},void 0,{vertical:!0,...du}]],thumbHorizDir:[[gi,e=>{k(e,"horizontal")},void 0,{horizontal:!0,...du}]],onVerticalMousedown(e){x(e,"vertical")},onHorizontalMousedown(e){x(e,"horizontal")}};return()=>(0,e.h)("div",{class:f.value,onMouseenter:L,onMouseleave:M},[(0,e.h)("div",{ref:p,class:"q-scrollarea__container scroll relative-position fit hide-scrollbar",tabindex:void 0===t.tabindex?void 0:t.tabindex},[(0,e.h)("div",{class:"q-scrollarea__content absolute",style:m.value},Me(n.default,[(0,e.h)(Ai,{debounce:0,onResize:w})])),(0,e.h)(Sl,{axis:"both",onScroll:y})]),(0,e.h)(Ai,{debounce:0,onResize:b}),(0,e.h)(lu,{store:z,barStyle:t.barStyle,verticalBarStyle:t.verticalBarStyle,horizontalBarStyle:t.horizontalBarStyle})])}});let fu=1e3,mu=["start","center","end","start-force","center-force","end-force"],_u=Array.prototype.filter,gu=void 0===window.getComputedStyle(document.body).overflowAnchor?_:function(e,t){null!==e&&(void 0!==e._qOverflowAnimationFrame&&cancelAnimationFrame(e._qOverflowAnimationFrame),e._qOverflowAnimationFrame=requestAnimationFrame(()=>{if(null===e)return;e._qOverflowAnimationFrame=void 0;let n=e.children||[];_u.call(n,e=>e.dataset&&void 0!==e.dataset.qVsAnchor).forEach(e=>{delete e.dataset.qVsAnchor});let a=n[t];a?.dataset&&(a.dataset.qVsAnchor="")}))};function vu(e,t){return e+t}function bu(e,t,n,a,i,r,o,s){let l=e===window?document.scrollingElement||document.documentElement:e,u=i?"offsetWidth":"offsetHeight",c={scrollStart:0,scrollViewSize:-o-s,scrollMaxSize:0,offsetStart:-o,offsetEnd:-s};if(i?(e===window?(c.scrollStart=window.pageXOffset||window.scrollX||document.body.scrollLeft||0,c.scrollViewSize+=document.documentElement.clientWidth):(c.scrollStart=l.scrollLeft,c.scrollViewSize+=l.clientWidth),c.scrollMaxSize=l.scrollWidth,r&&(c.scrollStart=(Li?c.scrollMaxSize-c.scrollViewSize:0)-c.scrollStart)):(e===window?(c.scrollStart=window.pageYOffset||window.scrollY||document.body.scrollTop||0,c.scrollViewSize+=document.documentElement.clientHeight):(c.scrollStart=l.scrollTop,c.scrollViewSize+=l.clientHeight),c.scrollMaxSize=l.scrollHeight),null!==n)for(let e=n.previousElementSibling;null!==e;e=e.previousElementSibling)e.classList.contains("q-virtual-scroll--skip")||(c.offsetStart+=e[u]);if(null!==a)for(let e=a.nextElementSibling;null!==e;e=e.nextElementSibling)e.classList.contains("q-virtual-scroll--skip")||(c.offsetEnd+=e[u]);if(t!==e){let n=l.getBoundingClientRect(),a=t.getBoundingClientRect();i?(c.offsetStart+=a.left-n.left,c.offsetEnd-=a.width):(c.offsetStart+=a.top-n.top,c.offsetEnd-=a.height),e!==window&&(c.offsetStart+=c.scrollStart),c.offsetEnd+=c.scrollMaxSize-c.offsetStart}return c}function yu(e,t,n,a){"end"===t&&(t=(e===window?document.body:e)[n?"scrollWidth":"scrollHeight"]),e===window?n?(a&&(t=(Li?document.body.scrollWidth-document.documentElement.clientWidth:0)-t),window.scrollTo(t,window.pageYOffset||window.scrollY||document.body.scrollTop||0)):window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,t):n?(a&&(t=(Li?e.scrollWidth-e.offsetWidth:0)-t),e.scrollLeft=t):e.scrollTop=t}function wu(e,t,n,a){if(n>=a)return 0;let i=t.length,r=Math.floor(n/fu),o=Math.floor((a-1)/fu)+1,s=e.slice(r,o).reduce(vu,0);return n%fu!=0&&(s-=t.slice(r*fu,n).reduce(vu,0)),a%fu!=0&&a!==i&&(s-=t.slice(a,o*fu).reduce(vu,0)),s}let ku={virtualScrollSliceSize:{type:[Number,String],default:10},virtualScrollSliceRatioBefore:{type:[Number,String],default:1},virtualScrollSliceRatioAfter:{type:[Number,String],default:1},virtualScrollItemSize:{type:[Number,String],default:24},virtualScrollStickySizeStart:{type:[Number,String],default:0},virtualScrollStickySizeEnd:{type:[Number,String],default:0},tableColspan:[Number,String]},xu=Object.keys(ku),Su={virtualScrollHorizontal:Boolean,onVirtualScroll:Function,...ku};function Cu({virtualScrollLength:t,getVirtualScrollTarget:n,getVirtualScrollEl:a,virtualScrollItemSizeComputed:i}){let r,o,s,l,{props:u,emit:c,proxy:d}=(0,e.getCurrentInstance)(),{$q:h}=d,p=[],f=(0,e.ref)(0),m=(0,e.ref)(0),_=(0,e.ref)({}),g=(0,e.ref)(null),v=(0,e.ref)(null),b=(0,e.ref)(null),y=(0,e.ref)({from:0,to:0}),w=(0,e.computed)(()=>void 0===u.tableColspan?100:u.tableColspan);void 0===i&&(i=(0,e.computed)(()=>u.virtualScrollItemSize));let k=(0,e.computed)(()=>i.value+";"+u.virtualScrollHorizontal);function x(){L(o,!0)}function S(e){L(void 0===e?o:e)}function C(e,i){let r=n();if(null==r||8===r.nodeType)return;let l=bu(r,a(),g.value,v.value,u.virtualScrollHorizontal,h.lang.rtl,u.virtualScrollStickySizeStart,u.virtualScrollStickySizeEnd);s!==l.scrollViewSize&&M(l.scrollViewSize),P(r,l,Math.min(t.value-1,Math.max(0,Number.parseInt(e,10)||0)),0,mu.includes(i)?i:-1!==o&&e>o?"end":"start")}function P(e,n,a,i,o){let s="string"==typeof o&&o.includes("-force"),c=s?o.replace("-force",""):o,d=void 0===c?"start":c,g=Math.max(0,a-_.value[d]),v=g+_.value.total;v>t.value&&(v=t.value,g=Math.max(0,v-_.value.total)),r=n.scrollStart;let w=g!==y.value.from||v!==y.value.to;if(!w&&void 0===c)return void R(a);let{activeElement:k}=document,x=b.value;w&&null!==x&&x!==k&&x.contains(k)&&(x.addEventListener("focusout",A),setTimeout(()=>{x?.removeEventListener("focusout",A)},0)),gu(x,a-g);let S=void 0===c?0:l.slice(g,a).reduce(vu,0);if(w){let e=v>=y.value.from&&g<=y.value.to?y.value.to:v;y.value={from:g,to:e},f.value=wu(p,l,0,g),m.value=wu(p,l,v,t.value),requestAnimationFrame(()=>{y.value.to!==v&&r===n.scrollStart&&(y.value={from:y.value.from,to:v},m.value=wu(p,l,v,t.value))})}requestAnimationFrame(()=>{if(r!==n.scrollStart)return;w&&E(g);let t=l.slice(g,a).reduce(vu,0),o=t+n.offsetStart+f.value,d=o+l[a],p=o+i;if(void 0!==c){let e=t-S,i=n.scrollStart+e;p=!s&&ie.classList&&!e.classList.contains("q-virtual-scroll--skip")),r=i.length,o=u.virtualScrollHorizontal?e=>e.getBoundingClientRect().width:e=>e.offsetHeight,s=e;for(let e=0;e=u;e--)l[e]=s;let c=Math.floor((t.value-1)/fu);p=[];for(let e=0;e<=c;e++){let n=0,a=Math.min((e+1)*fu,t.value);for(let t=e*fu;t=0?(E(y.value.from),(0,e.nextTick)(()=>{C(n)})):z()}function M(e){if(void 0===e&&typeof window<"u"){let t=n();null!=t&&8!==t.nodeType&&(e=bu(t,a(),g.value,v.value,u.virtualScrollHorizontal,h.lang.rtl,u.virtualScrollStickySizeStart,u.virtualScrollStickySizeEnd).scrollViewSize)}s=e;let t=Number.parseFloat(u.virtualScrollSliceRatioBefore)||0,r=1+t+(Number.parseFloat(u.virtualScrollSliceRatioAfter)||0),o=void 0===e||e<=0?1:Math.ceil(e/i.value),l=Math.max(1,o,Math.ceil((u.virtualScrollSliceSize>0?u.virtualScrollSliceSize:10)/r));_.value={total:Math.ceil(l*r),start:Math.ceil(l*t),center:Math.ceil(l*(.5+t)),end:Math.ceil(l*(1+t)),view:o}}function R(e){o!==e&&(void 0!==u.onVirtualScroll&&c("virtualScroll",{index:e,from:y.value.from,to:y.value.to-1,direction:ek.value+";"+u.virtualScrollSliceRatioBefore+";"+u.virtualScrollSliceRatioAfter),()=>{M()}),(0,e.watch)(k,x),M();let z=T(function(){let e=n();if(null==e||8===e.nodeType)return;let i=bu(e,a(),g.value,v.value,u.virtualScrollHorizontal,h.lang.rtl,u.virtualScrollStickySizeStart,u.virtualScrollStickySizeEnd),o=t.value-1,c=i.scrollMaxSize-i.offsetStart-i.offsetEnd-m.value;if(r===i.scrollStart)return;if(i.scrollMaxSize<=0)return void P(e,i,0,0);s!==i.scrollViewSize&&M(i.scrollViewSize),E(y.value.from);let d=Math.floor(i.scrollMaxSize-Math.max(i.scrollViewSize,i.offsetEnd)-Math.min(l[o],i.scrollViewSize/2));if(d>0&&Math.ceil(i.scrollStart)>=d)return void P(e,i,o,i.scrollMaxSize-i.offsetEnd-p.reduce(vu,0));let _=0,b=i.scrollStart-i.offsetStart,w=b;if(b<=c&&b+i.scrollViewSize>=f.value)b-=f.value,_=y.value.from,w=b;else for(let e=0;b>=p[e]&&_0&&_-i.scrollViewSize?(_++,w=b):w=l[_]+b;P(e,i,_,w)},h.platform.is.ios?120:35);(0,e.onBeforeMount)(()=>{M()});let I=!1;return(0,e.onDeactivated)(()=>{I=!0}),(0,e.onActivated)(()=>{if(!I)return;let e=n();void 0!==r&&null!=e&&8!==e.nodeType?yu(e,r,u.virtualScrollHorizontal,h.lang.rtl):C(o)}),(0,e.onBeforeUnmount)(()=>{z.cancel()}),Object.assign(d,{scrollTo:C,reset:x,refresh:S}),{virtualScrollSliceRange:y,virtualScrollSliceSizeComputed:_,setVirtualScrollSize:M,onVirtualScrollEvt:z,localResetVirtualScroll:L,padVirtualScroll:function(t,n){let a=u.virtualScrollHorizontal?"width":"height",r={["--q-virtual-scroll-item-"+a]:i.value+"px"};return["tbody"===t?(0,e.h)(t,{class:"q-virtual-scroll__padding",key:"before",ref:g},[(0,e.h)("tr",[(0,e.h)("td",{style:{[a]:`${f.value}px`,...r},colspan:w.value})])]):(0,e.h)(t,{class:"q-virtual-scroll__padding",key:"before",ref:g,style:{[a]:`${f.value}px`,...r}}),(0,e.h)(t,{class:"q-virtual-scroll__content",key:"content",ref:b,tabindex:-1},n.flat()),"tbody"===t?(0,e.h)(t,{class:"q-virtual-scroll__padding",key:"after",ref:v},[(0,e.h)("tr",[(0,e.h)("td",{style:{[a]:`${m.value}px`,...r},colspan:w.value})])]):(0,e.h)(t,{class:"q-virtual-scroll__padding",key:"after",ref:v,style:{[a]:`${m.value}px`,...r}})]},scrollTo:C,reset:x,refresh:S}}let Tu=e=>["add","add-unique","toggle"].includes(e),Pu=Object.keys(xs);function Eu(e,t){if("function"==typeof e)return e;let n=void 0===e?t:e;return e=>"object"==typeof e&&e&&n in e?e[n]:e}var Au=h({name:"QSelect",inheritAttrs:!1,props:{...Su,...wa,...xs,modelValue:{required:!0},multiple:Boolean,displayValue:[String,Number],displayValueHtml:Boolean,dropdownIcon:String,options:{type:Array,default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],hideSelected:Boolean,hideDropdownIcon:Boolean,fillInput:Boolean,maxValues:[Number,String],optionsDense:Boolean,optionsDark:{type:Boolean,default:null},optionsSelectedClass:String,optionsHtml:Boolean,optionsCover:Boolean,menuShrink:Boolean,menuAnchor:String,menuSelf:String,menuOffset:Array,popupContentClass:String,popupContentStyle:[String,Array,Object],popupNoRouteDismiss:Boolean,useInput:Boolean,useChips:Boolean,newValueMode:{type:String,validator:Tu},mapOptions:Boolean,emitValue:Boolean,disableTabSelection:Boolean,inputDebounce:{type:[Number,String],default:500},inputClass:[Array,String,Object],inputStyle:[Array,String,Object],tabindex:{type:[String,Number],default:0},autocomplete:String,transitionShow:{},transitionHide:{},transitionDuration:{},behavior:{type:String,validator:e=>["default","menu","dialog"].includes(e),default:"default"},virtualScrollItemSize:Su.virtualScrollItemSize.type,onNewValue:Function,onFilter:Function},emits:[...Ss,"add","remove","inputValue","keyup","keypress","keydown","popupShow","popupHide","filterAbort"],setup(t,{slots:n,emit:a}){let i,r,o,s,l,u,c,{proxy:d}=(0,e.getCurrentInstance)(),{$q:h}=d,p=(0,e.ref)(!1),f=(0,e.ref)(!1),m=(0,e.ref)(-1),_=(0,e.ref)(""),g=(0,e.ref)(!1),v=(0,e.ref)(!1),k=null,x=null,S=null,C=(0,e.ref)(null),T=(0,e.ref)(null),P=(0,e.ref)(null),E=(0,e.ref)(null),A=(0,e.ref)(null),L=Sa(t),M=cl(Re),R=(0,e.computed)(()=>Array.isArray(t.options)?t.options.length:0),{virtualScrollSliceRange:z,virtualScrollSliceSizeComputed:O,localResetVirtualScroll:j,padVirtualScroll:D,onVirtualScrollEvt:q,scrollTo:B,setVirtualScrollSize:F}=Cu({virtualScrollLength:R,getVirtualScrollTarget:function(){return Ee()},getVirtualScrollEl:Ee,virtualScrollItemSizeComputed:(0,e.computed)(()=>void 0===t.virtualScrollItemSize?t.optionsDense?24:48:t.virtualScrollItemSize)}),V=Cs(),U=(0,e.computed)(()=>{let e=t.mapOptions&&!t.multiple,n=void 0===t.modelValue||null===t.modelValue&&!e?[]:t.multiple&&Array.isArray(t.modelValue)?t.modelValue:[t.modelValue];if(t.mapOptions&&Array.isArray(t.options)){let a=t.mapOptions&&void 0!==i?i:[],r=n.map(e=>function(e,n){let a=t=>te(ue.value(t),e);return t.options.find(a)||n.find(a)||e}(e,a));return null===t.modelValue&&e?r.filter(e=>null!==e):r}return n}),$=(0,e.computed)(()=>{let e={};return Pu.forEach(n=>{let a=t[n];void 0!==a&&(e[n]=a)}),e}),H=(0,e.computed)(()=>null===t.optionsDark?V.isDark.value:t.optionsDark),W=(0,e.computed)(()=>ws(U.value)),G=(0,e.computed)(()=>{let e="q-field__input q-placeholder col";return t.hideSelected||0===U.value.length?[e,t.inputClass]:(e+=" q-field__input--padding",void 0===t.inputClass?e:[e,t.inputClass])}),K=(0,e.computed)(()=>(t.virtualScrollHorizontal?"q-virtual-scroll--horizontal":"")+(t.popupContentClass?" "+t.popupContentClass:"")),Y=(0,e.computed)(()=>0===R.value),Q=(0,e.computed)(()=>U.value.map(e=>ce.value(e)).join(", ")),Z=(0,e.computed)(()=>void 0===t.displayValue?Q.value:t.displayValue),J=(0,e.computed)(()=>t.optionsHtml?()=>!0:e=>!0===e?.html),X=(0,e.computed)(()=>t.displayValueHtml||void 0===t.displayValue&&(t.optionsHtml||U.value.some(J.value))),ee=(0,e.computed)(()=>V.focused.value?t.tabindex:-1),ne=(0,e.computed)(()=>{let e={tabindex:t.tabindex,role:"combobox","aria-label":t.label,"aria-readonly":t.readonly?"true":"false","aria-autocomplete":t.useInput?"list":"none","aria-expanded":p.value?"true":"false","aria-controls":`${V.targetUid.value}_lb`};return m.value>=0&&(e["aria-activedescendant"]=`${V.targetUid.value}_${m.value}`),e}),ae=(0,e.computed)(()=>({id:`${V.targetUid.value}_lb`,role:"listbox","aria-multiselectable":t.multiple?"true":"false"})),ie=(0,e.computed)(()=>U.value.map((e,t)=>({index:t,opt:e,html:J.value(e),selected:!0,removeAtIndex:_e,toggleOption:be,tabindex:ee.value}))),re=(0,e.computed)(()=>{if(0===R.value)return[];let{from:e,to:n}=z.value;return t.options.slice(e,n).map((n,a)=>{let i=!0===de.value(n),r=ke(n),o=e+a,s={clickable:!0,active:r,activeClass:le.value,manualFocus:!0,focused:!1,disable:i,tabindex:-1,dense:t.optionsDense,dark:H.value,role:"option","aria-selected":r?"true":"false",id:`${V.targetUid.value}_${o}`,onClick:()=>{be(n)}};return i||(m.value===o&&(s.focused=!0),h.platform.is.desktop&&(s.onMousemove=()=>{p.value&&ye(o)})),{index:o,opt:n,html:J.value(n),label:ce.value(n),selected:s.active,focused:s.focused,toggleOption:be,setOptionIndex:ye,itemProps:s}})}),oe=(0,e.computed)(()=>void 0===t.dropdownIcon?h.iconSet.arrow.dropdown:t.dropdownIcon),se=(0,e.computed)(()=>!(t.optionsCover||t.outlined||t.standout||t.borderless||t.rounded)),le=(0,e.computed)(()=>void 0===t.optionsSelectedClass?void 0===t.color?"":`text-${t.color}`:t.optionsSelectedClass),ue=(0,e.computed)(()=>Eu(t.optionValue,"value")),ce=(0,e.computed)(()=>Eu(t.optionLabel,"label")),de=(0,e.computed)(()=>Eu(t.optionDisable,"disable")),he=(0,e.computed)(()=>U.value.map(ue.value)),pe=(0,e.computed)(()=>{let e={onInput:Re,onChange:M,onKeydown:Pe,onKeyup:Ce,onKeypress:Te,onFocus:xe,onClick(e){r&&b(e)}};return e.onCompositionstart=e.onCompositionupdate=e.onCompositionend=M,e});function fe(e){return t.emitValue?ue.value(e):e}function me(e){if(-1!==e&&e=t.maxValues)return;let r=[...t.modelValue];a("add",{index:r.length,value:i}),r.push(i),a("update:modelValue",r)}function be(e,n){if(!V.editable.value||void 0===e||!0===de.value(e))return;let i=ue.value(e);if(!t.multiple)return n||(Ie(t.fillInput?ce.value(e):"",!0,!0),He()),T.value?.focus(),void((0===U.value.length||!te(ue.value(U.value[0]),i))&&a("update:modelValue",t.emitValue?i:e));if((!r||g.value)&&V.focus(),xe(),0===U.value.length){let n=t.emitValue?i:e;return a("add",{index:0,value:n}),void a("update:modelValue",t.multiple?[n]:n)}let o=[...t.modelValue],s=he.value.findIndex(e=>te(e,i));if(-1!==s)a("remove",{index:s,value:o.splice(s,1)[0]});else{if(void 0!==t.maxValues&&o.length>=t.maxValues)return;let n=t.emitValue?i:e;a("add",{index:o.length,value:n}),o.push(n)}a("update:modelValue",o)}function ye(e){if(!h.platform.is.desktop)return;let t=-1!==e&&e=0?ce.value(t.options[a]):s,!0))}}function ke(e){let t=ue.value(e);return void 0!==he.value.find(e=>te(e,t))}function xe(e){t.useInput&&null!==T.value&&(void 0===e||T.value===e.target&&e.target.value===Q.value)&&T.value.select()}function Se(e){N(e,27)&&p.value&&(b(e),He(),We()),a("keyup",e)}function Ce(e){let{value:n}=e.target;if(void 0===e.keyCode)if(e.target.value="",null!==k&&(clearTimeout(k),k=null),null!==x&&(clearTimeout(x),x=null),We(),"string"==typeof n&&0!==n.length){let e=n.toLocaleLowerCase(),a=n=>{let a=t.options.find(t=>String(n.value(t)).toLocaleLowerCase()===e);return void 0!==a&&(U.value.includes(a)?He():be(a),!0)},i=e=>{!a(ue)&&!e&&!a(ce)&&Ne(n,!0,()=>i(!0))};i()}else V.clearValue(e);else Se(e)}function Te(e){a("keypress",e)}function Pe(n){if(a("keydown",n),I(n))return;let i=0!==_.value.length&&(void 0!==t.newValueMode||void 0!==t.onNewValue),r=!n.shiftKey&&!t.disableTabSelection&&!t.multiple&&(-1!==m.value||i);if(27===n.keyCode)return void y(n);if(9===n.keyCode&&!r)return void Ue();if(void 0===n.target||n.target.id!==V.targetUid.value||!V.editable.value)return;if(40===n.keyCode&&!V.innerLoading.value&&!p.value)return w(n),void $e();if(8===n.keyCode&&(t.useChips||t.clearable)&&!t.hideSelected&&0===_.value.length)return void(t.multiple&&Array.isArray(t.modelValue)?me(t.modelValue.length-1):!t.multiple&&null!==t.modelValue&&a("update:modelValue",null));(35===n.keyCode||36===n.keyCode)&&("string"!=typeof _.value||0===_.value.length)&&(w(n),m.value=-1,we(36===n.keyCode?1:-1,t.multiple)),(33===n.keyCode||34===n.keyCode)&&void 0!==O.value&&(w(n),m.value=Math.max(-1,Math.min(R.value,m.value+(33===n.keyCode?-1:1)*O.value.view)),we(33===n.keyCode?1:-1,t.multiple)),(38===n.keyCode||40===n.keyCode)&&(w(n),we(38===n.keyCode?-1:1,t.multiple));let o=R.value;if((void 0===u||c0&&!t.useInput&&void 0!==n.key&&1===n.key.length&&!n.altKey&&!n.ctrlKey&&!n.metaKey&&(32!==n.keyCode||0!==u.length)){p.value||$e(n);let a=n.key.toLocaleLowerCase(),i=1===u.length&&u[0]===a;c=Date.now()+1500,i||(w(n),u+=a);let r=RegExp("^"+[...u].map(e=>".*+?^${}()|[]\\".includes(e)?"\\"+e:e).join(".*"),"i"),s=m.value;if(i||s<0||!r.test(ce.value(t.options[s])))do{s=ge(s+1,-1,o-1)}while(s!==m.value&&(!0===de.value(t.options[s])||!r.test(ce.value(t.options[s]))));return void(m.value!==s&&(0,e.nextTick)(()=>{ye(s),B(s),s>=0&&t.useInput&&t.fillInput&&ze(ce.value(t.options[s]),!0)}))}if(13===n.keyCode||32===n.keyCode&&!t.useInput&&""===u||9===n.keyCode&&r){if(9!==n.keyCode&&w(n),-1!==m.value&&m.value{if(n){if(!Tu(n))return}else n=t.newValueMode;Ie("",!t.multiple,!0),null!=e&&(("toggle"===n?be:ve)(e,"add-unique"===n),t.multiple||(T.value?.focus(),He()))};if(void 0===t.onNewValue?e(_.value):a("newValue",_.value,e),!t.multiple)return}p.value?Ue():V.innerLoading.value||$e()}}function Ee(){return r?A.value:null!==P.value&&null!==P.value.contentEl?P.value.contentEl:void 0}function Ae(){return t.hideSelected?[]:void 0===n["selected-item"]?void 0===n.selected?t.useChips?ie.value.map((n,a)=>(0,e.h)(ui,{key:"option-"+a,removable:V.editable.value&&!0!==de.value(n.opt),dense:!0,textColor:t.color,tabindex:ee.value,onRemove(){n.removeAtIndex(a)}},()=>(0,e.h)("span",{class:"ellipsis",[n.html?"innerHTML":"textContent"]:ce.value(n.opt)}))):[(0,e.h)("span",{class:"ellipsis",[X.value?"innerHTML":"textContent"]:Z.value})]:[n.selected()].flat():ie.value.map(e=>n["selected-item"](e))}function Le(){if(Y.value)return void 0===n["no-option"]?void 0:n["no-option"]({inputValue:_.value});let t=void 0===n.option?t=>(0,e.h)(jo,{key:t.index,...t.itemProps},()=>(0,e.h)(Do,()=>(0,e.h)(Xo,()=>(0,e.h)("span",{[t.html?"innerHTML":"textContent"]:t.label})))):n.option,a=D("div",re.value.map(t));return void 0!==n["before-options"]&&(a=[n["before-options"](),...a].flat()),Me(n["after-options"],a)}function Re(e){null!==k&&(clearTimeout(k),k=null),null!==x&&(clearTimeout(x),x=null),!e?.target?.qComposing&&(ze(e.target.value||""),o=!0,s=_.value,!V.focused.value&&(!r||g.value)&&V.focus(),void 0!==t.onFilter&&(k=setTimeout(()=>{k=null,Ne(_.value)},t.inputDebounce)))}function ze(e,n){_.value!==e&&(_.value=e,n||0===t.inputDebounce||"0"===t.inputDebounce?a("inputValue",e):x=setTimeout(()=>{x=null,a("inputValue",e)},t.inputDebounce))}function Ie(e,n,a){o=!0!==a,t.useInput&&(ze(e,!0),(n||o)&&(s=e),n||Ne(e))}function Ne(n,i,r){if(void 0===t.onFilter||!i&&!V.focused.value)return;V.innerLoading.value?a("filterAbort"):(V.innerLoading.value=!0,v.value=!0),""!==n&&!t.multiple&&0!==U.value.length&&!o&&n===ce.value(U.value[0])&&(n="");let s=setTimeout(()=>{p.value&&=!1},10);null!==S&&clearTimeout(S),S=s,a("filter",n,(t,n)=>{(i||V.focused.value)&&S===s&&(clearTimeout(S),"function"==typeof t&&t(),v.value=!1,(0,e.nextTick)(()=>{V.innerLoading.value=!1,V.editable.value&&(i?p.value&&He():p.value?Ge(!0):p.value=!0),"function"==typeof n&&(0,e.nextTick)(()=>{n(d)}),"function"==typeof r&&(0,e.nextTick)(()=>{r(d)})}))},()=>{V.focused.value&&S===s&&(clearTimeout(S),V.innerLoading.value=!1,v.value=!1),p.value&&=!1})}function Oe(e){Ze(e),Ue()}function je(){F()}function De(e){b(e),T.value?.focus(),g.value=!0,window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,0)}function qe(t){b(t),(0,e.nextTick)(()=>{g.value=!1})}function Be(e){Ze(e),null!==E.value&&E.value.__updateRefocusTarget(V.rootRef.value.querySelector(".q-field__native > [tabindex]:last-child")),V.focused.value=!1}function Fe(e){He(),V.focused.value||a("blur",e),We()}function Ve(){let e=document.activeElement;(null===e||e.id!==V.targetUid.value)&&null!==T.value&&T.value!==e&&T.value.focus(),F()}function Ue(){f.value||(m.value=-1,p.value&&=!1,V.focused.value||(null!==S&&(clearTimeout(S),S=null),V.innerLoading.value&&(a("filterAbort"),V.innerLoading.value=!1,v.value=!1)))}function $e(a){V.editable.value&&(r?(V.onControlFocusin(a),f.value=!0,(0,e.nextTick)(()=>{V.focus()})):V.focus(),void 0===t.onFilter?(!Y.value||void 0!==n["no-option"])&&(p.value=!0):Ne(_.value))}function He(){f.value=!1,Ue()}function We(){t.useInput&&Ie(!t.multiple&&t.fillInput&&0!==U.value.length&&ce.value(U.value[0])||"",!0,!0)}function Ge(e){let n=-1;if(e){if(0!==U.value.length){let e=ue.value(U.value[0]);n=t.options.findIndex(t=>te(ue.value(t),e))}j(n)}ye(n)}function Ye(){f.value||P.value?.updatePosition()}function Qe(e){void 0!==e&&b(e),a("popupShow",e),V.hasPopupOpen=!0,V.onControlFocusin(e)}function Ze(e){void 0!==e&&b(e),a("popupHide",e),V.hasPopupOpen=!1,V.onControlFocusout(e)}function Je(){r=!(!h.platform.is.mobile&&"dialog"!==t.behavior)&&!("menu"===t.behavior||t.useInput&&void 0===n["no-option"]&&void 0===t.onFilter&&Y.value),l=h.platform.is.ios&&r&&t.useInput?"fade":t.transitionShow}return(0,e.watch)(U,e=>{i=e,t.useInput&&t.fillInput&&!t.multiple&&!V.innerLoading.value&&(!f.value&&!p.value||!W.value)&&(o||We(),(f.value||p.value)&&Ne(""))},{immediate:!0}),(0,e.watch)(()=>t.fillInput,We),(0,e.watch)(p,Ge),(0,e.watch)(R,function(t,n){p.value&&!V.innerLoading.value&&(j(-1,!0),(0,e.nextTick)(()=>{p.value&&!V.innerLoading.value&&(t>n?j():Ge(!0))}))}),(0,e.onBeforeUpdate)(Je),(0,e.onUpdated)(Ye),Je(),(0,e.onBeforeUnmount)(()=>{null!==k&&clearTimeout(k),null!==x&&clearTimeout(x)}),Object.assign(d,{showPopup:$e,hidePopup:He,removeAtIndex:me,add:ve,toggleOption:be,getOptionIndex:()=>m.value,setOptionIndex:ye,moveOptionSelection:we,filter:Ne,updateMenuPosition:Ye,updateInputValue:Ie,isOptionSelected:ke,getEmittingOptionValue:fe,isOptionDisabled:(...e)=>!0===de.value(...e),getOptionValue:(...e)=>ue.value(...e),getOptionLabel:(...e)=>ce.value(...e)}),Object.assign(V,{innerValue:U,fieldClass:(0,e.computed)(()=>`q-select q-field--auto-height q-select--with${t.useInput?"":"out"}-input q-select--with${t.useChips?"":"out"}-chips q-select--${t.multiple?"multiple":"single"}`),inputRef:C,targetRef:T,hasValue:W,showPopup:$e,floatingLabel:(0,e.computed)(()=>!t.hideSelected&&W.value||"number"==typeof _.value||0!==_.value.length||ws(t.displayValue)),getControlChild:()=>{if(V.editable.value&&(f.value||!Y.value||void 0!==n["no-option"]))return r?function(){let a=[(0,e.h)(Es,{class:`col-auto ${V.fieldClass.value}`,...$.value,for:V.targetUid.value,dark:H.value,square:!0,loading:v.value,itemAligned:!1,filled:!0,stackLabel:0!==_.value.length,...V.splitAttrs.listeners.value,onFocus:De,onBlur:qe},{...n,rawControl:()=>V.getControl(!0),before:void 0,after:void 0})];return p.value&&a.push((0,e.h)("div",{ref:A,class:K.value+" scroll",style:t.popupContentStyle,...ae.value,onClick:y,onScrollPassive:q},Le())),(0,e.h)(Po,{ref:E,modelValue:f.value,position:t.useInput?"top":void 0,transitionShow:l,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,noRouteDismiss:t.popupNoRouteDismiss,onBeforeShow:Qe,onBeforeHide:Be,onHide:Fe,onShow:Ve},()=>(0,e.h)("div",{class:"q-select__dialog"+(H.value?" q-select__dialog--dark q-dark":"")+(g.value?" q-select__dialog--focused":"")},a))}():(0,e.h)(ma,{ref:P,class:K.value,style:t.popupContentStyle,modelValue:p.value,fit:!t.menuShrink,cover:t.optionsCover&&!Y.value&&!t.useInput,anchor:t.menuAnchor,self:t.menuSelf,offset:t.menuOffset,dark:H.value,noParentEvent:!0,noRefocus:!0,noFocus:!0,noRouteDismiss:t.popupNoRouteDismiss,square:se.value,transitionShow:t.transitionShow,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,separateClosePopup:!0,...ae.value,onScrollPassive:q,onBeforeShow:Qe,onBeforeHide:Oe,onShow:je},Le);V.hasPopupOpen&&=!1},controlEvents:{onFocusin(e){V.onControlFocusin(e)},onFocusout(e){V.onControlFocusout(e,()=>{We(),Ue()})},onClick(e){if(y(e),!r&&p.value)return Ue(),void T.value?.focus();$e(e)}},getControl:n=>{let a=Ae(),i=!0===n||!f.value||!r;if(t.useInput)a.push(function(n,a){let i=a?{...ne.value,...V.splitAttrs.attributes.value}:void 0,o={ref:a?T:void 0,key:"i_t",class:G.value,style:t.inputStyle,value:void 0===_.value?"":_.value,type:"search",...i,id:a?V.targetUid.value:void 0,maxlength:t.maxlength,autocomplete:t.autocomplete,"data-autofocus":!0===n||t.autofocus||void 0,disabled:t.disable,readonly:t.readonly,...pe.value};return!n&&r&&(Array.isArray(o.class)?o.class=[...o.class,"no-pointer-events"]:o.class+=" no-pointer-events"),(0,e.h)("input",o)}(n,i));else if(V.editable.value){let r=i?ne.value:void 0;a.push((0,e.h)("input",{ref:i?T:void 0,key:"d_t",class:"q-select__focus-target",id:i?V.targetUid.value:void 0,value:Z.value,readonly:!0,"data-autofocus":!0===n||t.autofocus||void 0,...r,onKeydown:Pe,onKeyup:Se,onKeypress:Te})),i&&"string"==typeof t.autocomplete&&0!==t.autocomplete.length&&a.push((0,e.h)("input",{class:"q-select__autocomplete-input",autocomplete:t.autocomplete,tabindex:-1,onKeyup:Ce}))}if(void 0!==L.value&&!t.disable&&0!==he.value.length){let n=he.value.map(t=>(0,e.h)("option",{value:t,selected:!0}));a.push((0,e.h)("select",{class:"hidden",name:L.value,multiple:t.multiple},n))}return(0,e.h)("div",{class:"q-field__native row items-center",...t.useInput||!i?void 0:V.splitAttrs.attributes.value,...V.splitAttrs.listeners.value},a)},getInnerAppend:()=>t.loading||v.value||t.hideDropdownIcon?null:[(0,e.h)(Ke,{class:"q-select__dropdown-icon"+(p.value?" rotate-180":""),name:oe.value})]}),Ps(V)}});let Lu=["text","rect","circle","QBtn","QBadge","QChip","QToolbar","QCheckbox","QRadio","QToggle","QSlider","QRange","QInput","QAvatar"],Mu=["wave","pulse","pulse-x","pulse-y","fade","blink","none"];var Ru=h({name:"QSkeleton",props:{...Je,tag:{type:String,default:"div"},type:{type:String,validator:e=>Lu.includes(e),default:"rect"},animation:{type:String,validator:e=>Mu.includes(e),default:"wave"},animationSpeed:{type:[String,Number],default:1500},square:Boolean,bordered:Boolean,size:String,width:String,height:String},setup(t,{slots:n}){let a=Xe(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>{let e=void 0===t.size?[t.width,t.height]:[t.size,t.size];return{"--q-skeleton-speed":`${t.animationSpeed}ms`,width:e[0],height:e[1]}}),r=(0,e.computed)(()=>`q-skeleton q-skeleton--${a.value?"dark":"light"} q-skeleton--type-${t.type}`+("none"===t.animation?"":` q-skeleton--anim q-skeleton--anim-${t.animation}`)+(t.square?" q-skeleton--square":"")+(t.bordered?" q-skeleton--bordered":""));return()=>(0,e.h)(t.tag,{class:r.value,style:i.value},Ae(n.default))}});let zu=[["left","center","start","width"],["right","center","end","width"],["top","start","center","height"],["bottom","end","center","height"]];var Iu=h({name:"QSlideItem",props:{...Je,leftColor:String,rightColor:String,topColor:String,bottomColor:String,onSlide:Function},emits:["action","top","right","bottom","left"],setup(t,{slots:n,emit:a}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:r}=i,o=Xe(t,r),{getCache:s}=ja(),l=(0,e.ref)(null),u=null,c={},d={},h={},p=(0,e.computed)(()=>r.lang.rtl?{left:"right",right:"left"}:{left:"left",right:"right"}),f=(0,e.computed)(()=>"q-slide-item q-item-type overflow-hidden"+(o.value?" q-slide-item--dark q-dark":""));function m(){l.value.style.transform="translate(0,0)"}function _(e,n,i){void 0!==t.onSlide&&a("slide",{side:e,ratio:n,isReset:i})}function g(e){let t,i,r,o=l.value;if(e.isFirst)c={dir:null,size:{left:0,right:0,top:0,bottom:0},scale:0},o.classList.add("no-transition"),zu.forEach(e=>{if(void 0!==n[e[0]]){let t=h[e[0]];t.style.transform="scale(1)",c.size[e[0]]=t.getBoundingClientRect()[e[3]]}}),c.axis="up"===e.direction||"down"===e.direction?"Y":"X";else{if(e.isFinal){if(o.classList.remove("no-transition"),1===c.scale){o.style.transform=`translate${c.axis}(${100*c.dir}%)`,null!==u&&clearTimeout(u);let e=c.showing;u=setTimeout(()=>{u=null,a(e,{reset:m}),a("action",{side:e,reset:m})},230)}else o.style.transform="translate(0,0)",_(c.showing,0,!0);return}e.direction="X"===c.axis?e.offset.x<0?"left":"right":e.offset.y<0?"up":"down"}void 0===n.left&&e.direction===p.value.right||void 0===n.right&&e.direction===p.value.left||void 0===n.top&&"down"===e.direction||void 0===n.bottom&&"up"===e.direction?o.style.transform="translate(0,0)":("X"===c.axis?(i="left"===e.direction?-1:1,t=1===i?p.value.left:p.value.right,r=e.distance.x):(i="up"===e.direction?-2:2,t=2===i?"top":"bottom",r=e.distance.y),(null===c.dir||Math.abs(i)===Math.abs(c.dir))&&(c.dir!==i&&(["left","right","top","bottom"].forEach(e=>{d[e]&&(d[e].style.visibility=t===e?"visible":"hidden")}),c.showing=t,c.dir=i),c.scale=Math.max(0,Math.min(1,(r-40)/c.size[t])),o.style.transform=`translate${c.axis}(${r*i/Math.abs(i)}px)`,h[t].style.transform=`scale(${c.scale})`,_(t,c.scale,!1)))}return(0,e.onBeforeUpdate)(()=>{d={},h={}}),(0,e.onBeforeUnmount)(()=>{null!==u&&clearTimeout(u)}),Object.assign(i,{reset:m}),()=>{let a=[],i={left:void 0!==n[p.value.right],right:void 0!==n[p.value.left],up:void 0!==n.bottom,down:void 0!==n.top},r=Object.keys(i).filter(e=>i[e]);zu.forEach(i=>{let r=i[0];void 0!==n[r]&&a.push((0,e.h)("div",{key:r,ref:e=>{d[r]=e},class:`q-slide-item__${r} absolute-full row no-wrap items-${i[1]} justify-${i[2]}`+(void 0===t[r+"Color"]?"":` bg-${t[r+"Color"]}`)},[(0,e.h)("div",{ref:e=>{h[r]=e}},n[r]())]))});let o=(0,e.h)("div",{key:(0===r.length?"only-":"")+" content",ref:l,class:"q-slide-item__content"},Ae(n.default));return 0===r.length?a.push(o):a.push((0,e.withDirectives)(o,s("dir#"+r.join(""),()=>{let e={prevent:!0,stop:!0,mouse:!0};return r.forEach(t=>{e[t]=!0}),[[gi,g,void 0,e]]}))),(0,e.h)("div",{class:f.value},a)}}}),Nu=h({name:"QSpace",setup(){let t=(0,e.h)("div",{class:"q-space"});return()=>t}}),Ou=h({name:"QSpinnerAudio",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,fill:"currentColor",width:n.value,height:n.value,viewBox:"0 0 55 80",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),ju=h({name:"QSpinnerBall",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,stroke:"currentColor",width:n.value,height:n.value,viewBox:"0 0 57 57",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Du=h({name:"QSpinnerBars",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,fill:"currentColor",width:n.value,height:n.value,viewBox:"0 0 135 140",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),qu=h({name:"QSpinnerBox",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Bu=h({name:"QSpinnerClock",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Fu=h({name:"QSpinnerComment",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",innerHTML:''})}}),Vu=h({name:"QSpinnerCube",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",innerHTML:''})}}),Uu=h({name:"QSpinnerDots",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,fill:"currentColor",width:n.value,height:n.value,viewBox:"0 0 120 30",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),$u=h({name:"QSpinnerFacebook",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",innerHTML:''})}}),Hu=h({name:"QSpinnerGears",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Wu=h({name:"QSpinnerGrid",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,fill:"currentColor",width:n.value,height:n.value,viewBox:"0 0 105 105",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Gu=h({name:"QSpinnerHearts",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,fill:"currentColor",width:n.value,height:n.value,viewBox:"0 0 140 64",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Ku=h({name:"QSpinnerHourglass",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Yu=h({name:"QSpinnerInfinity",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",innerHTML:''})}}),Qu=h({name:"QSpinnerIos",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,stroke:"currentColor",fill:"currentColor",viewBox:"0 0 64 64",innerHTML:''})}}),Zu=h({name:"QSpinnerOrbit",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Ju=h({name:"QSpinnerOval",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,stroke:"currentColor",width:n.value,height:n.value,viewBox:"0 0 38 38",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Xu=h({name:"QSpinnerPie",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),ec=h({name:"QSpinnerPuff",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,stroke:"currentColor",width:n.value,height:n.value,viewBox:"0 0 44 44",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),tc=h({name:"QSpinnerRadio",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),nc=h({name:"QSpinnerRings",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,stroke:"currentColor",width:n.value,height:n.value,viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),ac=h({name:"QSpinnerTail",props:wt,setup(t){let{cSize:n,classes:a}=kt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 38 38",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),ic=h({name:"QSplitter",props:{...Je,modelValue:{type:Number,required:!0},reverse:Boolean,unit:{type:String,default:"%",validator:e=>["%","px"].includes(e)},limits:{type:Array,validator:e=>2===e.length&&"number"==typeof e[0]&&"number"==typeof e[1]&&(e[0]>=0&&e[0]<=e[1])},emitImmediately:Boolean,horizontal:Boolean,disable:Boolean,beforeClass:[Array,String,Object],afterClass:[Array,String,Object],separatorClass:[Array,String,Object],separatorStyle:[Array,String,Object]},emits:["update:modelValue"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),r=Xe(t,i),o=(0,e.ref)(null),s={before:(0,e.ref)(null),after:(0,e.ref)(null)},l=(0,e.computed)(()=>`q-splitter no-wrap ${t.horizontal?"q-splitter--horizontal column":"q-splitter--vertical row"} q-splitter--${t.disable?"disabled":"workable"}`+(r.value?" q-splitter--dark":"")),u=(0,e.computed)(()=>t.horizontal?"height":"width"),c=(0,e.computed)(()=>t.reverse?"after":"before"),d=(0,e.computed)(()=>void 0===t.limits?"%"===t.unit?[10,90]:[50,1/0]:t.limits);function h(e){return("%"===t.unit?e:Math.round(e))+t.unit}let p,f,m,_,g,v=(0,e.computed)(()=>({[c.value]:{[u.value]:h(t.modelValue)}}));function b(e){if(e.isFirst){let e=o.value.getBoundingClientRect()[u.value];return p=t.horizontal?"up":"left",f="%"===t.unit?100:e,m=Math.min(f,d.value[1],Math.max(d.value[0],t.modelValue)),_=(t.reverse?-1:1)*(t.horizontal?1:i.lang.rtl?-1:1)*("%"===t.unit?0===e?0:100/e:1),void o.value.classList.add("q-splitter--active")}if(e.isFinal)return g!==t.modelValue&&a("update:modelValue",g),void o.value.classList.remove("q-splitter--active");let n=m+_*(e.direction===p?-1:1)*e.distance[t.horizontal?"y":"x"];g=Math.min(f,d.value[1],Math.max(d.value[0],n)),s[c.value].value.style[u.value]=h(g),t.emitImmediately&&t.modelValue!==g&&a("update:modelValue",g)}let y=(0,e.computed)(()=>[[gi,b,void 0,{[t.horizontal?"vertical":"horizontal"]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]);function w(e,t){et[1]&&a("update:modelValue",t[1])}return(0,e.watch)(()=>t.modelValue,e=>{w(e,d.value)}),(0,e.watch)(()=>t.limits,()=>{(0,e.nextTick)(()=>{w(t.modelValue,d.value)})}),()=>{let a=[(0,e.h)("div",{ref:s.before,class:["q-splitter__panel q-splitter__before"+(t.reverse?" col":""),t.beforeClass],style:v.value.before},Ae(n.before)),(0,e.h)("div",{class:["q-splitter__separator",t.separatorClass],style:t.separatorStyle,"aria-disabled":t.disable?"true":void 0},[ze("div",{class:"q-splitter__separator-area absolute-full"},Ae(n.separator),"sep",!t.disable,()=>y.value)]),(0,e.h)("div",{ref:s.after,class:["q-splitter__panel q-splitter__after"+(t.reverse?"":" col"),t.afterClass],style:v.value.after},Ae(n.after))];return(0,e.h)("div",{class:l.value,ref:o},Me(n.default,a))}}});function rc(e){32===e.keyCode&&w(e)}var oc=h({name:"StepHeader",props:{stepper:{},step:{},goToPanel:Function},setup(t,{attrs:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=(0,e.ref)(null),r=(0,e.computed)(()=>t.stepper.modelValue===t.step.name),o=(0,e.computed)(()=>{let e=t.step.disable;return!0===e||""===e}),s=(0,e.computed)(()=>{let e=t.step.error;return!0===e||""===e}),l=(0,e.computed)(()=>{let e=t.step.done;return!o.value&&(!0===e||""===e)}),u=(0,e.computed)(()=>{let e=t.step.headerNav;return!o.value&&t.stepper.headerNav&&(!0===e||""===e||void 0===e)}),c=(0,e.computed)(()=>t.step.prefix&&(!r.value||"none"===t.stepper.activeIcon)&&(!s.value||"none"===t.stepper.errorIcon)&&(!l.value||"none"===t.stepper.doneIcon)),d=(0,e.computed)(()=>{let e=t.step.icon||t.stepper.inactiveIcon;if(r.value){let n=t.step.activeIcon||t.stepper.activeIcon;return"none"===n?e:n||a.iconSet.stepper.active}if(s.value){let n=t.step.errorIcon||t.stepper.errorIcon;return"none"===n?e:n||a.iconSet.stepper.error}if(!o.value&&l.value){let n=t.step.doneIcon||t.stepper.doneIcon;return"none"===n?e:n||a.iconSet.stepper.done}return e}),h=(0,e.computed)(()=>{let e=s.value?t.step.errorColor||t.stepper.errorColor:void 0;if(r.value){let n=t.step.activeColor||t.stepper.activeColor||t.step.color;return void 0===n?e:n}return void 0===e?!o.value&&l.value?t.step.doneColor||t.stepper.doneColor||t.step.color||t.stepper.inactiveColor:t.step.color||t.stepper.inactiveColor:e}),p=(0,e.computed)(()=>"q-stepper__tab col-grow flex items-center no-wrap relative-position"+(void 0===h.value?"":` text-${h.value}`)+(s.value?" q-stepper__tab--error q-stepper__tab--error-with-"+(c.value?"prefix":"icon"):"")+(r.value?" q-stepper__tab--active":"")+(l.value?" q-stepper__tab--done":"")+(u.value?" q-stepper__tab--navigation q-focusable q-hoverable":"")+(o.value?" q-stepper__tab--disabled":"")),f=(0,e.computed)(()=>t.stepper.headerNav&&u.value);function m(){i.value?.focus(),r.value||t.goToPanel(t.step.name)}function _(e){[13,32].includes(e.keyCode)&&(r.value||t.goToPanel(t.step.name),w(e))}return()=>{let a={class:p.value};u.value&&(a.onClick=m,a.onKeydown=rc,a.onKeyup=_,a.role="button",a["aria-current"]=r.value?"step":void 0,Object.assign(a,o.value?{tabindex:-1,"aria-disabled":"true"}:{tabindex:n.tabindex||0}));let s=[(0,e.h)("div",{class:"q-focus-helper",tabindex:-1,ref:i}),(0,e.h)("div",{class:"q-stepper__dot row flex-center q-stepper__line relative-position"},[(0,e.h)("span",{class:"row flex-center"},[c.value?t.step.prefix:(0,e.h)(Ke,{name:d.value})])])];if(void 0!==t.step.title&&null!==t.step.title){let n=[(0,e.h)("div",{class:"q-stepper__title"},t.step.title)];void 0!==t.step.caption&&null!==t.step.caption&&n.push((0,e.h)("div",{class:"q-stepper__caption"},t.step.caption)),s.push((0,e.h)("div",{class:"q-stepper__label q-stepper__line relative-position"},n))}return(0,e.withDirectives)((0,e.h)("div",a,s),[[zt,f.value]])}}});function sc(t){return(0,e.h)("div",{class:"q-stepper__step-content"},[(0,e.h)("div",{class:"q-stepper__step-inner"},Ae(t.default))])}let lc={setup:(e,{slots:t})=>()=>sc(t)};var uc=h({name:"QStep",props:{...Da,icon:String,color:String,title:{type:String,required:!0},caption:String,prefix:[String,Number],doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String,headerNav:{type:Boolean,default:!0},done:Boolean,error:Boolean,onScroll:[Function,Array]},setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),r=(0,e.inject)(K,ee);if(r===ee)return console.error("QStep needs to be a child of QStepper"),ee;let{getCache:o}=ja(),s=(0,e.ref)(null),l=(0,e.computed)(()=>r.value.modelValue===t.name),u=(0,e.computed)(()=>!i.platform.is.ios&&i.platform.is.chrome||!l.value||!r.value.vertical?{}:{onScroll(e){let{target:n}=e;n.scrollTop>0&&(n.scrollTop=0),void 0!==t.onScroll&&a("scroll",e)}}),c=(0,e.computed)(()=>"string"==typeof t.name||"number"==typeof t.name?t.name:String(t.name));function d(){let t=r.value.vertical;return t&&r.value.keepAlive?(0,e.h)(e.KeepAlive,r.value.keepAliveProps.value,l.value?[(0,e.h)(r.value.needsUniqueKeepAliveWrapper.value?o(c.value,()=>({...lc,name:c.value})):lc,{key:c.value},n.default)]:void 0):!t||l.value?sc(n):void 0}return()=>(0,e.h)("div",{ref:s,class:"q-stepper__step",role:"tabpanel",...u.value},r.value.vertical?[(0,e.h)(oc,{stepper:r.value,step:t,goToPanel:r.value.goToPanel}),r.value.animated?(0,e.h)(es,d):d()]:[d()])}});let cc=/(-\w)/g;var dc=h({name:"QStepper",props:{...Je,...Ba,flat:Boolean,bordered:Boolean,alternativeLabels:Boolean,headerNav:Boolean,contracted:Boolean,headerClass:String,inactiveColor:String,inactiveIcon:String,doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String},emits:Fa,setup(t,{slots:n}){let a=Xe(t,(0,e.getCurrentInstance)().proxy.$q),{updatePanelsList:i,isValidPanelName:r,updatePanelIndex:o,getPanelContent:s,getPanels:l,panelDirectives:u,goToPanel:c,keepAliveProps:d,needsUniqueKeepAliveWrapper:h}=Ua();(0,e.provide)(K,(0,e.computed)(()=>({goToPanel:c,keepAliveProps:d,needsUniqueKeepAliveWrapper:h,...t})));let p=(0,e.computed)(()=>"q-stepper q-stepper--"+(t.vertical?"vertical":"horizontal")+(t.flat?" q-stepper--flat":"")+(t.bordered?" q-stepper--bordered":"")+(a.value?" q-stepper--dark q-dark":"")),f=(0,e.computed)(()=>`q-stepper__header row items-stretch justify-between q-stepper__header--${t.alternativeLabels?"alternative":"standard"}-labels`+(t.bordered||!t.flat?" q-stepper__header--border":"")+(t.contracted?" q-stepper__header--contracted":"")+(void 0===t.headerClass?"":` ${t.headerClass}`));function m(){let a=Ae(n.message,[]);if(t.vertical){r(t.modelValue)&&o();let i=(0,e.h)("div",{class:"q-stepper__content"},Ae(n.default));return void 0===a?[i]:a.concat(i)}return[(0,e.h)("div",{class:f.value},l().map(n=>{let a=function(e){let t={};for(let n in e){let a=n.replace(cc,e=>e[1].toUpperCase());t[a]=e[n]}return t}(n.props);return(0,e.h)(oc,{key:a.name,stepper:t,step:a,goToPanel:c})})),a,ze("div",{class:"q-stepper__content q-panel-parent"},s(),"cont",t.swipeable,()=>u.value)]}return()=>(i(n),(0,e.h)("div",{class:p.value},Me(n.navigation,m())))}}),hc=h({name:"QStepperNavigation",setup:(t,{slots:n})=>()=>(0,e.h)("div",{class:"q-stepper__nav"},Ae(n.default))}),pc=h({name:"QTh",props:{props:Object,autoWidth:Boolean},emits:["click"],setup(t,{slots:n,emit:a}){let i=(0,e.getCurrentInstance)(),{proxy:{$q:r}}=i,o=e=>{a("click",e)};return()=>{if(void 0===t.props)return(0,e.h)("th",{class:t.autoWidth?"q-table--col-auto-width":"",onClick:o},Ae(n.default));let a,s,l=i.vnode.key;if(null!==l){if(a=t.props.colsMap[l],void 0===a)return}else a=t.props.col;if(a.sortable){let t="right"===a.align?"unshift":"push";s=Le(n.default,[]),s[t]((0,e.h)(Ke,{class:a.__iconClass,name:r.iconSet.table.arrowUp}))}else s=Ae(n.default);let u={class:a.__thClass+(t.autoWidth?" q-table--col-auto-width":""),style:a.headerStyle,onClick:e=>{a.sortable&&t.props.sort(a),o(e)}};return a.sortable&&(u.tabindex=0,u["aria-sort"]=a.__ariaSort,u.onKeydown=e=>{" "===e.key&&e.preventDefault()},u.onKeyup=e=>{((e,n)=>{("Enter"===e.key||" "===e.key)&&(t.props.sort(n),o(e),e.preventDefault())})(e,a)}),(0,e.h)("th",u,s)}}});function fc(t,n){return(0,e.h)("div",t,[(0,e.h)("table",{class:"q-table"},n)])}let mc={list:vl,table:Ml},_c=["list","table","__qtable"];var gc=h({name:"QVirtualScroll",props:{...Su,type:{type:String,default:"list",validator:e=>_c.includes(e)},items:{type:Array,default:()=>[]},itemsFn:Function,itemsSize:Number,scrollTarget:Cn},setup(t,{slots:n,attrs:a}){let i,r=(0,e.ref)(null),o=(0,e.computed)(()=>t.itemsSize>=0&&void 0!==t.itemsFn?Number.parseInt(t.itemsSize,10):Array.isArray(t.items)?t.items.length:0),{virtualScrollSliceRange:s,localResetVirtualScroll:l,padVirtualScroll:u,onVirtualScrollEvt:c}=Cu({virtualScrollLength:o,getVirtualScrollTarget:function(){return i},getVirtualScrollEl:f}),d=(0,e.computed)(()=>{if(0===o.value)return[];let e=(e,t)=>({index:s.value.from+t,item:e});return void 0===t.itemsFn?t.items.slice(s.value.from,s.value.to).map(e):t.itemsFn(s.value.from,s.value.to-s.value.from).map(e)}),h=(0,e.computed)(()=>"q-virtual-scroll q-virtual-scroll"+(t.virtualScrollHorizontal?"--horizontal":"--vertical")+(void 0===t.scrollTarget?" scroll":"")),p=(0,e.computed)(()=>void 0===t.scrollTarget?{tabindex:0}:{});function f(){return r.value.$el||r.value}function _(){i=Pn(f(),t.scrollTarget),i.addEventListener("scroll",c,m.passive)}function g(){void 0!==i&&(i.removeEventListener("scroll",c,m.passive),i=void 0)}function v(){let e=u("list"===t.type?"div":"tbody",d.value.map(n.default));return void 0!==n.before&&(e=n.before().concat(e)),Me(n.after,e)}return(0,e.watch)(o,()=>{l()}),(0,e.watch)(()=>t.scrollTarget,()=>{g(),_()}),(0,e.onBeforeMount)(()=>{l()}),(0,e.onMounted)(()=>{_()}),(0,e.onActivated)(()=>{_()}),(0,e.onDeactivated)(()=>{g()}),(0,e.onBeforeUnmount)(()=>{g()}),()=>{if(void 0!==n.default)return"__qtable"===t.type?fc({ref:r,class:"q-table__middle "+h.value},v()):(0,e.h)(mc[t.type],{...a,ref:r,class:[a.class,h.value],...p.value},v);console.error("QVirtualScroll: default scoped slot is required for rendering")}}});let vc={sortMethod:Function,binaryStateSort:Boolean,columnSortOrder:{type:String,validator:e=>"ad"===e||"da"===e,default:"ad"}};function bc(t,n,a,i){let r=(0,e.computed)(()=>{let{sortBy:e}=n.value;return e&&a.value.find(t=>t.name===e)||null}),o=(0,e.computed)(()=>void 0===t.sortMethod?(e,t,n)=>{let i=a.value.find(e=>e.name===t);if(void 0===i||void 0===i.field)return e;let r=n?-1:1,o="function"==typeof i.field?e=>i.field(e):e=>e[i.field];return e.sort((e,t)=>{let n=o(e),a=o(t);return void 0===i.rawSort?null==n?-1*r:null==a?Number(r):void 0===i.sort?re(n)&&re(a)?(n-a)*r:ae(n)&&ae(a)?function(e,t){return new Date(e)-new Date(t)}(n,a)*r:"boolean"==typeof n&&"boolean"==typeof a?(n-a)*r:([n,a]=[n,a].map(e=>String(e).toLocaleString().toLowerCase()),nt.name===e);t?.sortOrder&&(r=t.sortOrder)}let{sortBy:o,descending:s}=n.value;o===e?t.binaryStateSort?s=!s:s?"ad"===r?o=null:s=!1:"ad"===r?s=!0:o=null:(o=e,s="da"===r),i({sortBy:o,descending:s,page:1})}}}let yc={filter:[String,Object],filterMethod:Function};function wc(e){return e.page<1&&(e.page=1),void 0!==e.rowsPerPage&&e.rowsPerPage<1&&(e.rowsPerPage=0),e}let kc={pagination:Object,rowsPerPageOptions:{type:Array,default:()=>[5,7,10,15,20,25,50,0]},"onUpdate:pagination":[Function,Array]};let xc={selection:{type:String,default:"none",validator:e=>["single","multiple","none"].includes(e)},selected:{type:Array,default:()=>[]}},Sc=["update:selected","selection"];function Cc(e){return Array.isArray(e)?[...e]:[]}let Tc={expanded:Array},Pc=["update:expanded"];let Ec={visibleColumns:Array};function Ac(t,n,a){let i=(0,e.computed)(()=>{if(void 0!==t.columns)return t.columns;let e=t.rows[0];return void 0===e?[]:Object.keys(e).map(t=>({name:t,label:t.toUpperCase(),field:t,align:re(e[t])?"right":"left",sortable:!0}))}),r=(0,e.computed)(()=>{let{sortBy:e,descending:a}=n.value;return(void 0===t.visibleColumns?i.value:i.value.filter(e=>e.required||t.visibleColumns.includes(e.name))).map(t=>{let n=t.align||"right",i=`text-${n}`;return{...t,align:n,__iconClass:`q-table__sort-icon q-table__sort-icon--${n}`,__ariaSort:!0===t.sortable?t.name===e?a?"descending":"ascending":"none":void 0,__thClass:i+(void 0===t.headerClasses?"":" "+t.headerClasses)+(t.sortable?" sortable":"")+(t.name===e?" sorted "+(a?"sort-desc":""):""),__tdStyle:void 0===t.style?()=>null:"function"==typeof t.style?t.style:()=>t.style,__tdClass:void 0===t.classes?()=>i:"function"==typeof t.classes?e=>i+" "+t.classes(e):()=>i+" "+t.classes}})});return{colList:i,computedCols:r,computedColsMap:(0,e.computed)(()=>{let e=Object.create(null);return r.value.forEach(t=>{e[t.name]=t}),e}),computedColspan:(0,e.computed)(()=>void 0===t.tableColspan?r.value.length+ +!!a.value:t.tableColspan)}}let Lc="q-table__bottom row items-center",Mc={};function Rc(e,t){let n="function"==typeof e.field?e.field(t):t[e.field];return void 0===e.format?n:e.format(n,t)}xu.forEach(e=>{Mc[e]={}});var zc=h({name:"QTable",props:{rows:{type:Array,required:!0},rowKey:{type:[String,Function],default:"id"},columns:Array,loading:Boolean,iconFirstPage:String,iconPrevPage:String,iconNextPage:String,iconLastPage:String,title:String,hideHeader:Boolean,grid:Boolean,gridHeader:Boolean,dense:Boolean,flat:Boolean,bordered:Boolean,square:Boolean,separator:{type:String,default:"horizontal",validator:e=>["horizontal","vertical","cell","none"].includes(e)},wrapCells:Boolean,virtualScroll:Boolean,virtualScrollTarget:{},...Mc,noDataLabel:String,noResultsLabel:String,loadingLabel:String,selectedRowsLabel:Function,rowsPerPageLabel:String,paginationLabel:Function,color:{type:String,default:"grey-8"},titleClass:[String,Array,Object],tableStyle:[String,Array,Object],tableClass:[String,Array,Object],tableHeaderStyle:[String,Array,Object],tableHeaderClass:[String,Array,Object],tableRowStyleFn:Function,tableRowClassFn:Function,cardContainerClass:[String,Array,Object],cardContainerStyle:[String,Array,Object],cardStyle:[String,Array,Object],cardClass:[String,Array,Object],cardStyleFn:Function,cardClassFn:Function,hideBottom:Boolean,hideSelectedBanner:Boolean,hideNoData:Boolean,hidePagination:Boolean,onRowClick:Function,onRowDblclick:Function,onRowContextmenu:Function,...Je,...Ha,...Ec,...yc,...kc,...Tc,...xc,...vc},emits:["request","virtualScroll",...Wa,...Pc,...Sc],setup(t,{slots:n,emit:r}){let o=(0,e.getCurrentInstance)(),{proxy:{$q:s}}=o,l=Xe(t,s),{inFullscreen:u,toggleFullscreen:c}=Ga(),d=(0,e.computed)(()=>"function"==typeof t.rowKey?t.rowKey:e=>e[t.rowKey]),h=(0,e.ref)(null),p=(0,e.ref)(null),f=(0,e.computed)(()=>!t.grid&&t.virtualScroll),m=(0,e.computed)(()=>" q-table__card"+(l.value?" q-table__card--dark q-dark":"")+(t.square?" q-table--square":"")+(t.flat?" q-table--flat":"")+(t.bordered?" q-table--bordered":"")),_=(0,e.computed)(()=>`q-table__container q-table--${t.separator}-separator column no-wrap`+(t.grid?" q-table--grid":m.value)+(l.value?" q-table--dark":"")+(t.dense?" q-table--dense":"")+(t.wrapCells?"":" q-table--no-wrap")+(u.value?" fullscreen scroll":"")),g=(0,e.computed)(()=>_.value+(t.loading?" q-table--loading":""));(0,e.watch)([()=>t.tableStyle,()=>t.tableClass,()=>t.tableHeaderStyle,()=>t.tableHeaderClass,_],()=>{f.value&&p.value?.reset()},{deep:!0});let{innerPagination:v,computedPagination:b,isServerSide:y,requestServerInteraction:w,setPagination:k}=function(t,n){let{props:a,emit:i}=t,r=(0,e.ref)({sortBy:null,descending:!1,page:1,rowsPerPage:0===a.rowsPerPageOptions.length?5:a.rowsPerPageOptions[0],...a.pagination}),o=(0,e.computed)(()=>wc(void 0===a["onUpdate:pagination"]?r.value:{...r.value,...a.pagination})),s=(0,e.computed)(()=>void 0!==o.value.rowsNumber);function l(e){u({pagination:e,filter:a.filter})}function u(t={}){(0,e.nextTick)(()=>{i("request",{pagination:void 0===t.pagination?o.value:t.pagination,filter:void 0===t.filter?a.filter:t.filter,getCellValue:n})})}return{innerPagination:r,computedPagination:o,isServerSide:s,requestServerInteraction:u,setPagination:function(e,t){let n=wc({...o.value,...e});!function(e,t){for(let n in t)if(t[n]!==e[n])return!1;return!0}(o.value,n)?s.value?l(n):void 0!==a.pagination&&void 0!==a["onUpdate:pagination"]?i("update:pagination",n):r.value=n:s.value&&t&&l(n)}}}(o,Rc),{computedFilterMethod:x}=function(t,n){let a=(0,e.computed)(()=>void 0===t.filterMethod?(e,t,n,a)=>{let i=t?t.toLowerCase():"";return e.filter(e=>n.some(t=>{let n=String(a(t,e));return("undefined"===n||"null"===n?"":n.toLowerCase()).includes(i)}))}:t.filterMethod);return(0,e.watch)(()=>t.filter,()=>{(0,e.nextTick)(()=>{n({page:1},!0)})},{deep:!0}),{computedFilterMethod:a}}(t,k),{isRowExpanded:S,setExpanded:C,updateExpanded:T}=function(t,n){let a=(0,e.ref)(Cc(t.expanded));function i(e){void 0===t.expanded?a.value=e:n("update:expanded",e)}return(0,e.watch)(()=>t.expanded,e=>{a.value=Cc(e)}),{isRowExpanded:function(e){return a.value.includes(e)},setExpanded:i,updateExpanded:function(e,t){let n=[...a.value],r=n.indexOf(e);t?-1===r&&(n.push(e),i(n)):-1!==r&&(n.splice(r,1),i(n))}}}(t,r),P=(0,e.computed)(()=>{let e=t.rows;if(y.value||0===e.length)return e;let{sortBy:n,descending:a}=b.value;return t.filter&&(e=x.value(e,t.filter,B.value,Rc)),null!==U.value&&(e=$.value(t.rows===e?[...e]:e,n,a)),e}),E=(0,e.computed)(()=>P.value.length),A=(0,e.computed)(()=>{let e=P.value;if(y.value)return e;let{rowsPerPage:n}=b.value;return 0!==n&&(0===W.value&&t.rows!==e?e.length>G.value&&(e=e.slice(0,G.value)):e=e.slice(W.value,G.value)),e}),{hasSelectionMode:L,singleSelection:M,multipleSelection:R,allRowsSelected:z,someRowsSelected:I,rowsSelectedNumber:N,isRowSelected:O,clearSelection:j,updateSelection:D}=function(t,n,a,i){let r=(0,e.computed)(()=>new Set(t.selected.map(i.value))),o=(0,e.computed)(()=>"none"!==t.selection),s=(0,e.computed)(()=>"single"===t.selection),l=(0,e.computed)(()=>"multiple"===t.selection),u=(0,e.computed)(()=>0!==a.value.length&&a.value.every(e=>r.value.has(i.value(e)))),c=(0,e.computed)(()=>!u.value&&a.value.some(e=>r.value.has(i.value(e)))),d=(0,e.computed)(()=>t.selected.length);return{hasSelectionMode:o,singleSelection:s,multipleSelection:l,allRowsSelected:u,someRowsSelected:c,rowsSelectedNumber:d,isRowSelected:function(e){return r.value.has(e)},clearSelection:function(){n("update:selected",[])},updateSelection:function(e,a,r,o){n("selection",{rows:a,added:r,keys:e,evt:o}),n("update:selected",s.value?r?a:[]:r?[...t.selected,...a]:t.selected.filter(t=>!e.includes(i.value(t))))}}}(t,r,A,d),{colList:q,computedCols:B,computedColsMap:F,computedColspan:V}=Ac(t,b,L),{columnToSort:U,computedSortMethod:$,sort:H}=bc(t,b,q,k),{firstRowIndex:W,lastRowIndex:G,isFirstPage:K,isLastPage:Y,pagesNumber:Q,computedRowsPerPageOptions:Z,computedRowsNumber:J,firstPage:X,prevPage:ee,nextPage:te,lastPage:ne}=function(t,n,a,i,r,o){let{props:s,emit:l,proxy:{$q:u}}=t,c=(0,e.computed)(()=>i.value?a.value.rowsNumber||0:o.value),d=(0,e.computed)(()=>{let{page:e,rowsPerPage:t}=a.value;return(e-1)*t}),h=(0,e.computed)(()=>{let{page:e,rowsPerPage:t}=a.value;return e*t}),p=(0,e.computed)(()=>1===a.value.page),f=(0,e.computed)(()=>0===a.value.rowsPerPage?1:Math.max(1,Math.ceil(c.value/a.value.rowsPerPage))),m=(0,e.computed)(()=>0===h.value||a.value.page>=f.value),_=(0,e.computed)(()=>(s.rowsPerPageOptions.includes(n.value.rowsPerPage)?s.rowsPerPageOptions:[n.value.rowsPerPage,...s.rowsPerPageOptions]).map(e=>({label:0===e?u.lang.table.allRows:String(e),value:e})));return(0,e.watch)(f,(e,t)=>{if(e===t)return;let n=a.value.page;e&&!n?r({page:1}):e1&&r({page:e-1})},nextPage:function(){let{page:e,rowsPerPage:t}=a.value;h.value>0&&e*t0===A.value.length),ie=(0,e.computed)(()=>{let e={};return xu.forEach(n=>{e[n]=t[n]}),void 0===e.virtualScrollItemSize&&(e.virtualScrollItemSize=t.dense?28:48),e});function re(){if(t.grid)return function(){let a=void 0===n.item?a=>{let i=a.cols.map(t=>(0,e.h)("div",{class:"q-table__grid-item-row"},[(0,e.h)("div",{class:"q-table__grid-item-title"},[t.label]),(0,e.h)("div",{class:"q-table__grid-item-value"},[t.value])]));if(L.value){let r=n["body-selection"],o=void 0===r?[(0,e.h)(oi,{modelValue:a.selected,color:t.color,dark:l.value,dense:t.dense,"onUpdate:modelValue":(e,t)=>{D([a.key],[a.row],e,t)}})]:r(a);i.unshift((0,e.h)("div",{class:"q-table__grid-item-row"},o),(0,e.h)(as,{dark:l.value}))}let o={class:["q-table__grid-item-card"+m.value,t.cardClass],style:t.cardStyle};if(void 0!==t.cardStyleFn&&(o.style=[o.style,t.cardStyleFn(a.row)]),void 0!==t.cardClassFn){let e=t.cardClassFn(a.row);e&&(o.class[0]+=` ${e}`)}return(void 0!==t.onRowClick||void 0!==t.onRowDblclick||void 0!==t.onRowContextmenu)&&(o.class[0]+=" cursor-pointer",void 0!==t.onRowClick&&(o.onClick=e=>{r("rowClick",e,a.row,a.pageIndex)}),void 0!==t.onRowDblclick&&(o.onDblclick=e=>{r("rowDblclick",e,a.row,a.pageIndex)}),void 0!==t.onRowContextmenu&&(o.onContextmenu=e=>{r("rowContextmenu",e,a.row,a.pageIndex)})),(0,e.h)("div",{class:"q-table__grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3"+(a.selected?" q-table__grid-item--selected":"")},[(0,e.h)("div",o,i)])}:n.item;return(0,e.h)("div",{class:["q-table__grid-content row",t.cardContainerClass],style:t.cardContainerStyle},A.value.map((e,t)=>a(ce({key:d.value(e),row:e,pageIndex:t}))))}();let a=t.hideHeader?null:_e;if(f.value){let i=n["top-row"],r=n["bottom-row"],o={default:e=>le(e.item,n.body,e.index)};if(void 0!==i){let t=(0,e.h)("tbody",i({cols:B.value}));o.before=null===a?()=>t:()=>[a(),t]}else null!==a&&(o.before=a);return void 0!==r&&(o.after=()=>(0,e.h)("tbody",r({cols:B.value}))),(0,e.h)(gc,{ref:p,class:t.tableClass,style:t.tableStyle,...ie.value,scrollTarget:t.virtualScrollTarget,items:A.value,type:"__qtable",tableColspan:V.value,onVirtualScroll:oe},o)}let i=[ue()];return null!==a&&i.unshift(a()),fc({class:["q-table__middle scroll",t.tableClass],style:t.tableStyle},i)}function oe(e){r("virtualScroll",e)}function se(){return[(0,e.h)(Al,{class:"q-table__linear-progress",color:t.color,dark:l.value,indeterminate:!0,trackColor:"transparent"})]}function le(a,i,o){let s=d.value(a),u=O(s);if(void 0!==i){let e={key:s,row:a,pageIndex:o,__trClass:u?"selected":""};if(void 0!==t.tableRowStyleFn&&(e.__trStyle=t.tableRowStyleFn(a)),void 0!==t.tableRowClassFn){let n=t.tableRowClassFn(a);n&&(e.__trClass=`${n} ${e.__trClass}`)}return i(ce(e))}let c=n["body-cell"],h=B.value.map(t=>{let i=n[`body-cell-${t.name}`],r=void 0===i?c:i;return void 0===r?(0,e.h)("td",{class:t.__tdClass(a),style:t.__tdStyle(a)},Rc(t,a)):r(de({key:s,row:a,pageIndex:o,col:t}))});if(L.value){let i=n["body-selection"],r=void 0===i?[(0,e.h)(oi,{modelValue:u,color:t.color,dark:l.value,dense:t.dense,"onUpdate:modelValue":(e,t)=>{D([s],[a],e,t)}})]:i(function(e){return he(e),e}({key:s,row:a,pageIndex:o}));h.unshift((0,e.h)("td",{class:"q-table--col-auto-width"},r))}let p={key:s,class:{selected:u}};if(void 0!==t.onRowClick&&(p.class["cursor-pointer"]=!0,p.onClick=e=>{r("rowClick",e,a,o)}),void 0!==t.onRowDblclick&&(p.class["cursor-pointer"]=!0,p.onDblclick=e=>{r("rowDblclick",e,a,o)}),void 0!==t.onRowContextmenu&&(p.class["cursor-pointer"]=!0,p.onContextmenu=e=>{r("rowContextmenu",e,a,o)}),void 0!==t.tableRowStyleFn&&(p.style=t.tableRowStyleFn(a)),void 0!==t.tableRowClassFn){let e=t.tableRowClassFn(a);e&&(p.class[e]=!0)}return(0,e.h)("tr",p,h)}function ue(){let t=n.body,a=n["top-row"],i=n["bottom-row"],r=A.value.map((e,n)=>le(e,t,n));return(0,e.h)("tbody",[a?.({cols:B.value}),...r,i?.({cols:B.value})].flat())}function ce(e){return he(e),e.cols=e.cols.map(t=>a({...t},"value",()=>Rc(t,e.row))),e}function de(e){return he(e),a(e,"value",()=>Rc(e.col,e.row)),e}function he(e){Object.assign(e,{cols:B.value,colsMap:F.value,sort:H,rowIndex:W.value+e.pageIndex,color:t.color,dark:l.value,dense:t.dense}),L.value&&a(e,"selected",()=>O(e.key),(t,n)=>{D([e.key],[e.row],t,n)}),a(e,"expand",()=>S(e.key),t=>{T(e.key,t)})}let pe=(0,e.computed)(()=>({pagination:b.value,pagesNumber:Q.value,isFirstPage:K.value,isLastPage:Y.value,firstPage:X,prevPage:ee,nextPage:te,lastPage:ne,inFullscreen:u.value,toggleFullscreen:c}));function fe(){let a,i=n.top,r=n["top-left"],o=n["top-right"],s=n["top-selection"],l=L.value&&void 0!==s&&N.value>0,u="q-table__top relative-position row items-center";return void 0!==i?(0,e.h)("div",{class:u},[i(pe.value)]):(l?a=[s(pe.value)].flat():(a=[],void 0===r?t.title&&a.push((0,e.h)("div",{class:"q-table__control"},[(0,e.h)("div",{class:["q-table__title",t.titleClass]},t.title)])):a.push((0,e.h)("div",{class:"q-table__control"},[r(pe.value)]))),void 0!==o&&a.push((0,e.h)("div",{class:"q-table__separator col"}),(0,e.h)("div",{class:"q-table__control"},[o(pe.value)])),0!==a.length?(0,e.h)("div",{class:u},a):void 0)}let me=(0,e.computed)(()=>I.value?null:z.value);function _e(){let a=function(){let a=n.header,i=n["header-cell"];if(void 0!==a)return[a(ge({header:!0}))].flat();let r=B.value.map(t=>{let a=n[`header-cell-${t.name}`],r=void 0===a?i:a,o=ge({col:t});return void 0===r?(0,e.h)(pc,{key:t.name,props:o},()=>t.label):r(o)});if(M.value&&!t.grid)r.unshift((0,e.h)("th",{class:"q-table--col-auto-width"}," "));else if(R.value){let a=n["header-selection"],i=void 0===a?[(0,e.h)(oi,{color:t.color,modelValue:me.value,dark:l.value,dense:t.dense,"onUpdate:modelValue":ve})]:a(ge({}));r.unshift((0,e.h)("th",{class:"q-table--col-auto-width"},i))}return[(0,e.h)("tr",{class:t.tableHeaderClass,style:t.tableHeaderStyle},r)]}();return t.loading&&void 0===n.loading&&a.push((0,e.h)("tr",{class:"q-table__progress"},[(0,e.h)("th",{class:"relative-position",colspan:V.value},se())])),(0,e.h)("thead",a)}function ge(e){return Object.assign(e,{cols:B.value,sort:H,colsMap:F.value,color:t.color,dark:l.value,dense:t.dense}),R.value&&a(e,"selected",()=>me.value,ve),e}function ve(e){I.value&&(e=!1),D(A.value.map(d.value),A.value,e)}let be=(0,e.computed)(()=>{let e=[t.iconFirstPage||s.iconSet.table.firstPage,t.iconPrevPage||s.iconSet.table.prevPage,t.iconNextPage||s.iconSet.table.nextPage,t.iconLastPage||s.iconSet.table.lastPage];return s.lang.rtl?e.reverse():e});function ye(){if(t.hideBottom)return;if(ae.value){if(t.hideNoData)return;let a=t.loading?t.loadingLabel||s.lang.table.loading:t.filter?t.noResultsLabel||s.lang.table.noResults:t.noDataLabel||s.lang.table.noData,i=n["no-data"];return(0,e.h)("div",{class:"q-table__bottom row items-center q-table__bottom--nodata"},void 0===i?[(0,e.h)(Ke,{class:"q-table__bottom-nodata-icon",name:s.iconSet.table.warning}),a]:[i({message:a,icon:s.iconSet.table.warning,filter:t.filter})])}let a=n.bottom;if(void 0!==a)return(0,e.h)("div",{class:Lc},[a(pe.value)]);let i=!t.hideSelectedBanner&&L.value&&N.value>0?[(0,e.h)("div",{class:"q-table__control"},[(0,e.h)("div",[(t.selectedRowsLabel||s.lang.table.selectedRecords)(N.value)])])]:[];return t.hidePagination?0!==i.length?(0,e.h)("div",{class:Lc},i):void 0:(0,e.h)("div",{class:"q-table__bottom row items-center justify-end"},function(a){let i,{rowsPerPage:r}=b.value,o=t.paginationLabel||s.lang.table.pagination,u=n.pagination,c=t.rowsPerPageOptions.length>1;if(a.push((0,e.h)("div",{class:"q-table__separator col"})),c&&a.push((0,e.h)("div",{class:"q-table__control"},[(0,e.h)("span",{class:"q-table__bottom-item"},[t.rowsPerPageLabel||s.lang.table.recordsPerPage]),(0,e.h)(Au,{class:"q-table__select inline q-table__bottom-item",color:t.color,modelValue:r,options:Z.value,displayValue:0===r?s.lang.table.allRows:r,dark:l.value,borderless:!0,dense:!0,optionsDense:!0,optionsCover:!0,"onUpdate:modelValue":we})])),void 0!==u)i=u(pe.value);else if(i=[(0,e.h)("span",0===r?{}:{class:"q-table__bottom-item"},[r?o(W.value+1,Math.min(G.value,J.value),J.value):o(1,E.value,J.value)])],0!==r&&Q.value>1){let n={color:t.color,round:!0,dense:!0,flat:!0};t.dense&&(n.size="sm"),Q.value>2&&i.push((0,e.h)(Kt,{key:"pgFirst",...n,icon:be.value[0],disable:K.value,"aria-label":s.lang.pagination.first,onClick:X})),i.push((0,e.h)(Kt,{key:"pgPrev",...n,icon:be.value[1],disable:K.value,"aria-label":s.lang.pagination.prev,onClick:ee}),(0,e.h)(Kt,{key:"pgNext",...n,icon:be.value[2],disable:Y.value,"aria-label":s.lang.pagination.next,onClick:te})),Q.value>2&&i.push((0,e.h)(Kt,{key:"pgLast",...n,icon:be.value[3],disable:Y.value,"aria-label":s.lang.pagination.last,onClick:ne}))}return a.push((0,e.h)("div",{class:"q-table__control"},i)),a}(i))}function we(e){k({page:1,rowsPerPage:e.value})}return Object.assign(o.proxy,{requestServerInteraction:w,setPagination:k,firstPage:X,prevPage:ee,nextPage:te,lastPage:ne,isRowSelected:O,clearSelection:j,isRowExpanded:S,setExpanded:C,sort:H,resetVirtualScroll:function(){f.value&&p.value.reset()},scrollTo:function(e,n){if(null!==p.value)return void p.value.scrollTo(e,n);e=Number.parseInt(e,10);let a=h.value.querySelector(`tbody tr:nth-of-type(${e+1})`);if(null!==a){let n=h.value.querySelector(".q-table__middle.scroll"),i=a.offsetTop-t.virtualScrollStickySizeStart,o=i{let n=F.value[e];if(void 0!==n)return Rc(n,t)}}),i(o.proxy,{filteredSortedRows:()=>P.value,computedRows:()=>A.value,computedRowsNumber:()=>J.value}),()=>{let a=[fe()],i={ref:h,class:g.value};return t.grid?a.push((0,e.h)("div",{class:"q-table__middle"},t.gridHeader?[(0,e.h)("table",{class:"q-table"},[_e(e.h)])]:t.loading&&void 0===n.loading?se(e.h):void 0)):Object.assign(i,{class:[i.class,t.cardClass],style:t.cardStyle}),a.push(re(),ye()),t.loading&&void 0!==n.loading&&a.push(n.loading()),(0,e.h)("div",i,a)}}}),Ic=h({name:"QTr",props:{props:Object,noHover:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>"q-tr"+(void 0===t.props||t.props.header?"":" "+t.props.__trClass)+(t.noHover?" q-tr--no-hover":""));return()=>(0,e.h)("tr",{style:t.props?.__trStyle,class:a.value},Ae(n.default))}}),Nc=h({name:"QTd",props:{props:Object,autoWidth:Boolean,noHover:Boolean},setup(t,{slots:n}){let a=(0,e.getCurrentInstance)(),i=(0,e.computed)(()=>"q-td"+(t.autoWidth?" q-table--col-auto-width":"")+(t.noHover?" q-td--no-hover":"")+" ");return()=>{if(void 0===t.props)return(0,e.h)("td",{class:i.value},Ae(n.default));let r=a.vnode.key,o=(void 0===t.props.colsMap?null:t.props.colsMap[r])||t.props.col;if(void 0===o)return;let{row:s}=t.props;return(0,e.h)("td",{class:i.value+o.__tdClass(s),style:o.__tdStyle(s)},Ae(n.default))}}}),Oc=h({name:"QRouteTab",props:{...vt,...ji},emits:Oi,setup(t,{slots:n,emit:a}){let i=bt({useDisableForRouterLinkProps:!1}),{renderTab:r,$tabs:o}=Di(t,n,a,{exact:(0,e.computed)(()=>t.exact),...i});return(0,e.watch)(()=>`${t.name} | ${t.exact} | ${(i.resolvedLink.value||{}).href}`,o.verifyRouteModel),()=>r(i.linkTag.value,i.linkAttrs.value)}});let jc=/^-?[\d]+\/[0-1]\d\/[0-3]\d$/;function Dc(){let e=new Date;return{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}}function qc(e){32===e.keyCode&&w(e)}function Bc(e,t,n){let a=Math.abs(e-t);return Math.min(a,n-a)}function Fc(e,t,n){let a=Array.from({length:t+1},(t,n)=>n+e).filter(e=>n(e));return{min:a[0],max:a.at(-1),values:a,threshold:t+1}}var Vc=h({name:"QTime",props:{...Je,...wa,...Pr,modelValue:{required:!0,validator:e=>"string"==typeof e||null===e},mask:{...Pr.mask,default:null},format24h:{type:Boolean,default:null},defaultDate:{type:String,validator:e=>jc.test(e)},options:Function,hourOptions:Array,minuteOptions:Array,secondOptions:Array,withSeconds:Boolean,nowBtn:Boolean},emits:Er,setup(t,{slots:n,emit:a}){let i,r,o=(0,e.getCurrentInstance)(),{$q:s}=o.proxy,l=Xe(t,s),{tabindex:u,headerClass:c,getLocale:d,getCurrentDate:h}=Lr(t,s),p=xa(ka(t)),f=(0,e.ref)(null),m=(0,e.computed)(()=>"persian"!==t.calendar&&null!==t.mask?t.mask:"HH:mm"+(t.withSeconds?":ss":"")),_=(0,e.computed)(()=>d()),g=(0,e.computed)(()=>function(){if("string"!=typeof t.defaultDate){let e=h(!0);return e.dateHash=Ar(e),e}return Vr(t.defaultDate,"YYYY/MM/DD",void 0,t.calendar)}()),b=Vr(t.modelValue,m.value,_.value,t.calendar,g.value),y=(0,e.ref)(function(e,t){if(null!==e.hour){if(null===e.minute)return"minute";if(t&&null===e.second)return"second"}return"hour"}(b)),k=(0,e.ref)(b),x=(0,e.ref)(null===b.hour||b.hour<12),S=(0,e.computed)(()=>null===t.format24h?s.lang.date.format24h:t.format24h),C=(0,e.computed)(()=>"q-time q-time--"+(t.landscape?"landscape":"portrait")+(l.value?" q-time--dark q-dark":"")+(t.disable?" disabled":t.readonly?" q-time--readonly":"")+(t.bordered?" q-time--bordered":"")+(t.square?" q-time--square no-border-radius":"")+(t.flat?" q-time--flat no-shadow":"")),T=(0,e.computed)(()=>{let e=k.value;return{hour:null===e.hour?"--":S.value?ve(e.hour):String(x.value?0===e.hour?12:e.hour:e.hour>12?e.hour-12:e.hour),minute:null===e.minute?"--":ve(e.minute),second:null===e.second?"--":ve(e.second)}}),P=(0,e.computed)(()=>{let e="hour"===y.value,t=e?12:60,n=k.value[y.value],a=`rotate(${Math.round(360/t*n)-180}deg) translateX(-50%)`;return e&&S.value&&k.value.hour>=12&&(a+=" scale(.7)"),{transform:a}}),E=(0,e.computed)(()=>null!==k.value.hour),A=(0,e.computed)(()=>E.value&&null!==k.value.minute),L=(0,e.computed)(()=>void 0===t.hourOptions?void 0===t.options?null:e=>t.options(e,null,null):e=>t.hourOptions.includes(e)),M=(0,e.computed)(()=>void 0===t.minuteOptions?void 0===t.options?null:e=>t.options(k.value.hour,e,null):e=>t.minuteOptions.includes(e)),R=(0,e.computed)(()=>void 0===t.secondOptions?void 0===t.options?null:e=>t.options(k.value.hour,k.value.minute,e):e=>t.secondOptions.includes(e)),z=(0,e.computed)(()=>{if(null===L.value)return null;let e=Fc(0,11,L.value),t=Fc(12,11,L.value);return{am:e,pm:t,values:[...e.values,...t.values]}}),I=(0,e.computed)(()=>null===M.value?null:Fc(0,59,M.value)),N=(0,e.computed)(()=>null===R.value?null:Fc(0,59,R.value)),O=(0,e.computed)(()=>{switch(y.value){case"hour":return z.value;case"minute":return I.value;case"second":return N.value}}),j=(0,e.computed)(()=>{let e,t=0,n=1,a=null===O.value?void 0:O.value.values;"hour"===y.value?S.value?e=23:(e=11,x.value||(t=12)):(e=55,n=5);let i=[];for(let r=0,o=0;r<=e;r+=n,o++){let e=r+t,n=!1===a?.includes(e),s="hour"===y.value&&0===r?S.value?"00":"12":r;i.push({val:e,index:o,disable:n,label:s})}return i}),D=(0,e.computed)(()=>[[gi,U,void 0,{stop:!0,prevent:!0,mouse:!0}]]);function q(){let e={...h(),...Dc()};le(e),Object.assign(k.value,e),y.value="hour"}function B(e,{min:t,max:n,values:a,threshold:i}){if(e===t)return t;if(en)return Bc(e,t,i)<=Bc(e,n,i)?t:n;let r=a.findIndex(t=>e<=t),o=a[r-1],s=a[r];return e-o<=s-e?o:s}function F(){return ct(o)||null!==O.value&&(0===O.value.values.length||"hour"===y.value&&!S.value&&0===z.value[x.value?"am":"pm"].values.length)}function V(){let{top:e,left:t,width:n}=f.value.getBoundingClientRect(),a=n/2;return{top:e+a,left:t+a,dist:.7*a}}function U(e){if(!F()){if(e.isFirst)return i=V(),void(r=H(e.evt,i));r=H(e.evt,i,r),e.isFinal&&(i=!1,r=null,$())}}function $(){"hour"===y.value?y.value="minute":t.withSeconds&&"minute"===y.value&&(y.value="second")}function H(e,t,n){let a,i=v(e),r=Math.abs(i.top-t.top),o=Math.hypot(i.top-t.top,i.left-t.left),s=Math.asin(r/o)*(180/Math.PI);if(s=i.top=t.dist:0!==z.value.am.values.length:x.value;a=B(a+(e?0:12),z.value[e?"am":"pm"])}else a=Math.round(a),S.value?ot.modelValue,e=>{let n=Vr(e,m.value,_.value,t.calendar,g.value);(n.dateHash!==k.value.dateHash||n.timeHash!==k.value.timeHash)&&(k.value=n,null===n.hour?y.value="hour":x.value=n.hour<12)}),(0,e.watch)([m,_],()=>{(0,e.nextTick)(()=>{le()})});let W={hour(){y.value="hour"},minute(){y.value="minute"},second(){y.value="second"}};function G(e){[13,32].includes(e.keyCode)&&(ie(),w(e))}function K(e){[13,32].includes(e.keyCode)&&(re(),w(e))}function Y(e){F()||(s.platform.is.desktop||H(e,V()),$())}function Q(e){F()||H(e,V())}function Z(e){if([13,32].includes(e.keyCode))y.value="hour",w(e);else if([37,39].includes(e.keyCode)){let t=37===e.keyCode?-1:1;if(null!==z.value){let e=S.value?z.value.values:z.value[x.value?"am":"pm"].values;if(0===e.length)return;null===k.value.hour?ee(e[0]):ee(e[(e.length+e.indexOf(k.value.hour)+t)%e.length])}else{let e=S.value?24:12;ee((S.value||x.value?0:12)+(24+(null===k.value.hour?-t:k.value.hour)+t)%e)}}}function J(e){if([13,32].includes(e.keyCode))y.value="minute",w(e);else if([37,39].includes(e.keyCode)){let t=37===e.keyCode?-1:1;if(null!==I.value){let e=I.value.values;if(0===e.length)return;null===k.value.minute?te(e[0]):te(e[(e.length+e.indexOf(k.value.minute)+t)%e.length])}else te((60+(null===k.value.minute?-t:k.value.minute)+t)%60)}}function X(e){if([13,32].includes(e.keyCode))y.value="second",w(e);else if([37,39].includes(e.keyCode)){let t=37===e.keyCode?-1:1;if(null!==N.value){let e=N.value.values;if(0===e.length)return;null===k.value.second?ne(e[0]):ne(e[(e.length+e.indexOf(k.value.second)+t)%e.length])}else ne((60+(null===k.value.second?-t:k.value.second)+t)%60)}}function ee(e){k.value.hour!==e&&(k.value.hour=e,se())}function te(e){k.value.minute!==e&&(k.value.minute=e,se())}function ne(e){k.value.second!==e&&(k.value.second=e,se())}let ae={hour:ee,minute:te,second:ne};function ie(){x.value||(x.value=!0,null!==k.value.hour&&(k.value.hour-=12,se()))}function re(){x.value&&(x.value=!1,null!==k.value.hour&&(k.value.hour+=12,se()))}function oe(e){let n=t.modelValue;y.value!==e&&null!=n&&""!==n&&"string"!=typeof n&&(y.value=e)}function se(){return null===L.value||L.value(k.value.hour)?null===M.value||M.value(k.value.minute)?t.withSeconds&&null!==R.value&&!R.value(k.value.second)?(k.value.second=null,void oe("second")):void(null===k.value.hour||null===k.value.minute||t.withSeconds&&null===k.value.second||le()):(k.value.minute=null,k.value.second=null,void oe("minute")):(k.value=Vr(),void oe("hour"))}function le(e){let n={...k.value,...e},i="persian"===t.calendar?ve(n.hour)+":"+ve(n.minute)+(t.withSeconds?":"+ve(n.second):""):Jr(new Date(n.year,null===n.month?null:n.month-1,n.day,n.hour,n.minute,n.second,n.millisecond),m.value,_.value,n.year,n.timezoneOffset);n.changed=i!==t.modelValue,a("update:modelValue",i,n)}function ue(){let n=[(0,e.h)("div",{class:"q-time__link "+("hour"===y.value?"q-time__link--active":"cursor-pointer"),tabindex:u.value,role:"button","aria-pressed":"hour"===y.value?"true":"false",onClick:W.hour,onKeydown:qc,onKeyup:Z},T.value.hour),(0,e.h)("div",":"),(0,e.h)("div",E.value?{class:"q-time__link "+("minute"===y.value?"q-time__link--active":"cursor-pointer"),tabindex:u.value,role:"button","aria-pressed":"minute"===y.value?"true":"false",onKeydown:qc,onKeyup:J,onClick:W.minute}:{class:"q-time__link"},T.value.minute)];t.withSeconds&&n.push((0,e.h)("div",":"),(0,e.h)("div",A.value?{class:"q-time__link "+("second"===y.value?"q-time__link--active":"cursor-pointer"),tabindex:u.value,role:"button","aria-pressed":"second"===y.value?"true":"false",onKeydown:qc,onKeyup:X,onClick:W.second}:{class:"q-time__link"},T.value.second));let a=[(0,e.h)("div",{class:"q-time__header-label row items-center no-wrap",dir:"ltr"},n)];return S.value||a.push((0,e.h)("div",{class:"q-time__header-ampm column items-between no-wrap"},[(0,e.h)("div",{class:"q-time__link "+(x.value?"q-time__link--active":"cursor-pointer"),tabindex:u.value,role:"button","aria-pressed":x.value?"true":"false",onClick:ie,onKeydown:qc,onKeyup:G},"AM"),(0,e.h)("div",{class:"q-time__link "+(x.value?"cursor-pointer":"q-time__link--active"),tabindex:u.value,role:"button","aria-pressed":x.value?"false":"true",onClick:re,onKeydown:qc,onKeyup:K},"PM")])),(0,e.h)("div",{class:"q-time__header flex flex-center no-wrap "+c.value},a)}function ce(){let n=k.value[y.value];return(0,e.h)("div",{class:"q-time__content col relative-position"},[(0,e.h)(e.Transition,{name:"q-transition--scale"},()=>(0,e.h)("div",{key:"clock"+y.value,class:"q-time__container-parent absolute-full"},[(0,e.h)("div",{ref:f,class:"q-time__container-child fit overflow-hidden"},[(0,e.withDirectives)((0,e.h)("div",{class:"q-time__clock cursor-pointer non-selectable",onClick:Y,onMousedown:Q},[(0,e.h)("div",{class:"q-time__clock-circle fit"},[(0,e.h)("div",{class:"q-time__clock-pointer"+(null===k.value[y.value]?" hidden":void 0===t.color?"":` text-${t.color}`),style:P.value}),j.value.map(t=>(0,e.h)("div",{class:`q-time__clock-position row flex-center q-time__clock-pos-${t.index}`+(t.val===n?" q-time__clock-position--active "+c.value:t.disable?" q-time__clock-position--disable":"")},[(0,e.h)("span",t.label)]))])]),D.value)])])),t.nowBtn?(0,e.h)(Kt,{class:"q-time__now-button absolute",icon:s.iconSet.datetime.now,unelevated:!0,size:"sm",round:!0,color:t.color,textColor:t.textColor,tabindex:u.value,onClick:q}):null])}return o.proxy.setNow=q,()=>{let a=[ce()],i=Ae(n.default);return void 0!==i&&a.push((0,e.h)("div",{class:"q-time__actions"},i)),void 0!==t.name&&!t.disable&&p(a,"push"),(0,e.h)("div",{class:C.value,tabindex:-1},[ue(),(0,e.h)("div",{class:"q-time__main col overflow-auto"},a)])}}});let Uc=["left","right"],$c=["dense","comfortable","loose"];var Hc=h({name:"QTimeline",props:{...Je,color:{type:String,default:"primary"},side:{type:String,default:"right",validator:e=>Uc.includes(e)},layout:{type:String,default:"dense",validator:e=>$c.includes(e)}},setup(t,{slots:n}){let a=Xe(t,(0,e.getCurrentInstance)().proxy.$q);(0,e.provide)(G,t);let i=(0,e.computed)(()=>`q-timeline q-timeline--${t.layout} q-timeline--${t.layout}--${t.side}`+(a.value?" q-timeline--dark":""));return()=>(0,e.h)("ul",{class:i.value},Ae(n.default))}}),Wc=h({name:"QTimelineEntry",props:{heading:Boolean,tag:{type:String,default:"h3"},side:{type:String,default:"right",validator:e=>["left","right"].includes(e)},icon:String,avatar:String,color:String,title:String,subtitle:String,body:String},setup(t,{slots:n}){let a=(0,e.inject)(G,ee);if(a===ee)return console.error("QTimelineEntry needs to be child of QTimeline"),ee;let i=(0,e.computed)(()=>`q-timeline__entry q-timeline__entry--${t.side}`+(void 0!==t.icon||void 0!==t.avatar?" q-timeline__entry--icon":"")),r=(0,e.computed)(()=>`q-timeline__dot text-${t.color||a.color}`),o=(0,e.computed)(()=>"comfortable"===a.layout&&"left"===a.side);return()=>{let a,s=Le(n.default,[]);if(void 0!==t.body&&s.unshift(t.body),t.heading){let n=[(0,e.h)("div"),(0,e.h)("div"),(0,e.h)(t.tag,{class:"q-timeline__heading-title"},s)];return(0,e.h)("div",{class:"q-timeline__heading"},o.value?n.reverse():n)}void 0===t.icon?void 0!==t.avatar&&(a=[(0,e.h)("img",{class:"q-timeline__dot-img",src:t.avatar})]):a=[(0,e.h)(Ke,{class:"row items-center justify-center",name:t.icon})];let l=[(0,e.h)("div",{class:"q-timeline__subtitle"},[(0,e.h)("span",{},Ae(n.subtitle,[t.subtitle]))]),(0,e.h)("div",{class:r.value},a),(0,e.h)("div",{class:"q-timeline__content"},[(0,e.h)("h6",{class:"q-timeline__title"},Ae(n.title,[t.title]))].concat(s))];return(0,e.h)("li",{class:i.value},o.value?l.reverse():l)}}}),Gc=h({name:"QToolbar",props:{inset:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>"q-toolbar row no-wrap items-center"+(t.inset?" q-toolbar--inset":""));return()=>(0,e.h)("div",{class:a.value,role:"toolbar"},Ae(n.default))}}),Kc=h({name:"QToolbarTitle",props:{shrink:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>"q-toolbar__title ellipsis"+(t.shrink?" col-shrink":""));return()=>(0,e.h)("div",{class:a.value},Ae(n.default))}});let Yc=["none","strict","leaf","leaf-filtered"];function Qc(t){if(void 0!==t.icon)return(0,e.h)(Ke,{class:"q-tree__icon q-mr-sm",name:t.icon,color:t.iconColor});let n=t.img||t.avatar;return n?(0,e.h)("img",{class:`q-tree__${t.img?"img":"avatar"} q-mr-sm`,src:n}):void 0}var Zc=h({name:"QTree",props:{...Je,nodes:{type:Array,required:!0},nodeKey:{type:String,required:!0},labelKey:{type:String,default:"label"},childrenKey:{type:String,default:"children"},dense:Boolean,color:String,controlColor:String,textColor:String,selectedColor:String,icon:String,tickStrategy:{type:String,default:"none",validator:e=>Yc.includes(e)},ticked:Array,expanded:Array,selected:{},noSelectionUnset:Boolean,defaultExpandAll:Boolean,accordion:Boolean,filter:String,filterMethod:Function,duration:{},noConnectors:Boolean,noTransition:Boolean,noNodesLabel:String,noResultsLabel:String},emits:["update:expanded","update:ticked","update:selected","lazyLoad","afterShow","afterHide"],setup(t,{slots:n,emit:i}){let{proxy:r}=(0,e.getCurrentInstance)(),{$q:o}=r,s=Xe(t,o),l=(0,e.ref)({}),u=(0,e.ref)(t.ticked||[]),c=(0,e.ref)(t.expanded||[]),d=(0,e.ref)(null),h={},p={};(0,e.onBeforeUpdate)(()=>{h={},p={}});let f=(0,e.computed)(()=>"q-tree q-tree--"+(t.dense?"dense":"standard")+(t.noConnectors?" q-tree--no-connectors":"")+(s.value?" q-tree--dark":"")+(void 0===t.color?"":` text-${t.color}`)),m=(0,e.computed)(()=>void 0!==t.selected),_=(0,e.computed)(()=>t.icon||o.iconSet.tree.icon),g=(0,e.computed)(()=>t.controlColor||t.color),v=(0,e.computed)(()=>void 0===t.textColor?"":` text-${t.textColor}`),b=(0,e.computed)(()=>{let e=t.selectedColor||t.color;return e?` text-${e}`:""}),y=(0,e.computed)(()=>void 0===t.filterMethod?(e,n)=>{let a=n.toLowerCase();return e[t.labelKey]&&e[t.labelKey].toLowerCase().includes(a)}:t.filterMethod),k=(0,e.computed)(()=>{let e={},n=(a,i)=>{let r=a.tickStrategy||(i?i.tickStrategy:t.tickStrategy),o=a[t.nodeKey],s=a[t.childrenKey]&&Array.isArray(a[t.childrenKey])&&0!==a[t.childrenKey].length,d=!a.disabled&&m.value&&!1!==a.selectable,h=!a.disabled&&!1!==a.expandable,p="none"!==r,f="strict"===r,_="leaf-filtered"===r,g="leaf"===r||"leaf-filtered"===r,v=!a.disabled&&!1!==a.tickable;g&&!0===v&&i&&!0!==i.tickable&&(v=!1);let b=a.lazy;!0===b&&void 0!==l.value[o]&&Array.isArray(a[t.childrenKey])&&(b=l.value[o]);let w={key:o,parent:i,isParent:s,lazy:b,disabled:a.disabled,link:!a.disabled&&(d||h&&(s||!0===b)),children:[],matchesFilter:!t.filter||y.value(a,t.filter),selected:o===t.selected&&d,selectable:d,expanded:!!s&&c.value.includes(o),expandable:h,noTick:!0===a.noTick||!f&&b&&"loaded"!==b,tickable:v,tickStrategy:r,hasTicking:p,strictTicking:f,leafFilteredTicking:_,leafTicking:g,ticked:(f||!s)&&u.value.includes(o)};if(e[o]=w,s&&(w.children=a[t.childrenKey].map(e=>n(e,w)),t.filter&&(!0===w.matchesFilter?!0!==w.noTick&&!0!==w.disabled&&!0===w.tickable&&_&&w.children.every(e=>!0!==e.matchesFilter||!0===e.noTick||!0!==e.tickable)&&(w.tickable=!1):w.matchesFilter=w.children.some(e=>e.matchesFilter)),!0===w.matchesFilter&&(!0!==w.noTick&&!0!==f&&w.children.every(e=>e.noTick)&&(w.noTick=!0),g))){if(w.ticked=!1,w.indeterminate=w.children.some(e=>!0===e.indeterminate),w.tickable=!0===w.tickable&&w.children.some(e=>e.tickable),!0!==w.indeterminate){let e=w.children.reduce((e,t)=>!0===t.ticked?e+1:e,0);e===w.children.length?w.ticked=!0:e>0&&(w.indeterminate=!0)}!0===w.indeterminate&&(w.indeterminateNextState=w.children.every(e=>!0!==e.tickable||!0!==e.ticked))}return w};return t.nodes.forEach(e=>n(e,null)),e}),x=(0,e.computed)(()=>{let e=[];return function n(a){a.forEach(a=>{let i=k.value[a[t.nodeKey]];t.filter&&!0!==i.matchesFilter||(!0===i.link&&e.push(i.key),!0===i.expanded&&Array.isArray(a[t.childrenKey])&&n(a[t.childrenKey]))})}(t.nodes),e}),S=(0,e.computed)(()=>{let e=x.value;if(e.includes(d.value))return d.value;let t=e.find(e=>!0===k.value[e].selected);return void 0===t?e[0]:t});function C(e){let n=(a,i)=>a||!i?a:Array.isArray(i)?i.reduce(n,a):i[t.nodeKey]===e?i:i[t.childrenKey]?n(null,i[t.childrenKey]):void 0;return n(null,t.nodes)}function T(){let e=[],n=a=>{a[t.childrenKey]&&0!==a[t.childrenKey].length&&!1!==a.expandable&&!0!==a.disabled&&(e.push(a[t.nodeKey]),a[t.childrenKey].forEach(n))};t.nodes.forEach(n),void 0===t.expanded?c.value=e:i("update:expanded",e)}function P(n,a,r=C(n),o=k.value[n]){if(o.lazy&&"loaded"!==o.lazy){if("loading"===o.lazy)return;l.value[n]="loading",Array.isArray(r[t.childrenKey])||(r[t.childrenKey]=[]),i("lazyLoad",{node:r,key:n,done:a=>{l.value[n]="loaded",r[t.childrenKey]=Array.isArray(a)?a:[],(0,e.nextTick)(()=>{!0===k.value[n]?.isParent&&E(n,!0)})},fail:()=>{delete l.value[n],0===r[t.childrenKey].length&&delete r[t.childrenKey]}})}else!0===o.isParent&&!0===o.expandable&&E(n,a)}function E(e,n){let a=c.value,r=void 0!==t.expanded;if(r&&(a=[...a]),n){if(t.accordion&&k.value[e]){let n=[];k.value[e].parent?k.value[e].parent.children.forEach(t=>{t.key!==e&&!0===t.expandable&&n.push(t.key)}):t.nodes.forEach(a=>{let i=a[t.nodeKey];i!==e&&n.push(i)}),0!==n.length&&(a=a.filter(e=>!n.includes(e)))}a=[...a,e].filter((e,t,n)=>n.indexOf(e)===t)}else a=a.filter(t=>t!==e);r?i("update:expanded",a):c.value=a}function A(e,n){let a=u.value,r=void 0!==t.ticked;r&&(a=[...a]),a=n?[...a,...e].filter((e,t,n)=>n.indexOf(e)===t):a.filter(t=>!e.includes(t)),r&&i("update:ticked",a)}function L(e,n,i){let o={tree:r,node:e,key:i,color:t.color,dark:s.value};return a(o,"expanded",()=>n.expanded,e=>{e!==n.expanded&&P(i,e)}),a(o,"ticked",()=>n.ticked,e=>{e!==n.ticked&&A([i],e)}),o}function M(e){return(t.filter?e.filter(e=>k.value[e[t.nodeKey]].matchesFilter):e).map(e=>N(e))}function R(){i("afterShow")}function z(){i("afterHide")}function N(a){let i=a[t.nodeKey],r=k.value[i],o=a.header&&n[`header-${a.header}`]||n["default-header"],l=!0===r.isParent?M(a[t.childrenKey]):[],u=0!==l.length||r.lazy&&"loaded"!==r.lazy,c=a.body&&n[`body-${a.body}`]||n["default-body"],f=void 0!==o||void 0!==c?L(a,r,i):null;return void 0!==c&&(c=(0,e.h)("div",{class:"q-tree__node-body relative-position"},[(0,e.h)("div",{class:v.value},[c(f)])])),(0,e.h)("div",{key:i,class:"q-tree__node relative-position q-tree__node--"+(u?"parent":"child")},[(0,e.h)("div",{class:"q-tree__node-header relative-position row no-wrap items-center"+(!0===r.link?" q-tree__node--link q-hoverable q-focusable":"")+(!0===r.selected?" q-tree__node--selected":"")+(!0===r.disabled?" q-tree__node--disabled":""),ref:e=>{p[r.key]=e},tabindex:!0===r.link&&r.key===S.value?0:-1,"aria-expanded":u?r.expanded?"true":"false":null,"aria-selected":r.selectable?r.selected?"true":"false":null,"aria-disabled":!0===r.disabled?"true":null,role:"treeitem",onFocus(){!0===r.link&&(d.value=r.key)},onClick:e=>{q(a,r,e)},onKeydown(e){!0!==I(e)&&(13===e.keyCode?q(a,r,e,!0):32===e.keyCode?B(a,r,e,!0):function(e,t){let n=x.value,a=n.indexOf(e.key);if(36===t)return j(n[0]),!0;if(35===t)return j(n.at(-1)),!0;if(38===t)return j(n[a-1]),!0;if(40===t)return j(n[a+1]),!0;if(39===t)return!0!==e.isParent&&!e.lazy||(!0===e.expanded?j(D(e.children)):P(e.key,!0)),!0;if(37===t){if(!0===e.expanded)P(e.key,!1);else{let t=e.parent;for(;null!==t&&!0!==t.link;)t=t.parent;j(t?.key)}return!0}return!1}(r,e.keyCode)&&w(e))}},[(0,e.h)("div",{class:"q-focus-helper",tabindex:-1,ref:e=>{h[r.key]=e}}),"loading"===r.lazy?(0,e.h)(xt,{class:"q-tree__spinner",color:g.value}):u?(0,e.h)(Ke,{class:"q-tree__arrow"+(!0===r.expanded?" q-tree__arrow--rotate":""),name:_.value,onClick(e){B(a,r,e)}}):null,!0===r.hasTicking&&!0!==r.noTick?(0,e.h)(oi,{class:"q-tree__tickbox",modelValue:!0===r.indeterminate?null:r.ticked,color:g.value,dark:s.value,dense:!0,keepColor:!0,disable:!0!==r.tickable,onKeydown:w,"onUpdate:modelValue":e=>{!function(e,t){if(!0===e.indeterminate&&(t=e.indeterminateNextState),e.strictTicking)A([e.key],t);else if(e.leafTicking){let n=[],a=e=>{e.isParent?(!0!==t&&!0!==e.noTick&&!0===e.tickable&&n.push(e.key),!0===e.leafTicking&&e.children.forEach(a)):!0!==e.noTick&&!0===e.tickable&&(!0!==e.leafFilteredTicking||!0===e.matchesFilter)&&n.push(e.key)};a(e),A(n,t)}}(r,e)}}):null,(0,e.h)("div",{class:"q-tree__node-header-content col row no-wrap items-center"+(!0===r.selected?b.value:v.value)},[o?o(f):[Qc(a),(0,e.h)("div",a[t.labelKey])]])]),u?t.noTransition?!0===r.expanded?(0,e.h)("div",{class:"q-tree__node-collapsible"+v.value,key:`${i}__q`},[c,(0,e.h)("div",{class:"q-tree__children"+(!0===r.disabled?" q-tree__node--disabled":""),role:"group"},l)]):null:(0,e.h)(es,{duration:t.duration,onShow:R,onHide:z},()=>(0,e.withDirectives)((0,e.h)("div",{class:"q-tree__node-collapsible"+v.value,key:`${i}__q`},[c,(0,e.h)("div",{class:"q-tree__children"+(!0===r.disabled?" q-tree__node--disabled":""),role:"group"},l)]),[[e.vShow,r.expanded]])):c])}function O(e){h[e]?.focus()}function j(e){void 0!==e&&(d.value=e,p[e]?.focus())}function D(e){for(let n of e)if(!t.filter||!0===n.matchesFilter){if(!0===n.link)return n.key;if(!0===n.expanded){let e=D(n.children);if(void 0!==e)return e}}}function q(e,n,a,r){!0===n.link&&(d.value=n.key),!0!==r&&!1!==n.selectable&&O(n.key),m.value&&n.selectable?t.noSelectionUnset?n.key!==t.selected&&i("update:selected",void 0===n.key?null:n.key):i("update:selected",n.key===t.selected?null:n.key):B(e,n,a,r),"function"==typeof e.handler&&e.handler(e)}function B(e,t,n,a){!0===t.link&&(d.value=t.key),void 0!==n&&w(n),!0!==a&&!1!==t.selectable&&O(t.key),P(t.key,!t.expanded,e,t)}return(0,e.watch)(()=>t.ticked,e=>{u.value=e}),(0,e.watch)(()=>t.expanded,e=>{c.value=e}),t.defaultExpandAll&&T(),Object.assign(r,{getNodeByKey:C,getTickedNodes:function(){return u.value.map(e=>C(e))},getExpandedNodes:function(){return c.value.map(e=>C(e))},isExpanded:function(e){return!(!e||!k.value[e])&&k.value[e].expanded},collapseAll:function(){void 0===t.expanded?c.value=[]:i("update:expanded",[])},expandAll:T,setExpanded:P,isTicked:function(e){return!(!e||!k.value[e])&&k.value[e].ticked},setTicked:A}),()=>{let n=M(t.nodes);return(0,e.h)("div",{class:f.value,role:"tree"},0===n.length?t.filter?t.noResultsLabel||o.lang.tree.noResults:t.noNodesLabel||o.lang.tree.noNodes:n)}}});function Jc(e){return(100*e).toFixed(2)+"%"}let Xc={...Je,...Ms,label:String,color:String,textColor:String,square:Boolean,flat:Boolean,bordered:Boolean,noThumbnails:Boolean,thumbnailFit:{type:String,default:"cover"},autoUpload:Boolean,hideUploadBtn:Boolean,disable:Boolean,readonly:Boolean},ed=[...Rs,"start","finish","added","removed"];function td(t,n){let r=(0,e.getCurrentInstance)(),{props:o,slots:s,emit:l,proxy:u}=r,{$q:c}=u,d=Xe(o,c);let h=(0,e.computed)(()=>!o.disable&&!o.readonly),p=(0,e.ref)(!1),f=(0,e.ref)(null),m=(0,e.ref)(null),_={files:(0,e.ref)([]),queuedFiles:(0,e.ref)([]),uploadedFiles:(0,e.ref)([]),uploadedSize:(0,e.ref)(0),updateFileStatus:function(e,t,n){if(e.__status=t,"idle"===t)return e.__uploaded=0,e.__progress=0,e.__sizeLabel=fe(e.size),void(e.__progressLabel="0.00%");"failed"!==t?(e.__uploaded="uploaded"===t?e.size:n,e.__progress="uploaded"===t?1:0===e.size?0:Math.min(.9999,e.__uploaded/e.size),e.__progressLabel=Jc(e.__progress),u.$forceUpdate()):u.$forceUpdate()},isAlive:()=>!ct(r)},{pickFiles:g,addFiles:v,onDragover:y,onDragleave:w,processFiles:k,getDndNode:x,maxFilesNumber:S,maxTotalSizeNumber:C}=zs({editable:h,dnd:p,getFileInput:B,addFilesToQueue:F});Object.assign(_,t({props:o,slots:s,emit:l,helpers:_,exposeApi:e=>{Object.assign(_,e)}})),void 0===_.isBusy&&(_.isBusy=(0,e.ref)(!1));let T=(0,e.ref)(0),P=(0,e.computed)(()=>0===T.value?0:_.uploadedSize.value/T.value),E=(0,e.computed)(()=>Jc(P.value)),A=(0,e.computed)(()=>fe(T.value)),L=(0,e.computed)(()=>h.value&&!_.isUploading.value&&(o.multiple||0===_.queuedFiles.value.length)&&(void 0===o.maxFiles||_.files.value.lengthh.value&&!_.isBusy.value&&!_.isUploading.value&&0!==_.queuedFiles.value.length);(0,e.provide)(X,$);let R=(0,e.computed)(()=>"q-uploader column no-wrap"+(d.value?" q-uploader--dark q-dark":"")+(o.bordered?" q-uploader--bordered":"")+(o.square?" q-uploader--square no-border-radius":"")+(o.flat?" q-uploader--flat no-shadow":"")+(o.disable?" disabled q-uploader--disable":"")+(p.value?" q-uploader--dnd":"")),z=(0,e.computed)(()=>"q-uploader__header"+(void 0===o.color?"":` bg-${o.color}`)+(void 0===o.textColor?"":` text-${o.textColor}`));function I(){o.disable||(_.abort(),_.uploadedSize.value=0,T.value=0,q(),_.files.value=[],_.queuedFiles.value=[],_.uploadedFiles.value=[])}function N(){o.disable||j(["uploaded"],({size:e})=>{_.uploadedSize.value-=e,T.value-=e,_.uploadedFiles.value=[]})}function O(){j(["idle","failed"],({size:e})=>{T.value-=e,_.queuedFiles.value=[]})}function j(e,t){if(o.disable)return;let n={files:[],size:0},a=_.files.value.filter(t=>!e.includes(t.__status)||(n.size+=t.size,n.files.push(t),void 0!==t.__img&&window.URL.revokeObjectURL(t.__img.src),!1));0!==n.files.length&&(_.files.value=a,t(n),l("removed",n.files))}function D(e){if(o.disable)return;let t="uploading"===e.__status;"uploaded"===e.__status?(_.uploadedSize.value-=e.size,T.value-=e.size,_.uploadedFiles.value=_.uploadedFiles.value.filter(t=>t.__key!==e.__key)):T.value-=e.size,_.files.value=_.files.value.filter(t=>t.__key!==e.__key||(void 0!==t.__img&&window.URL.revokeObjectURL(t.__img.src),!1)),_.queuedFiles.value=_.queuedFiles.value.filter(t=>t.__key!==e.__key),t&&e.__abort(),l("removed",[e])}function q(){_.files.value.forEach(e=>{void 0!==e.__img&&window.URL.revokeObjectURL(e.__img.src)})}function B(){return m.value||f.value.getElementsByClassName("q-uploader__input")[0]}function F(e,t){let n=k(e,t,_.files.value,!0),a=B();null!=a&&(a.value=""),void 0!==n&&(n.forEach(e=>{if(_.updateFileStatus(e,"idle"),T.value+=e.size,!o.noThumbnails&&e.type.toUpperCase().startsWith("IMAGE")){let t=new Image;t.src=window.URL.createObjectURL(e),e.__img=t}}),_.files.value.push(...n),_.queuedFiles.value.push(...n),l("added",n),o.autoUpload&&_.upload())}function V(){M.value&&_.upload()}function U(t,n,a){if(t){let t,i={type:"a",key:n,icon:c.iconSet.uploader[n],flat:!0,dense:!0};return"add"===n?(i.onClick=g,t=$):i.onClick=a,(0,e.h)(Kt,i,t)}}function $(){return(0,e.h)("input",{ref:m,class:"q-uploader__input overflow-hidden absolute-full",tabindex:-1,type:"file",title:"",accept:o.accept,multiple:o.multiple?"multiple":void 0,capture:o.capture,onMousedown:b,onClick:g,onChange:F})}(0,e.watch)(_.isUploading,(e,t)=>{!t&&e?l("start"):t&&!e&&l("finish")}),(0,e.onBeforeUnmount)(()=>{_.isUploading.value&&_.abort(),0!==_.files.value.length&&q()});let H={};for(let t in _)(0,e.isRef)(_[t])?a(H,t,()=>_[t].value):H[t]=_[t];return Object.assign(H,{upload:V,reset:I,removeUploadedFiles:N,removeQueuedFiles:O,removeFile:D,pickFiles:g,addFiles:v}),i(H,{canAddFiles:()=>L.value,canUpload:()=>M.value,uploadSizeLabel:()=>A.value,uploadProgressLabel:()=>E.value}),n({..._,upload:V,reset:I,removeUploadedFiles:N,removeQueuedFiles:O,removeFile:D,pickFiles:g,addFiles:v,canAddFiles:L,canUpload:M,uploadSizeLabel:A,uploadProgressLabel:E}),()=>{let t=[(0,e.h)("div",{class:z.value},void 0===s.header?[(0,e.h)("div",{class:"q-uploader__header-content column"},[(0,e.h)("div",{class:"flex flex-center no-wrap q-gutter-xs"},[U(0!==_.queuedFiles.value.length,"removeQueue",O),U(0!==_.uploadedFiles.value.length,"removeUploaded",N),_.isUploading.value?(0,e.h)(xt,{class:"q-uploader__spinner"}):null,(0,e.h)("div",{class:"col column justify-center"},[void 0===o.label?null:(0,e.h)("div",{class:"q-uploader__title"},[o.label]),(0,e.h)("div",{class:"q-uploader__subtitle"},[A.value+" / "+E.value])]),U(L.value,"add"),U(!o.hideUploadBtn&&M.value,"upload",_.upload),U(_.isUploading.value,"clear",_.abort)])])]:s.header(H)),(0,e.h)("div",{class:"q-uploader__list scroll"},void 0===s.list?_.files.value.map(t=>(0,e.h)("div",{key:t.__key,class:"q-uploader__file relative-position"+(o.noThumbnails||void 0===t.__img?"":" q-uploader__file--img")+("failed"===t.__status?" q-uploader__file--failed":"uploaded"===t.__status?" q-uploader__file--uploaded":""),style:o.noThumbnails||void 0===t.__img?null:{backgroundImage:'url("'+t.__img.src+'")',backgroundSize:o.thumbnailFit}},[(0,e.h)("div",{class:"q-uploader__file-header row flex-center no-wrap"},["failed"===t.__status?(0,e.h)(Ke,{class:"q-uploader__file-status",name:c.iconSet.type.negative,color:"negative"}):null,(0,e.h)("div",{class:"q-uploader__file-header-content col"},[(0,e.h)("div",{class:"q-uploader__title"},[t.name]),(0,e.h)("div",{class:"q-uploader__subtitle row items-center no-wrap"},[t.__sizeLabel+" / "+t.__progressLabel])]),"uploading"===t.__status?(0,e.h)(pi,{value:t.__progress,min:0,max:1,indeterminate:0===t.__progress}):(0,e.h)(Kt,{round:!0,dense:!0,flat:!0,icon:c.iconSet.uploader["uploaded"===t.__status?"done":"clear"],onClick:()=>{D(t)}})])])):s.list(H)),x("uploader")];_.isBusy.value&&t.push((0,e.h)("div",{class:"q-uploader__overlay absolute-full flex flex-center"},[(0,e.h)(xt)]));let n={ref:f,class:R.value};return L.value&&Object.assign(n,{onDragover:y,onDragleave:w}),(0,e.h)("div",n,t)}}let nd=()=>!0;function ad(e){let t={};return e.forEach(e=>{t[e]=nd}),t}let id=ad(ed);function rd({name:e,props:t,emits:n,injectPlugin:a}){return h({name:e,props:{...Xc,...t},emits:ne(n)?{...id,...n}:[...ed,...n],setup:(e,{expose:t})=>td(a,t)})}function od(e){return"function"==typeof e?e:()=>e}let sd={url:[Function,String],method:{type:[Function,String],default:"POST"},fieldName:{type:[Function,String],default:()=>e=>e.name},headers:[Function,Array],formFields:[Function,Array],withCredentials:[Function,Boolean],sendRaw:[Function,Boolean],batch:[Function,Boolean],factory:Function};var ld=rd({name:"QUploader",props:sd,emits:["factoryFailed","uploaded","failed","uploading"],injectPlugin:function({props:t,emit:n,helpers:a}){let i=(0,e.ref)([]),r=(0,e.ref)([]),o=(0,e.ref)(0),s=new WeakSet,l=(0,e.computed)(()=>({url:od(t.url),method:od(t.method),headers:od(t.headers),formFields:od(t.formFields),fieldName:od(t.fieldName),withCredentials:od(t.withCredentials),sendRaw:od(t.sendRaw),batch:od(t.batch)})),u=(0,e.computed)(()=>o.value>0),c=(0,e.computed)(()=>0!==r.value.length),d=e=>e.filter(e=>a.files.value.includes(e));function h(e){o.value++;let i,l=(t,i)=>{if(a.isAlive()){void 0!==i&&(r.value=r.value.filter(e=>e!==i));let s=d(e);0!==s.length&&(a.queuedFiles.value.push(...s),s.forEach(e=>{a.updateFileStatus(e,"failed")}),n("factoryFailed",t,s)),o.value--}};if("function"==typeof t.factory){try{i=t.factory(e)}catch(e){return void l(e)}Object(i)===i?"function"==typeof i.catch&&"function"==typeof i.then?(r.value.push(i),i.then(e=>{s.has(i)?l(Error("Aborted"),i):Object(e)===e?a.isAlive()&&(r.value=r.value.filter(e=>e!==i),u(e)):l(Error("QUploader: factory() does not return properly"),i)}).catch(e=>{l(e,i)})):u(i):l(Error("QUploader: factory() does not return properly"))}else u({});function u(t){let n=d(e);if(0!==n.length)try{p(n,t)}catch(e){l(e)}else o.value--}}function p(e,t){let r=new FormData,s=new XMLHttpRequest,u=(e,n)=>void 0===t[e]?l.value[e](n):od(t[e])(n),c=u("url",e);if(!c)return console.error("q-uploader: invalid or no URL specified"),a.queuedFiles.value.push(...e),e.forEach(e=>{a.updateFileStatus(e,"failed")}),void o.value--;let h=u("formFields",e);void 0!==h&&h.forEach(e=>{r.append(e.name,e.value)});let p,f=0,m=0,_=0,g=0;s.upload.addEventListener("progress",t=>{if(p)return;let n=Math.min(g,t.loaded);a.uploadedSize.value+=n-_,_=n;let i=_-m;for(let t=f;i>0&&t=n.size))return void a.updateFileStatus(n,"uploading",i);i-=n.size,f++,m+=n.size,a.updateFileStatus(n,"uploading",n.size)}},!1),s.addEventListener("readystatechange",()=>{if(!(s.readyState<4)){if(s.status&&s.status<400){let t=d(e),i=t.reduce((e,t)=>e+t.size,0);a.uploadedSize.value+=i-_,0!==t.length&&(a.uploadedFiles.value.push(...t),t.forEach(e=>{a.updateFileStatus(e,"uploaded")}),n("uploaded",{files:t,xhr:s}))}else{p=!0,a.uploadedSize.value-=_;let t=d(e);0!==t.length&&(a.queuedFiles.value.push(...t),t.forEach(e=>{a.updateFileStatus(e,"failed")}),n("failed",{files:t,xhr:s}))}o.value--,i.value=i.value.filter(e=>e!==s)}}),s.open(u("method",e),c),!0===u("withCredentials",e)&&(s.withCredentials=!0);let v=u("headers",e);void 0!==v&&v.forEach(e=>{s.setRequestHeader(e.name,e.value)});let b=u("sendRaw",e);e.forEach(e=>{a.updateFileStatus(e,"uploading",0),!0!==b&&r.append(u("fieldName",e),e,e.name),e.xhr=s,e.__abort=()=>{s.abort()},g+=e.size}),n("uploading",{files:e,xhr:s}),i.value.push(s),!0===b?s.send(new Blob(e)):s.send(r)}return{isUploading:u,isBusy:c,abort:function(){i.value.forEach(e=>{e.abort()}),r.value.forEach(e=>{s.add(e)})},upload:function(){let e=[...a.queuedFiles.value];a.queuedFiles.value=[],l.value.batch(e)?h(e):e.forEach(e=>{h([e])})}}}}),ud=h({name:"QUploaderAddTrigger",setup(){let t=(0,e.inject)(X,ee);return t===ee&&console.error("QUploaderAddTrigger needs to be child of QUploader"),t}}),cd=h({name:"QVideo",props:{...$s,src:{type:String,required:!0},title:String,fetchpriority:{type:String,default:"auto"},loading:{type:String,default:"eager"},referrerpolicy:{type:String,default:"strict-origin-when-cross-origin"}},setup(t){let n=Hs(t),a=(0,e.computed)(()=>"q-video"+(void 0===t.ratio?"":" q-video--responsive"));return()=>(0,e.h)("div",{class:a.value,style:n.value},[(0,e.h)("iframe",{src:t.src,title:t.title,fetchpriority:t.fetchpriority,loading:t.loading,referrerpolicy:t.referrerpolicy,frameborder:"0",allowfullscreen:!0})])}}),dd=n({QAjaxBar:()=>Ce,QAvatar:()=>Ye,QBadge:()=>Ze,QBanner:()=>et,QBar:()=>tt,QBreadcrumbs:()=>ht,QBreadcrumbsEl:()=>yt,QBtn:()=>Kt,QBtnDropdown:()=>ya,QBtnGroup:()=>Yt,QBtnToggle:()=>Ca,QCard:()=>Ta,QCardActions:()=>Ea,QCardSection:()=>Pa,QCarousel:()=>Qa,QCarouselControl:()=>Ja,QCarouselSlide:()=>Za,QChatMessage:()=>Xa,QCheckbox:()=>oi,QChip:()=>ui,QCircularProgress:()=>pi,QColor:()=>mr,QDate:()=>so,QDialog:()=>Po,QDrawer:()=>Eo,QEditor:()=>Jo,QExpansionItem:()=>ss,QFab:()=>ps,QFabAction:()=>_s,QField:()=>Es,QFile:()=>Os,QFooter:()=>Ds,QForm:()=>Bs,QFormChildMixin:()=>Fs,QHeader:()=>Us,QIcon:()=>Ke,QImg:()=>Ws,QInfiniteScroll:()=>Ks,QInnerLoading:()=>Ys,QInput:()=>dl,QIntersection:()=>_l,QItem:()=>jo,QItemLabel:()=>Xo,QItemSection:()=>Do,QKnob:()=>wl,QLayout:()=>Tl,QLinearProgress:()=>Al,QList:()=>vl,QMarkupTable:()=>Ml,QMenu:()=>ma,QNoSsr:()=>Rl,QOptionGroup:()=>ql,QPage:()=>Bl,QPageContainer:()=>Fl,QPageScroller:()=>$l,QPageSticky:()=>Hl,QPagination:()=>Gl,QParallax:()=>Zl,QPopupEdit:()=>Xl,QPopupProxy:()=>eu,QPullToRefresh:()=>tu,QRadio:()=>Il,QRange:()=>ru,QRating:()=>ou,QResizeObserver:()=>Ai,QResponsive:()=>su,QRouteTab:()=>Oc,QScrollArea:()=>pu,QScrollObserver:()=>Sl,QSelect:()=>Au,QSeparator:()=>as,QSkeleton:()=>Ru,QSlideItem:()=>Iu,QSlideTransition:()=>es,QSlider:()=>Ci,QSpace:()=>Nu,QSpinner:()=>xt,QSpinnerAudio:()=>Ou,QSpinnerBall:()=>ju,QSpinnerBars:()=>Du,QSpinnerBox:()=>qu,QSpinnerClock:()=>Bu,QSpinnerComment:()=>Fu,QSpinnerCube:()=>Vu,QSpinnerDots:()=>Uu,QSpinnerFacebook:()=>$u,QSpinnerGears:()=>Hu,QSpinnerGrid:()=>Wu,QSpinnerHearts:()=>Gu,QSpinnerHourglass:()=>Ku,QSpinnerInfinity:()=>Yu,QSpinnerIos:()=>Qu,QSpinnerOrbit:()=>Zu,QSpinnerOval:()=>Ju,QSpinnerPie:()=>Xu,QSpinnerPuff:()=>ec,QSpinnerRadio:()=>tc,QSpinnerRings:()=>nc,QSpinnerTail:()=>ac,QSplitter:()=>ic,QStep:()=>uc,QStepper:()=>dc,QStepperNavigation:()=>hc,QTab:()=>qi,QTabPanel:()=>Fi,QTabPanels:()=>Bi,QTable:()=>zc,QTabs:()=>Ii,QTd:()=>Nc,QTh:()=>pc,QTime:()=>Vc,QTimeline:()=>Hc,QTimelineEntry:()=>Wc,QToggle:()=>Nl,QToolbar:()=>Gc,QToolbarTitle:()=>Kc,QTooltip:()=>Oo,QTr:()=>Ic,QTree:()=>Zc,QUploader:()=>ld,QUploaderAddTrigger:()=>ud,QVideo:()=>cd,QVirtualScroll:()=>gc});function hd(e){return!1===e?0:!0===e||void 0===e?1:Number.parseInt(e,10)||0}var pd=p({name:"close-popup",beforeMount(e,{value:t}){let n={depth:hd(t),handler(t){0!==n.depth&&setTimeout(()=>{let a=function(e){return rn.find(t=>null!==t.contentEl&&t.contentEl.contains(e))}(e);void 0!==a&&function(e,t,n){for(;0!==n&&null!=e;){if(e.__qPortal){if(n--,"QMenu"===e.$options.name){e=on(e,t);continue}e.hide(t)}e=ot(e)}}(a,t,n.depth)},0)},handlerKey(e){N(e,13)&&n.handler(e)}};e.__qclosepopup=n,e.addEventListener("click",n.handler),e.addEventListener("keyup",n.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=hd(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener("click",t.handler),e.removeEventListener("keyup",t.handlerKey),delete e.__qclosepopup}});let fd,md=0;function _d(){return!1}function gd(e,t){void 0===fd&&(fd=document.createElement("div"),fd.style.cssText="position: absolute; left: 0; top: 0",document.body.append(fd));let n=e.getBoundingClientRect(),a=fd.getBoundingClientRect(),{marginLeft:i,marginRight:r,marginTop:o,marginBottom:s}=window.getComputedStyle(e),l=Number.parseInt(i,10)+Number.parseInt(r,10),u=Number.parseInt(o,10)+Number.parseInt(s,10);return{left:n.left-a.left,top:n.top-a.top,width:n.right-n.left,height:n.bottom-n.top,widthM:n.right-n.left+(t?0:l),heightM:n.bottom-n.top+(t?0:u),marginH:t?l:0,marginV:t?u:0}}function vd(e){return{width:e.scrollWidth,height:e.scrollHeight}}let bd=["Top","Right","Bottom","Left"],yd=["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],wd=/-block|-inline|block-|inline-/,kd=/(-block|-inline|block-|inline-).*:/;function xd(e,t){let n=window.getComputedStyle(e),a={};for(let e=0;e!kd.test(e)).join(";"):n[i]}return a}let Sd=["absolute","fixed","relative","sticky"];function Cd(e){let t=e,n=0;for(;null!==t&&t!==document;){let{position:a,zIndex:i}=window.getComputedStyle(t),r=Number(i);r>n&&(t===e||Sd.includes(a))&&(n=r),t=t.parentNode}return n}function Td(e,t){let n=Number.parseFloat(e);return Number.isFinite(n)?Math.max(0,Math.min(1,n)):t}function Pd(e){let t=typeof e;return"function"===t?e():"string"===t?document.querySelector(e):e}function Ed(e){return e&&e.ownerDocument===document&&null!==e.parentNode}function Ad(e){let t=_d,n=!1,a=!0,i=function(e){return{from:e.from,to:void 0===e.to?e.from:e.to}}(e),r=function(e){"number"==typeof e?e={duration:e}:"function"==typeof e&&(e={onEnd:e});let t=Number.parseInt(e.duration,10),n=Number.parseInt(e.delay,10);return{...e,waitFor:void 0===e.waitFor?0:e.waitFor,duration:Number.isNaN(t)?300:t,delay:Number.isNaN(n)?0:n,easing:"string"==typeof e.easing&&0!==e.easing.length?e.easing:"ease-in-out",fill:"string"==typeof e.fill&&0!==e.fill.length?e.fill:"none",resize:!0===e.resize,useCSS:!0===e.useCSS||!0===e.usecss,hideFromClone:!0===e.hideFromClone||!0===e.hidefromclone,keepToClone:!0===e.keepToClone||!0===e.keeptoclone,tween:!0===e.tween,tweenFromOpacity:Td(e.tweenFromOpacity,.6),tweenToOpacity:Td(e.tweenToOpacity,.5)}}(e),o=Pd(i.from);if(!Ed(o))return t;"function"==typeof o.qMorphCancel&&o.qMorphCancel();let s,l,u,c,d=o.parentNode,h=o.nextElementSibling,p=gd(o,r.resize),{width:f,height:m}=vd(d),{borderWidth:_,borderStyle:g,borderColor:v,borderRadius:b,backgroundColor:y,transform:w,position:k,cssText:x}=xd(o,["borderWidth","borderStyle","borderColor","borderRadius","backgroundColor","transform","position","cssText"]),S=o.classList.toString(),C=o.style.cssText,T=o.cloneNode(!0),P=!0===r.tween?o.cloneNode(!0):void 0;return void 0!==P&&(P.className=P.classList.toString().split(" ").filter(e=>!e.startsWith("bg-")).join(" ")),!0===r.hideFromClone&&T.classList.add("q-morph--internal"),T.setAttribute("aria-hidden","true"),T.style.transition="none",T.style.animation="none",T.style.pointerEvents="none",d.insertBefore(T,h),o.qMorphCancel=()=>{n=!0,T.remove(),P?.remove(),!0===r.hideFromClone&&T.classList.remove("q-morph--internal"),o.qMorphCancel=void 0},"function"==typeof e.onToggle&&e.onToggle(),requestAnimationFrame(()=>{let e=Pd(i.to);if(!0===n||!Ed(e))return void("function"==typeof o.qMorphCancel&&o.qMorphCancel());o!==e&&"function"==typeof e.qMorphCancel&&e.qMorphCancel(),!0!==r.keepToClone&&e.classList.add("q-morph--internal"),T.classList.add("q-morph--internal");let{width:h,height:E}=vd(d),{width:A,height:L}=vd(e.parentNode);!0!==r.hideFromClone&&T.classList.remove("q-morph--internal"),e.qMorphCancel=()=>{n=!0,T.remove(),P?.remove(),!0===r.hideFromClone&&T.classList.remove("q-morph--internal"),!0!==r.keepToClone&&e.classList.remove("q-morph--internal"),o.qMorphCancel=void 0,e.qMorphCancel=void 0};let M=()=>{if(!0===n)return void("function"==typeof e.qMorphCancel&&e.qMorphCancel());!0!==r.hideFromClone&&(T.classList.add("q-morph--internal"),T.innerHTML="",T.style.left=0,T.style.right="unset",T.style.top=0,T.style.bottom="unset",T.style.transform="none"),!0!==r.keepToClone&&e.classList.remove("q-morph--internal");let i=e.parentNode,{width:M,height:R}=vd(i),z=e.cloneNode(r.keepToClone);z.setAttribute("aria-hidden","true"),!0!==r.keepToClone&&(z.style.left=0,z.style.right="unset",z.style.top=0,z.style.bottom="unset",z.style.transform="none",z.style.pointerEvents="none"),z.classList.add("q-morph--internal");let I=e===o&&d===i?T:e.nextElementSibling;i.insertBefore(z,I);let{borderWidth:N,borderStyle:O,borderColor:j,borderRadius:D,backgroundColor:q,transform:B,position:F,cssText:V}=xd(e,["borderWidth","borderStyle","borderColor","borderRadius","backgroundColor","transform","position","cssText"]),U=e.classList.toString(),$=e.style.cssText;e.style.cssText=V,e.style.transform="none",e.style.animation="none",e.style.transition="none",e.className=U.split(" ").filter(e=>!e.startsWith("bg-")).join(" ");let H=gd(e,r.resize),W=p.left-H.left,G=p.top-H.top,K=p.width/(H.width>0?H.width:10),Y=p.height/(H.height>0?H.height:100),Q=f-h,Z=m-E,J=M-A,X=R-L,ee=Math.max(p.widthM,Q),te=Math.max(p.heightM,Z),ae=Math.max(H.widthM,J),ie=Math.max(H.heightM,X),re=o===e&&!["absolute","fixed"].includes(F)&&!["absolute","fixed"].includes(k),oe="fixed"===F,se=i;for(;!oe&&se!==document;)oe="fixed"===window.getComputedStyle(se).position,se=se.parentNode;if(!0!==r.hideFromClone&&(T.style.display="block",T.style.flex="0 0 auto",T.style.opacity=0,T.style.minWidth="unset",T.style.maxWidth="unset",T.style.minHeight="unset",T.style.maxHeight="unset",T.classList.remove("q-morph--internal")),!0!==r.keepToClone&&(z.style.display="block",z.style.flex="0 0 auto",z.style.opacity=0,z.style.minWidth="unset",z.style.maxWidth="unset",z.style.minHeight="unset",z.style.maxHeight="unset"),z.classList.remove("q-morph--internal"),"string"==typeof r.classes&&(e.className+=" "+r.classes),"string"==typeof r.style)e.style.cssText+=" "+r.style;else if(ne(r.style))for(let t in r.style)e.style[t]=r.style[t];let le=Cd(T),ue=Cd(e),ce=oe?document.documentElement:{scrollLeft:0,scrollTop:0};e.style.position=oe?"fixed":"absolute",e.style.left=H.left-ce.scrollLeft+"px",e.style.right="unset",e.style.top=H.top-ce.scrollTop+"px",e.style.margin=0,!0===r.resize&&(e.style.minWidth="unset",e.style.maxWidth="unset",e.style.minHeight="unset",e.style.maxHeight="unset",e.style.overflow="hidden",e.style.overflowX="hidden",e.style.overflowY="hidden"),document.body.append(e),void 0!==P&&(P.style.cssText=x,P.style.transform="none",P.style.animation="none",P.style.transition="none",P.style.position=e.style.position,P.style.left=p.left-ce.scrollLeft+"px",P.style.right="unset",P.style.top=p.top-ce.scrollTop+"px",P.style.margin=0,P.style.pointerEvents="none",!0===r.resize&&(P.style.minWidth="unset",P.style.maxWidth="unset",P.style.minHeight="unset",P.style.maxHeight="unset",P.style.overflow="hidden",P.style.overflowX="hidden",P.style.overflowY="hidden"),document.body.append(P));let de=n=>{o===e&&!0!==a?(e.style.cssText=C,e.className=S):(e.style.cssText=$,e.className=U),z.parentNode===i&&z.before(e),T.remove(),z.remove(),P?.remove(),t=_d,o.qMorphCancel=void 0,e.qMorphCancel=void 0,"function"==typeof r.onEnd&&r.onEnd(!0===a?"to":"from",!0===n)};if(!0!==r.useCSS&&"function"==typeof e.animate){let i=!0===r.resize?{transform:`translate(${W}px, ${G}px)`,width:`${ee}px`,height:`${te}px`}:{transform:`translate(${W}px, ${G}px) scale(${K}, ${Y})`},d=!0===r.resize?{width:`${ae}px`,height:`${ie}px`}:{},h=!0===r.resize?{width:`${ee}px`,height:`${te}px`}:{},f=!0===r.resize?{transform:`translate(${-1*W}px, ${-1*G}px)`,width:`${ae}px`,height:`${ie}px`}:{transform:`translate(${-1*W}px, ${-1*G}px) scale(${1/K}, ${1/Y})`},m=void 0===P?{backgroundColor:y}:{opacity:r.tweenToOpacity},k=void 0===P?{backgroundColor:q}:{opacity:1};c=e.animate([{margin:0,borderWidth:_,borderStyle:g,borderColor:v,borderRadius:b,zIndex:le,transformOrigin:"0 0",...i,...m},{margin:0,borderWidth:N,borderStyle:O,borderColor:j,borderRadius:D,zIndex:ue,transformOrigin:"0 0",transform:B,...d,...k}],{duration:r.duration,easing:r.easing,fill:r.fill,delay:r.delay}),l=void 0===P?void 0:P.animate([{opacity:r.tweenFromOpacity,margin:0,borderWidth:_,borderStyle:g,borderColor:v,borderRadius:b,zIndex:le,transformOrigin:"0 0",transform:w,...h},{opacity:0,margin:0,borderWidth:N,borderStyle:O,borderColor:j,borderRadius:D,zIndex:ue,transformOrigin:"0 0",...f}],{duration:r.duration,easing:r.easing,fill:r.fill,delay:r.delay}),s=!0===r.hideFromClone||!0===re?void 0:T.animate([{margin:`${Z<0?Z/2:0}px ${Q<0?Q/2:0}px`,width:`${ee+p.marginH}px`,height:`${te+p.marginV}px`},{margin:0,width:0,height:0}],{duration:r.duration,easing:r.easing,fill:r.fill,delay:r.delay}),u=!0===r.keepToClone?void 0:z.animate([!0===re?{margin:`${Z<0?Z/2:0}px ${Q<0?Q/2:0}px`,width:`${ee+p.marginH}px`,height:`${te+p.marginV}px`}:{margin:0,width:0,height:0},{margin:`${X<0?X/2:0}px ${J<0?J/2:0}px`,width:`${ae+H.marginH}px`,height:`${ie+H.marginV}px`}],{duration:r.duration,easing:r.easing,fill:r.fill,delay:r.delay});let x=e=>{s?.cancel(),l?.cancel(),u?.cancel(),c.cancel(),c.removeEventListener("finish",x),c.removeEventListener("cancel",x),de(e),s=void 0,l=void 0,u=void 0,c=void 0};o.qMorphCancel=()=>{o.qMorphCancel=void 0,n=!0,x()},e.qMorphCancel=()=>{e.qMorphCancel=void 0,n=!0,x()},c.addEventListener("finish",x),c.addEventListener("cancel",x),t=e=>!0!==n&&void 0!==c&&(!0===e?(x(!0),!0):(a=!0!==a,s?.reverse(),l?.reverse(),u?.reverse(),c.reverse(),!0))}else{let i="q-morph-anim-"+ ++md,s=document.createElement("style"),l=!0===r.resize?`\n transform: translate(${W}px, ${G}px);\n width: ${ee}px;\n height: ${te}px;\n `:`transform: translate(${W}px, ${G}px) scale(${K}, ${Y});`,u=!0===r.resize?`\n width: ${ae}px;\n height: ${ie}px;\n `:"",c=!0===r.resize?`\n width: ${ee}px;\n height: ${te}px;\n `:"",d=!0===r.resize?`\n transform: translate(${-1*W}px, ${-1*G}px);\n width: ${ae}px;\n height: ${ie}px;\n `:`transform: translate(${-1*W}px, ${-1*G}px) scale(${1/K}, ${1/Y});`,h=void 0===P?`background-color: ${y};`:`opacity: ${r.tweenToOpacity};`,f=void 0===P?`background-color: ${q};`:"opacity: 1;",m=void 0===P?"":`\n @keyframes ${i}-from-tween {\n 0% {\n opacity: ${r.tweenFromOpacity};\n margin: 0;\n border-width: ${_};\n border-style: ${g};\n border-color: ${v};\n border-radius: ${b};\n z-index: ${le};\n transform-origin: 0 0;\n transform: ${w};\n ${c}\n }\n\n 100% {\n opacity: 0;\n margin: 0;\n border-width: ${N};\n border-style: ${O};\n border-color: ${j};\n border-radius: ${D};\n z-index: ${ue};\n transform-origin: 0 0;\n ${d}\n }\n }\n `,k=!0===r.hideFromClone||!0===re?"":`\n @keyframes ${i}-from {\n 0% {\n margin: ${Z<0?Z/2:0}px ${Q<0?Q/2:0}px;\n width: ${ee+p.marginH}px;\n height: ${te+p.marginV}px;\n }\n\n 100% {\n margin: 0;\n width: 0;\n height: 0;\n }\n }\n `,x=!0===re?`\n margin: ${Z<0?Z/2:0}px ${Q<0?Q/2:0}px;\n width: ${ee+p.marginH}px;\n height: ${te+p.marginV}px;\n `:"\n margin: 0;\n width: 0;\n height: 0;\n ",S=!0===r.keepToClone?"":`\n @keyframes ${i}-to {\n 0% {\n ${x}\n }\n\n 100% {\n margin: ${X<0?X/2:0}px ${J<0?J/2:0}px;\n width: ${ae+H.marginH}px;\n height: ${ie+H.marginV}px;\n }\n }\n `;s.innerHTML=`\n @keyframes ${i} {\n 0% {\n margin: 0;\n border-width: ${_};\n border-style: ${g};\n border-color: ${v};\n border-radius: ${b};\n background-color: ${y};\n z-index: ${le};\n transform-origin: 0 0;\n ${l}\n ${h}\n }\n\n 100% {\n margin: 0;\n border-width: ${N};\n border-style: ${O};\n border-color: ${j};\n border-radius: ${D};\n background-color: ${q};\n z-index: ${ue};\n transform-origin: 0 0;\n transform: ${B};\n ${u}\n ${f}\n }\n }\n\n ${k}\n\n ${m}\n\n ${S}\n `,document.head.append(s);let C="normal";T.style.animation=`${r.duration}ms ${r.easing} ${r.delay}ms ${C} ${r.fill} ${i}-from`,void 0!==P&&(P.style.animation=`${r.duration}ms ${r.easing} ${r.delay}ms ${C} ${r.fill} ${i}-from-tween`),z.style.animation=`${r.duration}ms ${r.easing} ${r.delay}ms ${C} ${r.fill} ${i}-to`,e.style.animation=`${r.duration}ms ${r.easing} ${r.delay}ms ${C} ${r.fill} ${i}`;let E=t=>{(t!==Object(t)||t.animationName===i)&&(e.removeEventListener("animationend",E),e.removeEventListener("animationcancel",E),de(),s.remove())};o.qMorphCancel=()=>{o.qMorphCancel=void 0,n=!0,E()},e.qMorphCancel=()=>{e.qMorphCancel=void 0,n=!0,E()},e.addEventListener("animationend",E),e.addEventListener("animationcancel",E),t=t=>!!(!0!==n&&e&&T&&z)&&(!0===t?(E(),!0):(a=!0!==a,C="normal"===C?"reverse":"normal",T.style.animationDirection=C,P.style.animationDirection=C,z.style.animationDirection=C,e.style.animationDirection=C,!0))}};r.waitFor>0||"transitionend"===r.waitFor||r.waitFor===Object(r.waitFor)&&"function"==typeof r.waitFor.then?(r.waitFor>0?new Promise(e=>{setTimeout(e,r.waitFor)}):"transitionend"===r.waitFor?new Promise(t=>{let n=()=>{null!==a&&(clearTimeout(a),a=null),e&&(e.removeEventListener("transitionend",n),e.removeEventListener("transitioncancel",n)),t?.(),t=null},a=setTimeout(n,400);e.addEventListener("transitionend",n),e.addEventListener("transitioncancel",n)}):r.waitFor).then(M).catch(()=>{"function"==typeof e.qMorphCancel&&e.qMorphCancel()}):M()}),e=>t(e)}let Ld={},Md=["duration","delay","easing","fill","classes","style","duration","resize","useCSS","hideFromClone","keepToClone","tween","tweenFromOpacity","tweenToOpacity","waitFor","onEnd"],Rd=["resize","useCSS","hideFromClone","keepToClone","tween"];function zd(e,t){e.clsAction!==t&&(e.clsAction=t,e.el.classList[t]("q-morph--invisible"))}function Id(e){if(e.animating||e.queue.length<2)return;let[t,n]=e.queue;e.animating=!0,t.animating=!0,n.animating=!0,zd(t,"remove"),zd(n,"remove");let a=Ad({from:t.el,to:n.el,onToggle(){zd(t,"add"),zd(n,"remove")},...n.opts,onEnd(a,i){n.opts.onEnd?.(a,i),!i&&(t.animating=!1,n.animating=!1,e.animating=!1,e.cancel=void 0,e.queue.shift(),Id(e))}});e.cancel=()=>{a(!0),e.cancel=void 0}}function Nd(e,t){let n=t.opts;Rd.forEach(t=>{n[t]=!0===e[t]})}function Od(e,t){if(t.name===e){let n=Ld[t.group];return void(void 0===n?(Ld[t.group]={name:t.group,model:e,queue:[t],animating:!1},zd(t,"remove")):n.model!==e&&(n.model=e,n.queue.push(t),!n.animating&&2===n.queue.length&&Id(n)))}t.animating||zd(t,"add")}function jd(e,t){let n;Object(t)===t?(n=String(t.model),function(e,t){void 0!==e.group&&(t.group=e.group),void 0!==e.name&&(t.name=e.name);let n=t.opts;Md.forEach(t=>{void 0!==e[t]&&(n[t]=e[t])})}(t,e),Nd(t,e)):n=String(t),n===e.model?!e.animating&&void 0!==e.clsAction&&e.el.classList[e.clsAction]("q-morph--invisible"):(e.model=n,Od(n,e))}var Dd=p({name:"morph",mounted(e,t){let n={el:e,animating:!1,opts:{}};Nd(t.modifiers,n),function(e,t){let n="string"==typeof e&&0!==e.length?e.split(":"):[];t.name=n[0],t.group=n[1];let a=Number.parseFloat(n[2]);Object.assign(t.opts,{duration:Number.isFinite(a)?a:300,waitFor:n[3]})}(t.arg,n),jd(n,t.value),e.__qmorph=n},updated(e,t){jd(e.__qmorph,t.value)},beforeUnmount(e){let t=e.__qmorph,n=Ld[t.group];n?.queue.includes(t)&&(n.queue=n.queue.filter(e=>e!==t),0===n.queue.length&&(n.cancel?.(),delete Ld[t.group])),"add"===t.clsAction&&e.classList.remove("q-morph--invisible"),delete e.__qmorph}});let qd={childList:!0,subtree:!0,attributes:!0,characterData:!0,attributeOldValue:!0,characterDataOldValue:!0};function Bd(e,t,n){t.handler=n,t.observer?.disconnect(),t.observer=new MutationObserver(n=>{"function"==typeof t.handler&&(!1===t.handler(n)||!0===t.once)&&Fd(e)}),t.observer.observe(e,t.opts)}function Fd(e){let t=e.__qmutation;void 0!==t&&(t.observer?.disconnect(),delete e.__qmutation)}var Vd=p({name:"mutation",mounted(e,{modifiers:{once:t,...n},value:a}){let i={once:t,opts:0===Object.keys(n).length?qd:n};Bd(e,i,a),e.__qmutation=i},updated(e,{oldValue:t,value:n}){let a=e.__qmutation;void 0!==a&&t!==n&&Bd(e,a,n)},beforeUnmount:Fd});let{passive:Ud}=m;function $d(e,{value:t,oldValue:n}){"function"==typeof t?(e.handler=t,"function"!=typeof n&&(e.scrollTarget.addEventListener("scroll",e.scroll,Ud),e.scroll())):e.scrollTarget.removeEventListener("scroll",e.scroll,Ud)}var Hd=p({name:"scroll-fire",mounted(e,t){let n={scrollTarget:Pn(e),scroll:T(()=>{let t,a;n.scrollTarget===window?(a=e.getBoundingClientRect().bottom,t=window.innerHeight):(a=St(e).top+Ct(e),t=St(n.scrollTarget).top+Ct(n.scrollTarget)),a>0&&a{a.styleCleanup=void 0,!0===e?(Qt(),setTimeout(Kd,10)):Kd()}),a.triggered=!1,a.sensitivity=t?a.mouseSensitivity:a.touchSensitivity,a.timer=setTimeout(()=>{a.timer=void 0,Qt(),a.triggered=!0,a.handler({evt:e,touch:!t,mouse:!0===t,position:a.origin,duration:Date.now()-n})},a.duration)},move(e){let{top:t,left:n}=v(e);void 0!==a.timer&&(Math.abs(n-a.origin.left)>=a.sensitivity||Math.abs(t-a.origin.top)>=a.sensitivity)&&(clearTimeout(a.timer),a.timer=void 0)},end(e){S(a,"temp"),a.styleCleanup?.(a.triggered),a.triggered?void 0!==e&&w(e):void 0!==a.timer&&(clearTimeout(a.timer),a.timer=void 0)}},i=[600,5,7];"string"==typeof t.arg&&0!==t.arg.length&&t.arg.split(":").forEach((e,t)=>{let n=Number.parseInt(e,10);n&&(i[t]=n)}),[a.duration,a.touchSensitivity,a.mouseSensitivity]=i,e.__qtouchhold=a,n.mouse&&x(a,"main",[[e,"mousedown","mouseStart","passive"+(n.mouseCapture||n.mousecapture?"Capture":"")]]),c.has.touch&&x(a,"main",[[e,"touchstart","touchStart","passive"+(n.capture?"Capture":"")],[e,"touchend","noop","notPassiveCapture"]])},updated(e,t){let n=e.__qtouchhold;void 0!==n&&t.oldValue!==t.value&&("function"!=typeof t.value&&n.end(),n.handler=t.value)},beforeUnmount(e){let t=e.__qtouchhold;void 0!==t&&(S(t,"main"),S(t,"temp"),void 0!==t.timer&&clearTimeout(t.timer),t.styleCleanup?.(),delete e.__qtouchhold)}});let Qd={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Zd=RegExp(`^([\\d+]+|${Object.keys(Qd).join("|")})$`,"i");function Jd(){document.body.classList.remove("non-selectable")}var Xd=p({name:"touch-repeat",beforeMount(e,{modifiers:t,value:n,arg:a}){let i=Object.keys(t).reduce((e,t)=>{if(Zd.test(t)){let n=Number.parseInt(t,10),a=Number.isNaN(n)?Qd[t.toLowerCase()]:n;void 0!==a&&e.push(...[a].flat())}return e},[]);if(!t.mouse&&!c.has.touch&&0===i.length)return;let r="string"==typeof a&&0!==a.length?a.split(":").map(e=>Number.parseInt(e,10)):[0,600,300],o=r.length-1,s={keyboard:i,handler:n,noop:_,mouseStart(e){void 0===s.event&&"function"==typeof s.handler&&g(e)&&(x(s,"temp",[[document,"mousemove","move","passiveCapture"],[document,"click","end","notPassiveCapture"]]),s.start(e,!0))},keyboardStart(t){if("function"==typeof s.handler&&N(t,i)){if((0===r[0]||void 0!==s.event)&&(w(t),e.focus(),void 0!==s.event))return;x(s,"temp",[[document,"keyup","end","notPassiveCapture"],[document,"click","end","notPassiveCapture"]]),s.start(t,!1,!0)}},touchStart(e){if(void 0!==e.target&&"function"==typeof s.handler){let t=e.target;x(s,"temp",[[t,"touchmove","move","passiveCapture"],[t,"touchcancel","end","notPassiveCapture"],[t,"touchend","end","notPassiveCapture"]]),s.start(e)}},start(e,t,n){function a(e){s.styleCleanup=void 0,document.documentElement.style.cursor="",!0===e?(Qt(),setTimeout(Jd,10)):Jd()}n||(s.origin=v(e)),c.is.mobile&&(document.body.classList.add("non-selectable"),Qt(),s.styleCleanup=a),s.event={touch:!t&&!n,mouse:!0===t,keyboard:!0===n,startTime:Date.now(),repeatCount:0};let i=()=>{if(s.timer=void 0,void 0===s.event)return;0===s.event.repeatCount&&(s.event.evt=e,n?s.event.keyCode=e.keyCode:s.event.position=v(e),c.is.mobile||(document.documentElement.style.cursor="pointer",document.body.classList.add("non-selectable"),Qt(),s.styleCleanup=a)),s.event.duration=Date.now()-s.event.startTime,s.event.repeatCount+=1,s.handler(s.event);let t=o=7||Math.abs(n-t.top)>=7}(e,s.origin)&&(clearTimeout(s.timer),s.timer=void 0)},end(e){void 0!==s.event&&(s.styleCleanup?.(!0),void 0!==e&&s.event.repeatCount>0&&w(e),S(s,"temp"),void 0!==s.timer&&(clearTimeout(s.timer),s.timer=void 0),s.event=void 0)}};e.__qtouchrepeat=s,t.mouse&&x(s,"main",[[e,"mousedown","mouseStart","passive"+(t.mouseCapture||t.mousecapture?"Capture":"")]]),c.has.touch&&x(s,"main",[[e,"touchstart","touchStart","passive"+(t.capture?"Capture":"")],[e,"touchend","noop","passiveCapture"]]),0!==i.length&&x(s,"main",[[e,"keydown","keyboardStart","notPassive"+(t.keyCapture||t.keycapture?"Capture":"")]])},updated(e,{oldValue:t,value:n}){let a=e.__qtouchrepeat;void 0!==a&&t!==n&&("function"!=typeof n&&a.end(),a.handler=n)},beforeUnmount(e){let t=e.__qtouchrepeat;void 0!==t&&(void 0!==t.timer&&clearTimeout(t.timer),S(t,"main"),S(t,"temp"),t.styleCleanup?.(),delete e.__qtouchrepeat)}}),eh=n({ClosePopup:()=>pd,Intersection:()=>ml,Morph:()=>Dd,Mutation:()=>Vd,Ripple:()=>zt,Scroll:()=>Gd,ScrollFire:()=>Hd,TouchHold:()=>Yd,TouchPan:()=>gi,TouchRepeat:()=>Xd,TouchSwipe:()=>Oa});function th(e,t=document.body){if("string"!=typeof e)throw TypeError("Expected a string as propName");if(!(t instanceof Element))throw TypeError("Expected a DOM element");return getComputedStyle(t).getPropertyValue(`--q-${e}`).trim()||null}let nh;function ah(e){void 0===nh&&(nh=c.is.winphone?"msapplication-navbutton-color":"theme-color");let t=function(e){let t=document.getElementsByTagName("META");for(let n in t)if(t[n].name===e)return t[n]}(nh),n=void 0===t;n&&(t=document.createElement("meta"),t.setAttribute("name",nh)),t.setAttribute("content",e),n&&document.head.append(t)}var ih={set:c.is.mobile&&(c.is.nativeMobile||c.is.winphone||c.is.safari||c.is.webkit||c.is.vivaldi)?e=>{let t=e||th("primary");c.is.nativeMobile&&window.StatusBar?window.StatusBar.backgroundColorByHexString(t):ah(t)}:_,install({$q:e}){e.addressbarColor=this,e.config.addressbarColor&&this.set(e.config.addressbarColor)}};let rh={};function oh(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement||null}function sh(){let e=ch.activeEl=ch.isActive?oh():null;!function(e){if(e===mn)return;if(mn=e,mn===document.body||pn.reduce((e,t)=>"dialog"===t?e+1:e,0)<2)return void hn.forEach(e=>{e.contains(mn)||mn.append(e)});let t=pn.lastIndexOf("dialog");for(let e=0;evoid 0!==document.documentElement[e]),ch.isCapable=void 0!==rh.request,ch.isCapable?(Object.assign(ch,{request(e){let t=e||document.documentElement,{activeEl:n}=ch;return t===n?Promise.resolve():(null!==n&&t.contains(n)?ch.exit():Promise.resolve()).finally(()=>uh(t,rh.request))},exit:()=>ch.isActive?uh(document,rh.exit):Promise.resolve(),toggle:e=>ch.isActive?ch.exit():ch.request(e)}),rh.exit=["exitFullscreen","msExitFullscreen","mozCancelFullScreen","webkitExitFullscreen"].find(e=>document[e]),ch.isActive=!!oh(),ch.isActive&&sh(),["onfullscreenchange","onmsfullscreenchange","onwebkitfullscreenchange"].forEach(e=>{document[e]=lh})):function(e){Object.assign(ch,{request:e,exit:e,toggle:e})}(()=>Promise.reject(Error("Not capable")));let dh=f({appVisible:!0},{install({$q:e}){a(e,"appVisible",()=>this.appVisible)}});{let e,t;void 0===document.hidden?void 0===document.msHidden?void 0!==document.webkitHidden&&(e="webkitHidden",t="webkitvisibilitychange"):(e="msHidden",t="msvisibilitychange"):(e="hidden",t="visibilitychange"),t&&void 0!==document[e]&&document.addEventListener(t,()=>{dh.appVisible=!document[e]},!1)}var hh=h({name:"BottomSheetComponent",props:{...Je,title:String,message:String,actions:Array,grid:Boolean,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:["ok","hide"],setup(t,{emit:n}){let{proxy:a}=(0,e.getCurrentInstance)(),i=Xe(t,a.$q),r=(0,e.ref)(null);function o(){r.value.hide()}function s(e){n("ok",e),o()}function l(){n("hide")}function u(){let n=[];return t.title&&n.push((0,e.h)(Pa,{class:"q-dialog__title"},()=>t.title)),t.message&&n.push((0,e.h)(Pa,{class:"q-dialog__message"},()=>t.message)),n.push(t.grid?(0,e.h)("div",{class:"row items-stretch justify-start",role:"list"},t.actions.map(t=>{let n=t.avatar||t.img;return void 0===t.label?(0,e.h)(as,{class:"col-all",dark:i.value}):(0,e.h)("div",{class:["q-bottom-sheet__item q-hoverable q-focusable cursor-pointer relative-position",t.class],style:t.style,tabindex:0,role:"listitem",onClick(){s(t)},onKeyup(e){13===e.keyCode&&s(t)}},[(0,e.h)("div",{class:"q-focus-helper"}),t.icon?(0,e.h)(Ke,{name:t.icon,color:t.color}):n?(0,e.h)("img",{class:t.avatar?"q-bottom-sheet__avatar":"",src:n}):(0,e.h)("div",{class:"q-bottom-sheet__empty-icon"}),(0,e.h)("div",t.label)])})):(0,e.h)("div",{role:"list"},t.actions.map(t=>{let n=t.avatar||t.img;return void 0===t.label?(0,e.h)(as,{spaced:!0,dark:i.value}):(0,e.h)(jo,{class:["q-bottom-sheet__item",t.classes],style:t.style,tabindex:0,clickable:!0,dark:i.value,onClick(){s(t)}},()=>[(0,e.h)(Do,{avatar:!0},()=>t.icon?(0,e.h)(Ke,{name:t.icon,color:t.color}):n?(0,e.h)("img",{class:t.avatar?"q-bottom-sheet__avatar":"",src:n}):null),(0,e.h)(Do,()=>t.label)])}))),n}function c(){return[(0,e.h)(Ta,{class:["q-bottom-sheet q-bottom-sheet--"+(t.grid?"grid":"list")+(i.value?" q-bottom-sheet--dark q-dark":""),t.cardClass],style:t.cardStyle},u)]}return Object.assign(a,{show:function(){r.value.show()},hide:o}),()=>(0,e.h)(Po,{ref:r,position:"bottom",onHide:l},c)}});function ph(e,t){for(let n in t)"spinner"!==n&&Object(t[n])===t[n]?(e[n]=Object(e[n])===e[n]?{...e[n]}:{},ph(e[n],t[n])):e[n]=t[n]}function fh(t,n,a){return i=>{let r,o,s=n&&void 0!==i.component;if(s){let{component:e,componentProps:t}=i;r="string"==typeof e?a.component(e):e,o=t||{}}else{let{class:e,style:n,...a}=i;r=t,o=a,void 0!==e&&(a.cardClass=e),void 0!==n&&(a.cardStyle=n)}let l,u=!1,c=(0,e.ref)(null),d=_n(!1,"dialog"),h=e=>{if(void 0!==c.value?.[e])return void c.value[e]();let t=l.$.subTree;if(t?.component){if(t.component.proxy&&t.component.proxy[e])return void t.component.proxy[e]();if(t.component.subTree&&t.component.subTree.component&&t.component.subTree.component.proxy&&t.component.subTree.component.proxy[e])return void t.component.subTree.component.proxy[e]()}console.error("[Quasar] Incorrectly defined Dialog component")},p=[],f=[],m={onOk:e=>(p.push(e),m),onCancel:e=>(f.push(e),m),onDismiss:e=>(p.push(e),f.push(e),m),hide:()=>(h("hide"),m),update(e){if(null!==l){if(s)Object.assign(o,e);else{let{class:t,style:n,...a}=e;void 0!==t&&(a.cardClass=t),void 0!==n&&(a.cardStyle=n),ph(o,a)}l.$forceUpdate()}return m}},_=e=>{u=!0,p.forEach(t=>{t(e)})},g=()=>{v.unmount(d),gn(d),v=null,l=null,u||f.forEach(e=>{e()})},v=ce({name:"QGlobalDialog",setup:()=>()=>(0,e.h)(r,{...o,ref:c,onOk:_,onHide:g,onVnodeMounted(...t){"function"==typeof o.onVnodeMounted&&o.onVnodeMounted(...t),(0,e.nextTick)(()=>h("show"))}})},a);return l=v.mount(d),m}}var mh={install({$q:e,parentApp:t}){e.bottomSheet=this.create=fh(hh,!1,t)}};function _h(e){if(""===e)return e;0===e.indexOf('"')&&(e=e.slice(1,-1).replaceAll(String.raw`\"`,'"').replaceAll(String.raw`\\`,"\\"));try{e=decodeURIComponent(e.replaceAll("+"," "))}catch{return}try{let t=JSON.parse(e);(t===Object(t)||Array.isArray(t))&&(e=t)}catch{}return e}let gh=/(\d+)([dhms])/g,vh={d:86400,h:3600,m:60,s:1};function bh(e,t,n={},a){let i,r=!1;if(void 0!==n.expires){if(Number.isFinite(n.expires))i=Math.round(86400*n.expires);else if(n.expires instanceof Date){let e=n.expires.getTime();Number.isFinite(e)&&(i=Math.round((e-Date.now())/1e3))}else"string"==typeof n.expires&&(i=function(e){let t=0,n=!1,a=e.matchAll(gh);for(let e of a){n=!0;let a=Number.parseInt(e[1],10),i=e[2];t+=a*vh[i]}if(n)return t;let i=Date.parse(e);return Number.isNaN(i)?void 0:Math.round((i-Date.now())/1e3)}(n.expires));void 0!==i&&(r=i<=0)}let o=`${encodeURIComponent(e)}=${function(e){return encodeURIComponent(e===Object(e)?JSON.stringify(e):String(e))}(t)}`,s=[o,void 0===i?"":`; Max-Age=${i}`,n.path?`; Path=${n.path}`:"",n.domain?`; Domain=${n.domain}`:"",n.sameSite?`; SameSite=${n.sameSite}`:"",n.httpOnly?"; HttpOnly":"",n.secure?"; Secure":"",n.other?`; ${n.other}`:""].join("");if(a){a.req.qCookies?a.req.qCookies.push(s):a.req.qCookies=[s],a.res.setHeader("Set-Cookie",a.req.qCookies);let t=a.req.headers.cookie||"";if(void 0!==i&&r){let n=encodeURIComponent(e);t=t.split("; ").filter(e=>e.split("=",1)[0]!==n).join("; ")}else t=t?`${o}; ${t}`:o;a.req.headers.cookie=t}else document.cookie=s}function yh(e,t){let n,a,i,r=t?t.req.headers:document,o=r.cookie?r.cookie.split("; "):[],s=o.length,l=e?null:{},u=0;for(;uyh(t,e),set:(t,n,a)=>bh(t,n,a,e),has:t=>function(e,t){return null!==yh(e,t)}(t,e),remove:(t,n)=>function(e,t,n){bh(e,"",{expires:-1,...t},n)}(t,n,e),getAll:()=>yh(null,e)}}());var kh=h({name:"DialogPluginComponent",props:{...Je,title:String,message:String,prompt:Object,options:Object,progress:[Boolean,Object],html:Boolean,ok:{type:[String,Object,Boolean],default:!0},cancel:[String,Object,Boolean],focus:{type:String,default:"ok",validator:e=>["ok","cancel","none"].includes(e)},stackButtons:Boolean,color:String,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:["ok","hide"],setup(t,{emit:n}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:i}=a,r=Xe(t,i),o=(0,e.ref)(null),s=(0,e.ref)(void 0===t.prompt?void 0===t.options?void 0:t.options.model:t.prompt.model),l=(0,e.computed)(()=>"q-dialog-plugin"+(r.value?" q-dialog-plugin--dark q-dark":"")+(!1===t.progress?"":" q-dialog-plugin--progress")),u=(0,e.computed)(()=>t.color||(r.value?"amber":"primary")),c=(0,e.computed)(()=>!1===t.progress?null:ne(t.progress)?{component:t.progress.spinner||xt,props:{color:t.progress.color||u.value}}:{component:xt,props:{color:u.value}}),d=(0,e.computed)(()=>void 0!==t.prompt||void 0!==t.options),h=(0,e.computed)(()=>{if(!d.value)return{};let{model:e,isValid:n,items:a,...i}=void 0===t.prompt?t.options:t.prompt;return i}),p=(0,e.computed)(()=>ne(t.ok)||!0===t.ok?i.lang.label.ok:t.ok),f=(0,e.computed)(()=>ne(t.cancel)||!0===t.cancel?i.lang.label.cancel:t.cancel),m=(0,e.computed)(()=>void 0===t.prompt?void 0!==t.options&&void 0!==t.options.isValid&&!t.options.isValid(s.value):void 0!==t.prompt.isValid&&!t.prompt.isValid(s.value)),_=(0,e.computed)(()=>({color:u.value,label:p.value,ripple:!1,disable:m.value,...ne(t.ok)?t.ok:{flat:!0},"data-autofocus":"ok"===t.focus&&!d.value||void 0,onClick:b})),g=(0,e.computed)(()=>({color:u.value,label:f.value,ripple:!1,...ne(t.cancel)?t.cancel:{flat:!0},"data-autofocus":"cancel"===t.focus&&!d.value||void 0,onClick:y}));function v(){o.value.hide()}function b(){n("ok",(0,e.toRaw)(s.value)),v()}function y(){v()}function w(){n("hide")}function k(e){s.value=e}function x(e){!m.value&&"textarea"!==t.prompt.type&&N(e,13)&&b()}function S(n,a){return t.html?(0,e.h)(Pa,{class:n,innerHTML:a}):(0,e.h)(Pa,{class:n},()=>a)}function C(){return[(0,e.h)(dl,{color:u.value,dense:!0,autofocus:!0,dark:r.value,...h.value,modelValue:s.value,"onUpdate:modelValue":k,onKeyup:x})]}function T(){return[(0,e.h)(ql,{color:u.value,options:t.options.items,dark:r.value,...h.value,modelValue:s.value,"onUpdate:modelValue":k})]}function P(){let n=[];return t.title&&n.push(S("q-dialog__title",t.title)),!1!==t.progress&&n.push((0,e.h)(Pa,{class:"q-dialog__progress"},()=>(0,e.h)(c.value.component,c.value.props))),t.message&&n.push(S("q-dialog__message",t.message)),void 0===t.prompt?void 0!==t.options&&n.push((0,e.h)(as,{dark:r.value}),(0,e.h)(Pa,{class:"scroll q-dialog-plugin__form"},T),(0,e.h)(as,{dark:r.value})):n.push((0,e.h)(Pa,{class:"scroll q-dialog-plugin__form"},C)),(t.ok||t.cancel)&&n.push(function(){let n=[];return t.cancel&&n.push((0,e.h)(Kt,g.value)),t.ok&&n.push((0,e.h)(Kt,_.value)),(0,e.h)(Ea,{class:t.stackButtons?"items-end":"",vertical:t.stackButtons,align:"right"},()=>n)}()),n}function E(){return[(0,e.h)(Ta,{class:[l.value,t.cardClass],style:t.cardStyle,dark:r.value},P)]}return(0,e.watch)(()=>t.prompt&&t.prompt.model,k),(0,e.watch)(()=>t.options&&t.options.model,k),Object.assign(a,{show:function(){o.value.show()},hide:v}),()=>(0,e.h)(Po,{ref:o,onHide:w},E)}}),xh={install({$q:e,parentApp:t}){e.dialog=this.create=fh(kh,!0,t)}};let Sh,Ch,Th=0,Ph=null,Eh={},Ah={},Lh={group:"__default_quasar_group__",delay:0,message:!1,html:!1,spinnerSize:80,spinnerColor:"",messageColor:"",backgroundColor:"",boxClass:"",spinner:xt,customClass:""},Mh={...Lh};let Rh,zh=f({isActive:!1},{show(t){Eh=function(e){if(void 0!==e?.group&&void 0!==Ah[e.group])return Object.assign(Ah[e.group],e);let t=ne(e)&&e.ignoreDefaults?{...Lh,...e}:{...Mh,...e};return Ah[t.group]=t,t}(t);let{group:n}=Eh;return zh.isActive=!0,void 0===Sh?(Eh.uid=++Th,null!==Ph&&clearTimeout(Ph),Ph=setTimeout(()=>{Ph=null;let t=_n("q-loading");Sh=ce({name:"QLoading",setup(){function n(){!zh.isActive&&void 0!==Sh&&(ko(!1),Sh.unmount(t),gn(t),Sh=void 0,Ch=void 0)}function a(){if(!zh.isActive)return null;let t=[(0,e.h)(Eh.spinner,{class:"q-loading__spinner",color:Eh.spinnerColor,size:Eh.spinnerSize})];return Eh.message&&t.push((0,e.h)("div",{class:"q-loading__message"+(Eh.messageColor?` text-${Eh.messageColor}`:""),[Eh.html?"innerHTML":"textContent"]:Eh.message})),(0,e.h)("div",{class:"q-loading fullscreen flex flex-center z-max "+Eh.customClass.trim(),key:Eh.uid},[(0,e.h)("div",{class:"q-loading__backdrop"+(Eh.backgroundColor?` bg-${Eh.backgroundColor}`:"")}),(0,e.h)("div",{class:"q-loading__box column items-center "+Eh.boxClass},t)])}return(0,e.onMounted)(()=>{ko(!0)}),()=>(0,e.h)(e.Transition,{name:"q-transition--fade",appear:!0,onAfterLeave:n},a)}},zh.__parentApp),Ch=Sh.mount(t)},Eh.delay)):(Eh.uid=Th,Ch.$forceUpdate()),e=>{void 0!==e&&Object(e)===e?zh.show({...e,group:n}):zh.hide(n)}},hide(e){if(zh.isActive){if(void 0===e)Ah={};else{if(void 0===Ah[e])return;{delete Ah[e];let t=Object.keys(Ah);if(0!==t.length){let e=t.at(-1);return void zh.show({group:e})}}}null!==Ph&&(clearTimeout(Ph),Ph=null),zh.isActive=!1}},setDefaults(e){ne(e)&&Object.assign(Mh,e)},install({$q:e,parentApp:t}){e.loading=this,zh.__parentApp=t,void 0!==e.config.loading&&this.setDefaults(e.config.loading)}}),Ih=(0,e.ref)(null),Nh=f({isActive:!1},{start:_,stop:_,increment:_,setDefaults:_,install({$q:t,parentApp:n}){if(t.loadingBar=this,this.__installed)return void(void 0!==t.config.loadingBar&&this.setDefaults(t.config.loadingBar));let a=(0,e.ref)(void 0===t.config.loadingBar?{}:{...t.config.loadingBar});function i(){Nh.isActive=!0}function r(){Nh.isActive=!1}let o=_n("q-loading-bar");ce({name:"LoadingBar",devtools:{hide:!0},setup:()=>()=>(0,e.h)(Ce,{...a.value,onStart:i,onStop:r,ref:Ih})},n).mount(o),Object.assign(this,{start(e){Ih.value.start(e)},stop(){Ih.value.stop()},increment(...e){Ih.value.increment(...e)},setDefaults(e){ne(e)&&Object.assign(a.value,e)}})}}),Oh=null;String.raw`\u003C`,String.raw`\u003E`,String.raw`\u0026`,String.raw`\u2028`,String.raw`\u2029`;let jh=[];function Dh(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!0;for(let n in e)if(e[n]!==t[n])return!0}function qh(e){return!["class","style"].includes(e)}function Bh(e){return!["lang","dir"].includes(e)}function Fh(){Oh=null;let e={title:"",titleTemplate:null,meta:{},link:{},script:{},htmlAttr:{},bodyAttr:{}};for(let t=0;t{let n=e[t[0]],a=t[1];for(let e in n){let t=n[e];t.template&&(1===Object.keys(t).length?delete n[e]:(t[a]=t.template(t[a]||""),delete t.template))}})})(e),function({add:e,remove:t}){e.title&&(document.title=e.title),0!==Object.keys(t).length&&(["meta","link","script"].forEach(e=>{t[e].forEach(t=>{document.head.querySelector(`${e}[data-qmeta="${t}"]`).remove()})}),t.htmlAttr.filter(Bh).forEach(e=>{document.documentElement.removeAttribute(e)}),t.bodyAttr.filter(qh).forEach(e=>{document.body.removeAttribute(e)})),["meta","link","script"].forEach(t=>{let n=e[t];for(let e in n){let a=document.createElement(t);for(let t in n[e])"innerHTML"!==t&&a.setAttribute(t,n[e][t]);a.dataset.qmeta=e,"script"===t&&(a.innerHTML=n[e].innerHTML||""),document.head.append(a)}}),Object.keys(e.htmlAttr).filter(Bh).forEach(t=>{document.documentElement.setAttribute(t,e.htmlAttr[t]||"")}),Object.keys(e.bodyAttr).filter(qh).forEach(t=>{document.body.setAttribute(t,e.bodyAttr[t]||"")})}(function(e,t){let n={},a={};return void 0===e?{add:t,remove:a}:(e.title!==t.title&&(n.title=t.title),["meta","link","script","htmlAttr","bodyAttr"].forEach(i=>{let r=e[i],o=t[i];if(a[i]=[],null!=r){n[i]={};for(let e in r)Object.hasOwn(o,e)||a[i].push(e);for(let e in o)Object.hasOwn(r,e)?Dh(r[e],o[e])&&(a[i].push(e),n[i][e]=o[e]):n[i][e]=o[e]}else n[i]=o}),{add:n,remove:a})}(Rh,e)),Rh=e}function Vh(){null!==Oh&&clearTimeout(Oh),Oh=setTimeout(Fh,50)}var Uh={install(e){!this.__installed&&o.value&&(Rh=window.__Q_META__,document.getElementById("qmeta-init").remove())}};let $h=0,Hh={},Wh={},Gh={},Kh={},Yh=/^\s*$/,Qh=[],Zh=[void 0,null,!0,!1,""],Jh=["top-left","top-right","bottom-left","bottom-right","top","bottom","left","right","center"],Xh=["top-left","top-right","bottom-left","bottom-right"],ep={positive:{icon:e=>e.iconSet.type.positive,color:"positive"},negative:{icon:e=>e.iconSet.type.negative,color:"negative"},warning:{icon:e=>e.iconSet.type.warning,color:"warning",textColor:"dark"},info:{icon:e=>e.iconSet.type.info,color:"info"},ongoing:{group:!1,timeout:0,spinner:!0,color:"grey-8"}};function tp(t,n,a){if(!t)return ap("parameter required");let i,r={textColor:"white"};if(t.ignoreDefaults||Object.assign(r,Hh),ne(t)||(r.type&&Object.assign(r,ep[r.type]),t={message:t}),Object.assign(r,ep[t.type||r.type],t),"function"==typeof r.icon&&(r.icon=r.icon(n)),r.spinner?r.spinner=!0===r.spinner?xt:(0,e.markRaw)(r.spinner):r.spinner=!1,r.meta={hasMedia:!!(r.spinner||r.icon||r.avatar),hasText:np(r.message)||np(r.caption)},r.position){if(!Jh.includes(r.position))return ap("wrong position",t)}else r.position="bottom";if(Zh.includes(r.timeout))r.timeout=5e3;else{let e=Number.parseFloat(r.timeout);if(!Number.isFinite(e)||e<0)return ap("wrong timeout",t);r.timeout=e}0===r.timeout?r.progress=!1:r.progress&&(r.meta.progressClass="q-notification__progress"+(r.progressClass?` ${r.progressClass}`:""),r.meta.progressStyle={animationDuration:`${r.timeout+1e3}ms`});let o=[...Array.isArray(t.actions)?t.actions:[],...!t.ignoreDefaults&&Array.isArray(Hh.actions)?Hh.actions:[],...Array.isArray(ep[t.type]?.actions)?ep[t.type].actions:[]],{closeBtn:s}=r;if(s&&o.push({label:"string"==typeof s?s:n.lang.label.close}),r.actions=o.map(({handler:e,noDismiss:t,...n})=>({flat:!0,...n,onClick:"function"==typeof e?()=>{e(),t||l()}:()=>{l()}})),void 0===r.multiLine&&(r.multiLine=r.actions.length>1),Object.assign(r.meta,{class:"q-notification row items-stretch q-notification--"+(r.multiLine?"multi-line":"standard")+(void 0===r.color?"":` bg-${r.color}`)+(void 0===r.textColor?"":` text-${r.textColor}`)+(void 0===r.classes?"":` ${r.classes}`),wrapperClass:"q-notification__wrapper col relative-position border-radius-inherit "+(r.multiLine?"column no-wrap justify-center":"row items-center"),contentClass:"q-notification__content row items-center"+(r.multiLine?"":" col"),leftClass:r.meta.hasText?"additional":"single",attrs:{role:"alert",...r.attrs}}),!1===r.group?(r.group=void 0,r.meta.group=void 0):((void 0===r.group||!0===r.group)&&(r.group=[r.message,r.caption,r.multiline,...r.actions.map(e=>`${e.label}*${e.icon}`)].join("|")),r.meta.group=r.group+"|"+r.position),0===r.actions.length?r.actions=void 0:r.meta.actionsClass="q-notification__actions row items-center "+(r.multiLine?"justify-end":"col-auto")+(r.meta.hasMedia?" q-notification__actions--with-media":""),void 0!==a){a.notif.meta.timer&&(clearTimeout(a.notif.meta.timer),a.notif.meta.timer=void 0),r.meta.uid=a.notif.meta.uid;let e=Gh[r.position].value.indexOf(a.notif);Gh[r.position].value[e]=r}else{let e=Wh[r.meta.group];if(void 0===e){if(r.meta.uid=$h++,r.meta.badge=1,["left","right","center"].includes(r.position))Gh[r.position].value.splice(Math.floor(Gh[r.position].value.length/2),0,r);else{let e=r.position.includes("top")?"unshift":"push";Gh[r.position].value[e](r)}void 0!==r.group&&(Wh[r.meta.group]=r)}else{if(e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0),void 0!==r.badgePosition){if(!Xh.includes(r.badgePosition))return ap("wrong badgePosition",t)}else r.badgePosition="top-"+(r.position.includes("left")?"right":"left");r.meta.uid=e.meta.uid,r.meta.badge=e.meta.badge+1,r.meta.badgeClass=`q-notification__badge q-notification__badge--${r.badgePosition}`+(void 0===r.badgeColor?"":` bg-${r.badgeColor}`)+(void 0===r.badgeTextColor?"":` text-${r.badgeTextColor}`)+(r.badgeClass?` ${r.badgeClass}`:"");let n=Gh[r.position].value.indexOf(e);Gh[r.position].value[n]=Wh[r.meta.group]=r}}let l=()=>{(function(e){e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0);let t=Gh[e.position].value.indexOf(e);if(-1!==t){void 0!==e.group&&delete Wh[e.meta.group];let n=Qh[String(e.meta.uid)];if(n){let{width:e,height:t}=getComputedStyle(n);n.style.left=`${n.offsetLeft}px`,n.style.width=e,n.style.height=t}Gh[e.position].value.splice(t,1),"function"==typeof e.onDismiss&&e.onDismiss()}})(r),i=void 0};return r.timeout>0&&(r.meta.timer=setTimeout(()=>{r.meta.timer=void 0,l()},r.timeout+1e3)),void 0!==r.group?e=>{void 0===e?l():ap("trying to update a grouped one which is forbidden",t)}:(i={dismiss:l,config:t,notif:r},void 0===a?e=>{void 0!==i&&(void 0===e?i.dismiss():tp({...i.config,...e,group:!1,position:r.position},n,i))}:void Object.assign(a,i))}function np(e){return null!=e&&!Yh.test(e)}function ap(e,t){return console.error(`Notify: ${e}`,t),!1}var ip={setDefaults(e){ne(e)&&Object.assign(Hh,e)},registerType(e,t){ne(t)&&(ep[e]=t)},install({$q:t,parentApp:n}){if(t.notify=this.create=e=>tp(e,t),t.notify.setDefaults=this.setDefaults,t.notify.registerType=this.registerType,void 0!==t.config.notify&&this.setDefaults(t.config.notify),!this.__installed){Jh.forEach(t=>{Gh[t]=(0,e.ref)([]);let n="left"===t||"center"===t||"right"===t?"center":t.includes("top")?"top":"bottom",a=t.includes("left")?"start":t.includes("right")?"end":"center",i="left"===t||"right"===t?`items-${"left"===t?"start":"end"} justify-center`:"center"===t?"flex-center":`items-${a}`;Kh[t]=`q-notifications__list q-notifications__list--${n} fixed column no-wrap ${i}`});let t=_n("q-notify");ce(h({name:"QNotifications",devtools:{hide:!0},setup:()=>()=>(0,e.h)("div",{class:"q-notifications"},Jh.map(t=>(0,e.h)(e.TransitionGroup,{key:t,class:Kh[t],tag:"div",name:`q-notification--${t}`},()=>Gh[t].value.map(t=>{let n=t.meta,a=[];if(n.hasMedia&&(t.spinner?a.push((0,e.h)(t.spinner,{class:"q-notification__spinner q-notification__spinner--"+n.leftClass,color:t.spinnerColor,size:t.spinnerSize})):t.icon?a.push((0,e.h)(Ke,{class:"q-notification__icon q-notification__icon--"+n.leftClass,name:t.icon,color:t.iconColor,size:t.iconSize,role:"img"})):t.avatar&&a.push((0,e.h)(Ye,{class:"q-notification__avatar q-notification__avatar--"+n.leftClass},()=>(0,e.h)("img",{src:t.avatar,"aria-hidden":"true"})))),n.hasText){let n,i={class:"q-notification__message col"};if(t.html)i.innerHTML=t.caption?`
${t.message}
${t.caption}
`:t.message;else{let a=[t.message];n=t.caption?[(0,e.h)("div",a),(0,e.h)("div",{class:"q-notification__caption"},[t.caption])]:a}a.push((0,e.h)("div",i,n))}let i=[(0,e.h)("div",{class:n.contentClass},a)];return t.progress&&i.push((0,e.h)("div",{key:`${n.uid}|p|${n.badge}`,class:n.progressClass,style:n.progressStyle})),t.actions&&i.push((0,e.h)("div",{class:n.actionsClass},t.actions.map(t=>(0,e.h)(Kt,t)))),n.badge>1&&i.push((0,e.h)("div",{key:`${n.uid}|${n.badge}`,class:t.meta.badgeClass,style:t.badgeStyle},[n.badge])),(0,e.h)("div",{ref:e=>{Qh[String(n.uid)]=e},key:n.uid,class:n.class,...n.attrs},[(0,e.h)("div",{class:n.wrapperClass},i)])}))))}),n).mount(t)}}};let rp=/^-?\d+$/;function op(){return{has:()=>!1,hasItem:()=>!1,getLength:()=>0,getItem:()=>null,getIndex:()=>null,getKey:()=>null,getAll:()=>({}),getAllKeys:()=>[],set:_,setItem:_,remove:_,removeItem:_,clear:_,isEmpty:()=>!0}}function sp(e){let t=window[e+"Storage"],n=e=>{let n=t.getItem(e);return n?function(e){if(e.length<9)return e;let t=e.slice(0,8),n=e.slice(9);switch(t){case"__q_date":return new Date(rp.test(n)?Number.parseInt(n,10):n);case"__q_expr":return new RegExp(n);case"__q_numb":return Number(n);case"__q_bool":return"1"===n;case"__q_strn":return String(n);case"__q_objt":return JSON.parse(n);default:return e}}(n):null},a=e=>null!==t.getItem(e),i=(e,n)=>{t.setItem(e,function(e){return ae(e)?"__q_date|"+e.getTime():ie(e)?"__q_expr|"+e.source:"number"==typeof e?"__q_numb|"+e:"boolean"==typeof e?"__q_bool|"+(e?"1":"0"):"string"==typeof e?"__q_strn|"+e:"function"==typeof e?"__q_strn|"+e.toString():e===Object(e)?"__q_objt|"+JSON.stringify(e):e}(n))},r=e=>{t.removeItem(e)};return{has:a,hasItem:a,getLength:()=>t.length,getItem:n,getIndex:e=>ee{let e,a={},i=t.length;for(let r=0;r{let e=[],n=t.length;for(let a=0;a{t.clear()},isEmpty:()=>0===t.length}}let lp=c.has.webStorage?sp("local"):op(),up={install({$q:e}){e.localStorage=lp},...lp},cp=c.has.webStorage?sp("session"):op(),dp={install({$q:e}){e.sessionStorage=cp},...cp};var hp=n({AddressbarColor:()=>ih,AppFullscreen:()=>ch,AppVisibility:()=>dh,BottomSheet:()=>mh,Cookies:()=>wh,Dark:()=>L,Dialog:()=>xh,IconSet:()=>W,Lang:()=>$,Loading:()=>zh,LoadingBar:()=>Nh,LocalStorage:()=>up,Meta:()=>Uh,Notify:()=>ip,Platform:()=>d,Screen:()=>A,SessionStorage:()=>dp});function pp(e){if(navigator.clipboard)return navigator.clipboard.writeText(e);let t=function(e){let t=document.createElement("textarea");t.value=e,t.contentEditable="true",t.style.position="fixed";let n=()=>{};Qn(n),document.body.append(t),t.focus(),t.select();let a=document.execCommand("copy");return t.remove(),Zn(n),a}(e);return t?Promise.resolve(!0):Promise.reject(t)}function fp(e){let t={activated(){this.__qMeta.active=!0,Vh()},deactivated(){this.__qMeta.active=!1,Vh()},unmounted(){jh.splice(jh.indexOf(this.__qMeta),1),Vh(),this.__qMeta=void 0}};return"function"==typeof e?Object.assign(t,{computed:{__qMetaOptions(){return e.call(this)||{}}},watch:{__qMetaOptions(e){this.__qMeta.val=e,this.__qMeta.active&&Vh()}},created(){this.__qMeta={active:!0,val:this.__qMetaOptions},jh.push(this.__qMeta),Vh()}}):t.created=function(){this.__qMeta={active:!0,val:e},jh.push(this.__qMeta),Vh()},t}var mp=class{constructor(){this.__stack={}}on(e,t,n){return(this.__stack[e]||=[]).push({fn:t,ctx:n}),this}once(e,t,n){let a=(...i)=>{this.off(e,a),t.apply(n,i)};return a.__callback=t,this.on(e,a,n)}emit(e,...t){let n=this.__stack[e];return void 0!==n&&n.forEach(e=>{e.fn.apply(e.ctx,t)}),this}off(e,t){let n=this.__stack[e];if(void 0===n)return this;if(void 0===t)return delete this.__stack[e],this;let a=n.filter(e=>e.fn!==t&&e.fn.__callback!==t);return 0===a.length?delete this.__stack[e]:this.__stack[e]=a,this}};function _p(e){setTimeout(()=>{window.URL.revokeObjectURL(e.href)},1e4),e.remove()}function gp(e,t,n={}){let{mimeType:a,byteOrderMark:i,encoding:r}="string"==typeof n?{mimeType:n}:n,o=void 0===r?t:new TextEncoder(r).encode([t]),s=new Blob(void 0===i?[o]:[i,o],{type:a||"application/octet-stream"}),l=document.createElement("a");l.href=window.URL.createObjectURL(s),l.setAttribute("download",e),void 0===l.download&&l.setAttribute("target","_blank"),l.classList.add("hidden"),l.style.position="fixed",document.body.append(l);try{return l.click(),_p(l),!0}catch(e){return _p(l),e}}function vp(e,t,n){let a=window.open;if(d.is.cordova)if(void 0!==cordova?.InAppBrowser?.open)a=cordova.InAppBrowser.open;else if(void 0!==navigator?.app)return navigator.app.loadUrl(e,{openExternal:!0});let i={noopener:!0,...n},r=i.noopener||i.noreferrer,o=a(e,"_blank",function(e){let t={noopener:!0,...e},n=[];for(let e in t){let a=t[e];!0===a?n.push(e):(re(a)||"string"==typeof a&&""!==a)&&n.push(e+"="+a)}return n.join(",")}(n));if(o)return d.is.desktop&&o.focus(),o;r||t?.()}function bp(e,t,n){if(!d.is.ios||void 0===window.SafariViewController)return vp(e,t,n);window.SafariViewController.isAvailable(a=>{a?window.SafariViewController.show({url:e},_,t):vp(e,t,n)})}function yp(e,{threadsNumber:t=1,abortOnFail:n=!0}={}){let a=-1,i=!1,{isList:r,totalJobs:o,resultAggregator:s,resultKeys:l}=function(e){if(Array.isArray(e)){let t=e.length;return{isList:!0,totalJobs:t,resultAggregator:Array(t).fill(null)}}let t=Object.keys(e),n=t.reduce((e,t)=>(e[t]=null,e),{});return{isList:!1,totalJobs:t.length,resultAggregator:n,resultKeys:t}}(e);if(0===o)return Promise.resolve(s);let u=o-1,c=t=>{if(i||a>=u)return t.resolve();let o=++a,d=r?o:l[o];Promise.resolve().then(()=>e[d](s)).then(e=>{i||(s[d]={key:d,status:"fulfilled",value:e})}).catch(e=>{if(i)return;let a={key:d,status:"rejected",reason:e};s[d]=a,n&&(i=!0,t.reject({...a,resultAggregator:s}))}).finally(()=>{i||c(t)})},d=Math.min(o,Math.max(1,t)),h=Array.from({length:d},()=>{let e=Promise.withResolvers();return c(e),e.promise});return Promise.all(h).then(()=>s)}var wp=n({EventBus:()=>mp,clone:()=>Jl,colors:()=>lr,copyToClipboard:()=>pp,createMetaMixin:()=>fp,createUploaderComponent:()=>rd,date:()=>Xr,debounce:()=>T,dom:()=>At,event:()=>C,exportFile:()=>gp,extend:()=>Zo,format:()=>be,frameDebounce:()=>Kl,getCssVar:()=>th,is:()=>oe,morph:()=>Ad,noop:()=>_,openURL:()=>bp,patterns:()=>Xi,runSequentialPromises:()=>yp,scroll:()=>qn,setCssVar:()=>M,throttle:()=>Lt,uid:()=>_a});function kp(){let{emit:t,proxy:n}=(0,e.getCurrentInstance)(),a=(0,e.ref)(null);function i(){a.value.hide()}return Object.assign(n,{show:function(){a.value.show()},hide:i}),{dialogRef:a,onDialogHide:function(){t("hide")},onDialogOK:function(e){t("ok",e),i()},onDialogCancel:i}}let xp=["ok","hide"];function Sp(t){{let n={active:!0};if("function"==typeof t){let a=(0,e.computed)(t);n.val=a.value,(0,e.watch)(a,e=>{n.val=e,n.active&&Vh()})}else n.val=t;jh.push(n),Vh(),(0,e.onActivated)(()=>{n.active=!0,Vh()}),(0,e.onDeactivated)(()=>{n.active=!1,Vh()}),(0,e.onUnmounted)(()=>{jh.splice(jh.indexOf(n),1),Vh()})}}function Cp(){return(0,e.inject)("_q_")}function Tp(){let t=null,n=(0,e.getCurrentInstance)();function a(){null!==t&&(clearInterval(t),t=null)}return(0,e.onDeactivated)(a),(0,e.onBeforeUnmount)(a),{removeInterval:a,registerInterval(e,i){a(),ct(n)||(t=setInterval(e,i))}}}kp.emits=xp,kp.emitsObject=ad(xp);var Pp=n({useDialogPluginComponent:()=>kp,useFormChild:()=>gs,useHydration:()=>Ti,useId:()=>va,useInterval:()=>Tp,useMeta:()=>Sp,useQuasar:()=>Cp,useRenderCache:()=>ja,useSplitAttrs:()=>Wo,useTick:()=>kn,useTimeout:()=>xn});void 0===window.Vue&&console.error("[ Quasar ] Vue is required to run. Please add a script tag for it before loading Quasar."),window.Quasar={version:"2.22.0",install(e,t){he(e,{components:dd,directives:eh,plugins:hp,...t})},lang:$,iconSet:W,...dd,...eh,...hp,...Pp,...wp}}(window.Vue); +*/!function(e){var t=Object.defineProperty,n=(e,n)=>{let a={};for(var i in e)t(a,i,{get:e[i],enumerable:!0});return n||t(a,Symbol.toStringTag,{value:"Module"}),a};function a(e,t,n,a){return Object.defineProperty(e,t,{get:n,set:a,enumerable:!0}),e}function i(e,t){for(let n in t)a(e,n,t[n]);return e}let o,r=(0,e.ref)(!1);let s="ontouchstart"in window||window.navigator.maxTouchPoints>0;let l=navigator.userAgent||navigator.vendor||window.opera,u={has:{touch:!1,webStorage:!1},within:{iframe:!1}},c={userAgent:l,is:function(e){let t=e.toLowerCase(),n=function(e,t){let n=/(edg|edge|edga|edgios)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(vivaldi)[\/]([\w.]+)/.exec(e)||/(chrome|crios)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(e)||/(webkit)[\/]([\w.]+).*(version)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(e)||/(firefox|fxios)[\/]([\w.]+)/.exec(e)||/(webkit)[\/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[\/]([\w.]+)/.exec(e)||[];return{browser:n[5]||n[3]||n[1]||"",version:n[4]||n[2]||"0",platform:t[0]||""}}(t,function(e){return/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(silk)/.exec(e)||/(android)/.exec(e)||/(win)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||/(playbook)/.exec(e)||/(bb)/.exec(e)||/(blackberry)/.exec(e)||[]}(t)),a={mobile:!1,desktop:!1,cordova:!1,capacitor:!1,nativeMobile:!1,electron:!1,bex:!1,linux:!1,mac:!1,win:!1,cros:!1,chrome:!1,firefox:!1,opera:!1,safari:!1,vivaldi:!1,edge:!1,edgeChromium:!1,ie:!1,webkit:!1,android:!1,ios:!1,ipad:!1,iphone:!1,ipod:!1,kindle:!1,winphone:!1,blackberry:!1,playbook:!1,silk:!1};n.browser&&(a[n.browser]=!0,a.version=n.version,a.versionNumber=parseInt(n.version,10)),n.platform&&(a[n.platform]=!0);let i=a.android||a.ios||a.bb||a.blackberry||a.ipad||a.iphone||a.ipod||a.kindle||a.playbook||a.silk||a["windows phone"];if(!0===i||-1!==t.indexOf("mobile")?a.mobile=!0:a.desktop=!0,a["windows phone"]&&(a.winphone=!0,delete a["windows phone"]),a.edga||a.edgios||a.edg?(a.edge=!0,n.browser="edge"):a.crios?(a.chrome=!0,n.browser="chrome"):a.fxios&&(a.firefox=!0,n.browser="firefox"),(a.ipod||a.ipad||a.iphone)&&(a.ios=!0),a.vivaldi&&=(n.browser="vivaldi",!0),(a.chrome||a.opr||a.safari||a.vivaldi||!0===a.mobile&&!0!==a.ios&&!0!==i)&&(a.webkit=!0),a.opr&&(n.browser="opera",a.opera=!0),a.safari&&(a.blackberry||a.bb?(n.browser="blackberry",a.blackberry=!0):a.playbook?(n.browser="playbook",a.playbook=!0):a.android?(n.browser="android",a.android=!0):a.kindle?(n.browser="kindle",a.kindle=!0):a.silk&&=(n.browser="silk",!0)),a.name=n.browser,a.platform=n.platform,-1!==t.indexOf("electron"))a.electron=!0;else if(-1!==document.location.href.indexOf("-extension://"))a.bex=!0;else{if(void 0===window.Capacitor?(void 0!==window._cordovaNative||void 0!==window.cordova)&&(a.cordova=!0,a.nativeMobile=!0,a.nativeMobileWrapper="cordova"):(a.capacitor=!0,a.nativeMobile=!0,a.nativeMobileWrapper="capacitor"),!0===r.value&&(o={is:{...a}}),!0===s&&!0===a.mac&&(!0===a.desktop&&!0===a.safari||!0===a.nativeMobile&&!0!==a.android&&!0!==a.ios&&!0!==a.ipad)){delete a.mac,delete a.desktop;let e=Math.min(window.innerHeight,window.innerWidth)>414?"ipad":"iphone";Object.assign(a,{mobile:!0,ios:!0,platform:e,[e]:!0})}!0!==a.mobile&&window.navigator.userAgentData&&window.navigator.userAgentData.mobile&&(delete a.desktop,a.mobile=!0)}return a}(l),has:{touch:s},within:{iframe:window.self!==window.top}},d={install(t){let{$q:n}=t;!0===r.value?(t.onSSRHydrated.push(()=>{Object.assign(n.platform,c),r.value=!1}),n.platform=(0,e.reactive)(this)):n.platform=this}};{let e;a(c.has,"webStorage",()=>{if(void 0!==e)return e;try{if(window.localStorage)return e=!0,!0}catch{}return e=!1,!1}),Object.assign(d,c),!0===r.value&&(Object.assign(d,o,u),o=null)}function h(t){return(0,e.markRaw)((0,e.defineComponent)(t))}function p(t){return(0,e.markRaw)(t)}let f=(t,n)=>{let i=(0,e.reactive)(t);for(let e in t)a(n,e,()=>i[e],t=>{i[e]=t});return n},m={hasPassive:!1,passiveCapture:!0,notPassiveCapture:!0};try{let e=Object.defineProperty({},"passive",{get(){Object.assign(m,{hasPassive:!0,passive:{passive:!0},notPassive:{passive:!1},passiveCapture:{passive:!0,capture:!0},notPassiveCapture:{passive:!1,capture:!0}})}});window.addEventListener("qtest",null,e),window.removeEventListener("qtest",null,e)}catch{}function _(){}function g(e){return 0===e.button}function v(e){return e.touches&&e.touches[0]?e=e.touches[0]:e.changedTouches&&e.changedTouches[0]?e=e.changedTouches[0]:e.targetTouches&&e.targetTouches[0]&&(e=e.targetTouches[0]),{top:e.clientY,left:e.clientX}}function b(e){if(e.path)return e.path;if(e.composedPath)return e.composedPath();let t=[],n=e.target;for(;n;){if(t.push(n),"HTML"===n.tagName)return t.push(document),t.push(window),t;n=n.parentElement}}function y(e){e.stopPropagation()}function w(e){!1!==e.cancelable&&e.preventDefault()}function k(e){!1!==e.cancelable&&e.preventDefault(),e.stopPropagation()}function x(e,t){if(void 0===e||!0===t&&!0===e.__dragPrevented)return;let n=!0===t?e=>{e.__dragPrevented=!0,e.addEventListener("dragstart",w,m.notPassiveCapture)}:e=>{delete e.__dragPrevented,e.removeEventListener("dragstart",w,m.notPassiveCapture)};e.querySelectorAll("a, img").forEach(n)}function S(e,t,n){let a=`__q_${t}_evt`;e[a]=void 0===e[a]?n:e[a].concat(n),n.forEach(t=>{t[0].addEventListener(t[1],e[t[2]],m[t[3]])})}function C(e,t){let n=`__q_${t}_evt`;void 0!==e[n]&&(e[n].forEach(t=>{t[0].removeEventListener(t[1],e[t[2]],m[t[3]])}),e[n]=void 0)}var T={listenOpts:m,leftClick:g,middleClick:function(e){return 1===e.button},rightClick:function(e){return 2===e.button},position:v,getEventPath:b,getMouseWheelDistance:function(e){let t=e.deltaX,n=e.deltaY;if((t||n)&&e.deltaMode){let a=1===e.deltaMode?40:800;t*=a,n*=a}return e.shiftKey&&!t&&([n,t]=[t,n]),{x:t,y:n}},stop:y,prevent:w,stopAndPrevent:k,preventDraggable:x};function P(e,t=250,n){let a=null;function i(){let i=arguments;null===a?!0===n&&e.apply(this,i):clearTimeout(a),a=setTimeout(()=>{a=null,!0!==n&&e.apply(this,i)},t)}return i.cancel=()=>{null!==a&&clearTimeout(a)},i}let E=["sm","md","lg","xl"],{passive:A}=m;var L=f({width:0,height:0,name:"xs",sizes:{sm:600,md:1024,lg:1440,xl:1920},lt:{sm:!0,md:!0,lg:!0,xl:!0},gt:{xs:!1,sm:!1,md:!1,lg:!1},xs:!0,sm:!1,md:!1,lg:!1,xl:!1},{setSizes:_,setDebounce:_,install({$q:e,onSSRHydrated:t}){if(e.screen=this,!0===this.__installed)return void(void 0!==e.config.screen&&(!1===e.config.screen.bodyClasses?document.body.classList.remove(`screen--${this.name}`):this.__update(!0)));let{visualViewport:n}=window,a=n||window,i=document.scrollingElement||document.documentElement,o=void 0===n||!0===c.is.mobile?()=>[Math.max(window.innerWidth,i.clientWidth),Math.max(window.innerHeight,i.clientHeight)]:()=>[n.width*n.scale+window.innerWidth-i.clientWidth,n.height*n.scale+window.innerHeight-i.clientHeight],s=!0===e.config.screen?.bodyClasses;this.__update=e=>{let[t,n]=o();if(n!==this.height&&(this.height=n),t!==this.width)this.width=t;else if(!0!==e)return;let a=this.sizes;this.gt.xs=t>=a.sm,this.gt.sm=t>=a.md,this.gt.md=t>=a.lg,this.gt.lg=t>=a.xl,this.lt.sm=t{E.forEach(t=>{void 0!==e[t]&&(u[t]=e[t])})},this.setDebounce=e=>{d=e};let h=()=>{let e=getComputedStyle(document.body);e.getPropertyValue("--q-size-sm")&&E.forEach(t=>{this.sizes[t]=parseInt(e.getPropertyValue(`--q-size-${t}`),10)}),this.setSizes=e=>{E.forEach(t=>{e[t]&&(this.sizes[t]=e[t])}),this.__update(!0)},this.setDebounce=e=>{void 0!==l&&a.removeEventListener("resize",l,A),l=e>0?P(this.__update,e):this.__update,a.addEventListener("resize",l,A)},this.setDebounce(d),0===Object.keys(u).length?this.__update():(this.setSizes(u),u=void 0),!0===s&&"xs"===this.name&&document.body.classList.add("screen--xs")};!0===r.value?t.push(h):h()}});let M=f({isActive:!1,mode:!1},{__media:void 0,set(e){M.mode=e,"auto"===e?(void 0===M.__media&&(M.__media=window.matchMedia("(prefers-color-scheme: dark)"),M.__updateMedia=()=>{M.set("auto")},M.__media.addListener(M.__updateMedia)),e=M.__media.matches):void 0!==M.__media&&(M.__media.removeListener(M.__updateMedia),M.__media=void 0),M.isActive=!0===e,document.body.classList.remove("body--"+(!0===e?"light":"dark")),document.body.classList.add("body--"+(!0===e?"dark":"light"))},toggle(){M.set(!1===M.isActive)},install({$q:e,ssrContext:t}){let n=e.config.dark;e.dark=this,!0!==this.__installed&&this.set(void 0!==n&&n)}});function R(e,t,n=document.body){if("string"!=typeof e)throw TypeError("Expected a string as propName");if("string"!=typeof t)throw TypeError("Expected a string as value");if(!(n instanceof Element))throw TypeError("Expected a DOM element");n.style.setProperty(`--q-${e}`,t)}let z=!1;function O(e){z=!0===e.isComposing}function I(e){return!0===z||e!==Object(e)||!0===e.isComposing||!0===e.qKeyEvent}function N(e,t){return!0!==I(e)&&[].concat(t).includes(e.keyCode)}function D(e){return!0===e.ios?"ios":!0===e.android?"android":void 0}var q={install(e){if(!0!==this.__installed){if(!0===r.value)!function(){let{is:e}=c,t=document.body.className,n=new Set(t.replace(/ {2}/g," ").split(" "));if(!0!==e.nativeMobile&&!0!==e.electron&&!0!==e.bex)if(!0===e.desktop)n.delete("mobile"),n.delete("platform-ios"),n.delete("platform-android"),n.add("desktop");else if(!0===e.mobile){n.delete("desktop"),n.add("mobile"),n.delete("platform-ios"),n.delete("platform-android");let t=D(e);void 0!==t&&n.add(`platform-${t}`)}!0===c.has.touch&&(n.delete("no-touch"),n.add("touch")),!0===c.within.iframe&&n.add("within-iframe");let a=Array.from(n).join(" ");t!==a&&(document.body.className=a)}();else{let{$q:t}=e;void 0!==t.config.brand&&function(e){for(let t in e)R(t,e[t])}(t.config.brand);let n=function({is:e,has:t,within:n},a){let i=[!0===e.desktop?"desktop":"mobile",(!1===t.touch?"no-":"")+"touch"];if(!0===e.mobile){let t=D(e);void 0!==t&&i.push("platform-"+t)}if(!0===e.nativeMobile){let t=e.nativeMobileWrapper;i.push(t),i.push("native-mobile"),!0===e.ios&&(void 0===a[t]||!1!==a[t].iosStatusBarPadding)&&i.push("q-ios-padding")}else!0===e.electron?i.push("electron"):!0===e.bex&&i.push("bex");return!0===n.iframe&&i.push("within-iframe"),i}(c,t.config);document.body.classList.add.apply(document.body.classList,n)}!0===c.is.ios&&document.body.addEventListener("touchstart",_),window.addEventListener("keydown",O,!0)}}};let j=()=>!0;function B(e){return"string"==typeof e&&""!==e&&"/"!==e&&"#/"!==e}function F(e){return!0===e.startsWith("#")&&(e=e.substring(1)),!1===e.startsWith("/")&&(e="/"+e),!0===e.endsWith("/")&&(e=e.substring(0,e.length-1)),"#"+e}var $={__history:[],add:_,remove:_,install({$q:e}){if(!0===this.__installed)return;let{cordova:t,capacitor:n}=c.is;if(!0!==t&&!0!==n)return;let a=e.config[!0===t?"cordova":"capacitor"];if(!1===a?.backButton||!0===n&&(void 0===window.Capacitor||void 0===window.Capacitor.Plugins.App))return;this.add=e=>{void 0===e.condition&&(e.condition=j),this.__history.push(e)},this.remove=e=>{let t=this.__history.indexOf(e);t>=0&&this.__history.splice(t,1)};let i=function(e){if(!1===e.backButtonExit)return()=>!1;if("*"===e.backButtonExit)return j;let t=["#/"];return!0===Array.isArray(e.backButtonExit)&&t.push(...e.backButtonExit.filter(B).map(F)),()=>t.includes(window.location.hash)}(Object.assign({backButtonExit:!0},a)),o=()=>{if(this.__history.length){let e=this.__history[this.__history.length-1];!0===e.condition()&&(this.__history.pop(),e.handler())}else!0===i()?navigator.app.exitApp():window.history.back()};!0===t?document.addEventListener("deviceready",()=>{document.addEventListener("backbutton",o,!1)}):window.Capacitor.Plugins.App.addListener("backButton",o)}},V={isoName:"en-US",nativeName:"English (US)",label:{clear:"Clear",ok:"OK",cancel:"Cancel",close:"Close",set:"Set",select:"Select",reset:"Reset",remove:"Remove",update:"Update",create:"Create",search:"Search",filter:"Filter",refresh:"Refresh",expand:e=>e?`Expand "${e}"`:"Expand",collapse:e=>e?`Collapse "${e}"`:"Collapse"},date:{days:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),daysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),firstDayOfWeek:0,format24h:!1,pluralDay:"days",prevMonth:"Previous month",nextMonth:"Next month",prevYear:"Previous year",nextYear:"Next year",today:"Today",prevRangeYears:e=>`Previous ${e} years`,nextRangeYears:e=>`Next ${e} years`},table:{noData:"No data available",noResults:"No matching records found",loading:"Loading...",selectedRecords:e=>1===e?"1 record selected.":(0===e?"No":e)+" records selected.",recordsPerPage:"Records per page:",allRows:"All",pagination:(e,t,n)=>e+"-"+t+" of "+n,columns:"Columns"},pagination:{first:"First page",prev:"Previous page",next:"Next page",last:"Last page"},editor:{url:"URL",bold:"Bold",italic:"Italic",strikethrough:"Strikethrough",underline:"Underline",unorderedList:"Unordered List",orderedList:"Ordered List",subscript:"Subscript",superscript:"Superscript",hyperlink:"Hyperlink",toggleFullscreen:"Toggle Fullscreen",quote:"Quote",left:"Left align",center:"Center align",right:"Right align",justify:"Justify align",print:"Print",outdent:"Decrease indentation",indent:"Increase indentation",removeFormat:"Remove formatting",formatting:"Formatting",fontSize:"Font Size",align:"Align",hr:"Insert Horizontal Rule",undo:"Undo",redo:"Redo",heading1:"Heading 1",heading2:"Heading 2",heading3:"Heading 3",heading4:"Heading 4",heading5:"Heading 5",heading6:"Heading 6",paragraph:"Paragraph",code:"Code",size1:"Very small",size2:"A bit small",size3:"Normal",size4:"Medium-large",size5:"Big",size6:"Very big",size7:"Maximum",defaultFont:"Default Font",viewSource:"View Source"},tree:{noNodes:"No nodes available",noResults:"No matching nodes found"}};function U(){let e=!0===Array.isArray(navigator.languages)&&0!==navigator.languages.length?navigator.languages[0]:navigator.language;if("string"==typeof e)return e.split(/[-_]/).map((e,t)=>0===t?e.toLowerCase():t>1||e.length<4?e.toUpperCase():e[0].toUpperCase()+e.slice(1).toLowerCase()).join("-")}let H=f({__qLang:{}},{getLocale:U,set(e=V,t){let n={...e,rtl:!0===e.rtl,getLocale:U};if(n.set=H.set,void 0===H.__langConfig||!0!==H.__langConfig.noHtmlAttrs){let e=document.documentElement;e.setAttribute("dir",!0===n.rtl?"rtl":"ltr"),e.setAttribute("lang",n.isoName)}Object.assign(H.__qLang,n)},install({$q:e,lang:t,ssrContext:n}){e.lang=H.__qLang,H.__langConfig=e.config.lang,!0===this.__installed?void 0!==t&&this.set(t):(this.props=new Proxy(this.__qLang,{get(){return Reflect.get(...arguments)},ownKeys:e=>Reflect.ownKeys(e).filter(e=>"set"!==e&&"getLocale"!==e)}),this.set(t||V))}});var W={name:"material-icons",type:{positive:"check_circle",negative:"warning",info:"info",warning:"priority_high"},arrow:{up:"arrow_upward",right:"arrow_forward",down:"arrow_downward",left:"arrow_back",dropdown:"arrow_drop_down"},chevron:{left:"chevron_left",right:"chevron_right"},colorPicker:{spectrum:"gradient",tune:"tune",palette:"style"},pullToRefresh:{icon:"refresh"},carousel:{left:"chevron_left",right:"chevron_right",up:"keyboard_arrow_up",down:"keyboard_arrow_down",navigationIcon:"lens"},chip:{remove:"cancel",selected:"check"},datetime:{arrowLeft:"chevron_left",arrowRight:"chevron_right",now:"access_time",today:"today"},editor:{bold:"format_bold",italic:"format_italic",strikethrough:"strikethrough_s",underline:"format_underlined",unorderedList:"format_list_bulleted",orderedList:"format_list_numbered",subscript:"vertical_align_bottom",superscript:"vertical_align_top",hyperlink:"link",toggleFullscreen:"fullscreen",quote:"format_quote",left:"format_align_left",center:"format_align_center",right:"format_align_right",justify:"format_align_justify",print:"print",outdent:"format_indent_decrease",indent:"format_indent_increase",removeFormat:"format_clear",formatting:"text_format",fontSize:"format_size",align:"format_align_left",hr:"remove",undo:"undo",redo:"redo",heading:"format_size",code:"code",size:"format_size",font:"font_download",viewSource:"code"},expansionItem:{icon:"keyboard_arrow_down",denseIcon:"arrow_drop_down"},fab:{icon:"add",activeIcon:"close"},field:{clear:"cancel",error:"error"},pagination:{first:"first_page",prev:"keyboard_arrow_left",next:"keyboard_arrow_right",last:"last_page"},rating:{icon:"grade"},stepper:{done:"check",active:"edit",error:"warning"},tabs:{left:"chevron_left",right:"chevron_right",up:"keyboard_arrow_up",down:"keyboard_arrow_down"},table:{arrowUp:"arrow_upward",warning:"warning",firstPage:"first_page",prevPage:"chevron_left",nextPage:"chevron_right",lastPage:"last_page"},tree:{icon:"play_arrow"},uploader:{done:"done",clear:"clear",add:"add_box",upload:"cloud_upload",removeQueue:"clear_all",removeUploaded:"done_all"}};let G=f({iconMapFn:null,__qIconSet:{}},{set(e,t){let n={...e};n.set=G.set,Object.assign(G.__qIconSet,n)},install({$q:e,iconSet:t,ssrContext:n}){void 0!==e.config.iconMapFn&&(this.iconMapFn=e.config.iconMapFn),e.iconSet=this.__qIconSet,a(e,"iconMapFn",()=>this.iconMapFn,e=>{this.iconMapFn=e}),!0===this.__installed?void 0!==t&&this.set(t):(this.props=new Proxy(this.__qIconSet,{get(){return Reflect.get(...arguments)},ownKeys:e=>Reflect.ownKeys(e).filter(e=>"set"!==e)}),this.set(t||W))}}),K="_q_t_",Y="_q_s_",Q="_q_l_",Z="_q_f_",J="_q_fo_",X="_q_tabs_",ee="_q_u_";function te(){}let ne={},ae=!1;function ie(e,t){if(e===t)return!0;if(null!==e&&null!==t&&"object"==typeof e&&"object"==typeof t){if(e.constructor!==t.constructor)return!1;let n,a;if(e.constructor===Array){if(n=e.length,n!==t.length)return!1;for(a=n;0!==a--;)if(!0!==ie(e[a],t[a]))return!1;return!0}if(e.constructor===Map){if(e.size!==t.size)return!1;let n=e.entries();for(a=n.next();!0!==a.done;){if(!0!==t.has(a.value[0]))return!1;a=n.next()}for(n=e.entries(),a=n.next();!0!==a.done;){if(!0!==ie(a.value[1],t.get(a.value[0])))return!1;a=n.next()}return!0}if(e.constructor===Set){if(e.size!==t.size)return!1;let n=e.entries();for(a=n.next();!0!==a.done;){if(!0!==t.has(a.value[0]))return!1;a=n.next()}return!0}if(null!=e.buffer&&e.buffer.constructor===ArrayBuffer){if(n=e.length,n!==t.length)return!1;for(a=n;0!==a--;)if(e[a]!==t[a])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();let i=Object.keys(e).filter(t=>void 0!==e[t]);if(n=i.length,n!==Object.keys(t).filter(e=>void 0!==t[e]).length)return!1;for(a=n;0!==a--;){let n=i[a];if(!0!==ie(e[n],t[n]))return!1}return!0}return e!=e&&t!=t}function oe(e){return"object"==typeof e&&!!e&&!0!==Array.isArray(e)}function re(e){return"[object Date]"===Object.prototype.toString.call(e)}function se(e){return"[object RegExp]"===Object.prototype.toString.call(e)}function le(e){return"number"==typeof e&&isFinite(e)}var ue={deepEqual:ie,object:oe,date:re,regexp:se,number:le};let ce=[d,q,M,L,$,H,G];function de(t,n){let a=(0,e.createApp)(t);a.config.globalProperties=n.config.globalProperties;let{reload:i,...o}=n._context;return Object.assign(a._context,o),a}function he(e,t){t.forEach(t=>{t.install(e),t.__installed=!0})}var pe=function(e,t={}){let n={version:"2.19.3"};!1===ae?(void 0!==t.config&&Object.assign(ne,t.config),n.config={...ne},ae=!0):n.config=t.config||{},function(e,t,n){e.config.globalProperties.$q=n.$q,e.provide("_q_",n.$q),he(n,ce),void 0!==t.components&&Object.values(t.components).forEach(t=>{!0===oe(t)&&void 0!==t.name&&e.component(t.name,t)}),void 0!==t.directives&&Object.values(t.directives).forEach(t=>{!0===oe(t)&&void 0!==t.name&&e.directive(t.name,t)}),void 0!==t.plugins&&he(n,Object.values(t.plugins).filter(e=>"function"==typeof e.install&&!1===ce.includes(e))),!0===r.value&&(n.$q.onSSRHydrated=()=>{n.onSSRHydrated.forEach(e=>{e()}),n.$q.onSSRHydrated=()=>{}})}(e,t,{parentApp:e,$q:n,lang:t.lang,iconSet:t.iconSet,onSSRHydrated:[]})};let fe=["B","KB","MB","GB","TB","PB"];function me(e,t=1){let n=0;for(;parseInt(e,10)>=1024&&n=t?a:Array(t-a.length+1).join(n)+a}var ye={humanStorageSize:me,capitalize:_e,between:ge,normalizeToInterval:ve,pad:be};let we=XMLHttpRequest,ke=we.prototype.open,xe=["top","right","bottom","left"],Se=[],Ce=0;var Te=h({name:"QAjaxBar",props:{position:{type:String,default:"top",validator:e=>xe.includes(e)},size:{type:String,default:"2px"},color:String,skipHijack:Boolean,reverse:Boolean,hijackFilter:Function},emits:["start","stop"],setup(t,{emit:n}){let a,i,{proxy:o}=(0,e.getCurrentInstance)(),r=(0,e.ref)(0),s=(0,e.ref)(!1),l=(0,e.ref)(!0),u=0,c=null,d=(0,e.computed)(()=>`q-loading-bar q-loading-bar--${t.position}`+(void 0===t.color?"":` bg-${t.color}`)+(!0===l.value?"":" no-transition")),h=(0,e.computed)(()=>"top"===t.position||"bottom"===t.position),p=(0,e.computed)(()=>!0===h.value?"height":"width"),f=(0,e.computed)(()=>{let e=s.value,n=function({p:e,pos:t,active:n,horiz:a,reverse:i,dir:o}){let r=1,s=1;return!0===a?(!0===i&&(r=-1),"bottom"===t&&(s=-1),{transform:`translate3d(${r*(e-100)}%,${n?0:-200*s}%,0)`}):(!0===i&&(s=-1),"right"===t&&(r=-1),{transform:`translate3d(${n?0:o*r*-200}%,${s*(e-100)}%,0)`})}({p:r.value,pos:t.position,active:e,horiz:h.value,reverse:!0===o.$q.lang.rtl&&["top","bottom"].includes(t.position)?!1===t.reverse:t.reverse,dir:!0===o.$q.lang.rtl?-1:1});return n[p.value]=t.size,n.opacity=+!!e,n}),m=(0,e.computed)(()=>!0===s.value?{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":r.value}:{"aria-hidden":"true"});function _(e=300){let t=a;return a=Math.max(0,e)||0,u++,u>1?(0===t&&e>0?b():null!==c&&t>0&&e<=0&&(clearTimeout(c),c=null),u):(null!==c&&clearTimeout(c),n("start"),r.value=0,c=setTimeout(()=>{c=null,l.value=!0,e>0&&b()},!0===s._value?500:1),!0!==s._value&&(s.value=!0,l.value=!1),u)}function g(e){return u>0&&(r.value=function(e,t){return"number"!=typeof t&&(t=e<25?3*Math.random()+3:e<65?3*Math.random():e<85?2*Math.random():e<99?.6:0),ge(e+t,0,100)}(r.value,e)),u}function v(){if(u=Math.max(0,u-1),u>0)return u;null!==c&&(clearTimeout(c),c=null),n("stop");let e=()=>{l.value=!0,r.value=100,c=setTimeout(()=>{c=null,s.value=!1},1e3)};return 0===r.value?c=setTimeout(e,1):e(),u}function b(){r.value<100&&(c=setTimeout(()=>{c=null,g(),b()},a))}return(0,e.onMounted)(()=>{!0!==t.skipHijack&&(i=!0,function(e){Ce++,Se.push(e),!(Ce>1)&&(we.prototype.open=function(e,t){let n=[];this.addEventListener("loadstart",()=>{Se.forEach(e=>{(null===e.hijackFilter.value||!0===e.hijackFilter.value(t))&&(e.start(),n.push(e.stop))})},{once:!0}),this.addEventListener("loadend",()=>{n.forEach(e=>{e()})},{once:!0}),ke.apply(this,arguments)})}({start:_,stop:v,hijackFilter:(0,e.computed)(()=>t.hijackFilter||null)}))}),(0,e.onBeforeUnmount)(()=>{null!==c&&clearTimeout(c),!0===i&&function(e){Se=Se.filter(t=>t.start!==e),Ce=Math.max(0,Ce-1),0===Ce&&(we.prototype.open=ke)}(_)}),Object.assign(o,{start:_,stop:v,increment:g}),()=>(0,e.h)("div",{class:d.value,style:f.value,...m.value})}});let Pe={xs:18,sm:24,md:32,lg:38,xl:46},Ee={size:String};function Ae(t,n=Pe){return(0,e.computed)(()=>void 0===t.size?null:{fontSize:t.size in n?`${n[t.size]}px`:t.size})}function Le(e,t){return void 0===e?t:e()||t}function Me(e,t){if(void 0!==e){let t=e();if(null!=t)return t.slice()}return t}function Re(e,t){return void 0===e?t:t.concat(e())}function ze(e,t){return void 0===e?t:void 0===t?e():t.concat(e())}function Oe(t,n,a,i,o,r){n.key=i+o;let s=(0,e.h)(t,n,a);return!0===o?(0,e.withDirectives)(s,r()):s}let Ie="0 0 24 24",Ne=e=>e,De=e=>`ionicons ${e}`,qe={"mdi-":e=>`mdi ${e}`,"icon-":Ne,"bt-":e=>`bt ${e}`,"eva-":e=>`eva ${e}`,"ion-md":De,"ion-ios":De,"ion-logo":De,"iconfont ":Ne,"ti-":e=>`themify-icon ${e}`,"bi-":e=>`bootstrap-icons ${e}`,"i-":Ne},je={o_:"-outlined",r_:"-round",s_:"-sharp"},Be={sym_o_:"-outlined",sym_r_:"-rounded",sym_s_:"-sharp"},Fe=RegExp("^("+Object.keys(qe).join("|")+")"),$e=RegExp("^("+Object.keys(je).join("|")+")"),Ve=RegExp("^("+Object.keys(Be).join("|")+")"),Ue=/^[Mm]\s?[-+]?\.?\d/,He=/^img:/,We=/^svguse:/,Ge=/^ion-/,Ke=/^(fa-(classic|sharp|solid|regular|light|brands|duotone|thin)|[lf]a[srlbdk]?) /;var Ye=h({name:"QIcon",props:{...Ee,tag:{type:String,default:"i"},name:String,color:String,left:Boolean,right:Boolean},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=Ae(t),o=(0,e.computed)(()=>"q-icon"+(!0===t.left?" on-left":"")+(!0===t.right?" on-right":"")+(void 0===t.color?"":` text-${t.color}`)),r=(0,e.computed)(()=>{let n,i=t.name;if("none"===i||!i)return{none:!0};if(null!==a.iconMapFn){let e=a.iconMapFn(i);if(void 0!==e){if(void 0===e.icon)return{cls:e.cls,content:void 0===e.content?" ":e.content};if(i=e.icon,"none"===i||!i)return{none:!0}}}if(!0===Ue.test(i)){let[t,n=Ie]=i.split("|");return{svg:!0,viewBox:n,nodes:t.split("&&").map(t=>{let[n,a,i]=t.split("@@");return(0,e.h)("path",{style:a,d:n,transform:i})})}}if(!0===He.test(i))return{img:!0,src:i.substring(4)};if(!0===We.test(i)){let[e,t=Ie]=i.split("|");return{svguse:!0,src:e.substring(7),viewBox:t}}let o=" ",r=i.match(Fe);if(null!==r)n=qe[r[1]](i);else if(!0===Ke.test(i))n=i;else if(!0===Ge.test(i))n=`ionicons ion-${!0===a.platform.is.ios?"ios":"md"}${i.substring(3)}`;else if(!0===Ve.test(i)){n="notranslate material-symbols";let e=i.match(Ve);null!==e&&(i=i.substring(6),n+=Be[e[1]]),o=i}else{n="notranslate material-icons";let e=i.match($e);null!==e&&(i=i.substring(2),n+=je[e[1]]),o=i}return{cls:n,content:o}});return()=>{let a={class:o.value,style:i.value,"aria-hidden":"true"};return!0===r.value.none?(0,e.h)(t.tag,a,Le(n.default)):!0===r.value.img?(0,e.h)(t.tag,a,Re(n.default,[(0,e.h)("img",{src:r.value.src})])):!0===r.value.svg?(0,e.h)(t.tag,a,Re(n.default,[(0,e.h)("svg",{viewBox:r.value.viewBox||"0 0 24 24"},r.value.nodes)])):!0===r.value.svguse?(0,e.h)(t.tag,a,Re(n.default,[(0,e.h)("svg",{viewBox:r.value.viewBox},[(0,e.h)("use",{"xlink:href":r.value.src})])])):(void 0!==r.value.cls&&(a.class+=" "+r.value.cls),(0,e.h)(t.tag,a,Re(n.default,[r.value.content])))}}}),Qe=h({name:"QAvatar",props:{...Ee,fontSize:String,color:String,textColor:String,icon:String,square:Boolean,rounded:Boolean},setup(t,{slots:n}){let a=Ae(t),i=(0,e.computed)(()=>"q-avatar"+(t.color?` bg-${t.color}`:"")+(t.textColor?` text-${t.textColor} q-chip--colored`:"")+(!0===t.square?" q-avatar--square":!0===t.rounded?" rounded-borders":"")),o=(0,e.computed)(()=>t.fontSize?{fontSize:t.fontSize}:null);return()=>{let r=void 0===t.icon?void 0:[(0,e.h)(Ye,{name:t.icon})];return(0,e.h)("div",{class:i.value,style:a.value},[(0,e.h)("div",{class:"q-avatar__content row flex-center overflow-hidden",style:o.value},ze(n.default,r))])}}});let Ze=["top","middle","bottom"];var Je=h({name:"QBadge",props:{color:String,textColor:String,floating:Boolean,transparent:Boolean,multiLine:Boolean,outline:Boolean,rounded:Boolean,label:[Number,String],align:{type:String,validator:e=>Ze.includes(e)}},setup(t,{slots:n}){let a=(0,e.computed)(()=>void 0===t.align?null:{verticalAlign:t.align}),i=(0,e.computed)(()=>{let e=!0===t.outline&&t.color||t.textColor;return`q-badge flex inline items-center no-wrap q-badge--${!0===t.multiLine?"multi":"single"}-line`+(!0===t.outline?" q-badge--outline":void 0===t.color?"":` bg-${t.color}`)+(void 0===e?"":` text-${e}`)+(!0===t.floating?" q-badge--floating":"")+(!0===t.rounded?" q-badge--rounded":"")+(!0===t.transparent?" q-badge--transparent":"")});return()=>(0,e.h)("div",{class:i.value,style:a.value,role:"status","aria-label":t.label},Re(n.default,void 0===t.label?[]:[t.label]))}});let Xe={dark:{type:Boolean,default:null}};function et(t,n){return(0,e.computed)(()=>null===t.dark?n.dark.isActive:t.dark)}var tt=h({name:"QBanner",props:{...Xe,inlineActions:Boolean,dense:Boolean,rounded:Boolean},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=et(t,a),o=(0,e.computed)(()=>"q-banner row items-center"+(!0===t.dense?" q-banner--dense":"")+(!0===i.value?" q-banner--dark q-dark":"")+(!0===t.rounded?" rounded-borders":"")),r=(0,e.computed)(()=>"q-banner__actions row items-center justify-end col-"+(!0===t.inlineActions?"auto":"all"));return()=>{let a=[(0,e.h)("div",{class:"q-banner__avatar col-auto row items-center self-start"},Le(n.avatar)),(0,e.h)("div",{class:"q-banner__content col text-body2"},Le(n.default))],i=Le(n.action);return void 0!==i&&a.push((0,e.h)("div",{class:r.value},i)),(0,e.h)("div",{class:o.value+(!1===t.inlineActions&&void 0!==i?" q-banner--top-padding":""),role:"alert"},a)}}}),nt=h({name:"QBar",props:{...Xe,dense:Boolean},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=et(t,a),o=(0,e.computed)(()=>`q-bar row no-wrap items-center q-bar--${!0===t.dense?"dense":"standard"} q-bar--${!0===i.value?"dark":"light"}`);return()=>(0,e.h)("div",{class:o.value,role:"toolbar"},Le(n.default))}});let at={left:"start",center:"center",right:"end",between:"between",around:"around",evenly:"evenly",stretch:"stretch"},it=Object.keys(at),ot={align:{type:String,validator:e=>it.includes(e)}};function rt(t){return(0,e.computed)(()=>{let e=void 0===t.align?!0===t.vertical?"stretch":"left":t.align;return`${!0===t.vertical?"items":"justify"}-${at[e]}`})}function st(e){if(Object(e.$parent)===e.$parent)return e.$parent;let{parent:t}=e.$;for(;Object(t)===t;){if(Object(t.proxy)===t.proxy)return t.proxy;t=t.parent}}function lt(e,t){"symbol"==typeof t.type?!0===Array.isArray(t.children)&&t.children.forEach(t=>{lt(e,t)}):e.add(t)}function ut(e){let t=new Set;return e.forEach(e=>{lt(t,e)}),Array.from(t)}function ct(e){return void 0!==e.appContext.config.globalProperties.$router}function dt(e){return!0===e.isUnmounted||!0===e.isDeactivated}let ht=["",!0];var pt=h({name:"QBreadcrumbs",props:{...ot,separator:{type:String,default:"/"},separatorColor:String,activeColor:{type:String,default:"primary"},gutter:{type:String,validator:e=>["none","xs","sm","md","lg","xl"].includes(e),default:"sm"}},setup(t,{slots:n}){let a=rt(t),i=(0,e.computed)(()=>`flex items-center ${a.value}${"none"===t.gutter?"":` q-gutter-${t.gutter}`}`),o=(0,e.computed)(()=>t.separatorColor?` text-${t.separatorColor}`:""),r=(0,e.computed)(()=>` text-${t.activeColor}`);return()=>{if(void 0===n.default)return;let a=ut(Le(n.default));if(0===a.length)return;let s=1,l=[],u=a.filter(e=>"QBreadcrumbsEl"===e.type?.name).length,c=void 0===n.separator?()=>t.separator:n.separator;return a.forEach(t=>{if("QBreadcrumbsEl"===t.type?.name){let n=se===t[n]):1===e.length&&e[0]===t}function gt(e,t){return!0===Array.isArray(e)?_t(e,t):!0===Array.isArray(t)?_t(t,e):e===t}let vt={to:[String,Object],replace:Boolean,href:String,target:String,disable:Boolean},bt={...vt,exact:Boolean,activeClass:{type:String,default:"q-router-link--active"},exactActiveClass:{type:String,default:"q-router-link--exact-active"}};function yt({fallbackTag:t,useDisableForRouterLinkProps:n=!0}={}){let a=(0,e.getCurrentInstance)(),{props:i,proxy:o,emit:r}=a,s=ct(a),l=(0,e.computed)(()=>!0!==i.disable&&void 0!==i.href),u=!0===n?(0,e.computed)(()=>!0===s&&!0!==i.disable&&!0!==l.value&&void 0!==i.to&&null!==i.to&&""!==i.to):(0,e.computed)(()=>!0===s&&!0!==l.value&&void 0!==i.to&&null!==i.to&&""!==i.to),c=(0,e.computed)(()=>!0===u.value?b(i.to):null),d=(0,e.computed)(()=>null!==c.value),h=(0,e.computed)(()=>!0===l.value||!0===d.value),p=(0,e.computed)(()=>"a"===i.type||!0===h.value?"a":i.tag||t||"div"),f=(0,e.computed)(()=>!0===l.value?{href:i.href,target:i.target}:!0===d.value?{href:c.value.href,target:i.target}:{}),m=(0,e.computed)(()=>{if(!1===d.value)return-1;let{matched:e}=c.value,{length:t}=e,n=e[t-1];if(void 0===n)return-1;let a=o.$route.matched;if(0===a.length)return-1;let i=a.findIndex(mt.bind(null,n));if(-1!==i)return i;let r=ft(e[t-2]);return t>1&&ft(n)===r&&a[a.length-1].path!==r?a.findIndex(mt.bind(null,e[t-2])):i}),_=(0,e.computed)(()=>!0===d.value&&-1!==m.value&&function(e,t){for(let n in t){let a=t[n],i=e[n];if("string"==typeof a){if(a!==i)return!1}else if(!1===Array.isArray(i)||i.length!==a.length||a.some((e,t)=>e!==i[t]))return!1}return!0}(o.$route.params,c.value.params)),g=(0,e.computed)(()=>!0===_.value&&m.value===o.$route.matched.length-1&&function(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(!1===gt(e[n],t[n]))return!1;return!0}(o.$route.params,c.value.params)),v=(0,e.computed)(()=>!0===d.value?!0===g.value?` ${i.exactActiveClass} ${i.activeClass}`:!0===i.exact?"":!0===_.value?` ${i.activeClass}`:"":"");function b(e){try{return o.$router.resolve(e)}catch{}return null}function y(e,{returnRouterError:t,to:n=i.to,replace:a=i.replace}={}){if(!0===i.disable)return e.preventDefault(),Promise.resolve(!1);if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||void 0!==e.button&&0!==e.button||"_blank"===i.target)return Promise.resolve(!1);e.preventDefault();let r=o.$router[!0===a?"replace":"push"](n);return!0===t?r:r.then(()=>{}).catch(()=>{})}return{hasRouterLink:d,hasHrefLink:l,hasLink:h,linkTag:p,resolvedLink:c,linkIsActive:_,linkIsExactActive:g,linkClass:v,linkAttrs:f,getLink:b,navigateToRouterLink:y,navigateOnClick:function(e){if(!0===d.value){let t=t=>y(e,t);r("click",e,t),!0!==e.defaultPrevented&&t()}else r("click",e)}}}var wt=h({name:"QBreadcrumbsEl",props:{...bt,label:String,icon:String,tag:{type:String,default:"span"}},emits:["click"],setup(t,{slots:n}){let{linkTag:a,linkAttrs:i,linkClass:o,navigateOnClick:r}=yt(),s=(0,e.computed)(()=>({class:"q-breadcrumbs__el q-link flex inline items-center relative-position "+(!0===t.disable?"q-breadcrumbs__el--disable":"q-link--focusable"+o.value),...i.value,onClick:r})),l=(0,e.computed)(()=>"q-breadcrumbs__el-icon"+(void 0===t.label?"":" q-breadcrumbs__el-icon--with-label"));return()=>{let i=[];return void 0!==t.icon&&i.push((0,e.h)(Ye,{class:l.value,name:t.icon})),void 0!==t.label&&i.push(t.label),(0,e.h)(a.value,{...s.value},Re(n.default,i))}}});let kt={size:{type:[String,Number],default:"1em"},color:String};function xt(t){return{cSize:(0,e.computed)(()=>t.size in Pe?`${Pe[t.size]}px`:t.size),classes:(0,e.computed)(()=>"q-spinner"+(t.color?` text-${t.color}`:""))}}var St=h({name:"QSpinner",props:{...kt,thickness:{type:Number,default:5}},setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value+" q-spinner-mat",width:n.value,height:n.value,viewBox:"25 25 50 50"},[(0,e.h)("circle",{class:"path",cx:"50",cy:"50",r:"20",fill:"none",stroke:"currentColor","stroke-width":t.thickness,"stroke-miterlimit":"10"})])}});function Ct(e){if(e===window)return{top:0,left:0};let{top:t,left:n}=e.getBoundingClientRect();return{top:t,left:n}}function Tt(e){return e===window?window.innerHeight:e.getBoundingClientRect().height}function Pt(e,t){let n=e.style;for(let e in t)n[e]=t[e]}function Et(t){if(null==t)return;if("string"==typeof t)try{return document.querySelector(t)||void 0}catch{return}let n=(0,e.unref)(t);return n?n.$el||n:void 0}function At(e,t){if(null==e||!0===e.contains(t))return!0;for(let n=e.nextElementSibling;null!==n;n=n.nextElementSibling)if(n.contains(t))return!0;return!1}var Lt={offset:Ct,style:function(e,t){return window.getComputedStyle(e).getPropertyValue(t)},height:Tt,width:function(e){return e===window?window.innerWidth:e.getBoundingClientRect().width},css:Pt,cssBatch:function(e,t){e.forEach(e=>Pt(e,t))},ready:function(e){if("function"==typeof e){if("loading"!==document.readyState)return e();document.addEventListener("DOMContentLoaded",e,!1)}}};function Mt(e,t=250){let n,a=!1;return function(){return!1===a&&(a=!0,setTimeout(()=>{a=!1},t),n=e.apply(this,arguments)),n}}function Rt(e,t,n,a){!0===n.modifiers.stop&&y(e);let i=n.modifiers.color,o=n.modifiers.center;o=!0===o||!0===a;let r=document.createElement("span"),s=document.createElement("span"),l=v(e),{left:u,top:c,width:d,height:h}=t.getBoundingClientRect(),p=Math.sqrt(d*d+h*h),f=p/2,m=(d-p)/2+"px",_=o?m:l.left-u-f+"px",g=(h-p)/2+"px",b=o?g:l.top-c-f+"px";s.className="q-ripple__inner",Pt(s,{height:`${p}px`,width:`${p}px`,transform:`translate3d(${_},${b},0) scale3d(.2,.2,1)`,opacity:0}),r.className="q-ripple"+(i?" text-"+i:""),r.setAttribute("dir","ltr"),r.appendChild(s),t.appendChild(r);let w=()=>{r.remove(),clearTimeout(k)};n.abort.push(w);let k=setTimeout(()=>{s.classList.add("q-ripple__inner--enter"),s.style.transform=`translate3d(${m},${g},0) scale3d(1,1,1)`,s.style.opacity=.2,k=setTimeout(()=>{s.classList.remove("q-ripple__inner--enter"),s.classList.add("q-ripple__inner--leave"),s.style.opacity=0,k=setTimeout(()=>{r.remove(),n.abort.splice(n.abort.indexOf(w),1)},275)},250)},50)}function zt(e,{modifiers:t,value:n,arg:a}){let i=Object.assign({},e.cfg.ripple,t,n);e.modifiers={early:!0===i.early,stop:!0===i.stop,center:!0===i.center,color:i.color||a,keyCodes:[].concat(i.keyCodes||13)}}var Ot=p({name:"ripple",beforeMount(e,t){let n=t.instance.$.appContext.config.globalProperties.$q.config||{};if(!1===n.ripple)return;let a={cfg:n,enabled:!1!==t.value,modifiers:{},abort:[],start(t){!0===a.enabled&&!0!==t.qSkipRipple&&t.type===(!0===a.modifiers.early?"pointerdown":"click")&&Rt(t,e,a,!0===t.qKeyEvent)},keystart:Mt(t=>{!0===a.enabled&&!0!==t.qSkipRipple&&!0===N(t,a.modifiers.keyCodes)&&t.type==="key"+(!0===a.modifiers.early?"down":"up")&&Rt(t,e,a,!0)},300)};zt(a,t),e.__qripple=a,S(a,"main",[[e,"pointerdown","start","passive"],[e,"click","start","passive"],[e,"keydown","keystart","passive"],[e,"keyup","keystart","passive"]])},updated(e,t){if(t.oldValue!==t.value){let n=e.__qripple;void 0!==n&&(n.enabled=!1!==t.value,!0===n.enabled&&Object(t.value)===t.value&&zt(n,t))}},beforeUnmount(e){let t=e.__qripple;void 0!==t&&(t.abort.forEach(e=>{e()}),C(t,"main"),delete e._qripple)}});let It={none:0,xs:4,sm:8,md:16,lg:24,xl:32},Nt={xs:8,sm:10,md:14,lg:20,xl:24},Dt=["button","submit","reset"],qt=/[^\s]\/[^\s]/,jt=["flat","outline","push","unelevated"];function Bt(e,t){return!0===e.flat?"flat":!0===e.outline?"outline":!0===e.push?"push":!0===e.unelevated?"unelevated":t}function Ft(e){let t=Bt(e);return void 0===t?{}:{[t]:!0}}let $t={...Ee,...vt,type:{type:String,default:"button"},label:[Number,String],icon:String,iconRight:String,...jt.reduce((e,t)=>(e[t]=Boolean)&&e,{}),square:Boolean,rounded:Boolean,glossy:Boolean,size:String,fab:Boolean,fabMini:Boolean,padding:String,color:String,textColor:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,tabindex:[Number,String],ripple:{type:[Boolean,Object],default:!0},align:{...ot.align,default:"center"},stack:Boolean,stretch:Boolean,loading:{type:Boolean,default:null},disable:Boolean},Vt={...$t,round:Boolean};let{passiveCapture:Ut}=m,Ht=null,Wt=null,Gt=null;var Kt=h({name:"QBtn",props:{...Vt,percentage:Number,darkPercentage:Boolean,onTouchstart:[Function,Array]},emits:["click","keydown","mousedown","keyup"],setup(t,{slots:n,emit:a}){let i,{proxy:o}=(0,e.getCurrentInstance)(),{classes:r,style:s,innerClasses:l,attributes:u,hasLink:c,linkTag:d,navigateOnClick:h,isActionable:p}=function(t){let n=Ae(t,Nt),a=rt(t),{hasRouterLink:i,hasLink:o,linkTag:r,linkAttrs:s,navigateOnClick:l}=yt({fallbackTag:"button"}),u=(0,e.computed)(()=>{let e=!1===t.fab&&!1===t.fabMini?n.value:{};return void 0===t.padding?e:Object.assign({},e,{padding:t.padding.split(/\s+/).map(e=>e in It?It[e]+"px":e).join(" "),minWidth:"0",minHeight:"0"})}),c=(0,e.computed)(()=>!0===t.rounded||!0===t.fab||!0===t.fabMini),d=(0,e.computed)(()=>!0!==t.disable&&!0!==t.loading),h=(0,e.computed)(()=>!0===d.value?t.tabindex||0:-1),p=(0,e.computed)(()=>Bt(t,"standard")),f=(0,e.computed)(()=>{let e={tabindex:h.value};return!0===o.value?Object.assign(e,s.value):!0===Dt.includes(t.type)&&(e.type=t.type),"a"===r.value?(!0===t.disable?e["aria-disabled"]="true":void 0===e.href&&(e.role="button"),!0!==i.value&&!0===qt.test(t.type)&&(e.type=t.type)):!0===t.disable&&(e.disabled="",e["aria-disabled"]="true"),!0===t.loading&&void 0!==t.percentage&&Object.assign(e,{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":t.percentage}),e});return{classes:(0,e.computed)(()=>{let e;void 0===t.color?t.textColor&&(e=`text-${t.textColor}`):e=!0===t.flat||!0===t.outline?`text-${t.textColor||t.color}`:`bg-${t.color} text-${t.textColor||"white"}`;let n=!0===t.round?"round":"rectangle"+(!0===c.value?" q-btn--rounded":!0===t.square?" q-btn--square":"");return`q-btn--${p.value} q-btn--${n}`+(void 0===e?"":" "+e)+(!0===d.value?" q-btn--actionable q-focusable q-hoverable":!0===t.disable?" disabled":"")+(!0===t.fab?" q-btn--fab":!0===t.fabMini?" q-btn--fab-mini":"")+(!0===t.noCaps?" q-btn--no-uppercase":"")+(!0===t.dense?" q-btn--dense":"")+(!0===t.stretch?" no-border-radius self-stretch":"")+(!0===t.glossy?" glossy":"")+(t.square?" q-btn--square":"")}),style:u,innerClasses:(0,e.computed)(()=>a.value+(!0===t.stack?" column":" row")+(!0===t.noWrap?" no-wrap text-no-wrap":"")+(!0===t.loading?" q-btn__content--hidden":"")),attributes:f,hasLink:o,linkTag:r,navigateOnClick:l,isActionable:d}}(t),f=(0,e.ref)(null),m=(0,e.ref)(null),_=null,g=null,v=(0,e.computed)(()=>void 0!==t.label&&null!==t.label&&""!==t.label),b=(0,e.computed)(()=>!0!==t.disable&&!1!==t.ripple&&{keyCodes:!0===c.value?[13,32]:[13],...!0===t.ripple?{}:t.ripple}),x=(0,e.computed)(()=>({center:t.round})),S=(0,e.computed)(()=>{let e=Math.max(0,Math.min(100,t.percentage));return e>0?{transition:"transform 0.6s",transform:`translateX(${e-100}%)`}:{}}),C=(0,e.computed)(()=>{if(!0===t.loading)return{onMousedown:z,onTouchstart:z,onClick:z,onKeydown:z,onKeyup:z};if(!0===p.value){let e={onClick:P,onKeydown:E,onMousedown:L};if(!0===o.$q.platform.has.touch){e[`onTouchstart${void 0===t.onTouchstart?"Passive":""}`]=A}return e}return{onClick:k}}),T=(0,e.computed)(()=>({ref:f,class:"q-btn q-btn-item non-selectable no-outline "+r.value,style:s.value,...u.value,...C.value}));function P(e){if(null!==f.value){if(void 0!==e){if(!0===e.defaultPrevented)return;let n=document.activeElement;if("submit"===t.type&&n!==document.body&&!1===f.value.contains(n)&&!1===n.contains(f.value)){!0!==e.qAvoidFocus&&f.value.focus();let t=()=>{document.removeEventListener("keydown",k,!0),document.removeEventListener("keyup",t,Ut),f.value?.removeEventListener("blur",t,Ut)};document.addEventListener("keydown",k,!0),document.addEventListener("keyup",t,Ut),f.value.addEventListener("blur",t,Ut)}}h(e)}}function E(e){null!==f.value&&(a("keydown",e),!0===N(e,[13,32])&&Wt!==f.value&&(null!==Wt&&R(),!0!==e.defaultPrevented&&(!0!==e.qAvoidFocus&&f.value.focus(),Wt=f.value,f.value.classList.add("q-btn--active"),document.addEventListener("keyup",M,!0),f.value.addEventListener("blur",M,Ut)),k(e)))}function A(e){null!==f.value&&(a("touchstart",e),!0!==e.defaultPrevented&&(Ht!==f.value&&(null!==Ht&&R(),Ht=f.value,_=e.target,_.addEventListener("touchcancel",M,Ut),_.addEventListener("touchend",M,Ut)),i=!0,null!==g&&clearTimeout(g),g=setTimeout(()=>{g=null,i=!1},200)))}function L(e){null!==f.value&&(e.qSkipRipple=!0===i,a("mousedown",e),!0!==e.defaultPrevented&&Gt!==f.value&&(null!==Gt&&R(),Gt=f.value,f.value.classList.add("q-btn--active"),document.addEventListener("mouseup",M,Ut)))}function M(e){if(null!==f.value&&("blur"!==e?.type||document.activeElement!==f.value)){if("keyup"===e?.type){if(Wt===f.value&&!0===N(e,[13,32])){let t=new MouseEvent("click",e);t.qKeyEvent=!0,!0===e.defaultPrevented&&w(t),!0===e.cancelBubble&&y(t),f.value.dispatchEvent(t),k(e),e.qKeyEvent=!0}a("keyup",e)}R()}}function R(e){let t=m.value;!0!==e&&(Ht===f.value||Gt===f.value)&&null!==t&&t!==document.activeElement&&(t.setAttribute("tabindex",-1),t.focus()),Ht===f.value&&(null!==_&&(_.removeEventListener("touchcancel",M,Ut),_.removeEventListener("touchend",M,Ut)),Ht=_=null),Gt===f.value&&(document.removeEventListener("mouseup",M,Ut),Gt=null),Wt===f.value&&(document.removeEventListener("keyup",M,!0),f.value?.removeEventListener("blur",M,Ut),Wt=null),f.value?.classList.remove("q-btn--active")}function z(e){k(e),e.qSkipRipple=!0}return(0,e.onBeforeUnmount)(()=>{R(!0)}),Object.assign(o,{click:e=>{!0===p.value&&P(e)}}),()=>{let a=[];void 0!==t.icon&&a.push((0,e.h)(Ye,{name:t.icon,left:!0!==t.stack&&!0===v.value,role:"img"})),!0===v.value&&a.push((0,e.h)("span",{class:"block"},[t.label])),a=Re(n.default,a),void 0!==t.iconRight&&!1===t.round&&a.push((0,e.h)(Ye,{name:t.iconRight,right:!0!==t.stack&&!0===v.value,role:"img"}));let i=[(0,e.h)("span",{class:"q-focus-helper",ref:m})];return!0===t.loading&&void 0!==t.percentage&&i.push((0,e.h)("span",{class:"q-btn__progress absolute-full overflow-hidden"+(!0===t.darkPercentage?" q-btn__progress--dark":"")},[(0,e.h)("span",{class:"q-btn__progress-indicator fit block",style:S.value})])),i.push((0,e.h)("span",{class:"q-btn__content text-center col items-center q-anchor--skip "+l.value},a)),null!==t.loading&&i.push((0,e.h)(e.Transition,{name:"q-transition--fade"},()=>!0===t.loading?[(0,e.h)("span",{key:"loading",class:"absolute-full flex flex-center"},void 0===n.loading?[(0,e.h)(St)]:n.loading())]:null)),(0,e.withDirectives)((0,e.h)(d.value,T.value,i),[[Ot,b.value,void 0,x.value]])}}}),Yt=h({name:"QBtnGroup",props:{unelevated:Boolean,outline:Boolean,flat:Boolean,rounded:Boolean,square:Boolean,push:Boolean,stretch:Boolean,glossy:Boolean,spread:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>{let e=["unelevated","outline","flat","rounded","square","push","stretch","glossy"].filter(e=>!0===t[e]).map(e=>`q-btn-group--${e}`).join(" ");return"q-btn-group row no-wrap"+(0===e.length?"":" "+e)+(!0===t.spread?" q-btn-group--spread":" inline")});return()=>(0,e.h)("div",{class:a.value},Le(n.default))}});function Qt(){if(void 0!==window.getSelection){let e=window.getSelection();void 0===e.empty?void 0!==e.removeAllRanges&&(e.removeAllRanges(),!0!==d.is.mobile&&e.addRange(document.createRange())):e.empty()}else void 0!==document.selection&&document.selection.empty()}let Zt={target:{type:[Boolean,String,Element],default:!0},noParentEvent:Boolean},Jt={...Zt,contextMenu:Boolean};function Xt({showing:t,avoidEmit:n,configureAnchorEl:a}){let{props:i,proxy:o,emit:r}=(0,e.getCurrentInstance)(),s=(0,e.ref)(null),l=null;function u(e){return null!==s.value&&(void 0===e||void 0===e.touches||e.touches.length<=1)}let c={};function d(){C(c,"anchor")}function h(){if(!1===i.target||""===i.target||null===o.$el.parentNode)s.value=null;else if(!0===i.target)!function(e){for(s.value=e;s.value.classList.contains("q-anchor--skip");)s.value=s.value.parentNode;a()}(o.$el.parentNode);else{let e=i.target;if("string"==typeof i.target)try{e=document.querySelector(i.target)}catch{e=void 0}null==e?(s.value=null,console.error(`Anchor: target "${i.target}" not found`)):(s.value=e.$el||e,a())}}return void 0===a&&(Object.assign(c,{hide(e){o.hide(e)},toggle(e){o.toggle(e),e.qAnchorHandled=!0},toggleKey(e){!0===N(e,13)&&c.toggle(e)},contextClick(t){o.hide(t),w(t),(0,e.nextTick)(()=>{o.show(t),t.qAnchorHandled=!0})},prevent:w,mobileTouch(e){if(c.mobileCleanup(e),!0!==u(e))return;o.hide(e),s.value.classList.add("non-selectable");let t=e.target;S(c,"anchor",[[t,"touchmove","mobileCleanup","passive"],[t,"touchend","mobileCleanup","passive"],[t,"touchcancel","mobileCleanup","passive"],[s.value,"contextmenu","prevent","notPassive"]]),l=setTimeout(()=>{l=null,o.show(e),e.qAnchorHandled=!0},300)},mobileCleanup(e){s.value.classList.remove("non-selectable"),null!==l&&(clearTimeout(l),l=null),!0===t.value&&void 0!==e&&Qt()}}),a=function(e=i.contextMenu){if(!0===i.noParentEvent||null===s.value)return;let t;t=!0===e?!0===o.$q.platform.is.mobile?[[s.value,"touchstart","mobileTouch","passive"]]:[[s.value,"mousedown","hide","passive"],[s.value,"contextmenu","contextClick","notPassive"]]:[[s.value,"click","toggle","passive"],[s.value,"keyup","toggleKey","passive"]],S(c,"anchor",t)}),(0,e.watch)(()=>i.contextMenu,e=>{null!==s.value&&(d(),a(e))}),(0,e.watch)(()=>i.target,()=>{null!==s.value&&d(),h()}),(0,e.watch)(()=>i.noParentEvent,e=>{null!==s.value&&(!0===e?d():a())}),(0,e.onMounted)(()=>{h(),!0!==n&&!0===i.modelValue&&null===s.value&&r("update:modelValue",!1)}),(0,e.onBeforeUnmount)(()=>{null!==l&&clearTimeout(l),d()}),{anchorEl:s,canShow:u,anchorEvents:c}}function en(t,n){let a,i=(0,e.ref)(null);function o(e,t){let n=(void 0===t?"remove":"add")+"EventListener",i=void 0===t?a:t;e!==window&&e[n]("scroll",i,m.passive),window[n]("scroll",i,m.passive),a=t}function r(){null!==i.value&&(o(i.value),i.value=null)}return(0,e.onBeforeUnmount)((0,e.watch)(()=>t.noParentEvent,()=>{null!==i.value&&(r(),n())})),{localScrollTarget:i,unconfigureScrollTarget:r,changeScrollEvent:o}}let tn={modelValue:{type:Boolean,default:null},"onUpdate:modelValue":[Function,Array]},nn=["beforeShow","show","beforeHide","hide"];function an({showing:t,canShow:n,hideOnRouteChange:a,handleShow:i,handleHide:o,processOnMount:r}){let s,l=(0,e.getCurrentInstance)(),{props:u,emit:c,proxy:d}=l;function h(t){if(!0===u.disable||!0===t?.qAnchorHandled||void 0!==n&&!0!==n(t))return;let a=void 0!==u["onUpdate:modelValue"];!0===a&&(c("update:modelValue",!0),s=t,(0,e.nextTick)(()=>{s===t&&(s=void 0)})),(null===u.modelValue||!1===a)&&p(t)}function p(e){!0!==t.value&&(t.value=!0,c("beforeShow",e),void 0===i?c("show",e):i(e))}function f(t){if(!0===u.disable)return;let n=void 0!==u["onUpdate:modelValue"];!0===n&&(c("update:modelValue",!1),s=t,(0,e.nextTick)(()=>{s===t&&(s=void 0)})),(null===u.modelValue||!1===n)&&m(t)}function m(e){!1!==t.value&&(t.value=!1,c("beforeHide",e),void 0===o?c("hide",e):o(e))}function _(e){!0===u.disable&&!0===e?void 0!==u["onUpdate:modelValue"]&&c("update:modelValue",!1):!0===e!==t.value&&(!0===e?p:m)(s)}(0,e.watch)(()=>u.modelValue,_),void 0!==a&&!0===ct(l)&&(0,e.watch)(()=>d.$route.fullPath,()=>{!0===a.value&&!0===t.value&&f()}),!0===r&&(0,e.onMounted)(()=>{_(u.modelValue)});let g={show:h,hide:f,toggle:function(e){!0===t.value?f(e):h(e)}};return Object.assign(d,g),g}let on=[],rn=[];function sn(e){rn=rn.filter(t=>t!==e)}function ln(e){sn(e),0===rn.length&&0!==on.length&&(on[on.length-1](),on=[])}function un(e){0===rn.length?e():on.push(e)}let cn=[],dn=[],hn=1,pn=document.body;function fn(e,t){let n=document.createElement("div");if(n.id=void 0===t?e:`q-portal--${t}--${hn++}`,void 0!==ne.globalNodes){let e=ne.globalNodes.class;void 0!==e&&(n.className=e)}return pn.appendChild(n),cn.push(n),dn.push(t),n}function mn(e){let t=cn.indexOf(e);cn.splice(t,1),dn.splice(t,1),e.remove()}let _n=[];function gn(e,t){do{if("QMenu"===e.$options.name){if(e.hide(t),!0===e.$props.separateClosePopup)return st(e)}else if(!0===e.__qPortal){let n=st(e);return"QPopupProxy"===n?.$options.name?(e.hide(t),n):e}e=st(e)}while(null!=e)}let vn=h({name:"QPortal",setup:(e,{slots:t})=>()=>t.default()});function bn(t,n,i,o){let r=(0,e.ref)(!1),s=(0,e.ref)(!1),l=null,u={},c="dialog"===o&&function(e){for(e=e.parent;null!=e;){if("QGlobalDialog"===e.type.name)return!0;if("QDialog"===e.type.name||"QMenu"===e.type.name)return!1;e=e.parent}return!1}(t);function d(e){if(s.value=!1,!0!==e)return;ln(u),r.value=!1;let n=_n.indexOf(t.proxy);-1!==n&&_n.splice(n,1),null!==l&&(mn(l),l=null)}return(0,e.onUnmounted)(()=>{d(!0)}),t.proxy.__qPortal=!0,a(t.proxy,"contentEl",()=>n.value),{showPortal:function(e){if(!0===e)return ln(u),void(s.value=!0);s.value=!1,!1===r.value&&(!1===c&&null===l&&(l=fn(!1,o)),r.value=!0,_n.push(t.proxy),function(e){sn(e),rn.push(e)}(u))},hidePortal:d,portalIsActive:r,portalIsAccessible:s,renderPortal:()=>!0===c?i():!0===r.value?[(0,e.h)(e.Teleport,{to:l},(0,e.h)(vn,i))]:void 0}}let yn={transitionShow:{type:String,default:"fade"},transitionHide:{type:String,default:"fade"},transitionDuration:{type:[String,Number],default:300}};function wn(t,n=()=>{},a=()=>{}){return{transitionProps:(0,e.computed)(()=>{let e=`q-transition--${t.transitionShow||n()}`,i=`q-transition--${t.transitionHide||a()}`;return{appear:!0,enterFromClass:`${e}-enter-from`,enterActiveClass:`${e}-enter-active`,enterToClass:`${e}-enter-to`,leaveFromClass:`${i}-leave-from`,leaveActiveClass:`${i}-leave-active`,leaveToClass:`${i}-leave-to`}}),transitionStyle:(0,e.computed)(()=>`--q-transition-duration: ${t.transitionDuration}ms`)}}function kn(){let t,n=(0,e.getCurrentInstance)();function a(){t=void 0}return(0,e.onDeactivated)(a),(0,e.onBeforeUnmount)(a),{removeTick:a,registerTick(a){t=a,(0,e.nextTick)(()=>{t===a&&(!1===dt(n)&&t(),t=void 0)})}}}function xn(){let t=null,n=(0,e.getCurrentInstance)();function a(){null!==t&&(clearTimeout(t),t=null)}return(0,e.onDeactivated)(a),(0,e.onBeforeUnmount)(a),{removeTimeout:a,registerTimeout(e,i){a(),!1===dt(n)&&(t=setTimeout(()=>{t=null,e()},i))}}}let Sn,Cn=[Element,String],Tn=[null,document,document.body,document.scrollingElement,document.documentElement];function Pn(e,t){let n=Et(t);if(void 0===n){if(null==e)return window;n=e.closest(".scroll,.scroll-y,.overflow-auto")}return Tn.includes(n)?window:n}function En(e){return(e===window?document.body:e).scrollHeight}function An(e){return e===window?window.pageYOffset||window.scrollY||document.body.scrollTop||0:e.scrollTop}function Ln(e){return e===window?window.pageXOffset||window.scrollX||document.body.scrollLeft||0:e.scrollLeft}function Mn(e,t,n=0){let a=void 0===arguments[3]?performance.now():arguments[3],i=An(e);n<=0?i!==t&&zn(e,t):requestAnimationFrame(o=>{let r=o-a,s=i+(t-i)/Math.max(r,n)*r;zn(e,s),s!==t&&Mn(e,t,n-r,o)})}function Rn(e,t,n=0){let a=void 0===arguments[3]?performance.now():arguments[3],i=Ln(e);n<=0?i!==t&&On(e,t):requestAnimationFrame(o=>{let r=o-a,s=i+(t-i)/Math.max(r,n)*r;On(e,s),s!==t&&Rn(e,t,n-r,o)})}function zn(e,t){e!==window?e.scrollTop=t:window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,t)}function On(e,t){e!==window?e.scrollLeft=t:window.scrollTo(t,window.pageYOffset||window.scrollY||document.body.scrollTop||0)}function In(e,t,n){n?Mn(e,t,n):zn(e,t)}function Nn(e,t,n){n?Rn(e,t,n):On(e,t)}function Dn(){if(void 0!==Sn)return Sn;let e=document.createElement("p"),t=document.createElement("div");Pt(e,{width:"100%",height:"200px"}),Pt(t,{position:"absolute",top:"0px",left:"0px",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),t.appendChild(e),document.body.appendChild(t);let n=e.offsetWidth;t.style.overflow="scroll";let a=e.offsetWidth;return n===a&&(a=t.clientWidth),t.remove(),Sn=n-a,Sn}function qn(e,t=!0){return!(!e||e.nodeType!==Node.ELEMENT_NODE)&&(t?e.scrollHeight>e.clientHeight&&(e.classList.contains("scroll")||e.classList.contains("overflow-auto")||["auto","scroll"].includes(window.getComputedStyle(e)["overflow-y"])):e.scrollWidth>e.clientWidth&&(e.classList.contains("scroll")||e.classList.contains("overflow-auto")||["auto","scroll"].includes(window.getComputedStyle(e)["overflow-x"])))}var jn={getScrollTarget:Pn,getScrollHeight:En,getScrollWidth:function(e){return(e===window?document.body:e).scrollWidth},getVerticalScrollPosition:An,getHorizontalScrollPosition:Ln,animVerticalScrollTo:Mn,animHorizontalScrollTo:Rn,setVerticalScrollPosition:In,setHorizontalScrollPosition:Nn,getScrollbarWidth:Dn,hasScrollbar:qn};let Bn,Fn=[];function $n(e){Bn=27===e.keyCode}function Vn(){!0===Bn&&(Bn=!1)}function Un(e){!0===Bn&&(Bn=!1,!0===N(e,27)&&Fn[Fn.length-1](e))}function Hn(e){window[e]("keydown",$n),window[e]("blur",Vn),window[e]("keyup",Un),Bn=!1}function Wn(e){!0===c.is.desktop&&(Fn.push(e),1===Fn.length&&Hn("addEventListener"))}function Gn(e){let t=Fn.indexOf(e);-1!==t&&(Fn.splice(t,1),0===Fn.length&&Hn("removeEventListener"))}let Kn=[];function Yn(e){Kn[Kn.length-1](e)}function Qn(e){!0===c.is.desktop&&(Kn.push(e),1===Kn.length&&document.body.addEventListener("focusin",Yn))}function Zn(e){let t=Kn.indexOf(e);-1!==t&&(Kn.splice(t,1),0===Kn.length&&document.body.removeEventListener("focusin",Yn))}let Jn,Xn,ea=null,{notPassiveCapture:ta}=m,na=[];function aa(e){null!==ea&&(clearTimeout(ea),ea=null);let t=e.target;if(void 0===t||8===t.nodeType||!0===t.classList.contains("no-pointer-events"))return;let n=_n.length-1;for(;n>=0;){let e=_n[n].$;if("QTooltip"!==e.type.name){if("QDialog"!==e.type.name)break;if(!0!==e.props.seamless)return;n--}else n--}for(let n=na.length-1;n>=0;n--){let a=na[n];if(null!==a.anchorEl.value&&!1!==a.anchorEl.value.contains(t)||t!==document.body&&(null===a.innerRef.value||!1!==a.innerRef.value.contains(t)))return;e.qClickOutside=!0,a.onClickOutside(e)}}function ia(e){na.push(e),1===na.length&&(document.addEventListener("mousedown",aa,ta),document.addEventListener("touchstart",aa,ta))}function oa(e){let t=na.findIndex(t=>t===e);-1!==t&&(na.splice(t,1),0===na.length&&(null!==ea&&(clearTimeout(ea),ea=null),document.removeEventListener("mousedown",aa,ta),document.removeEventListener("touchstart",aa,ta)))}function ra(e){let t=e.split(" ");return 2===t.length&&(!0===["top","center","bottom"].includes(t[0])?!0===["left","middle","right","start","end"].includes(t[1])||(console.error("Anchor/Self position must end with one of left/middle/right/start/end"),!1):(console.error("Anchor/Self position must start with one of top/center/bottom"),!1))}function sa(e){return!e||!(2!==e.length||"number"!=typeof e[0]||"number"!=typeof e[1])}let la={"start#ltr":"left","start#rtl":"right","end#ltr":"right","end#rtl":"left"};function ua(e,t){let n=e.split(" ");return{vertical:n[0],horizontal:la[`${n[1]}#${!0===t?"rtl":"ltr"}`]}}function ca(e,t,n,a){return{top:e[n.vertical]-t[a.vertical],left:e[n.horizontal]-t[a.horizontal]}}function da(e,t=0){if(null===e.targetEl||null===e.anchorEl||t>5)return;if(0===e.targetEl.offsetHeight||0===e.targetEl.offsetWidth)return void setTimeout(()=>{da(e,t+1)},10);let{targetEl:n,offset:a,anchorEl:i,anchorOrigin:o,selfOrigin:r,absoluteOffset:s,fit:l,cover:u,maxHeight:d,maxWidth:h}=e;if(!0===c.is.ios&&void 0!==window.visualViewport){let e=document.body.style,{offsetLeft:t,offsetTop:n}=window.visualViewport;t!==Jn&&(e.setProperty("--q-pe-left",t+"px"),Jn=t),n!==Xn&&(e.setProperty("--q-pe-top",n+"px"),Xn=n)}let{scrollLeft:p,scrollTop:f}=n,m=void 0===s?function(e,t){let{top:n,left:a,right:i,bottom:o,width:r,height:s}=e.getBoundingClientRect();return void 0!==t&&(n-=t[1],a-=t[0],o+=t[1],i+=t[0],r+=t[0],s+=t[1]),{top:n,bottom:o,height:s,left:a,right:i,width:r,middle:a+(i-a)/2,center:n+(o-n)/2}}(i,!0===u?[0,0]:a):function(e,t,n){let{top:a,left:i}=e.getBoundingClientRect();return a+=t.top,i+=t.left,void 0!==n&&(a+=n[1],i+=n[0]),{top:a,bottom:a+1,height:1,left:i,right:i+1,width:1,middle:i,center:a}}(i,s,a);Object.assign(n.style,{top:0,left:0,minWidth:null,minHeight:null,maxWidth:h,maxHeight:d,visibility:"visible"});let{offsetWidth:_,offsetHeight:g}=n,{elWidth:v,elHeight:b}=!0===l||!0===u?{elWidth:Math.max(m.width,_),elHeight:!0===u?Math.max(m.height,g):g}:{elWidth:_,elHeight:g},y={maxWidth:h,maxHeight:d};(!0===l||!0===u)&&(y.minWidth=m.width+"px",!0===u&&(y.minHeight=m.height+"px")),Object.assign(n.style,y);let w=function(e,t){return{top:0,center:t/2,bottom:t,left:0,middle:e/2,right:e}}(v,b),k=ca(m,w,o,r);if(void 0===s||void 0===a)ha(k,m,w,o,r);else{let{top:e,left:t}=k;ha(k,m,w,o,r);let n=!1;if(k.top!==e){n=!0;let e=2*a[1];m.center=m.top-=e,m.bottom-=e+2}if(k.left!==t){n=!0;let e=2*a[0];m.middle=m.left-=e,m.right-=e+2}!0===n&&(k=ca(m,w,o,r),ha(k,m,w,o,r))}y={top:k.top+"px",left:k.left+"px"},void 0!==k.maxHeight&&(y.maxHeight=k.maxHeight+"px",m.height>k.maxHeight&&(y.minHeight=y.maxHeight)),void 0!==k.maxWidth&&(y.maxWidth=k.maxWidth+"px",m.width>k.maxWidth&&(y.minWidth=y.maxWidth)),Object.assign(n.style,y),n.scrollTop!==f&&(n.scrollTop=f),n.scrollLeft!==p&&(n.scrollLeft=p)}function ha(e,t,n,a,i){let o=n.bottom,r=n.right,s=Dn(),l=window.innerHeight-s,u=document.body.clientWidth;if(e.top<0||e.top+o>l)if("center"===i.vertical)e.top=t[a.vertical]>l/2?Math.max(0,l-o):0,e.maxHeight=Math.min(o,l);else if(t[a.vertical]>l/2){let n=Math.min(l,"center"===a.vertical?t.center:a.vertical===i.vertical?t.bottom:t.top);e.maxHeight=Math.min(o,n),e.top=Math.max(0,n-o)}else e.top=Math.max(0,"center"===a.vertical?t.center:a.vertical===i.vertical?t.top:t.bottom),e.maxHeight=Math.min(o,l-e.top);if(e.left<0||e.left+r>u)if(e.maxWidth=Math.min(r,u),"middle"===i.horizontal)e.left=t[a.horizontal]>u/2?Math.max(0,u-r):0;else if(t[a.horizontal]>u/2){let n=Math.min(u,"middle"===a.horizontal?t.middle:a.horizontal===i.horizontal?t.right:t.left);e.maxWidth=Math.min(r,n),e.left=Math.max(0,n-e.maxWidth)}else e.left=Math.max(0,"middle"===a.horizontal?t.middle:a.horizontal===i.horizontal?t.left:t.right),e.maxWidth=Math.min(r,u-e.left)}["left","middle","right"].forEach(e=>{la[`${e}#ltr`]=e,la[`${e}#rtl`]=e});var pa=h({name:"QMenu",inheritAttrs:!1,props:{...Jt,...tn,...Xe,...yn,persistent:Boolean,autoClose:Boolean,separateClosePopup:Boolean,noEscDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,fit:Boolean,cover:Boolean,square:Boolean,anchor:{type:String,validator:ra},self:{type:String,validator:ra},offset:{type:Array,validator:sa},scrollTarget:Cn,touchPosition:Boolean,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null}},emits:[...nn,"click","escapeKey"],setup(t,{slots:n,emit:a,attrs:i}){let o,r,s,l=null,u=(0,e.getCurrentInstance)(),{proxy:c}=u,{$q:d}=c,h=(0,e.ref)(null),p=(0,e.ref)(!1),f=(0,e.computed)(()=>!0!==t.persistent&&!0!==t.noRouteDismiss),m=et(t,d),{registerTick:_,removeTick:g}=kn(),{registerTimeout:b}=xn(),{transitionProps:y,transitionStyle:w}=wn(t),{localScrollTarget:x,changeScrollEvent:S,unconfigureScrollTarget:C}=en(t,B),{anchorEl:T,canShow:P}=Xt({showing:p}),{hide:E}=an({showing:p,canShow:P,handleShow:function(n){if(l=!1===t.noRefocus?document.activeElement:null,Qn($),A(),B(),o=void 0,void 0!==n&&(t.touchPosition||t.contextMenu)){let e=v(n);if(void 0!==e.left){let{top:t,left:n}=T.value.getBoundingClientRect();o={left:e.left-n,top:e.top-t}}}void 0===r&&(r=(0,e.watch)(()=>d.screen.width+"|"+d.screen.height+"|"+t.self+"|"+t.anchor+"|"+d.lang.rtl,U)),!0!==t.noFocus&&document.activeElement.blur(),_(()=>{U(),!0!==t.noFocus&&q()}),b(()=>{!0===d.platform.is.ios&&(s=t.autoClose,h.value.click()),U(),A(!0),a("show",n)},t.transitionDuration)},handleHide:function(e){g(),L(),j(!0),null!==l&&(void 0===e||!0!==e.qClickOutside)&&(((0===e?.type.indexOf("key")?l.closest('[tabindex]:not([tabindex^="-"])'):void 0)||l).focus(),l=null),b(()=>{L(!0),a("hide",e)},t.transitionDuration)},hideOnRouteChange:f,processOnMount:!0}),{showPortal:A,hidePortal:L,renderPortal:M}=bn(u,h,function(){return(0,e.h)(e.Transition,y.value,()=>!0===p.value?(0,e.h)("div",{role:"menu",...i,ref:h,tabindex:-1,class:["q-menu q-position-engine scroll"+I.value,i.class],style:[i.style,w.value],...N.value},Le(n.default)):null)},"menu"),R={anchorEl:T,innerRef:h,onClickOutside(e){if(!0!==t.persistent&&!0===p.value)return E(e),("touchstart"===e.type||e.target.classList.contains("q-dialog__backdrop"))&&k(e),!0}},z=(0,e.computed)(()=>ua(t.anchor||(!0===t.cover?"center middle":"bottom start"),d.lang.rtl)),O=(0,e.computed)(()=>!0===t.cover?z.value:ua(t.self||"top start",d.lang.rtl)),I=(0,e.computed)(()=>(!0===t.square?" q-menu--square":"")+(!0===m.value?" q-menu--dark q-dark":"")),N=(0,e.computed)(()=>!0===t.autoClose?{onClick:F}:{}),D=(0,e.computed)(()=>!0===p.value&&!0!==t.persistent);function q(){un(()=>{let e=h.value;e&&!0!==e.contains(document.activeElement)&&(e=e.querySelector("[autofocus][tabindex], [data-autofocus][tabindex]")||e.querySelector("[autofocus] [tabindex], [data-autofocus] [tabindex]")||e.querySelector("[autofocus], [data-autofocus]")||e,e.focus({preventScroll:!0}))})}function j(e){o=void 0,void 0!==r&&(r(),r=void 0),(!0===e||!0===p.value)&&(Zn($),C(),oa(R),Gn(V)),!0!==e&&(l=null)}function B(){(null!==T.value||void 0!==t.scrollTarget)&&(x.value=Pn(T.value,t.scrollTarget),S(x.value,U))}function F(e){!0===s?s=!1:(gn(c,e),a("click",e))}function $(e){!0===D.value&&!0!==t.noFocus&&!0!==At(h.value,e.target)&&q()}function V(e){!0!==t.noEscDismiss&&(a("escapeKey"),E(e))}function U(){da({targetEl:h.value,offset:t.offset,anchorEl:T.value,anchorOrigin:z.value,selfOrigin:O.value,absoluteOffset:o,fit:t.fit,cover:t.cover,maxHeight:t.maxHeight,maxWidth:t.maxWidth})}return(0,e.watch)(D,e=>{!0===e?(Wn(V),ia(R)):(Gn(V),oa(R))}),(0,e.onBeforeUnmount)(j),Object.assign(c,{focus:q,updatePosition:U}),M}});let fa,ma=0,_a=Array(256);for(let e=0;e<256;e++)_a[e]=(e+256).toString(16).substring(1);let ga=(()=>{let e=typeof crypto<"u"?crypto:typeof window<"u"?window.crypto||window.msCrypto:void 0;if(void 0!==e){if(void 0!==e.randomBytes)return e.randomBytes;if(void 0!==e.getRandomValues)return t=>{let n=new Uint8Array(t);return e.getRandomValues(n),n}}return e=>{let t=[];for(let n=e;n>0;n--)t.push(Math.floor(256*Math.random()));return t}})();function va(){(void 0===fa||ma+16>4096)&&(ma=0,fa=ga(4096));let e=Array.prototype.slice.call(fa,ma,ma+=16);return e[6]=15&e[6]|64,e[8]=63&e[8]|128,_a[e[0]]+_a[e[1]]+_a[e[2]]+_a[e[3]]+"-"+_a[e[4]]+_a[e[5]]+"-"+_a[e[6]]+_a[e[7]]+"-"+_a[e[8]]+_a[e[9]]+"-"+_a[e[10]]+_a[e[11]]+_a[e[12]]+_a[e[13]]+_a[e[14]]+_a[e[15]]}function ba(e,t){return e??(!0===t?`f_${va()}`:null)}function ya({getValue:t,required:n=!0}={}){if(!0===r.value){let a=void 0===t?(0,e.ref)(null):(0,e.ref)(function(e){return e??null}(t()));return!0===n&&null===a.value&&(0,e.onMounted)(()=>{a.value=`f_${va()}`}),void 0!==t&&(0,e.watch)(t,e=>{a.value=ba(e,n)}),a}return void 0===t?(0,e.ref)(`f_${va()}`):(0,e.computed)(()=>ba(t(),n))}let wa=Object.keys($t);var ka=h({name:"QBtnDropdown",props:{...$t,...yn,modelValue:Boolean,split:Boolean,dropdownIcon:String,contentClass:[Array,String,Object],contentStyle:[Array,String,Object],cover:Boolean,persistent:Boolean,noEscDismiss:Boolean,noRouteDismiss:Boolean,autoClose:Boolean,noRefocus:Boolean,noFocus:Boolean,menuAnchor:{type:String,default:"bottom end"},menuSelf:{type:String,default:"top end"},menuOffset:Array,disableMainBtn:Boolean,disableDropdown:Boolean,noIconAnimation:Boolean,toggleAriaLabel:String},emits:["update:modelValue","click","beforeShow","show","beforeHide","hide"],setup(t,{slots:n,emit:a}){let{proxy:i}=(0,e.getCurrentInstance)(),o=(0,e.ref)(t.modelValue),r=(0,e.ref)(null),s=ya(),l=(0,e.computed)(()=>{let e={"aria-expanded":!0===o.value?"true":"false","aria-haspopup":"true","aria-controls":s.value,"aria-label":t.toggleAriaLabel||i.$q.lang.label[!0===o.value?"collapse":"expand"](t.label)};return(!0===t.disable||!1===t.split&&!0===t.disableMainBtn||!0===t.disableDropdown)&&(e["aria-disabled"]="true"),e}),u=(0,e.computed)(()=>"q-btn-dropdown__arrow"+(!0===o.value&&!1===t.noIconAnimation?" rotate-180":"")+(!1===t.split?" q-btn-dropdown__arrow-container":"")),c=(0,e.computed)(()=>Ft(t)),d=(0,e.computed)(()=>function(e){return wa.reduce((t,n)=>{let a=e[n];return void 0!==a&&(t[n]=a),t},{})}(t));function h(e){o.value=!0,a("beforeShow",e)}function p(e){a("show",e),a("update:modelValue",!0)}function f(e){o.value=!1,a("beforeHide",e)}function m(e){a("hide",e),a("update:modelValue",!1)}function _(e){a("click",e)}function g(e){y(e),b(),a("click",e)}function v(e){r.value?.show(e)}function b(e){r.value?.hide(e)}return(0,e.watch)(()=>t.modelValue,e=>{r.value?.[e?"show":"hide"]()}),(0,e.watch)(()=>t.split,b),Object.assign(i,{show:v,hide:b,toggle:function(e){r.value?.toggle(e)}}),(0,e.onMounted)(()=>{!0===t.modelValue&&v()}),()=>{let a=[(0,e.h)(Ye,{class:u.value,name:t.dropdownIcon||i.$q.iconSet.arrow.dropdown})];return!0!==t.disableDropdown&&a.push((0,e.h)(pa,{ref:r,id:s.value,class:t.contentClass,style:t.contentStyle,cover:t.cover,fit:!0,persistent:t.persistent,noEscDismiss:t.noEscDismiss,noRouteDismiss:t.noRouteDismiss,autoClose:t.autoClose,noFocus:t.noFocus,noRefocus:t.noRefocus,anchor:t.menuAnchor,self:t.menuSelf,offset:t.menuOffset,separateClosePopup:!0,transitionShow:t.transitionShow,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,onBeforeShow:h,onShow:p,onBeforeHide:f,onHide:m},n.default)),!1===t.split?(0,e.h)(Kt,{class:"q-btn-dropdown q-btn-dropdown--simple",...d.value,...l.value,disable:!0===t.disable||!0===t.disableMainBtn,noWrap:!0,round:!1,onClick:_},{default:()=>Le(n.label,[]).concat(a),loading:n.loading}):(0,e.h)(Yt,{class:"q-btn-dropdown q-btn-dropdown--split no-wrap q-btn-item",rounded:t.rounded,square:t.square,...c.value,glossy:t.glossy,stretch:t.stretch},()=>[(0,e.h)(Kt,{class:"q-btn-dropdown--current",...d.value,disable:!0===t.disable||!0===t.disableMainBtn,noWrap:!0,round:!1,onClick:g},{default:n.label,loading:n.loading}),(0,e.h)(Kt,{class:"q-btn-dropdown__arrow-container q-anchor--skip",...l.value,...c.value,disable:!0===t.disable||!0===t.disableDropdown,rounded:t.rounded,color:t.color,textColor:t.textColor,dense:t.dense,size:t.size,padding:t.padding,ripple:t.ripple},()=>a)])}}});let xa={name:String};function Sa(t){return(0,e.computed)(()=>({type:"hidden",name:t.name,value:t.modelValue}))}function Ca(t={}){return(n,a,i)=>{n[a]((0,e.h)("input",{class:"hidden"+(i||""),...t.value}))}}function Ta(t){return(0,e.computed)(()=>t.name||t.for)}var Pa=h({name:"QBtnToggle",props:{...xa,modelValue:{required:!0},options:{type:Array,required:!0,validator:e=>e.every(e=>("label"in e||"icon"in e||"slot"in e)&&"value"in e)},color:String,textColor:String,toggleColor:{type:String,default:"primary"},toggleTextColor:String,outline:Boolean,flat:Boolean,unelevated:Boolean,rounded:Boolean,push:Boolean,glossy:Boolean,size:String,padding:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,readonly:Boolean,disable:Boolean,stack:Boolean,stretch:Boolean,spread:Boolean,clearable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:["update:modelValue","clear","click"],setup(t,{slots:n,emit:a}){let i=(0,e.computed)(()=>void 0!==t.options.find(e=>e.value===t.modelValue)),o=Ca((0,e.computed)(()=>({type:"hidden",name:t.name,value:t.modelValue}))),r=(0,e.computed)(()=>Ft(t)),s=(0,e.computed)(()=>({rounded:t.rounded,dense:t.dense,...r.value})),l=(0,e.computed)(()=>t.options.map((e,n)=>{let{attrs:a,value:i,slot:o,...r}=e;return{slot:o,props:{key:n,"aria-pressed":i===t.modelValue?"true":"false",...a,...r,...s.value,disable:!0===t.disable||!0===r.disable,color:i===t.modelValue?c(r,"toggleColor"):c(r,"color"),textColor:i===t.modelValue?c(r,"toggleTextColor"):c(r,"textColor"),noCaps:!0===c(r,"noCaps"),noWrap:!0===c(r,"noWrap"),size:c(r,"size"),padding:c(r,"padding"),ripple:c(r,"ripple"),stack:!0===c(r,"stack"),stretch:!0===c(r,"stretch"),onClick(t){u(i,e,t)}}}}));function u(e,n,i){!0!==t.readonly&&(t.modelValue===e?!0===t.clearable&&(a("update:modelValue",null,null),a("clear")):a("update:modelValue",e,n),a("click",i))}function c(e,n){return void 0===e[n]?t[n]:e[n]}function d(){let a=l.value.map(t=>(0,e.h)(Kt,t.props,void 0===t.slot?void 0:n[t.slot]));return void 0!==t.name&&!0!==t.disable&&!0===i.value&&o(a,"push"),Re(n.default,a)}return()=>(0,e.h)(Yt,{class:"q-btn-toggle",...r.value,rounded:t.rounded,stretch:t.stretch,glossy:t.glossy,spread:t.spread},d)}}),Ea=h({name:"QCard",props:{...Xe,tag:{type:String,default:"div"},square:Boolean,flat:Boolean,bordered:Boolean},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=et(t,a),o=(0,e.computed)(()=>"q-card"+(!0===i.value?" q-card--dark q-dark":"")+(!0===t.bordered?" q-card--bordered":"")+(!0===t.square?" q-card--square no-border-radius":"")+(!0===t.flat?" q-card--flat no-shadow":""));return()=>(0,e.h)(t.tag,{class:o.value},Le(n.default))}}),Aa=h({name:"QCardSection",props:{tag:{type:String,default:"div"},horizontal:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>"q-card__section q-card__section--"+(!0===t.horizontal?"horiz row no-wrap":"vert"));return()=>(0,e.h)(t.tag,{class:a.value},Le(n.default))}}),La=h({name:"QCardActions",props:{...ot,vertical:Boolean},setup(t,{slots:n}){let a=rt(t),i=(0,e.computed)(()=>`q-card__actions ${a.value} q-card__actions--${!0===t.vertical?"vert column":"horiz row"}`);return()=>(0,e.h)("div",{class:i.value},Le(n.default))}});let Ma={left:!0,right:!0,up:!0,down:!0,horizontal:!0,vertical:!0},Ra=Object.keys(Ma);function za(e){let t={};for(let n of Ra)!0===e[n]&&(t[n]=!0);return 0===Object.keys(t).length?Ma:(!0===t.horizontal?t.left=t.right=!0:!0===t.left&&!0===t.right&&(t.horizontal=!0),!0===t.vertical?t.up=t.down=!0:!0===t.up&&!0===t.down&&(t.vertical=!0),!0===t.horizontal&&!0===t.vertical&&(t.all=!0),t)}Ma.all=!0;let Oa=["INPUT","TEXTAREA"];function Ia(e,t){return void 0===t.event&&void 0!==e.target&&!0!==e.target.draggable&&"function"==typeof t.handler&&!1===Oa.includes(e.target.nodeName.toUpperCase())&&(void 0===e.qClonedBy||-1===e.qClonedBy.indexOf(t.uid))}function Na(e){let t=[.06,6,50];return"string"==typeof e&&e.length&&e.split(":").forEach((e,n)=>{let a=parseFloat(e);a&&(t[n]=a)}),t}var Da=p({name:"touch-swipe",beforeMount(e,{value:t,arg:n,modifiers:a}){if(!0!==a.mouse&&!0!==c.has.touch)return;let i=!0===a.mouseCapture?"Capture":"",o={handler:t,sensitivity:Na(n),direction:za(a),noop:_,mouseStart(e){Ia(e,o)&&g(e)&&(S(o,"temp",[[document,"mousemove","move",`notPassive${i}`],[document,"mouseup","end","notPassiveCapture"]]),o.start(e,!0))},touchStart(e){if(Ia(e,o)){let t=e.target;S(o,"temp",[[t,"touchmove","move","notPassiveCapture"],[t,"touchcancel","end","notPassiveCapture"],[t,"touchend","end","notPassiveCapture"]]),o.start(e)}},start(t,n){!0===c.is.firefox&&x(e,!0);let a=v(t);o.event={x:a.left,y:a.top,time:Date.now(),mouse:!0===n,dir:!1}},move(e){if(void 0===o.event)return;if(!1!==o.event.dir)return void k(e);let t=Date.now()-o.event.time;if(0===t)return;let n=v(e),a=n.left-o.event.x,i=Math.abs(a),r=n.top-o.event.y,s=Math.abs(r);if(!0!==o.event.mouse){if(io.sensitivity[0]&&(o.event.dir=r<0?"up":"down"),!0===o.direction.horizontal&&i>s&&s<100&&l>o.sensitivity[0]&&(o.event.dir=a<0?"left":"right"),!0===o.direction.up&&io.sensitivity[0]&&(o.event.dir="up"),!0===o.direction.down&&i0&&i<100&&u>o.sensitivity[0]&&(o.event.dir="down"),!0===o.direction.left&&i>s&&a<0&&s<100&&l>o.sensitivity[0]&&(o.event.dir="left"),!0===o.direction.right&&i>s&&a>0&&s<100&&l>o.sensitivity[0]&&(o.event.dir="right"),!1===o.event.dir?o.end(e):(k(e),!0===o.event.mouse&&(document.body.classList.add("no-pointer-events--children"),document.body.classList.add("non-selectable"),Qt(),o.styleCleanup=e=>{o.styleCleanup=void 0,document.body.classList.remove("non-selectable");let t=()=>{document.body.classList.remove("no-pointer-events--children")};!0===e?setTimeout(t,50):t()}),o.handler({evt:e,touch:!0!==o.event.mouse,mouse:o.event.mouse,direction:o.event.dir,duration:t,distance:{x:i,y:s}}))},end(t){void 0!==o.event&&(C(o,"temp"),!0===c.is.firefox&&x(e,!1),o.styleCleanup?.(!0),void 0!==t&&!1!==o.event.dir&&k(t),o.event=void 0)}};e.__qtouchswipe=o,!0===a.mouse&&S(o,"main",[[e,"mousedown","mouseStart","passive"+(!0===a.mouseCapture||!0===a.mousecapture?"Capture":"")]]),!0===c.has.touch&&S(o,"main",[[e,"touchstart","touchStart","passive"+(!0===a.capture?"Capture":"")],[e,"touchmove","noop","notPassiveCapture"]])},updated(e,t){let n=e.__qtouchswipe;void 0!==n&&(t.oldValue!==t.value&&("function"!=typeof t.value&&n.end(),n.handler=t.value),n.direction=za(t.modifiers))},beforeUnmount(e){let t=e.__qtouchswipe;void 0!==t&&(C(t,"main"),C(t,"temp"),!0===c.is.firefox&&x(e,!1),t.styleCleanup?.(),delete e.__qtouchswipe)}});function qa(){let e=Object.create(null);return{getCache:(t,n)=>void 0===e[t]?e[t]="function"==typeof n?n():n:e[t],setCache(t,n){e[t]=n},hasCache:t=>Object.hasOwnProperty.call(e,t),clearCache(t){void 0===t?e=Object.create(null):delete e[t]}}}let ja={name:{required:!0},disable:Boolean},Ba={setup:(t,{slots:n})=>()=>(0,e.h)("div",{class:"q-panel scroll",role:"tabpanel"},Le(n.default))},Fa={modelValue:{required:!0},animated:Boolean,infinite:Boolean,swipeable:Boolean,vertical:Boolean,transitionPrev:String,transitionNext:String,transitionDuration:{type:[String,Number],default:300},keepAlive:Boolean,keepAliveInclude:[String,Array,RegExp],keepAliveExclude:[String,Array,RegExp],keepAliveMax:Number},$a=["update:modelValue","beforeTransition","transition"];function Va(){let t,n,{props:a,emit:i,proxy:o}=(0,e.getCurrentInstance)(),{getCache:r}=qa(),{registerTimeout:s}=xn(),l=(0,e.ref)(null),u={value:null};function c(e){let t=!0===a.vertical?"up":"left";S((!0===o.$q.lang.rtl?-1:1)*(e.direction===t?1:-1))}let d=(0,e.computed)(()=>[[Da,c,void 0,{horizontal:!0!==a.vertical,vertical:a.vertical,mouse:!0}]]),h=(0,e.computed)(()=>a.transitionPrev||"slide-"+(!0===a.vertical?"down":"right")),p=(0,e.computed)(()=>a.transitionNext||"slide-"+(!0===a.vertical?"up":"left")),f=(0,e.computed)(()=>`--q-transition-duration: ${a.transitionDuration}ms`),m=(0,e.computed)(()=>"string"==typeof a.modelValue||"number"==typeof a.modelValue?a.modelValue:String(a.modelValue)),_=(0,e.computed)(()=>({include:a.keepAliveInclude,exclude:a.keepAliveExclude,max:a.keepAliveMax})),g=(0,e.computed)(()=>void 0!==a.keepAliveInclude||void 0!==a.keepAliveExclude);function v(){S(1)}function b(){S(-1)}function y(e){i("update:modelValue",e)}function w(e){return null!=e&&""!==e}function k(e){return t.findIndex(t=>t.props.name===e&&""!==t.props.disable&&!0!==t.props.disable)}function x(e){let t=0!==e&&!0===a.animated&&-1!==u.value?"q-transition--"+(-1===e?h.value:p.value):null;l.value!==t&&(l.value=t)}function S(e,o=u.value){let r=o+e;for(;-1!==r&&r{n=!1});r+=e}!0===a.infinite&&0!==t.length&&-1!==o&&o!==t.length&&S(e,-1===e?t.length:-1)}function C(){let e=k(a.modelValue);return u.value!==e&&(u.value=e),!0}function T(){let n=!0===w(a.modelValue)&&C()&&t[u.value];return!0===a.keepAlive?[(0,e.h)(e.KeepAlive,_.value,[(0,e.h)(!0===g.value?r(m.value,()=>({...Ba,name:m.value})):Ba,{key:m.value,style:f.value},()=>n)])]:[(0,e.h)("div",{class:"q-panel scroll",style:f.value,key:m.value,role:"tabpanel"},[n])]}return(0,e.watch)(()=>a.modelValue,(e,t)=>{let o=!0===w(e)?k(e):-1;!0!==n&&x(-1===o?0:o{i("transition",e,t)},a.transitionDuration))}),Object.assign(o,{next:v,previous:b,goTo:y}),{panelIndex:u,panelDirectives:d,updatePanelsList:function(e){return t=ut(Le(e.default,[])).filter(e=>null!==e.props&&void 0===e.props.slot&&!0===w(e.props.name)),t.length},updatePanelIndex:C,getPanelContent:function(){if(0!==t.length)return!0===a.animated?[(0,e.h)(e.Transition,{name:l.value},T)]:T()},getEnabledPanels:function(){return t.filter(e=>""!==e.props.disable&&!0!==e.props.disable)},getPanels:function(){return t},isValidPanelName:w,keepAliveProps:_,needsUniqueKeepAliveWrapper:g,goToPanelByOffset:S,goToPanel:y,nextPanel:v,previousPanel:b}}let Ua=0,Ha={fullscreen:Boolean,noRouteFullscreenExit:Boolean},Wa=["update:fullscreen","fullscreen"];function Ga(){let t,n,a,i=(0,e.getCurrentInstance)(),{props:o,emit:r,proxy:s}=i,l=(0,e.ref)(!1);function u(){!0===l.value?d():c()}function c(){!0!==l.value&&(l.value=!0,a=s.$el.parentNode,a.replaceChild(n,s.$el),document.body.appendChild(s.$el),Ua++,1===Ua&&document.body.classList.add("q-body--fullscreen-mixin"),t={handler:d},$.add(t))}function d(){!0===l.value&&(void 0!==t&&($.remove(t),t=void 0),a.replaceChild(s.$el,n),l.value=!1,Ua=Math.max(0,Ua-1),0===Ua&&(document.body.classList.remove("q-body--fullscreen-mixin"),void 0!==s.$el.scrollIntoView&&setTimeout(()=>{s.$el.scrollIntoView()})))}return!0===ct(i)&&(0,e.watch)(()=>s.$route.fullPath,()=>{!0!==o.noRouteFullscreenExit&&d()}),(0,e.watch)(()=>o.fullscreen,e=>{l.value!==e&&u()}),(0,e.watch)(l,e=>{r("update:fullscreen",e),r("fullscreen",e)}),(0,e.onBeforeMount)(()=>{n=document.createElement("span")}),(0,e.onMounted)(()=>{!0===o.fullscreen&&c()}),(0,e.onBeforeUnmount)(d),Object.assign(s,{toggleFullscreen:u,setFullscreen:c,exitFullscreen:d}),{inFullscreen:l,toggleFullscreen:u}}let Ka=["top","right","bottom","left"],Ya=["regular","flat","outline","push","unelevated"];var Qa=h({name:"QCarousel",props:{...Xe,...Fa,...Ha,transitionPrev:{type:String,default:"fade"},transitionNext:{type:String,default:"fade"},height:String,padding:Boolean,controlColor:String,controlTextColor:String,controlType:{type:String,validator:e=>Ya.includes(e),default:"flat"},autoplay:[Number,Boolean],arrows:Boolean,prevIcon:String,nextIcon:String,navigation:Boolean,navigationPosition:{type:String,validator:e=>Ka.includes(e)},navigationIcon:String,navigationActiveIcon:String,thumbnails:Boolean},emits:[...Wa,...$a],setup(t,{slots:n}){let a,{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=et(t,i),r=null,{updatePanelsList:s,getPanelContent:l,panelDirectives:u,goToPanel:c,previousPanel:d,nextPanel:h,getEnabledPanels:p,panelIndex:f}=Va(),{inFullscreen:m}=Ga(),_=(0,e.computed)(()=>!0!==m.value&&void 0!==t.height?{height:t.height}:{}),g=(0,e.computed)(()=>!0===t.vertical?"vertical":"horizontal"),v=(0,e.computed)(()=>t.navigationPosition||(!0===t.vertical?"right":"bottom")),b=(0,e.computed)(()=>`q-carousel q-panel-parent q-carousel--with${!0===t.padding?"":"out"}-padding`+(!0===m.value?" fullscreen":"")+(!0===o.value?" q-carousel--dark q-dark":"")+(!0===t.arrows?` q-carousel--arrows-${g.value}`:"")+(!0===t.navigation?` q-carousel--navigation-${v.value}`:"")),y=(0,e.computed)(()=>{let e=[t.prevIcon||i.iconSet.carousel[!0===t.vertical?"up":"left"],t.nextIcon||i.iconSet.carousel[!0===t.vertical?"down":"right"]];return!1===t.vertical&&!0===i.lang.rtl?e.reverse():e}),w=(0,e.computed)(()=>t.navigationIcon||i.iconSet.carousel.navigationIcon),k=(0,e.computed)(()=>t.navigationActiveIcon||w.value),x=(0,e.computed)(()=>({color:t.controlColor,textColor:t.controlTextColor,round:!0,[t.controlType]:!0,dense:!0}));function S(){let e=!0===le(t.autoplay)?Math.abs(t.autoplay):5e3;null!==r&&clearTimeout(r),r=setTimeout(()=>{r=null,e>=0?h():d()},e)}function C(n,a){return(0,e.h)("div",{class:`q-carousel__control q-carousel__navigation no-wrap absolute flex q-carousel__navigation--${n} q-carousel__navigation--${v.value}`+(void 0===t.controlColor?"":` text-${t.controlColor}`)},[(0,e.h)("div",{class:"q-carousel__navigation-inner flex flex-center no-wrap"},p().map(a))])}return(0,e.watch)(()=>t.modelValue,()=>{t.autoplay&&S()}),(0,e.watch)(()=>t.autoplay,e=>{e?S():null!==r&&(clearTimeout(r),r=null)}),(0,e.onMounted)(()=>{t.autoplay&&S()}),(0,e.onBeforeUnmount)(()=>{null!==r&&clearTimeout(r)}),()=>(a=s(n),(0,e.h)("div",{class:b.value,style:_.value},[Oe("div",{class:"q-carousel__slides-container"},l(),"sl-cont",t.swipeable,()=>u.value)].concat(function(){let i=[];if(!0===t.navigation){let t=void 0===n["navigation-icon"]?t=>(0,e.h)(Kt,{key:"nav"+t.name,class:`q-carousel__navigation-icon q-carousel__navigation-icon--${!0===t.active?"":"in"}active`,...t.btnProps,onClick:t.onClick}):n["navigation-icon"],o=a-1;i.push(C("buttons",(e,n)=>{let a=e.props.name,i=f.value===n;return t({index:n,maxIndex:o,name:a,active:i,btnProps:{icon:!0===i?k.value:w.value,size:"sm",...x.value},onClick:()=>{c(a)}})}))}else if(!0===t.thumbnails){let n=void 0===t.controlColor?"":` text-${t.controlColor}`;i.push(C("thumbnails",a=>{let i=a.props;return(0,e.h)("img",{key:"tmb#"+i.name,class:`q-carousel__thumbnail q-carousel__thumbnail--${i.name===t.modelValue?"":"in"}active`+n,src:i.imgSrc||i["img-src"],onClick:()=>{c(i.name)}})}))}return!0===t.arrows&&f.value>=0&&((!0===t.infinite||f.value>0)&&i.push((0,e.h)("div",{key:"prev",class:`q-carousel__control q-carousel__arrow q-carousel__prev-arrow q-carousel__prev-arrow--${g.value} absolute flex flex-center`},[(0,e.h)(Kt,{icon:y.value[0],...x.value,onClick:d})])),(!0===t.infinite||f.valuet.imgSrc?{backgroundImage:`url("${t.imgSrc}")`}:{});return()=>(0,e.h)("div",{class:"q-carousel__slide",style:a.value},Le(n.default))}}),Ja=h({name:"QCarouselControl",props:{position:{type:String,default:"bottom-right",validator:e=>["top-right","top-left","bottom-right","bottom-left","top","right","bottom","left"].includes(e)},offset:{type:Array,default:()=>[18,18],validator:e=>2===e.length}},setup(t,{slots:n}){let a=(0,e.computed)(()=>`q-carousel__control absolute absolute-${t.position}`),i=(0,e.computed)(()=>({margin:`${t.offset[1]}px ${t.offset[0]}px`}));return()=>(0,e.h)("div",{class:a.value,style:i.value},Le(n.default))}}),Xa=h({name:"QChatMessage",props:{sent:Boolean,label:String,bgColor:String,textColor:String,name:String,avatar:String,text:Array,stamp:String,size:String,labelHtml:Boolean,nameHtml:Boolean,textHtml:Boolean,stampHtml:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>!0===t.sent?"sent":"received"),i=(0,e.computed)(()=>`q-message-text-content q-message-text-content--${a.value}`+(void 0===t.textColor?"":` text-${t.textColor}`)),o=(0,e.computed)(()=>`q-message-text q-message-text--${a.value}`+(void 0===t.bgColor?"":` text-${t.bgColor}`)),r=(0,e.computed)(()=>"q-message-container row items-end no-wrap"+(!0===t.sent?" reverse":"")),s=(0,e.computed)(()=>void 0===t.size?"":`col-${t.size}`),l=(0,e.computed)(()=>({msg:!0===t.textHtml?"innerHTML":"textContent",stamp:!0===t.stampHtml?"innerHTML":"textContent",name:!0===t.nameHtml?"innerHTML":"textContent",label:!0===t.labelHtml?"innerHTML":"textContent"}));function u(a){return void 0===n.stamp?t.stamp?[a,(0,e.h)("div",{class:"q-message-stamp",[l.value.stamp]:t.stamp})]:[a]:[a,(0,e.h)("div",{class:"q-message-stamp"},n.stamp())]}function c(t,n){let a=!0===n?t.length>1?e=>e:t=>(0,e.h)("div",[t]):t=>(0,e.h)("div",{[l.value.msg]:t});return t.map((t,n)=>(0,e.h)("div",{key:n,class:o.value},[(0,e.h)("div",{class:i.value},u(a(t)))]))}return()=>{let i=[];void 0===n.avatar?void 0!==t.avatar&&i.push((0,e.h)("img",{class:`q-message-avatar q-message-avatar--${a.value}`,src:t.avatar,"aria-hidden":"true"})):i.push(n.avatar());let o=[];void 0===n.name?void 0!==t.name&&o.push((0,e.h)("div",{class:`q-message-name q-message-name--${a.value}`,[l.value.name]:t.name})):o.push((0,e.h)("div",{class:`q-message-name q-message-name--${a.value}`},n.name())),void 0===n.default?void 0!==t.text&&o.push(c(t.text)):o.push(c(ut(n.default()),!0)),i.push((0,e.h)("div",{class:s.value},o));let u=[];return void 0===n.label?void 0!==t.label&&u.push((0,e.h)("div",{class:"q-message-label",[l.value.label]:t.label})):u.push((0,e.h)("div",{class:"q-message-label"},n.label())),u.push((0,e.h)("div",{class:r.value},i)),(0,e.h)("div",{class:`q-message q-message-${a.value}`},u)}}});function ei(t,n){let a=(0,e.ref)(null);return{refocusTargetEl:(0,e.computed)(()=>!0===t.disable?null:(0,e.h)("span",{ref:a,class:"no-outline",tabindex:-1})),refocusTarget:function(e){let t=n.value;!0!==e?.qAvoidFocus&&(0===e?.type.indexOf("key")?document.activeElement!==t&&!0===t?.contains(document.activeElement)&&t.focus():null!==a.value&&(void 0===e||!0===t?.contains(e.target))&&a.value.focus())}}}var ti={xs:30,sm:35,md:40,lg:50,xl:60};let ni={...Xe,...Ee,...xa,modelValue:{required:!0,default:null},val:{},trueValue:{default:!0},falseValue:{default:!1},indeterminateValue:{default:null},checkedIcon:String,uncheckedIcon:String,indeterminateIcon:String,toggleOrder:{type:String,validator:e=>"tf"===e||"ft"===e},toggleIndeterminate:Boolean,label:String,leftLabel:Boolean,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},ai=["update:modelValue"];function ii(t,n){let{props:a,slots:i,emit:o,proxy:r}=(0,e.getCurrentInstance)(),{$q:s}=r,l=et(a,s),u=(0,e.ref)(null),{refocusTargetEl:c,refocusTarget:d}=ei(a,u),h=Ae(a,ti),p=(0,e.computed)(()=>void 0!==a.val&&Array.isArray(a.modelValue)),f=(0,e.computed)(()=>{let t=(0,e.toRaw)(a.val);return!0===p.value?a.modelValue.findIndex(n=>(0,e.toRaw)(n)===t):-1}),m=(0,e.computed)(()=>!0===p.value?-1!==f.value:(0,e.toRaw)(a.modelValue)===(0,e.toRaw)(a.trueValue)),_=(0,e.computed)(()=>!0===p.value?-1===f.value:(0,e.toRaw)(a.modelValue)===(0,e.toRaw)(a.falseValue)),g=(0,e.computed)(()=>!1===m.value&&!1===_.value),v=(0,e.computed)(()=>!0===a.disable?-1:a.tabindex||0),b=(0,e.computed)(()=>`q-${t} cursor-pointer no-outline row inline no-wrap items-center`+(!0===a.disable?" disabled":"")+(!0===l.value?` q-${t}--dark`:"")+(!0===a.dense?` q-${t}--dense`:"")+(!0===a.leftLabel?" reverse":"")),y=(0,e.computed)(()=>`q-${t}__inner relative-position non-selectable q-${t}__inner--${!0===m.value?"truthy":!0===_.value?"falsy":"indet"}${void 0===a.color||!0!==a.keepColor&&("toggle"===t?!0!==m.value:!0===_.value)?"":` text-${a.color}`}`),w=Ca((0,e.computed)(()=>{let e={type:"checkbox"};return void 0!==a.name&&Object.assign(e,{".checked":m.value,"^checked":!0===m.value?"checked":void 0,name:a.name,value:!0===p.value?a.val:a.trueValue}),e})),x=(0,e.computed)(()=>{let e={tabindex:v.value,role:"toggle"===t?"switch":"checkbox","aria-label":a.label,"aria-checked":!0===g.value?"mixed":!0===m.value?"true":"false"};return!0===a.disable&&(e["aria-disabled"]="true"),e});function S(e){void 0!==e&&(k(e),d(e)),!0!==a.disable&&o("update:modelValue",function(){if(!0===p.value){if(!0===m.value){let e=a.modelValue.slice();return e.splice(f.value,1),e}return a.modelValue.concat([a.val])}if(!0===m.value){if("ft"!==a.toggleOrder||!1===a.toggleIndeterminate)return a.falseValue}else{if(!0!==_.value)return"ft"===a.toggleOrder?a.falseValue:a.trueValue;if("ft"===a.toggleOrder||!1===a.toggleIndeterminate)return a.trueValue}return a.indeterminateValue}(),e)}function C(e){(13===e.keyCode||32===e.keyCode)&&k(e)}function T(e){(13===e.keyCode||32===e.keyCode)&&S(e)}let P=n(m,g);return Object.assign(r,{toggle:S}),()=>{let n=P();!0!==a.disable&&w(n,"unshift",` q-${t}__native absolute q-ma-none q-pa-none`);let o=[(0,e.h)("div",{class:y.value,style:h.value,"aria-hidden":"true"},n)];null!==c.value&&o.push(c.value);let r=void 0===a.label?Le(i.default):Re(i.default,[a.label]);return void 0!==r&&o.push((0,e.h)("div",{class:`q-${t}__label q-anchor--skip`},r)),(0,e.h)("div",{ref:u,class:b.value,...x.value,onClick:S,onKeydown:C,onKeyup:T},o)}}var oi=h({name:"QCheckbox",props:ni,emits:ai,setup(t){let n=(0,e.h)("div",{key:"svg",class:"q-checkbox__bg absolute"},[(0,e.h)("svg",{class:"q-checkbox__svg fit absolute-full",viewBox:"0 0 24 24"},[(0,e.h)("path",{class:"q-checkbox__truthy",fill:"none",d:"M1.73,12.91 8.1,19.28 22.79,4.59"}),(0,e.h)("path",{class:"q-checkbox__indet",d:"M4,14H20V10H4"})])]);return ii("checkbox",function(a,i){let o=(0,e.computed)(()=>(!0===a.value?t.checkedIcon:!0===i.value?t.indeterminateIcon:t.uncheckedIcon)||null);return()=>null===o.value?[n]:[(0,e.h)("div",{key:"icon",class:"q-checkbox__icon-container absolute-full flex flex-center no-wrap"},[(0,e.h)(Ye,{class:"q-checkbox__icon",name:o.value})])]})}});let ri={xs:8,sm:10,md:14,lg:20,xl:24};var si=h({name:"QChip",props:{...Xe,...Ee,dense:Boolean,icon:String,iconRight:String,iconRemove:String,iconSelected:String,label:[String,Number],color:String,textColor:String,modelValue:{type:Boolean,default:!0},selected:{type:Boolean,default:null},square:Boolean,outline:Boolean,clickable:Boolean,removable:Boolean,removeAriaLabel:String,tabindex:[String,Number],disable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:["update:modelValue","update:selected","remove","click"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=et(t,i),r=Ae(t,ri),s=(0,e.computed)(()=>!0===t.selected||void 0!==t.icon),l=(0,e.computed)(()=>!0===t.selected?t.iconSelected||i.iconSet.chip.selected:t.icon),u=(0,e.computed)(()=>t.iconRemove||i.iconSet.chip.remove),c=(0,e.computed)(()=>!1===t.disable&&(!0===t.clickable||null!==t.selected)),d=(0,e.computed)(()=>{let e=!0===t.outline&&t.color||t.textColor;return"q-chip row inline no-wrap items-center"+(!1===t.outline&&void 0!==t.color?` bg-${t.color}`:"")+(e?` text-${e} q-chip--colored`:"")+(!0===t.disable?" disabled":"")+(!0===t.dense?" q-chip--dense":"")+(!0===t.outline?" q-chip--outline":"")+(!0===t.selected?" q-chip--selected":"")+(!0===c.value?" q-chip--clickable cursor-pointer non-selectable q-hoverable":"")+(!0===t.square?" q-chip--square":"")+(!0===o.value?" q-chip--dark q-dark":"")}),h=(0,e.computed)(()=>{let e=!0===t.disable?{tabindex:-1,"aria-disabled":"true"}:{tabindex:t.tabindex||0};return{chip:e,remove:{...e,role:"button","aria-hidden":"false","aria-label":t.removeAriaLabel||i.lang.label.remove}}});function p(e){13===e.keyCode&&f(e)}function f(e){t.disable||(a("update:selected",!t.selected),a("click",e))}function m(e){(void 0===e.keyCode||13===e.keyCode)&&(k(e),!1===t.disable&&(a("update:modelValue",!1),a("remove")))}function _(){let a=[];!0===c.value&&a.push((0,e.h)("div",{class:"q-focus-helper"})),!0===s.value&&a.push((0,e.h)(Ye,{class:"q-chip__icon q-chip__icon--left",name:l.value}));let i=void 0===t.label?void 0:[(0,e.h)("div",{class:"ellipsis"},[t.label])];return a.push((0,e.h)("div",{class:"q-chip__content col row no-wrap items-center q-anchor--skip"},ze(n.default,i))),t.iconRight&&a.push((0,e.h)(Ye,{class:"q-chip__icon q-chip__icon--right",name:t.iconRight})),!0===t.removable&&a.push((0,e.h)(Ye,{class:"q-chip__icon q-chip__icon--remove cursor-pointer",name:u.value,...h.value.remove,onClick:m,onKeyup:m})),a}return()=>{if(!1===t.modelValue)return;let e={class:d.value,style:r.value};return!0===c.value&&Object.assign(e,h.value.chip,{onClick:f,onKeyup:p}),Oe("div",e,_(),"ripple",!1!==t.ripple&&!0!==t.disable,()=>[[Ot,t.ripple]])}}});let li={...Ee,min:{type:Number,default:0},max:{type:Number,default:100},color:String,centerColor:String,trackColor:String,fontSize:String,rounded:Boolean,thickness:{type:Number,default:.2,validator:e=>e>=0&&e<=1},angle:{type:Number,default:0},showValue:Boolean,reverse:Boolean,instantFeedback:Boolean},ui=100*Math.PI,ci=Math.round(1e3*ui)/1e3;var di=h({name:"QCircularProgress",props:{...li,value:{type:Number,default:0},animationSpeed:{type:[String,Number],default:600},indeterminate:Boolean},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=Ae(t),o=(0,e.computed)(()=>{let e=(!0===a.lang.rtl?-1:1)*t.angle;return{transform:t.reverse===(!0===a.lang.rtl)?`rotate3d(0, 0, 1, ${e-90}deg)`:`scale3d(-1, 1, 1) rotate3d(0, 0, 1, ${-90-e}deg)`}}),r=(0,e.computed)(()=>!0!==t.instantFeedback&&!0!==t.indeterminate?{transition:`stroke-dashoffset ${t.animationSpeed}ms ease 0s, stroke ${t.animationSpeed}ms ease`}:""),s=(0,e.computed)(()=>100/(1-t.thickness/2)),l=(0,e.computed)(()=>`${s.value/2} ${s.value/2} ${s.value} ${s.value}`),u=(0,e.computed)(()=>ge(t.value,t.min,t.max)),c=(0,e.computed)(()=>t.max-t.min),d=(0,e.computed)(()=>t.thickness/2*s.value),h=(0,e.computed)(()=>{let e=(t.max-u.value)/c.value,n=!0===t.rounded&&u.value{let a=[];void 0!==t.centerColor&&"transparent"!==t.centerColor&&a.push((0,e.h)("circle",{class:`q-circular-progress__center text-${t.centerColor}`,fill:"currentColor",r:50-d.value/2,cx:s.value,cy:s.value})),void 0!==t.trackColor&&"transparent"!==t.trackColor&&a.push(p({cls:"track",thickness:d.value,offset:0,color:t.trackColor})),a.push(p({cls:"circle",thickness:d.value,offset:h.value,color:t.color,rounded:!0===t.rounded?"round":void 0}));let r=[(0,e.h)("svg",{class:"q-circular-progress__svg",style:o.value,viewBox:l.value,"aria-hidden":"true"},a)];return!0===t.showValue&&r.push((0,e.h)("div",{class:"q-circular-progress__text absolute-full row flex-center content-center",style:{fontSize:t.fontSize}},void 0===n.default?[(0,e.h)("div",u.value)]:n.default())),(0,e.h)("div",{class:`q-circular-progress q-circular-progress--${!0===t.indeterminate?"in":""}determinate`,style:i.value,role:"progressbar","aria-valuemin":t.min,"aria-valuemax":t.max,"aria-valuenow":!0===t.indeterminate?void 0:u.value},ze(n.internal,r))}}});function hi(e,t,n){let a,i=v(e),o=i.left-t.event.x,r=i.top-t.event.y,s=Math.abs(o),l=Math.abs(r),u=t.direction;!0===u.horizontal&&!0!==u.vertical?a=o<0?"left":"right":!0!==u.horizontal&&!0===u.vertical?a=r<0?"up":"down":!0===u.up&&r<0?(a="up",s>l&&(!0===u.left&&o<0?a="left":!0===u.right&&o>0&&(a="right"))):!0===u.down&&r>0?(a="down",s>l&&(!0===u.left&&o<0?a="left":!0===u.right&&o>0&&(a="right"))):!0===u.left&&o<0?(a="left",s0&&(a="down"))):!0===u.right&&o>0&&(a="right",s0&&(a="down")));let c=!1;if(void 0===a&&!1===n){if(!0===t.event.isFirst||void 0===t.event.lastDir)return{};a=t.event.lastDir,c=!0,"left"===a||"right"===a?(i.left-=o,s=0,o=0):(i.top-=r,l=0,r=0)}return{synthetic:c,payload:{evt:e,touch:!0!==t.event.mouse,mouse:!0===t.event.mouse,position:i,direction:a,isFirst:t.event.isFirst,isFinal:!0===n,duration:Date.now()-t.event.time,distance:{x:s,y:l},offset:{x:o,y:r},delta:{x:i.left-t.event.lastX,y:i.top-t.event.lastY}}}}let pi=0;var fi=p({name:"touch-pan",beforeMount(e,{value:t,modifiers:n}){if(!0!==n.mouse&&!0!==c.has.touch)return;function a(e,t){!0===n.mouse&&!0===t?k(e):(!0===n.stop&&y(e),!0===n.prevent&&w(e))}let i={uid:"qvtp_"+pi++,handler:t,modifiers:n,direction:za(n),noop:_,mouseStart(e){Ia(e,i)&&g(e)&&(S(i,"temp",[[document,"mousemove","move","notPassiveCapture"],[document,"mouseup","end","passiveCapture"]]),i.start(e,!0))},touchStart(e){if(Ia(e,i)){let t=e.target;S(i,"temp",[[t,"touchmove","move","notPassiveCapture"],[t,"touchcancel","end","passiveCapture"],[t,"touchend","end","passiveCapture"]]),i.start(e)}},start(t,a){if(!0===c.is.firefox&&x(e,!0),i.lastEvt=t,!0===a||!0===n.stop){if(!0!==i.direction.all&&(!0!==a||!0!==i.modifiers.mouseAllDir&&!0!==i.modifiers.mousealldir)){let e=-1===t.type.indexOf("mouse")?new TouchEvent(t.type,t):new MouseEvent(t.type,t);!0===t.defaultPrevented&&w(e),!0===t.cancelBubble&&y(e),Object.assign(e,{qKeyEvent:t.qKeyEvent,qClickOutside:t.qClickOutside,qAnchorHandled:t.qAnchorHandled,qClonedBy:void 0===t.qClonedBy?[i.uid]:t.qClonedBy.concat(i.uid)}),i.initialEvent={target:t.target,event:e}}y(t)}let{left:o,top:r}=v(t);i.event={x:o,y:r,time:Date.now(),mouse:!0===a,detected:!1,isFirst:!0,isFinal:!1,lastX:o,lastY:r}},move(e){if(void 0===i.event)return;let t=v(e),o=t.left-i.event.x,r=t.top-i.event.y;if(0===o&&0===r)return;i.lastEvt=e;let s=!0===i.event.mouse,l=()=>{let t;a(e,s),!0!==n.preserveCursor&&!0!==n.preservecursor&&(t=document.documentElement.style.cursor||"",document.documentElement.style.cursor="grabbing"),!0===s&&document.body.classList.add("no-pointer-events--children"),document.body.classList.add("non-selectable"),Qt(),i.styleCleanup=e=>{if(i.styleCleanup=void 0,void 0!==t&&(document.documentElement.style.cursor=t),document.body.classList.remove("non-selectable"),!0===s){let t=()=>{document.body.classList.remove("no-pointer-events--children")};void 0===e?t():setTimeout(()=>{t(),e()},50)}else void 0!==e&&e()}};if(!0===i.event.detected){!0!==i.event.isFirst&&a(e,i.event.mouse);let{payload:t,synthetic:n}=hi(e,i,!1);return void(void 0!==t&&(!1===i.handler(t)?i.end(e):(void 0===i.styleCleanup&&!0===i.event.isFirst&&l(),i.event.lastX=t.position.left,i.event.lastY=t.position.top,i.event.lastDir=!0===n?void 0:t.direction,i.event.isFirst=!1)))}if(!0===i.direction.all||!0===s&&(!0===i.modifiers.mouseAllDir||!0===i.modifiers.mousealldir))return l(),i.event.detected=!0,void i.move(e);let u=Math.abs(o),c=Math.abs(r);u!==c&&(!0===i.direction.horizontal&&u>c||!0===i.direction.vertical&&u0||!0===i.direction.left&&u>c&&o<0||!0===i.direction.right&&u>c&&o>0?(i.event.detected=!0,i.move(e)):i.end(e,!0))},end(t,n){if(void 0!==i.event){if(C(i,"temp"),!0===c.is.firefox&&x(e,!1),!0===n)i.styleCleanup?.(),!0!==i.event.detected&&void 0!==i.initialEvent&&i.initialEvent.target.dispatchEvent(i.initialEvent.event);else if(!0===i.event.detected){!0===i.event.isFirst&&i.handler(hi(void 0===t?i.lastEvt:t,i).payload);let{payload:e}=hi(void 0===t?i.lastEvt:t,i,!0),n=()=>{i.handler(e)};void 0===i.styleCleanup?n():i.styleCleanup(n)}i.event=void 0,i.initialEvent=void 0,i.lastEvt=void 0}}};e.__qtouchpan=i,!0===n.mouse&&S(i,"main",[[e,"mousedown","mouseStart","passive"+(!0===n.mouseCapture||!0===n.mousecapture?"Capture":"")]]),!0===c.has.touch&&S(i,"main",[[e,"touchstart","touchStart","passive"+(!0===n.capture?"Capture":"")],[e,"touchmove","noop","notPassiveCapture"]])},updated(e,t){let n=e.__qtouchpan;void 0!==n&&(t.oldValue!==t.value&&("function"!=typeof value&&n.end(),n.handler=t.value),n.direction=za(t.modifiers))},beforeUnmount(e){let t=e.__qtouchpan;void 0!==t&&(void 0!==t.event&&t.end(),C(t,"main"),C(t,"temp"),!0===c.is.firefox&&x(e,!1),t.styleCleanup?.(),delete e.__qtouchpan)}});let mi=e=>({value:e}),_i=({marker:t})=>(0,e.h)("div",{key:t.value,style:t.style,class:t.classes},t.label),gi=[34,37,40,33,39,38],vi={...Xe,...xa,min:{type:Number,default:0},max:{type:Number,default:100},innerMin:Number,innerMax:Number,step:{type:Number,default:1,validator:e=>e>=0},snap:Boolean,vertical:Boolean,reverse:Boolean,color:String,markerLabelsClass:String,label:Boolean,labelColor:String,labelTextColor:String,labelAlways:Boolean,switchLabelSide:Boolean,markers:[Boolean,Number],markerLabels:[Boolean,Array,Object,Function],switchMarkerLabelsSide:Boolean,trackImg:String,trackColor:String,innerTrackImg:String,innerTrackColor:String,selectionColor:String,selectionImg:String,thumbSize:{type:String,default:"20px"},trackSize:{type:String,default:"4px"},disable:Boolean,readonly:Boolean,dense:Boolean,tabindex:[String,Number],thumbColor:String,thumbPath:{type:String,default:"M 4, 10 a 6,6 0 1,0 12,0 a 6,6 0 1,0 -12,0"}},bi=["pan","update:modelValue","change"];function yi({updateValue:t,updatePosition:n,getDragging:a,formAttrs:i}){let{props:o,emit:r,slots:s,proxy:{$q:l}}=(0,e.getCurrentInstance)(),u=et(o,l),c=Ca(i),d=(0,e.ref)(!1),h=(0,e.ref)(!1),p=(0,e.ref)(!1),f=(0,e.ref)(!1),m=(0,e.computed)(()=>!0===o.vertical?"--v":"--h"),_=(0,e.computed)(()=>"-"+(!0===o.switchLabelSide?"switched":"standard")),g=(0,e.computed)(()=>!0===o.vertical?!0===o.reverse:o.reverse!==(!0===l.lang.rtl)),b=(0,e.computed)(()=>!0===isNaN(o.innerMin)||o.innerMin!0===isNaN(o.innerMax)||o.innerMax>o.max?o.max:o.innerMax),w=(0,e.computed)(()=>!0!==o.disable&&!0!==o.readonly&&b.value{if(0===o.step)return e=>e;let e=(String(o.step).trim().split(".")[1]||"").length;return t=>parseFloat(t.toFixed(e))}),x=(0,e.computed)(()=>0===o.step?1:o.step),S=(0,e.computed)(()=>!0===w.value?o.tabindex||0:-1),C=(0,e.computed)(()=>o.max-o.min),T=(0,e.computed)(()=>y.value-b.value),P=(0,e.computed)(()=>K(b.value)),E=(0,e.computed)(()=>K(y.value)),A=(0,e.computed)(()=>!0===o.vertical?!0===g.value?"bottom":"top":!0===g.value?"right":"left"),L=(0,e.computed)(()=>!0===o.vertical?"height":"width"),M=(0,e.computed)(()=>!0===o.vertical?"width":"height"),R=(0,e.computed)(()=>!0===o.vertical?"vertical":"horizontal"),z=(0,e.computed)(()=>{let e={role:"slider","aria-valuemin":b.value,"aria-valuemax":y.value,"aria-orientation":R.value,"data-step":o.step};return!0===o.disable?e["aria-disabled"]="true":!0===o.readonly&&(e["aria-readonly"]="true"),e}),O=(0,e.computed)(()=>`q-slider q-slider${m.value} q-slider--${!0===d.value?"":"in"}active inline no-wrap `+(!0===o.vertical?"row":"column")+(!0===o.disable?" disabled":" q-slider--enabled"+(!0===w.value?" q-slider--editable":""))+("both"===p.value?" q-slider--focus":"")+(o.label||!0===o.labelAlways?" q-slider--label":"")+(!0===o.labelAlways?" q-slider--label-always":"")+(!0===u.value?" q-slider--dark":"")+(!0===o.dense?" q-slider--dense q-slider--dense"+m.value:""));function I(e){let t="q-slider__"+e;return`${t} ${t}${m.value} ${t}${m.value}${_.value}`}function N(e){let t="q-slider__"+e;return`${t} ${t}${m.value}`}let D=(0,e.computed)(()=>{let e=o.selectionColor||o.color;return"q-slider__selection absolute"+(void 0===e?"":` text-${e}`)}),q=(0,e.computed)(()=>N("markers")+" absolute overflow-hidden"),j=(0,e.computed)(()=>N("track-container")),B=(0,e.computed)(()=>I("pin")),F=(0,e.computed)(()=>I("label")),$=(0,e.computed)(()=>I("text-container")),V=(0,e.computed)(()=>I("marker-labels-container")+(void 0===o.markerLabelsClass?"":` ${o.markerLabelsClass}`)),U=(0,e.computed)(()=>"q-slider__track relative-position no-outline"+(void 0===o.trackColor?"":` bg-${o.trackColor}`)),H=(0,e.computed)(()=>{let e={[M.value]:o.trackSize};return void 0!==o.trackImg&&(e.backgroundImage=`url(${o.trackImg}) !important`),e}),W=(0,e.computed)(()=>"q-slider__inner absolute"+(void 0===o.innerTrackColor?"":` bg-${o.innerTrackColor}`)),G=(0,e.computed)(()=>{let e=E.value-P.value,t={[A.value]:100*P.value+"%",[L.value]:0===e?"2px":100*e+"%"};return void 0!==o.innerTrackImg&&(t.backgroundImage=`url(${o.innerTrackImg}) !important`),t});function K(e){return 0===C.value?0:(e-o.min)/C.value}let Y=(0,e.computed)(()=>!0===le(o.markers)?o.markers:x.value),Q=(0,e.computed)(()=>{let e=[],t=Y.value,n=o.max,a=o.min;do{e.push(a),a+=t}while(a{let e=` q-slider__marker-labels${m.value}-`;return`q-slider__marker-labels${e}${!0===o.switchMarkerLabelsSide?"switched":"standard"}${e}${!0===g.value?"rtl":"ltr"}`}),J=(0,e.computed)(()=>!1===o.markerLabels?null:function(e){if(!1===e)return null;if(!0===e)return Q.value.map(mi);if("function"==typeof e)return Q.value.map(t=>{let n=e(t);return!0===oe(n)?{...n,value:t}:{value:t,label:n}});let t=({value:e})=>e>=o.min&&e<=o.max;return!0===Array.isArray(e)?e.map(e=>!0===oe(e)?e:{value:e}).filter(t):Object.keys(e).map(t=>{let n=e[t],a=Number(t);return!0===oe(n)?{...n,value:a}:{value:a,label:n}}).filter(t)}(o.markerLabels).map((e,t)=>({index:t,value:e.value,label:e.label||e.value,classes:Z.value+(void 0===e.classes?"":" "+e.classes),style:{...te(e.value),...e.style||{}}}))),X=(0,e.computed)(()=>({markerList:J.value,markerMap:ne.value,classes:Z.value,getStyle:te})),ee=(0,e.computed)(()=>{let e=0===T.value?"2px":100*Y.value/T.value;return{...G.value,backgroundSize:!0===o.vertical?`2px ${e}%`:`${e}% 2px`}});function te(e){return{[A.value]:100*(e-o.min)/C.value+"%"}}let ne=(0,e.computed)(()=>{if(!1===o.markerLabels)return null;let e={};return J.value.forEach(t=>{e[t.value]=t}),e});function ae(){if(void 0!==s["marker-label-group"])return s["marker-label-group"](X.value);let e=s["marker-label"]||_i;return J.value.map(t=>e({marker:t,...X.value}))}let ie=(0,e.computed)(()=>[[fi,re,void 0,{[R.value]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]);function re(e){!0===e.isFinal?(void 0!==f.value&&(n(e.evt),!0===e.touch&&t(!0),f.value=void 0,r("pan","end")),d.value=!1,p.value=!1):!0===e.isFirst?(f.value=a(e.evt),n(e.evt),t(),d.value=!0,r("pan","start")):(n(e.evt),t())}function se(){p.value=!1}function ue(){h.value=!1,d.value=!1,t(!0),se(),document.removeEventListener("mouseup",ue,!0)}function ce(e){if(!0===o.vertical)return null;let t=l.lang.rtl===o.reverse?e:1-e;return{transform:`translateX(calc(${2*t-1} * ${o.thumbSize} / 2 + ${50-100*t}%))`}}return(0,e.onBeforeUnmount)(()=>{document.removeEventListener("mouseup",ue,!0)}),{state:{active:d,focus:p,preventFocus:h,dragging:f,editable:w,classes:O,tabindex:S,attributes:z,roundValueFn:k,keyStep:x,trackLen:C,innerMin:b,innerMinRatio:P,innerMax:y,innerMaxRatio:E,positionProp:A,sizeProp:L,isReversed:g},methods:{onActivate:function(e){n(e,a(e)),t(),h.value=!0,d.value=!0,document.addEventListener("mouseup",ue,!0)},onMobileClick:function(e){n(e,a(e)),t(!0)},onBlur:se,onKeyup:function(e){gi.includes(e.keyCode)&&t(!0)},getContent:function(t,n,a,i){let r=[];"transparent"!==o.innerTrackColor&&r.push((0,e.h)("div",{key:"inner",class:W.value,style:G.value})),"transparent"!==o.selectionColor&&r.push((0,e.h)("div",{key:"selection",class:D.value,style:t.value})),!1!==o.markers&&r.push((0,e.h)("div",{key:"marker",class:q.value,style:ee.value})),i(r);let s=[Oe("div",{key:"trackC",class:j.value,tabindex:n.value,...a.value},[(0,e.h)("div",{class:U.value,style:H.value},r)],"slide",w.value,()=>ie.value)];return!1!==o.markerLabels&&s[!0===o.switchMarkerLabelsSide?"unshift":"push"]((0,e.h)("div",{key:"markerL",class:V.value},ae())),s},getThumbRenderFn:function(t){let n=(0,e.computed)(()=>!1!==h.value||p.value!==t.focusValue&&"both"!==p.value?"":" q-slider--focus"),a=(0,e.computed)(()=>`q-slider__thumb q-slider__thumb${m.value} q-slider__thumb${m.value}-${!0===g.value?"rtl":"ltr"} absolute non-selectable`+n.value+(void 0===t.thumbColor.value?"":` text-${t.thumbColor.value}`)),i=(0,e.computed)(()=>({width:o.thumbSize,height:o.thumbSize,[A.value]:100*t.ratio.value+"%",zIndex:p.value===t.focusValue?2:void 0})),r=(0,e.computed)(()=>void 0===t.labelColor.value?"":` text-${t.labelColor.value}`),s=(0,e.computed)(()=>ce(t.ratio.value)),l=(0,e.computed)(()=>"q-slider__text"+(void 0===t.labelTextColor.value?"":` text-${t.labelTextColor.value}`));return()=>{let n=[(0,e.h)("svg",{class:"q-slider__thumb-shape absolute-full",viewBox:"0 0 20 20","aria-hidden":"true"},[(0,e.h)("path",{d:o.thumbPath})]),(0,e.h)("div",{class:"q-slider__focus-ring fit"})];return(!0===o.label||!0===o.labelAlways)&&(n.push((0,e.h)("div",{class:B.value+" absolute fit no-pointer-events"+r.value},[(0,e.h)("div",{class:F.value,style:{minWidth:o.thumbSize}},[(0,e.h)("div",{class:$.value,style:s.value},[(0,e.h)("span",{class:l.value},t.label.value)])])])),void 0!==o.name&&!0!==o.disable&&c(n,"push")),(0,e.h)("div",{class:a.value,style:i.value,...t.getNodeData()},n)}},convertRatioToModel:function(e){let{min:t,max:n,step:a}=o,i=t+e*(n-t);if(a>0){let e=(i-b.value)%a;i+=(Math.abs(e)>=a/2?(e<0?-1:1)*a:0)-e}return i=k.value(i),ge(i,b.value,y.value)},convertModelToRatio:K,getDraggingRatio:function(e,t){let n=v(e),a=!0===o.vertical?ge((n.top-t.top)/t.height,0,1):ge((n.left-t.left)/t.width,0,1);return ge(!0===g.value?1-a:a,P.value,E.value)}}}}let wi=()=>({});var ki=h({name:"QSlider",props:{...vi,modelValue:{required:!0,default:null,validator:e=>"number"==typeof e||null===e},labelValue:[String,Number]},emits:bi,setup(t,{emit:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),{state:i,methods:o}=yi({updateValue:m,updatePosition:function(e,n=i.dragging.value){let a=o.getDraggingRatio(e,n);l.value=o.convertRatioToModel(a),s.value=!0!==t.snap||0===t.step?a:o.convertModelToRatio(l.value)},getDragging:function(){return r.value.getBoundingClientRect()},formAttrs:Sa(t)}),r=(0,e.ref)(null),s=(0,e.ref)(0),l=(0,e.ref)(0);function u(){l.value=null===t.modelValue?i.innerMin.value:ge(t.modelValue,i.innerMin.value,i.innerMax.value)}(0,e.watch)(()=>`${t.modelValue}|${i.innerMin.value}|${i.innerMax.value}`,u),u();let c=(0,e.computed)(()=>o.convertModelToRatio(l.value)),d=(0,e.computed)(()=>!0===i.active.value?s.value:c.value),h=(0,e.computed)(()=>{let e={[i.positionProp.value]:100*i.innerMinRatio.value+"%",[i.sizeProp.value]:100*(d.value-i.innerMinRatio.value)+"%"};return void 0!==t.selectionImg&&(e.backgroundImage=`url(${t.selectionImg}) !important`),e}),p=o.getThumbRenderFn({focusValue:!0,getNodeData:wi,ratio:d,label:(0,e.computed)(()=>void 0===t.labelValue?l.value:t.labelValue),thumbColor:(0,e.computed)(()=>t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.labelColor),labelTextColor:(0,e.computed)(()=>t.labelTextColor)}),f=(0,e.computed)(()=>!0===i.editable.value?!0===a.platform.is.mobile?{onClick:o.onMobileClick}:{onMousedown:o.onActivate,onFocus:_,onBlur:o.onBlur,onKeydown:g,onKeyup:o.onKeyup}:{});function m(e){l.value!==t.modelValue&&n("update:modelValue",l.value),!0===e&&n("change",l.value)}function _(){i.focus.value=!0}function g(e){if(!1===gi.includes(e.keyCode))return;k(e);let n=([34,33].includes(e.keyCode)?10:1)*i.keyStep.value,a=([34,37,40].includes(e.keyCode)?-1:1)*(!0===i.isReversed.value?-1:1)*(!0===t.vertical?-1:1)*n;l.value=ge(i.roundValueFn.value(l.value+a),i.innerMin.value,i.innerMax.value),m()}return()=>{let n=o.getContent(h,i.tabindex,f,e=>{e.push(p())});return(0,e.h)("div",{ref:r,class:i.classes.value+(null===t.modelValue?" q-slider--no-value":""),...i.attributes.value,"aria-valuenow":t.modelValue},n)}}});function xi(){let t=(0,e.ref)(!r.value);return!1===t.value&&(0,e.onMounted)(()=>{t.value=!0}),{isHydrated:t}}let Si=typeof ResizeObserver<"u",Ci=!0===Si?{}:{style:"display:block;position:absolute;top:0;left:0;right:0;bottom:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1;",url:"about:blank"};var Ti=h({name:"QResizeObserver",props:{debounce:{type:[String,Number],default:100}},emits:["resize"],setup(t,{emit:n}){let a,i=null,o={width:-1,height:-1};function r(e){!0===e||0===t.debounce||"0"===t.debounce?s():null===i&&(i=setTimeout(s,t.debounce))}function s(){if(null!==i&&(clearTimeout(i),i=null),a){let{offsetWidth:e,offsetHeight:t}=a;(e!==o.width||t!==o.height)&&(o={width:e,height:t},n("resize",o))}}let{proxy:l}=(0,e.getCurrentInstance)();if(l.trigger=r,!0===Si){let d,h=t=>{a=l.$el.parentNode,a?(d=new ResizeObserver(r),d.observe(a),s()):!0!==t&&(0,e.nextTick)(()=>{h(!0)})};return(0,e.onMounted)(()=>{h()}),(0,e.onBeforeUnmount)(()=>{null!==i&&clearTimeout(i),void 0!==d&&(void 0===d.disconnect?a&&d.unobserve(a):d.disconnect())}),_}{let p,{isHydrated:f}=xi();function u(){null!==i&&(clearTimeout(i),i=null),void 0!==p&&(void 0!==p.removeEventListener&&p.removeEventListener("resize",r,m.passive),p=void 0)}function c(){u(),a?.contentDocument&&(p=a.contentDocument.defaultView,p.addEventListener("resize",r,m.passive),s())}return(0,e.onMounted)(()=>{(0,e.nextTick)(()=>{a=l.$el,a&&c()})}),(0,e.onBeforeUnmount)(u),()=>{if(!0===f.value)return(0,e.h)("object",{class:"q--avoid-card-border",style:Ci.style,tabindex:-1,type:"text/html",data:Ci.url,"aria-hidden":"true",onLoad:c})}}}});let Pi=!1;{let e=document.createElement("div");e.setAttribute("dir","rtl"),Object.assign(e.style,{width:"1px",height:"1px",overflow:"auto"});let t=document.createElement("div");Object.assign(t.style,{width:"1000px",height:"1px"}),document.body.appendChild(e),e.appendChild(t),e.scrollLeft=-1e3,Pi=e.scrollLeft>=0,e.remove()}function Ei(e,t,n){let a=!0===n?["left","right"]:["top","bottom"];return`absolute-${!0===t?a[0]:a[1]}${e?` text-${e}`:""}`}let Ai=["left","center","right","justify"];var Li=h({name:"QTabs",props:{modelValue:[Number,String],align:{type:String,default:"center",validator:e=>Ai.includes(e)},breakpoint:{type:[String,Number],default:600},vertical:Boolean,shrink:Boolean,stretch:Boolean,activeClass:String,activeColor:String,activeBgColor:String,indicatorColor:String,leftIcon:String,rightIcon:String,outsideArrows:Boolean,mobileArrows:Boolean,switchIndicator:Boolean,narrowIndicator:Boolean,inlineLabel:Boolean,noCaps:Boolean,dense:Boolean,contentClass:String,"onUpdate:modelValue":[Function,Array]},setup(t,{slots:n,emit:a}){let i,{proxy:o}=(0,e.getCurrentInstance)(),{$q:r}=o,{registerTick:s}=kn(),{registerTick:l}=kn(),{registerTick:u}=kn(),{registerTimeout:c,removeTimeout:d}=xn(),{registerTimeout:h,removeTimeout:p}=xn(),f=(0,e.ref)(null),m=(0,e.ref)(null),_=(0,e.ref)(t.modelValue),g=(0,e.ref)(!1),v=(0,e.ref)(!0),b=(0,e.ref)(!1),y=(0,e.ref)(!1),w=[],k=(0,e.ref)(0),x=(0,e.ref)(!1),S=null,C=null,T=(0,e.computed)(()=>({activeClass:t.activeClass,activeColor:t.activeColor,activeBgColor:t.activeBgColor,indicatorClass:Ei(t.indicatorColor,t.switchIndicator,t.vertical),narrowIndicator:t.narrowIndicator,inlineLabel:t.inlineLabel,noCaps:t.noCaps})),P=(0,e.computed)(()=>{let e=k.value,t=_.value;for(let n=0;n`q-tabs__content--align-${!0===g.value?"left":!0===y.value?"justify":t.align}`),A=(0,e.computed)(()=>`q-tabs row no-wrap items-center q-tabs--${!0===g.value?"":"not-"}scrollable q-tabs--${!0===t.vertical?"vertical":"horizontal"} q-tabs__arrows--${!0===t.outsideArrows?"outside":"inside"} q-tabs--mobile-with${!0===t.mobileArrows?"":"out"}-arrows`+(!0===t.dense?" q-tabs--dense":"")+(!0===t.shrink?" col-shrink":"")+(!0===t.stretch?" self-stretch":"")),L=(0,e.computed)(()=>"q-tabs__content scroll--mobile row no-wrap items-center self-stretch hide-scrollbar relative-position "+E.value+(void 0===t.contentClass?"":` ${t.contentClass}`)),M=(0,e.computed)(()=>!0===t.vertical?{container:"height",content:"offsetHeight",scroll:"scrollHeight"}:{container:"width",content:"offsetWidth",scroll:"scrollWidth"}),R=(0,e.computed)(()=>!0!==t.vertical&&!0===r.lang.rtl),z=(0,e.computed)(()=>!1===Pi&&!0===R.value);function O({name:e,setCurrent:n,skipEmit:i}){_.value!==e&&(!0!==i&&void 0!==t["onUpdate:modelValue"]&&a("update:modelValue",e),(!0===n||void 0===t["onUpdate:modelValue"])&&(function(e,n){let a=null!=e&&""!==e?w.find(t=>t.name.value===e):null,i=null!=n&&""!==n?w.find(e=>e.name.value===n):null;if(!0===Z)Z=!1;else if(a&&i){let e=a.tabIndicatorRef.value,n=i.tabIndicatorRef.value;null!==S&&(clearTimeout(S),S=null),e.style.transition="none",e.style.transform="none",n.style.transition="none",n.style.transform="none";let o=e.getBoundingClientRect(),r=n.getBoundingClientRect();n.style.transform=!0===t.vertical?`translate3d(0,${o.top-r.top}px,0) scale3d(1,${r.height?o.height/r.height:1},1)`:`translate3d(${o.left-r.left}px,0,0) scale3d(${r.width?o.width/r.width:1},1,1)`,u(()=>{S=setTimeout(()=>{S=null,n.style.transition="transform .25s cubic-bezier(.4, 0, .2, 1)",n.style.transform="none"},70)})}i&&!0===g.value&&D(i.rootRef.value)}(_.value,e),_.value=e))}function I(){s(()=>{f.value&&N({width:f.value.offsetWidth,height:f.value.offsetHeight})})}function N(e){if(void 0===M.value||null===m.value)return;let n=e[M.value.container],a=Math.min(m.value[M.value.scroll],Array.prototype.reduce.call(m.value.children,(e,t)=>e+(t[M.value.content]||0),0)),i=n>0&&a>n;g.value=i,!0===i&&l(q),y.value=n0&&(m.value[!0===t.vertical?"scrollTop":"scrollLeft"]+=Math.ceil(s),q())}function q(){let e=m.value;if(null===e)return;let n=e.getBoundingClientRect(),a=!0===t.vertical?e.scrollTop:Math.abs(e.scrollLeft);!0===R.value?(v.value=Math.ceil(a+n.width)0):(v.value=a>0,b.value=!0===t.vertical?Math.ceil(a+n.height){!0===function(e){let t=m.value,{get:n,set:a}=V.value,i=!1,o=n(t),r=e=e)&&(i=!0,o=e),a(t,o),q(),i}(e)&&$()},5)}function B(){j(!0===z.value?2**53-1:0)}function F(){j(!0===z.value?0:2**53-1)}function $(){null!==C&&(clearInterval(C),C=null)}(0,e.watch)(R,q),(0,e.watch)(()=>t.modelValue,e=>{O({name:e,setCurrent:!0,skipEmit:!0})}),(0,e.watch)(()=>t.outsideArrows,I);let V=(0,e.computed)(()=>!0===z.value?{get:e=>Math.abs(e.scrollLeft),set:(e,t)=>{e.scrollLeft=-t}}:!0===t.vertical?{get:e=>e.scrollTop,set:(e,t)=>{e.scrollTop=t}}:{get:e=>e.scrollLeft,set:(e,t)=>{e.scrollLeft=t}});function U(e,t){for(let n in e)if(e[n]!==t[n])return!1;return!0}function H(){let e=null,t={matchedLen:0,queryDiff:9999,hrefLen:0},n=w.filter(e=>!0===e.routeData?.hasRouterLink.value),{hash:a,query:i}=o.$route,r=Object.keys(i).length;for(let o of n){let n=!0===o.routeData.exact.value;if(!0!==o.routeData[!0===n?"linkIsExactActive":"linkIsActive"].value)continue;let{hash:s,query:l,matched:u,href:c}=o.routeData.resolvedLink.value,d=Object.keys(l).length;if(!0===n){if(s!==a||d!==r||!1===U(i,l))continue;e=o.name.value;break}if(""!==s&&s!==a||0!==d&&!1===U(l,i))continue;let h={matchedLen:u.length,queryDiff:r-d,hrefLen:c.length-s.length};if(h.matchedLen>t.matchedLen)e=o.name.value,t=h;else if(h.matchedLen===t.matchedLen){if(h.queryDifft.hrefLen&&(e=o.name.value,t=h)}}null!==e||!0!==w.some(e=>void 0===e.routeData&&e.name.value===_.value)?O({name:e,setCurrent:!0}):Z=!1}function W(e){if(d(),!0!==x.value&&null!==f.value&&e.target&&"function"==typeof e.target.closest){let t=e.target.closest(".q-tab");t&&!0===f.value.contains(t)&&(x.value=!0,!0===g.value&&D(t))}}function G(){c(()=>{x.value=!1},30)}function K(){!1===J.avoidRouteWatcher?h(H):p()}function Y(){if(void 0===i){let t=(0,e.watch)(()=>o.$route.fullPath,K);i=()=>{t(),i=void 0}}}let Q,Z,J={currentModel:_,tabProps:T,hasFocus:x,hasActiveTab:P,registerTab:function(e){w.push(e),k.value++,I(),void 0===e.routeData||void 0===o.$route?h(()=>{if(!0===g.value){let e=_.value,t=null!=e&&""!==e?w.find(t=>t.name.value===e):null;t&&D(t.rootRef.value)}}):(Y(),!0===e.routeData.hasRouterLink.value&&K())},unregisterTab:function(e){w.splice(w.indexOf(e),1),k.value--,I(),void 0!==i&&void 0!==e.routeData&&(!0===w.every(e=>void 0===e.routeData)&&i(),K())},verifyRouteModel:K,updateModel:O,onKbdNavigate:function(e,n){let a=Array.prototype.filter.call(m.value.children,e=>e===n||e.matches&&!0===e.matches(".q-tab.q-focusable")),i=a.length;if(0===i)return;if(36===e)return D(a[0]),a[0].focus(),!0;if(35===e)return D(a[i-1]),a[i-1].focus(),!0;let o=e===(!0===t.vertical?38:37),r=e===(!0===t.vertical?40:39),s=!0===o?-1:!0===r?1:void 0;if(void 0!==s){let e=!0===R.value?-1:1,t=a.indexOf(n)+s*e;return t>=0&&t{Q=void 0!==i,ee()}),(0,e.onActivated)(()=>{!0===Q&&(Y(),Z=!0,K()),I()}),()=>(0,e.h)("div",{ref:f,class:A.value,role:"tablist",onFocusin:W,onFocusout:G},[(0,e.h)(Ti,{onResize:N}),(0,e.h)("div",{ref:m,class:L.value,onScroll:q},Le(n.default)),(0,e.h)(Ye,{class:"q-tabs__arrow q-tabs__arrow--left absolute q-tab__icon"+(!0===v.value?"":" q-tabs__arrow--faded"),name:t.leftIcon||r.iconSet.tabs[!0===t.vertical?"up":"left"],onMousedownPassive:B,onTouchstartPassive:B,onMouseupPassive:$,onMouseleavePassive:$,onTouchendPassive:$}),(0,e.h)(Ye,{class:"q-tabs__arrow q-tabs__arrow--right absolute q-tab__icon"+(!0===b.value?"":" q-tabs__arrow--faded"),name:t.rightIcon||r.iconSet.tabs[!0===t.vertical?"down":"right"],onMousedownPassive:F,onTouchstartPassive:F,onMouseupPassive:$,onMouseleavePassive:$,onTouchendPassive:$})])}});let Mi=0,Ri=["click","keydown"],zi={icon:String,label:[Number,String],alert:[Boolean,String],alertIcon:String,name:{type:[Number,String],default:()=>"t_"+Mi++},noCaps:Boolean,tabindex:[String,Number],disable:Boolean,contentClass:String,ripple:{type:[Boolean,Object],default:!0}};function Oi(t,n,a,i){let o=(0,e.inject)(X,te);if(o===te)return console.error("QTab/QRouteTab component needs to be child of QTabs"),te;let{proxy:r}=(0,e.getCurrentInstance)(),s=(0,e.ref)(null),l=(0,e.ref)(null),u=(0,e.ref)(null),c=(0,e.computed)(()=>!0!==t.disable&&!1!==t.ripple&&Object.assign({keyCodes:[13,32],early:!0},!0===t.ripple?{}:t.ripple)),d=(0,e.computed)(()=>o.currentModel.value===t.name),h=(0,e.computed)(()=>"q-tab relative-position self-stretch flex flex-center text-center"+(!0===d.value?" q-tab--active"+(o.tabProps.value.activeClass?" "+o.tabProps.value.activeClass:"")+(o.tabProps.value.activeColor?` text-${o.tabProps.value.activeColor}`:"")+(o.tabProps.value.activeBgColor?` bg-${o.tabProps.value.activeBgColor}`:""):" q-tab--inactive")+(t.icon&&t.label&&!1===o.tabProps.value.inlineLabel?" q-tab--full":"")+(!0===t.noCaps||!0===o.tabProps.value.noCaps?" q-tab--no-caps":"")+(!0===t.disable?" disabled":" q-focusable q-hoverable cursor-pointer")+(void 0===i?"":i.linkClass.value)),p=(0,e.computed)(()=>"q-tab__content self-stretch flex-center relative-position q-anchor--skip non-selectable "+(!0===o.tabProps.value.inlineLabel?"row no-wrap q-tab__content--inline":"column")+(void 0===t.contentClass?"":` ${t.contentClass}`)),f=(0,e.computed)(()=>!0===t.disable||!0===o.hasFocus.value||!1===d.value&&!0===o.hasActiveTab.value?-1:t.tabindex||0);function m(e,n){if(!0!==n&&!0!==e?.qAvoidFocus&&s.value?.focus(),!0!==t.disable){if(void 0===i)return o.updateModel({name:t.name}),void a("click",e);if(!0===i.hasRouterLink.value){let n=(n={})=>{let a,r=void 0===n.to||!0===ie(n.to,t.to)?o.avoidRouteWatcher=va():null;return i.navigateToRouterLink(e,{...n,returnRouterError:!0}).catch(e=>{a=e}).then(e=>{if(r===o.avoidRouteWatcher&&(o.avoidRouteWatcher=!1,void 0===a&&(void 0===e||!0===e.message?.startsWith("Avoided redundant navigation"))&&o.updateModel({name:t.name})),!0===n.returnRouterError)return void 0===a?e:Promise.reject(a)})};return a("click",e,n),void(!0!==e.defaultPrevented&&n())}a("click",e)}else!0===i?.hasRouterLink.value&&k(e)}function _(e){N(e,[13,32])?m(e,!0):!0!==I(e)&&e.keyCode>=35&&e.keyCode<=40&&!0!==e.altKey&&!0!==e.metaKey&&!0===o.onKbdNavigate(e.keyCode,r.$el)&&k(e),a("keydown",e)}function g(){let a=o.tabProps.value.narrowIndicator,i=[],r=(0,e.h)("div",{ref:u,class:["q-tab__indicator",o.tabProps.value.indicatorClass]});void 0!==t.icon&&i.push((0,e.h)(Ye,{class:"q-tab__icon",name:t.icon})),void 0!==t.label&&i.push((0,e.h)("div",{class:"q-tab__label"},t.label)),!1!==t.alert&&i.push(void 0===t.alertIcon?(0,e.h)("div",{class:"q-tab__alert"+(!0===t.alert?"":` text-${t.alert}`)}):(0,e.h)(Ye,{class:"q-tab__alert-icon",color:!0===t.alert?void 0:t.alert,name:t.alertIcon})),!0===a&&i.push(r);let l=[(0,e.h)("div",{class:"q-focus-helper",tabindex:-1,ref:s}),(0,e.h)("div",{class:p.value},Re(n.default,i))];return!1===a&&l.push(r),l}let v={name:(0,e.computed)(()=>t.name),rootRef:l,tabIndicatorRef:u,routeData:i};return(0,e.onBeforeUnmount)(()=>{o.unregisterTab(v)}),(0,e.onMounted)(()=>{o.registerTab(v)}),{renderTab:function(n,a){return(0,e.withDirectives)((0,e.h)(n,{ref:l,class:h.value,tabindex:f.value,role:"tab","aria-selected":!0===d.value?"true":"false","aria-disabled":!0===t.disable?"true":void 0,onClick:m,onKeydown:_,...a},g()),[[Ot,c.value]])},$tabs:o}}var Ii=h({name:"QTab",props:zi,emits:Ri,setup(e,{slots:t,emit:n}){let{renderTab:a}=Oi(e,t,n);return()=>a("div")}}),Ni=h({name:"QTabPanels",props:{...Fa,...Xe},emits:$a,setup(t,{slots:n}){let a=et(t,(0,e.getCurrentInstance)().proxy.$q),{updatePanelsList:i,getPanelContent:o,panelDirectives:r}=Va(),s=(0,e.computed)(()=>"q-tab-panels q-panel-parent"+(!0===a.value?" q-tab-panels--dark q-dark":""));return()=>(i(n),Oe("div",{class:s.value},o(),"pan",t.swipeable,()=>r.value))}}),Di=h({name:"QTabPanel",props:ja,setup:(t,{slots:n})=>()=>(0,e.h)("div",{class:"q-tab-panel",role:"tabpanel"},Le(n.default))});let qi=/^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/,ji=/^#[0-9a-fA-F]{4}([0-9a-fA-F]{4})?$/,Bi=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,Fi=/^rgb\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5])\)$/,$i=/^rgba\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),(0|0\.[0-9]+[1-9]|0\.[1-9]+|1)\)$/,Vi={date:e=>/^-?[\d]+\/[0-1]\d\/[0-3]\d$/.test(e),time:e=>/^([0-1]?\d|2[0-3]):[0-5]\d$/.test(e),fulltime:e=>/^([0-1]?\d|2[0-3]):[0-5]\d:[0-5]\d$/.test(e),timeOrFulltime:e=>/^([0-1]?\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/.test(e),email:e=>/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e),hexColor:e=>qi.test(e),hexaColor:e=>ji.test(e),hexOrHexaColor:e=>Bi.test(e),rgbColor:e=>Fi.test(e),rgbaColor:e=>$i.test(e),rgbOrRgbaColor:e=>Fi.test(e)||$i.test(e),hexOrRgbColor:e=>qi.test(e)||Fi.test(e),hexaOrRgbaColor:e=>ji.test(e)||$i.test(e),anyColor:e=>Bi.test(e)||Fi.test(e)||$i.test(e)};var Ui={testPattern:Vi};let Hi=/^rgb(a)?\((\d{1,3}),(\d{1,3}),(\d{1,3}),?([01]?\.?\d*?)?\)$/;function Wi({r:e,g:t,b:n,a:a}){let i=void 0!==a;if(e=Math.round(e),t=Math.round(t),n=Math.round(n),e>255||t>255||n>255||i&&a>100)throw TypeError("Expected 3 numbers below 256 (and optionally one below 100)");return a=i?(256|Math.round(255*a/100)).toString(16).slice(1):"","#"+(n|t<<8|e<<16|1<<24).toString(16).slice(1)+a}function Gi({r:e,g:t,b:n,a:a}){return`rgb${void 0===a?"":"a"}(${e},${t},${n}${void 0===a?"":","+a/100})`}function Ki(e){if("string"!=typeof e)throw TypeError("Expected a string");3===(e=e.replace(/^#/,"")).length?e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]:4===e.length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]+e[3]+e[3]);let t=parseInt(e,16);return e.length>6?{r:t>>24&255,g:t>>16&255,b:t>>8&255,a:Math.round((255&t)/2.55)}:{r:t>>16,g:t>>8&255,b:255&t}}function Yi({h:e,s:t,v:n,a:a}){let i,o,r;t/=100,n/=100,e/=360;let s=Math.floor(6*e),l=6*e-s,u=n*(1-t),c=n*(1-l*t),d=n*(1-(1-l)*t);switch(s%6){case 0:i=n,o=d,r=u;break;case 1:i=c,o=n,r=u;break;case 2:i=u,o=n,r=d;break;case 3:i=u,o=c,r=n;break;case 4:i=d,o=u,r=n;break;case 5:i=n,o=u,r=c}return{r:Math.round(255*i),g:Math.round(255*o),b:Math.round(255*r),a:a}}function Qi({r:e,g:t,b:n,a:a}){let i,o=Math.max(e,t,n),r=Math.min(e,t,n),s=o-r,l=0===o?0:s/o,u=o/255;switch(o){case r:i=0;break;case e:i=t-n+s*(t1)throw TypeError("Expected offset to be between -1 and 1");let{r:n,g:a,b:i,a:o}=Zi(e),r=void 0===o?0:o/100;return Wi({r:n,g:a,b:i,a:Math.round(100*Math.min(1,Math.max(0,r+t)))})},getPaletteColor:function(e){if("string"!=typeof e)throw TypeError("Expected a string as color");let t=document.createElement("div");t.className=`text-${e} invisible fixed no-pointer-events`,document.body.appendChild(t);let n=getComputedStyle(t).getPropertyValue("color");return t.remove(),Wi(Zi(n))}};let eo="rgb(255,204,204).rgb(255,230,204).rgb(255,255,204).rgb(204,255,204).rgb(204,255,230).rgb(204,255,255).rgb(204,230,255).rgb(204,204,255).rgb(230,204,255).rgb(255,204,255).rgb(255,153,153).rgb(255,204,153).rgb(255,255,153).rgb(153,255,153).rgb(153,255,204).rgb(153,255,255).rgb(153,204,255).rgb(153,153,255).rgb(204,153,255).rgb(255,153,255).rgb(255,102,102).rgb(255,179,102).rgb(255,255,102).rgb(102,255,102).rgb(102,255,179).rgb(102,255,255).rgb(102,179,255).rgb(102,102,255).rgb(179,102,255).rgb(255,102,255).rgb(255,51,51).rgb(255,153,51).rgb(255,255,51).rgb(51,255,51).rgb(51,255,153).rgb(51,255,255).rgb(51,153,255).rgb(51,51,255).rgb(153,51,255).rgb(255,51,255).rgb(255,0,0).rgb(255,128,0).rgb(255,255,0).rgb(0,255,0).rgb(0,255,128).rgb(0,255,255).rgb(0,128,255).rgb(0,0,255).rgb(128,0,255).rgb(255,0,255).rgb(245,0,0).rgb(245,123,0).rgb(245,245,0).rgb(0,245,0).rgb(0,245,123).rgb(0,245,245).rgb(0,123,245).rgb(0,0,245).rgb(123,0,245).rgb(245,0,245).rgb(214,0,0).rgb(214,108,0).rgb(214,214,0).rgb(0,214,0).rgb(0,214,108).rgb(0,214,214).rgb(0,108,214).rgb(0,0,214).rgb(108,0,214).rgb(214,0,214).rgb(163,0,0).rgb(163,82,0).rgb(163,163,0).rgb(0,163,0).rgb(0,163,82).rgb(0,163,163).rgb(0,82,163).rgb(0,0,163).rgb(82,0,163).rgb(163,0,163).rgb(92,0,0).rgb(92,46,0).rgb(92,92,0).rgb(0,92,0).rgb(0,92,46).rgb(0,92,92).rgb(0,46,92).rgb(0,0,92).rgb(46,0,92).rgb(92,0,92).rgb(255,255,255).rgb(205,205,205).rgb(178,178,178).rgb(153,153,153).rgb(127,127,127).rgb(102,102,102).rgb(76,76,76).rgb(51,51,51).rgb(25,25,25).rgb(0,0,0)".split("."),to="M5 5 h10 v10 h-10 v-10 z";var no=h({name:"QColor",props:{...Xe,...xa,modelValue:String,defaultValue:String,defaultView:{type:String,default:"spectrum",validator:e=>["spectrum","tune","palette"].includes(e)},formatModel:{type:String,default:"auto",validator:e=>["auto","hex","rgb","hexa","rgba"].includes(e)},palette:Array,noHeader:Boolean,noHeaderTabs:Boolean,noFooter:Boolean,square:Boolean,flat:Boolean,bordered:Boolean,disable:Boolean,readonly:Boolean},emits:["update:modelValue","change"],setup(t,{emit:n}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:i}=a,o=et(t,i),{getCache:r}=qa(),s=(0,e.ref)(null),l=(0,e.ref)(null),u=(0,e.computed)(()=>"auto"===t.formatModel?null:-1!==t.formatModel.indexOf("hex")),c=(0,e.computed)(()=>"auto"===t.formatModel?null:-1!==t.formatModel.indexOf("a")),d=(0,e.ref)("auto"===t.formatModel?void 0===t.modelValue||null===t.modelValue||""===t.modelValue||t.modelValue.startsWith("#")?"hex":"rgb":t.formatModel.startsWith("hex")?"hex":"rgb"),h=(0,e.ref)(t.defaultView),p=(0,e.ref)(A(t.modelValue||t.defaultValue)),f=(0,e.computed)(()=>!0!==t.disable&&!0!==t.readonly),m=(0,e.computed)(()=>void 0===t.modelValue||null===t.modelValue||""===t.modelValue||t.modelValue.startsWith("#")),_=(0,e.computed)(()=>null===u.value?m.value:u.value),g=Ca((0,e.computed)(()=>({type:"hidden",name:t.name,value:p.value[!0===_.value?"hex":"rgb"]}))),v=(0,e.computed)(()=>null===c.value?void 0!==p.value.a:c.value),b=(0,e.computed)(()=>({backgroundColor:p.value.rgb||"#000"})),w=(0,e.computed)(()=>"q-color-picker__header-content q-color-picker__header-content--"+(void 0!==p.value.a&&p.value.a<65||Ji(p.value)>.4?"light":"dark")),k=(0,e.computed)(()=>({background:`hsl(${p.value.h},100%,50%)`})),x=(0,e.computed)(()=>({top:100-p.value.v+"%",[!0===i.lang.rtl?"right":"left"]:`${p.value.s}%`})),S=(0,e.computed)(()=>void 0!==t.palette&&0!==t.palette.length?t.palette:eo),C=(0,e.computed)(()=>"q-color-picker"+(!0===t.bordered?" q-color-picker--bordered":"")+(!0===t.square?" q-color-picker--square no-border-radius":"")+(!0===t.flat?" q-color-picker--flat no-shadow":"")+(!0===t.disable?" disabled":"")+(!0===o.value?" q-color-picker--dark q-dark":"")),T=(0,e.computed)(()=>!0===t.disable?{"aria-disabled":"true"}:{}),P=(0,e.computed)(()=>[[fi,I,void 0,{prevent:!0,stop:!0,mouse:!0}]]);function E(e,t){p.value.hex=Wi(e),p.value.rgb=Gi(e),p.value.r=e.r,p.value.g=e.g,p.value.b=e.b,p.value.a=e.a;let a=p.value[!0===_.value?"hex":"rgb"];n("update:modelValue",a),!0===t&&n("change",a)}function A(e){let n=void 0===c.value?"auto"===t.formatModel?null:-1!==t.formatModel.indexOf("a"):c.value;if("string"!=typeof e||0===e.length||!0!==Vi.anyColor(e.replace(/ /g,"")))return{h:0,s:0,v:0,r:0,g:0,b:0,a:!0===n?100:void 0,hex:void 0,rgb:void 0};let a=Zi(e);return!0===n&&void 0===a.a&&(a.a=100),a.hex=Wi(a),a.rgb=Gi(a),Object.assign(a,Qi(a))}function L(e,t,n){let a=s.value;if(null===a)return;let o=a.clientWidth,r=a.clientHeight,l=a.getBoundingClientRect(),u=Math.min(o,Math.max(0,e-l.left));!0===i.lang.rtl&&(u=o-u);let c=Math.min(r,Math.max(0,t-l.top)),d=Math.round(100*u/o),h=Math.round(100*Math.max(0,Math.min(1,-c/r+1))),f=Yi({h:p.value.h,s:d,v:h,a:!0===v.value?p.value.a:void 0});p.value.s=d,p.value.v=h,E(f,n)}function M(e,t){let n=Math.round(e),a=Yi({h:n,s:p.value.s,v:p.value.v,a:!0===v.value?p.value.a:void 0});p.value.h=n,E(a,t)}function R(e){M(e,!0)}function z(t,n,i,o,r){if(void 0!==o&&y(o),!/^[0-9]+$/.test(t))return void(!0===r&&a.$forceUpdate());let s=Math.floor(Number(t));if(s<0||s>i)return void(!0===r&&a.$forceUpdate());let l={r:"r"===n?s:p.value.r,g:"g"===n?s:p.value.g,b:"b"===n?s:p.value.b,a:!0===v.value?"a"===n?s:p.value.a:void 0};if("a"!==n){let e=Qi(l);p.value.h=e.h,p.value.s=e.s,p.value.v=e.v}if(E(l,r),!0!==r&&void 0!==o?.target.selectionEnd){let t=o.target.selectionEnd;(0,e.nextTick)(()=>{o.target.setSelectionRange(t,t)})}}function O(t,n){let a,i=t.target.value;if(y(t),"hex"===d.value){if(i.length!==(!0===v.value?9:7)||!/^#[0-9A-Fa-f]+$/.test(i))return!0;a=Ki(i)}else{let e;if(!i.endsWith(")"))return!0;if(!0!==v.value&&i.startsWith("rgb(")){if(e=i.substring(4,i.length-1).split(",").map(e=>parseInt(e,10)),3!==e.length||!/^rgb\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3}\)$/.test(i))return!0}else{if(!0!==v.value||!i.startsWith("rgba("))return!0;{if(e=i.substring(5,i.length-1).split(","),4!==e.length||!/^rgba\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},(0|0\.[0-9]+[1-9]|0\.[1-9]+|1)\)$/.test(i))return!0;for(let t=0;t<3;t++){let n=parseInt(e[t],10);if(n<0||n>255)return!0;e[t]=n}let t=parseFloat(e[3]);if(t<0||t>1)return!0;e[3]=t}}if(e[0]<0||e[0]>255||e[1]<0||e[1]>255||e[2]<0||e[2]>255||!0===v.value&&(e[3]<0||e[3]>1))return!0;a={r:e[0],g:e[1],b:e[2],a:!0===v.value?100*e[3]:void 0}}let o=Qi(a);if(p.value.h=o.h,p.value.s=o.s,p.value.v=o.v,E(a,n),!0!==n){let n=t.target.selectionEnd;(0,e.nextTick)(()=>{t.target.setSelectionRange(n,n)})}}function I(e){e.isFinal?L(e.position.left,e.position.top,!0):N(e)}(0,e.watch)(()=>t.modelValue,e=>{let n=A(e||t.defaultValue);n.hex!==p.value.hex&&(p.value=n)}),(0,e.watch)(()=>t.defaultValue,e=>{if(!t.modelValue&&e){let t=A(e);t.hex!==p.value.hex&&(p.value=t)}});let N=Mt(e=>{L(e.position.left,e.position.top)},20);function D(e){L(e.pageX-window.pageXOffset,e.pageY-window.pageYOffset,!0)}function q(e){L(e.pageX-window.pageXOffset,e.pageY-window.pageYOffset)}function j(e){null!==l.value&&(l.value.$el.style.opacity=+!!e)}function B(e){d.value=e}function F(e){h.value=e}function $(){let t={ref:s,class:"q-color-picker__spectrum non-selectable relative-position cursor-pointer"+(!0===f.value?"":" readonly"),style:k.value,...!0===f.value?{onClick:D,onMousedown:q}:{}},n=[(0,e.h)("div",{style:{paddingBottom:"100%"}}),(0,e.h)("div",{class:"q-color-picker__spectrum-white absolute-full"}),(0,e.h)("div",{class:"q-color-picker__spectrum-black absolute-full"}),(0,e.h)("div",{class:"absolute",style:x.value},[void 0===p.value.hex?null:(0,e.h)("div",{class:"q-color-picker__spectrum-circle"})])],a=[(0,e.h)(ki,{class:"q-color-picker__hue non-selectable",modelValue:p.value.h,min:0,max:360,trackSize:"8px",innerTrackColor:"transparent",selectionColor:"transparent",readonly:!0!==f.value,thumbPath:to,"onUpdate:modelValue":M,onChange:R})];return!0===v.value&&a.push((0,e.h)(ki,{class:"q-color-picker__alpha non-selectable",modelValue:p.value.a,min:0,max:100,trackSize:"8px",trackColor:"white",innerTrackColor:"transparent",selectionColor:"transparent",trackImg:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAH0lEQVQoU2NkYGAwZkAFZ5G5jPRRgOYEVDeB3EBjBQBOZwTVugIGyAAAAABJRU5ErkJggg==",readonly:!0!==f.value,hideSelection:!0,thumbPath:to,...r("alphaSlide",{"onUpdate:modelValue":e=>z(e,"a",100),onChange:e=>z(e,"a",100,void 0,!0)})})),[Oe("div",t,n,"spec",f.value,()=>P.value),(0,e.h)("div",{class:"q-color-picker__sliders"},a)]}function V(){return[(0,e.h)("div",{class:"row items-center no-wrap"},[(0,e.h)("div","R"),(0,e.h)(ki,{modelValue:p.value.r,min:0,max:255,color:"red",dark:o.value,readonly:!0!==f.value,...r("rSlide",{"onUpdate:modelValue":e=>z(e,"r",255),onChange:e=>z(e,"r",255,void 0,!0)})}),(0,e.h)("input",{value:p.value.r,maxlength:3,readonly:!0!==f.value,onChange:y,...r("rIn",{onInput:e=>z(e.target.value,"r",255,e),onBlur:e=>z(e.target.value,"r",255,e,!0)})})]),(0,e.h)("div",{class:"row items-center no-wrap"},[(0,e.h)("div","G"),(0,e.h)(ki,{modelValue:p.value.g,min:0,max:255,color:"green",dark:o.value,readonly:!0!==f.value,...r("gSlide",{"onUpdate:modelValue":e=>z(e,"g",255),onChange:e=>z(e,"g",255,void 0,!0)})}),(0,e.h)("input",{value:p.value.g,maxlength:3,readonly:!0!==f.value,onChange:y,...r("gIn",{onInput:e=>z(e.target.value,"g",255,e),onBlur:e=>z(e.target.value,"g",255,e,!0)})})]),(0,e.h)("div",{class:"row items-center no-wrap"},[(0,e.h)("div","B"),(0,e.h)(ki,{modelValue:p.value.b,min:0,max:255,color:"blue",readonly:!0!==f.value,dark:o.value,...r("bSlide",{"onUpdate:modelValue":e=>z(e,"b",255),onChange:e=>z(e,"b",255,void 0,!0)})}),(0,e.h)("input",{value:p.value.b,maxlength:3,readonly:!0!==f.value,onChange:y,...r("bIn",{onInput:e=>z(e.target.value,"b",255,e),onBlur:e=>z(e.target.value,"b",255,e,!0)})})]),!0===v.value?(0,e.h)("div",{class:"row items-center no-wrap"},[(0,e.h)("div","A"),(0,e.h)(ki,{modelValue:p.value.a,color:"grey",readonly:!0!==f.value,dark:o.value,...r("aSlide",{"onUpdate:modelValue":e=>z(e,"a",100),onChange:e=>z(e,"a",100,void 0,!0)})}),(0,e.h)("input",{value:p.value.a,maxlength:3,readonly:!0!==f.value,onChange:y,...r("aIn",{onInput:e=>z(e.target.value,"a",100,e),onBlur:e=>z(e.target.value,"a",100,e,!0)})})]):null]}function U(){return[(0,e.h)("div",{class:"row items-center q-color-picker__palette-rows"+(!0===f.value?" q-color-picker__palette-rows--editable":"")},S.value.map(t=>(0,e.h)("div",{class:"q-color-picker__cube col-auto",style:{backgroundColor:t},...!0===f.value?r("palette#"+t,{onClick:()=>{!function(e){let t=A(e),n={r:t.r,g:t.g,b:t.b,a:t.a};void 0===n.a&&(n.a=p.value.a),p.value.h=t.h,p.value.s=t.s,p.value.v=t.v,E(n,!0)}(t)}}):{}})))]}return()=>{let n=[(0,e.h)(Ni,{modelValue:h.value,animated:!0},()=>[(0,e.h)(Di,{class:"q-color-picker__spectrum-tab overflow-hidden",name:"spectrum"},$),(0,e.h)(Di,{class:"q-pa-md q-color-picker__tune-tab",name:"tune"},V),(0,e.h)(Di,{class:"q-color-picker__palette-tab",name:"palette"},U)])];return void 0!==t.name&&!0!==t.disable&&g(n,"push"),!0!==t.noHeader&&n.unshift(function(){let n=[];return!0!==t.noHeaderTabs&&n.push((0,e.h)(Li,{class:"q-color-picker__header-tabs",modelValue:d.value,dense:!0,align:"justify","onUpdate:modelValue":B},()=>[(0,e.h)(Ii,{label:"HEX"+(!0===v.value?"A":""),name:"hex",ripple:!1}),(0,e.h)(Ii,{label:"RGB"+(!0===v.value?"A":""),name:"rgb",ripple:!1})])),n.push((0,e.h)("div",{class:"q-color-picker__header-banner row flex-center no-wrap"},[(0,e.h)("input",{class:"fit",value:p.value[d.value],...!0===f.value?{}:{readonly:!0},...r("topIn",{onInput:e=>{j(!0===O(e))},onChange:y,onBlur:e=>{!0===O(e,!0)&&a.$forceUpdate(),j(!1)}})}),(0,e.h)(Ye,{ref:l,class:"q-color-picker__error-icon absolute no-pointer-events",name:i.iconSet.type.negative})])),(0,e.h)("div",{class:"q-color-picker__header relative-position overflow-hidden"},[(0,e.h)("div",{class:"q-color-picker__header-bg absolute-full"}),(0,e.h)("div",{class:w.value,style:b.value},n)])}()),!0!==t.noFooter&&n.push((0,e.h)("div",{class:"q-color-picker__footer relative-position overflow-hidden"},[(0,e.h)(Li,{class:"absolute-full",modelValue:h.value,dense:!0,align:"justify","onUpdate:modelValue":F},()=>[(0,e.h)(Ii,{icon:i.iconSet.colorPicker.spectrum,name:"spectrum",ripple:!1}),(0,e.h)(Ii,{icon:i.iconSet.colorPicker.tune,name:"tune",ripple:!1}),(0,e.h)(Ii,{icon:i.iconSet.colorPicker.palette,name:"palette",ripple:!1})])])),(0,e.h)("div",{class:C.value,...T.value},n)}}});let ao=[-61,9,38,199,426,686,756,818,1111,1181,1210,1635,2060,2097,2192,2262,2324,2394,2456,3178];function io(e,t,n){return"[object Date]"===Object.prototype.toString.call(e)&&(n=e.getDate(),t=e.getMonth()+1,e=e.getFullYear()),function(e){let t,n,a,i=co(e).gy,o=i-621,r=lo(o,!1);if(a=e-uo(i,3,r.march),a>=0){if(a<=185)return n=1+ho(a,31),t=po(a,31)+1,{jy:o,jm:n,jd:t};a-=186}else--o,a+=179,1===r.leap&&(a+=1);return n=7+ho(a,30),t=po(a,30)+1,{jy:o,jm:n,jd:t}}(uo(e,t,n))}function oo(e,t,n){return co(function(e,t,n){let a=lo(e,!0);return uo(a.gy,3,a.march)+31*(t-1)-ho(t,7)*(t-7)+n-1}(e,t,n))}function ro(e){return 0===function(e){let t,n,a,i,o,r=ao.length,s=ao[0];if(e=ao[r-1])throw Error("Invalid Jalaali year "+e);for(o=1;o=ao[s-1])throw Error("Invalid Jalaali year "+e);for(r=1;rfo.includes(e),default:"gregorian"},landscape:Boolean,color:String,textColor:String,square:Boolean,flat:Boolean,bordered:Boolean,readonly:Boolean,disable:Boolean},_o=["update:modelValue"];function go(e){return e.year+"/"+be(e.month)+"/"+be(e.day)}function vo(t,n){let a=(0,e.computed)(()=>!0!==t.disable&&!0!==t.readonly),i=(0,e.computed)(()=>!0===a.value?0:-1),o=(0,e.computed)(()=>{let e=[];return void 0!==t.color&&e.push(`bg-${t.color}`),void 0!==t.textColor&&e.push(`text-${t.textColor}`),e.join(" ")});return{editable:a,tabindex:i,headerClass:o,getLocale:function(){return void 0===t.locale?n.lang.date:{...n.lang.date,...t.locale}},getCurrentDate:function(e){let n=new Date,a=!0===e?null:0;if("persian"===t.calendar){let e=io(n);return{year:e.jy,month:e.jm,day:e.jd}}return{year:n.getFullYear(),month:n.getMonth()+1,day:n.getDate(),hour:a,minute:a,second:a,millisecond:a}}}}let bo=864e5,yo=6e4,wo="YYYY-MM-DDTHH:mm:ss.SSSZ",ko=/\[((?:[^\]\\]|\\]|\\)*)\]|do|d{1,4}|Mo|M{1,4}|m{1,2}|wo|w{1,2}|Qo|Do|DDDo|D{1,4}|YY(?:YY)?|H{1,2}|h{1,2}|s{1,2}|S{1,3}|Z{1,2}|a{1,2}|[AQExX]/g,xo=/(\[[^\]]*\])|do|d{1,4}|Mo|M{1,4}|m{1,2}|wo|w{1,2}|Qo|Do|DDDo|D{1,4}|YY(?:YY)?|H{1,2}|h{1,2}|s{1,2}|S{1,3}|Z{1,2}|a{1,2}|[AQExX]|([.*+:?^,\s${}()|\\]+)/g,So={};function Co(e,t){return void 0===e?void 0===t?V.date:t.date:e}function To(e,t=""){let n=e>0?"-":"+",a=Math.abs(e),i=a%60;return n+be(Math.floor(a/60))+t+be(i)}function Po(e,t,n){let a=Eo(t),i=new Date(e),o=void 0!==a.year||void 0!==a.month||void 0!==a.date?function(e,t,n){let a=e.getFullYear(),i=e.getMonth(),o=e.getDate();return void 0!==t.year&&(a+=n*t.year,delete t.year),void 0!==t.month&&(i+=n*t.month,delete t.month),e.setDate(1),e.setMonth(2),e.setFullYear(a),e.setMonth(i),e.setDate(Math.min(o,Do(e))),void 0!==t.date&&(e.setDate(e.getDate()+n*t.date),delete t.date),e}(i,a,n):i;for(let e in a){let t=_e(e);o[`set${t}`](o[`get${t}`]()+n*a[e])}return o}function Eo(e){let t={...e};return void 0!==e.years&&(t.year=e.years,delete t.years),void 0!==e.months&&(t.month=e.months,delete t.months),void 0!==e.days&&(t.date=e.days,delete t.days),void 0!==e.day&&(t.date=e.day,delete t.day),void 0!==e.hour&&(t.hours=e.hour,delete t.hour),void 0!==e.minute&&(t.minutes=e.minute,delete t.minute),void 0!==e.second&&(t.seconds=e.second,delete t.second),void 0!==e.millisecond&&(t.milliseconds=e.millisecond,delete t.millisecond),t}function Ao(e,t,n){let a=Eo(t),i=!0===n?"UTC":"",o=new Date(e),r=void 0!==a.year||void 0!==a.month||void 0!==a.date?function(e,t,n){let a=void 0===t.year?e[`get${n}FullYear`]():t.year,i=void 0===t.month?e[`get${n}Month`]():t.month-1,o=new Date(a,i+1,0).getDate(),r=Math.min(o,void 0===t.date?e[`get${n}Date`]():t.date);return e[`set${n}Date`](1),e[`set${n}Month`](2),e[`set${n}FullYear`](a),e[`set${n}Month`](i),e[`set${n}Date`](r),delete t.year,delete t.month,delete t.date,e}(o,a,i):o;for(let e in a)r[`set${i}${e.charAt(0).toUpperCase()+e.slice(1)}`](a[e]);return r}function Lo(e,t,n,a,i){let o={year:null,month:null,day:null,hour:null,minute:null,second:null,millisecond:null,timezoneOffset:null,dateHash:null,timeHash:null};if(void 0!==i&&Object.assign(o,i),null==e||""===e||"string"!=typeof e)return o;void 0===t&&(t=wo);let r=Co(n,H.props),s=r.months,l=r.monthsShort,{regex:u,map:c}=function(e,t){let n="("+t.days.join("|")+")",a=e+n;if(void 0!==So[a])return So[a];let i="("+t.daysShort.join("|")+")",o="("+t.months.join("|")+")",r="("+t.monthsShort.join("|")+")",s={},l=0,u=e.replace(xo,e=>{switch(l++,e){case"YY":return s.YY=l,"(-?\\d{1,2})";case"YYYY":return s.YYYY=l,"(-?\\d{1,4})";case"M":return s.M=l,"(\\d{1,2})";case"Mo":return s.M=l++,"(\\d{1,2}(st|nd|rd|th))";case"MM":return s.M=l,"(\\d{2})";case"MMM":return s.MMM=l,r;case"MMMM":return s.MMMM=l,o;case"D":return s.D=l,"(\\d{1,2})";case"Do":return s.D=l++,"(\\d{1,2}(st|nd|rd|th))";case"DD":return s.D=l,"(\\d{2})";case"H":return s.H=l,"(\\d{1,2})";case"HH":return s.H=l,"(\\d{2})";case"h":return s.h=l,"(\\d{1,2})";case"hh":return s.h=l,"(\\d{2})";case"m":return s.m=l,"(\\d{1,2})";case"mm":return s.m=l,"(\\d{2})";case"s":return s.s=l,"(\\d{1,2})";case"ss":return s.s=l,"(\\d{2})";case"S":return s.S=l,"(\\d{1})";case"SS":return s.S=l,"(\\d{2})";case"SSS":return s.S=l,"(\\d{3})";case"A":return s.A=l,"(AM|PM)";case"a":return s.a=l,"(am|pm)";case"aa":return s.aa=l,"(a\\.m\\.|p\\.m\\.)";case"ddd":return i;case"dddd":return n;case"Q":case"d":case"E":return"(\\d{1})";case"do":return l++,"(\\d{1}(st|nd|rd|th))";case"Qo":return"(1st|2nd|3rd|4th)";case"DDD":case"DDDD":return"(\\d{1,3})";case"DDDo":return l++,"(\\d{1,3}(st|nd|rd|th))";case"w":return"(\\d{1,2})";case"wo":return l++,"(\\d{1,2}(st|nd|rd|th))";case"ww":return"(\\d{2})";case"Z":return s.Z=l,"(Z|[+-]\\d{2}:\\d{2})";case"ZZ":return s.ZZ=l,"(Z|[+-]\\d{2}\\d{2})";case"X":return s.X=l,"(-?\\d+)";case"x":return s.x=l,"(-?\\d{4,})";default:return l--,"["===e[0]&&(e=e.substring(1,e.length-1)),e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}}),c={map:s,regex:RegExp("^"+u)};return So[a]=c,c}(t,r),d=e.match(u);if(null===d)return o;let h="";if(void 0!==c.X||void 0!==c.x){let e=parseInt(d[void 0===c.X?c.x:c.X],10);if(!0===isNaN(e)||e<0)return o;let t=new Date(e*(void 0===c.X?1:1e3));o.year=t.getFullYear(),o.month=t.getMonth()+1,o.day=t.getDate(),o.hour=t.getHours(),o.minute=t.getMinutes(),o.second=t.getSeconds(),o.millisecond=t.getMilliseconds()}else{if(void 0!==c.YYYY)o.year=parseInt(d[c.YYYY],10);else if(void 0!==c.YY){let e=parseInt(d[c.YY],10);o.year=e<0?e:2e3+e}if(void 0!==c.M){if(o.month=parseInt(d[c.M],10),o.month<1||o.month>12)return o}else void 0===c.MMM?void 0!==c.MMMM&&(o.month=s.indexOf(d[c.MMMM])+1):o.month=l.indexOf(d[c.MMM])+1;if(void 0!==c.D){if(o.day=parseInt(d[c.D],10),null===o.year||null===o.month||o.day<1)return o;let e="persian"===a?so(o.year,o.month):new Date(o.year,o.month,0).getDate();if(o.day>e)return o}void 0===c.H?void 0!==c.h&&(o.hour=parseInt(d[c.h],10)%12,(c.A&&"PM"===d[c.A]||c.a&&"pm"===d[c.a]||c.aa&&"p.m."===d[c.aa])&&(o.hour+=12),o.hour%=24):o.hour=parseInt(d[c.H],10)%24,void 0!==c.m&&(o.minute=parseInt(d[c.m],10)%60),void 0!==c.s&&(o.second=parseInt(d[c.s],10)%60),void 0!==c.S&&(o.millisecond=parseInt(d[c.S],10)*10**(3-d[c.S].length)),(void 0!==c.Z||void 0!==c.ZZ)&&(h=void 0===c.Z?d[c.ZZ]:d[c.Z].replace(":",""),o.timezoneOffset=("+"===h[0]?-1:1)*(60*h.slice(1,3)+Number(h.slice(3,5))))}return o.dateHash=be(o.year,4)+"/"+be(o.month)+"/"+be(o.day),o.timeHash=be(o.hour)+":"+be(o.minute)+":"+be(o.second)+h,o}function Mo(e){let t=new Date(e.getFullYear(),e.getMonth(),e.getDate());t.setDate(t.getDate()-(t.getDay()+6)%7+3);let n=new Date(t.getFullYear(),0,4);n.setDate(n.getDate()-(n.getDay()+6)%7+3);let a=t.getTimezoneOffset()-n.getTimezoneOffset();t.setHours(t.getHours()-a);let i=(t-n)/(7*bo);return 1+Math.floor(i)}function Ro(e,t){let n=new Date(e);return!0===t?function(e){return 1e4*e.getFullYear()+100*e.getMonth()+e.getDate()}(n):n.getTime()}function zo(e,t,n){let a=new Date(e),i="set"+(!0===n?"UTC":"");switch(t){case"year":case"years":a[`${i}Month`](0);case"month":case"months":a[`${i}Date`](1);case"day":case"days":case"date":a[`${i}Hours`](0);case"hour":case"hours":a[`${i}Minutes`](0);case"minute":case"minutes":a[`${i}Seconds`](0);case"second":case"seconds":a[`${i}Milliseconds`](0)}return a}function Oo(e,t,n){return(e.getTime()-e.getTimezoneOffset()*yo-(t.getTime()-t.getTimezoneOffset()*yo))/n}function Io(e,t,n="days"){let a=new Date(e),i=new Date(t);switch(n){case"years":case"year":return a.getFullYear()-i.getFullYear();case"months":case"month":return 12*(a.getFullYear()-i.getFullYear())+a.getMonth()-i.getMonth();case"days":case"day":case"date":return Oo(zo(a,"day"),zo(i,"day"),bo);case"hours":case"hour":return Oo(zo(a,"hour"),zo(i,"hour"),36e5);case"minutes":case"minute":return Oo(zo(a,"minute"),zo(i,"minute"),yo);case"seconds":case"second":return Oo(zo(a,"second"),zo(i,"second"),1e3)}}function No(e){return Io(e,zo(e,"year"),"days")+1}function Do(e){return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()}function qo(e){if(e>=11&&e<=13)return`${e}th`;switch(e%10){case 1:return`${e}st`;case 2:return`${e}nd`;case 3:return`${e}rd`}return`${e}th`}let jo={YY(e,t,n){let a=this.YYYY(e,t,n)%100;return a>=0?be(a):"-"+be(Math.abs(a))},YYYY:(e,t,n)=>n??e.getFullYear(),M:e=>e.getMonth()+1,Mo:e=>qo(e.getMonth()+1),MM:e=>be(e.getMonth()+1),MMM:(e,t)=>t.monthsShort[e.getMonth()],MMMM:(e,t)=>t.months[e.getMonth()],Q:e=>Math.ceil((e.getMonth()+1)/3),Qo(e){return qo(this.Q(e))},D:e=>e.getDate(),Do:e=>qo(e.getDate()),DD:e=>be(e.getDate()),DDD:e=>No(e),DDDo:e=>qo(No(e)),DDDD:e=>be(No(e),3),d:e=>e.getDay(),do:e=>qo(e.getDay()),dd:(e,t)=>t.days[e.getDay()].slice(0,2),ddd:(e,t)=>t.daysShort[e.getDay()],dddd:(e,t)=>t.days[e.getDay()],E:e=>e.getDay()||7,w:e=>Mo(e),wo:e=>qo(Mo(e)),ww:e=>be(Mo(e)),H:e=>e.getHours(),HH:e=>be(e.getHours()),h(e){let t=e.getHours();return 0===t?12:t>12?t%12:t},hh(e){return be(this.h(e))},m:e=>e.getMinutes(),mm:e=>be(e.getMinutes()),s:e=>e.getSeconds(),ss:e=>be(e.getSeconds()),S:e=>Math.floor(e.getMilliseconds()/100),SS:e=>be(Math.floor(e.getMilliseconds()/10)),SSS:e=>be(e.getMilliseconds(),3),A:e=>e.getHours()<12?"AM":"PM",a:e=>e.getHours()<12?"am":"pm",aa:e=>e.getHours()<12?"a.m.":"p.m.",Z:(e,t,n,a)=>To(a??e.getTimezoneOffset(),":"),ZZ:(e,t,n,a)=>To(a??e.getTimezoneOffset()),X:e=>Math.floor(e.getTime()/1e3),x:e=>e.getTime()};function Bo(e,t,n,a,i){if(0!==e&&!e||e===1/0||e===-1/0)return;let o=new Date(e);if(isNaN(o))return;void 0===t&&(t=wo);let r=Co(n,H.props);return t.replace(ko,(e,t)=>e in jo?jo[e](o,r,a,i):void 0===t?e:t.split("\\]").join("]"))}var Fo={isValid:function(e){return"number"==typeof e||!1===isNaN(Date.parse(e))},extractDate:function(e,t,n){let a=Lo(e,t,n),i=new Date(a.year,null===a.month?null:a.month-1,null===a.day?1:a.day,a.hour,a.minute,a.second,a.millisecond),o=i.getTimezoneOffset();return null===a.timezoneOffset||a.timezoneOffset===o?i:Po(i,{minutes:a.timezoneOffset-o},1)},buildDate:function(e,t){return Ao(new Date,e,t)},getDayOfWeek:function(e){let t=new Date(e).getDay();return 0===t?7:t},getWeekOfYear:Mo,isBetweenDates:function(e,t,n,a={}){let i=Ro(t,a.onlyDate),o=Ro(n,a.onlyDate),r=Ro(e,a.onlyDate);return(r>i||!0===a.inclusiveFrom&&r===i)&&(r{t=Math.max(t,new Date(e))}),new Date(t)},getMinDate:function(e){let t=new Date(e);return Array.prototype.slice.call(arguments,1).forEach(e=>{t=Math.min(t,new Date(e))}),new Date(t)},getDateDiff:Io,getDayOfYear:No,inferDateFormat:function(e){return!0===re(e)?"date":"number"==typeof e?"number":"string"},getDateBetween:function(e,t,n){let a=new Date(e);if(t){let e=new Date(t);if(ae)return e}return a},isSameDate:function(e,t,n){let a=new Date(e),i=new Date(t);if(void 0===n)return a.getTime()===i.getTime();switch(n){case"second":case"seconds":if(a.getSeconds()!==i.getSeconds())return!1;case"minute":case"minutes":if(a.getMinutes()!==i.getMinutes())return!1;case"hour":case"hours":if(a.getHours()!==i.getHours())return!1;case"day":case"days":case"date":if(a.getDate()!==i.getDate())return!1;case"month":case"months":if(a.getMonth()!==i.getMonth())return!1;case"year":case"years":if(a.getFullYear()!==i.getFullYear())return!1;break;default:throw Error(`date isSameDate unknown unit ${n}`)}return!0},daysInMonth:Do,formatDate:Bo,clone:function(e){return!0===re(e)?new Date(e.getTime()):e}};let $o=["Calendar","Years","Months"],Vo=e=>$o.includes(e),Uo=e=>/^-?[\d]+\/[0-1]\d$/.test(e),Ho=" — ";function Wo(e){return e.year+"/"+be(e.month)}var Go=h({name:"QDate",props:{...mo,...xa,...Xe,modelValue:{required:!0,validator:e=>"string"==typeof e||!0===Array.isArray(e)||Object(e)===e||null===e},multiple:Boolean,range:Boolean,title:String,subtitle:String,mask:{...mo.mask,default:"YYYY/MM/DD"},defaultYearMonth:{type:String,validator:Uo},yearsInMonthView:Boolean,events:[Array,Function],eventColor:[String,Function],emitImmediately:Boolean,options:[Array,Function],navigationMinYearMonth:{type:String,validator:Uo},navigationMaxYearMonth:{type:String,validator:Uo},noUnset:Boolean,firstDayOfWeek:[String,Number],todayBtn:Boolean,minimal:Boolean,defaultView:{type:String,default:"Calendar",validator:Vo}},emits:[..._o,"rangeStart","rangeEnd","navigation"],setup(t,{slots:n,emit:a}){let i,{proxy:o}=(0,e.getCurrentInstance)(),{$q:r}=o,s=et(t,r),{getCache:l}=qa(),{tabindex:u,headerClass:c,getLocale:d,getCurrentDate:h}=vo(t,r),p=Ca(Sa(t)),f=(0,e.ref)(null),m=(0,e.ref)(ue()),_=(0,e.ref)(d()),g=(0,e.computed)(()=>ue()),v=(0,e.computed)(()=>d()),b=(0,e.computed)(()=>h()),y=(0,e.ref)(de(m.value,_.value)),w=(0,e.ref)(t.defaultView),k=(0,e.computed)(()=>!0===r.lang.rtl?"right":"left"),x=(0,e.ref)(k.value),S=(0,e.ref)(k.value),C=y.value.year,T=(0,e.ref)(C-C%20-(C<0?20:0)),P=(0,e.ref)(null),E=(0,e.computed)(()=>{let e=!0===t.landscape?"landscape":"portrait";return`q-date q-date--${e} q-date--${e}-${!0===t.minimal?"minimal":"standard"}`+(!0===s.value?" q-date--dark q-dark":"")+(!0===t.bordered?" q-date--bordered":"")+(!0===t.square?" q-date--square no-border-radius":"")+(!0===t.flat?" q-date--flat no-shadow":"")+(!0===t.disable?" disabled":!0===t.readonly?" q-date--readonly":"")}),A=(0,e.computed)(()=>t.color||"primary"),L=(0,e.computed)(()=>t.textColor||"white"),M=(0,e.computed)(()=>!0===t.emitImmediately&&!0!==t.multiple&&!0!==t.range),R=(0,e.computed)(()=>!0===Array.isArray(t.modelValue)?t.modelValue:null!==t.modelValue&&void 0!==t.modelValue?[t.modelValue]:[]),z=(0,e.computed)(()=>R.value.filter(e=>"string"==typeof e).map(e=>ce(e,m.value,_.value)).filter(e=>null!==e.dateHash&&null!==e.day&&null!==e.month&&null!==e.year)),O=(0,e.computed)(()=>{let e=e=>ce(e,m.value,_.value);return R.value.filter(e=>!0===oe(e)&&void 0!==e.from&&void 0!==e.to).map(t=>({from:e(t.from),to:e(t.to)})).filter(e=>null!==e.from.dateHash&&null!==e.to.dateHash&&e.from.dateHash"persian"===t.calendar?e=>{let t=oo(e.year,e.month,e.day);return new Date(t.gy,t.gm-1,t.gd)}:e=>new Date(e.year,e.month-1,e.day)),N=(0,e.computed)(()=>"persian"===t.calendar?go:(e,t,n)=>Bo(new Date(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond),void 0===t?m.value:t,void 0===n?_.value:n,e.year,e.timezoneOffset)),D=(0,e.computed)(()=>z.value.length+O.value.reduce((e,t)=>e+1+Io(I.value(t.to),I.value(t.from)),0)),q=(0,e.computed)(()=>{if(void 0!==t.title&&null!==t.title&&0!==t.title.length)return t.title;if(null!==P.value){let e=P.value.init,t=I.value(e);return _.value.daysShort[t.getDay()]+", "+_.value.monthsShort[e.month-1]+" "+e.day+Ho+"?"}if(0===D.value)return Ho;if(D.value>1)return`${D.value} ${_.value.pluralDay}`;let e=z.value[0],n=I.value(e);return!0===isNaN(n.valueOf())?Ho:void 0===_.value.headerTitle?_.value.daysShort[n.getDay()]+", "+_.value.monthsShort[e.month-1]+" "+e.day:_.value.headerTitle(n,e)}),j=(0,e.computed)(()=>z.value.concat(O.value.map(e=>e.from)).sort((e,t)=>e.year-t.year||e.month-t.month)[0]),B=(0,e.computed)(()=>z.value.concat(O.value.map(e=>e.to)).sort((e,t)=>t.year-e.year||t.month-e.month)[0]),F=(0,e.computed)(()=>{if(void 0!==t.subtitle&&null!==t.subtitle&&0!==t.subtitle.length)return t.subtitle;if(0===D.value)return Ho;if(D.value>1){let e=j.value,t=B.value,n=_.value.monthsShort;return n[e.month-1]+(e.year===t.year?e.month===t.month?"":Ho+n[t.month-1]:" "+e.year+Ho+n[t.month-1]+" ")+" "+t.year}return z.value[0].year}),$=(0,e.computed)(()=>{let e=[r.iconSet.datetime.arrowLeft,r.iconSet.datetime.arrowRight];return!0===r.lang.rtl?e.reverse():e}),V=(0,e.computed)(()=>void 0===t.firstDayOfWeek?_.value.firstDayOfWeek:Number(t.firstDayOfWeek)),U=(0,e.computed)(()=>{let e=_.value.daysShort,t=V.value;return t>0?e.slice(t,7).concat(e.slice(0,t)):e}),H=(0,e.computed)(()=>{let e=y.value;return"persian"===t.calendar?so(e.year,e.month):new Date(e.year,e.month,0).getDate()}),W=(0,e.computed)(()=>"function"==typeof t.eventColor?t.eventColor:()=>t.eventColor),G=(0,e.computed)(()=>{if(void 0===t.navigationMinYearMonth)return null;let e=t.navigationMinYearMonth.split("/");return{year:parseInt(e[0],10),month:parseInt(e[1],10)}}),K=(0,e.computed)(()=>{if(void 0===t.navigationMaxYearMonth)return null;let e=t.navigationMaxYearMonth.split("/");return{year:parseInt(e[0],10),month:parseInt(e[1],10)}}),Y=(0,e.computed)(()=>{let e={month:{prev:!0,next:!0},year:{prev:!0,next:!0}};return null!==G.value&&G.value.year>=y.value.year&&(e.year.prev=!1,G.value.year===y.value.year&&G.value.month>=y.value.month&&(e.month.prev=!1)),null!==K.value&&K.value.year<=y.value.year&&(e.year.next=!1,K.value.year===y.value.year&&K.value.month<=y.value.month&&(e.month.next=!1)),e}),Q=(0,e.computed)(()=>{let e={};return z.value.forEach(t=>{let n=Wo(t);void 0===e[n]&&(e[n]=[]),e[n].push(t.day)}),e}),Z=(0,e.computed)(()=>{let e={};return O.value.forEach(t=>{let n=Wo(t.from),a=Wo(t.to);if(void 0===e[n]&&(e[n]=[]),e[n].push({from:t.from.day,to:n===a?t.to.day:void 0,range:t}),n12&&(r.year++,r.month=1)}}),e}),J=(0,e.computed)(()=>{if(null===P.value)return;let{init:e,initHash:t,final:n,finalHash:a}=P.value,[i,o]=t<=a?[e,n]:[n,e],r=Wo(i),s=Wo(o);if(r!==X.value&&s!==X.value)return;let l={};return r===X.value?(l.from=i.day,l.includeFrom=!0):l.from=1,s===X.value?(l.to=o.day,l.includeTo=!0):l.to=H.value,l}),X=(0,e.computed)(()=>Wo(y.value)),ee=(0,e.computed)(()=>{let e={};if(void 0===t.options){for(let t=1;t<=H.value;t++)e[t]=!0;return e}let n="function"==typeof t.options?t.options:e=>t.options.includes(e);for(let t=1;t<=H.value;t++)e[t]=n(X.value+"/"+be(t));return e}),te=(0,e.computed)(()=>{let e={};if(void 0===t.events)for(let t=1;t<=H.value;t++)e[t]=!1;else{let n="function"==typeof t.events?t.events:e=>t.events.includes(e);for(let t=1;t<=H.value;t++){let a=X.value+"/"+be(t);e[t]=!0===n(a)&&W.value(a)}}return e}),ne=(0,e.computed)(()=>{let e,n,{year:a,month:i}=y.value;if("persian"!==t.calendar)e=new Date(a,i-1,1),n=new Date(a,i-1,0).getDate();else{let t=oo(a,i,1);e=new Date(t.gy,t.gm-1,t.gd);let o=i-1,r=a;0===o&&(o=12,r--),n=so(r,o)}return{days:e.getDay()-V.value-1,endDay:n}}),ae=(0,e.computed)(()=>{let e=[],{days:t,endDay:n}=ne.value,a=t<0?t+7:t;if(a<6)for(let t=n-a;t<=n;t++)e.push({i:t,fill:!0});let i=e.length;for(let t=1;t<=H.value;t++){let n={i:t,event:te.value[t],classes:[]};!0===ee.value[t]&&(n.in=!0,n.flat=!0),e.push(n)}if(void 0!==Q.value[X.value]&&Q.value[X.value].forEach(t=>{let n=i+t-1;Object.assign(e[n],{selected:!0,unelevated:!0,flat:!1,color:A.value,textColor:L.value})}),void 0!==Z.value[X.value]&&Z.value[X.value].forEach(t=>{if(void 0!==t.from){let n=i+t.from-1,a=i+(t.to||H.value)-1;for(let i=n;i<=a;i++)Object.assign(e[i],{range:t.range,unelevated:!0,color:A.value,textColor:L.value});Object.assign(e[n],{rangeFrom:!0,flat:!1}),void 0!==t.to&&Object.assign(e[a],{rangeTo:!0,flat:!1})}else if(void 0!==t.to){let n=i+t.to-1;for(let a=i;a<=n;a++)Object.assign(e[a],{range:t.range,unelevated:!0,color:A.value,textColor:L.value});Object.assign(e[n],{flat:!1,rangeTo:!0})}else{let n=i+H.value-1;for(let a=i;a<=n;a++)Object.assign(e[a],{range:t.range,unelevated:!0,color:A.value,textColor:L.value})}}),void 0!==J.value){let t=i+J.value.from-1,n=i+J.value.to-1;for(let a=t;a<=n;a++)e[a].color=A.value,e[a].editRange=!0;!0===J.value.includeFrom&&(e[t].editRangeFrom=!0),!0===J.value.includeTo&&(e[n].editRangeTo=!0)}y.value.year===b.value.year&&y.value.month===b.value.month&&(e[i+b.value.day-1].today=!0);let o=e.length%7;if(o>0){let t=7-o;for(let n=1;n<=t;n++)e.push({i:n,fill:!0})}return e.forEach(e=>{let t="q-date__calendar-item ";!0===e.fill?t+="q-date__calendar-item--fill":(t+="q-date__calendar-item--"+(!0===e.in?"in":"out"),void 0!==e.range&&(t+=" q-date__range"+(!0===e.rangeTo?"-to":!0===e.rangeFrom?"-from":"")),!0===e.editRange&&(t+=` q-date__edit-range${!0===e.editRangeFrom?"-from":""}${!0===e.editRangeTo?"-to":""}`),(void 0!==e.range||!0===e.editRange)&&(t+=` text-${e.color}`)),e.classes=t}),e}),ie=(0,e.computed)(()=>!0===t.disable?{"aria-disabled":"true"}:{});function re(e){i=JSON.stringify(e)}function se(){let{year:e,month:t,day:n}=b.value,a={...y.value,year:e,month:t,day:n},i=Q.value[Wo(a)];(void 0===i||!1===i.includes(a.day))&&xe(a),le(a.year,a.month)}function le(e,t){w.value="Calendar",ge(e,t)}function ue(){return"persian"===t.calendar?"YYYY/MM/DD":t.mask}function ce(e,n,a){return Lo(e,n,a,t.calendar,{hour:0,minute:0,second:0,millisecond:0})}function de(e,n){let a=!0===Array.isArray(t.modelValue)?t.modelValue:t.modelValue?[t.modelValue]:[];if(0===a.length)return he();let i=a[a.length-1],o=ce(void 0===i.from?i:i.from,e,n);return null===o.dateHash?he():o}function he(){let e,n;if(void 0!==t.defaultYearMonth){let a=t.defaultYearMonth.split("/");e=parseInt(a[0],10),n=parseInt(a[1],10)}else{let t=void 0===b.value?h():b.value;e=t.year,n=t.month}return{year:e,month:n,day:1,hour:0,minute:0,second:0,millisecond:0,dateHash:e+"/"+be(n)+"/01"}}function pe(e){let t=y.value.year,n=Number(y.value.month)+e;13===n?(n=1,t++):0===n&&(n=12,t--),ge(t,n),!0===M.value&&ye("month")}function fe(e){ge(Number(y.value.year)+e,y.value.month),!0===M.value&&ye("year")}function me(e){ge(e,y.value.month),w.value="Years"===t.defaultView?"Months":"Calendar",!0===M.value&&ye("year")}function _e(e){return{year:e.year,month:e.month,day:e.day}}function ge(t,n,a){if(null!==G.value&&t<=G.value.year&&((n=K.value.year&&((n>K.value.month||t>K.value.year)&&(n=K.value.month),t=K.value.year),void 0!==a){let{hour:e,minute:t,second:n,millisecond:i,timezoneOffset:o,timeHash:r}=a;Object.assign(y.value,{hour:e,minute:t,second:n,millisecond:i,timezoneOffset:o,timeHash:r})}let i=t+"/"+be(n)+"/01";i!==y.value.dateHash&&(x.value=y.value.dateHash{T.value=t-t%20-(t<0?20:0),Object.assign(y.value,{year:t,month:n,day:1,dateHash:i})}))}function ve(e,n,i){let o=null!==e&&1===e.length&&!1===t.multiple?e[0]:e,{reason:r,details:s}=we(n,i);re(o),a("update:modelValue",o,r,s)}function ye(n){let i=void 0!==z.value[0]&&null!==z.value[0].dateHash?{...z.value[0]}:{...y.value};(0,e.nextTick)(()=>{i.year=y.value.year,i.month=y.value.month;let e="persian"===t.calendar?so(i.year,i.month):new Date(i.year,i.month,0).getDate();i.day=Math.min(Math.max(1,i.day),e);let o=ke(i),{details:r}=we("",i);re(o),a("update:modelValue",o,n,r)})}function we(e,t){return void 0===t.from?{reason:`${e}-day`,details:_e(t)}:{reason:`${e}-range`,details:{..._e(t.target),from:_e(t.from),to:_e(t.to)}}}function ke(e,t,n){return void 0===e.from?N.value(e,t,n):{from:N.value(e.from,t,n),to:N.value(e.to,t,n)}}function xe(e){let n;if(!0===t.multiple)if(void 0!==e.from){let t=go(e.from),a=go(e.to),i=z.value.filter(e=>e.dateHasha),o=O.value.filter(({from:e,to:n})=>n.dateHasha);n=i.concat(o).concat(e).map(e=>ke(e))}else{let t=R.value.slice();t.push(ke(e)),n=t}else n=ke(e);ve(n,"add",e)}function Se(e){if(!0===t.noUnset)return;let n=null;if(!0===t.multiple&&!0===Array.isArray(t.modelValue)){let a=ke(e);n=void 0===e.from?t.modelValue.filter(e=>e!==a):t.modelValue.filter(e=>void 0===e.from||e.from!==a.from&&e.to!==a.to),0===n.length&&(n=null)}ve(n,"remove",e)}function Ce(e,n,i){let o=z.value.concat(O.value).map(t=>ke(t,e,n)).filter(e=>void 0===e.from?null!==e.dateHash:null!==e.from.dateHash&&null!==e.to.dateHash),r=(!0===t.multiple?o:o[0])||null;re(r),a("update:modelValue",r,i)}function Te(){if(!0!==t.minimal)return(0,e.h)("div",{class:"q-date__header "+c.value},[(0,e.h)("div",{class:"relative-position"},[(0,e.h)(e.Transition,{name:"q-transition--fade"},()=>(0,e.h)("div",{key:"h-yr-"+F.value,class:"q-date__header-subtitle q-date__header-link "+("Years"===w.value?"q-date__header-link--active":"cursor-pointer"),tabindex:u.value,...l("vY",{onClick(){w.value="Years"},onKeyup(e){13===e.keyCode&&(w.value="Years")}})},[F.value]))]),(0,e.h)("div",{class:"q-date__header-title relative-position flex no-wrap"},[(0,e.h)("div",{class:"relative-position col"},[(0,e.h)(e.Transition,{name:"q-transition--fade"},()=>(0,e.h)("div",{key:"h-sub"+q.value,class:"q-date__header-title-label q-date__header-link "+("Calendar"===w.value?"q-date__header-link--active":"cursor-pointer"),tabindex:u.value,...l("vC",{onClick(){w.value="Calendar"},onKeyup(e){13===e.keyCode&&(w.value="Calendar")}})},[q.value]))]),!0===t.todayBtn?(0,e.h)(Kt,{class:"q-date__header-today self-start",icon:r.iconSet.datetime.today,"aria-label":r.lang.date.today,flat:!0,size:"sm",round:!0,tabindex:u.value,onClick:se}):null])])}function Pe({label:t,type:n,key:a,dir:i,goTo:o,boundaries:s,cls:c}){return[(0,e.h)("div",{class:"row items-center q-date__arrow"},[(0,e.h)(Kt,{round:!0,dense:!0,size:"sm",flat:!0,icon:$.value[0],"aria-label":"Years"===n?r.lang.date.prevYear:r.lang.date.prevMonth,tabindex:u.value,disable:!1===s.prev,...l("go-#"+n,{onClick(){o(-1)}})})]),(0,e.h)("div",{class:"relative-position overflow-hidden flex flex-center"+c},[(0,e.h)(e.Transition,{name:"q-transition--jump-"+i},()=>(0,e.h)("div",{key:a},[(0,e.h)(Kt,{flat:!0,dense:!0,noCaps:!0,label:t,tabindex:u.value,...l("view#"+n,{onClick:()=>{w.value=n}})})]))]),(0,e.h)("div",{class:"row items-center q-date__arrow"},[(0,e.h)(Kt,{round:!0,dense:!0,size:"sm",flat:!0,icon:$.value[1],"aria-label":"Years"===n?r.lang.date.nextYear:r.lang.date.nextMonth,tabindex:u.value,disable:!1===s.next,...l("go+#"+n,{onClick(){o(1)}})})])]}(0,e.watch)(()=>t.modelValue,e=>{if(i===JSON.stringify(e))i=0;else{let e=de(m.value,_.value);ge(e.year,e.month,e)}}),(0,e.watch)(w,()=>{null!==f.value&&!0===o.$el.contains(document.activeElement)&&f.value.focus()}),(0,e.watch)(()=>y.value.year+"|"+y.value.month,()=>{a("navigation",{year:y.value.year,month:y.value.month})}),(0,e.watch)(g,e=>{Ce(e,_.value,"mask"),m.value=e}),(0,e.watch)(v,e=>{Ce(m.value,e,"locale"),_.value=e});let Ee={Calendar:()=>[(0,e.h)("div",{key:"calendar-view",class:"q-date__view q-date__calendar"},[(0,e.h)("div",{class:"q-date__navigation row items-center no-wrap"},Pe({label:_.value.months[y.value.month-1],type:"Months",key:y.value.month,dir:x.value,goTo:pe,boundaries:Y.value.month,cls:" col"}).concat(Pe({label:y.value.year,type:"Years",key:y.value.year,dir:S.value,goTo:fe,boundaries:Y.value.year,cls:""}))),(0,e.h)("div",{class:"q-date__calendar-weekdays row items-center no-wrap"},U.value.map(t=>(0,e.h)("div",{class:"q-date__calendar-item"},[(0,e.h)("div",t)]))),(0,e.h)("div",{class:"q-date__calendar-days-container relative-position overflow-hidden"},[(0,e.h)(e.Transition,{name:"q-transition--slide-"+x.value},()=>(0,e.h)("div",{key:X.value,class:"q-date__calendar-days fit"},ae.value.map(t=>(0,e.h)("div",{class:t.classes},[!0===t.in?(0,e.h)(Kt,{class:!0===t.today?"q-date__today":"",dense:!0,flat:t.flat,unelevated:t.unelevated,color:t.color,textColor:t.textColor,label:t.i,tabindex:u.value,...l("day#"+t.i,{onClick:()=>{Ae(t.i)},onMouseover:()=>{!function(e){if(null!==P.value){let t={...y.value,day:e};Object.assign(P.value,{final:t,finalHash:go(t)})}}(t.i)}})},!1===t.event?null:()=>(0,e.h)("div",{class:"q-date__event bg-"+t.event})):(0,e.h)("div",String(t.i))]))))])])],Months(){let n=y.value.year===b.value.year,a=e=>null!==G.value&&y.value.year===G.value.year&&G.value.month>e||null!==K.value&&y.value.year===K.value.year&&K.value.month{let o=y.value.month===i+1;return(0,e.h)("div",{class:"q-date__months-item flex flex-center"},[(0,e.h)(Kt,{class:!0===n&&b.value.month===i+1?"q-date__today":null,flat:!0!==o,label:t,unelevated:o,color:!0===o?A.value:null,textColor:!0===o?L.value:null,tabindex:u.value,disable:a(i+1),...l("month#"+i,{onClick:()=>{!function(e){ge(y.value.year,e),w.value="Calendar",!0===M.value&&ye("month")}(i+1)}})})])});return!0===t.yearsInMonthView&&i.unshift((0,e.h)("div",{class:"row no-wrap full-width"},[Pe({label:y.value.year,type:"Years",key:y.value.year,dir:S.value,goTo:fe,boundaries:Y.value.year,cls:" col"})])),(0,e.h)("div",{key:"months-view",class:"q-date__view q-date__months flex flex-center"},i)},Years(){let t=T.value,n=t+20,a=[],i=e=>null!==G.value&&G.value.year>e||null!==K.value&&K.value.year{me(o)}})})]))}return(0,e.h)("div",{class:"q-date__view q-date__years flex flex-center"},[(0,e.h)("div",{class:"col-auto"},[(0,e.h)(Kt,{round:!0,dense:!0,flat:!0,icon:$.value[0],"aria-label":r.lang.date.prevRangeYears(20),tabindex:u.value,disable:i(t),...l("y-",{onClick:()=>{T.value-=20}})})]),(0,e.h)("div",{class:"q-date__years-content col self-stretch row items-center"},a),(0,e.h)("div",{class:"col-auto"},[(0,e.h)(Kt,{round:!0,dense:!0,flat:!0,icon:$.value[1],"aria-label":r.lang.date.nextRangeYears(20),tabindex:u.value,disable:i(n),...l("y+",{onClick:()=>{T.value+=20}})})])])}};function Ae(e){let n={...y.value,day:e};if(!1!==t.range)if(null===P.value){let i=ae.value.find(t=>!0!==t.fill&&t.i===e);if(!0!==t.noUnset&&void 0!==i.range)return void Se({target:n,from:i.range.from,to:i.range.to});if(!0===i.selected)return void Se(n);let o=go(n);P.value={init:n,initHash:o,final:n,finalHash:o},a("rangeStart",_e(n))}else{let e=P.value.initHash,t=go(n),i=e<=t?{from:P.value.init,to:n}:{from:n,to:P.value.init};P.value=null,xe(e===t?n:{target:n,...i}),a("rangeEnd",{from:_e(i.from),to:_e(i.to)})}else!function(e,t){(!0===Q.value[t]?.includes(e.day)?Se:xe)(e)}(n,X.value)}return Object.assign(o,{setToday:se,setView:function(e){!0===Vo(e)&&(w.value=e)},offsetCalendar:function(e,t){["month","year"].includes(e)&&("month"===e?pe:fe)(!0===t?-1:1)},setCalendarTo:le,setEditingRange:function(e,n){if(!1===t.range||!e)return void(P.value=null);let a=Object.assign({...y.value},e),i=void 0===n?a:Object.assign({...y.value},n);P.value={init:a,initHash:go(a),final:i,finalHash:go(i)},le(a.year,a.month)}}),()=>{let a=[(0,e.h)("div",{class:"q-date__content col relative-position"},[(0,e.h)(e.Transition,{name:"q-transition--fade"},Ee[w.value])])],i=Le(n.default);return void 0!==i&&a.push((0,e.h)("div",{class:"q-date__actions"},i)),void 0!==t.name&&!0!==t.disable&&p(a,"push"),(0,e.h)("div",{class:E.value,...ie.value},[Te(),(0,e.h)("div",{ref:f,class:"q-date__main col column",tabindex:-1},a)])}}});function Ko(t,n,a){let i;function o(){void 0!==i&&($.remove(i),i=void 0)}return(0,e.onBeforeUnmount)(()=>{!0===t.value&&o()}),{removeFromHistory:o,addToHistory(){i={condition:()=>!0===a.value,handler:n},$.add(i)}}}let Yo,Qo,Zo,Jo,Xo,er,tr=0,nr=!1,ar=null;function ir(e){(function(e){if(e.target===document.body||e.target.classList.contains("q-layout__backdrop"))return!0;let t=b(e),n=e.shiftKey&&!e.deltaX,a=!n&&Math.abs(e.deltaX)<=Math.abs(e.deltaY),i=n||a?e.deltaY:e.deltaX;for(let e=0;e0&&n.scrollTop+n.clientHeight===n.scrollHeight:i<0&&0===n.scrollLeft||i>0&&n.scrollLeft+n.clientWidth===n.scrollWidth}return!0})(e)&&k(e)}function or(e){e.target===document&&(document.scrollingElement.scrollTop=document.scrollingElement.scrollTop)}function rr(e){!0!==nr&&(nr=!0,requestAnimationFrame(()=>{nr=!1;let{height:t}=e.target,{clientHeight:n,scrollTop:a}=document.scrollingElement;(void 0===Zo||t!==window.innerHeight)&&(Zo=n-t,document.scrollingElement.scrollTop=a),a>Zo&&(document.scrollingElement.scrollTop-=Math.ceil((a-Zo)/8))}))}function sr(e){let t=document.body,n=void 0!==window.visualViewport;if("add"===e){let{overflowY:e,overflowX:a}=window.getComputedStyle(t);Yo=Ln(window),Qo=An(window),Jo=t.style.left,Xo=t.style.top,er=window.location.href,t.style.left=`-${Yo}px`,t.style.top=`-${Qo}px`,"hidden"!==a&&("scroll"===a||t.scrollWidth>window.innerWidth)&&t.classList.add("q-body--force-scrollbar-x"),"hidden"!==e&&("scroll"===e||t.scrollHeight>window.innerHeight)&&t.classList.add("q-body--force-scrollbar-y"),t.classList.add("q-body--prevent-scroll"),document.qScrollPrevented=!0,!0===c.is.ios&&(!0===n?(window.scrollTo(0,0),window.visualViewport.addEventListener("resize",rr,m.passiveCapture),window.visualViewport.addEventListener("scroll",rr,m.passiveCapture),window.scrollTo(0,0)):window.addEventListener("scroll",or,m.passiveCapture))}!0===c.is.desktop&&!0===c.is.mac&&window[`${e}EventListener`]("wheel",ir,m.notPassive),"remove"===e&&(!0===c.is.ios&&(!0===n?(window.visualViewport.removeEventListener("resize",rr,m.passiveCapture),window.visualViewport.removeEventListener("scroll",rr,m.passiveCapture)):window.removeEventListener("scroll",or,m.passiveCapture)),t.classList.remove("q-body--prevent-scroll"),t.classList.remove("q-body--force-scrollbar-x"),t.classList.remove("q-body--force-scrollbar-y"),document.qScrollPrevented=!1,t.style.left=Jo,t.style.top=Xo,window.location.href===er&&window.scrollTo(Yo,Qo),Zo=void 0)}function lr(e){let t="add";if(!0===e){if(tr++,null!==ar)return clearTimeout(ar),void(ar=null);if(tr>1)return}else{if(0===tr||(tr--,tr>0))return;if(t="remove",!0===c.is.ios&&!0===c.is.nativeMobile)return null!==ar&&clearTimeout(ar),void(ar=setTimeout(()=>{sr(t),ar=null},100))}sr(t)}function ur(){let e;return{preventBodyScroll(t){t!==e&&(void 0!==e||!0===t)&&(e=t,lr(t))}}}let cr=0,dr={standard:"fixed-full flex-center",top:"fixed-top justify-center",bottom:"fixed-bottom justify-center",right:"fixed-right items-center",left:"fixed-left items-center"},hr={standard:["scale","scale"],top:["slide-down","slide-up"],bottom:["slide-up","slide-down"],right:["slide-left","slide-right"],left:["slide-right","slide-left"]};var pr=h({name:"QDialog",inheritAttrs:!1,props:{...tn,...yn,transitionShow:String,transitionHide:String,persistent:Boolean,autoClose:Boolean,allowFocusOutside:Boolean,noEscDismiss:Boolean,noBackdropDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,noShake:Boolean,seamless:Boolean,maximized:Boolean,fullWidth:Boolean,fullHeight:Boolean,square:Boolean,backdropFilter:String,position:{type:String,default:"standard",validator:e=>["standard","top","bottom","left","right"].includes(e)}},emits:[...nn,"shake","click","escapeKey"],setup(t,{slots:n,emit:a,attrs:i}){let o,r,s=(0,e.getCurrentInstance)(),l=(0,e.ref)(null),u=(0,e.ref)(!1),c=(0,e.ref)(!1),d=null,h=null,p=(0,e.computed)(()=>!0!==t.persistent&&!0!==t.noRouteDismiss&&!0!==t.seamless),{preventBodyScroll:f}=ur(),{registerTimeout:m}=xn(),{registerTick:_,removeTick:g}=kn(),{transitionProps:v,transitionStyle:b}=wn(t,()=>hr[t.position][0],()=>hr[t.position][1]),y=(0,e.computed)(()=>b.value+(void 0===t.backdropFilter?"":`;backdrop-filter:${t.backdropFilter};-webkit-backdrop-filter:${t.backdropFilter}`)),{showPortal:w,hidePortal:k,portalIsAccessible:x,renderPortal:S}=bn(s,l,function(){return(0,e.h)("div",{role:"dialog","aria-modal":!0===A.value?"true":"false",...i,class:M.value},[(0,e.h)(e.Transition,{name:"q-transition--fade",appear:!0},()=>!0===A.value?(0,e.h)("div",{class:"q-dialog__backdrop fixed-full",style:y.value,"aria-hidden":"true",tabindex:-1,onClick:q}):null),(0,e.h)(e.Transition,v.value,()=>!0===u.value?(0,e.h)("div",{ref:l,class:E.value,style:b.value,tabindex:-1,...L.value},Le(n.default)):null)])},"dialog"),{hide:C}=an({showing:u,hideOnRouteChange:p,handleShow:function(e){T(),h=!1===t.noRefocus&&null!==document.activeElement?document.activeElement:null,N(t.maximized),w(),c.value=!0,!0===t.noFocus?g():(document.activeElement?.blur(),_(R)),m(()=>{if(!0===s.proxy.$q.platform.is.ios){if(!0!==t.seamless&&document.activeElement){let{top:e,bottom:t}=document.activeElement.getBoundingClientRect(),{innerHeight:n}=window,a=void 0===window.visualViewport?n:window.visualViewport.height;e>0&&t>a/2&&(document.scrollingElement.scrollTop=Math.min(document.scrollingElement.scrollHeight-a,t>=n?1/0:Math.ceil(document.scrollingElement.scrollTop+t-a/2))),document.activeElement.scrollIntoView()}r=!0,l.value.click(),r=!1}w(!0),c.value=!1,a("show",e)},t.transitionDuration)},handleHide:function(e){g(),P(),I(!0),c.value=!0,k(),null!==h&&(((0===e?.type.indexOf("key")?h.closest('[tabindex]:not([tabindex^="-"])'):void 0)||h).focus(),h=null),m(()=>{k(!0),c.value=!1,a("hide",e)},t.transitionDuration)},processOnMount:!0}),{addToHistory:T,removeFromHistory:P}=Ko(u,C,p),E=(0,e.computed)(()=>`q-dialog__inner flex no-pointer-events q-dialog__inner--${!0===t.maximized?"maximized":"minimized"} q-dialog__inner--${t.position} ${dr[t.position]}`+(!0===c.value?" q-dialog__inner--animating":"")+(!0===t.fullWidth?" q-dialog__inner--fullwidth":"")+(!0===t.fullHeight?" q-dialog__inner--fullheight":"")+(!0===t.square?" q-dialog__inner--square":"")),A=(0,e.computed)(()=>!0===u.value&&!0!==t.seamless),L=(0,e.computed)(()=>!0===t.autoClose?{onClick:D}:{}),M=(0,e.computed)(()=>["q-dialog fullscreen no-pointer-events q-dialog--"+(!0===A.value?"modal":"seamless"),i.class]);function R(e){un(()=>{let t=l.value;if(null!==t){if(void 0!==e){let n=t.querySelector(e);if(null!==n)return void n.focus({preventScroll:!0})}!0!==t.contains(document.activeElement)&&(t=t.querySelector("[autofocus][tabindex], [data-autofocus][tabindex]")||t.querySelector("[autofocus] [tabindex], [data-autofocus] [tabindex]")||t.querySelector("[autofocus], [data-autofocus]")||t,t.focus({preventScroll:!0}))}})}function z(e){e&&"function"==typeof e.focus?e.focus({preventScroll:!0}):R(),a("shake");let t=l.value;null!==t&&(t.classList.remove("q-animate--scale"),t.classList.add("q-animate--scale"),null!==d&&clearTimeout(d),d=setTimeout(()=>{d=null,null!==l.value&&(t.classList.remove("q-animate--scale"),R())},170))}function O(){!0!==t.seamless&&(!0===t.persistent||!0===t.noEscDismiss?!0!==t.maximized&&!0!==t.noShake&&z():(a("escapeKey"),C()))}function I(e){null!==d&&(clearTimeout(d),d=null),(!0===e||!0===u.value)&&(N(!1),!0!==t.seamless&&(f(!1),Zn(j),Gn(O))),!0!==e&&(h=null)}function N(e){!0===e?!0!==o&&(cr<1&&document.body.classList.add("q-body--dialog"),cr++,o=!0):!0===o&&(cr<2&&document.body.classList.remove("q-body--dialog"),cr--,o=!1)}function D(e){!0!==r&&(C(e),a("click",e))}function q(e){!0!==t.persistent&&!0!==t.noBackdropDismiss?C(e):!0!==t.noShake&&z()}function j(e){!0!==t.allowFocusOutside&&!0===x.value&&!0!==At(l.value,e.target)&&R('[tabindex]:not([tabindex="-1"])')}return(0,e.watch)(()=>t.maximized,e=>{!0===u.value&&N(e)}),(0,e.watch)(A,e=>{f(e),!0===e?(Qn(j),Wn(O)):(Zn(j),Gn(O))}),Object.assign(s.proxy,{focus:R,shake:z,__updateRefocusTarget(e){h=e||null}}),(0,e.onBeforeUnmount)(I),S}}),fr=h({name:"QDrawer",inheritAttrs:!1,props:{...tn,...Xe,side:{type:String,default:"left",validator:e=>["left","right"].includes(e)},width:{type:Number,default:300},mini:Boolean,miniToOverlay:Boolean,miniWidth:{type:Number,default:57},noMiniAnimation:Boolean,breakpoint:{type:Number,default:1023},showIfAbove:Boolean,behavior:{type:String,validator:e=>["default","desktop","mobile"].includes(e),default:"default"},bordered:Boolean,elevated:Boolean,overlay:Boolean,persistent:Boolean,noSwipeOpen:Boolean,noSwipeClose:Boolean,noSwipeBackdrop:Boolean},emits:[...nn,"onLayout","miniState"],setup(t,{slots:n,emit:a,attrs:i}){let o=(0,e.getCurrentInstance)(),{proxy:{$q:r}}=o,s=et(t,r),{preventBodyScroll:l}=ur(),{registerTimeout:u,removeTimeout:c}=xn(),d=(0,e.inject)(Q,te);if(d===te)return console.error("QDrawer needs to be child of QLayout"),te;let h,p,f=null,m=(0,e.ref)("mobile"===t.behavior||"desktop"!==t.behavior&&d.totalWidth.value<=t.breakpoint),_=(0,e.computed)(()=>!0===t.mini&&!0!==m.value),g=(0,e.computed)(()=>!0===_.value?t.miniWidth:t.width),v=(0,e.ref)(!0===t.showIfAbove&&!1===m.value||!0===t.modelValue),b=(0,e.computed)(()=>!0!==t.persistent&&(!0===m.value||!0===D.value));function y(e,t){if(S(),!1!==e&&d.animate(),Z(0),!0===m.value){let e=d.instances[z.value];!0===e?.belowBreakpoint&&e.hide(!1),J(1),!0!==d.isContainer.value&&l(!0)}else J(0),!1!==e&&X(!1);u(()=>{!1!==e&&X(!0),!0!==t&&a("show",e)},150)}function w(e,t){C(),!1!==e&&d.animate(),J(0),Z(E.value*g.value),ae(),!0===t?c():u(()=>{a("hide",e)},150)}let{show:k,hide:x}=an({showing:v,hideOnRouteChange:b,handleShow:y,handleHide:w}),{addToHistory:S,removeFromHistory:C}=Ko(v,x,b),T={belowBreakpoint:m,hide:x},P=(0,e.computed)(()=>"right"===t.side),E=(0,e.computed)(()=>(!0===r.lang.rtl?-1:1)*(!0===P.value?1:-1)),A=(0,e.ref)(0),L=(0,e.ref)(!1),M=(0,e.ref)(!1),R=(0,e.ref)(g.value*E.value),z=(0,e.computed)(()=>!0===P.value?"left":"right"),O=(0,e.computed)(()=>!0===v.value&&!1===m.value&&!1===t.overlay?!0===t.miniToOverlay?t.miniWidth:g.value:0),I=(0,e.computed)(()=>!0===t.overlay||!0===t.miniToOverlay||-1!==d.view.value.indexOf(P.value?"R":"L")||!0===r.platform.is.ios&&!0===d.isContainer.value),N=(0,e.computed)(()=>!1===t.overlay&&!0===v.value&&!1===m.value),D=(0,e.computed)(()=>!0===t.overlay&&!0===v.value&&!1===m.value),q=(0,e.computed)(()=>"fullscreen q-drawer__backdrop"+(!1===v.value&&!1===L.value?" hidden":"")),j=(0,e.computed)(()=>({backgroundColor:`rgba(0,0,0,${.4*A.value})`})),B=(0,e.computed)(()=>!0===P.value?"r"===d.rows.value.top[2]:"l"===d.rows.value.top[0]),F=(0,e.computed)(()=>!0===P.value?"r"===d.rows.value.bottom[2]:"l"===d.rows.value.bottom[0]),$=(0,e.computed)(()=>{let e={};return!0===d.header.space&&!1===B.value&&(!0===I.value?e.top=`${d.header.offset}px`:!0===d.header.space&&(e.top=`${d.header.size}px`)),!0===d.footer.space&&!1===F.value&&(!0===I.value?e.bottom=`${d.footer.offset}px`:!0===d.footer.space&&(e.bottom=`${d.footer.size}px`)),e}),V=(0,e.computed)(()=>{let e={width:`${g.value}px`,transform:`translateX(${R.value}px)`};return!0===m.value?e:Object.assign(e,$.value)}),U=(0,e.computed)(()=>"q-drawer__content fit "+(!0===d.isContainer.value?"overflow-auto":"scroll")),H=(0,e.computed)(()=>`q-drawer q-drawer--${t.side}`+(!0===M.value?" q-drawer--mini-animate":"")+(!0===t.bordered?" q-drawer--bordered":"")+(!0===s.value?" q-drawer--dark q-dark":"")+(!0===L.value?" no-transition":!0===v.value?"":" q-layout--prevent-focus")+(!0===m.value?" fixed q-drawer--on-top q-drawer--mobile q-drawer--top-padding":" q-drawer--"+(!0===_.value?"mini":"standard")+(!0===I.value||!0!==N.value?" fixed":"")+(!0===t.overlay||!0===t.miniToOverlay?" q-drawer--on-top":"")+(!0===B.value?" q-drawer--top-padding":""))),W=(0,e.computed)(()=>[[fi,ee,void 0,{[!0===r.lang.rtl?t.side:z.value]:!0,mouse:!0}]]),G=(0,e.computed)(()=>[[fi,ne,void 0,{[!0===r.lang.rtl?z.value:t.side]:!0,mouse:!0}]]),K=(0,e.computed)(()=>[[fi,ne,void 0,{[!0===r.lang.rtl?z.value:t.side]:!0,mouse:!0,mouseAllDir:!0}]]);function Y(){!function(e,t){e.value!==t&&(e.value=t)}(m,"mobile"===t.behavior||"desktop"!==t.behavior&&d.totalWidth.value<=t.breakpoint)}function Z(t){void 0===t?(0,e.nextTick)(()=>{t=!0===v.value?0:g.value,Z(E.value*t)}):(!0===d.isContainer.value&&!0===P.value&&(!0===m.value||Math.abs(t)===g.value)&&(t+=E.value*d.scrollbarWidth.value),R.value=t)}function J(e){A.value=e}function X(e){let t=!0===e?"remove":!0===d.isContainer.value?"":"add";""!==t&&document.body.classList[t]("q-body--drawer-toggle")}function ee(e){if(!1!==v.value)return;let t=g.value,n=ge(e.distance.x,0,t);if(!0===e.isFinal)return n>=Math.min(75,t)?k():(d.animate(),J(0),Z(E.value*t)),void(L.value=!1);Z((!0===r.lang.rtl?!0!==P.value:P.value)?Math.max(t-n,0):Math.min(0,n-t)),J(ge(n/t,0,1)),!0===e.isFirst&&(L.value=!0)}function ne(e){if(!0!==v.value)return;let n=g.value,a=e.direction===t.side,i=(!0===r.lang.rtl?!0!==a:a)?ge(e.distance.x,0,n):0;if(!0===e.isFinal)return Math.abs(i){!0===e?(h=v.value,!0===v.value&&x(!1)):!1===t.overlay&&"mobile"!==t.behavior&&!1!==h&&(!0===v.value?(Z(0),J(0),ae()):k(!1))}),(0,e.watch)(()=>t.side,(e,t)=>{d.instances[t]===T&&(d.instances[t]=void 0,d[t].space=!1,d[t].offset=0),d.instances[e]=T,d[e].size=g.value,d[e].space=N.value,d[e].offset=O.value}),(0,e.watch)(d.totalWidth,()=>{(!0===d.isContainer.value||!0!==document.qScrollPrevented)&&Y()}),(0,e.watch)(()=>t.behavior+t.breakpoint,Y),(0,e.watch)(d.isContainer,e=>{!0===v.value&&l(!0!==e),!0===e&&Y()}),(0,e.watch)(d.scrollbarWidth,()=>{Z(!0===v.value?0:void 0)}),(0,e.watch)(O,e=>{ie("offset",e)}),(0,e.watch)(N,e=>{a("onLayout",e),ie("space",e)}),(0,e.watch)(P,()=>{Z()}),(0,e.watch)(g,e=>{Z(),oe(t.miniToOverlay,e)}),(0,e.watch)(()=>t.miniToOverlay,e=>{oe(e,g.value)}),(0,e.watch)(()=>r.lang.rtl,()=>{Z()}),(0,e.watch)(()=>t.mini,()=>{t.noMiniAnimation||!0===t.modelValue&&(null!==f&&clearTimeout(f),o.proxy&&o.proxy.$el&&o.proxy.$el.classList.add("q-drawer--mini-animate"),M.value=!0,f=setTimeout(()=>{f=null,M.value=!1,o?.proxy?.$el?.classList.remove("q-drawer--mini-animate")},150),d.animate())}),(0,e.watch)(_,e=>{a("miniState",e)}),d.instances[t.side]=T,oe(t.miniToOverlay,g.value),ie("space",N.value),ie("offset",O.value),!0===t.showIfAbove&&!0!==t.modelValue&&!0===v.value&&void 0!==t["onUpdate:modelValue"]&&a("update:modelValue",!0),(0,e.onMounted)(()=>{a("onLayout",N.value),a("miniState",_.value),h=!0===t.showIfAbove;let n=()=>{(!0===v.value?y:w)(!1,!0)};0===d.totalWidth.value?p=(0,e.watch)(d.totalWidth,()=>{p(),p=void 0,!1===v.value&&!0===t.showIfAbove&&!1===m.value?k(!1):n()}):(0,e.nextTick)(n)}),(0,e.onBeforeUnmount)(()=>{p?.(),null!==f&&(clearTimeout(f),f=null),!0===v.value&&ae(),d.instances[t.side]===T&&(d.instances[t.side]=void 0,ie("size",0),ie("offset",0),ie("space",!1))}),()=>{let a=[];!0===m.value&&(!1===t.noSwipeOpen&&a.push((0,e.withDirectives)((0,e.h)("div",{key:"open",class:`q-drawer__opener fixed-${t.side}`,"aria-hidden":"true"}),W.value)),a.push(Oe("div",{ref:"backdrop",class:q.value,style:j.value,"aria-hidden":"true",onClick:x},void 0,"backdrop",!0!==t.noSwipeBackdrop&&!0===v.value,()=>K.value)));let o=!0===_.value&&void 0!==n.mini,r=[(0,e.h)("div",{...i,key:String(o),class:[U.value,i.class]},!0===o?n.mini():Le(n.default))];return!0===t.elevated&&!0===v.value&&r.push((0,e.h)("div",{class:"q-layout__shadow absolute-full overflow-hidden no-pointer-events"})),a.push(Oe("aside",{ref:"content",class:H.value,style:V.value},r,"contentclose",!0!==t.noSwipeClose&&!0===m.value,()=>G.value)),(0,e.h)("div",{class:"q-drawer-container"},a)}}});function mr(e,t){if(t&&e===t)return null;let n=e.nodeName.toLowerCase();if(!0===["div","li","ul","ol","blockquote"].includes(n))return e;let a=(window.getComputedStyle?window.getComputedStyle(e):e.currentStyle).display;return"block"===a||"table"===a?e:mr(e.parentNode)}function _r(e,t,n){return!(!e||e===document.body)&&(!0===n&&e===t||(t===document?document.body:t).contains(e.parentNode))}function gr(e,t,n){if(n||((n=document.createRange()).selectNode(e),n.setStart(e,0)),0===t.count)n.setEnd(e,t.count);else if(t.count>0)if(e.nodeType===Node.TEXT_NODE)e.textContent.length0&&this.savedPos\n \n \n Print - ${document.title}\n \n \n
${this.el.innerHTML}
\n \n \n `),e.print(),void e.close()}if("link"===e){let e=this.getParentAttribute("href");if(null===e){let e=this.selectWord(this.selection),t=e?e.toString():"";if(!(t.length||this.range&&this.range.cloneContents().querySelector("img")))return;this.eVm.editLinkUrl.value=vr.test(t)?t:"https://",this.save(e.getRangeAt(0)),document.execCommand("createLink",!1,this.eVm.editLinkUrl.value)}else this.eVm.editLinkUrl.value=e,this.range.selectNodeContents(this.parent),this.save();return}if("fullscreen"===e)return this.eVm.toggleFullscreen(),void n();if("viewsource"===e)return this.eVm.isViewingSource.value=!1===this.eVm.isViewingSource.value,this.eVm.setContent(this.eVm.props.modelValue),void n()}document.execCommand(e,!1,t),n()}selectWord(e){if(null===e||!0!==e.isCollapsed||void 0===e.modify)return e;let t=document.createRange();t.setStart(e.anchorNode,e.anchorOffset),t.setEnd(e.focusNode,e.focusOffset);let n=t.collapsed?["backward","forward"]:["forward","backward"];t.detach();let a=e.focusNode,i=e.focusOffset;return e.collapse(e.anchorNode,e.anchorOffset),e.modify("move",n[0],"character"),e.modify("move",n[1],"word"),e.extend(a,i),e.modify("extend",n[1],"character"),e.modify("extend",n[0],"word"),e}},yr=h({name:"QTooltip",inheritAttrs:!1,props:{...Zt,...tn,...yn,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null},transitionShow:{...yn.transitionShow,default:"jump-down"},transitionHide:{...yn.transitionHide,default:"jump-up"},anchor:{type:String,default:"bottom middle",validator:ra},self:{type:String,default:"top middle",validator:ra},offset:{type:Array,default:()=>[14,14],validator:sa},scrollTarget:Cn,delay:{type:Number,default:0},hideDelay:{type:Number,default:0},persistent:Boolean},emits:[...nn],setup(t,{slots:n,emit:a,attrs:i}){let o,r,s=(0,e.getCurrentInstance)(),{proxy:{$q:l}}=s,u=(0,e.ref)(null),c=(0,e.ref)(!1),d=(0,e.computed)(()=>ua(t.anchor,l.lang.rtl)),h=(0,e.computed)(()=>ua(t.self,l.lang.rtl)),p=(0,e.computed)(()=>!0!==t.persistent),{registerTick:f,removeTick:m}=kn(),{registerTimeout:_}=xn(),{transitionProps:g,transitionStyle:v}=wn(t),{localScrollTarget:b,changeScrollEvent:y,unconfigureScrollTarget:w}=en(t,I),{anchorEl:x,canShow:T,anchorEvents:P}=Xt({showing:c,configureAnchorEl:function(){!0===t.noParentEvent||null===x.value||S(P,"anchor",!0===l.platform.is.mobile?[[x.value,"touchstart","delayShow","passive"]]:[[x.value,"mouseenter","delayShow","passive"],[x.value,"mouseleave","delayHide","passive"]])}}),{show:E,hide:A}=an({showing:c,canShow:T,handleShow:function(n){L(),f(()=>{r=new MutationObserver(()=>O()),r.observe(u.value,{attributes:!1,childList:!0,characterData:!0,subtree:!0}),O(),I()}),void 0===o&&(o=(0,e.watch)(()=>l.screen.width+"|"+l.screen.height+"|"+t.self+"|"+t.anchor+"|"+l.lang.rtl,O)),_(()=>{L(!0),a("show",n)},t.transitionDuration)},handleHide:function(e){m(),M(),z(),_(()=>{M(!0),a("hide",e)},t.transitionDuration)},hideOnRouteChange:p,processOnMount:!0});Object.assign(P,{delayShow:function(e){if(!0===l.platform.is.mobile){Qt(),document.body.classList.add("non-selectable");let e=x.value;S(P,"tooltipTemp",["touchmove","touchcancel","touchend","click"].map(t=>[e,t,"delayHide","passiveCapture"]))}_(()=>{E(e)},t.delay)},delayHide:function(e){!0===l.platform.is.mobile&&(C(P,"tooltipTemp"),Qt(),setTimeout(()=>{document.body.classList.remove("non-selectable")},10)),_(()=>{A(e)},t.hideDelay)}});let{showPortal:L,hidePortal:M,renderPortal:R}=bn(s,u,function(){return(0,e.h)(e.Transition,g.value,N)},"tooltip");if(!0===l.platform.is.mobile){let n={anchorEl:x,innerRef:u,onClickOutside:e=>(A(e),e.target.classList.contains("q-dialog__backdrop")&&k(e),!0)};(0,e.watch)((0,e.computed)(()=>null===t.modelValue&&!0!==t.persistent&&!0===c.value),e=>{(!0===e?ia:oa)(n)}),(0,e.onBeforeUnmount)(()=>{oa(n)})}function z(){void 0!==r&&(r.disconnect(),r=void 0),void 0!==o&&(o(),o=void 0),w(),C(P,"tooltipTemp")}function O(){da({targetEl:u.value,offset:t.offset,anchorEl:x.value,anchorOrigin:d.value,selfOrigin:h.value,maxHeight:t.maxHeight,maxWidth:t.maxWidth})}function I(){if(null!==x.value||void 0!==t.scrollTarget){b.value=Pn(x.value,t.scrollTarget);let e=!0===t.noParentEvent?O:A;y(b.value,e)}}function N(){return!0===c.value?(0,e.h)("div",{...i,ref:u,class:["q-tooltip q-tooltip--style q-position-engine no-pointer-events",i.class],style:[i.style,v.value],role:"tooltip"},Le(n.default)):null}return(0,e.onBeforeUnmount)(z),Object.assign(s.proxy,{updatePosition:O}),R}}),wr=h({name:"QItem",props:{...Xe,...bt,tag:{type:String,default:"div"},active:{type:Boolean,default:null},clickable:Boolean,dense:Boolean,insetLevel:Number,tabindex:[String,Number],focused:Boolean,manualFocus:Boolean},emits:["click","keyup"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=et(t,i),{hasLink:r,linkAttrs:s,linkClass:l,linkTag:u,navigateOnClick:c}=yt(),d=(0,e.ref)(null),h=(0,e.ref)(null),p=(0,e.computed)(()=>!0===t.clickable||!0===r.value||"label"===t.tag),f=(0,e.computed)(()=>!0!==t.disable&&!0===p.value),m=(0,e.computed)(()=>"q-item q-item-type row no-wrap"+(!0===t.dense?" q-item--dense":"")+(!0===o.value?" q-item--dark":"")+(!0===r.value&&null===t.active?l.value:!0===t.active?" q-item--active"+(void 0===t.activeClass?"":` ${t.activeClass}`):"")+(!0===t.disable?" disabled":"")+(!0===f.value?" q-item--clickable q-link cursor-pointer "+(!0===t.manualFocus?"q-manual-focusable":"q-focusable q-hoverable")+(!0===t.focused?" q-manual-focusable--focused":""):"")),_=(0,e.computed)(()=>void 0===t.insetLevel?null:{["padding"+(!0===i.lang.rtl?"Right":"Left")]:16+56*t.insetLevel+"px"});function g(e){!0===f.value&&(null!==h.value&&!0!==e.qAvoidFocus&&(!0!==e.qKeyEvent&&document.activeElement===d.value?h.value.focus():document.activeElement===h.value&&d.value.focus()),c(e))}function v(e){if(!0===f.value&&!0===N(e,[13,32])){k(e),e.qKeyEvent=!0;let t=new MouseEvent("click",e);t.qKeyEvent=!0,d.value.dispatchEvent(t)}a("keyup",e)}function b(){let t=Me(n.default,[]);return!0===f.value&&t.unshift((0,e.h)("div",{class:"q-focus-helper",tabindex:-1,ref:h})),t}return()=>{let n={ref:d,class:m.value,style:_.value,role:"listitem",onClick:g,onKeyup:v};return!0===f.value?(n.tabindex=t.tabindex||"0",Object.assign(n,s.value)):!0===p.value&&(n["aria-disabled"]="true"),(0,e.h)(u.value,n,b())}}}),kr=h({name:"QItemSection",props:{avatar:Boolean,thumbnail:Boolean,side:Boolean,top:Boolean,noWrap:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>"q-item__section column q-item__section--"+(!0===t.avatar||!0===t.side||!0===t.thumbnail?"side":"main")+(!0===t.top?" q-item__section--top justify-start":" justify-center")+(!0===t.avatar?" q-item__section--avatar":"")+(!0===t.thumbnail?" q-item__section--thumbnail":"")+(!0===t.noWrap?" q-item__section--nowrap":""));return()=>(0,e.h)("div",{class:a.value},Le(n.default))}});function xr(e,t,n){t.handler?t.handler(e,n,n.caret):n.runCmd(t.cmd,t.param)}function Sr(t){return(0,e.h)("div",{class:"q-editor__toolbar-group"},t)}function Cr(t,n,a,i=!1){let o=i||"toggle"===n.type&&(n.toggled?n.toggled(t):n.cmd&&t.caret.is(n.cmd,n.param)),r=[];if(t.$q.platform.is.desktop&&(n.tip||n.htmlTip)){let t=n.key?(0,e.h)("div",[(0,e.h)("small",`(CTRL + ${String.fromCharCode(n.key)})`)]):null;r.push((0,e.h)(yr,{delay:1e3},()=>[(0,e.h)("div",n.htmlTip?{innerHTML:n.htmlTip}:n.tip),t]))}return(0,e.h)(Kt,{...t.buttonProps.value,icon:null===n.icon?void 0:n.icon,color:o?n.toggleColor||t.props.toolbarToggleColor:n.color||t.props.toolbarColor,textColor:o&&!t.props.toolbarPush?null:n.textColor||t.props.toolbarTextColor,label:n.label,"aria-label":null===n.label?n.tip:void 0,disable:!!n.disable&&("function"!=typeof n.disable||n.disable(t)),size:"sm",onClick(e){a?.(),xr(e,n,t)}},()=>r)}function Tr(t,n){let a,i,o="only-icons"===n.list,r=n.label,s=null===n.icon?void 0:n.icon;function l(){c.component.proxy.hide()}if(o)i=n.options.map(e=>{let n=void 0===e.type&&t.caret.is(e.cmd,e.param);return n&&(r=e.tip,s=null===e.icon?void 0:e.icon),Cr(t,e,l,n)}),a=t.toolbarBackgroundClass.value,i=[Sr(i)];else{let o=void 0===t.props.toolbarToggleColor?null:`text-${t.props.toolbarToggleColor}`,u=void 0===t.props.toolbarTextColor?null:`text-${t.props.toolbarTextColor}`,c="no-icons"===n.list;i=n.options.map(n=>{let a=!!n.disable&&n.disable(t),i=void 0===n.type&&t.caret.is(n.cmd,n.param);i&&(r=n.tip,s=null===n.icon?void 0:n.icon);let d=n.htmlTip;return(0,e.h)(wr,{active:i,activeClass:o,clickable:!0,disable:a,dense:!0,onClick(e){l(),!0!==e?.qAvoidFocus&&t.contentRef.value?.focus(),t.caret.restore(),xr(e,n,t)}},()=>[!0===c?null:(0,e.h)(kr,{class:i?o:u,side:!0},()=>(0,e.h)(Ye,{name:null===n.icon?void 0:n.icon})),(0,e.h)(kr,d?()=>(0,e.h)("div",{class:"text-no-wrap",innerHTML:n.htmlTip}):n.tip?()=>(0,e.h)("div",{class:"text-no-wrap"},n.tip):void 0)])}),a=[t.toolbarBackgroundClass.value,u]}let u=n.highlight&&r!==n.label,c=(0,e.h)(ka,{...t.buttonProps.value,noCaps:!0,noWrap:!0,color:u?t.props.toolbarToggleColor:t.props.toolbarColor,textColor:u&&!t.props.toolbarPush?null:t.props.toolbarTextColor,label:n.fixedLabel?n.label:r,icon:n.fixedIcon?null===n.icon?void 0:n.icon:s,contentClass:a,onShow:e=>t.emit("dropdownShow",e),onHide:e=>t.emit("dropdownHide",e),onBeforeShow:e=>t.emit("dropdownBeforeShow",e),onBeforeHide:e=>t.emit("dropdownBeforeHide",e)},()=>i);return c}function Pr(e){if(e.caret)return e.buttons.value.filter(t=>!e.isViewingSource.value||t.find(e=>"viewsource"===e.cmd)).map(t=>Sr(t.map(t=>(!e.isViewingSource.value||"viewsource"===t.cmd)&&("slot"===t.type?Le(e.slots[t.slot]):"dropdown"===t.type?Tr(e,t):Cr(e,t)))))}function Er(t){if(t.caret){let n=t.props.toolbarColor||t.props.toolbarTextColor,a=t.editLinkUrl.value,i=()=>{t.caret.restore(),a!==t.editLinkUrl.value&&document.execCommand("createLink",!1,""===a?" ":a),t.editLinkUrl.value=null};return[(0,e.h)("div",{class:`q-mx-xs text-${n}`},`${t.$q.lang.editor.url}: `),(0,e.h)("input",{key:"qedt_btm_input",class:"col q-editor__link-input",value:a,onInput:e=>{y(e),a=e.target.value},onKeydown:e=>{if(!0!==I(e))switch(e.keyCode){case 13:return w(e),i();case 27:w(e),t.caret.restore(),(!t.editLinkUrl.value||"https://"===t.editLinkUrl.value)&&document.execCommand("unlink"),t.editLinkUrl.value=null}}}),Sr([(0,e.h)(Kt,{key:"qedt_btm_rem",...t.buttonProps.value,label:t.$q.lang.label.remove,noCaps:!0,onClick:()=>{t.caret.restore(),document.execCommand("unlink"),t.editLinkUrl.value=null}}),(0,e.h)(Kt,{key:"qedt_btm_upd",...t.buttonProps.value,label:t.$q.lang.label.update,noCaps:!0,onClick:i})])]}}let Ar=/^on[A-Z]/;function Lr(){let{attrs:t,vnode:n}=(0,e.getCurrentInstance)(),a={listeners:(0,e.ref)({}),attributes:(0,e.ref)({})};function i(){let e={},i={};for(let n in t)"class"!==n&&"style"!==n&&!1===Ar.test(n)&&(e[n]=t[n]);for(let e in n.props)!0===Ar.test(e)&&(i[e]=n.props[e]);a.attributes.value=e,a.listeners.value=i}return(0,e.onBeforeUpdate)(i),i(),a}let Mr=Object.prototype.toString,Rr=Object.prototype.hasOwnProperty,zr=new Set(["Boolean","Number","String","Function","Array","Date","RegExp"].map(e=>"[object "+e+"]"));function Or(e){if(e!==Object(e)||!0===zr.has(Mr.call(e))||e.constructor&&!1===Rr.call(e,"constructor")&&!1===Rr.call(e.constructor.prototype,"isPrototypeOf"))return!1;let t;for(t in e);return void 0===t||Rr.call(e,t)}function Ir(){let e,t,n,a,i,o,r=arguments[0]||{},s=1,l=!1,u=arguments.length;for("boolean"==typeof r&&(l=r,r=arguments[1]||{},s=2),Object(r)!==r&&"function"!=typeof r&&(r={}),u===s&&(r=this,s--);s0===e.length||e.every(e=>e.length),default:()=>[["left","center","right","justify"],["bold","italic","underline","strike"],["undo","redo"]]},toolbarColor:String,toolbarBg:String,toolbarTextColor:String,toolbarToggleColor:{type:String,default:"primary"},toolbarOutline:Boolean,toolbarPush:Boolean,toolbarRounded:Boolean,paragraphTag:{type:String,validator:e=>["div","p"].includes(e),default:"div"},contentStyle:Object,contentClass:[Object,Array,String],square:Boolean,flat:Boolean,dense:Boolean},emits:[...Wa,"update:modelValue","keydown","click","focus","blur","dropdownShow","dropdownHide","dropdownBeforeShow","dropdownBeforeHide","linkShow","linkHide"],setup(t,{slots:n,emit:a}){let i,o,{proxy:r}=(0,e.getCurrentInstance)(),{$q:s}=r,l=et(t,s),{inFullscreen:u,toggleFullscreen:c}=Ga(),d=Lr(),h=(0,e.ref)(null),p=(0,e.ref)(null),f=(0,e.ref)(null),m=(0,e.ref)(!1),_=(0,e.computed)(()=>!t.readonly&&!t.disable),g=t.modelValue;document.execCommand("defaultParagraphSeparator",!1,t.paragraphTag),i=window.getComputedStyle(document.body).fontFamily;let v=(0,e.computed)(()=>t.toolbarBg?` bg-${t.toolbarBg}`:""),b=(0,e.computed)(()=>({type:"a",flat:!0!==t.toolbarOutline&&!0!==t.toolbarPush,noWrap:!0,outline:t.toolbarOutline,push:t.toolbarPush,rounded:t.toolbarRounded,dense:!0,color:t.toolbarColor,disable:!_.value,size:"sm"})),y=(0,e.computed)(()=>{let e=s.lang.editor,n=s.iconSet.editor;return{bold:{cmd:"bold",icon:n.bold,tip:e.bold,key:66},italic:{cmd:"italic",icon:n.italic,tip:e.italic,key:73},strike:{cmd:"strikeThrough",icon:n.strikethrough,tip:e.strikethrough,key:83},underline:{cmd:"underline",icon:n.underline,tip:e.underline,key:85},unordered:{cmd:"insertUnorderedList",icon:n.unorderedList,tip:e.unorderedList},ordered:{cmd:"insertOrderedList",icon:n.orderedList,tip:e.orderedList},subscript:{cmd:"subscript",icon:n.subscript,tip:e.subscript,htmlTip:"x2"},superscript:{cmd:"superscript",icon:n.superscript,tip:e.superscript,htmlTip:"x2"},link:{cmd:"link",disable:e=>e.caret&&!e.caret.can("link"),icon:n.hyperlink,tip:e.hyperlink,key:76},fullscreen:{cmd:"fullscreen",icon:n.toggleFullscreen,tip:e.toggleFullscreen,key:70},viewsource:{cmd:"viewsource",icon:n.viewSource,tip:e.viewSource},quote:{cmd:"formatBlock",param:"BLOCKQUOTE",icon:n.quote,tip:e.quote,key:81},left:{cmd:"justifyLeft",icon:n.left,tip:e.left},center:{cmd:"justifyCenter",icon:n.center,tip:e.center},right:{cmd:"justifyRight",icon:n.right,tip:e.right},justify:{cmd:"justifyFull",icon:n.justify,tip:e.justify},print:{type:"no-state",cmd:"print",icon:n.print,tip:e.print,key:80},outdent:{type:"no-state",disable:e=>e.caret&&!e.caret.can("outdent"),cmd:"outdent",icon:n.outdent,tip:e.outdent},indent:{type:"no-state",disable:e=>e.caret&&!e.caret.can("indent"),cmd:"indent",icon:n.indent,tip:e.indent},removeFormat:{type:"no-state",cmd:"removeFormat",icon:n.removeFormat,tip:e.removeFormat},hr:{type:"no-state",cmd:"insertHorizontalRule",icon:n.hr,tip:e.hr},undo:{type:"no-state",cmd:"undo",icon:n.undo,tip:e.undo,key:90},redo:{type:"no-state",cmd:"redo",icon:n.redo,tip:e.redo,key:89},h1:{cmd:"formatBlock",param:"H1",icon:n.heading1||n.heading,tip:e.heading1,htmlTip:`

${e.heading1}

`},h2:{cmd:"formatBlock",param:"H2",icon:n.heading2||n.heading,tip:e.heading2,htmlTip:`

${e.heading2}

`},h3:{cmd:"formatBlock",param:"H3",icon:n.heading3||n.heading,tip:e.heading3,htmlTip:`

${e.heading3}

`},h4:{cmd:"formatBlock",param:"H4",icon:n.heading4||n.heading,tip:e.heading4,htmlTip:`

${e.heading4}

`},h5:{cmd:"formatBlock",param:"H5",icon:n.heading5||n.heading,tip:e.heading5,htmlTip:`
${e.heading5}
`},h6:{cmd:"formatBlock",param:"H6",icon:n.heading6||n.heading,tip:e.heading6,htmlTip:`
${e.heading6}
`},p:{cmd:"formatBlock",param:t.paragraphTag,icon:n.heading,tip:e.paragraph},code:{cmd:"formatBlock",param:"PRE",icon:n.code,htmlTip:`${e.code}`},"size-1":{cmd:"fontSize",param:"1",icon:n.size1||n.size,tip:e.size1,htmlTip:`${e.size1}`},"size-2":{cmd:"fontSize",param:"2",icon:n.size2||n.size,tip:e.size2,htmlTip:`${e.size2}`},"size-3":{cmd:"fontSize",param:"3",icon:n.size3||n.size,tip:e.size3,htmlTip:`${e.size3}`},"size-4":{cmd:"fontSize",param:"4",icon:n.size4||n.size,tip:e.size4,htmlTip:`${e.size4}`},"size-5":{cmd:"fontSize",param:"5",icon:n.size5||n.size,tip:e.size5,htmlTip:`${e.size5}`},"size-6":{cmd:"fontSize",param:"6",icon:n.size6||n.size,tip:e.size6,htmlTip:`${e.size6}`},"size-7":{cmd:"fontSize",param:"7",icon:n.size7||n.size,tip:e.size7,htmlTip:`${e.size7}`}}}),w=(0,e.computed)(()=>{let e=t.definitions||{},n=t.definitions||t.fonts?Ir(!0,{},y.value,e,function(e,t,n,a={}){let i=Object.keys(a);if(0===i.length)return{};let o={default_font:{cmd:"fontName",param:e,icon:n,tip:t}};return i.forEach(e=>{let t=a[e];o[e]={cmd:"fontName",param:t,icon:n,tip:t,htmlTip:`${t}`}}),o}(i,s.lang.editor.defaultFont,s.iconSet.editor.font,t.fonts)):y.value;return t.toolbar.map(t=>t.map(t=>{if(t.options)return{type:"dropdown",icon:t.icon,label:t.label,size:"sm",dense:!0,fixedLabel:t.fixedLabel,fixedIcon:t.fixedIcon,highlight:t.highlight,list:t.list,options:t.options.map(e=>n[e])};let a=n[t];return a?"no-state"===a.type||e[t]&&(void 0===a.cmd||y.value[a.cmd]&&"no-state"===y.value[a.cmd].type)?a:Object.assign({type:"toggle"},a):{type:"slot",slot:t}}))}),x={$q:s,props:t,slots:n,emit:a,inFullscreen:u,toggleFullscreen:c,runCmd:F,isViewingSource:m,editLinkUrl:f,toolbarBackgroundClass:v,buttonProps:b,contentRef:p,buttons:w,setContent:B};(0,e.watch)(()=>t.modelValue,e=>{g!==e&&(g=e,B(e,!0))}),(0,e.watch)(f,e=>{a("link"+(e?"Show":"Hide"))});let S=(0,e.computed)(()=>t.toolbar&&0!==t.toolbar.length),C=(0,e.computed)(()=>{let e={},t=t=>{t.key&&(e[t.key]={cmd:t.cmd,param:t.param})};return w.value.forEach(e=>{e.forEach(e=>{e.options?e.options.forEach(t):t(e)})}),e}),T=(0,e.computed)(()=>u.value?t.contentStyle:[{minHeight:t.minHeight,height:t.height,maxHeight:t.maxHeight},t.contentStyle]),P=(0,e.computed)(()=>"q-editor q-editor--"+(!0===m.value?"source":"default")+(!0===t.disable?" disabled":"")+(!0===u.value?" fullscreen column":"")+(!0===t.square?" q-editor--square no-border-radius":"")+(!0===t.flat?" q-editor--flat":"")+(!0===t.dense?" q-editor--dense":"")+(!0===l.value?" q-editor--dark q-dark":"")),E=(0,e.computed)(()=>[t.contentClass,"q-editor__content",{col:u.value,"overflow-auto":u.value||t.maxHeight}]),A=(0,e.computed)(()=>!0===t.disable?{"aria-disabled":"true"}:{});function L(){if(null!==p.value){let e="inner"+(!0===m.value?"Text":"HTML"),n=p.value[e];n!==t.modelValue&&(g=n,a("update:modelValue",n))}}function M(e){if(a("keydown",e),!0!==e.ctrlKey||!0===I(e))return void $();let t=e.keyCode,n=C.value[t];if(void 0!==n){let{cmd:t,param:a}=n;k(e),F(t,a,!1)}}function R(e){$(),a("click",e)}function z(e){if(null!==p.value){let{scrollTop:e,scrollHeight:t}=p.value;o=t-e}x.caret.save(),a("blur",e)}function O(t){(0,e.nextTick)(()=>{null!==p.value&&void 0!==o&&(p.value.scrollTop=p.value.scrollHeight-o)}),a("focus",t)}function N(e){let t=h.value;if(null!==t&&!0===t.contains(e.target)&&(null===e.relatedTarget||!0!==t.contains(e.relatedTarget))){let e="inner"+(!0===m.value?"Text":"HTML");x.caret.restorePosition(p.value[e].length),$()}}function D(e){let t=h.value;null!==t&&!0===t.contains(e.target)&&(null===e.relatedTarget||!0!==t.contains(e.relatedTarget))&&(x.caret.savePosition(),$())}function q(){o=void 0}function j(){x.caret.save()}function B(e,t){if(null!==p.value){!0===t&&x.caret.savePosition();let n="inner"+(!0===m.value?"Text":"HTML");p.value[n]=e,!0===t&&(x.caret.restorePosition(p.value[n].length),$())}}function F(e,t,n=!0){V(),x.caret.restore(),x.caret.apply(e,t,()=>{V(),x.caret.save(),n&&$()})}function $(){setTimeout(()=>{f.value=null,r.$forceUpdate()},1)}function V(){un(()=>{p.value?.focus({preventScroll:!0})})}return(0,e.onMounted)(()=>{x.caret=r.caret=new br(p.value,x),B(t.modelValue),$(),document.addEventListener("selectionchange",j)}),(0,e.onBeforeUnmount)(()=>{document.removeEventListener("selectionchange",j)}),Object.assign(r,{runCmd:F,refreshToolbar:$,focus:V,getContentEl:function(){return p.value}}),()=>{let n;if(S.value){let t=[(0,e.h)("div",{key:"qedt_top",class:"q-editor__toolbar row no-wrap scroll-x"+v.value},Pr(x))];null!==f.value&&t.push((0,e.h)("div",{key:"qedt_btm",class:"q-editor__toolbar row no-wrap items-center scroll-x"+v.value},Er(x))),n=(0,e.h)("div",{key:"toolbar_ctainer",class:"q-editor__toolbars-container"},t)}return(0,e.h)("div",{ref:h,class:P.value,style:{height:!0===u.value?"100%":null},...A.value,onFocusin:N,onFocusout:D},[n,(0,e.h)("div",{ref:p,style:T.value,class:E.value,contenteditable:_.value,placeholder:t.placeholder,...d.listeners.value,onInput:L,onKeydown:M,onClick:R,onBlur:z,onFocus:O,onMousedown:q,onTouchstartPassive:q})])}}}),Dr=h({name:"QItemLabel",props:{overline:Boolean,caption:Boolean,header:Boolean,lines:[Number,String]},setup(t,{slots:n}){let a=(0,e.computed)(()=>parseInt(t.lines,10)),i=(0,e.computed)(()=>"q-item__label"+(!0===t.overline?" q-item__label--overline text-overline":"")+(!0===t.caption?" q-item__label--caption text-caption":"")+(!0===t.header?" q-item__label--header":"")+(1===a.value?" ellipsis":"")),o=(0,e.computed)(()=>void 0!==t.lines&&a.value>1?{overflow:"hidden",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":a.value}:null);return()=>(0,e.h)("div",{style:o.value,class:i.value},Le(n.default))}}),qr=h({name:"QSlideTransition",props:{appear:Boolean,duration:{type:Number,default:300}},emits:["show","hide"],setup(t,{slots:n,emit:a}){let i,o,r,s,l=!1,u=null,c=null;function d(){i?.(),i=null,l=!1,null!==u&&(clearTimeout(u),u=null),null!==c&&(clearTimeout(c),c=null),o?.removeEventListener("transitionend",r),r=null}function h(e,n,a){void 0!==n&&(e.style.height=`${n}px`),e.style.transition=`height ${t.duration}ms cubic-bezier(.25, .8, .50, 1)`,l=!0,i=a}function p(e,t){e.style.overflowY=null,e.style.height=null,e.style.transition=null,d(),t!==s&&a(t)}function f(e,n){let a=0;o=e,!0===l?(d(),a=e.offsetHeight===e.scrollHeight?0:void 0):(s="hide",e.style.overflowY="hidden"),h(e,a,n),u=setTimeout(()=>{u=null,e.style.height=`${e.scrollHeight}px`,r=t=>{c=null,(Object(t)!==t||t.target===e)&&p(e,"show")},e.addEventListener("transitionend",r),c=setTimeout(r,1.1*t.duration)},100)}function m(e,n){let a;o=e,!0===l?d():(s="show",e.style.overflowY="hidden",a=e.scrollHeight),h(e,a,n),u=setTimeout(()=>{u=null,e.style.height=0,r=t=>{c=null,(Object(t)!==t||t.target===e)&&p(e,"hide")},e.addEventListener("transitionend",r),c=setTimeout(r,1.1*t.duration)},100)}return(0,e.onBeforeUnmount)(()=>{!0===l&&d()}),()=>(0,e.h)(e.Transition,{css:!1,appear:t.appear,onEnter:f,onLeave:m},n.default)}});let jr={true:"inset",item:"item-inset","item-thumbnail":"item-thumbnail-inset"},Br={xs:2,sm:4,md:8,lg:16,xl:24};var Fr=h({name:"QSeparator",props:{...Xe,spaced:[Boolean,String],inset:[Boolean,String],vertical:Boolean,color:String,size:String},setup(t){let n=et(t,(0,e.getCurrentInstance)().proxy.$q),a=(0,e.computed)(()=>!0===t.vertical?"vertical":"horizontal"),i=(0,e.computed)(()=>` q-separator--${a.value}`),o=(0,e.computed)(()=>!1===t.inset?"":`${i.value}-${jr[t.inset]}`),r=(0,e.computed)(()=>`q-separator${i.value}${o.value}`+(void 0===t.color?"":` bg-${t.color}`)+(!0===n.value?" q-separator--dark":"")),s=(0,e.computed)(()=>{let e={};if(void 0!==t.size&&(e[!0===t.vertical?"width":"height"]=t.size),!1!==t.spaced){let n=!0===t.spaced?`${Br.md}px`:t.spaced in Br?`${Br[t.spaced]}px`:t.spaced,a=!0===t.vertical?["Left","Right"]:["Top","Bottom"];e[`margin${a[0]}`]=e[`margin${a[1]}`]=n}return e});return()=>(0,e.h)("hr",{class:r.value,style:s.value,"aria-orientation":a.value})}});let $r=(0,e.shallowReactive)({}),Vr=Object.keys(bt);var Ur=h({name:"QExpansionItem",props:{...bt,...tn,...Xe,icon:String,label:String,labelLines:[Number,String],caption:String,captionLines:[Number,String],dense:Boolean,toggleAriaLabel:String,expandIcon:String,expandedIcon:String,expandIconClass:[Array,String,Object],duration:{},headerInsetLevel:Number,contentInsetLevel:Number,expandSeparator:Boolean,defaultOpened:Boolean,hideExpandIcon:Boolean,expandIconToggle:Boolean,switchToggleSide:Boolean,denseToggle:Boolean,group:String,popup:Boolean,headerStyle:[Array,String,Object],headerClass:[Array,String,Object]},emits:[...nn,"click","afterShow","afterHide"],setup(t,{slots:n,emit:a}){let i,o,{proxy:{$q:r}}=(0,e.getCurrentInstance)(),s=et(t,r),l=(0,e.ref)(null===t.modelValue?t.defaultOpened:t.modelValue),u=(0,e.ref)(null),c=ya(),{show:d,hide:h,toggle:p}=an({showing:l}),f=(0,e.computed)(()=>`q-expansion-item q-item-type q-expansion-item--${!0===l.value?"expanded":"collapsed"} q-expansion-item--${!0===t.popup?"popup":"standard"}`),m=(0,e.computed)(()=>void 0===t.contentInsetLevel?null:{["padding"+(!0===r.lang.rtl?"Right":"Left")]:56*t.contentInsetLevel+"px"}),_=(0,e.computed)(()=>!0!==t.disable&&(void 0!==t.href||void 0!==t.to&&null!==t.to&&""!==t.to)),g=(0,e.computed)(()=>{let e={};return Vr.forEach(n=>{e[n]=t[n]}),e}),v=(0,e.computed)(()=>!0===_.value||!0!==t.expandIconToggle),b=(0,e.computed)(()=>void 0!==t.expandedIcon&&!0===l.value?t.expandedIcon:t.expandIcon||r.iconSet.expansionItem[!0===t.denseToggle?"denseIcon":"icon"]),y=(0,e.computed)(()=>!0!==t.disable&&(!0===_.value||!0===t.expandIconToggle)),w=(0,e.computed)(()=>({expanded:!0===l.value,detailsId:c.value,toggle:p,show:d,hide:h})),x=(0,e.computed)(()=>{let e=void 0===t.toggleAriaLabel?r.lang.label[!0===l.value?"collapse":"expand"](t.label):t.toggleAriaLabel;return{role:"button","aria-expanded":!0===l.value?"true":"false","aria-controls":c.value,"aria-label":e}});function S(e){!0!==_.value&&p(e),a("click",e)}function C(e){13===e.keyCode&&T(e,!0)}function T(e,t){!0!==t&&!0!==e.qAvoidFocus&&u.value?.focus(),p(e),k(e)}function P(){a("afterShow")}function E(){a("afterHide")}function A(){void 0===i&&(i=va()),!0===l.value&&($r[t.group]=i);let n=(0,e.watch)(l,e=>{!0===e?$r[t.group]=i:$r[t.group]===i&&delete $r[t.group]}),a=(0,e.watch)(()=>$r[t.group],(e,t)=>{t===i&&void 0!==e&&e!==i&&h()});o=()=>{n(),a(),$r[t.group]===i&&delete $r[t.group],o=void 0}}function L(){let a;return void 0===n.header?(a=[(0,e.h)(kr,()=>[(0,e.h)(Dr,{lines:t.labelLines},()=>t.label||""),t.caption?(0,e.h)(Dr,{lines:t.captionLines,caption:!0},()=>t.caption):null])],t.icon&&a[!0===t.switchToggleSide?"push":"unshift"]((0,e.h)(kr,{side:!0===t.switchToggleSide,avatar:!0!==t.switchToggleSide},()=>(0,e.h)(Ye,{name:t.icon})))):a=[].concat(n.header(w.value)),!0!==t.disable&&!0!==t.hideExpandIcon&&a[!0===t.switchToggleSide?"unshift":"push"](function(){let n={class:["q-focusable relative-position cursor-pointer"+(!0===t.denseToggle&&!0===t.switchToggleSide?" items-end":""),t.expandIconClass],side:!0!==t.switchToggleSide,avatar:t.switchToggleSide},a=[(0,e.h)(Ye,{class:"q-expansion-item__toggle-icon"+(void 0===t.expandedIcon&&!0===l.value?" q-expansion-item__toggle-icon--rotated":""),name:b.value})];return!0===y.value&&(Object.assign(n,{tabindex:0,...x.value,onClick:T,onKeyup:C}),a.unshift((0,e.h)("div",{ref:u,class:"q-expansion-item__toggle-focus q-icon q-focus-helper q-focus-helper--rounded",tabindex:-1}))),(0,e.h)(kr,n,()=>a)}()),a}function M(){let n={ref:"item",style:t.headerStyle,class:t.headerClass,dark:s.value,disable:t.disable,dense:t.dense,insetLevel:t.headerInsetLevel};return!0===v.value&&(n.clickable=!0,n.onClick=S,Object.assign(n,!0===_.value?g.value:x.value)),(0,e.h)(wr,n,L)}function R(){return(0,e.withDirectives)((0,e.h)("div",{key:"e-content",class:"q-expansion-item__content relative-position",style:m.value,id:c.value},Le(n.default)),[[e.vShow,l.value]])}function z(){let n=[M(),(0,e.h)(qr,{duration:t.duration,onShow:P,onHide:E},R)];return!0===t.expandSeparator&&n.push((0,e.h)(Fr,{class:"q-expansion-item__border q-expansion-item__border--top absolute-top",dark:s.value}),(0,e.h)(Fr,{class:"q-expansion-item__border q-expansion-item__border--bottom absolute-bottom",dark:s.value})),n}return(0,e.watch)(()=>t.group,e=>{o?.(),void 0!==e&&A()}),void 0!==t.group&&A(),(0,e.onBeforeUnmount)(()=>{o?.()}),()=>(0,e.h)("div",{class:f.value},[(0,e.h)("div",{class:"q-expansion-item__container relative-position"},z())])}});let Hr=["top","right","bottom","left"],Wr={type:{type:String,default:"a"},outline:Boolean,push:Boolean,flat:Boolean,unelevated:Boolean,color:String,textColor:String,glossy:Boolean,square:Boolean,padding:String,label:{type:[String,Number],default:""},labelPosition:{type:String,default:"right",validator:e=>Hr.includes(e)},externalLabel:Boolean,hideLabel:{type:Boolean},labelClass:[Array,String,Object],labelStyle:[Array,String,Object],disable:Boolean,tabindex:[Number,String]};function Gr(t,n){return{formClass:(0,e.computed)(()=>"q-fab--form-"+(!0===t.square?"square":"rounded")),stacked:(0,e.computed)(()=>!1===t.externalLabel&&["top","bottom"].includes(t.labelPosition)),labelProps:(0,e.computed)(()=>{if(!0===t.externalLabel){let e=null===t.hideLabel?!1===n.value:t.hideLabel;return{action:"push",data:{class:[t.labelClass,`q-fab__label q-tooltip--style q-fab__label--external q-fab__label--external-${t.labelPosition}`+(!0===e?" q-fab__label--external-hidden":"")],style:t.labelStyle}}}return{action:["left","top"].includes(t.labelPosition)?"unshift":"push",data:{class:[t.labelClass,`q-fab__label q-fab__label--internal q-fab__label--internal-${t.labelPosition}`+(!0===t.hideLabel?" q-fab__label--internal-hidden":"")],style:t.labelStyle}}})}}let Kr=["up","right","down","left"],Yr=["left","center","right"];var Qr=h({name:"QFab",props:{...Wr,...tn,icon:String,activeIcon:String,hideIcon:Boolean,hideLabel:{...Wr.hideLabel,default:null},direction:{type:String,default:"right",validator:e=>Kr.includes(e)},persistent:Boolean,verticalActionsAlign:{type:String,default:"center",validator:e=>Yr.includes(e)}},emits:nn,setup(t,{slots:n}){let a=(0,e.ref)(null),i=(0,e.ref)(!0===t.modelValue),o=ya(),{proxy:{$q:r}}=(0,e.getCurrentInstance)(),{formClass:s,labelProps:l}=Gr(t,i),{hide:u,toggle:c}=an({showing:i,hideOnRouteChange:(0,e.computed)(()=>!0!==t.persistent)}),d=(0,e.computed)(()=>({opened:i.value})),h=(0,e.computed)(()=>`q-fab z-fab row inline justify-center q-fab--align-${t.verticalActionsAlign} ${s.value}`+(!0===i.value?" q-fab--opened":" q-fab--closed")),p=(0,e.computed)(()=>`q-fab__actions flex no-wrap inline q-fab__actions--${t.direction} q-fab__actions--${!0===i.value?"opened":"closed"}`),f=(0,e.computed)(()=>{let e={id:o.value,role:"menu"};return!0!==i.value&&(e["aria-hidden"]="true"),e}),m=(0,e.computed)(()=>"q-fab__icon-holder q-fab__icon-holder--"+(!0===i.value?"opened":"closed"));function _(a,i){let o=n[a],s=`q-fab__${a} absolute-full`;return void 0===o?(0,e.h)(Ye,{class:s,name:t[i]||r.iconSet.fab[i]}):(0,e.h)("div",{class:s},o(d.value))}function g(){let a=[];return!0!==t.hideIcon&&a.push((0,e.h)("div",{class:m.value},[_("icon","icon"),_("active-icon","activeIcon")])),(""!==t.label||void 0!==n.label)&&a[l.value.action]((0,e.h)("div",l.value.data,void 0===n.label?[t.label]:n.label(d.value))),Re(n.tooltip,a)}return(0,e.provide)(Z,{showing:i,onChildClick(e){u(e),!0!==e?.qAvoidFocus&&a.value?.$el.focus()}}),()=>(0,e.h)("div",{class:h.value},[(0,e.h)(Kt,{ref:a,class:s.value,...t,noWrap:!0,stack:t.stacked,align:void 0,icon:void 0,label:void 0,noCaps:!0,fab:!0,"aria-expanded":!0===i.value?"true":"false","aria-haspopup":"true","aria-controls":o.value,onClick:c},g),(0,e.h)("div",{class:p.value,...f.value},Le(n.default))])}});let Zr={start:"self-end",center:"self-center",end:"self-start"},Jr=Object.keys(Zr);var Xr=h({name:"QFabAction",props:{...Wr,icon:{type:String,default:""},anchor:{type:String,validator:e=>Jr.includes(e)},to:[String,Object],replace:Boolean},emits:["click"],setup(t,{slots:n,emit:a}){let i=(0,e.inject)(Z,()=>({showing:{value:!0},onChildClick:_})),{formClass:o,labelProps:r}=Gr(t,i.showing),s=(0,e.computed)(()=>{let e=Zr[t.anchor];return o.value+(void 0===e?"":` ${e}`)}),l=(0,e.computed)(()=>!0===t.disable||!0!==i.showing.value);function u(e){i.onChildClick(e),a("click",e)}function c(){let a=[];return void 0===n.icon?""!==t.icon&&a.push((0,e.h)(Ye,{name:t.icon})):a.push(n.icon()),(""!==t.label||void 0!==n.label)&&a[r.value.action]((0,e.h)("div",r.value.data,void 0===n.label?[t.label]:n.label())),Re(n.default,a)}let d=(0,e.getCurrentInstance)();return Object.assign(d.proxy,{click:u}),()=>(0,e.h)(Kt,{class:s.value,...t,noWrap:!0,stack:t.stacked,icon:void 0,label:void 0,noCaps:!0,fabMini:!0,disable:l.value,onClick:u},c)}});function es({validate:t,resetValidation:n,requiresQForm:a}){let i=(0,e.inject)(J,!1);if(!1!==i){let{props:a,proxy:o}=(0,e.getCurrentInstance)();Object.assign(o,{validate:t,resetValidation:n}),(0,e.watch)(()=>a.disable,e=>{!0===e?("function"==typeof n&&n(),i.unbindComponent(o)):i.bindComponent(o)}),(0,e.onMounted)(()=>{!0!==a.disable&&i.bindComponent(o)}),(0,e.onBeforeUnmount)(()=>{!0!==a.disable&&i.unbindComponent(o)})}else!0===a&&console.error("Parent QForm not found on useFormChild()!")}let ts=[!0,!1,"ondemand"],ns={modelValue:{},error:{type:Boolean,default:null},errorMessage:String,noErrorIcon:Boolean,rules:Array,reactiveRules:Boolean,lazyRules:{type:[Boolean,String],default:!1,validator:e=>ts.includes(e)}};function as(t,n){let{props:i,proxy:o}=(0,e.getCurrentInstance)(),r=(0,e.ref)(!1),s=(0,e.ref)(null),l=(0,e.ref)(!1);es({validate:g,resetValidation:_});let u,c=0,d=(0,e.computed)(()=>void 0!==i.rules&&null!==i.rules&&0!==i.rules.length),h=(0,e.computed)(()=>!0!==i.disable&&!0===d.value&&!1===n.value),p=(0,e.computed)(()=>!0===i.error||!0===r.value),f=(0,e.computed)(()=>"string"==typeof i.errorMessage&&0!==i.errorMessage.length?i.errorMessage:s.value);function m(){"ondemand"!==i.lazyRules&&!0===h.value&&!0===l.value&&v()}function _(){c++,n.value=!1,l.value=!1,r.value=!1,s.value=null,v.cancel()}function g(e=i.modelValue){if(!0===i.disable||!1===d.value)return!0;let t=++c,a=!0===n.value?()=>{}:()=>{l.value=!0},o=(e,t)=>{!0===e&&a(),r.value=e,s.value=t||null,n.value=!1},u=[];for(let t=0;t{if(void 0===e||!1===Array.isArray(e)||0===e.length)return t===c&&o(!1),!0;let n=e.find(e=>!1===e||"string"==typeof e);return t===c&&o(void 0!==n,n),void 0===n},e=>(t===c&&(console.error(e),o(!0)),!1)))}(0,e.watch)(()=>i.modelValue,()=>{l.value=!0,!0===h.value&&!1===i.lazyRules&&v()}),(0,e.watch)(()=>i.reactiveRules,t=>{!0===t?void 0===u&&(u=(0,e.watch)(()=>i.rules,m,{immediate:!0,deep:!0})):void 0!==u&&(u(),u=void 0)},{immediate:!0}),(0,e.watch)(()=>i.lazyRules,m),(0,e.watch)(t,e=>{!0===e?l.value=!0:!0===h.value&&"ondemand"!==i.lazyRules&&v()});let v=P(g,0);return(0,e.onBeforeUnmount)(()=>{u?.(),v.cancel()}),Object.assign(o,{resetValidation:_,validate:g}),a(o,"hasError",()=>p.value),{isDirtyModel:l,hasRules:d,hasError:p,errorMessage:f,validate:g,resetValidation:_}}function is(e){return null!=e&&0!==String(e).length}let os={...Xe,...ns,label:String,stackLabel:Boolean,hint:String,hideHint:Boolean,prefix:String,suffix:String,labelColor:String,color:String,bgColor:String,filled:Boolean,outlined:Boolean,borderless:Boolean,standout:[Boolean,String],square:Boolean,loading:Boolean,labelSlot:Boolean,bottomSlots:Boolean,hideBottomSpace:Boolean,rounded:Boolean,dense:Boolean,itemAligned:Boolean,counter:Boolean,clearable:Boolean,clearIcon:String,disable:Boolean,readonly:Boolean,autofocus:Boolean,for:String},rs={...os,maxlength:[Number,String]},ss=["update:modelValue","clear","focus","blur"];function ls({requiredForAttr:t=!0,tagProp:n,changeEvent:a=!1}={}){let{props:i,proxy:o}=(0,e.getCurrentInstance)(),r=et(i,o.$q),s=ya({required:t,getValue:()=>i.for});return{requiredForAttr:t,changeEvent:a,tag:!0===n?(0,e.computed)(()=>i.tag):{value:"label"},isDark:r,editable:(0,e.computed)(()=>!0!==i.disable&&!0!==i.readonly),innerLoading:(0,e.ref)(!1),focused:(0,e.ref)(!1),hasPopupOpen:!1,splitAttrs:Lr(),targetUid:s,rootRef:(0,e.ref)(null),targetRef:(0,e.ref)(null),controlRef:(0,e.ref)(null)}}function us(t){let{props:n,emit:a,slots:i,attrs:o,proxy:r}=(0,e.getCurrentInstance)(),{$q:s}=r,l=null;void 0===t.hasValue&&(t.hasValue=(0,e.computed)(()=>is(n.modelValue))),void 0===t.emitValue&&(t.emitValue=e=>{a("update:modelValue",e)}),void 0===t.controlEvents&&(t.controlEvents={onFocusin:P,onFocusout:E}),Object.assign(t,{clearValue:A,onControlFocusin:P,onControlFocusout:E,focus:T}),void 0===t.computedCounter&&(t.computedCounter=(0,e.computed)(()=>{if(!1!==n.counter){let e="string"==typeof n.modelValue||"number"==typeof n.modelValue?String(n.modelValue).length:!0===Array.isArray(n.modelValue)?n.modelValue.length:0,t=void 0===n.maxlength?n.maxValues:n.maxlength;return e+(void 0===t?"":" / "+t)}}));let{isDirtyModel:u,hasRules:c,hasError:d,errorMessage:h,resetValidation:p}=as(t.focused,t.innerLoading),f=void 0===t.floatingLabel?(0,e.computed)(()=>!0===n.stackLabel||!0===t.focused.value||!0===t.hasValue.value):(0,e.computed)(()=>!0===n.stackLabel||!0===t.focused.value||!0===t.floatingLabel.value),m=(0,e.computed)(()=>!0===n.bottomSlots||void 0!==n.hint||!0===c.value||!0===n.counter||null!==n.error),_=(0,e.computed)(()=>!0===n.filled?"filled":!0===n.outlined?"outlined":!0===n.borderless?"borderless":n.standout?"standout":"standard"),g=(0,e.computed)(()=>`q-field row no-wrap items-start q-field--${_.value}`+(void 0===t.fieldClass?"":` ${t.fieldClass.value}`)+(!0===n.rounded?" q-field--rounded":"")+(!0===n.square?" q-field--square":"")+(!0===f.value?" q-field--float":"")+(!0===b.value?" q-field--labeled":"")+(!0===n.dense?" q-field--dense":"")+(!0===n.itemAligned?" q-field--item-aligned q-item-type":"")+(!0===t.isDark.value?" q-field--dark":"")+(void 0===t.getControl?" q-field--auto-height":"")+(!0===t.focused.value?" q-field--focused":"")+(!0===d.value?" q-field--error":"")+(!0===d.value||!0===t.focused.value?" q-field--highlighted":"")+(!0!==n.hideBottomSpace&&!0===m.value?" q-field--with-bottom":"")+(!0===n.disable?" q-field--disabled":!0===n.readonly?" q-field--readonly":"")),v=(0,e.computed)(()=>"q-field__control relative-position row no-wrap"+(void 0===n.bgColor?"":` bg-${n.bgColor}`)+(!0===d.value?" text-negative":"string"==typeof n.standout&&0!==n.standout.length&&!0===t.focused.value?` ${n.standout}`:void 0===n.color?"":` text-${n.color}`)),b=(0,e.computed)(()=>!0===n.labelSlot||void 0!==n.label),y=(0,e.computed)(()=>"q-field__label no-pointer-events absolute ellipsis"+(void 0!==n.labelColor&&!0!==d.value?` text-${n.labelColor}`:"")),x=(0,e.computed)(()=>({id:t.targetUid.value,editable:t.editable.value,focused:t.focused.value,floatingLabel:f.value,modelValue:n.modelValue,emitValue:t.emitValue})),S=(0,e.computed)(()=>{let e={};return t.targetUid.value&&(e.for=t.targetUid.value),!0===n.disable&&(e["aria-disabled"]="true"),e});function C(){let e=document.activeElement,n=t.targetRef?.value;n&&(null===e||e.id!==t.targetUid.value)&&(!0!==n.hasAttribute("tabindex")&&(n=n.querySelector("[tabindex]")),n!==e&&n?.focus({preventScroll:!0}))}function T(){un(C)}function P(e){null!==l&&(clearTimeout(l),l=null),!0===t.editable.value&&!1===t.focused.value&&(t.focused.value=!0,a("focus",e))}function E(e,n){null!==l&&clearTimeout(l),l=setTimeout(()=>{l=null,(!0!==document.hasFocus()||!0!==t.hasPopupOpen&&void 0!==t.controlRef&&null!==t.controlRef.value&&!1===t.controlRef.value.contains(document.activeElement))&&(!0===t.focused.value&&(t.focused.value=!1,a("blur",e)),n?.())})}function A(i){k(i),!0===s.platform.is.mobile?!0===t.rootRef.value.contains(document.activeElement)&&document.activeElement.blur():(t.targetRef?.value||t.rootRef.value).focus(),"file"===n.type&&(t.inputRef.value.value=null),a("update:modelValue",null),!0===t.changeEvent&&a("change",null),a("clear",n.modelValue),(0,e.nextTick)(()=>{let e=u.value;p(),u.value=e})}function L(e){[13,32].includes(e.keyCode)&&A(e)}function M(){let a=[];return void 0!==i.prepend&&a.push((0,e.h)("div",{class:"q-field__prepend q-field__marginal row no-wrap items-center",key:"prepend",onClick:w},i.prepend())),a.push((0,e.h)("div",{class:"q-field__control-container col relative-position row no-wrap q-anchor--skip"},function(){let a=[];return void 0!==n.prefix&&null!==n.prefix&&a.push((0,e.h)("div",{class:"q-field__prefix no-pointer-events row items-center"},n.prefix)),void 0!==t.getShadowControl&&!0===t.hasShadow.value&&a.push(t.getShadowControl()),!0===b.value&&a.push((0,e.h)("div",{class:y.value},Le(i.label,n.label))),void 0===t.getControl?void 0===i.rawControl?void 0!==i.control&&a.push((0,e.h)("div",{ref:t.targetRef,class:"q-field__native row",tabindex:-1,...t.splitAttrs.attributes.value,"data-autofocus":!0===n.autofocus||void 0},i.control(x.value))):a.push(i.rawControl()):a.push(t.getControl()),void 0!==n.suffix&&null!==n.suffix&&a.push((0,e.h)("div",{class:"q-field__suffix no-pointer-events row items-center"},n.suffix)),a.concat(Le(i.default))}())),!0===d.value&&!1===n.noErrorIcon&&a.push(z("error",[(0,e.h)(Ye,{name:s.iconSet.field.error,color:"negative"})])),!0===n.loading||!0===t.innerLoading.value?a.push(z("inner-loading-append",void 0===i.loading?[(0,e.h)(St,{color:n.color})]:i.loading())):!0===n.clearable&&!0===t.hasValue.value&&!0===t.editable.value&&a.push(z("inner-clearable-append",[(0,e.h)(Ye,{class:"q-field__focusable-action",name:n.clearIcon||s.iconSet.field.clear,tabindex:0,role:"button","aria-hidden":"false","aria-label":s.lang.label.clear,onKeyup:L,onClick:A})])),void 0!==i.append&&a.push((0,e.h)("div",{class:"q-field__append q-field__marginal row no-wrap items-center",key:"append",onClick:w},i.append())),void 0!==t.getInnerAppend&&a.push(z("inner-append",t.getInnerAppend())),void 0!==t.getControlChild&&a.push(t.getControlChild()),a}function R(){let a,o;!0===d.value?null===h.value?(a=Le(i.error),o="q--slot-error"):(a=[(0,e.h)("div",{role:"alert"},h.value)],o=`q--slot-error-${h.value}`):(!0!==n.hideHint||!0===t.focused.value)&&(void 0===n.hint?(a=Le(i.hint),o="q--slot-hint"):(a=[(0,e.h)("div",n.hint)],o=`q--slot-hint-${n.hint}`));let r=!0===n.counter||void 0!==i.counter;if(!0===n.hideBottomSpace&&!1===r&&void 0===a)return;let s=(0,e.h)("div",{key:o,class:"q-field__messages col"},a);return(0,e.h)("div",{class:"q-field__bottom row items-start q-field__bottom--"+(!0===n.hideBottomSpace?"stale":"animated"),onClick:w},[!0===n.hideBottomSpace?s:(0,e.h)(e.Transition,{name:"q-transition--field-message"},()=>s),!0===r?(0,e.h)("div",{class:"q-field__counter"},void 0===i.counter?t.computedCounter.value:i.counter()):null])}function z(t,n){return null===n?null:(0,e.h)("div",{key:t,class:"q-field__append q-field__marginal row no-wrap items-center q-anchor--skip"},n)}let O=!1;return(0,e.onDeactivated)(()=>{O=!0}),(0,e.onActivated)(()=>{!0===O&&!0===n.autofocus&&r.focus()}),!0===n.autofocus&&(0,e.onMounted)(()=>{r.focus()}),(0,e.onBeforeUnmount)(()=>{null!==l&&clearTimeout(l)}),Object.assign(r,{focus:T,blur:function(){!function(e){on=on.filter(t=>t!==e)}(C);let e=document.activeElement;null!==e&&t.rootRef.value.contains(e)&&e.blur()}}),function(){let a=void 0===t.getControl&&void 0===i.control?{...t.splitAttrs.attributes.value,"data-autofocus":!0===n.autofocus||void 0,...S.value}:S.value;return(0,e.h)(t.tag.value,{ref:t.rootRef,class:[g.value,o.class],style:o.style,...a},[void 0===i.before?null:(0,e.h)("div",{class:"q-field__before q-field__marginal row no-wrap items-center",onClick:w},i.before()),(0,e.h)("div",{class:"q-field__inner relative-position col self-stretch"},[(0,e.h)("div",{ref:t.controlRef,class:v.value,tabindex:-1,...t.controlEvents},M()),!0===m.value?R():null]),void 0===i.after?null:(0,e.h)("div",{class:"q-field__after q-field__marginal row no-wrap items-center",onClick:w},i.after())])}}var cs=h({name:"QField",inheritAttrs:!1,props:{...rs,tag:{type:String,default:"label"}},emits:ss,setup:()=>us(ls({tagProp:!0}))});function ds(e,t,n,a){let i=[];return e.forEach(e=>{!0===a(e)?i.push(e):t.push({failedPropValidation:n,file:e})}),i}function hs(e){e?.dataTransfer&&(e.dataTransfer.dropEffect="copy"),k(e)}let ps={multiple:Boolean,accept:String,capture:String,maxFileSize:[Number,String],maxTotalSize:[Number,String],maxFiles:[Number,String],filter:Function},fs=["rejected"];function ms({editable:t,dnd:n,getFileInput:a,addFilesToQueue:i}){let{props:o,emit:r,proxy:s}=(0,e.getCurrentInstance)(),l=(0,e.ref)(null),u=(0,e.computed)(()=>void 0===o.accept?null:o.accept.split(",").map(e=>"*"===(e=e.trim())?"*/":(e.endsWith("/*")&&(e=e.slice(0,e.length-1)),e.toUpperCase()))),d=(0,e.computed)(()=>parseInt(o.maxFiles,10)),h=(0,e.computed)(()=>parseInt(o.maxTotalSize,10));function p(e){if(t.value)if(e!==Object(e)&&(e={target:null}),!0===e.target?.matches('input[type="file"]'))0===e.clientX&&0===e.clientY&&y(e);else{let t=a();t!==e.target&&t?.click(e)}}function f(e){t.value&&e&&i(null,e)}function m(e){k(e),(null!==e.relatedTarget||!0!==c.is.safari?e.relatedTarget!==l.value:!1===document.elementsFromPoint(e.clientX,e.clientY).includes(l.value))&&(n.value=!1)}function _(e){hs(e);let t=e.dataTransfer.files;0!==t.length&&i(null,t),n.value=!1}return Object.assign(s,{pickFiles:p,addFiles:f}),{pickFiles:p,addFiles:f,onDragover:function(e){hs(e),!0!==n.value&&(n.value=!0)},onDragleave:m,processFiles:function(e,t,n,a){let i=Array.from(t||e.target.files),s=[],l=()=>{0!==s.length&&r("rejected",s)};if(void 0!==o.accept&&-1===u.value.indexOf("*/")&&(i=ds(i,s,"accept",e=>u.value.some(t=>e.type.toUpperCase().startsWith(t)||e.name.toUpperCase().endsWith(t))),0===i.length))return l();if(void 0!==o.maxFileSize){let e=parseInt(o.maxFileSize,10);if(i=ds(i,s,"max-file-size",t=>t.size<=e),0===i.length)return l()}if(!0!==o.multiple&&0!==i.length&&(i=[i[0]]),i.forEach(e=>{e.__key=e.webkitRelativePath+e.lastModified+e.name+e.size}),!0===a){let e=n.map(e=>e.__key);i=ds(i,s,"duplicate",t=>!1===e.includes(t.__key))}if(0===i.length)return l();if(void 0!==o.maxTotalSize){let e=!0===a?n.reduce((e,t)=>e+t.size,0):0;if(i=ds(i,s,"max-total-size",t=>(e+=t.size,e<=h.value)),0===i.length)return l()}if("function"==typeof o.filter){let e=o.filter(i);i=ds(i,s,"filter",t=>e.includes(t))}if(void 0!==o.maxFiles){let e=!0===a?n.length:0;if(i=ds(i,s,"max-files",()=>(e++,e<=d.value)),0===i.length)return l()}return l(),0!==i.length?i:void 0},getDndNode:function(t){if(!0===n.value)return(0,e.h)("div",{ref:l,class:`q-${t}__dnd absolute-full`,onDragenter:hs,onDragover:hs,onDragleave:m,onDrop:_})},maxFilesNumber:d,maxTotalSizeNumber:h}}function _s(t,n){function a(){let e=t.modelValue;try{let t="DataTransfer"in window?new DataTransfer:"ClipboardEvent"in window?new ClipboardEvent("").clipboardData:void 0;return Object(e)===e&&("length"in e?Array.from(e):[e]).forEach(e=>{t.items.add(e)}),{files:t.files}}catch{return{files:void 0}}}return!0===n?(0,e.computed)(()=>{if("file"===t.type)return a()}):(0,e.computed)(a)}var gs=h({name:"QFile",inheritAttrs:!1,props:{...os,...xa,...ps,modelValue:[File,FileList,Array],append:Boolean,useChips:Boolean,displayValue:[String,Number],tabindex:{type:[String,Number],default:0},counterLabel:Function,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...ss,...fs],setup(t,{slots:n,emit:i,attrs:o}){let{proxy:r}=(0,e.getCurrentInstance)(),s=ls(),l=(0,e.ref)(null),u=(0,e.ref)(!1),c=Ta(t),{pickFiles:d,onDragover:h,onDragleave:p,processFiles:f,getDndNode:m}=ms({editable:s.editable,dnd:u,getFileInput:L,addFilesToQueue:M}),_=_s(t),g=(0,e.computed)(()=>Object(t.modelValue)===t.modelValue?"length"in t.modelValue?Array.from(t.modelValue):[t.modelValue]:[]),v=(0,e.computed)(()=>is(g.value)),b=(0,e.computed)(()=>g.value.map(e=>e.name).join(", ")),y=(0,e.computed)(()=>me(g.value.reduce((e,t)=>e+t.size,0))),k=(0,e.computed)(()=>({totalSize:y.value,filesNumber:g.value.length,maxFiles:t.maxFiles})),x=(0,e.computed)(()=>({tabindex:-1,type:"file",title:"",accept:t.accept,capture:t.capture,name:c.value,...o,id:s.targetUid.value,disabled:!0!==s.editable.value})),S=(0,e.computed)(()=>"q-file q-field--auto-height"+(!0===u.value?" q-file--dnd":"")),C=(0,e.computed)(()=>!0===t.multiple&&!0===t.append);function T(e){let t=g.value.slice();t.splice(e,1),P(t)}function P(e){i("update:modelValue",!0===t.multiple?e:e[0])}function E(e){13===e.keyCode&&w(e)}function A(e){(13===e.keyCode||32===e.keyCode)&&d(e)}function L(){return l.value}function M(e,n){let a=f(e,n,g.value,C.value),i=L();null!=i&&(i.value=""),void 0!==a&&((!0===t.multiple?t.modelValue&&a.every(e=>g.value.includes(e)):t.modelValue===a[0])||P(!0===C.value?g.value.concat(a):a))}function R(){return[(0,e.h)("input",{class:[t.inputClass,"q-file__filler"],style:t.inputStyle})]}function z(){if(void 0!==n.file)return 0===g.value.length?R():g.value.map((e,t)=>n.file({index:t,file:e,ref:this}));if(void 0!==n.selected)return 0===g.value.length?R():n.selected({files:g.value,ref:this});if(!0===t.useChips)return 0===g.value.length?R():g.value.map((n,a)=>(0,e.h)(si,{key:"file-"+a,removable:s.editable.value,dense:!0,textColor:t.color,tabindex:t.tabindex,onRemove:()=>{T(a)}},()=>(0,e.h)("span",{class:"ellipsis",textContent:n.name})));let a=void 0===t.displayValue?b.value:t.displayValue;return 0===a.length?R():[(0,e.h)("div",{class:t.inputClass,style:t.inputStyle,textContent:a})]}function O(){let n={ref:l,...x.value,..._.value,class:"q-field__input fit absolute-full cursor-pointer",onChange:M};return!0===t.multiple&&(n.multiple=!0),(0,e.h)("input",n)}return Object.assign(s,{fieldClass:S,emitValue:P,hasValue:v,inputRef:l,innerValue:g,floatingLabel:(0,e.computed)(()=>!0===v.value||is(t.displayValue)),computedCounter:(0,e.computed)(()=>{if(void 0!==t.counterLabel)return t.counterLabel(k.value);let e=t.maxFiles;return`${g.value.length}${void 0===e?"":" / "+e} (${y.value})`}),getControlChild:()=>m("file"),getControl:()=>{let n={ref:s.targetRef,class:"q-field__native row items-center cursor-pointer",tabindex:t.tabindex};return!0===s.editable.value&&Object.assign(n,{onDragover:h,onDragleave:p,onKeydown:E,onKeyup:A}),(0,e.h)("div",n,[O()].concat(z()))}}),Object.assign(r,{removeAtIndex:T,removeFile:function(e){let t=g.value.indexOf(e);-1!==t&&T(t)},getNativeElement:()=>l.value}),a(r,"nativeEl",()=>l.value),us(s)}}),vs=h({name:"QFooter",props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:["reveal","focusin"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=(0,e.inject)(Q,te);if(o===te)return console.error("QFooter needs to be child of QLayout"),te;let s=(0,e.ref)(parseInt(t.heightHint,10)),l=(0,e.ref)(!0),u=(0,e.ref)(!0===r.value||!0===o.isContainer.value?0:window.innerHeight),c=(0,e.computed)(()=>!0===t.reveal||-1!==o.view.value.indexOf("F")||i.platform.is.ios&&!0===o.isContainer.value),d=(0,e.computed)(()=>!0===o.isContainer.value?o.containerHeight.value:u.value),h=(0,e.computed)(()=>{if(!0!==t.modelValue)return 0;if(!0===c.value)return!0===l.value?s.value:0;let e=o.scroll.value.position+d.value+s.value-o.height.value;return e>0?e:0}),p=(0,e.computed)(()=>!0!==t.modelValue||!0===c.value&&!0!==l.value),f=(0,e.computed)(()=>!0===t.modelValue&&!0===p.value&&!0===t.reveal),m=(0,e.computed)(()=>"q-footer q-layout__section--marginal "+(!0===c.value?"fixed":"absolute")+"-bottom"+(!0===t.bordered?" q-footer--bordered":"")+(!0===p.value?" q-footer--hidden":"")+(!0===t.modelValue?"":" q-layout--prevent-focus"+(!0===c.value?"":" hidden"))),_=(0,e.computed)(()=>{let e=o.rows.value.bottom,t={};return"l"===e[0]&&!0===o.left.space&&(t[!0===i.lang.rtl?"right":"left"]=`${o.left.size}px`),"r"===e[2]&&!0===o.right.space&&(t[!0===i.lang.rtl?"left":"right"]=`${o.right.size}px`),t});function g(e,t){o.update("footer",e,t)}function v(e,t){e.value!==t&&(e.value=t)}function b({height:e}){v(s,e),g("size",e)}function y(e){!0===f.value&&v(l,!0),a("focusin",e)}(0,e.watch)(()=>t.modelValue,e=>{g("space",e),v(l,!0),o.animate()}),(0,e.watch)(h,e=>{g("offset",e)}),(0,e.watch)(()=>t.reveal,e=>{!1===e&&v(l,t.modelValue)}),(0,e.watch)(l,e=>{o.animate(),a("reveal",e)}),(0,e.watch)([s,o.scroll,o.height],function(){if(!0!==t.reveal)return;let{direction:e,position:n,inflectionPoint:a}=o.scroll.value;v(l,"up"===e||n-a<100||o.height.value-d.value-n-s.value<300)}),(0,e.watch)(()=>i.screen.height,e=>{!0!==o.isContainer.value&&v(u,e)});let w={};return o.instances.footer=w,!0===t.modelValue&&g("size",s.value),g("space",t.modelValue),g("offset",h.value),(0,e.onBeforeUnmount)(()=>{o.instances.footer===w&&(o.instances.footer=void 0,g("size",0),g("offset",0),g("space",!1))}),()=>{let a=Re(n.default,[(0,e.h)(Ti,{debounce:0,onResize:b})]);return!0===t.elevated&&a.push((0,e.h)("div",{class:"q-layout__shadow absolute-full overflow-hidden no-pointer-events"})),(0,e.h)("footer",{class:m.value,style:_.value,onFocusin:y},a)}}}),bs=h({name:"QForm",props:{autofocus:Boolean,noErrorFocus:Boolean,noResetFocus:Boolean,greedy:Boolean,onSubmit:Function},emits:["reset","validationSuccess","validationError"],setup(t,{slots:n,emit:a}){let i=(0,e.getCurrentInstance)(),o=(0,e.ref)(null),r=0,s=[];function l(e){let n="boolean"==typeof e?e:!0!==t.noErrorFocus,i=++r,o=(e,t)=>{a("validation"+(!0===e?"Success":"Error"),t)},l=e=>{let t=e.validate();return"function"==typeof t.then?t.then(t=>({valid:t,comp:e}),t=>({valid:!1,comp:e,err:t})):Promise.resolve({valid:t,comp:e})};return(!0===t.greedy?Promise.all(s.map(l)).then(e=>e.filter(e=>!0!==e.valid)):s.reduce((e,t)=>e.then(()=>l(t).then(e=>{if(!1===e.valid)return Promise.reject(e)})),Promise.resolve()).catch(e=>[e])).then(e=>{if(void 0===e||0===e.length)return i===r&&o(!0),!0;if(i===r){let{comp:t,err:a}=e[0];if(void 0!==a&&console.error(a),o(!1,t),!0===n){let t=e.find(({comp:e})=>"function"==typeof e.focus&&!1===dt(e.$));void 0!==t&&t.comp.focus()}}return!1})}function u(){r++,s.forEach(e=>{"function"==typeof e.resetValidation&&e.resetValidation()})}function c(e){void 0!==e&&k(e);let n=r+1;l().then(i=>{n===r&&!0===i&&(void 0===t.onSubmit?void 0!==e?.target&&"function"==typeof e.target.submit&&e.target.submit():a("submit",e))})}function d(n){void 0!==n&&k(n),a("reset"),(0,e.nextTick)(()=>{u(),!0===t.autofocus&&!0!==t.noResetFocus&&h()})}function h(){un(()=>{null!==o.value&&(o.value.querySelector("[autofocus][tabindex], [data-autofocus][tabindex]")||o.value.querySelector("[autofocus] [tabindex], [data-autofocus] [tabindex]")||o.value.querySelector("[autofocus], [data-autofocus]")||Array.prototype.find.call(o.value.querySelectorAll("[tabindex]"),e=>-1!==e.tabIndex))?.focus({preventScroll:!0})})}(0,e.provide)(J,{bindComponent(e){s.push(e)},unbindComponent(e){let t=s.indexOf(e);-1!==t&&s.splice(t,1)}});let p=!1;return(0,e.onDeactivated)(()=>{p=!0}),(0,e.onActivated)(()=>{!0===p&&!0===t.autofocus&&h()}),(0,e.onMounted)(()=>{!0===t.autofocus&&h()}),Object.assign(i.proxy,{validate:l,resetValidation:u,submit:c,reset:d,focus:h,getValidationComponents:()=>s}),()=>(0,e.h)("form",{class:"q-form",ref:o,onSubmit:c,onReset:d},Le(n.default))}}),ys={inject:{[J]:{default:_}},watch:{disable(e){let t=this.$.provides[J];void 0!==t&&(!0===e?(this.resetValidation(),t.unbindComponent(this)):t.bindComponent(this))}},methods:{validate(){},resetValidation(){}},mounted(){!0!==this.disable&&this.$.provides[J]?.bindComponent(this)},beforeUnmount(){!0!==this.disable&&this.$.provides[J]?.unbindComponent(this)}},ws=h({name:"QHeader",props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,revealOffset:{type:Number,default:250},bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:["reveal","focusin"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=(0,e.inject)(Q,te);if(o===te)return console.error("QHeader needs to be child of QLayout"),te;let r=(0,e.ref)(parseInt(t.heightHint,10)),s=(0,e.ref)(!0),l=(0,e.computed)(()=>!0===t.reveal||-1!==o.view.value.indexOf("H")||i.platform.is.ios&&!0===o.isContainer.value),u=(0,e.computed)(()=>{if(!0!==t.modelValue)return 0;if(!0===l.value)return!0===s.value?r.value:0;let e=r.value-o.scroll.value.position;return e>0?e:0}),c=(0,e.computed)(()=>!0!==t.modelValue||!0===l.value&&!0!==s.value),d=(0,e.computed)(()=>!0===t.modelValue&&!0===c.value&&!0===t.reveal),h=(0,e.computed)(()=>"q-header q-layout__section--marginal "+(!0===l.value?"fixed":"absolute")+"-top"+(!0===t.bordered?" q-header--bordered":"")+(!0===c.value?" q-header--hidden":"")+(!0===t.modelValue?"":" q-layout--prevent-focus")),p=(0,e.computed)(()=>{let e=o.rows.value.top,t={};return"l"===e[0]&&!0===o.left.space&&(t[!0===i.lang.rtl?"right":"left"]=`${o.left.size}px`),"r"===e[2]&&!0===o.right.space&&(t[!0===i.lang.rtl?"left":"right"]=`${o.right.size}px`),t});function f(e,t){o.update("header",e,t)}function m(e,t){e.value!==t&&(e.value=t)}function _({height:e}){m(r,e),f("size",e)}function g(e){!0===d.value&&m(s,!0),a("focusin",e)}(0,e.watch)(()=>t.modelValue,e=>{f("space",e),m(s,!0),o.animate()}),(0,e.watch)(u,e=>{f("offset",e)}),(0,e.watch)(()=>t.reveal,e=>{!1===e&&m(s,t.modelValue)}),(0,e.watch)(s,e=>{o.animate(),a("reveal",e)}),(0,e.watch)(o.scroll,e=>{!0===t.reveal&&m(s,"up"===e.direction||e.position<=t.revealOffset||e.position-e.inflectionPoint<100)});let v={};return o.instances.header=v,!0===t.modelValue&&f("size",r.value),f("space",t.modelValue),f("offset",u.value),(0,e.onBeforeUnmount)(()=>{o.instances.header===v&&(o.instances.header=void 0,f("size",0),f("offset",0),f("space",!1))}),()=>{let a=Me(n.default,[]);return!0===t.elevated&&a.push((0,e.h)("div",{class:"q-layout__shadow absolute-full overflow-hidden no-pointer-events"})),a.push((0,e.h)(Ti,{debounce:0,onResize:_})),(0,e.h)("header",{class:h.value,style:p.value,onFocusin:g},a)}}});let ks={ratio:[String,Number]};function xs(t,n){return(0,e.computed)(()=>{let e=Number(t.ratio||(void 0===n?void 0:n.value));return!0!==isNaN(e)&&e>0?{paddingBottom:100/e+"%"}:null})}var Ss=h({name:"QImg",props:{...ks,src:String,srcset:String,sizes:String,alt:String,crossorigin:String,decoding:String,referrerpolicy:String,draggable:Boolean,loading:{type:String,default:"lazy"},loadingShowDelay:{type:[Number,String],default:0},fetchpriority:{type:String,default:"auto"},width:String,height:String,initialRatio:{type:[Number,String],default:1.7778},placeholderSrc:String,errorSrc:String,fit:{type:String,default:"cover"},position:{type:String,default:"50% 50%"},imgClass:String,imgStyle:Object,noSpinner:Boolean,noNativeMenu:Boolean,noTransition:Boolean,spinnerColor:String,spinnerSize:String},emits:["load","error"],setup(t,{slots:n,emit:a}){let i=(0,e.ref)(t.initialRatio),o=xs(t,i),s=(0,e.getCurrentInstance)(),{registerTimeout:l,removeTimeout:u}=xn(),{registerTimeout:c,removeTimeout:d}=xn(),h=(0,e.computed)(()=>void 0===t.placeholderSrc?null:{src:t.placeholderSrc}),p=(0,e.computed)(()=>void 0===t.errorSrc?null:{src:t.errorSrc,__qerror:!0}),f=[(0,e.ref)(null),(0,e.ref)(h.value)],m=(0,e.ref)(0),_=(0,e.ref)(!1),g=(0,e.ref)(!1),v=(0,e.computed)(()=>`q-img q-img--${!0===t.noNativeMenu?"no-":""}menu`),b=(0,e.computed)(()=>({width:t.width,height:t.height})),y=(0,e.computed)(()=>`q-img__image ${void 0===t.imgClass?"":t.imgClass+" "}q-img__image--with${!0===t.noTransition?"out":""}-transition q-img__image--`),w=(0,e.computed)(()=>({...t.imgStyle,objectFit:t.fit,objectPosition:t.position}));function k(){d(),_.value=!1}function x({target:e}){!1===dt(s)&&(u(),i.value=0===e.naturalHeight?.5:e.naturalWidth/e.naturalHeight,S(e,1))}function S(e,t){1e3===t||!0===dt(s)||(!0===e.complete?function(e){!0!==dt(s)&&(m.value^=1,f[m.value].value=null,k(),"true"!==e.getAttribute("__qerror")&&(g.value=!1),a("load",e.currentSrc||e.src))}(e):l(()=>{S(e,t+1)},50))}function C(e){u(),k(),g.value=!0,f[m.value].value=p.value,f[1^m.value].value=h.value,a("error",e)}function T(n){let a=f[n].value,i={key:"img_"+n,class:y.value,style:w.value,alt:t.alt,crossorigin:t.crossorigin,decoding:t.decoding,referrerpolicy:t.referrerpolicy,height:t.height,width:t.width,loading:t.loading,fetchpriority:t.fetchpriority,"aria-hidden":"true",draggable:t.draggable,...a};return m.value===n?Object.assign(i,{class:i.class+"current",onLoad:x,onError:C}):i.class+="loaded",(0,e.h)("div",{class:"q-img__container absolute-full",key:"img"+n},(0,e.h)("img",i))}function P(){return!1===_.value?(0,e.h)("div",{key:"content",class:"q-img__content absolute-full q-anchor--skip"},Le(n[!0===g.value?"error":"default"])):(0,e.h)("div",{key:"loading",class:"q-img__loading absolute-full flex flex-center"},void 0===n.loading?!0===t.noSpinner?void 0:[(0,e.h)(St,{color:t.spinnerColor,size:t.spinnerSize})]:n.loading())}{function E(){(0,e.watch)(()=>t.src||t.srcset||t.sizes?{src:t.src,srcset:t.srcset,sizes:t.sizes}:null,e=>{u(),g.value=!1,null===e?(k(),f[1^m.value].value=h.value):(d(),0!==t.loadingShowDelay?c(()=>{_.value=!0},t.loadingShowDelay):_.value=!0),f[m.value].value=e},{immediate:!0})}!0===r.value?(0,e.onMounted)(E):E()}return()=>{let n=[];return null!==o.value&&n.push((0,e.h)("div",{key:"filler",style:o.value})),null!==f[0].value&&n.push(T(0)),null!==f[1].value&&n.push(T(1)),n.push((0,e.h)(e.Transition,{name:"q-transition--fade"},P)),(0,e.h)("div",{key:"main",class:v.value,style:b.value,role:"img","aria-label":t.alt},n)}}});let{passive:Cs}=m;var Ts=h({name:"QInfiniteScroll",props:{offset:{type:Number,default:500},debounce:{type:[String,Number],default:100},scrollTarget:Cn,initialIndex:{type:Number,default:0},disable:Boolean,reverse:Boolean},emits:["load"],setup(t,{slots:n,emit:a}){let i,o,r=(0,e.ref)(!1),s=(0,e.ref)(!0),l=(0,e.ref)(null),u=(0,e.ref)(null),c=t.initialIndex,d=(0,e.computed)(()=>"q-infinite-scroll__loading"+(!0===r.value?"":" invisible"));function h(){if(!0===t.disable||!0===r.value||!1===s.value)return;let e=En(i),n=An(i),a=Tt(i);!1===t.reverse?Math.round(n+a+t.offset)>=Math.round(e)&&p():Math.round(n)<=t.offset&&p()}function p(){if(!0===t.disable||!0===r.value||!1===s.value)return;c++,r.value=!0;let n=En(i);a("load",c,a=>{!0===s.value&&(r.value=!1,(0,e.nextTick)(()=>{if(!0===t.reverse){let e=En(i),t=An(i);In(i,t+(e-n))}!0===a?m():l.value&&l.value.closest("body")&&o()}))})}function f(){!1===s.value&&(s.value=!0,i.addEventListener("scroll",o,Cs)),h()}function m(){!0===s.value&&(s.value=!1,r.value=!1,i.removeEventListener("scroll",o,Cs),o?.cancel?.())}function _(){if(i&&!0===s.value&&i.removeEventListener("scroll",o,Cs),i=Pn(l.value,t.scrollTarget),!0===s.value){if(i.addEventListener("scroll",o,Cs),!0===t.reverse){let e=En(i),t=Tt(i);In(i,e-t)}h()}}function g(e){e=parseInt(e,10);let t=o;o=e<=0?h:P(h,!0===isNaN(e)?100:e),i&&!0===s.value&&(void 0!==t&&i.removeEventListener("scroll",t,Cs),i.addEventListener("scroll",o,Cs))}function v(t){if(!0===b.value){if(null===u.value)return void(!0!==t&&(0,e.nextTick)(()=>{v(!0)}));let n=(!0===r.value?"un":"")+"pauseAnimations";Array.from(u.value.getElementsByTagName("svg")).forEach(e=>{e[n]()})}}let b=(0,e.computed)(()=>!0!==t.disable&&!0===s.value);(0,e.watch)([r,b],()=>{v()}),(0,e.watch)(()=>t.disable,e=>{!0===e?m():f()}),(0,e.watch)(()=>t.reverse,()=>{!1===r.value&&!0===s.value&&h()}),(0,e.watch)(()=>t.scrollTarget,_),(0,e.watch)(()=>t.debounce,g);let y=!1;(0,e.onActivated)(()=>{!1!==y&&i&&In(i,y)}),(0,e.onDeactivated)(()=>{y=!!i&&An(i)}),(0,e.onBeforeUnmount)(()=>{!0===s.value&&i.removeEventListener("scroll",o,Cs)}),(0,e.onMounted)(()=>{g(t.debounce),_(),!1===r.value&&v()});let w=(0,e.getCurrentInstance)();return Object.assign(w.proxy,{poll:()=>{o?.()},trigger:p,stop:m,reset:function(){c=0},resume:f,setIndex:function(e){c=e},updateScrollTarget:_}),()=>{let a=Me(n.default,[]);return!0===b.value&&a[!1===t.reverse?"push":"unshift"]((0,e.h)("div",{ref:u,class:d.value},Le(n.loading))),(0,e.h)("div",{class:"q-infinite-scroll",ref:l},a)}}}),Ps=h({name:"QInnerLoading",props:{...Xe,...yn,showing:Boolean,color:String,size:{type:[String,Number],default:"42px"},label:String,labelClass:String,labelStyle:[String,Array,Object]},setup(t,{slots:n}){let a=et(t,(0,e.getCurrentInstance)().proxy.$q),{transitionProps:i,transitionStyle:o}=wn(t),r=(0,e.computed)(()=>"q-inner-loading q--avoid-card-border absolute-full column flex-center"+(!0===a.value?" q-inner-loading--dark":"")),s=(0,e.computed)(()=>"q-inner-loading__label"+(void 0===t.labelClass?"":` ${t.labelClass}`));function l(){return!0===t.showing?(0,e.h)("div",{class:r.value,style:o.value},void 0===n.default?function(){let n=[(0,e.h)(St,{size:t.size,color:t.color})];return void 0!==t.label&&n.push((0,e.h)("div",{class:s.value,style:t.labelStyle},[t.label])),n}():n.default()):null}return()=>(0,e.h)(e.Transition,i.value,l)}});let Es={date:"####/##/##",datetime:"####/##/## ##:##",time:"##:##",fulltime:"##:##:##",phone:"(###) ### - ####",card:"#### #### #### ####"},{tokenMap:As,tokenKeys:Ls}=Ms({"#":{pattern:"[\\d]",negate:"[^\\d]"},S:{pattern:"[a-zA-Z]",negate:"[^a-zA-Z]"},N:{pattern:"[0-9a-zA-Z]",negate:"[^0-9a-zA-Z]"},A:{pattern:"[a-zA-Z]",negate:"[^a-zA-Z]",transform:e=>e.toLocaleUpperCase()},a:{pattern:"[a-zA-Z]",negate:"[^a-zA-Z]",transform:e=>e.toLocaleLowerCase()},X:{pattern:"[0-9a-zA-Z]",negate:"[^0-9a-zA-Z]",transform:e=>e.toLocaleUpperCase()},x:{pattern:"[0-9a-zA-Z]",negate:"[^0-9a-zA-Z]",transform:e=>e.toLocaleLowerCase()}});function Ms(e){let t=Object.keys(e),n={};return t.forEach(t=>{let a=e[t];n[t]={...a,regex:new RegExp(a.pattern)}}),{tokenMap:n,tokenKeys:t}}function Rs(e){return RegExp("\\\\([^.*+?^${}()|([\\]])|([.*+?^${}()|[\\]])|(["+e.join("")+"])|(.)","g")}let zs=/[.*+?^${}()|[\]\\]/g,Os=Rs(Ls),Is={mask:String,reverseFillMask:Boolean,fillMask:[Boolean,String],unmaskedValue:Boolean,maskTokens:Object};function Ns(t,n,a,i){let o,r,s,l,u,c,d=(0,e.computed)(()=>{if(void 0===t.maskTokens||null===t.maskTokens)return{tokenMap:As,tokenRegexMask:Os};let{tokenMap:e}=Ms(t.maskTokens),n={...As,...e};return{tokenMap:n,tokenRegexMask:Rs(Object.keys(n))}}),h=(0,e.ref)(null),p=(0,e.ref)(function(){if(m(),!0===h.value){let e=v(y(t.modelValue));return!1===t.fillMask?e:w(e)}return t.modelValue}());function f(e){if(e0;a--)t+="";n=n.slice(0,a)+t+n.slice(a)}return n}function m(){if(h.value=void 0!==t.mask&&0!==t.mask.length&&(!0===t.autogrow||["textarea","text","search","url","tel","password"].includes(t.type)),!1===h.value)return l=void 0,o="",void(r="");let e=void 0===Es[t.mask]?t.mask:Es[t.mask],n="string"==typeof t.fillMask&&0!==t.fillMask.length?t.fillMask.slice(0,1):"_",a=n.replace(zs,"\\$&"),i=[],u=[],c=[],p=!0===t.reverseFillMask,f="",m="";e.replace(d.value.tokenRegexMask,(e,t,n,a,o)=>{if(void 0!==a){let e=d.value.tokenMap[a];c.push(e),m=e.negate,!0===p&&(u.push("(?:"+m+"+)?("+e.pattern+"+)?(?:"+m+"+)?("+e.pattern+"+)?"),p=!1),u.push("(?:"+m+"+)?("+e.pattern+")?")}else if(void 0!==n)f="\\"+("\\"===n?"":n),c.push(n),i.push("([^"+f+"]+)?"+f+"?");else{let e=void 0===t?o:t;f="\\"===e?"\\\\\\\\":e.replace(zs,"\\\\$&"),c.push(e),i.push("([^"+f+"]+)?"+f+"?")}});let _=RegExp("^"+i.join("")+"("+(""===f?".":"[^"+f+"]")+"+)?"+(""===f?"":"["+f+"]*")+"$"),g=u.length-1,v=u.map((e,n)=>0===n&&!0===t.reverseFillMask?RegExp("^"+a+"*"+e):RegExp(n===g?"^"+e+"("+(""===m?".":m)+"+)?"+(!0===t.reverseFillMask?"$":a+"*"):"^"+e));s=c,l=e=>{let n=_.exec(!0===t.reverseFillMask?e:e.slice(0,c.length+1));null!==n&&(e=n.slice(1).join(""));let a=[],i=v.length;for(let t=0,n=e;t"string"==typeof e?e:"").join(""),r=o.split("").join(n)}function _(n,s,l){let c=i.value,d=c.selectionEnd,h=c.value.length-d,f=y(n);!0===s&&m();let _=v(f,s),b=!1===t.fillMask?_:w(_),k=p.value!==b;c.value!==b&&(c.value=b),!0===k&&(p.value=b),document.activeElement===c&&(0,e.nextTick)(()=>{if(b===r){let e=!0===t.reverseFillMask?r.length:0;return void c.setSelectionRange(e,e,"forward")}if("insertFromPaste"===l&&!0!==t.reverseFillMask){let e=c.selectionEnd,t=d-1;for(let n=u;n<=t&&n_.length):Math.max(0,b.length-(b===r?0:Math.min(_.length,h)+1))+1:d;return void c.setSelectionRange(e,e,"forward")}if(!0===t.reverseFillMask)if(!0===k){let e=Math.max(0,b.length-(b===r?0:Math.min(_.length,h+1)));1===e&&1===d?c.setSelectionRange(e,e,"forward"):g.rightReverse(c,e)}else{let e=b.length-h;c.setSelectionRange(e,e,"backward")}else if(!0===k){let e=Math.max(0,o.indexOf(""),Math.min(_.length,d)-1);g.right(c,e)}else{let e=d-1;g.right(c,e)}});let x=!0===t.unmaskedValue?y(b):b;String(t.modelValue)!==x&&(null!==t.modelValue||""!==x)&&a(x,!0)}(0,e.watch)(()=>t.type+t.autogrow,m),(0,e.watch)(()=>t.mask,e=>{if(void 0!==e)_(p.value,!0);else{let e=y(p.value);m(),t.modelValue!==e&&n("update:modelValue",e)}}),(0,e.watch)(()=>t.fillMask+t.reverseFillMask,()=>{!0===h.value&&_(p.value,!0)}),(0,e.watch)(()=>t.unmaskedValue,()=>{!0===h.value&&_(p.value)});let g={left(e,t){let n=-1===o.slice(t-1).indexOf(""),a=Math.max(0,t-1);for(;a>=0;a--)if(""===o[a]){t=a,!0===n&&t++;break}if(a<0&&void 0!==o[t]&&""!==o[t])return g.right(e,0);t>=0&&e.setSelectionRange(t,t,"backward")},right(e,t){let n=e.value.length,a=Math.min(n,t+1);for(;a<=n;a++){if(""===o[a]){t=a;break}""===o[a-1]&&(t=a)}if(a>n&&void 0!==o[t-1]&&""!==o[t-1])return g.left(e,n);e.setSelectionRange(t,t,"forward")},leftReverse(e,t){let n=f(e.value.length),a=Math.max(0,t-1);for(;a>=0;a--){if(""===n[a-1]){t=a;break}if(""===n[a]&&(t=a,0===a))break}if(a<0&&void 0!==n[t]&&""!==n[t])return g.rightReverse(e,0);t>=0&&e.setSelectionRange(t,t,"backward")},rightReverse(e,t){let n=e.value.length,a=f(n),i=-1===a.slice(0,t+1).indexOf(""),o=Math.min(n,t+1);for(;o<=n;o++)if(""===a[o-1]){(t=o)>0&&!0===i&&t--;break}if(o>n&&void 0!==a[t-1]&&""!==a[t-1])return g.leftReverse(e,n);e.setSelectionRange(t,t,"forward")}};function v(e,n){if(null==e||""===e)return"";if(!0===t.reverseFillMask)return b(e,n);let a=s,i=0,o="";for(let t=0;t=0&&-1!==i;o--){let s=n[o],l=e[i];if("string"==typeof s)r=s+r,!0===t&&l===s&&i--;else{if(void 0===l||!s.regex.test(l))return r;do{r=(void 0===s.transform?l:s.transform(l))+r,i--,l=e[i]}while(a===o&&void 0!==l&&s.regex.test(l))}}return r}function y(e){return"string"!=typeof e||void 0===l?"number"==typeof e?l(String(e)):e:l(e)}function w(e){return r.length-e.length<=0?e:!0===t.reverseFillMask&&0!==e.length?r.slice(0,-e.length)+e:e+r.slice(e.length)}return{innerValue:p,hasMask:h,moveCursorForPaste:function(e,t,n){let a=v(y(e.value));t=Math.max(0,o.indexOf(""),Math.min(a.length,t)),u=t,e.setSelectionRange(t,n,"forward")},updateMaskValue:_,onMaskedKeydown:function(e){if(n("keydown",e),!0===I(e)||!0===e.altKey)return;let a=i.value,o=a.selectionStart,r=a.selectionEnd;if(e.shiftKey||(c=void 0),37===e.keyCode||39===e.keyCode){e.shiftKey&&void 0===c&&(c="forward"===a.selectionDirection?o:r);let n=g[(39===e.keyCode?"right":"left")+(!0===t.reverseFillMask?"Reverse":"")];if(e.preventDefault(),n(a,c===o?r:o),e.shiftKey){let e=a.selectionStart;a.setSelectionRange(Math.min(c,e),Math.max(c,e),"forward")}}else 8===e.keyCode&&!0!==t.reverseFillMask&&o===r?(g.left(a,o),a.setSelectionRange(a.selectionStart,r,"backward")):46===e.keyCode&&!0===t.reverseFillMask&&o===r&&(g.rightReverse(a,r),a.setSelectionRange(o,a.selectionEnd,"forward"))},onMaskedClick:function(e){n("click",e),c=void 0}}}let Ds=/[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf]/,qs=/[\u4e00-\u9fff\u3400-\u4dbf\u{20000}-\u{2a6df}\u{2a700}-\u{2b73f}\u{2b740}-\u{2b81f}\u{2b820}-\u{2ceaf}\uf900-\ufaff\u3300-\u33ff\ufe30-\ufe4f\uf900-\ufaff\u{2f800}-\u{2fa1f}]/u,js=/[\u3131-\u314e\u314f-\u3163\uac00-\ud7a3]/,Bs=/[a-z0-9_ -]$/i;function Fs(e){return function(t){if("compositionend"===t.type||"change"===t.type){if(!0!==t.target.qComposing)return;t.target.qComposing=!1,e(t)}else"compositionupdate"===t.type&&!0!==t.target.qComposing&&"string"==typeof t.data&&(!0===c.is.firefox?!1===Bs.test(t.data):!0===Ds.test(t.data)||!0===qs.test(t.data)||!0===js.test(t.data))&&(t.target.qComposing=!0)}}var $s=h({name:"QInput",inheritAttrs:!1,props:{...rs,...Is,...xa,modelValue:[String,Number,FileList],shadowText:String,type:{type:String,default:"text"},debounce:[String,Number],autogrow:Boolean,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...ss,"paste","change","keydown","click","animationend"],setup(t,{emit:n,attrs:i}){let o,r,s,{proxy:l}=(0,e.getCurrentInstance)(),{$q:u}=l,c={},d=NaN,h=null,p=(0,e.ref)(null),f=Ta(t),{innerValue:m,hasMask:_,moveCursorForPaste:g,updateMaskValue:v,onMaskedKeydown:b,onMaskedClick:w}=Ns(t,n,z,p),k=_s(t,!0),x=(0,e.computed)(()=>is(m.value)),S=Fs(M),C=ls({changeEvent:!0}),T=(0,e.computed)(()=>"textarea"===t.type||!0===t.autogrow),P=(0,e.computed)(()=>!0===T.value||["text","search","url","tel","password"].includes(t.type)),E=(0,e.computed)(()=>{let e={...C.splitAttrs.listeners.value,onInput:M,onPaste:L,onChange:I,onBlur:N,onFocus:y};return e.onCompositionstart=e.onCompositionupdate=e.onCompositionend=S,!0===_.value&&(e.onKeydown=b,e.onClick=w),!0===t.autogrow&&(e.onAnimationend=R),e}),A=(0,e.computed)(()=>{let e={tabindex:0,"data-autofocus":!0===t.autofocus||void 0,rows:"textarea"===t.type?6:void 0,"aria-label":t.label,name:f.value,...C.splitAttrs.attributes.value,id:C.targetUid.value,maxlength:t.maxlength,disabled:!0===t.disable,readonly:!0===t.readonly};return!1===T.value&&(e.type=t.type),!0===t.autogrow&&(e.rows=1),e});function L(e){if(!0===_.value&&!0!==t.reverseFillMask){let t=e.target;g(t,t.selectionStart,t.selectionEnd)}n("paste",e)}function M(a){if(!a||!a.target)return;if("file"===t.type)return void n("update:modelValue",a.target.files);let i=a.target.value;if(!0!==a.target.qComposing){if(!0===_.value)v(i,!1,a.inputType);else if(z(i),!0===P.value&&a.target===document.activeElement){let{selectionStart:t,selectionEnd:n}=a.target;void 0!==t&&void 0!==n&&(0,e.nextTick)(()=>{a.target===document.activeElement&&0===i.indexOf(a.target.value)&&a.target.setSelectionRange(t,n)})}!0===t.autogrow&&O()}else c.value=i}function R(e){n("animationend",e),O()}function z(a,i){s=()=>{h=null,"number"!==t.type&&!0===c.hasOwnProperty("value")&&delete c.value,t.modelValue!==a&&d!==a&&(d=a,!0===i&&(r=!0),n("update:modelValue",a),(0,e.nextTick)(()=>{d===a&&(d=NaN)})),s=void 0},"number"===t.type&&(o=!0,c.value=a),void 0===t.debounce?s():(null!==h&&clearTimeout(h),c.value=a,h=setTimeout(s,t.debounce))}function O(){requestAnimationFrame(()=>{let e=p.value;if(null!==e){let t=e.parentNode.style,{scrollTop:n}=e,{overflowY:a,maxHeight:i}=!0===u.platform.is.firefox?{}:window.getComputedStyle(e),o=void 0!==a&&"scroll"!==a;!0===o&&(e.style.overflowY="hidden"),t.marginBottom=e.scrollHeight-1+"px",e.style.height="1px",e.style.height=e.scrollHeight+"px",!0===o&&(e.style.overflowY=parseInt(i,10){null!==p.value&&(p.value.value=void 0===m.value?"":m.value)})}function D(){return!0===c.hasOwnProperty("value")?c.value:void 0===m.value?"":m.value}(0,e.watch)(()=>t.type,()=>{p.value&&(p.value.value=t.modelValue)}),(0,e.watch)(()=>t.modelValue,n=>{if(!0===_.value){if(!0===r&&(r=!1,String(n)===d))return;v(n)}else m.value!==n&&(m.value=n,"number"===t.type&&!0===c.hasOwnProperty("value")&&(!0===o?o=!1:delete c.value));!0===t.autogrow&&(0,e.nextTick)(O)}),(0,e.watch)(()=>t.autogrow,t=>{!0===t?(0,e.nextTick)(O):null!==p.value&&i.rows>0&&(p.value.style.height="auto")}),(0,e.watch)(()=>t.dense,()=>{!0===t.autogrow&&(0,e.nextTick)(O)}),(0,e.onBeforeUnmount)(()=>{N()}),(0,e.onMounted)(()=>{!0===t.autogrow&&O()}),Object.assign(C,{innerValue:m,fieldClass:(0,e.computed)(()=>"q-"+(!0===T.value?"textarea":"input")+(!0===t.autogrow?" q-textarea--autogrow":"")),hasShadow:(0,e.computed)(()=>"file"!==t.type&&"string"==typeof t.shadowText&&0!==t.shadowText.length),inputRef:p,emitValue:z,hasValue:x,floatingLabel:(0,e.computed)(()=>!0===x.value&&("number"!==t.type||!1===isNaN(m.value))||is(t.displayValue)),getControl:()=>(0,e.h)(!0===T.value?"textarea":"input",{ref:p,class:["q-field__native q-placeholder",t.inputClass],style:t.inputStyle,...A.value,...E.value,..."file"===t.type?k.value:{value:D()}}),getShadowControl:()=>(0,e.h)("div",{class:"q-field__native q-field__shadow absolute-bottom no-pointer-events"+(!0===T.value?"":" text-no-wrap")},[(0,e.h)("span",{class:"invisible"},D()),(0,e.h)("span",t.shadowText)])});let q=us(C);return Object.assign(l,{focus:function(){un(()=>{let e=document.activeElement;null!==p.value&&p.value!==e&&(null===e||e.id!==C.targetUid.value)&&p.value.focus({preventScroll:!0})})},select:function(){p.value?.select()},getNativeElement:()=>p.value}),a(l,"nativeEl",()=>p.value),q}});let Vs={threshold:0,root:null,rootMargin:"0px"};function Us(e,t,n){let a,i,o;"function"==typeof n?(a=n,i=Vs,o=void 0===t.cfg):(a=n.handler,i=Object.assign({},Vs,n.cfg),o=void 0===t.cfg||!1===ie(t.cfg,i)),t.handler!==a&&(t.handler=a),!0===o&&(t.cfg=i,t.observer?.unobserve(e),t.observer=new IntersectionObserver(([n])=>{if("function"==typeof t.handler){if(null===n.rootBounds&&!0===document.body.contains(e))return t.observer.unobserve(e),void t.observer.observe(e);(!1===t.handler(n,t.observer)||!0===t.once&&!0===n.isIntersecting)&&Hs(e)}},i),t.observer.observe(e))}function Hs(e){let t=e.__qvisible;void 0!==t&&(t.observer?.unobserve(e),delete e.__qvisible)}var Ws=p({name:"intersection",mounted(e,{modifiers:t,value:n}){let a={once:!0===t.once};Us(e,a,n),e.__qvisible=a},updated(e,t){let n=e.__qvisible;void 0!==n&&Us(e,n,t.value)},beforeUnmount:Hs}),Gs=h({name:"QIntersection",props:{tag:{type:String,default:"div"},once:Boolean,transition:String,transitionDuration:{type:[String,Number],default:300},ssrPrerender:Boolean,margin:String,threshold:[Number,Array],root:{default:null},disable:Boolean,onVisibility:Function},setup(t,{slots:n,emit:a}){let i=(0,e.ref)(!0===r.value&&t.ssrPrerender),o=(0,e.computed)(()=>void 0!==t.root||void 0!==t.margin||void 0!==t.threshold?{handler:c,cfg:{root:t.root,rootMargin:t.margin,threshold:t.threshold}}:c),s=(0,e.computed)(()=>!0!==t.disable&&(!0!==r.value||!0!==t.once||!0!==t.ssrPrerender)),l=(0,e.computed)(()=>[[Ws,o.value,void 0,{once:t.once}]]),u=(0,e.computed)(()=>`--q-transition-duration: ${t.transitionDuration}ms`);function c(e){i.value!==e.isIntersecting&&(i.value=e.isIntersecting,void 0!==t.onVisibility&&a("visibility",i.value))}function d(){return!0===i.value?[(0,e.h)("div",{key:"content",style:u.value},Le(n.default))]:void 0!==n.hidden?[(0,e.h)("div",{key:"hidden",style:u.value},n.hidden())]:void 0}return()=>{let n=t.transition?[(0,e.h)(e.Transition,{name:"q-transition--"+t.transition},d)]:d();return Oe(t.tag,{class:"q-intersection"},n,"main",s.value,()=>l.value)}}});let Ks=["ul","ol"];var Ys=h({name:"QList",props:{...Xe,bordered:Boolean,dense:Boolean,separator:Boolean,padding:Boolean,tag:{type:String,default:"div"}},setup(t,{slots:n}){let a=et(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>Ks.includes(t.tag)?null:"list"),o=(0,e.computed)(()=>"q-list"+(!0===t.bordered?" q-list--bordered":"")+(!0===t.dense?" q-list--dense":"")+(!0===t.separator?" q-list--separator":"")+(!0===a.value?" q-list--dark":"")+(!0===t.padding?" q-list--padding":""));return()=>(0,e.h)(t.tag,{class:o.value,role:i.value},Le(n.default))}});let Qs=[34,37,40,33,39,38],Zs=Object.keys(li);var Js=h({name:"QKnob",props:{...xa,...li,modelValue:{type:Number,required:!0},innerMin:Number,innerMax:Number,step:{type:Number,default:1,validator:e=>e>=0},tabindex:{type:[Number,String],default:0},disable:Boolean,readonly:Boolean},emits:["update:modelValue","change","dragValue"],setup(t,{slots:n,emit:a}){let i,{proxy:o}=(0,e.getCurrentInstance)(),{$q:r}=o,s=(0,e.ref)(t.modelValue),l=(0,e.ref)(!1),u=(0,e.computed)(()=>!0===isNaN(t.innerMin)||t.innerMin!0===isNaN(t.innerMax)||t.innerMax>t.max?t.max:t.innerMax);function d(){s.value=null===t.modelValue?u.value:ge(t.modelValue,u.value,c.value),L(!0)}(0,e.watch)(()=>`${t.modelValue}|${u.value}|${c.value}`,d),d();let h=(0,e.computed)(()=>!1===t.disable&&!1===t.readonly),p=(0,e.computed)(()=>"q-knob non-selectable"+(!0===h.value?" q-knob--editable":!0===t.disable?" disabled":"")),f=(0,e.computed)(()=>(String(t.step).trim().split(".")[1]||"").length),m=(0,e.computed)(()=>0===t.step?1:t.step),_=(0,e.computed)(()=>!0===t.instantFeedback||!0===l.value),g=!0===r.platform.is.mobile?(0,e.computed)(()=>!0===h.value?{onClick:T}:{}):(0,e.computed)(()=>!0===h.value?{onMousedown:C,onClick:T,onKeydown:P,onKeyup:A}:{}),b=(0,e.computed)(()=>!0===h.value?{tabindex:t.tabindex}:{["aria-"+(!0===t.disable?"disabled":"readonly")]:"true"}),y=(0,e.computed)(()=>{let e={};return Zs.forEach(n=>{e[n]=t[n]}),e});function w(e){e.isFinal?(E(e.evt,!0),l.value=!1):e.isFirst?(S(),l.value=!0,E(e.evt)):E(e.evt)}let x=(0,e.computed)(()=>[[fi,w,void 0,{prevent:!0,stop:!0,mouse:!0}]]);function S(){let{top:e,left:t,width:n,height:a}=o.$el.getBoundingClientRect();i={top:e+a/2,left:t+n/2}}function C(e){S(),E(e)}function T(e){S(),E(e,!0)}function P(e){if(!1===Qs.includes(e.keyCode))return;k(e);let t=([34,33].includes(e.keyCode)?10:1)*m.value,n=[34,37,40].includes(e.keyCode)?-t:t;s.value=ge(parseFloat((s.value+n).toFixed(f.value)),u.value,c.value),L()}function E(e,n){let o=v(e),l=Math.abs(o.top-i.top),d=Math.sqrt(l**2+Math.abs(o.left-i.left)**2),h=Math.asin(l/d)*(180/Math.PI);h=o.top=m.value/2?(e<0?-1:1)*m.value:0),p=parseFloat(p.toFixed(f.value))}p=ge(p,u.value,c.value),a("dragValue",p),s.value!==p&&(s.value=p),L(n)}function A(e){Qs.includes(e.keyCode)&&L(!0)}function L(e){t.modelValue!==s.value&&a("update:modelValue",s.value),!0===e&&a("change",s.value)}let M=Sa(t);function R(){return(0,e.h)("input",M.value)}return()=>{let e={class:p.value,role:"slider","aria-valuemin":u.value,"aria-valuemax":c.value,"aria-valuenow":t.modelValue,...b.value,...y.value,value:s.value,instantFeedback:_.value,...g.value},a={default:n.default};return!0===h.value&&void 0!==t.name&&(a.internal=R),Oe(di,e,a,"knob",h.value,()=>x.value)}}});let{passive:Xs}=m,el=["both","horizontal","vertical"];var tl=h({name:"QScrollObserver",props:{axis:{type:String,validator:e=>el.includes(e),default:"vertical"},debounce:[String,Number],scrollTarget:Cn},emits:["scroll"],setup(t,{emit:n}){let a,i,o={position:{top:0,left:0},direction:"down",directionChanged:!1,delta:{top:0,left:0},inflectionPoint:{top:0,left:0}},r=null;function s(){r?.();let e=Math.max(0,An(a)),i=Ln(a),s={top:e-o.position.top,left:i-o.position.left};if("vertical"===t.axis&&0===s.top||"horizontal"===t.axis&&0===s.left)return;let l=Math.abs(s.top)>=Math.abs(s.left)?s.top<0?"up":"down":s.left<0?"left":"right";o.position={top:e,left:i},o.directionChanged=o.direction!==l,o.delta=s,!0===o.directionChanged&&(o.direction=l,o.inflectionPoint=o.position),n("scroll",{...o})}function l(){a=Pn(i,t.scrollTarget),a.addEventListener("scroll",c,Xs),c(!0)}function u(){void 0!==a&&(a.removeEventListener("scroll",c,Xs),a=void 0)}function c(e){if(!0===e||0===t.debounce||"0"===t.debounce)s();else if(null===r){let[e,n]=t.debounce?[setTimeout(s,t.debounce),clearTimeout]:[requestAnimationFrame(s),cancelAnimationFrame];r=()=>{n(e),r=null}}}(0,e.watch)(()=>t.scrollTarget,()=>{u(),l()});let{proxy:d}=(0,e.getCurrentInstance)();return(0,e.watch)(()=>d.$q.lang.rtl,s),(0,e.onMounted)(()=>{i=d.$el.parentNode,l()}),(0,e.onBeforeUnmount)(()=>{r?.(),u()}),Object.assign(d,{trigger:c,getPosition:()=>o}),_}}),nl=h({name:"QLayout",props:{container:Boolean,view:{type:String,default:"hhh lpr fff",validator:e=>/^(h|l)h(h|r) lpr (f|l)f(f|r)$/.test(e.toLowerCase())},onScroll:Function,onScrollHeight:Function,onResize:Function},setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=(0,e.ref)(null),s=(0,e.ref)(i.screen.height),l=(0,e.ref)(!0===t.container?0:i.screen.width),u=(0,e.ref)({position:0,direction:"down",inflectionPoint:0}),c=(0,e.ref)(0),d=(0,e.ref)(!0===r.value?0:Dn()),h=(0,e.computed)(()=>"q-layout q-layout--"+(!0===t.container?"containerized":"standard")),p=(0,e.computed)(()=>!1===t.container?{minHeight:i.screen.height+"px"}:null),f=(0,e.computed)(()=>0===d.value?null:{[!0===i.lang.rtl?"left":"right"]:`${d.value}px`}),m=(0,e.computed)(()=>0===d.value?null:{[!0===i.lang.rtl?"right":"left"]:0,[!0===i.lang.rtl?"left":"right"]:`-${d.value}px`,width:`calc(100% + ${d.value}px)`});function _(e){if(!0===t.container||!0!==document.qScrollPrevented){let n={position:e.position.top,direction:e.direction,directionChanged:e.directionChanged,inflectionPoint:e.inflectionPoint.top,delta:e.delta.top};u.value=n,void 0!==t.onScroll&&a("scroll",n)}}function g(e){let{height:n,width:i}=e,o=!1;s.value!==n&&(o=!0,s.value=n,void 0!==t.onScrollHeight&&a("scrollHeight",n),b()),l.value!==i&&(o=!0,l.value=i),!0===o&&void 0!==t.onResize&&a("resize",e)}function v({height:e}){c.value!==e&&(c.value=e,b())}function b(){if(!0===t.container){let e=s.value>c.value?Dn():0;d.value!==e&&(d.value=e)}}let y=null,w={instances:{},view:(0,e.computed)(()=>t.view),isContainer:(0,e.computed)(()=>t.container),rootRef:o,height:s,containerHeight:c,scrollbarWidth:d,totalWidth:(0,e.computed)(()=>l.value+d.value),rows:(0,e.computed)(()=>{let e=t.view.toLowerCase().split(" ");return{top:e[0].split(""),middle:e[1].split(""),bottom:e[2].split("")}}),header:(0,e.reactive)({size:0,offset:0,space:!1}),right:(0,e.reactive)({size:300,offset:0,space:!1}),footer:(0,e.reactive)({size:0,offset:0,space:!1}),left:(0,e.reactive)({size:300,offset:0,space:!1}),scroll:u,animate(){null===y?document.body.classList.add("q-body--layout-animate"):clearTimeout(y),y=setTimeout(()=>{y=null,document.body.classList.remove("q-body--layout-animate")},155)},update(e,t,n){w[e][t]=n}};if((0,e.provide)(Q,w),Dn()>0){let C=null,T=document.body;function k(){C=null,T.classList.remove("hide-scrollbar")}function x(){if(null===C){if(T.scrollHeight>i.screen.height)return;T.classList.add("hide-scrollbar")}else clearTimeout(C);C=setTimeout(k,300)}function S(e){null!==C&&"remove"===e&&(clearTimeout(C),k()),window[`${e}EventListener`]("resize",x)}(0,e.watch)(()=>!0===t.container?"remove":"add",S),!0!==t.container&&S("add"),(0,e.onUnmounted)(()=>{S("remove")})}return()=>{let a=Re(n.default,[(0,e.h)(tl,{onScroll:_}),(0,e.h)(Ti,{onResize:g})]),i=(0,e.h)("div",{class:h.value,style:p.value,ref:!0===t.container?void 0:o,tabindex:-1},a);return!0===t.container?(0,e.h)("div",{class:"q-layout-container overflow-hidden",ref:o},[(0,e.h)(Ti,{onResize:v}),(0,e.h)("div",{class:"absolute-full",style:f.value},[(0,e.h)("div",{class:"scroll",style:m.value},[i])])]):i}}});let al=["horizontal","vertical","cell","none"];var il=h({name:"QMarkupTable",props:{...Xe,dense:Boolean,flat:Boolean,bordered:Boolean,square:Boolean,wrapCells:Boolean,separator:{type:String,default:"horizontal",validator:e=>al.includes(e)}},setup(t,{slots:n}){let a=et(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>`q-markup-table q-table__container q-table__card q-table--${t.separator}-separator`+(!0===a.value?" q-table--dark q-table__card--dark q-dark":"")+(!0===t.dense?" q-table--dense":"")+(!0===t.flat?" q-table--flat":"")+(!0===t.bordered?" q-table--bordered":"")+(!0===t.square?" q-table--square":"")+(!1===t.wrapCells?" q-table--no-wrap":""));return()=>(0,e.h)("div",{class:i.value},[(0,e.h)("table",{class:"q-table"},Le(n.default))])}}),ol=h({name:"QNoSsr",props:{tag:{type:String,default:"div"},placeholder:String},setup(t,{slots:n}){let{isHydrated:a}=xi();return()=>{if(!0===a.value){let a=Le(n.default);return void 0===a?a:a.length>1?(0,e.h)(t.tag,{},a):a[0]}let i={class:"q-no-ssr-placeholder"},o=Le(n.placeholder);return void 0!==o?o.length>1?(0,e.h)(t.tag,i,o):o[0]:void 0!==t.placeholder?(0,e.h)(t.tag,i,t.placeholder):void 0}}});var rl=h({name:"QRadio",props:{...Xe,...Ee,...xa,modelValue:{required:!0},val:{required:!0},label:String,leftLabel:Boolean,checkedIcon:String,uncheckedIcon:String,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},emits:["update:modelValue"],setup(t,{slots:n,emit:a}){let{proxy:i}=(0,e.getCurrentInstance)(),o=et(t,i.$q),r=Ae(t,ti),s=(0,e.ref)(null),{refocusTargetEl:l,refocusTarget:u}=ei(t,s),c=(0,e.computed)(()=>(0,e.toRaw)(t.modelValue)===(0,e.toRaw)(t.val)),d=(0,e.computed)(()=>"q-radio cursor-pointer no-outline row inline no-wrap items-center"+(!0===t.disable?" disabled":"")+(!0===o.value?" q-radio--dark":"")+(!0===t.dense?" q-radio--dense":"")+(!0===t.leftLabel?" reverse":"")),h=(0,e.computed)(()=>{let e=void 0===t.color||!0!==t.keepColor&&!0!==c.value?"":` text-${t.color}`;return`q-radio__inner relative-position q-radio__inner--${!0===c.value?"truthy":"falsy"}${e}`}),p=(0,e.computed)(()=>(!0===c.value?t.checkedIcon:t.uncheckedIcon)||null),f=(0,e.computed)(()=>!0===t.disable?-1:t.tabindex||0),m=Ca((0,e.computed)(()=>{let e={type:"radio"};return void 0!==t.name&&Object.assign(e,{".checked":!0===c.value,"^checked":!0===c.value?"checked":void 0,name:t.name,value:t.val}),e}));function _(e){void 0!==e&&(k(e),u(e)),!0!==t.disable&&!0!==c.value&&a("update:modelValue",t.val,e)}function g(e){(13===e.keyCode||32===e.keyCode)&&k(e)}function v(e){(13===e.keyCode||32===e.keyCode)&&_(e)}Object.assign(i,{set:_});let b=(0,e.h)("svg",{key:"svg",class:"q-radio__bg absolute non-selectable",viewBox:"0 0 24 24"},[(0,e.h)("path",{d:"M12,22a10,10 0 0 1 -10,-10a10,10 0 0 1 10,-10a10,10 0 0 1 10,10a10,10 0 0 1 -10,10m0,-22a12,12 0 0 0 -12,12a12,12 0 0 0 12,12a12,12 0 0 0 12,-12a12,12 0 0 0 -12,-12"}),(0,e.h)("path",{class:"q-radio__check",d:"M12,6a6,6 0 0 0 -6,6a6,6 0 0 0 6,6a6,6 0 0 0 6,-6a6,6 0 0 0 -6,-6"})]);return()=>{let a=null===p.value?[b]:[(0,e.h)("div",{key:"icon",class:"q-radio__icon-container absolute-full flex flex-center no-wrap"},[(0,e.h)(Ye,{class:"q-radio__icon",name:p.value})])];!0!==t.disable&&m(a,"unshift"," q-radio__native q-ma-none q-pa-none");let i=[(0,e.h)("div",{class:h.value,style:r.value,"aria-hidden":"true"},a)];null!==l.value&&i.push(l.value);let o=void 0===t.label?Le(n.default):Re(n.default,[t.label]);return void 0!==o&&i.push((0,e.h)("div",{class:"q-radio__label q-anchor--skip"},o)),(0,e.h)("div",{ref:s,class:d.value,tabindex:f.value,role:"radio","aria-label":t.label,"aria-checked":!0===c.value?"true":"false","aria-disabled":!0===t.disable?"true":void 0,onClick:_,onKeydown:g,onKeyup:v},i)}}}),sl=h({name:"QToggle",props:{...ni,icon:String,iconColor:String},emits:ai,setup:t=>ii("toggle",function(n,a){let i=(0,e.computed)(()=>(!0===n.value?t.checkedIcon:!0===a.value?t.indeterminateIcon:t.uncheckedIcon)||t.icon),o=(0,e.computed)(()=>!0===n.value?t.iconColor:null);return()=>[(0,e.h)("div",{class:"q-toggle__track"}),(0,e.h)("div",{class:"q-toggle__thumb absolute flex flex-center no-wrap"},void 0===i.value?void 0:[(0,e.h)(Ye,{name:i.value,color:o.value})])]})});let ll={radio:rl,checkbox:oi,toggle:sl},ul=Object.keys(ll);function cl(e,t){if("function"==typeof e)return e;let n=void 0===e?t:e;return e=>e[n]}var dl=h({name:"QOptionGroup",props:{...Xe,modelValue:{required:!0},options:{type:Array,validator:e=>e.every(oe),default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],name:String,type:{type:String,default:"radio",validator:e=>ul.includes(e)},color:String,keepColor:Boolean,dense:Boolean,size:String,leftLabel:Boolean,inline:Boolean,disable:Boolean},emits:["update:modelValue"],setup(t,{emit:n,slots:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=Array.isArray(t.modelValue);"radio"===t.type?!0===o&&console.error("q-option-group: model should not be array"):!1===o&&console.error("q-option-group: model should be array in your case");let r=et(t,i),s=(0,e.computed)(()=>ll[t.type]),l=(0,e.computed)(()=>cl(t.optionValue,"value")),u=(0,e.computed)(()=>cl(t.optionLabel,"label")),c=(0,e.computed)(()=>cl(t.optionDisable,"disable")),d=(0,e.computed)(()=>t.options.map(e=>({val:l.value(e),name:void 0===e.name?t.name:e.name,disable:t.disable||c.value(e),leftLabel:void 0===e.leftLabel?t.leftLabel:e.leftLabel,color:void 0===e.color?t.color:e.color,checkedIcon:e.checkedIcon,uncheckedIcon:e.uncheckedIcon,dark:void 0===e.dark?r.value:e.dark,size:void 0===e.size?t.size:e.size,dense:t.dense,keepColor:void 0===e.keepColor?t.keepColor:e.keepColor}))),h=(0,e.computed)(()=>"q-option-group q-gutter-x-sm"+(!0===t.inline?" q-option-group--inline":"")),p=(0,e.computed)(()=>{let e={role:"group"};return"radio"===t.type&&(e.role="radiogroup",!0===t.disable&&(e["aria-disabled"]="true")),e});function f(e){n("update:modelValue",e)}return()=>(0,e.h)("div",{class:h.value,...p.value},t.options.map((n,i)=>{let o=void 0===a["label-"+i]?void 0===a.label?void 0:()=>a.label(n):()=>a["label-"+i](n);return(0,e.h)("div",[(0,e.h)(s.value,{label:void 0===o?u.value(n):null,modelValue:t.modelValue,"onUpdate:modelValue":f,...d.value[i]},o)])}))}}),hl=h({name:"QPage",props:{padding:Boolean,styleFn:Function},setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=(0,e.inject)(Q,te);if(i===te)return console.error("QPage needs to be a deep child of QLayout"),te;if((0,e.inject)("_q_pc_",te)===te)return console.error("QPage needs to be child of QPageContainer"),te;let o=(0,e.computed)(()=>{let e=(!0===i.header.space?i.header.size:0)+(!0===i.footer.space?i.footer.size:0);if("function"==typeof t.styleFn){let n=!0===i.isContainer.value?i.containerHeight.value:a.screen.height;return t.styleFn(e,n)}return{minHeight:!0===i.isContainer.value?i.containerHeight.value-e+"px":0===a.screen.height?0===e?"100vh":`calc(100vh - ${e}px)`:a.screen.height-e+"px"}}),r=(0,e.computed)(()=>"q-page"+(!0===t.padding?" q-layout-padding":""));return()=>(0,e.h)("main",{class:r.value,style:o.value},Le(n.default))}}),pl=h({name:"QPageContainer",setup(t,{slots:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=(0,e.inject)(Q,te);if(i===te)return console.error("QPageContainer needs to be child of QLayout"),te;(0,e.provide)("_q_pc_",!0);let o=(0,e.computed)(()=>{let e={};return!0===i.header.space&&(e.paddingTop=`${i.header.size}px`),!0===i.right.space&&(e["padding"+(!0===a.lang.rtl?"Left":"Right")]=`${i.right.size}px`),!0===i.footer.space&&(e.paddingBottom=`${i.footer.size}px`),!0===i.left.space&&(e["padding"+(!0===a.lang.rtl?"Right":"Left")]=`${i.left.size}px`),e});return()=>(0,e.h)("div",{class:"q-page-container",style:o.value},Le(n.default))}});let fl={position:{type:String,default:"bottom-right",validator:e=>["top-right","top-left","bottom-right","bottom-left","top","right","bottom","left"].includes(e)},offset:{type:Array,validator:e=>2===e.length},expand:Boolean};function ml(){let{props:t,proxy:{$q:n}}=(0,e.getCurrentInstance)(),a=(0,e.inject)(Q,te);if(a===te)return console.error("QPageSticky needs to be child of QLayout"),te;let i=(0,e.computed)(()=>{let e=t.position;return{top:-1!==e.indexOf("top"),right:-1!==e.indexOf("right"),bottom:-1!==e.indexOf("bottom"),left:-1!==e.indexOf("left"),vertical:"top"===e||"bottom"===e,horizontal:"left"===e||"right"===e}}),o=(0,e.computed)(()=>a.header.offset),r=(0,e.computed)(()=>a.right.offset),s=(0,e.computed)(()=>a.footer.offset),l=(0,e.computed)(()=>a.left.offset),u=(0,e.computed)(()=>{let e=0,a=0,u=i.value,c=!0===n.lang.rtl?-1:1;!0===u.top&&0!==o.value?a=`${o.value}px`:!0===u.bottom&&0!==s.value&&(a=-s.value+"px"),!0===u.left&&0!==l.value?e=c*l.value+"px":!0===u.right&&0!==r.value&&(e=-c*r.value+"px");let d={transform:`translate(${e}, ${a})`};return t.offset&&(d.margin=`${t.offset[1]}px ${t.offset[0]}px`),!0===u.vertical?(0!==l.value&&(d[!0===n.lang.rtl?"right":"left"]=`${l.value}px`),0!==r.value&&(d[!0===n.lang.rtl?"left":"right"]=`${r.value}px`)):!0===u.horizontal&&(0!==o.value&&(d.top=`${o.value}px`),0!==s.value&&(d.bottom=`${s.value}px`)),d}),c=(0,e.computed)(()=>`q-page-sticky row flex-center fixed-${t.position} q-page-sticky--${!0===t.expand?"expand":"shrink"}`);return{$layout:a,getStickyContent:function(n){let a=Le(n.default);return(0,e.h)("div",{class:c.value,style:u.value},!0===t.expand?a:[(0,e.h)("div",a)])}}}var _l=h({name:"QPageScroller",props:{...fl,scrollOffset:{type:Number,default:1e3},reverse:Boolean,duration:{type:Number,default:300},offset:{...fl.offset,default:()=>[18,18]}},emits:["click"],setup(t,{slots:n,emit:a}){let i,{proxy:{$q:o}}=(0,e.getCurrentInstance)(),{$layout:r,getStickyContent:s}=ml(),l=(0,e.ref)(null),u=(0,e.computed)(()=>r.height.value-(!0===r.isContainer.value?r.containerHeight.value:o.screen.height));function c(){return!0===t.reverse?u.value-r.scroll.value.position>t.scrollOffset:r.scroll.value.position>t.scrollOffset}let d=(0,e.ref)(c());function h(){let e=c();d.value!==e&&(d.value=e)}function p(){!0===t.reverse?void 0===i&&(i=(0,e.watch)(u,h)):f()}function f(){void 0!==i&&(i(),i=void 0)}function m(e){In(Pn(!0===r.isContainer.value?l.value:r.rootRef.value),!0===t.reverse?r.height.value:0,t.duration),a("click",e)}function _(){return!0===d.value?(0,e.h)("div",{ref:l,class:"q-page-scroller",onClick:m},s(n)):null}return(0,e.watch)(r.scroll,h),(0,e.watch)(()=>t.reverse,p),p(),(0,e.onBeforeUnmount)(f),()=>(0,e.h)(e.Transition,{name:"q-transition--fade"},_)}}),gl=h({name:"QPageSticky",props:fl,setup(e,{slots:t}){let{getStickyContent:n}=ml();return()=>n(t)}});function vl(e,t){return[!0,!1].includes(e)?e:t}var bl=h({name:"QPagination",props:{...Xe,modelValue:{type:Number,required:!0},min:{type:[Number,String],default:1},max:{type:[Number,String],required:!0},maxPages:{type:[Number,String],default:0,validator:e=>("string"==typeof e?parseInt(e,10):e)>=0},inputStyle:[Array,String,Object],inputClass:[Array,String,Object],size:String,disable:Boolean,input:Boolean,iconPrev:String,iconNext:String,iconFirst:String,iconLast:String,toFn:Function,boundaryLinks:{type:Boolean,default:null},boundaryNumbers:{type:Boolean,default:null},directionLinks:{type:Boolean,default:null},ellipses:{type:Boolean,default:null},ripple:{type:[Boolean,Object],default:null},round:Boolean,rounded:Boolean,flat:Boolean,outline:Boolean,unelevated:Boolean,push:Boolean,glossy:Boolean,color:{type:String,default:"primary"},textColor:String,activeDesign:{type:String,default:"",values:e=>""===e||jt.includes(e)},activeColor:String,activeTextColor:String,gutter:String,padding:{type:String,default:"3px 2px"}},emits:["update:modelValue"],setup(t,{emit:n}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:i}=a,o=et(t,i),r=(0,e.computed)(()=>parseInt(t.min,10)),s=(0,e.computed)(()=>parseInt(t.max,10)),l=(0,e.computed)(()=>parseInt(t.maxPages,10)),u=(0,e.computed)(()=>m.value+" / "+s.value),c=(0,e.computed)(()=>vl(t.boundaryLinks,t.input)),d=(0,e.computed)(()=>vl(t.boundaryNumbers,!t.input)),h=(0,e.computed)(()=>vl(t.directionLinks,t.input)),p=(0,e.computed)(()=>vl(t.ellipses,!t.input)),f=(0,e.ref)(null),m=(0,e.computed)({get:()=>t.modelValue,set:e=>{if(e=parseInt(e,10),t.disable||isNaN(e))return;let a=ge(e,r.value,s.value);t.modelValue!==a&&n("update:modelValue",a)}});(0,e.watch)(()=>`${r.value}|${s.value}`,()=>{m.value=t.modelValue});let _=(0,e.computed)(()=>"q-pagination row no-wrap items-center"+(!0===t.disable?" disabled":"")),g=(0,e.computed)(()=>t.gutter in It?`${It[t.gutter]}px`:t.gutter||null),v=(0,e.computed)(()=>null===g.value?null:`--q-pagination-gutter-parent:-${g.value};--q-pagination-gutter-child:${g.value}`),b=(0,e.computed)(()=>{let e=[t.iconFirst||i.iconSet.pagination.first,t.iconPrev||i.iconSet.pagination.prev,t.iconNext||i.iconSet.pagination.next,t.iconLast||i.iconSet.pagination.last];return!0===i.lang.rtl?e.reverse():e}),y=(0,e.computed)(()=>({"aria-disabled":!0===t.disable?"true":"false",role:"navigation"})),w=(0,e.computed)(()=>Bt(t,"flat")),k=(0,e.computed)(()=>({[w.value]:!0,round:t.round,rounded:t.rounded,padding:t.padding,color:t.color,textColor:t.textColor,size:t.size,ripple:null===t.ripple||t.ripple})),x=(0,e.computed)(()=>{let e={[w.value]:!1};return""!==t.activeDesign&&(e[t.activeDesign]=!0),e}),S=(0,e.computed)(()=>({...x.value,color:t.activeColor||t.color,textColor:t.activeTextColor||t.textColor})),C=(0,e.computed)(()=>{let e=Math.max(l.value,1+(p.value?2:0)+(d.value?2:0)),n={pgFrom:r.value,pgTo:s.value,ellipsesStart:!1,ellipsesEnd:!1,boundaryStart:!1,boundaryEnd:!1,marginalStyle:{minWidth:`${Math.max(2,String(s.value).length)}em`}};return l.value&&er.value+ +!!d.value&&(n.ellipsesStart=!0,n.pgFrom++),d.value&&(n.boundaryEnd=!0,n.pgTo--),p.value&&n.pgTo{T(a)}:o.to=t.toFn(a)),(0,e.h)(Kt,o)}return Object.assign(a,{set:T,setByOffset:function(e){m.value+=e}}),()=>{let n,a=[],l=[];if(!0===c.value&&(a.push(L({key:"bls",disable:t.disable||t.modelValue<=r.value,icon:b.value[0],"aria-label":i.lang.pagination.first},r.value)),l.unshift(L({key:"ble",disable:t.disable||t.modelValue>=s.value,icon:b.value[3],"aria-label":i.lang.pagination.last},s.value))),!0===h.value&&(a.push(L({key:"bdp",disable:t.disable||t.modelValue<=r.value,icon:b.value[1],"aria-label":i.lang.pagination.prev},t.modelValue-1)),l.unshift(L({key:"bdn",disable:t.disable||t.modelValue>=s.value,icon:b.value[2],"aria-label":i.lang.pagination.next},t.modelValue+1))),!0!==t.input){n=[];let{pgFrom:e,pgTo:i,marginalStyle:o}=C.value;if(!0===C.value.boundaryStart){let e=r.value===t.modelValue;a.push(L({key:"bns",style:o,disable:t.disable,label:r.value},r.value,e))}if(!0===C.value.boundaryEnd){let e=s.value===t.modelValue;l.unshift(L({key:"bne",style:o,disable:t.disable,label:s.value},s.value,e))}!0===C.value.ellipsesStart&&a.push(L({key:"bes",style:o,disable:t.disable,label:"…",ripple:!1},e-1)),!0===C.value.ellipsesEnd&&l.unshift(L({key:"bee",style:o,disable:t.disable,label:"…",ripple:!1},i+1));for(let a=e;a<=i;a++)n.push(L({key:`bpg${a}`,style:o,disable:t.disable,label:a},a,a===t.modelValue))}return(0,e.h)("div",{class:_.value,...y.value},[(0,e.h)("div",{class:"q-pagination__content row no-wrap items-center",style:v.value},[...a,!0===t.input?(0,e.h)($s,{class:"inline",style:{width:u.value.length/1.5+"em"},type:"number",dense:!0,value:f.value,disable:t.disable,dark:o.value,borderless:!0,inputClass:t.inputClass,inputStyle:t.inputStyle,placeholder:u.value,min:r.value,max:s.value,"onUpdate:modelValue":E,onKeyup:A,onBlur:P}):(0,e.h)("div",{class:"q-pagination__middle row justify-center"},n),...l])])}}});function yl(e){let t,n,a=!1;function i(){n=arguments,!0!==a&&(a=!0,t=window.requestAnimationFrame(()=>{e.apply(this,n),n=void 0,a=!1}))}return i.cancel=()=>{window.cancelAnimationFrame(t),a=!1},i}let{passive:wl}=m;var kl=h({name:"QParallax",props:{src:String,height:{type:Number,default:500},speed:{type:Number,default:1,validator:e=>e>=0&&e<=1},scrollTarget:Cn,onScroll:Function},setup(t,{slots:n,emit:a}){let i,o,r,s,l,u,c=(0,e.ref)(0),d=(0,e.ref)(null),h=(0,e.ref)(null),p=(0,e.ref)(null);(0,e.watch)(()=>t.height,()=>{!0===i&&m()}),(0,e.watch)(()=>t.scrollTarget,()=>{!0===i&&(b(),v())});let f=e=>{c.value=e,void 0!==t.onScroll&&a("scroll",e)};function m(){let e,n,a;u===window?(e=0,a=n=window.innerHeight):(e=Ct(u).top,n=Tt(u),a=e+n);let i=Ct(d.value).top,o=i+t.height;if(void 0!==l||o>e&&i{o.style.transform=`translate3d(-50%,${Math.round(e)}px,0)`};function g(){r=o.naturalHeight||o.videoHeight||Tt(o),!0===i&&m()}function v(){i=!0,u=Pn(d.value,t.scrollTarget),u.addEventListener("scroll",m,wl),window.addEventListener("resize",s,wl),m()}function b(){!0===i&&(i=!1,u.removeEventListener("scroll",m,wl),window.removeEventListener("resize",s,wl),u=void 0,_.cancel(),f.cancel(),s.cancel())}return(0,e.onMounted)(()=>{_=yl(_),f=yl(f),s=yl(g),o=void 0===n.media?p.value:h.value.children[0],o.onload=o.onloadstart=o.loadedmetadata=g,g(),o.style.display="initial",void 0===window.IntersectionObserver?v():(l=new IntersectionObserver(e=>{(!0===e[0].isIntersecting?v:b)()}),l.observe(d.value))}),(0,e.onBeforeUnmount)(()=>{b(),l?.disconnect(),o.onload=o.onloadstart=o.loadedmetadata=null}),()=>(0,e.h)("div",{ref:d,class:"q-parallax",style:{height:`${t.height}px`}},[(0,e.h)("div",{ref:h,class:"q-parallax__media absolute-full"},void 0===n.media?[(0,e.h)("img",{ref:p,src:t.src})]:n.media()),(0,e.h)("div",{class:"q-parallax__content absolute-full column flex-center"},void 0===n.content?Le(n.default):n.content({percentScrolled:c.value}))])}});function xl(e,t=new WeakMap){if(Object(e)!==e)return e;if(t.has(e))return t.get(e);let n=e instanceof Date?new Date(e):e instanceof RegExp?new RegExp(e.source,e.flags):e instanceof Set?new Set:e instanceof Map?new Map:"function"==typeof e.constructor?void 0!==e.prototype&&"function"==typeof e.prototype.constructor?e:new e.constructor:Object.create(null);if("function"==typeof e.constructor&&"function"==typeof e.valueOf){let n=e.valueOf();if(Object(n)!==n){let a=new e.constructor(n);return t.set(e,a),a}}return t.set(e,n),e instanceof Set?e.forEach(e=>{n.add(xl(e,t))}):e instanceof Map&&e.forEach((e,a)=>{n.set(a,xl(e,t))}),Object.assign(n,...Object.keys(e).map(n=>({[n]:xl(e[n],t)})))}var Sl=h({name:"QPopupEdit",props:{modelValue:{required:!0},title:String,buttons:Boolean,labelSet:String,labelCancel:String,color:{type:String,default:"primary"},validate:{type:Function,default:()=>!0},autoSave:Boolean,cover:{type:Boolean,default:!0},disable:Boolean},emits:["update:modelValue","save","cancel","beforeShow","show","beforeHide","hide"],setup(t,{slots:n,emit:i}){let{proxy:o}=(0,e.getCurrentInstance)(),{$q:r}=o,s=(0,e.ref)(null),l=(0,e.ref)(""),u=(0,e.ref)(""),c=!1,d=(0,e.computed)(()=>a({initialValue:l.value,validate:t.validate,set:h,cancel:p,updatePosition:f},"value",()=>u.value,e=>{u.value=e}));function h(){!1!==t.validate(u.value)&&(!0===m()&&(i("save",u.value,l.value),i("update:modelValue",u.value)),_())}function p(){!0===m()&&i("cancel",u.value,l.value),_()}function f(){(0,e.nextTick)(()=>{s.value.updatePosition()})}function m(){return!1===ie(u.value,l.value)}function _(){c=!0,s.value.hide()}function g(){c=!1,l.value=xl(t.modelValue),u.value=xl(t.modelValue),i("beforeShow")}function v(){i("show")}function b(){!1===c&&!0===m()&&(!0===t.autoSave&&!0===t.validate(u.value)?(i("save",u.value,l.value),i("update:modelValue",u.value)):i("cancel",u.value,l.value)),i("beforeHide")}function y(){i("hide")}function w(){let a=void 0===n.default?[]:[].concat(n.default(d.value));return t.title&&a.unshift((0,e.h)("div",{class:"q-dialog__title q-mt-sm q-mb-sm"},t.title)),!0===t.buttons&&a.push((0,e.h)("div",{class:"q-popup-edit__buttons row justify-center no-wrap"},[(0,e.h)(Kt,{flat:!0,color:t.color,label:t.labelCancel||r.lang.label.cancel,onClick:p}),(0,e.h)(Kt,{flat:!0,color:t.color,label:t.labelSet||r.lang.label.set,onClick:h})])),a}return Object.assign(o,{set:h,cancel:p,show(e){s.value?.show(e)},hide(e){s.value?.hide(e)},updatePosition:f}),()=>{if(!0!==t.disable)return(0,e.h)(pa,{ref:s,class:"q-popup-edit",cover:t.cover,onBeforeShow:g,onShow:v,onBeforeHide:b,onHide:y,onEscapeKey:p},w)}}}),Cl=h({name:"QPopupProxy",props:{...Jt,breakpoint:{type:[String,Number],default:450}},emits:["show","hide"],setup(t,{slots:n,emit:i,attrs:o}){let{proxy:r}=(0,e.getCurrentInstance)(),{$q:s}=r,l=(0,e.ref)(!1),u=(0,e.ref)(null),c=(0,e.computed)(()=>parseInt(t.breakpoint,10)),{canShow:d}=Xt({showing:l});function h(){return s.screen.width"menu"===p.value?{maxHeight:"99vh"}:{});function m(e){l.value=!0,i("show",e)}function _(e){l.value=!1,p.value=h(),i("hide",e)}return(0,e.watch)(()=>h(),e=>{!0!==l.value&&(p.value=e)}),Object.assign(r,{show(e){!0===d(e)&&u.value.show(e)},hide(e){u.value.hide(e)},toggle(e){u.value.toggle(e)}}),a(r,"currentComponent",()=>({type:p.value,ref:u.value})),()=>{let a,i={ref:u,...f.value,...o,onShow:m,onHide:_};return"dialog"===p.value?a=pr:(a=pa,Object.assign(i,{target:t.target,contextMenu:t.contextMenu,noParentEvent:!0,separateClosePopup:!0})),(0,e.h)(a,i,n.default)}}});let Tl={xs:2,sm:4,md:6,lg:10,xl:14};function Pl(e,t,n){return{transform:!0===t?`translateX(${!0===n.lang.rtl?"-":""}100%) scale3d(${-e},1,1)`:`scale3d(${e},1,1)`}}var El=h({name:"QLinearProgress",props:{...Xe,...Ee,value:{type:Number,default:0},buffer:Number,color:String,trackColor:String,reverse:Boolean,stripe:Boolean,indeterminate:Boolean,query:Boolean,rounded:Boolean,animationSpeed:{type:[String,Number],default:2100},instantFeedback:Boolean},setup(t,{slots:n}){let{proxy:a}=(0,e.getCurrentInstance)(),i=et(t,a.$q),o=Ae(t,Tl),r=(0,e.computed)(()=>!0===t.indeterminate||!0===t.query),s=(0,e.computed)(()=>t.reverse!==t.query),l=(0,e.computed)(()=>({...null===o.value?{}:o.value,"--q-linear-progress-speed":`${t.animationSpeed}ms`})),u=(0,e.computed)(()=>"q-linear-progress"+(void 0===t.color?"":` text-${t.color}`)+(!0===t.reverse||!0===t.query?" q-linear-progress--reverse":"")+(!0===t.rounded?" rounded-borders":"")),c=(0,e.computed)(()=>Pl(void 0===t.buffer?1:t.buffer,s.value,a.$q)),d=(0,e.computed)(()=>`with${!0===t.instantFeedback?"out":""}-transition`),h=(0,e.computed)(()=>`q-linear-progress__track absolute-full q-linear-progress__track--${d.value} q-linear-progress__track--${!0===i.value?"dark":"light"}`+(void 0===t.trackColor?"":` bg-${t.trackColor}`)),p=(0,e.computed)(()=>Pl(!0===r.value?1:t.value,s.value,a.$q)),f=(0,e.computed)(()=>`q-linear-progress__model absolute-full q-linear-progress__model--${d.value} q-linear-progress__model--${!0===r.value?"in":""}determinate`),m=(0,e.computed)(()=>({width:100*t.value+"%"})),_=(0,e.computed)(()=>`q-linear-progress__stripe absolute-${!0===t.reverse?"right":"left"} q-linear-progress__stripe--${d.value}`);return()=>{let a=[(0,e.h)("div",{class:h.value,style:c.value}),(0,e.h)("div",{class:f.value,style:p.value})];return!0===t.stripe&&!1===r.value&&a.push((0,e.h)("div",{class:_.value,style:m.value})),(0,e.h)("div",{class:u.value,style:l.value,role:"progressbar","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":!0===t.indeterminate?void 0:t.value},Re(n.default,a))}}}),Al=h({name:"QPullToRefresh",props:{color:String,bgColor:String,icon:String,noMouse:Boolean,disable:Boolean,scrollTarget:Cn},emits:["refresh"],setup(t,{slots:n,emit:a}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:o}=i,r=(0,e.ref)("pull"),s=(0,e.ref)(0),l=(0,e.ref)(!1),u=(0,e.ref)(-40),c=(0,e.ref)(!1),d=(0,e.ref)({}),h=(0,e.computed)(()=>({opacity:s.value,transform:`translateY(${u.value}px) rotate(${360*s.value}deg)`})),p=(0,e.computed)(()=>"q-pull-to-refresh__puller row flex-center"+(!0===c.value?" q-pull-to-refresh__puller--animating":"")+(void 0===t.bgColor?"":` bg-${t.bgColor}`));function f(e){if(!0===e.isFinal)return void(!0===l.value&&(l.value=!1,"pulled"===r.value?(r.value="refreshing",y({pos:20}),g()):"pull"===r.value&&y({pos:-40,ratio:0})));if(!0===c.value||"refreshing"===r.value)return!1;if(!0===e.isFirst){if(0!==An(v)||"down"!==e.direction)return!0===l.value&&(l.value=!1,r.value="pull",y({pos:-40,ratio:0})),!1;l.value=!0;let{top:t,left:n}=i.$el.getBoundingClientRect();d.value={top:t+"px",left:n+"px",width:window.getComputedStyle(i.$el).getPropertyValue("width")}}w(e.evt);let t=Math.min(140,Math.max(0,e.distance.y));u.value=t-40,s.value=ge(t/60,0,1);let n=u.value>20?"pulled":"pull";r.value!==n&&(r.value=n)}let m=(0,e.computed)(()=>{let e={down:!0};return!0!==t.noMouse&&(e.mouse=!0),[[fi,f,void 0,e]]}),_=(0,e.computed)(()=>"q-pull-to-refresh__content"+(!0===l.value?" no-pointer-events":""));function g(){a("refresh",()=>{y({pos:-40,ratio:0},()=>{r.value="pull"})})}let v,b=null;function y({pos:e,ratio:t},n){c.value=!0,u.value=e,void 0!==t&&(s.value=t),null!==b&&clearTimeout(b),b=setTimeout(()=>{b=null,c.value=!1,n?.()},300)}function k(){v=Pn(i.$el,t.scrollTarget)}return(0,e.watch)(()=>t.scrollTarget,k),(0,e.onMounted)(k),(0,e.onBeforeUnmount)(()=>{null!==b&&clearTimeout(b)}),Object.assign(i,{trigger:g,updateScrollTarget:k}),()=>Oe("div",{class:"q-pull-to-refresh"},[(0,e.h)("div",{class:_.value},Le(n.default)),(0,e.h)("div",{class:"q-pull-to-refresh__puller-container fixed row flex-center no-pointer-events z-top",style:d.value},[(0,e.h)("div",{class:p.value,style:h.value},["refreshing"===r.value?(0,e.h)(St,{size:"24px",color:t.color}):(0,e.h)(Ye,{name:t.icon||o.iconSet.pullToRefresh.icon,color:t.color,size:"32px"})])])],"main",!1===t.disable,()=>m.value)}});let Ll=0,Ml=1,Rl=2;var zl=h({name:"QRange",props:{...vi,modelValue:{type:Object,default:()=>({min:null,max:null}),validator:e=>"min"in e&&"max"in e},dragRange:Boolean,dragOnlyRange:Boolean,leftLabelColor:String,leftLabelTextColor:String,rightLabelColor:String,rightLabelTextColor:String,leftLabelValue:[String,Number],rightLabelValue:[String,Number],leftThumbColor:String,rightThumbColor:String},emits:bi,setup(t,{emit:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),{state:i,methods:o}=yi({updateValue:T,updatePosition:function(e,n=i.dragging.value){let a,r=o.getDraggingRatio(e,n),c=o.convertRatioToModel(r);switch(n.type){case Ll:r<=n.ratioMax?(a={minR:r,maxR:n.ratioMax,min:c,max:n.valueMax},i.focus.value="min"):(a={minR:n.ratioMax,maxR:r,min:n.valueMax,max:c},i.focus.value="max");break;case Rl:r>=n.ratioMin?(a={minR:n.ratioMin,maxR:r,min:n.valueMin,max:c},i.focus.value="max"):(a={minR:r,maxR:n.ratioMin,min:c,max:n.valueMin},i.focus.value="min");break;case Ml:let e=r-n.offsetRatio,t=ge(n.ratioMin+e,i.innerMinRatio.value,i.innerMaxRatio.value-n.rangeRatio),o=c-n.offsetModel,s=ge(n.valueMin+o,i.innerMin.value,i.innerMax.value-n.rangeValue);a={minR:t,maxR:t+n.rangeRatio,min:i.roundValueFn.value(s),max:i.roundValueFn.value(s+n.rangeValue)},i.focus.value="both"}u.value=null===u.value.min||null===u.value.max?{min:a.min||t.min,max:a.max||t.max}:{min:a.min,max:a.max},!0!==t.snap||0===t.step?(s.value=a.minR,l.value=a.maxR):(s.value=o.convertModelToRatio(u.value.min),l.value=o.convertModelToRatio(u.value.max))},getDragging:function(e){let{left:n,top:a,width:i,height:s}=r.value.getBoundingClientRect(),l=!0===t.dragOnlyRange?0:!0===t.vertical?y.value.offsetHeight/(2*s):y.value.offsetWidth/(2*i),c={left:n,top:a,width:i,height:s,valueMin:u.value.min,valueMax:u.value.max,ratioMin:d.value,ratioMax:h.value},p=o.getDraggingRatio(e,c);return!0!==t.dragOnlyRange&&p({type:"hidden",name:t.name,value:`${t.modelValue.min}|${t.modelValue.max}`}))}),r=(0,e.ref)(null),s=(0,e.ref)(0),l=(0,e.ref)(0),u=(0,e.ref)({min:0,max:0});function c(){u.value.min=null===t.modelValue.min?i.innerMin.value:ge(t.modelValue.min,i.innerMin.value,i.innerMax.value),u.value.max=null===t.modelValue.max?i.innerMax.value:ge(t.modelValue.max,i.innerMin.value,i.innerMax.value)}(0,e.watch)(()=>`${t.modelValue.min}|${t.modelValue.max}|${i.innerMin.value}|${i.innerMax.value}`,c),c();let d=(0,e.computed)(()=>o.convertModelToRatio(u.value.min)),h=(0,e.computed)(()=>o.convertModelToRatio(u.value.max)),p=(0,e.computed)(()=>!0===i.active.value?s.value:d.value),f=(0,e.computed)(()=>!0===i.active.value?l.value:h.value),m=(0,e.computed)(()=>{let e={[i.positionProp.value]:100*p.value+"%",[i.sizeProp.value]:100*(f.value-p.value)+"%"};return void 0!==t.selectionImg&&(e.backgroundImage=`url(${t.selectionImg}) !important`),e}),_=(0,e.computed)(()=>{if(!0!==i.editable.value)return{};if(!0===a.platform.is.mobile)return{onClick:o.onMobileClick};let e={onMousedown:o.onActivate};return(!0===t.dragRange||!0===t.dragOnlyRange)&&Object.assign(e,{onFocus:()=>{i.focus.value="both"},onBlur:o.onBlur,onKeydown:P,onKeyup:o.onKeyup}),e});function g(e){return!0!==a.platform.is.mobile&&!0===i.editable.value&&!0!==t.dragOnlyRange?{onFocus:()=>{i.focus.value=e},onBlur:o.onBlur,onKeydown:P,onKeyup:o.onKeyup}:{}}let v=(0,e.computed)(()=>!0===t.dragOnlyRange?null:i.tabindex.value),b=(0,e.computed)(()=>!0===a.platform.is.mobile||!t.dragRange&&!0!==t.dragOnlyRange?null:i.tabindex.value),y=(0,e.ref)(null),w=(0,e.computed)(()=>g("min")),x=o.getThumbRenderFn({focusValue:"min",getNodeData:()=>({ref:y,key:"tmin",...w.value,tabindex:v.value}),ratio:p,label:(0,e.computed)(()=>void 0===t.leftLabelValue?u.value.min:t.leftLabelValue),thumbColor:(0,e.computed)(()=>t.leftThumbColor||t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.leftLabelColor||t.labelColor),labelTextColor:(0,e.computed)(()=>t.leftLabelTextColor||t.labelTextColor)}),S=(0,e.computed)(()=>g("max")),C=o.getThumbRenderFn({focusValue:"max",getNodeData:()=>({...S.value,key:"tmax",tabindex:v.value}),ratio:f,label:(0,e.computed)(()=>void 0===t.rightLabelValue?u.value.max:t.rightLabelValue),thumbColor:(0,e.computed)(()=>t.rightThumbColor||t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.rightLabelColor||t.labelColor),labelTextColor:(0,e.computed)(()=>t.rightLabelTextColor||t.labelTextColor)});function T(e){(u.value.min!==t.modelValue.min||u.value.max!==t.modelValue.max)&&n("update:modelValue",{...u.value}),!0===e&&n("change",{...u.value})}function P(e){if(!1===gi.includes(e.keyCode))return;k(e);let n=([34,33].includes(e.keyCode)?10:1)*i.keyStep.value,a=([34,37,40].includes(e.keyCode)?-1:1)*(!0===i.isReversed.value?-1:1)*(!0===t.vertical?-1:1)*n;if("both"===i.focus.value){let e=u.value.max-u.value.min,t=ge(i.roundValueFn.value(u.value.min+a),i.innerMin.value,i.innerMax.value-e);u.value={min:t,max:i.roundValueFn.value(t+e)}}else{if(!1===i.focus.value)return;{let e=i.focus.value;u.value={...u.value,[e]:ge(i.roundValueFn.value(u.value[e]+a),"min"===e?i.innerMin.value:u.value.min,"max"===e?i.innerMax.value:u.value.max)}}}T()}return()=>{let n=o.getContent(m,b,_,e=>{e.push(x(),C())});return(0,e.h)("div",{ref:r,class:"q-range "+i.classes.value+(null===t.modelValue.min||null===t.modelValue.max?" q-slider--no-value":""),...i.attributes.value,"aria-valuenow":t.modelValue.min+"|"+t.modelValue.max},n)}}}),Ol=h({name:"QRating",props:{...Ee,...xa,modelValue:{type:Number,required:!0},max:{type:[String,Number],default:5},icon:[String,Array],iconHalf:[String,Array],iconSelected:[String,Array],iconAriaLabel:[String,Array],color:[String,Array],colorHalf:[String,Array],colorSelected:[String,Array],noReset:Boolean,noDimming:Boolean,readonly:Boolean,disable:Boolean},emits:["update:modelValue"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=Ae(t),r=Ca(Sa(t)),s=(0,e.ref)(0),l={},u=(0,e.computed)(()=>!0!==t.readonly&&!0!==t.disable),c=(0,e.computed)(()=>`q-rating row inline items-center q-rating--${!0===u.value?"":"non-"}editable`+(!0===t.noDimming?" q-rating--no-dimming":"")+(!0===t.disable?" disabled":"")+(void 0!==t.color&&!1===Array.isArray(t.color)?` text-${t.color}`:"")),d=(0,e.computed)(()=>{let e=!0===Array.isArray(t.icon)?t.icon.length:0,n=!0===Array.isArray(t.iconSelected)?t.iconSelected.length:0,a=!0===Array.isArray(t.iconHalf)?t.iconHalf.length:0,i=!0===Array.isArray(t.color)?t.color.length:0,o=!0===Array.isArray(t.colorSelected)?t.colorSelected.length:0,r=!0===Array.isArray(t.colorHalf)?t.colorHalf.length:0;return{iconLen:e,icon:e>0?t.icon[e-1]:t.icon,selIconLen:n,selIcon:n>0?t.iconSelected[n-1]:t.iconSelected,halfIconLen:a,halfIcon:a>0?t.iconHalf[n-1]:t.iconHalf,colorLen:i,color:i>0?t.color[i-1]:t.color,selColorLen:o,selColor:o>0?t.colorSelected[o-1]:t.colorSelected,halfColorLen:r,halfColor:r>0?t.colorHalf[r-1]:t.colorHalf}}),h=(0,e.computed)(()=>{if("string"==typeof t.iconAriaLabel){let e=0===t.iconAriaLabel.length?"":`${t.iconAriaLabel} `;return t=>`${e}${t}`}if(!0===Array.isArray(t.iconAriaLabel)){let e=t.iconAriaLabel.length;if(e>0)return n=>t.iconAriaLabel[Math.min(n,e)-1]}return(e,t)=>`${t} ${e}`}),p=(0,e.computed)(()=>{let e=[],n=d.value,a=Math.ceil(t.modelValue),o=!0===u.value?0:null,r=void 0===t.iconHalf||a===t.modelValue?-1:a;for(let l=1;l<=t.max;l++){let u=0===s.value&&t.modelValue>=l||s.value>0&&s.value>=l,c=r===l&&s.value0&&(!0===c?a:t.modelValue)>=l&&s.value{let e={role:"radiogroup"};return!0===t.disable&&(e["aria-disabled"]="true"),!0===t.readonly&&(e["aria-readonly"]="true"),e});function m(e){if(!0===u.value){let n=ge(parseInt(e,10),1,parseInt(t.max,10)),i=!0!==t.noReset&&t.modelValue===n?0:n;i!==t.modelValue&&a("update:modelValue",i),s.value=0}}function _(e){!0===u.value&&(s.value=e)}function g(){s.value=0}return(0,e.onBeforeUpdate)(()=>{l={}}),()=>{let a=[];return p.value.forEach(({iconClass:t,name:i,attrs:o},r)=>{let s=r+1;a.push((0,e.h)("div",{key:s,ref:e=>{l[`rt${s}`]=e},class:"q-rating__icon-container flex flex-center",...o,onClick(){m(s)},onMouseover(){_(s)},onMouseout:g,onFocus(){_(s)},onBlur:g,onKeyup(e){!function(e,t){switch(e.keyCode){case 13:case 32:return m(t),k(e);case 37:case 40:return l["rt"+(t-1)]&&l["rt"+(t-1)].focus(),k(e);case 39:case 38:l[`rt${t+1}`]&&l[`rt${t+1}`].focus(),k(e)}}(e,s)}},Re(n[`tip-${s}`],[(0,e.h)(Ye,{class:t,name:i})])))}),void 0!==t.name&&!0!==t.disable&&r(a,"push"),(0,e.h)("div",{class:c.value,style:o.value,...f.value},a)}}}),Il=h({name:"QResponsive",props:ks,setup(t,{slots:n}){let a=xs(t);return()=>(0,e.h)("div",{class:"q-responsive"},[(0,e.h)("div",{class:"q-responsive__filler overflow-hidden"},[(0,e.h)("div",{style:a.value})]),(0,e.h)("div",{class:"q-responsive__content absolute-full fit"},Le(n.default))])}}),Nl=h({props:["store","barStyle","verticalBarStyle","horizontalBarStyle"],setup:t=>()=>[(0,e.h)("div",{class:t.store.scroll.vertical.barClass.value,style:[t.barStyle,t.verticalBarStyle],"aria-hidden":"true",onMousedown:t.store.onVerticalMousedown}),(0,e.h)("div",{class:t.store.scroll.horizontal.barClass.value,style:[t.barStyle,t.horizontalBarStyle],"aria-hidden":"true",onMousedown:t.store.onHorizontalMousedown}),(0,e.withDirectives)((0,e.h)("div",{ref:t.store.scroll.vertical.ref,class:t.store.scroll.vertical.thumbClass.value,style:t.store.scroll.vertical.style.value,"aria-hidden":"true"}),t.store.thumbVertDir),(0,e.withDirectives)((0,e.h)("div",{ref:t.store.scroll.horizontal.ref,class:t.store.scroll.horizontal.thumbClass.value,style:t.store.scroll.horizontal.style.value,"aria-hidden":"true"}),t.store.thumbHorizDir)]});let Dl=["vertical","horizontal"],ql={vertical:{offset:"offsetY",scroll:"scrollTop",dir:"down",dist:"y"},horizontal:{offset:"offsetX",scroll:"scrollLeft",dir:"right",dist:"x"}},jl={prevent:!0,mouse:!0,mouseAllDir:!0},Bl=e=>e>=250?50:Math.ceil(e/5);var Fl=h({name:"QScrollArea",props:{...Xe,thumbStyle:Object,verticalThumbStyle:Object,horizontalThumbStyle:Object,barStyle:[Array,String,Object],verticalBarStyle:[Array,String,Object],horizontalBarStyle:[Array,String,Object],verticalOffset:{type:Array,default:[0,0]},horizontalOffset:{type:Array,default:[0,0]},contentStyle:[Array,String,Object],contentActiveStyle:[Array,String,Object],delay:{type:[String,Number],default:1e3},visible:{type:Boolean,default:null},tabindex:[String,Number],onScroll:Function},setup(t,{slots:n,emit:a}){let i,o=(0,e.ref)(!1),r=(0,e.ref)(!1),s=(0,e.ref)(!1),l={vertical:(0,e.ref)(0),horizontal:(0,e.ref)(0)},u={vertical:{ref:(0,e.ref)(null),position:(0,e.ref)(0),size:(0,e.ref)(0)},horizontal:{ref:(0,e.ref)(null),position:(0,e.ref)(0),size:(0,e.ref)(0)}},{proxy:c}=(0,e.getCurrentInstance)(),d=et(t,c.$q),h=null,p=(0,e.ref)(null),f=(0,e.computed)(()=>"q-scrollarea"+(!0===d.value?" q-scrollarea--dark":""));Object.assign(l,{verticalInner:(0,e.computed)(()=>l.vertical.value-t.verticalOffset[0]-t.verticalOffset[1]),horizontalInner:(0,e.computed)(()=>l.horizontal.value-t.horizontalOffset[0]-t.horizontalOffset[1])}),u.vertical.percentage=(0,e.computed)(()=>{let e=u.vertical.size.value-l.vertical.value;if(e<=0)return 0;let t=ge(u.vertical.position.value/e,0,1);return Math.round(1e4*t)/1e4}),u.vertical.thumbHidden=(0,e.computed)(()=>!0!==(null===t.visible?s.value:t.visible)&&!1===o.value&&!1===r.value||u.vertical.size.value<=l.vertical.value+1),u.vertical.thumbStart=(0,e.computed)(()=>t.verticalOffset[0]+u.vertical.percentage.value*(l.verticalInner.value-u.vertical.thumbSize.value)),u.vertical.thumbSize=(0,e.computed)(()=>Math.round(ge(l.verticalInner.value*l.verticalInner.value/u.vertical.size.value,Bl(l.verticalInner.value),l.verticalInner.value))),u.vertical.style=(0,e.computed)(()=>({...t.thumbStyle,...t.verticalThumbStyle,top:`${u.vertical.thumbStart.value}px`,height:`${u.vertical.thumbSize.value}px`,right:`${t.horizontalOffset[1]}px`})),u.vertical.thumbClass=(0,e.computed)(()=>"q-scrollarea__thumb q-scrollarea__thumb--v absolute-right"+(!0===u.vertical.thumbHidden.value?" q-scrollarea__thumb--invisible":"")),u.vertical.barClass=(0,e.computed)(()=>"q-scrollarea__bar q-scrollarea__bar--v absolute-right"+(!0===u.vertical.thumbHidden.value?" q-scrollarea__bar--invisible":"")),u.horizontal.percentage=(0,e.computed)(()=>{let e=u.horizontal.size.value-l.horizontal.value;if(e<=0)return 0;let t=ge(Math.abs(u.horizontal.position.value)/e,0,1);return Math.round(1e4*t)/1e4}),u.horizontal.thumbHidden=(0,e.computed)(()=>!0!==(null===t.visible?s.value:t.visible)&&!1===o.value&&!1===r.value||u.horizontal.size.value<=l.horizontal.value+1),u.horizontal.thumbStart=(0,e.computed)(()=>t.horizontalOffset[0]+u.horizontal.percentage.value*(l.horizontalInner.value-u.horizontal.thumbSize.value)),u.horizontal.thumbSize=(0,e.computed)(()=>Math.round(ge(l.horizontalInner.value*l.horizontalInner.value/u.horizontal.size.value,Bl(l.horizontalInner.value),l.horizontalInner.value))),u.horizontal.style=(0,e.computed)(()=>({...t.thumbStyle,...t.horizontalThumbStyle,[!0===c.$q.lang.rtl?"right":"left"]:`${u.horizontal.thumbStart.value}px`,width:`${u.horizontal.thumbSize.value}px`,bottom:`${t.verticalOffset[1]}px`})),u.horizontal.thumbClass=(0,e.computed)(()=>"q-scrollarea__thumb q-scrollarea__thumb--h absolute-bottom"+(!0===u.horizontal.thumbHidden.value?" q-scrollarea__thumb--invisible":"")),u.horizontal.barClass=(0,e.computed)(()=>"q-scrollarea__bar q-scrollarea__bar--h absolute-bottom"+(!0===u.horizontal.thumbHidden.value?" q-scrollarea__bar--invisible":""));let m=(0,e.computed)(()=>!0===u.vertical.thumbHidden.value&&!0===u.horizontal.thumbHidden.value?t.contentStyle:t.contentActiveStyle);function _(){let e={};return Dl.forEach(t=>{let n=u[t];Object.assign(e,{[t+"Position"]:n.position.value,[t+"Percentage"]:n.percentage.value,[t+"Size"]:n.size.value,[t+"ContainerSize"]:l[t].value,[t+"ContainerInnerSize"]:l[t+"Inner"].value})}),e}let g=P(()=>{let e=_();e.ref=c,a("scroll",e)},0);function v(e,t,n){!1!==Dl.includes(e)?("vertical"===e?In:Nn)(p.value,t,n):console.error("[QScrollArea]: wrong first param of setScrollPosition (vertical/horizontal)")}function b({height:e,width:t}){let n=!1;l.vertical.value!==e&&(l.vertical.value=e,n=!0),l.horizontal.value!==t&&(l.horizontal.value=t,n=!0),!0===n&&S()}function y({position:e}){let t=!1;u.vertical.position.value!==e.top&&(u.vertical.position.value=e.top,t=!0),u.horizontal.position.value!==e.left&&(u.horizontal.position.value=e.left,t=!0),!0===t&&S()}function w({height:e,width:t}){u.horizontal.size.value!==t&&(u.horizontal.size.value=t,S()),u.vertical.size.value!==e&&(u.vertical.size.value=e,S())}function k(e,t){let n=u[t];if(!0===e.isFirst){if(!0===n.thumbHidden.value)return;i=n.position.value,r.value=!0}else if(!0!==r.value)return;!0===e.isFinal&&(r.value=!1);let a=ql[t],o=(n.size.value-l[t].value)/(l[t+"Inner"].value-n.thumbSize.value),s=e.distance[a.dist];C(i+(e.direction===a.dir?1:-1)*s*o,t)}function x(e,n){let a=u[n];if(!0!==a.thumbHidden.value){let i="vertical"===n?t.verticalOffset[0]:t.horizontalOffset[0],o=e[ql[n].offset]-i,r=a.thumbStart.value-i;(or+a.thumbSize.value)&&C(ge((o-a.thumbSize.value/2)/(l[n+"Inner"].value-a.thumbSize.value),0,1)*Math.max(0,a.size.value-l[n].value),n),null!==a.ref.value&&a.ref.value.dispatchEvent(new MouseEvent(e.type,e))}}function S(){o.value=!0,null!==h&&clearTimeout(h),h=setTimeout(()=>{h=null,o.value=!1},t.delay),void 0!==t.onScroll&&g()}function C(e,t){p.value[ql[t].scroll]=e}let T=null;function E(){null!==T&&clearTimeout(T),T=setTimeout(()=>{T=null,s.value=!0},c.$q.platform.is.ios?50:0)}function A(){null!==T&&(clearTimeout(T),T=null),s.value=!1}let L=null;(0,e.watch)(()=>c.$q.lang.rtl,e=>{null!==p.value&&Nn(p.value,Math.abs(u.horizontal.position.value)*(!0===e?-1:1))}),(0,e.onDeactivated)(()=>{L={top:u.vertical.position.value,left:u.horizontal.position.value}}),(0,e.onActivated)(()=>{if(null===L)return;let e=p.value;null!==e&&(Nn(e,L.left),In(e,L.top))}),(0,e.onBeforeUnmount)(g.cancel),Object.assign(c,{getScrollTarget:()=>p.value,getScroll:_,getScrollPosition:()=>({top:u.vertical.position.value,left:u.horizontal.position.value}),getScrollPercentage:()=>({top:u.vertical.percentage.value,left:u.horizontal.percentage.value}),setScrollPosition:v,setScrollPercentage(e,t,n){v(e,t*(u[e].size.value-l[e].value)*("horizontal"===e&&!0===c.$q.lang.rtl?-1:1),n)}});let M={scroll:u,thumbVertDir:[[fi,e=>{k(e,"vertical")},void 0,{vertical:!0,...jl}]],thumbHorizDir:[[fi,e=>{k(e,"horizontal")},void 0,{horizontal:!0,...jl}]],onVerticalMousedown(e){x(e,"vertical")},onHorizontalMousedown(e){x(e,"horizontal")}};return()=>(0,e.h)("div",{class:f.value,onMouseenter:E,onMouseleave:A},[(0,e.h)("div",{ref:p,class:"q-scrollarea__container scroll relative-position fit hide-scrollbar",tabindex:void 0===t.tabindex?void 0:t.tabindex},[(0,e.h)("div",{class:"q-scrollarea__content absolute",style:m.value},Re(n.default,[(0,e.h)(Ti,{debounce:0,onResize:w})])),(0,e.h)(tl,{axis:"both",onScroll:y})]),(0,e.h)(Ti,{debounce:0,onResize:b}),(0,e.h)(Nl,{store:M,barStyle:t.barStyle,verticalBarStyle:t.verticalBarStyle,horizontalBarStyle:t.horizontalBarStyle})])}});let $l=1e3,Vl=["start","center","end","start-force","center-force","end-force"],Ul=Array.prototype.filter,Hl=void 0===window.getComputedStyle(document.body).overflowAnchor?_:function(e,t){null!==e&&(void 0!==e._qOverflowAnimationFrame&&cancelAnimationFrame(e._qOverflowAnimationFrame),e._qOverflowAnimationFrame=requestAnimationFrame(()=>{if(null===e)return;e._qOverflowAnimationFrame=void 0;let n=e.children||[];Ul.call(n,e=>e.dataset&&void 0!==e.dataset.qVsAnchor).forEach(e=>{delete e.dataset.qVsAnchor});let a=n[t];a?.dataset&&(a.dataset.qVsAnchor="")}))};function Wl(e,t){return e+t}function Gl(e,t,n,a,i,o,r,s){let l=e===window?document.scrollingElement||document.documentElement:e,u=!0===i?"offsetWidth":"offsetHeight",c={scrollStart:0,scrollViewSize:-r-s,scrollMaxSize:0,offsetStart:-r,offsetEnd:-s};if(!0===i?(e===window?(c.scrollStart=window.pageXOffset||window.scrollX||document.body.scrollLeft||0,c.scrollViewSize+=document.documentElement.clientWidth):(c.scrollStart=l.scrollLeft,c.scrollViewSize+=l.clientWidth),c.scrollMaxSize=l.scrollWidth,!0===o&&(c.scrollStart=(!0===Pi?c.scrollMaxSize-c.scrollViewSize:0)-c.scrollStart)):(e===window?(c.scrollStart=window.pageYOffset||window.scrollY||document.body.scrollTop||0,c.scrollViewSize+=document.documentElement.clientHeight):(c.scrollStart=l.scrollTop,c.scrollViewSize+=l.clientHeight),c.scrollMaxSize=l.scrollHeight),null!==n)for(let e=n.previousElementSibling;null!==e;e=e.previousElementSibling)!1===e.classList.contains("q-virtual-scroll--skip")&&(c.offsetStart+=e[u]);if(null!==a)for(let e=a.nextElementSibling;null!==e;e=e.nextElementSibling)!1===e.classList.contains("q-virtual-scroll--skip")&&(c.offsetEnd+=e[u]);if(t!==e){let n=l.getBoundingClientRect(),a=t.getBoundingClientRect();!0===i?(c.offsetStart+=a.left-n.left,c.offsetEnd-=a.width):(c.offsetStart+=a.top-n.top,c.offsetEnd-=a.height),e!==window&&(c.offsetStart+=c.scrollStart),c.offsetEnd+=c.scrollMaxSize-c.offsetStart}return c}function Kl(e,t,n,a){"end"===t&&(t=(e===window?document.body:e)[!0===n?"scrollWidth":"scrollHeight"]),e===window?!0===n?(!0===a&&(t=(!0===Pi?document.body.scrollWidth-document.documentElement.clientWidth:0)-t),window.scrollTo(t,window.pageYOffset||window.scrollY||document.body.scrollTop||0)):window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,t):!0===n?(!0===a&&(t=(!0===Pi?e.scrollWidth-e.offsetWidth:0)-t),e.scrollLeft=t):e.scrollTop=t}function Yl(e,t,n,a){if(n>=a)return 0;let i=t.length,o=Math.floor(n/$l),r=Math.floor((a-1)/$l)+1,s=e.slice(o,r).reduce(Wl,0);return n%$l!==0&&(s-=t.slice(o*$l,n).reduce(Wl,0)),a%$l!==0&&a!==i&&(s-=t.slice(a,r*$l).reduce(Wl,0)),s}let Ql={virtualScrollSliceSize:{type:[Number,String],default:10},virtualScrollSliceRatioBefore:{type:[Number,String],default:1},virtualScrollSliceRatioAfter:{type:[Number,String],default:1},virtualScrollItemSize:{type:[Number,String],default:24},virtualScrollStickySizeStart:{type:[Number,String],default:0},virtualScrollStickySizeEnd:{type:[Number,String],default:0},tableColspan:[Number,String]},Zl=Object.keys(Ql),Jl={virtualScrollHorizontal:Boolean,onVirtualScroll:Function,...Ql};function Xl({virtualScrollLength:t,getVirtualScrollTarget:n,getVirtualScrollEl:a,virtualScrollItemSizeComputed:i}){let o,r,s,l,{props:u,emit:c,proxy:d}=(0,e.getCurrentInstance)(),{$q:h}=d,p=[],f=(0,e.ref)(0),m=(0,e.ref)(0),_=(0,e.ref)({}),g=(0,e.ref)(null),v=(0,e.ref)(null),b=(0,e.ref)(null),y=(0,e.ref)({from:0,to:0}),w=(0,e.computed)(()=>void 0===u.tableColspan?100:u.tableColspan);void 0===i&&(i=(0,e.computed)(()=>u.virtualScrollItemSize));let k=(0,e.computed)(()=>i.value+";"+u.virtualScrollHorizontal);function x(){L(r,!0)}function S(e){L(void 0===e?r:e)}function C(e,i){let o=n();if(null==o||8===o.nodeType)return;let l=Gl(o,a(),g.value,v.value,u.virtualScrollHorizontal,h.lang.rtl,u.virtualScrollStickySizeStart,u.virtualScrollStickySizeEnd);s!==l.scrollViewSize&&M(l.scrollViewSize),T(o,l,Math.min(t.value-1,Math.max(0,parseInt(e,10)||0)),0,-1===Vl.indexOf(i)?-1!==r&&e>r?"end":"start":i)}function T(e,n,a,i,r){let s="string"==typeof r&&-1!==r.indexOf("-force"),c=!0===s?r.replace("-force",""):r,d=void 0===c?"start":c,g=Math.max(0,a-_.value[d]),v=g+_.value.total;v>t.value&&(v=t.value,g=Math.max(0,v-_.value.total)),o=n.scrollStart;let w=g!==y.value.from||v!==y.value.to;if(!1===w&&void 0===c)return void R(a);let{activeElement:k}=document,x=b.value;!0===w&&null!==x&&x!==k&&!0===x.contains(k)&&(x.addEventListener("focusout",A),setTimeout(()=>{x?.removeEventListener("focusout",A)})),Hl(x,a-g);let S=void 0===c?0:l.slice(g,a).reduce(Wl,0);if(!0===w){let e=v>=y.value.from&&g<=y.value.to?y.value.to:v;y.value={from:g,to:e},f.value=Yl(p,l,0,g),m.value=Yl(p,l,v,t.value),requestAnimationFrame(()=>{y.value.to!==v&&o===n.scrollStart&&(y.value={from:y.value.from,to:v},m.value=Yl(p,l,v,t.value))})}requestAnimationFrame(()=>{if(o!==n.scrollStart)return;!0===w&&E(g);let t=l.slice(g,a).reduce(Wl,0),r=t+n.offsetStart+f.value,d=r+l[a],p=r+i;if(void 0!==c){let e=t-S,i=n.scrollStart+e;p=!0!==s&&ie.classList&&!1===e.classList.contains("q-virtual-scroll--skip")),o=i.length,r=!0===u.virtualScrollHorizontal?e=>e.getBoundingClientRect().width:e=>e.offsetHeight,s=e;for(let e=0;e=u;e--)l[e]=s;let c=Math.floor((t.value-1)/$l);p=[];for(let e=0;e<=c;e++){let n=0,a=Math.min((e+1)*$l,t.value);for(let t=e*$l;t=0?(E(y.value.from),(0,e.nextTick)(()=>{C(n)})):z()}function M(e){if(void 0===e&&typeof window<"u"){let t=n();null!=t&&8!==t.nodeType&&(e=Gl(t,a(),g.value,v.value,u.virtualScrollHorizontal,h.lang.rtl,u.virtualScrollStickySizeStart,u.virtualScrollStickySizeEnd).scrollViewSize)}s=e;let t=parseFloat(u.virtualScrollSliceRatioBefore)||0,o=1+t+(parseFloat(u.virtualScrollSliceRatioAfter)||0),r=void 0===e||e<=0?1:Math.ceil(e/i.value),l=Math.max(1,r,Math.ceil((u.virtualScrollSliceSize>0?u.virtualScrollSliceSize:10)/o));_.value={total:Math.ceil(l*o),start:Math.ceil(l*t),center:Math.ceil(l*(.5+t)),end:Math.ceil(l*(1+t)),view:r}}function R(e){r!==e&&(void 0!==u.onVirtualScroll&&c("virtualScroll",{index:e,from:y.value.from,to:y.value.to-1,direction:ek.value+";"+u.virtualScrollSliceRatioBefore+";"+u.virtualScrollSliceRatioAfter),()=>{M()}),(0,e.watch)(k,x),M();let z=P(function(){let e=n();if(null==e||8===e.nodeType)return;let i=Gl(e,a(),g.value,v.value,u.virtualScrollHorizontal,h.lang.rtl,u.virtualScrollStickySizeStart,u.virtualScrollStickySizeEnd),r=t.value-1,c=i.scrollMaxSize-i.offsetStart-i.offsetEnd-m.value;if(o===i.scrollStart)return;if(i.scrollMaxSize<=0)return void T(e,i,0,0);s!==i.scrollViewSize&&M(i.scrollViewSize),E(y.value.from);let d=Math.floor(i.scrollMaxSize-Math.max(i.scrollViewSize,i.offsetEnd)-Math.min(l[r],i.scrollViewSize/2));if(d>0&&Math.ceil(i.scrollStart)>=d)return void T(e,i,r,i.scrollMaxSize-i.offsetEnd-p.reduce(Wl,0));let _=0,b=i.scrollStart-i.offsetStart,w=b;if(b<=c&&b+i.scrollViewSize>=f.value)b-=f.value,_=y.value.from,w=b;else for(let e=0;b>=p[e]&&_0&&_-i.scrollViewSize?(_++,w=b):w=l[_]+b;T(e,i,_,w)},!0===h.platform.is.ios?120:35);(0,e.onBeforeMount)(()=>{M()});let O=!1;return(0,e.onDeactivated)(()=>{O=!0}),(0,e.onActivated)(()=>{if(!0!==O)return;let e=n();void 0!==o&&null!=e&&8!==e.nodeType?Kl(e,o,u.virtualScrollHorizontal,h.lang.rtl):C(r)}),(0,e.onBeforeUnmount)(()=>{z.cancel()}),Object.assign(d,{scrollTo:C,reset:x,refresh:S}),{virtualScrollSliceRange:y,virtualScrollSliceSizeComputed:_,setVirtualScrollSize:M,onVirtualScrollEvt:z,localResetVirtualScroll:L,padVirtualScroll:function(t,n){let a=!0===u.virtualScrollHorizontal?"width":"height",o={["--q-virtual-scroll-item-"+a]:i.value+"px"};return["tbody"===t?(0,e.h)(t,{class:"q-virtual-scroll__padding",key:"before",ref:g},[(0,e.h)("tr",[(0,e.h)("td",{style:{[a]:`${f.value}px`,...o},colspan:w.value})])]):(0,e.h)(t,{class:"q-virtual-scroll__padding",key:"before",ref:g,style:{[a]:`${f.value}px`,...o}}),(0,e.h)(t,{class:"q-virtual-scroll__content",key:"content",ref:b,tabindex:-1},n.flat()),"tbody"===t?(0,e.h)(t,{class:"q-virtual-scroll__padding",key:"after",ref:v},[(0,e.h)("tr",[(0,e.h)("td",{style:{[a]:`${m.value}px`,...o},colspan:w.value})])]):(0,e.h)(t,{class:"q-virtual-scroll__padding",key:"after",ref:v,style:{[a]:`${m.value}px`,...o}})]},scrollTo:C,reset:x,refresh:S}}let eu=e=>["add","add-unique","toggle"].includes(e),tu=Object.keys(rs);function nu(e,t){if("function"==typeof e)return e;let n=void 0===e?t:e;return e=>"object"==typeof e&&e&&n in e?e[n]:e}var au=h({name:"QSelect",inheritAttrs:!1,props:{...Jl,...xa,...rs,modelValue:{required:!0},multiple:Boolean,displayValue:[String,Number],displayValueHtml:Boolean,dropdownIcon:String,options:{type:Array,default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],hideSelected:Boolean,hideDropdownIcon:Boolean,fillInput:Boolean,maxValues:[Number,String],optionsDense:Boolean,optionsDark:{type:Boolean,default:null},optionsSelectedClass:String,optionsHtml:Boolean,optionsCover:Boolean,menuShrink:Boolean,menuAnchor:String,menuSelf:String,menuOffset:Array,popupContentClass:String,popupContentStyle:[String,Array,Object],popupNoRouteDismiss:Boolean,useInput:Boolean,useChips:Boolean,newValueMode:{type:String,validator:eu},mapOptions:Boolean,emitValue:Boolean,disableTabSelection:Boolean,inputDebounce:{type:[Number,String],default:500},inputClass:[Array,String,Object],inputStyle:[Array,String,Object],tabindex:{type:[String,Number],default:0},autocomplete:String,transitionShow:{},transitionHide:{},transitionDuration:{},behavior:{type:String,validator:e=>["default","menu","dialog"].includes(e),default:"default"},virtualScrollItemSize:Jl.virtualScrollItemSize.type,onNewValue:Function,onFilter:Function},emits:[...ss,"add","remove","inputValue","keyup","keypress","keydown","popupShow","popupHide","filterAbort"],setup(t,{slots:n,emit:a}){let i,o,r,s,l,u,c,{proxy:d}=(0,e.getCurrentInstance)(),{$q:h}=d,p=(0,e.ref)(!1),f=(0,e.ref)(!1),m=(0,e.ref)(-1),_=(0,e.ref)(""),g=(0,e.ref)(!1),v=(0,e.ref)(!1),b=null,x=null,S=null,C=(0,e.ref)(null),T=(0,e.ref)(null),P=(0,e.ref)(null),E=(0,e.ref)(null),A=(0,e.ref)(null),L=Ta(t),M=Fs(Me),R=(0,e.computed)(()=>Array.isArray(t.options)?t.options.length:0),{virtualScrollSliceRange:z,virtualScrollSliceSizeComputed:O,localResetVirtualScroll:D,padVirtualScroll:q,onVirtualScrollEvt:j,scrollTo:B,setVirtualScrollSize:F}=Xl({virtualScrollLength:R,getVirtualScrollTarget:function(){return Ee()},getVirtualScrollEl:Ee,virtualScrollItemSizeComputed:(0,e.computed)(()=>void 0===t.virtualScrollItemSize?!0===t.optionsDense?24:48:t.virtualScrollItemSize)}),$=ls(),V=(0,e.computed)(()=>{let e=!0===t.mapOptions&&!0!==t.multiple,n=void 0===t.modelValue||null===t.modelValue&&!0!==e?[]:!0===t.multiple&&Array.isArray(t.modelValue)?t.modelValue:[t.modelValue];if(!0===t.mapOptions&&!0===Array.isArray(t.options)){let a=!0===t.mapOptions&&void 0!==i?i:[],o=n.map(e=>function(e,n){let a=t=>ie(ue.value(t),e);return t.options.find(a)||n.find(a)||e}(e,a));return null===t.modelValue&&!0===e?o.filter(e=>null!==e):o}return n}),U=(0,e.computed)(()=>{let e={};return tu.forEach(n=>{let a=t[n];void 0!==a&&(e[n]=a)}),e}),H=(0,e.computed)(()=>null===t.optionsDark?$.isDark.value:t.optionsDark),W=(0,e.computed)(()=>is(V.value)),G=(0,e.computed)(()=>{let e="q-field__input q-placeholder col";return!0===t.hideSelected||0===V.value.length?[e,t.inputClass]:(e+=" q-field__input--padding",void 0===t.inputClass?e:[e,t.inputClass])}),K=(0,e.computed)(()=>(!0===t.virtualScrollHorizontal?"q-virtual-scroll--horizontal":"")+(t.popupContentClass?" "+t.popupContentClass:"")),Y=(0,e.computed)(()=>0===R.value),Q=(0,e.computed)(()=>V.value.map(e=>ce.value(e)).join(", ")),Z=(0,e.computed)(()=>void 0===t.displayValue?Q.value:t.displayValue),J=(0,e.computed)(()=>!0===t.optionsHtml?()=>!0:e=>!0===e?.html),X=(0,e.computed)(()=>!0===t.displayValueHtml||void 0===t.displayValue&&(!0===t.optionsHtml||V.value.some(J.value))),ee=(0,e.computed)(()=>!0===$.focused.value?t.tabindex:-1),te=(0,e.computed)(()=>{let e={tabindex:t.tabindex,role:"combobox","aria-label":t.label,"aria-readonly":!0===t.readonly?"true":"false","aria-autocomplete":!0===t.useInput?"list":"none","aria-expanded":!0===p.value?"true":"false","aria-controls":`${$.targetUid.value}_lb`};return m.value>=0&&(e["aria-activedescendant"]=`${$.targetUid.value}_${m.value}`),e}),ne=(0,e.computed)(()=>({id:`${$.targetUid.value}_lb`,role:"listbox","aria-multiselectable":!0===t.multiple?"true":"false"})),ae=(0,e.computed)(()=>V.value.map((e,t)=>({index:t,opt:e,html:J.value(e),selected:!0,removeAtIndex:_e,toggleOption:be,tabindex:ee.value}))),oe=(0,e.computed)(()=>{if(0===R.value)return[];let{from:e,to:n}=z.value;return t.options.slice(e,n).map((n,a)=>{let i=!0===de.value(n),o=!0===ke(n),r=e+a,s={clickable:!0,active:o,activeClass:le.value,manualFocus:!0,focused:!1,disable:i,tabindex:-1,dense:t.optionsDense,dark:H.value,role:"option","aria-selected":!0===o?"true":"false",id:`${$.targetUid.value}_${r}`,onClick:()=>{be(n)}};return!0!==i&&(m.value===r&&(s.focused=!0),!0===h.platform.is.desktop&&(s.onMousemove=()=>{!0===p.value&&ye(r)})),{index:r,opt:n,html:J.value(n),label:ce.value(n),selected:s.active,focused:s.focused,toggleOption:be,setOptionIndex:ye,itemProps:s}})}),re=(0,e.computed)(()=>void 0===t.dropdownIcon?h.iconSet.arrow.dropdown:t.dropdownIcon),se=(0,e.computed)(()=>!1===t.optionsCover&&!0!==t.outlined&&!0!==t.standout&&!0!==t.borderless&&!0!==t.rounded),le=(0,e.computed)(()=>void 0===t.optionsSelectedClass?void 0===t.color?"":`text-${t.color}`:t.optionsSelectedClass),ue=(0,e.computed)(()=>nu(t.optionValue,"value")),ce=(0,e.computed)(()=>nu(t.optionLabel,"label")),de=(0,e.computed)(()=>nu(t.optionDisable,"disable")),he=(0,e.computed)(()=>V.value.map(ue.value)),pe=(0,e.computed)(()=>{let e={onInput:Me,onChange:M,onKeydown:Pe,onKeyup:Ce,onKeypress:Te,onFocus:xe,onClick(e){!0===o&&y(e)}};return e.onCompositionstart=e.onCompositionupdate=e.onCompositionend=M,e});function fe(e){return!0===t.emitValue?ue.value(e):e}function me(e){if(-1!==e&&e=t.maxValues)return;let o=t.modelValue.slice();a("add",{index:o.length,value:i}),o.push(i),a("update:modelValue",o)}function be(e,n){if(!0!==$.editable.value||void 0===e||!0===de.value(e))return;let i=ue.value(e);if(!0!==t.multiple)return!0!==n&&(Oe(!0===t.fillInput?ce.value(e):"",!0,!0),He()),T.value?.focus(),void((0===V.value.length||!0!==ie(ue.value(V.value[0]),i))&&a("update:modelValue",!0===t.emitValue?i:e));if((!0!==o||!0===g.value)&&$.focus(),xe(),0===V.value.length){let n=!0===t.emitValue?i:e;return a("add",{index:0,value:n}),void a("update:modelValue",!0===t.multiple?[n]:n)}let r=t.modelValue.slice(),s=he.value.findIndex(e=>ie(e,i));if(-1!==s)a("remove",{index:s,value:r.splice(s,1)[0]});else{if(void 0!==t.maxValues&&r.length>=t.maxValues)return;let n=!0===t.emitValue?i:e;a("add",{index:r.length,value:n}),r.push(n)}a("update:modelValue",r)}function ye(e){if(!0!==h.platform.is.desktop)return;let t=-1!==e&&e=0?ce.value(t.options[a]):s,!0))}}function ke(e){let t=ue.value(e);return void 0!==he.value.find(e=>ie(e,t))}function xe(e){!0===t.useInput&&null!==T.value&&(void 0===e||T.value===e.target&&e.target.value===Q.value)&&T.value.select()}function Se(e){!0===N(e,27)&&!0===p.value&&(y(e),He(),We()),a("keyup",e)}function Ce(e){let{value:n}=e.target;if(void 0===e.keyCode)if(e.target.value="",null!==b&&(clearTimeout(b),b=null),null!==x&&(clearTimeout(x),x=null),We(),"string"==typeof n&&0!==n.length){let e=n.toLocaleLowerCase(),a=n=>{let a=t.options.find(t=>String(n.value(t)).toLocaleLowerCase()===e);return void 0!==a&&(-1===V.value.indexOf(a)?be(a):He(),!0)},i=e=>{!0!==a(ue)&&!0!==e&&!0!==a(ce)&&Ie(n,!0,()=>i(!0))};i()}else $.clearValue(e);else Se(e)}function Te(e){a("keypress",e)}function Pe(n){if(a("keydown",n),!0===I(n))return;let i=0!==_.value.length&&(void 0!==t.newValueMode||void 0!==t.onNewValue),o=!0!==n.shiftKey&&!0!==t.disableTabSelection&&!0!==t.multiple&&(-1!==m.value||!0===i);if(27===n.keyCode)return void w(n);if(9===n.keyCode&&!1===o)return void Ve();if(void 0===n.target||n.target.id!==$.targetUid.value||!0!==$.editable.value)return;if(40===n.keyCode&&!0!==$.innerLoading.value&&!1===p.value)return k(n),void Ue();if(8===n.keyCode&&(!0===t.useChips||!0===t.clearable)&&!0!==t.hideSelected&&0===_.value.length)return void(!0===t.multiple&&!0===Array.isArray(t.modelValue)?me(t.modelValue.length-1):!0!==t.multiple&&null!==t.modelValue&&a("update:modelValue",null));(35===n.keyCode||36===n.keyCode)&&("string"!=typeof _.value||0===_.value.length)&&(k(n),m.value=-1,we(36===n.keyCode?1:-1,t.multiple)),(33===n.keyCode||34===n.keyCode)&&void 0!==O.value&&(k(n),m.value=Math.max(-1,Math.min(R.value,m.value+(33===n.keyCode?-1:1)*O.value.view)),we(33===n.keyCode?1:-1,t.multiple)),(38===n.keyCode||40===n.keyCode)&&(k(n),we(38===n.keyCode?-1:1,t.multiple));let r=R.value;if((void 0===u||c0&&!0!==t.useInput&&void 0!==n.key&&1===n.key.length&&!1===n.altKey&&!1===n.ctrlKey&&!1===n.metaKey&&(32!==n.keyCode||0!==u.length)){!0!==p.value&&Ue(n);let a=n.key.toLocaleLowerCase(),i=1===u.length&&u[0]===a;c=Date.now()+1500,!1===i&&(k(n),u+=a);let o=RegExp("^"+u.split("").map(e=>-1===".*+?^${}()|[]\\".indexOf(e)?e:"\\"+e).join(".*"),"i"),s=m.value;if(!0===i||s<0||!0!==o.test(ce.value(t.options[s])))do{s=ve(s+1,-1,r-1)}while(s!==m.value&&(!0===de.value(t.options[s])||!0!==o.test(ce.value(t.options[s]))));return void(m.value!==s&&(0,e.nextTick)(()=>{ye(s),B(s),s>=0&&!0===t.useInput&&!0===t.fillInput&&ze(ce.value(t.options[s]),!0)}))}if(13===n.keyCode||32===n.keyCode&&!0!==t.useInput&&""===u||9===n.keyCode&&!1!==o){if(9!==n.keyCode&&k(n),-1!==m.value&&m.value{if(n){if(!0!==eu(n))return}else n=t.newValueMode;Oe("",!0!==t.multiple,!0),null!=e&&(("toggle"===n?be:ge)(e,"add-unique"===n),!0!==t.multiple&&(T.value?.focus(),He()))};if(void 0===t.onNewValue?e(_.value):a("newValue",_.value,e),!0!==t.multiple)return}!0===p.value?Ve():!0!==$.innerLoading.value&&Ue()}}function Ee(){return!0===o?A.value:null!==P.value&&null!==P.value.contentEl?P.value.contentEl:void 0}function Ae(){return!0===t.hideSelected?[]:void 0===n["selected-item"]?void 0===n.selected?!0===t.useChips?ae.value.map((n,a)=>(0,e.h)(si,{key:"option-"+a,removable:!0===$.editable.value&&!0!==de.value(n.opt),dense:!0,textColor:t.color,tabindex:ee.value,onRemove(){n.removeAtIndex(a)}},()=>(0,e.h)("span",{class:"ellipsis",[!0===n.html?"innerHTML":"textContent"]:ce.value(n.opt)}))):[(0,e.h)("span",{class:"ellipsis",[!0===X.value?"innerHTML":"textContent"]:Z.value})]:[].concat(n.selected()):ae.value.map(e=>n["selected-item"](e)).slice()}function Le(){if(!0===Y.value)return void 0===n["no-option"]?void 0:n["no-option"]({inputValue:_.value});let t=void 0===n.option?t=>(0,e.h)(wr,{key:t.index,...t.itemProps},()=>(0,e.h)(kr,()=>(0,e.h)(Dr,()=>(0,e.h)("span",{[!0===t.html?"innerHTML":"textContent"]:t.label})))):n.option,a=q("div",oe.value.map(t));return void 0!==n["before-options"]&&(a=n["before-options"]().concat(a)),Re(n["after-options"],a)}function Me(e){null!==b&&(clearTimeout(b),b=null),null!==x&&(clearTimeout(x),x=null),(!e||!e.target||!0!==e.target.qComposing)&&(ze(e.target.value||""),r=!0,s=_.value,!0!==$.focused.value&&(!0!==o||!0===g.value)&&$.focus(),void 0!==t.onFilter&&(b=setTimeout(()=>{b=null,Ie(_.value)},t.inputDebounce)))}function ze(e,n){_.value!==e&&(_.value=e,!0===n||0===t.inputDebounce||"0"===t.inputDebounce?a("inputValue",e):x=setTimeout(()=>{x=null,a("inputValue",e)},t.inputDebounce))}function Oe(e,n,a){r=!0!==a,!0===t.useInput&&(ze(e,!0),(!0===n||!0!==a)&&(s=e),!0!==n&&Ie(e))}function Ie(n,i,o){if(void 0===t.onFilter||!0!==i&&!0!==$.focused.value)return;!0===$.innerLoading.value?a("filterAbort"):($.innerLoading.value=!0,v.value=!0),""!==n&&!0!==t.multiple&&0!==V.value.length&&!0!==r&&n===ce.value(V.value[0])&&(n="");let s=setTimeout(()=>{!0===p.value&&(p.value=!1)},10);null!==S&&clearTimeout(S),S=s,a("filter",n,(t,n)=>{(!0===i||!0===$.focused.value)&&S===s&&(clearTimeout(S),"function"==typeof t&&t(),v.value=!1,(0,e.nextTick)(()=>{$.innerLoading.value=!1,!0===$.editable.value&&(!0===i?!0===p.value&&He():!0===p.value?Ge(!0):p.value=!0),"function"==typeof n&&(0,e.nextTick)(()=>{n(d)}),"function"==typeof o&&(0,e.nextTick)(()=>{o(d)})}))},()=>{!0===$.focused.value&&S===s&&(clearTimeout(S),$.innerLoading.value=!1,v.value=!1),!0===p.value&&(p.value=!1)})}function Ne(e){Ze(e),Ve()}function De(){F()}function qe(e){y(e),T.value?.focus(),g.value=!0,window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,0)}function je(t){y(t),(0,e.nextTick)(()=>{g.value=!1})}function Be(e){Ze(e),null!==E.value&&E.value.__updateRefocusTarget($.rootRef.value.querySelector(".q-field__native > [tabindex]:last-child")),$.focused.value=!1}function Fe(e){He(),!1===$.focused.value&&a("blur",e),We()}function $e(){let e=document.activeElement;(null===e||e.id!==$.targetUid.value)&&null!==T.value&&T.value!==e&&T.value.focus(),F()}function Ve(){!0!==f.value&&(m.value=-1,!0===p.value&&(p.value=!1),!1===$.focused.value&&(null!==S&&(clearTimeout(S),S=null),!0===$.innerLoading.value&&(a("filterAbort"),$.innerLoading.value=!1,v.value=!1)))}function Ue(a){!0===$.editable.value&&(!0===o?($.onControlFocusin(a),f.value=!0,(0,e.nextTick)(()=>{$.focus()})):$.focus(),void 0===t.onFilter?(!0!==Y.value||void 0!==n["no-option"])&&(p.value=!0):Ie(_.value))}function He(){f.value=!1,Ve()}function We(){!0===t.useInput&&Oe(!0!==t.multiple&&!0===t.fillInput&&0!==V.value.length&&ce.value(V.value[0])||"",!0,!0)}function Ge(e){let n=-1;if(!0===e){if(0!==V.value.length){let e=ue.value(V.value[0]);n=t.options.findIndex(t=>ie(ue.value(t),e))}D(n)}ye(n)}function Ke(){!1===f.value&&null!==P.value&&P.value.updatePosition()}function Qe(e){void 0!==e&&y(e),a("popupShow",e),$.hasPopupOpen=!0,$.onControlFocusin(e)}function Ze(e){void 0!==e&&y(e),a("popupHide",e),$.hasPopupOpen=!1,$.onControlFocusout(e)}function Je(){o=(!0===h.platform.is.mobile||"dialog"===t.behavior)&&("menu"!==t.behavior&&(!0!==t.useInput||(void 0!==n["no-option"]||void 0!==t.onFilter||!1===Y.value))),l=!0===h.platform.is.ios&&!0===o&&!0===t.useInput?"fade":t.transitionShow}return(0,e.watch)(V,e=>{i=e,!0===t.useInput&&!0===t.fillInput&&!0!==t.multiple&&!0!==$.innerLoading.value&&(!0!==f.value&&!0!==p.value||!0!==W.value)&&(!0!==r&&We(),(!0===f.value||!0===p.value)&&Ie(""))},{immediate:!0}),(0,e.watch)(()=>t.fillInput,We),(0,e.watch)(p,Ge),(0,e.watch)(R,function(t,n){!0===p.value&&!1===$.innerLoading.value&&(D(-1,!0),(0,e.nextTick)(()=>{!0===p.value&&!1===$.innerLoading.value&&(t>n?D():Ge(!0))}))}),(0,e.onBeforeUpdate)(Je),(0,e.onUpdated)(Ke),Je(),(0,e.onBeforeUnmount)(()=>{null!==b&&clearTimeout(b),null!==x&&clearTimeout(x)}),Object.assign(d,{showPopup:Ue,hidePopup:He,removeAtIndex:me,add:ge,toggleOption:be,getOptionIndex:()=>m.value,setOptionIndex:ye,moveOptionSelection:we,filter:Ie,updateMenuPosition:Ke,updateInputValue:Oe,isOptionSelected:ke,getEmittingOptionValue:fe,isOptionDisabled:(...e)=>!0===de.value.apply(null,e),getOptionValue:(...e)=>ue.value.apply(null,e),getOptionLabel:(...e)=>ce.value.apply(null,e)}),Object.assign($,{innerValue:V,fieldClass:(0,e.computed)(()=>`q-select q-field--auto-height q-select--with${!0===t.useInput?"":"out"}-input q-select--with${!0===t.useChips?"":"out"}-chips q-select--${!0===t.multiple?"multiple":"single"}`),inputRef:C,targetRef:T,hasValue:W,showPopup:Ue,floatingLabel:(0,e.computed)(()=>!0!==t.hideSelected&&!0===W.value||"number"==typeof _.value||0!==_.value.length||is(t.displayValue)),getControlChild:()=>{if(!1!==$.editable.value&&(!0===f.value||!0!==Y.value||void 0!==n["no-option"]))return!0===o?function(){let a=[(0,e.h)(cs,{class:`col-auto ${$.fieldClass.value}`,...U.value,for:$.targetUid.value,dark:H.value,square:!0,loading:v.value,itemAligned:!1,filled:!0,stackLabel:0!==_.value.length,...$.splitAttrs.listeners.value,onFocus:qe,onBlur:je},{...n,rawControl:()=>$.getControl(!0),before:void 0,after:void 0})];return!0===p.value&&a.push((0,e.h)("div",{ref:A,class:K.value+" scroll",style:t.popupContentStyle,...ne.value,onClick:w,onScrollPassive:j},Le())),(0,e.h)(pr,{ref:E,modelValue:f.value,position:!0===t.useInput?"top":void 0,transitionShow:l,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,noRouteDismiss:t.popupNoRouteDismiss,onBeforeShow:Qe,onBeforeHide:Be,onHide:Fe,onShow:$e},()=>(0,e.h)("div",{class:"q-select__dialog"+(!0===H.value?" q-select__dialog--dark q-dark":"")+(!0===g.value?" q-select__dialog--focused":"")},a))}():(0,e.h)(pa,{ref:P,class:K.value,style:t.popupContentStyle,modelValue:p.value,fit:!0!==t.menuShrink,cover:!0===t.optionsCover&&!0!==Y.value&&!0!==t.useInput,anchor:t.menuAnchor,self:t.menuSelf,offset:t.menuOffset,dark:H.value,noParentEvent:!0,noRefocus:!0,noFocus:!0,noRouteDismiss:t.popupNoRouteDismiss,square:se.value,transitionShow:t.transitionShow,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,separateClosePopup:!0,...ne.value,onScrollPassive:j,onBeforeShow:Qe,onBeforeHide:Ne,onShow:De},Le);!0===$.hasPopupOpen&&($.hasPopupOpen=!1)},controlEvents:{onFocusin(e){$.onControlFocusin(e)},onFocusout(e){$.onControlFocusout(e,()=>{We(),Ve()})},onClick(e){if(w(e),!0!==o&&!0===p.value)return Ve(),void T.value?.focus();Ue(e)}},getControl:n=>{let a=Ae(),i=!0===n||!0!==f.value||!0!==o;if(!0===t.useInput)a.push(function(n,a){let i=!0===a?{...te.value,...$.splitAttrs.attributes.value}:void 0,r={ref:!0===a?T:void 0,key:"i_t",class:G.value,style:t.inputStyle,value:void 0===_.value?"":_.value,type:"search",...i,id:!0===a?$.targetUid.value:void 0,maxlength:t.maxlength,autocomplete:t.autocomplete,"data-autofocus":!0===n||!0===t.autofocus||void 0,disabled:!0===t.disable,readonly:!0===t.readonly,...pe.value};return!0!==n&&!0===o&&(!0===Array.isArray(r.class)?r.class=[...r.class,"no-pointer-events"]:r.class+=" no-pointer-events"),(0,e.h)("input",r)}(n,i));else if(!0===$.editable.value){let o=!0===i?te.value:void 0;a.push((0,e.h)("input",{ref:!0===i?T:void 0,key:"d_t",class:"q-select__focus-target",id:!0===i?$.targetUid.value:void 0,value:Z.value,readonly:!0,"data-autofocus":!0===n||!0===t.autofocus||void 0,...o,onKeydown:Pe,onKeyup:Se,onKeypress:Te})),!0===i&&"string"==typeof t.autocomplete&&0!==t.autocomplete.length&&a.push((0,e.h)("input",{class:"q-select__autocomplete-input",autocomplete:t.autocomplete,tabindex:-1,onKeyup:Ce}))}if(void 0!==L.value&&!0!==t.disable&&0!==he.value.length){let n=he.value.map(t=>(0,e.h)("option",{value:t,selected:!0}));a.push((0,e.h)("select",{class:"hidden",name:L.value,multiple:t.multiple},n))}return(0,e.h)("div",{class:"q-field__native row items-center",...!0===t.useInput||!0!==i?void 0:$.splitAttrs.attributes.value,...$.splitAttrs.listeners.value},a)},getInnerAppend:()=>!0!==t.loading&&!0!==v.value&&!0!==t.hideDropdownIcon?[(0,e.h)(Ye,{class:"q-select__dropdown-icon"+(!0===p.value?" rotate-180":""),name:re.value})]:null}),us($)}});let iu=["text","rect","circle","QBtn","QBadge","QChip","QToolbar","QCheckbox","QRadio","QToggle","QSlider","QRange","QInput","QAvatar"],ou=["wave","pulse","pulse-x","pulse-y","fade","blink","none"];var ru=h({name:"QSkeleton",props:{...Xe,tag:{type:String,default:"div"},type:{type:String,validator:e=>iu.includes(e),default:"rect"},animation:{type:String,validator:e=>ou.includes(e),default:"wave"},animationSpeed:{type:[String,Number],default:1500},square:Boolean,bordered:Boolean,size:String,width:String,height:String},setup(t,{slots:n}){let a=et(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>{let e=void 0===t.size?[t.width,t.height]:[t.size,t.size];return{"--q-skeleton-speed":`${t.animationSpeed}ms`,width:e[0],height:e[1]}}),o=(0,e.computed)(()=>`q-skeleton q-skeleton--${!0===a.value?"dark":"light"} q-skeleton--type-${t.type}`+("none"===t.animation?"":` q-skeleton--anim q-skeleton--anim-${t.animation}`)+(!0===t.square?" q-skeleton--square":"")+(!0===t.bordered?" q-skeleton--bordered":""));return()=>(0,e.h)(t.tag,{class:o.value,style:i.value},Le(n.default))}});let su=[["left","center","start","width"],["right","center","end","width"],["top","start","center","height"],["bottom","end","center","height"]];var lu=h({name:"QSlideItem",props:{...Xe,leftColor:String,rightColor:String,topColor:String,bottomColor:String,onSlide:Function},emits:["action","top","right","bottom","left"],setup(t,{slots:n,emit:a}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:o}=i,r=et(t,o),{getCache:s}=qa(),l=(0,e.ref)(null),u=null,c={},d={},h={},p=(0,e.computed)(()=>!0===o.lang.rtl?{left:"right",right:"left"}:{left:"left",right:"right"}),f=(0,e.computed)(()=>"q-slide-item q-item-type overflow-hidden"+(!0===r.value?" q-slide-item--dark q-dark":""));function m(){l.value.style.transform="translate(0,0)"}function _(e,n,i){void 0!==t.onSlide&&a("slide",{side:e,ratio:n,isReset:i})}function g(e){let t,i,o,r=l.value;if(e.isFirst)c={dir:null,size:{left:0,right:0,top:0,bottom:0},scale:0},r.classList.add("no-transition"),su.forEach(e=>{if(void 0!==n[e[0]]){let t=h[e[0]];t.style.transform="scale(1)",c.size[e[0]]=t.getBoundingClientRect()[e[3]]}}),c.axis="up"===e.direction||"down"===e.direction?"Y":"X";else{if(e.isFinal)return r.classList.remove("no-transition"),void(1===c.scale?(r.style.transform=`translate${c.axis}(${100*c.dir}%)`,null!==u&&clearTimeout(u),u=setTimeout(()=>{u=null,a(c.showing,{reset:m}),a("action",{side:c.showing,reset:m})},230)):(r.style.transform="translate(0,0)",_(c.showing,0,!0)));e.direction="X"===c.axis?e.offset.x<0?"left":"right":e.offset.y<0?"up":"down"}void 0===n.left&&e.direction===p.value.right||void 0===n.right&&e.direction===p.value.left||void 0===n.top&&"down"===e.direction||void 0===n.bottom&&"up"===e.direction?r.style.transform="translate(0,0)":("X"===c.axis?(i="left"===e.direction?-1:1,t=1===i?p.value.left:p.value.right,o=e.distance.x):(i="up"===e.direction?-2:2,t=2===i?"top":"bottom",o=e.distance.y),(null===c.dir||Math.abs(i)===Math.abs(c.dir))&&(c.dir!==i&&(["left","right","top","bottom"].forEach(e=>{d[e]&&(d[e].style.visibility=t===e?"visible":"hidden")}),c.showing=t,c.dir=i),c.scale=Math.max(0,Math.min(1,(o-40)/c.size[t])),r.style.transform=`translate${c.axis}(${o*i/Math.abs(i)}px)`,h[t].style.transform=`scale(${c.scale})`,_(t,c.scale,!1)))}return(0,e.onBeforeUpdate)(()=>{d={},h={}}),(0,e.onBeforeUnmount)(()=>{null!==u&&clearTimeout(u)}),Object.assign(i,{reset:m}),()=>{let a=[],i={left:void 0!==n[p.value.right],right:void 0!==n[p.value.left],up:void 0!==n.bottom,down:void 0!==n.top},o=Object.keys(i).filter(e=>!0===i[e]);su.forEach(i=>{let o=i[0];void 0!==n[o]&&a.push((0,e.h)("div",{key:o,ref:e=>{d[o]=e},class:`q-slide-item__${o} absolute-full row no-wrap items-${i[1]} justify-${i[2]}`+(void 0===t[o+"Color"]?"":` bg-${t[o+"Color"]}`)},[(0,e.h)("div",{ref:e=>{h[o]=e}},n[o]())]))});let r=(0,e.h)("div",{key:(0===o.length?"only-":"")+" content",ref:l,class:"q-slide-item__content"},Le(n.default));return 0===o.length?a.push(r):a.push((0,e.withDirectives)(r,s("dir#"+o.join(""),()=>{let e={prevent:!0,stop:!0,mouse:!0};return o.forEach(t=>{e[t]=!0}),[[fi,g,void 0,e]]}))),(0,e.h)("div",{class:f.value},a)}}}),uu=h({name:"QSpace",setup(){let t=(0,e.h)("div",{class:"q-space"});return()=>t}}),cu=h({name:"QSpinnerAudio",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,fill:"currentColor",width:n.value,height:n.value,viewBox:"0 0 55 80",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),du=h({name:"QSpinnerBall",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,stroke:"currentColor",width:n.value,height:n.value,viewBox:"0 0 57 57",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),hu=h({name:"QSpinnerBars",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,fill:"currentColor",width:n.value,height:n.value,viewBox:"0 0 135 140",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),pu=h({name:"QSpinnerBox",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),fu=h({name:"QSpinnerClock",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),mu=h({name:"QSpinnerComment",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",innerHTML:''})}}),_u=h({name:"QSpinnerCube",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",innerHTML:''})}}),gu=h({name:"QSpinnerDots",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,fill:"currentColor",width:n.value,height:n.value,viewBox:"0 0 120 30",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),vu=h({name:"QSpinnerFacebook",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",innerHTML:''})}}),bu=h({name:"QSpinnerGears",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),yu=h({name:"QSpinnerGrid",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,fill:"currentColor",width:n.value,height:n.value,viewBox:"0 0 105 105",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),wu=h({name:"QSpinnerHearts",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,fill:"currentColor",width:n.value,height:n.value,viewBox:"0 0 140 64",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),ku=h({name:"QSpinnerHourglass",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),xu=h({name:"QSpinnerInfinity",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",innerHTML:''})}}),Su=h({name:"QSpinnerIos",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,stroke:"currentColor",fill:"currentColor",viewBox:"0 0 64 64",innerHTML:''})}}),Cu=h({name:"QSpinnerOrbit",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Tu=h({name:"QSpinnerOval",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,stroke:"currentColor",width:n.value,height:n.value,viewBox:"0 0 38 38",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Pu=h({name:"QSpinnerPie",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Eu=h({name:"QSpinnerPuff",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,stroke:"currentColor",width:n.value,height:n.value,viewBox:"0 0 44 44",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Au=h({name:"QSpinnerRadio",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Lu=h({name:"QSpinnerRings",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,stroke:"currentColor",width:n.value,height:n.value,viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Mu=h({name:"QSpinnerTail",props:kt,setup(t){let{cSize:n,classes:a}=xt(t);return()=>(0,e.h)("svg",{class:a.value,width:n.value,height:n.value,viewBox:"0 0 38 38",xmlns:"http://www.w3.org/2000/svg",innerHTML:''})}}),Ru=h({name:"QSplitter",props:{...Xe,modelValue:{type:Number,required:!0},reverse:Boolean,unit:{type:String,default:"%",validator:e=>["%","px"].includes(e)},limits:{type:Array,validator:e=>2===e.length&&"number"==typeof e[0]&&"number"==typeof e[1]&&(e[0]>=0&&e[0]<=e[1])},emitImmediately:Boolean,horizontal:Boolean,disable:Boolean,beforeClass:[Array,String,Object],afterClass:[Array,String,Object],separatorClass:[Array,String,Object],separatorStyle:[Array,String,Object]},emits:["update:modelValue"],setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=et(t,i),r=(0,e.ref)(null),s={before:(0,e.ref)(null),after:(0,e.ref)(null)},l=(0,e.computed)(()=>`q-splitter no-wrap ${!0===t.horizontal?"q-splitter--horizontal column":"q-splitter--vertical row"} q-splitter--${!0===t.disable?"disabled":"workable"}`+(!0===o.value?" q-splitter--dark":"")),u=(0,e.computed)(()=>!0===t.horizontal?"height":"width"),c=(0,e.computed)(()=>!0===t.reverse?"after":"before"),d=(0,e.computed)(()=>void 0===t.limits?"%"===t.unit?[10,90]:[50,1/0]:t.limits);function h(e){return("%"===t.unit?e:Math.round(e))+t.unit}let p,f,m,_,g,v=(0,e.computed)(()=>({[c.value]:{[u.value]:h(t.modelValue)}}));function b(e){if(!0===e.isFirst){let e=r.value.getBoundingClientRect()[u.value];return p=!0===t.horizontal?"up":"left",f="%"===t.unit?100:e,m=Math.min(f,d.value[1],Math.max(d.value[0],t.modelValue)),_=(!0===t.reverse?-1:1)*(!0===t.horizontal?1:!0===i.lang.rtl?-1:1)*("%"===t.unit?0===e?0:100/e:1),void r.value.classList.add("q-splitter--active")}if(!0===e.isFinal)return g!==t.modelValue&&a("update:modelValue",g),void r.value.classList.remove("q-splitter--active");let n=m+_*(e.direction===p?-1:1)*e.distance[!0===t.horizontal?"y":"x"];g=Math.min(f,d.value[1],Math.max(d.value[0],n)),s[c.value].value.style[u.value]=h(g),!0===t.emitImmediately&&t.modelValue!==g&&a("update:modelValue",g)}let y=(0,e.computed)(()=>[[fi,b,void 0,{[!0===t.horizontal?"vertical":"horizontal"]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]);function w(e,t){et[1]&&a("update:modelValue",t[1])}return(0,e.watch)(()=>t.modelValue,e=>{w(e,d.value)}),(0,e.watch)(()=>t.limits,()=>{(0,e.nextTick)(()=>{w(t.modelValue,d.value)})}),()=>{let a=[(0,e.h)("div",{ref:s.before,class:["q-splitter__panel q-splitter__before"+(!0===t.reverse?" col":""),t.beforeClass],style:v.value.before},Le(n.before)),(0,e.h)("div",{class:["q-splitter__separator",t.separatorClass],style:t.separatorStyle,"aria-disabled":!0===t.disable?"true":void 0},[Oe("div",{class:"q-splitter__separator-area absolute-full"},Le(n.separator),"sep",!0!==t.disable,()=>y.value)]),(0,e.h)("div",{ref:s.after,class:["q-splitter__panel q-splitter__after"+(!0===t.reverse?"":" col"),t.afterClass],style:v.value.after},Le(n.after))];return(0,e.h)("div",{class:l.value,ref:r},Re(n.default,a))}}}),zu=h({name:"StepHeader",props:{stepper:{},step:{},goToPanel:Function},setup(t,{attrs:n}){let{proxy:{$q:a}}=(0,e.getCurrentInstance)(),i=(0,e.ref)(null),o=(0,e.computed)(()=>t.stepper.modelValue===t.step.name),r=(0,e.computed)(()=>{let e=t.step.disable;return!0===e||""===e}),s=(0,e.computed)(()=>{let e=t.step.error;return!0===e||""===e}),l=(0,e.computed)(()=>{let e=t.step.done;return!1===r.value&&(!0===e||""===e)}),u=(0,e.computed)(()=>{let e=t.step.headerNav,n=!0===e||""===e||void 0===e;return!1===r.value&&t.stepper.headerNav&&n}),c=(0,e.computed)(()=>t.step.prefix&&(!1===o.value||"none"===t.stepper.activeIcon)&&(!1===s.value||"none"===t.stepper.errorIcon)&&(!1===l.value||"none"===t.stepper.doneIcon)),d=(0,e.computed)(()=>{let e=t.step.icon||t.stepper.inactiveIcon;if(!0===o.value){let n=t.step.activeIcon||t.stepper.activeIcon;return"none"===n?e:n||a.iconSet.stepper.active}if(!0===s.value){let n=t.step.errorIcon||t.stepper.errorIcon;return"none"===n?e:n||a.iconSet.stepper.error}if(!1===r.value&&!0===l.value){let n=t.step.doneIcon||t.stepper.doneIcon;return"none"===n?e:n||a.iconSet.stepper.done}return e}),h=(0,e.computed)(()=>{let e=!0===s.value?t.step.errorColor||t.stepper.errorColor:void 0;if(!0===o.value){let n=t.step.activeColor||t.stepper.activeColor||t.step.color;return void 0===n?e:n}return void 0===e?!1===r.value&&!0===l.value?t.step.doneColor||t.stepper.doneColor||t.step.color||t.stepper.inactiveColor:t.step.color||t.stepper.inactiveColor:e}),p=(0,e.computed)(()=>"q-stepper__tab col-grow flex items-center no-wrap relative-position"+(void 0===h.value?"":` text-${h.value}`)+(!0===s.value?" q-stepper__tab--error q-stepper__tab--error-with-"+(!0===c.value?"prefix":"icon"):"")+(!0===o.value?" q-stepper__tab--active":"")+(!0===l.value?" q-stepper__tab--done":"")+(!0===u.value?" q-stepper__tab--navigation q-focusable q-hoverable":"")+(!0===r.value?" q-stepper__tab--disabled":"")),f=(0,e.computed)(()=>!0===t.stepper.headerNav&&u.value);function m(){i.value?.focus(),!1===o.value&&t.goToPanel(t.step.name)}function _(e){13===e.keyCode&&!1===o.value&&t.goToPanel(t.step.name)}return()=>{let a={class:p.value};!0===u.value&&(a.onClick=m,a.onKeyup=_,Object.assign(a,!0===r.value?{tabindex:-1,"aria-disabled":"true"}:{tabindex:n.tabindex||0}));let o=[(0,e.h)("div",{class:"q-focus-helper",tabindex:-1,ref:i}),(0,e.h)("div",{class:"q-stepper__dot row flex-center q-stepper__line relative-position"},[(0,e.h)("span",{class:"row flex-center"},[!0===c.value?t.step.prefix:(0,e.h)(Ye,{name:d.value})])])];if(void 0!==t.step.title&&null!==t.step.title){let n=[(0,e.h)("div",{class:"q-stepper__title"},t.step.title)];void 0!==t.step.caption&&null!==t.step.caption&&n.push((0,e.h)("div",{class:"q-stepper__caption"},t.step.caption)),o.push((0,e.h)("div",{class:"q-stepper__label q-stepper__line relative-position"},n))}return(0,e.withDirectives)((0,e.h)("div",a,o),[[Ot,f.value]])}}});function Ou(t){return(0,e.h)("div",{class:"q-stepper__step-content"},[(0,e.h)("div",{class:"q-stepper__step-inner"},Le(t.default))])}let Iu={setup:(e,{slots:t})=>()=>Ou(t)};var Nu=h({name:"QStep",props:{...ja,icon:String,color:String,title:{type:String,required:!0},caption:String,prefix:[String,Number],doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String,headerNav:{type:Boolean,default:!0},done:Boolean,error:Boolean,onScroll:[Function,Array]},setup(t,{slots:n,emit:a}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=(0,e.inject)(Y,te);if(o===te)return console.error("QStep needs to be a child of QStepper"),te;let{getCache:r}=qa(),s=(0,e.ref)(null),l=(0,e.computed)(()=>o.value.modelValue===t.name),u=(0,e.computed)(()=>!0!==i.platform.is.ios&&!0===i.platform.is.chrome||!0!==l.value||!0!==o.value.vertical?{}:{onScroll(e){let{target:n}=e;n.scrollTop>0&&(n.scrollTop=0),void 0!==t.onScroll&&a("scroll",e)}}),c=(0,e.computed)(()=>"string"==typeof t.name||"number"==typeof t.name?t.name:String(t.name));function d(){let t=o.value.vertical;return!0===t&&!0===o.value.keepAlive?(0,e.h)(e.KeepAlive,o.value.keepAliveProps.value,!0===l.value?[(0,e.h)(!0===o.value.needsUniqueKeepAliveWrapper.value?r(c.value,()=>({...Iu,name:c.value})):Iu,{key:c.value},n.default)]:void 0):!0!==t||!0===l.value?Ou(n):void 0}return()=>(0,e.h)("div",{ref:s,class:"q-stepper__step",role:"tabpanel",...u.value},!0===o.value.vertical?[(0,e.h)(zu,{stepper:o.value,step:t,goToPanel:o.value.goToPanel}),!0===o.value.animated?(0,e.h)(qr,d):d()]:[d()])}});let Du=/(-\w)/g;var qu=h({name:"QStepper",props:{...Xe,...Fa,flat:Boolean,bordered:Boolean,alternativeLabels:Boolean,headerNav:Boolean,contracted:Boolean,headerClass:String,inactiveColor:String,inactiveIcon:String,doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String},emits:$a,setup(t,{slots:n}){let a=et(t,(0,e.getCurrentInstance)().proxy.$q),{updatePanelsList:i,isValidPanelName:o,updatePanelIndex:r,getPanelContent:s,getPanels:l,panelDirectives:u,goToPanel:c,keepAliveProps:d,needsUniqueKeepAliveWrapper:h}=Va();(0,e.provide)(Y,(0,e.computed)(()=>({goToPanel:c,keepAliveProps:d,needsUniqueKeepAliveWrapper:h,...t})));let p=(0,e.computed)(()=>"q-stepper q-stepper--"+(!0===t.vertical?"vertical":"horizontal")+(!0===t.flat?" q-stepper--flat":"")+(!0===t.bordered?" q-stepper--bordered":"")+(!0===a.value?" q-stepper--dark q-dark":"")),f=(0,e.computed)(()=>`q-stepper__header row items-stretch justify-between q-stepper__header--${!0===t.alternativeLabels?"alternative":"standard"}-labels`+(!1===t.flat||!0===t.bordered?" q-stepper__header--border":"")+(!0===t.contracted?" q-stepper__header--contracted":"")+(void 0===t.headerClass?"":` ${t.headerClass}`));function m(){let a=Le(n.message,[]);if(!0===t.vertical){o(t.modelValue)&&r();let i=(0,e.h)("div",{class:"q-stepper__content"},Le(n.default));return void 0===a?[i]:a.concat(i)}return[(0,e.h)("div",{class:f.value},l().map(n=>{let a=function(e){let t={};for(let n in e){let a=n.replace(Du,e=>e[1].toUpperCase());t[a]=e[n]}return t}(n.props);return(0,e.h)(zu,{key:a.name,stepper:t,step:a,goToPanel:c})})),a,Oe("div",{class:"q-stepper__content q-panel-parent"},s(),"cont",t.swipeable,()=>u.value)]}return()=>(i(n),(0,e.h)("div",{class:p.value},Re(n.navigation,m())))}}),ju=h({name:"QStepperNavigation",setup:(t,{slots:n})=>()=>(0,e.h)("div",{class:"q-stepper__nav"},Le(n.default))}),Bu=h({name:"QTh",props:{props:Object,autoWidth:Boolean},emits:["click"],setup(t,{slots:n,emit:a}){let i=(0,e.getCurrentInstance)(),{proxy:{$q:o}}=i,r=e=>{a("click",e)};return()=>{if(void 0===t.props)return(0,e.h)("th",{class:!0===t.autoWidth?"q-table--col-auto-width":"",onClick:r},Le(n.default));let a,s,l=i.vnode.key;if(l){if(a=t.props.colsMap[l],void 0===a)return}else a=t.props.col;if(!0===a.sortable){let t="right"===a.align?"unshift":"push";s=Me(n.default,[]),s[t]((0,e.h)(Ye,{class:a.__iconClass,name:o.iconSet.table.arrowUp}))}else s=Le(n.default);return(0,e.h)("th",{class:a.__thClass+(!0===t.autoWidth?" q-table--col-auto-width":""),style:a.headerStyle,onClick:e=>{!0===a.sortable&&t.props.sort(a),r(e)}},s)}}});function Fu(t,n){return(0,e.h)("div",t,[(0,e.h)("table",{class:"q-table"},n)])}let $u={list:Ys,table:il},Vu=["list","table","__qtable"];var Uu=h({name:"QVirtualScroll",props:{...Jl,type:{type:String,default:"list",validator:e=>Vu.includes(e)},items:{type:Array,default:()=>[]},itemsFn:Function,itemsSize:Number,scrollTarget:Cn},setup(t,{slots:n,attrs:a}){let i,o=(0,e.ref)(null),r=(0,e.computed)(()=>t.itemsSize>=0&&void 0!==t.itemsFn?parseInt(t.itemsSize,10):Array.isArray(t.items)?t.items.length:0),{virtualScrollSliceRange:s,localResetVirtualScroll:l,padVirtualScroll:u,onVirtualScrollEvt:c}=Xl({virtualScrollLength:r,getVirtualScrollTarget:function(){return i},getVirtualScrollEl:f}),d=(0,e.computed)(()=>{if(0===r.value)return[];let e=(e,t)=>({index:s.value.from+t,item:e});return void 0===t.itemsFn?t.items.slice(s.value.from,s.value.to).map(e):t.itemsFn(s.value.from,s.value.to-s.value.from).map(e)}),h=(0,e.computed)(()=>"q-virtual-scroll q-virtual-scroll"+(!0===t.virtualScrollHorizontal?"--horizontal":"--vertical")+(void 0===t.scrollTarget?" scroll":"")),p=(0,e.computed)(()=>void 0===t.scrollTarget?{tabindex:0}:{});function f(){return o.value.$el||o.value}function _(){i=Pn(f(),t.scrollTarget),i.addEventListener("scroll",c,m.passive)}function g(){void 0!==i&&(i.removeEventListener("scroll",c,m.passive),i=void 0)}function v(){let e=u("list"===t.type?"div":"tbody",d.value.map(n.default));return void 0!==n.before&&(e=n.before().concat(e)),Re(n.after,e)}return(0,e.watch)(r,()=>{l()}),(0,e.watch)(()=>t.scrollTarget,()=>{g(),_()}),(0,e.onBeforeMount)(()=>{l()}),(0,e.onMounted)(()=>{_()}),(0,e.onActivated)(()=>{_()}),(0,e.onDeactivated)(()=>{g()}),(0,e.onBeforeUnmount)(()=>{g()}),()=>{if(void 0!==n.default)return"__qtable"===t.type?Fu({ref:o,class:"q-table__middle "+h.value},v()):(0,e.h)($u[t.type],{...a,ref:o,class:[a.class,h.value],...p.value},v);console.error("QVirtualScroll: default scoped slot is required for rendering")}}});let Hu={sortMethod:Function,binaryStateSort:Boolean,columnSortOrder:{type:String,validator:e=>"ad"===e||"da"===e,default:"ad"}};function Wu(t,n,a,i){let o=(0,e.computed)(()=>{let{sortBy:e}=n.value;return e&&a.value.find(t=>t.name===e)||null}),r=(0,e.computed)(()=>void 0===t.sortMethod?(e,t,n)=>{let i=a.value.find(e=>e.name===t);if(void 0===i||void 0===i.field)return e;let o=!0===n?-1:1,r="function"==typeof i.field?e=>i.field(e):e=>e[i.field];return e.sort((e,t)=>{let n=r(e),a=r(t);return void 0===i.rawSort?null==n?-1*o:null==a?Number(o):void 0===i.sort?!0===le(n)&&!0===le(a)?(n-a)*o:!0===re(n)&&!0===re(a)?function(e,t){return new Date(e)-new Date(t)}(n,a)*o:"boolean"==typeof n&&"boolean"==typeof a?(n-a)*o:([n,a]=[n,a].map(e=>String(e).toLocaleString().toLowerCase()),nt.name===e);t?.sortOrder&&(o=t.sortOrder)}let{sortBy:r,descending:s}=n.value;r===e?!0===t.binaryStateSort?s=!s:!0===s?"ad"===o?r=null:s=!1:"ad"===o?s=!0:r=null:(r=e,s="da"===o),i({sortBy:r,descending:s,page:1})}}}let Gu={filter:[String,Object],filterMethod:Function};function Ku(e){return e.page<1&&(e.page=1),void 0!==e.rowsPerPage&&e.rowsPerPage<1&&(e.rowsPerPage=0),e}let Yu={pagination:Object,rowsPerPageOptions:{type:Array,default:()=>[5,7,10,15,20,25,50,0]},"onUpdate:pagination":[Function,Array]};let Qu={selection:{type:String,default:"none",validator:e=>["single","multiple","none"].includes(e)},selected:{type:Array,default:()=>[]}},Zu=["update:selected","selection"];function Ju(e){return Array.isArray(e)?e.slice():[]}let Xu={expanded:Array},ec=["update:expanded"];let tc={visibleColumns:Array};function nc(t,n,a){let i=(0,e.computed)(()=>{if(void 0!==t.columns)return t.columns;let e=t.rows[0];return void 0===e?[]:Object.keys(e).map(t=>({name:t,label:t.toUpperCase(),field:t,align:le(e[t])?"right":"left",sortable:!0}))}),o=(0,e.computed)(()=>{let{sortBy:e,descending:a}=n.value;return(void 0===t.visibleColumns?i.value:i.value.filter(e=>!0===e.required||!0===t.visibleColumns.includes(e.name))).map(t=>{let n=t.align||"right",i=`text-${n}`;return{...t,align:n,__iconClass:`q-table__sort-icon q-table__sort-icon--${n}`,__thClass:i+(void 0===t.headerClasses?"":" "+t.headerClasses)+(!0===t.sortable?" sortable":"")+(t.name===e?" sorted "+(!0===a?"sort-desc":""):""),__tdStyle:void 0===t.style?()=>null:"function"==typeof t.style?t.style:()=>t.style,__tdClass:void 0===t.classes?()=>i:"function"==typeof t.classes?e=>i+" "+t.classes(e):()=>i+" "+t.classes}})});return{colList:i,computedCols:o,computedColsMap:(0,e.computed)(()=>{let e={};return o.value.forEach(t=>{e[t.name]=t}),e}),computedColspan:(0,e.computed)(()=>void 0===t.tableColspan?o.value.length+ +(!0===a.value):t.tableColspan)}}let ac="q-table__bottom row items-center",ic={};Zl.forEach(e=>{ic[e]={}});var oc=h({name:"QTable",props:{rows:{type:Array,required:!0},rowKey:{type:[String,Function],default:"id"},columns:Array,loading:Boolean,iconFirstPage:String,iconPrevPage:String,iconNextPage:String,iconLastPage:String,title:String,hideHeader:Boolean,grid:Boolean,gridHeader:Boolean,dense:Boolean,flat:Boolean,bordered:Boolean,square:Boolean,separator:{type:String,default:"horizontal",validator:e=>["horizontal","vertical","cell","none"].includes(e)},wrapCells:Boolean,virtualScroll:Boolean,virtualScrollTarget:{},...ic,noDataLabel:String,noResultsLabel:String,loadingLabel:String,selectedRowsLabel:Function,rowsPerPageLabel:String,paginationLabel:Function,color:{type:String,default:"grey-8"},titleClass:[String,Array,Object],tableStyle:[String,Array,Object],tableClass:[String,Array,Object],tableHeaderStyle:[String,Array,Object],tableHeaderClass:[String,Array,Object],tableRowStyleFn:Function,tableRowClassFn:Function,cardContainerClass:[String,Array,Object],cardContainerStyle:[String,Array,Object],cardStyle:[String,Array,Object],cardClass:[String,Array,Object],cardStyleFn:Function,cardClassFn:Function,hideBottom:Boolean,hideSelectedBanner:Boolean,hideNoData:Boolean,hidePagination:Boolean,onRowClick:Function,onRowDblclick:Function,onRowContextmenu:Function,...Xe,...Ha,...tc,...Gu,...Yu,...Xu,...Qu,...Hu},emits:["request","virtualScroll",...Wa,...ec,...Zu],setup(t,{slots:n,emit:o}){let r=(0,e.getCurrentInstance)(),{proxy:{$q:s}}=r,l=et(t,s),{inFullscreen:u,toggleFullscreen:c}=Ga(),d=(0,e.computed)(()=>"function"==typeof t.rowKey?t.rowKey:e=>e[t.rowKey]),h=(0,e.ref)(null),p=(0,e.ref)(null),f=(0,e.computed)(()=>!0!==t.grid&&!0===t.virtualScroll),m=(0,e.computed)(()=>" q-table__card"+(!0===l.value?" q-table__card--dark q-dark":"")+(!0===t.square?" q-table--square":"")+(!0===t.flat?" q-table--flat":"")+(!0===t.bordered?" q-table--bordered":"")),_=(0,e.computed)(()=>`q-table__container q-table--${t.separator}-separator column no-wrap`+(!0===t.grid?" q-table--grid":m.value)+(!0===l.value?" q-table--dark":"")+(!0===t.dense?" q-table--dense":"")+(!1===t.wrapCells?" q-table--no-wrap":"")+(!0===u.value?" fullscreen scroll":"")),g=(0,e.computed)(()=>_.value+(!0===t.loading?" q-table--loading":""));(0,e.watch)(()=>t.tableStyle+t.tableClass+t.tableHeaderStyle+t.tableHeaderClass+_.value,()=>{!0===f.value&&p.value?.reset()});let{innerPagination:v,computedPagination:b,isServerSide:y,requestServerInteraction:w,setPagination:k}=function(t,n){let{props:a,emit:i}=t,o=(0,e.ref)(Object.assign({sortBy:null,descending:!1,page:1,rowsPerPage:0===a.rowsPerPageOptions.length?5:a.rowsPerPageOptions[0]},a.pagination)),r=(0,e.computed)(()=>Ku(void 0===a["onUpdate:pagination"]?o.value:{...o.value,...a.pagination})),s=(0,e.computed)(()=>void 0!==r.value.rowsNumber);function l(e){u({pagination:e,filter:a.filter})}function u(t={}){(0,e.nextTick)(()=>{i("request",{pagination:t.pagination||r.value,filter:t.filter||a.filter,getCellValue:n})})}return{innerPagination:o,computedPagination:r,isServerSide:s,requestServerInteraction:u,setPagination:function(e,t){let n=Ku({...r.value,...e});!0!==function(e,t){for(let n in t)if(t[n]!==e[n])return!1;return!0}(r.value,n)?!0!==s.value?void 0!==a.pagination&&void 0!==a["onUpdate:pagination"]?i("update:pagination",n):o.value=n:l(n):!0===s.value&&!0===t&&l(n)}}}(r,pe),{computedFilterMethod:x}=function(t,n){let a=(0,e.computed)(()=>void 0===t.filterMethod?(e,t,n,a)=>{let i=t?t.toLowerCase():"";return e.filter(e=>n.some(t=>{let n=String(a(t,e));return-1!==("undefined"===n||"null"===n?"":n.toLowerCase()).indexOf(i)}))}:t.filterMethod);return(0,e.watch)(()=>t.filter,()=>{(0,e.nextTick)(()=>{n({page:1},!0)})},{deep:!0}),{computedFilterMethod:a}}(t,k),{isRowExpanded:S,setExpanded:C,updateExpanded:T}=function(t,n){let a=(0,e.ref)(Ju(t.expanded));function i(e){void 0===t.expanded?a.value=e:n("update:expanded",e)}return(0,e.watch)(()=>t.expanded,e=>{a.value=Ju(e)}),{isRowExpanded:function(e){return a.value.includes(e)},setExpanded:i,updateExpanded:function(e,t){let n=a.value.slice(),o=n.indexOf(e);!0===t?-1===o&&(n.push(e),i(n)):-1!==o&&(n.splice(o,1),i(n))}}}(t,o),P=(0,e.computed)(()=>{let e=t.rows;if(!0===y.value||0===e.length)return e;let{sortBy:n,descending:a}=b.value;return t.filter&&(e=x.value(e,t.filter,B.value,pe)),null!==V.value&&(e=U.value(t.rows===e?e.slice():e,n,a)),e}),E=(0,e.computed)(()=>P.value.length),A=(0,e.computed)(()=>{let e=P.value;if(!0===y.value)return e;let{rowsPerPage:n}=b.value;return 0!==n&&(0===W.value&&t.rows!==e?e.length>G.value&&(e=e.slice(0,G.value)):e=e.slice(W.value,G.value)),e}),{hasSelectionMode:L,singleSelection:M,multipleSelection:R,allRowsSelected:z,someRowsSelected:O,rowsSelectedNumber:I,isRowSelected:N,clearSelection:D,updateSelection:q}=function(t,n,a,i){let o=(0,e.computed)(()=>{let e={};return t.selected.map(i.value).forEach(t=>{e[t]=!0}),e}),r=(0,e.computed)(()=>"none"!==t.selection),s=(0,e.computed)(()=>"single"===t.selection),l=(0,e.computed)(()=>"multiple"===t.selection),u=(0,e.computed)(()=>0!==a.value.length&&a.value.every(e=>!0===o.value[i.value(e)])),c=(0,e.computed)(()=>!0!==u.value&&a.value.some(e=>!0===o.value[i.value(e)])),d=(0,e.computed)(()=>t.selected.length);return{hasSelectionMode:r,singleSelection:s,multipleSelection:l,allRowsSelected:u,someRowsSelected:c,rowsSelectedNumber:d,isRowSelected:function(e){return!0===o.value[e]},clearSelection:function(){n("update:selected",[])},updateSelection:function(e,a,o,r){n("selection",{rows:a,added:o,keys:e,evt:r}),n("update:selected",!0===s.value?!0===o?a:[]:!0===o?t.selected.concat(a):t.selected.filter(t=>!1===e.includes(i.value(t))))}}}(t,o,A,d),{colList:j,computedCols:B,computedColsMap:F,computedColspan:$}=nc(t,b,L),{columnToSort:V,computedSortMethod:U,sort:H}=Wu(t,b,j,k),{firstRowIndex:W,lastRowIndex:G,isFirstPage:K,isLastPage:Y,pagesNumber:Q,computedRowsPerPageOptions:Z,computedRowsNumber:J,firstPage:X,prevPage:ee,nextPage:te,lastPage:ne}=function(t,n,a,i,o,r){let{props:s,emit:l,proxy:{$q:u}}=t,c=(0,e.computed)(()=>!0===i.value?a.value.rowsNumber||0:r.value),d=(0,e.computed)(()=>{let{page:e,rowsPerPage:t}=a.value;return(e-1)*t}),h=(0,e.computed)(()=>{let{page:e,rowsPerPage:t}=a.value;return e*t}),p=(0,e.computed)(()=>1===a.value.page),f=(0,e.computed)(()=>0===a.value.rowsPerPage?1:Math.max(1,Math.ceil(c.value/a.value.rowsPerPage))),m=(0,e.computed)(()=>0===h.value||a.value.page>=f.value),_=(0,e.computed)(()=>(s.rowsPerPageOptions.includes(n.value.rowsPerPage)?s.rowsPerPageOptions:[n.value.rowsPerPage].concat(s.rowsPerPageOptions)).map(e=>({label:0===e?u.lang.table.allRows:String(e),value:e})));return(0,e.watch)(f,(e,t)=>{if(e===t)return;let n=a.value.page;e&&!n?o({page:1}):e1&&o({page:e-1})},nextPage:function(){let{page:e,rowsPerPage:t}=a.value;h.value>0&&e*t0===A.value.length),ie=(0,e.computed)(()=>{let e={};return Zl.forEach(n=>{e[n]=t[n]}),void 0===e.virtualScrollItemSize&&(e.virtualScrollItemSize=!0===t.dense?28:48),e});function oe(){if(!0===t.grid)return function(){let a=void 0===n.item?a=>{let i=a.cols.map(t=>(0,e.h)("div",{class:"q-table__grid-item-row"},[(0,e.h)("div",{class:"q-table__grid-item-title"},[t.label]),(0,e.h)("div",{class:"q-table__grid-item-value"},[t.value])]));if(!0===L.value){let o=n["body-selection"],r=void 0===o?[(0,e.h)(oi,{modelValue:a.selected,color:t.color,dark:l.value,dense:t.dense,"onUpdate:modelValue":(e,t)=>{q([a.key],[a.row],e,t)}})]:o(a);i.unshift((0,e.h)("div",{class:"q-table__grid-item-row"},r),(0,e.h)(Fr,{dark:l.value}))}let r={class:["q-table__grid-item-card"+m.value,t.cardClass],style:t.cardStyle};if(void 0!==t.cardStyleFn&&(r.style=[r.style,t.cardStyleFn(a.row)]),void 0!==t.cardClassFn){let e=t.cardClassFn(a.row);e&&(r.class[0]+=` ${e}`)}return(void 0!==t.onRowClick||void 0!==t.onRowDblclick||void 0!==t.onRowContextmenu)&&(r.class[0]+=" cursor-pointer",void 0!==t.onRowClick&&(r.onClick=e=>{o("RowClick",e,a.row,a.pageIndex)}),void 0!==t.onRowDblclick&&(r.onDblclick=e=>{o("RowDblclick",e,a.row,a.pageIndex)}),void 0!==t.onRowContextmenu&&(r.onContextmenu=e=>{o("rowContextmenu",e,a.row,a.pageIndex)})),(0,e.h)("div",{class:"q-table__grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3"+(!0===a.selected?" q-table__grid-item--selected":"")},[(0,e.h)("div",r,i)])}:n.item;return(0,e.h)("div",{class:["q-table__grid-content row",t.cardContainerClass],style:t.cardContainerStyle},A.value.map((e,t)=>a(ce({key:d.value(e),row:e,pageIndex:t}))))}();let a=!0===t.hideHeader?null:ge;if(!0===f.value){let i=n["top-row"],o=n["bottom-row"],r={default:e=>le(e.item,n.body,e.index)};if(void 0!==i){let t=(0,e.h)("tbody",i({cols:B.value}));r.before=null===a?()=>t:()=>[a()].concat(t)}else null!==a&&(r.before=a);return void 0!==o&&(r.after=()=>(0,e.h)("tbody",o({cols:B.value}))),(0,e.h)(Uu,{ref:p,class:t.tableClass,style:t.tableStyle,...ie.value,scrollTarget:t.virtualScrollTarget,items:A.value,type:"__qtable",tableColspan:$.value,onVirtualScroll:re},r)}let i=[ue()];return null!==a&&i.unshift(a()),Fu({class:["q-table__middle scroll",t.tableClass],style:t.tableStyle},i)}function re(e){o("virtualScroll",e)}function se(){return[(0,e.h)(El,{class:"q-table__linear-progress",color:t.color,dark:l.value,indeterminate:!0,trackColor:"transparent"})]}function le(a,i,r){let s=d.value(a),u=N(s);if(void 0!==i){let e={key:s,row:a,pageIndex:r,__trClass:u?"selected":""};if(void 0!==t.tableRowStyleFn&&(e.__trStyle=t.tableRowStyleFn(a)),void 0!==t.tableRowClassFn){let n=t.tableRowClassFn(a);n&&(e.__trClass=`${n} ${e.__trClass}`)}return i(ce(e))}let c=n["body-cell"],h=B.value.map(t=>{let i=n[`body-cell-${t.name}`],o=void 0===i?c:i;return void 0===o?(0,e.h)("td",{class:t.__tdClass(a),style:t.__tdStyle(a)},pe(t,a)):o(de({key:s,row:a,pageIndex:r,col:t}))});if(!0===L.value){let i=n["body-selection"],o=void 0===i?[(0,e.h)(oi,{modelValue:u,color:t.color,dark:l.value,dense:t.dense,"onUpdate:modelValue":(e,t)=>{q([s],[a],e,t)}})]:i(function(e){return he(e),e}({key:s,row:a,pageIndex:r}));h.unshift((0,e.h)("td",{class:"q-table--col-auto-width"},o))}let p={key:s,class:{selected:u}};if(void 0!==t.onRowClick&&(p.class["cursor-pointer"]=!0,p.onClick=e=>{o("rowClick",e,a,r)}),void 0!==t.onRowDblclick&&(p.class["cursor-pointer"]=!0,p.onDblclick=e=>{o("rowDblclick",e,a,r)}),void 0!==t.onRowContextmenu&&(p.class["cursor-pointer"]=!0,p.onContextmenu=e=>{o("rowContextmenu",e,a,r)}),void 0!==t.tableRowStyleFn&&(p.style=t.tableRowStyleFn(a)),void 0!==t.tableRowClassFn){let e=t.tableRowClassFn(a);e&&(p.class[e]=!0)}return(0,e.h)("tr",p,h)}function ue(){let t=n.body,a=n["top-row"],i=n["bottom-row"],o=A.value.map((e,n)=>le(e,t,n));return void 0!==a&&(o=a({cols:B.value}).concat(o)),void 0!==i&&(o=o.concat(i({cols:B.value}))),(0,e.h)("tbody",o)}function ce(e){return he(e),e.cols=e.cols.map(t=>a({...t},"value",()=>pe(t,e.row))),e}function de(e){return he(e),a(e,"value",()=>pe(e.col,e.row)),e}function he(e){Object.assign(e,{cols:B.value,colsMap:F.value,sort:H,rowIndex:W.value+e.pageIndex,color:t.color,dark:l.value,dense:t.dense}),!0===L.value&&a(e,"selected",()=>N(e.key),(t,n)=>{q([e.key],[e.row],t,n)}),a(e,"expand",()=>S(e.key),t=>{T(e.key,t)})}function pe(e,t){let n="function"==typeof e.field?e.field(t):t[e.field];return void 0===e.format?n:e.format(n,t)}let fe=(0,e.computed)(()=>({pagination:b.value,pagesNumber:Q.value,isFirstPage:K.value,isLastPage:Y.value,firstPage:X,prevPage:ee,nextPage:te,lastPage:ne,inFullscreen:u.value,toggleFullscreen:c}));function me(){let a,i=n.top,o=n["top-left"],r=n["top-right"],s=n["top-selection"],l=!0===L.value&&void 0!==s&&I.value>0,u="q-table__top relative-position row items-center";return void 0!==i?(0,e.h)("div",{class:u},[i(fe.value)]):(!0===l?a=s(fe.value).slice():(a=[],void 0===o?t.title&&a.push((0,e.h)("div",{class:"q-table__control"},[(0,e.h)("div",{class:["q-table__title",t.titleClass]},t.title)])):a.push((0,e.h)("div",{class:"q-table__control"},[o(fe.value)]))),void 0!==r&&(a.push((0,e.h)("div",{class:"q-table__separator col"})),a.push((0,e.h)("div",{class:"q-table__control"},[r(fe.value)]))),0!==a.length?(0,e.h)("div",{class:u},a):void 0)}let _e=(0,e.computed)(()=>!0===O.value?null:z.value);function ge(){let a=function(){let a=n.header,i=n["header-cell"];if(void 0!==a)return a(ve({header:!0})).slice();let o=B.value.map(t=>{let a=n[`header-cell-${t.name}`],o=void 0===a?i:a,r=ve({col:t});return void 0===o?(0,e.h)(Bu,{key:t.name,props:r},()=>t.label):o(r)});if(!0===M.value&&!0!==t.grid)o.unshift((0,e.h)("th",{class:"q-table--col-auto-width"}," "));else if(!0===R.value){let a=n["header-selection"],i=void 0===a?[(0,e.h)(oi,{color:t.color,modelValue:_e.value,dark:l.value,dense:t.dense,"onUpdate:modelValue":be})]:a(ve({}));o.unshift((0,e.h)("th",{class:"q-table--col-auto-width"},i))}return[(0,e.h)("tr",{class:t.tableHeaderClass,style:t.tableHeaderStyle},o)]}();return!0===t.loading&&void 0===n.loading&&a.push((0,e.h)("tr",{class:"q-table__progress"},[(0,e.h)("th",{class:"relative-position",colspan:$.value},se())])),(0,e.h)("thead",a)}function ve(e){return Object.assign(e,{cols:B.value,sort:H,colsMap:F.value,color:t.color,dark:l.value,dense:t.dense}),!0===R.value&&a(e,"selected",()=>_e.value,be),e}function be(e){!0===O.value&&(e=!1),q(A.value.map(d.value),A.value,e)}let ye=(0,e.computed)(()=>{let e=[t.iconFirstPage||s.iconSet.table.firstPage,t.iconPrevPage||s.iconSet.table.prevPage,t.iconNextPage||s.iconSet.table.nextPage,t.iconLastPage||s.iconSet.table.lastPage];return!0===s.lang.rtl?e.reverse():e});function we(){if(!0===t.hideBottom)return;if(!0===ae.value){if(!0===t.hideNoData)return;let a=!0===t.loading?t.loadingLabel||s.lang.table.loading:t.filter?t.noResultsLabel||s.lang.table.noResults:t.noDataLabel||s.lang.table.noData,i=n["no-data"],o=void 0===i?[(0,e.h)(Ye,{class:"q-table__bottom-nodata-icon",name:s.iconSet.table.warning}),a]:[i({message:a,icon:s.iconSet.table.warning,filter:t.filter})];return(0,e.h)("div",{class:ac+" q-table__bottom--nodata"},o)}let a=n.bottom;if(void 0!==a)return(0,e.h)("div",{class:ac},[a(fe.value)]);let i=!0!==t.hideSelectedBanner&&!0===L.value&&I.value>0?[(0,e.h)("div",{class:"q-table__control"},[(0,e.h)("div",[(t.selectedRowsLabel||s.lang.table.selectedRecords)(I.value)])])]:[];return!0!==t.hidePagination?(0,e.h)("div",{class:ac+" justify-end"},function(a){let i,{rowsPerPage:o}=b.value,r=t.paginationLabel||s.lang.table.pagination,u=n.pagination,c=t.rowsPerPageOptions.length>1;if(a.push((0,e.h)("div",{class:"q-table__separator col"})),!0===c&&a.push((0,e.h)("div",{class:"q-table__control"},[(0,e.h)("span",{class:"q-table__bottom-item"},[t.rowsPerPageLabel||s.lang.table.recordsPerPage]),(0,e.h)(au,{class:"q-table__select inline q-table__bottom-item",color:t.color,modelValue:o,options:Z.value,displayValue:0===o?s.lang.table.allRows:o,dark:l.value,borderless:!0,dense:!0,optionsDense:!0,optionsCover:!0,"onUpdate:modelValue":ke})])),void 0!==u)i=u(fe.value);else if(i=[(0,e.h)("span",0===o?{}:{class:"q-table__bottom-item"},[o?r(W.value+1,Math.min(G.value,J.value),J.value):r(1,E.value,J.value)])],0!==o&&Q.value>1){let n={color:t.color,round:!0,dense:!0,flat:!0};!0===t.dense&&(n.size="sm"),Q.value>2&&i.push((0,e.h)(Kt,{key:"pgFirst",...n,icon:ye.value[0],disable:K.value,"aria-label":s.lang.pagination.first,onClick:X})),i.push((0,e.h)(Kt,{key:"pgPrev",...n,icon:ye.value[1],disable:K.value,"aria-label":s.lang.pagination.prev,onClick:ee}),(0,e.h)(Kt,{key:"pgNext",...n,icon:ye.value[2],disable:Y.value,"aria-label":s.lang.pagination.next,onClick:te})),Q.value>2&&i.push((0,e.h)(Kt,{key:"pgLast",...n,icon:ye.value[3],disable:Y.value,"aria-label":s.lang.pagination.last,onClick:ne}))}return a.push((0,e.h)("div",{class:"q-table__control"},i)),a}(i)):0!==i.length?(0,e.h)("div",{class:ac},i):void 0}function ke(e){k({page:1,rowsPerPage:e.value})}return Object.assign(r.proxy,{requestServerInteraction:w,setPagination:k,firstPage:X,prevPage:ee,nextPage:te,lastPage:ne,isRowSelected:N,clearSelection:D,isRowExpanded:S,setExpanded:C,sort:H,resetVirtualScroll:function(){!0===f.value&&p.value.reset()},scrollTo:function(e,n){if(null!==p.value)return void p.value.scrollTo(e,n);e=parseInt(e,10);let a=h.value.querySelector(`tbody tr:nth-of-type(${e+1})`);if(null!==a){let n=h.value.querySelector(".q-table__middle.scroll"),i=a.offsetTop-t.virtualScrollStickySizeStart,r=iP.value,computedRows:()=>A.value,computedRowsNumber:()=>J.value}),()=>{let a=[me()],i={ref:h,class:g.value};return!0===t.grid?a.push((0,e.h)("div",{class:"q-table__middle"},!0===t.gridHeader?[(0,e.h)("table",{class:"q-table"},[ge(e.h)])]:!0===t.loading&&void 0===n.loading?se(e.h):void 0)):Object.assign(i,{class:[i.class,t.cardClass],style:t.cardStyle}),a.push(oe(),we()),!0===t.loading&&void 0!==n.loading&&a.push(n.loading()),(0,e.h)("div",i,a)}}}),rc=h({name:"QTr",props:{props:Object,noHover:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>"q-tr"+(void 0===t.props||!0===t.props.header?"":" "+t.props.__trClass)+(!0===t.noHover?" q-tr--no-hover":""));return()=>(0,e.h)("tr",{style:t.props?.__trStyle,class:a.value},Le(n.default))}}),sc=h({name:"QTd",props:{props:Object,autoWidth:Boolean,noHover:Boolean},setup(t,{slots:n}){let a=(0,e.getCurrentInstance)(),i=(0,e.computed)(()=>"q-td"+(!0===t.autoWidth?" q-table--col-auto-width":"")+(!0===t.noHover?" q-td--no-hover":"")+" ");return()=>{if(void 0===t.props)return(0,e.h)("td",{class:i.value},Le(n.default));let o=a.vnode.key,r=(void 0===t.props.colsMap?null:t.props.colsMap[o])||t.props.col;if(void 0===r)return;let{row:s}=t.props;return(0,e.h)("td",{class:i.value+r.__tdClass(s),style:r.__tdStyle(s)},Le(n.default))}}}),lc=h({name:"QRouteTab",props:{...bt,...zi},emits:Ri,setup(t,{slots:n,emit:a}){let i=yt({useDisableForRouterLinkProps:!1}),{renderTab:o,$tabs:r}=Oi(t,n,a,{exact:(0,e.computed)(()=>t.exact),...i});return(0,e.watch)(()=>`${t.name} | ${t.exact} | ${(i.resolvedLink.value||{}).href}`,r.verifyRouteModel),()=>o(i.linkTag.value,i.linkAttrs.value)}});function uc(){let e=new Date;return{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}}var cc=h({name:"QTime",props:{...Xe,...xa,...mo,modelValue:{required:!0,validator:e=>"string"==typeof e||null===e},mask:{...mo.mask,default:null},format24h:{type:Boolean,default:null},defaultDate:{type:String,validator:e=>/^-?[\d]+\/[0-1]\d\/[0-3]\d$/.test(e)},options:Function,hourOptions:Array,minuteOptions:Array,secondOptions:Array,withSeconds:Boolean,nowBtn:Boolean},emits:_o,setup(t,{slots:n,emit:a}){let i,o,r=(0,e.getCurrentInstance)(),{$q:s}=r.proxy,l=et(t,s),{tabindex:u,headerClass:c,getLocale:d,getCurrentDate:h}=vo(t,s),p=Ca(Sa(t)),f=(0,e.ref)(null),m=(0,e.computed)(()=>"persian"!==t.calendar&&null!==t.mask?t.mask:"HH:mm"+(!0===t.withSeconds?":ss":"")),_=(0,e.computed)(()=>d()),g=(0,e.computed)(()=>function(){if("string"!=typeof t.defaultDate){let e=h(!0);return e.dateHash=go(e),e}return Lo(t.defaultDate,"YYYY/MM/DD",void 0,t.calendar)}()),b=Lo(t.modelValue,m.value,_.value,t.calendar,g.value),y=(0,e.ref)(function(e,t){if(null!==e.hour){if(null===e.minute)return"minute";if(!0===t&&null===e.second)return"second"}return"hour"}(b)),w=(0,e.ref)(b),k=(0,e.ref)(null===b.hour||b.hour<12),x=(0,e.computed)(()=>"q-time q-time--"+(!0===t.landscape?"landscape":"portrait")+(!0===l.value?" q-time--dark q-dark":"")+(!0===t.disable?" disabled":!0===t.readonly?" q-time--readonly":"")+(!0===t.bordered?" q-time--bordered":"")+(!0===t.square?" q-time--square no-border-radius":"")+(!0===t.flat?" q-time--flat no-shadow":"")),S=(0,e.computed)(()=>{let e=w.value;return{hour:null===e.hour?"--":!0===C.value?be(e.hour):String(!0===k.value?0===e.hour?12:e.hour:e.hour>12?e.hour-12:e.hour),minute:null===e.minute?"--":be(e.minute),second:null===e.second?"--":be(e.second)}}),C=(0,e.computed)(()=>null===t.format24h?s.lang.date.format24h:t.format24h),T=(0,e.computed)(()=>{let e="hour"===y.value,t=!0===e?12:60,n=w.value[y.value],a=`rotate(${Math.round(360/t*n)-180}deg) translateX(-50%)`;return!0===e&&!0===C.value&&w.value.hour>=12&&(a+=" scale(.7)"),{transform:a}}),P=(0,e.computed)(()=>null!==w.value.hour),E=(0,e.computed)(()=>!0===P.value&&null!==w.value.minute),A=(0,e.computed)(()=>void 0===t.hourOptions?void 0===t.options?null:e=>t.options(e,null,null):e=>t.hourOptions.includes(e)),L=(0,e.computed)(()=>void 0===t.minuteOptions?void 0===t.options?null:e=>t.options(w.value.hour,e,null):e=>t.minuteOptions.includes(e)),M=(0,e.computed)(()=>void 0===t.secondOptions?void 0===t.options?null:e=>t.options(w.value.hour,w.value.minute,e):e=>t.secondOptions.includes(e)),R=(0,e.computed)(()=>{if(null===A.value)return null;let e=j(0,11,A.value),t=j(12,11,A.value);return{am:e,pm:t,values:e.values.concat(t.values)}}),z=(0,e.computed)(()=>null===L.value?null:j(0,59,L.value)),O=(0,e.computed)(()=>null===M.value?null:j(0,59,M.value)),I=(0,e.computed)(()=>{switch(y.value){case"hour":return R.value;case"minute":return z.value;case"second":return O.value}}),N=(0,e.computed)(()=>{let e,t,n=0,a=1,i=null===I.value?void 0:I.value.values;"hour"===y.value?!0===C.value?(e=0,t=23):(e=0,t=11,!1===k.value&&(n=12)):(e=0,t=55,a=5);let o=[];for(let r=e,s=e;r<=t;r+=a,s++){let e=r+n,t=!1===i?.includes(e),a="hour"===y.value&&0===r?!0===C.value?"00":"12":r;o.push({val:e,index:s,disable:t,label:a})}return o}),D=(0,e.computed)(()=>[[fi,U,void 0,{stop:!0,prevent:!0,mouse:!0}]]);function q(){let e={...h(),...uc()};ue(e),Object.assign(w.value,e),y.value="hour"}function j(e,t,n){let a=Array.apply(null,{length:t+1}).map((t,a)=>{let i=a+e;return{index:i,val:!0===n(i)}}).filter(e=>!0===e.val).map(e=>e.index);return{min:a[0],max:a[a.length-1],values:a,threshold:t+1}}function B(e,t,n){let a=Math.abs(e-t);return Math.min(a,n-a)}function F(e,{min:t,max:n,values:a,threshold:i}){if(e===t)return t;if(en)return B(e,t,i)<=B(e,n,i)?t:n;let o=a.findIndex(t=>e<=t),r=a[o-1],s=a[o];return e-r<=s-e?r:s}function $(){return!0===dt(r)||null!==I.value&&(0===I.value.values.length||"hour"===y.value&&!0!==C.value&&0===R.value[!0===k.value?"am":"pm"].values.length)}function V(){let{top:e,left:t,width:n}=f.value.getBoundingClientRect(),a=n/2;return{top:e+a,left:t+a,dist:.7*a}}function U(e){if(!0!==$()){if(!0===e.isFirst)return i=V(),void(o=W(e.evt,i));o=W(e.evt,i,o),!0===e.isFinal&&(i=!1,o=null,H())}}function H(){"hour"===y.value?y.value="minute":t.withSeconds&&"minute"===y.value&&(y.value="second")}function W(e,t,n){let a,i=v(e),o=Math.abs(i.top-t.top),r=Math.sqrt(Math.abs(i.top-t.top)**2+Math.abs(i.left-t.left)**2),s=Math.asin(o/r)*(180/Math.PI);if(s=i.top=t.dist:0!==R.value.am.values.length:!0===k.value;a=F(a+(!0===e?0:12),R.value[!0===e?"am":"pm"])}else a=Math.round(a),!0===C.value?rt.modelValue,e=>{let n=Lo(e,m.value,_.value,t.calendar,g.value);(n.dateHash!==w.value.dateHash||n.timeHash!==w.value.timeHash)&&(w.value=n,null===n.hour?y.value="hour":k.value=n.hour<12)}),(0,e.watch)([m,_],()=>{(0,e.nextTick)(()=>{ue()})});let G={hour(){y.value="hour"},minute(){y.value="minute"},second(){y.value="second"}};function K(e){13===e.keyCode&&oe()}function Y(e){13===e.keyCode&&re()}function Q(e){!0!==$()&&(!0!==s.platform.is.desktop&&W(e,V()),H())}function Z(e){!0!==$()&&W(e,V())}function J(e){if(13===e.keyCode)y.value="hour";else if([37,39].includes(e.keyCode)){let t=37===e.keyCode?-1:1;if(null!==R.value){let e=!0===C.value?R.value.values:R.value[!0===k.value?"am":"pm"].values;if(0===e.length)return;null===w.value.hour?te(e[0]):te(e[(e.length+e.indexOf(w.value.hour)+t)%e.length])}else{let e=!0===C.value?24:12;te((!0!==C.value&&!1===k.value?12:0)+(24+(null===w.value.hour?-t:w.value.hour)+t)%e)}}}function X(e){if(13===e.keyCode)y.value="minute";else if([37,39].includes(e.keyCode)){let t=37===e.keyCode?-1:1;if(null!==z.value){let e=z.value.values;if(0===e.length)return;null===w.value.minute?ne(e[0]):ne(e[(e.length+e.indexOf(w.value.minute)+t)%e.length])}else ne((60+(null===w.value.minute?-t:w.value.minute)+t)%60)}}function ee(e){if(13===e.keyCode)y.value="second";else if([37,39].includes(e.keyCode)){let t=37===e.keyCode?-1:1;if(null!==O.value){let e=O.value.values;if(0===e.length)return;null===w.value.seconds?ae(e[0]):ae(e[(e.length+e.indexOf(w.value.second)+t)%e.length])}else ae((60+(null===w.value.second?-t:w.value.second)+t)%60)}}function te(e){w.value.hour!==e&&(w.value.hour=e,le())}function ne(e){w.value.minute!==e&&(w.value.minute=e,le())}function ae(e){w.value.second!==e&&(w.value.second=e,le())}let ie={hour:te,minute:ne,second:ae};function oe(){!1===k.value&&(k.value=!0,null!==w.value.hour&&(w.value.hour-=12,le()))}function re(){!0===k.value&&(k.value=!1,null!==w.value.hour&&(w.value.hour+=12,le()))}function se(e){let n=t.modelValue;y.value!==e&&null!=n&&""!==n&&"string"!=typeof n&&(y.value=e)}function le(){return null!==A.value&&!0!==A.value(w.value.hour)?(w.value=Lo(),void se("hour")):null!==L.value&&!0!==L.value(w.value.minute)?(w.value.minute=null,w.value.second=null,void se("minute")):!0===t.withSeconds&&null!==M.value&&!0!==M.value(w.value.second)?(w.value.second=null,void se("second")):void(null===w.value.hour||null===w.value.minute||!0===t.withSeconds&&null===w.value.second||ue())}function ue(e){let n=Object.assign({...w.value},e),i="persian"===t.calendar?be(n.hour)+":"+be(n.minute)+(!0===t.withSeconds?":"+be(n.second):""):Bo(new Date(n.year,null===n.month?null:n.month-1,n.day,n.hour,n.minute,n.second,n.millisecond),m.value,_.value,n.year,n.timezoneOffset);n.changed=i!==t.modelValue,a("update:modelValue",i,n)}function ce(){let n=[(0,e.h)("div",{class:"q-time__link "+("hour"===y.value?"q-time__link--active":"cursor-pointer"),tabindex:u.value,onClick:G.hour,onKeyup:J},S.value.hour),(0,e.h)("div",":"),(0,e.h)("div",!0===P.value?{class:"q-time__link "+("minute"===y.value?"q-time__link--active":"cursor-pointer"),tabindex:u.value,onKeyup:X,onClick:G.minute}:{class:"q-time__link"},S.value.minute)];!0===t.withSeconds&&n.push((0,e.h)("div",":"),(0,e.h)("div",!0===E.value?{class:"q-time__link "+("second"===y.value?"q-time__link--active":"cursor-pointer"),tabindex:u.value,onKeyup:ee,onClick:G.second}:{class:"q-time__link"},S.value.second));let a=[(0,e.h)("div",{class:"q-time__header-label row items-center no-wrap",dir:"ltr"},n)];return!1===C.value&&a.push((0,e.h)("div",{class:"q-time__header-ampm column items-between no-wrap"},[(0,e.h)("div",{class:"q-time__link "+(!0===k.value?"q-time__link--active":"cursor-pointer"),tabindex:u.value,onClick:oe,onKeyup:K},"AM"),(0,e.h)("div",{class:"q-time__link "+(!0===k.value?"cursor-pointer":"q-time__link--active"),tabindex:u.value,onClick:re,onKeyup:Y},"PM")])),(0,e.h)("div",{class:"q-time__header flex flex-center no-wrap "+c.value},a)}function de(){let n=w.value[y.value];return(0,e.h)("div",{class:"q-time__content col relative-position"},[(0,e.h)(e.Transition,{name:"q-transition--scale"},()=>(0,e.h)("div",{key:"clock"+y.value,class:"q-time__container-parent absolute-full"},[(0,e.h)("div",{ref:f,class:"q-time__container-child fit overflow-hidden"},[(0,e.withDirectives)((0,e.h)("div",{class:"q-time__clock cursor-pointer non-selectable",onClick:Q,onMousedown:Z},[(0,e.h)("div",{class:"q-time__clock-circle fit"},[(0,e.h)("div",{class:"q-time__clock-pointer"+(null===w.value[y.value]?" hidden":void 0===t.color?"":` text-${t.color}`),style:T.value}),N.value.map(t=>(0,e.h)("div",{class:`q-time__clock-position row flex-center q-time__clock-pos-${t.index}`+(t.val===n?" q-time__clock-position--active "+c.value:!0===t.disable?" q-time__clock-position--disable":"")},[(0,e.h)("span",t.label)]))])]),D.value)])])),!0===t.nowBtn?(0,e.h)(Kt,{class:"q-time__now-button absolute",icon:s.iconSet.datetime.now,unelevated:!0,size:"sm",round:!0,color:t.color,textColor:t.textColor,tabindex:u.value,onClick:q}):null])}return r.proxy.setNow=q,()=>{let a=[de()],i=Le(n.default);return void 0!==i&&a.push((0,e.h)("div",{class:"q-time__actions"},i)),void 0!==t.name&&!0!==t.disable&&p(a,"push"),(0,e.h)("div",{class:x.value,tabindex:-1},[ce(),(0,e.h)("div",{class:"q-time__main col overflow-auto"},a)])}}}),dc=h({name:"QTimeline",props:{...Xe,color:{type:String,default:"primary"},side:{type:String,default:"right",validator:e=>["left","right"].includes(e)},layout:{type:String,default:"dense",validator:e=>["dense","comfortable","loose"].includes(e)}},setup(t,{slots:n}){let a=et(t,(0,e.getCurrentInstance)().proxy.$q);(0,e.provide)(K,t);let i=(0,e.computed)(()=>`q-timeline q-timeline--${t.layout} q-timeline--${t.layout}--${t.side}`+(!0===a.value?" q-timeline--dark":""));return()=>(0,e.h)("ul",{class:i.value},Le(n.default))}}),hc=h({name:"QTimelineEntry",props:{heading:Boolean,tag:{type:String,default:"h3"},side:{type:String,default:"right",validator:e=>["left","right"].includes(e)},icon:String,avatar:String,color:String,title:String,subtitle:String,body:String},setup(t,{slots:n}){let a=(0,e.inject)(K,te);if(a===te)return console.error("QTimelineEntry needs to be child of QTimeline"),te;let i=(0,e.computed)(()=>`q-timeline__entry q-timeline__entry--${t.side}`+(void 0!==t.icon||void 0!==t.avatar?" q-timeline__entry--icon":"")),o=(0,e.computed)(()=>`q-timeline__dot text-${t.color||a.color}`),r=(0,e.computed)(()=>"comfortable"===a.layout&&"left"===a.side);return()=>{let a,s=Me(n.default,[]);if(void 0!==t.body&&s.unshift(t.body),!0===t.heading){let n=[(0,e.h)("div"),(0,e.h)("div"),(0,e.h)(t.tag,{class:"q-timeline__heading-title"},s)];return(0,e.h)("div",{class:"q-timeline__heading"},!0===r.value?n.reverse():n)}void 0===t.icon?void 0!==t.avatar&&(a=[(0,e.h)("img",{class:"q-timeline__dot-img",src:t.avatar})]):a=[(0,e.h)(Ye,{class:"row items-center justify-center",name:t.icon})];let l=[(0,e.h)("div",{class:"q-timeline__subtitle"},[(0,e.h)("span",{},Le(n.subtitle,[t.subtitle]))]),(0,e.h)("div",{class:o.value},a),(0,e.h)("div",{class:"q-timeline__content"},[(0,e.h)("h6",{class:"q-timeline__title"},Le(n.title,[t.title]))].concat(s))];return(0,e.h)("li",{class:i.value},!0===r.value?l.reverse():l)}}}),pc=h({name:"QToolbar",props:{inset:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>"q-toolbar row no-wrap items-center"+(!0===t.inset?" q-toolbar--inset":""));return()=>(0,e.h)("div",{class:a.value,role:"toolbar"},Le(n.default))}}),fc=h({name:"QToolbarTitle",props:{shrink:Boolean},setup(t,{slots:n}){let a=(0,e.computed)(()=>"q-toolbar__title ellipsis"+(!0===t.shrink?" col-shrink":""));return()=>(0,e.h)("div",{class:a.value},Le(n.default))}});let mc=["none","strict","leaf","leaf-filtered"];var _c=h({name:"QTree",props:{...Xe,nodes:{type:Array,required:!0},nodeKey:{type:String,required:!0},labelKey:{type:String,default:"label"},childrenKey:{type:String,default:"children"},dense:Boolean,color:String,controlColor:String,textColor:String,selectedColor:String,icon:String,tickStrategy:{type:String,default:"none",validator:e=>mc.includes(e)},ticked:Array,expanded:Array,selected:{},noSelectionUnset:Boolean,defaultExpandAll:Boolean,accordion:Boolean,filter:String,filterMethod:Function,duration:{},noConnectors:Boolean,noTransition:Boolean,noNodesLabel:String,noResultsLabel:String},emits:["update:expanded","update:ticked","update:selected","lazyLoad","afterShow","afterHide"],setup(t,{slots:n,emit:i}){let{proxy:o}=(0,e.getCurrentInstance)(),{$q:r}=o,s=et(t,r),l=(0,e.ref)({}),u=(0,e.ref)(t.ticked||[]),c=(0,e.ref)(t.expanded||[]),d={};(0,e.onBeforeUpdate)(()=>{d={}});let h=(0,e.computed)(()=>"q-tree q-tree--"+(!0===t.dense?"dense":"standard")+(!0===t.noConnectors?" q-tree--no-connectors":"")+(!0===s.value?" q-tree--dark":"")+(void 0===t.color?"":` text-${t.color}`)),p=(0,e.computed)(()=>void 0!==t.selected),f=(0,e.computed)(()=>t.icon||r.iconSet.tree.icon),m=(0,e.computed)(()=>t.controlColor||t.color),_=(0,e.computed)(()=>void 0===t.textColor?"":` text-${t.textColor}`),g=(0,e.computed)(()=>{let e=t.selectedColor||t.color;return e?` text-${e}`:""}),v=(0,e.computed)(()=>void 0===t.filterMethod?(e,n)=>{let a=n.toLowerCase();return e[t.labelKey]&&-1!==e[t.labelKey].toLowerCase().indexOf(a)}:t.filterMethod),b=(0,e.computed)(()=>{let e={},n=(a,i)=>{let o=a.tickStrategy||(i?i.tickStrategy:t.tickStrategy),r=a[t.nodeKey],s=a[t.childrenKey]&&Array.isArray(a[t.childrenKey])&&0!==a[t.childrenKey].length,d=!0!==a.disabled&&!0===p.value&&!1!==a.selectable,h=!0!==a.disabled&&!1!==a.expandable,f="none"!==o,m="strict"===o,_="leaf-filtered"===o,g="leaf"===o||"leaf-filtered"===o,b=!0!==a.disabled&&!1!==a.tickable;!0===g&&!0===b&&i&&!0!==i.tickable&&(b=!1);let y=a.lazy;!0===y&&void 0!==l.value[r]&&!0===Array.isArray(a[t.childrenKey])&&(y=l.value[r]);let w={key:r,parent:i,isParent:s,lazy:y,disabled:a.disabled,link:!0!==a.disabled&&(!0===d||!0===h&&(!0===s||!0===y)),children:[],matchesFilter:!t.filter||v.value(a,t.filter),selected:r===t.selected&&!0===d,selectable:d,expanded:!0===s&&c.value.includes(r),expandable:h,noTick:!0===a.noTick||!0!==m&&y&&"loaded"!==y,tickable:b,tickStrategy:o,hasTicking:f,strictTicking:m,leafFilteredTicking:_,leafTicking:g,ticked:(!0===m||!0!==s)&&u.value.includes(r)};if(e[r]=w,!0===s&&(w.children=a[t.childrenKey].map(e=>n(e,w)),t.filter&&(!0===w.matchesFilter?!0!==w.noTick&&!0!==w.disabled&&!0===w.tickable&&!0===_&&!0===w.children.every(e=>!0!==e.matchesFilter||!0===e.noTick||!0!==e.tickable)&&(w.tickable=!1):w.matchesFilter=w.children.some(e=>e.matchesFilter)),!0===w.matchesFilter&&(!0!==w.noTick&&!0!==m&&!0===w.children.every(e=>e.noTick)&&(w.noTick=!0),g))){if(w.ticked=!1,w.indeterminate=w.children.some(e=>!0===e.indeterminate),w.tickable=!0===w.tickable&&w.children.some(e=>e.tickable),!0!==w.indeterminate){let e=w.children.reduce((e,t)=>!0===t.ticked?e+1:e,0);e===w.children.length?w.ticked=!0:e>0&&(w.indeterminate=!0)}!0===w.indeterminate&&(w.indeterminateNextState=w.children.every(e=>!0!==e.tickable||!0!==e.ticked))}return w};return t.nodes.forEach(e=>n(e,null)),e});function y(e){let n=[].reduce,a=(i,o)=>i||!o?i:!0===Array.isArray(o)?n.call(Object(o),a,i):o[t.nodeKey]===e?o:o[t.childrenKey]?a(null,o[t.childrenKey]):void 0;return a(null,t.nodes)}function w(){let e=[],n=a=>{a[t.childrenKey]&&0!==a[t.childrenKey].length&&!1!==a.expandable&&!0!==a.disabled&&(e.push(a[t.nodeKey]),a[t.childrenKey].forEach(n))};t.nodes.forEach(n),void 0===t.expanded?c.value=e:i("update:expanded",e)}function x(n,a,o=y(n),r=b.value[n]){if(r.lazy&&"loaded"!==r.lazy){if("loading"===r.lazy)return;l.value[n]="loading",!0!==Array.isArray(o[t.childrenKey])&&(o[t.childrenKey]=[]),i("lazyLoad",{node:o,key:n,done:a=>{l.value[n]="loaded",o[t.childrenKey]=!0===Array.isArray(a)?a:[],(0,e.nextTick)(()=>{!0===b.value[n]?.isParent&&S(n,!0)})},fail:()=>{delete l.value[n],0===o[t.childrenKey].length&&delete o[t.childrenKey]}})}else!0===r.isParent&&!0===r.expandable&&S(n,a)}function S(e,n){let a=c.value,o=void 0!==t.expanded;if(!0===o&&(a=a.slice()),n){if(t.accordion&&b.value[e]){let n=[];b.value[e].parent?b.value[e].parent.children.forEach(t=>{t.key!==e&&!0===t.expandable&&n.push(t.key)}):t.nodes.forEach(a=>{let i=a[t.nodeKey];i!==e&&n.push(i)}),0!==n.length&&(a=a.filter(e=>!1===n.includes(e)))}a=a.concat([e]).filter((e,t,n)=>n.indexOf(e)===t)}else a=a.filter(t=>t!==e);!0===o?i("update:expanded",a):c.value=a}function C(e,n){let a=u.value,o=void 0!==t.ticked;!0===o&&(a=a.slice()),a=n?a.concat(e).filter((e,t,n)=>n.indexOf(e)===t):a.filter(t=>!1===e.includes(t)),!0===o&&i("update:ticked",a)}function T(e,n,i){let r={tree:o,node:e,key:i,color:t.color,dark:s.value};return a(r,"expanded",()=>n.expanded,e=>{e!==n.expanded&&x(i,e)}),a(r,"ticked",()=>n.ticked,e=>{e!==n.ticked&&C([i],e)}),r}function P(e){return(t.filter?e.filter(e=>b.value[e[t.nodeKey]].matchesFilter):e).map(e=>M(e))}function E(t){if(void 0!==t.icon)return(0,e.h)(Ye,{class:"q-tree__icon q-mr-sm",name:t.icon,color:t.iconColor});let n=t.img||t.avatar;return n?(0,e.h)("img",{class:`q-tree__${t.img?"img":"avatar"} q-mr-sm`,src:n}):void 0}function A(){i("afterShow")}function L(){i("afterHide")}function M(a){let i=a[t.nodeKey],o=b.value[i],r=a.header&&n[`header-${a.header}`]||n["default-header"],l=!0===o.isParent?P(a[t.childrenKey]):[],u=0!==l.length||o.lazy&&"loaded"!==o.lazy,c=a.body&&n[`body-${a.body}`]||n["default-body"],h=void 0!==r||void 0!==c?T(a,o,i):null;return void 0!==c&&(c=(0,e.h)("div",{class:"q-tree__node-body relative-position"},[(0,e.h)("div",{class:_.value},[c(h)])])),(0,e.h)("div",{key:i,class:"q-tree__node relative-position q-tree__node--"+(!0===u?"parent":"child")},[(0,e.h)("div",{class:"q-tree__node-header relative-position row no-wrap items-center"+(!0===o.link?" q-tree__node--link q-hoverable q-focusable":"")+(!0===o.selected?" q-tree__node--selected":"")+(!0===o.disabled?" q-tree__node--disabled":""),tabindex:!0===o.link?0:-1,ariaExpanded:l.length>0?o.expanded:null,role:"treeitem",onClick:e=>{z(a,o,e)},onKeypress(e){!0!==I(e)&&(13===e.keyCode?z(a,o,e,!0):32===e.keyCode&&O(a,o,e,!0))}},[(0,e.h)("div",{class:"q-focus-helper",tabindex:-1,ref:e=>{d[o.key]=e}}),"loading"===o.lazy?(0,e.h)(St,{class:"q-tree__spinner",color:m.value}):!0===u?(0,e.h)(Ye,{class:"q-tree__arrow"+(!0===o.expanded?" q-tree__arrow--rotate":""),name:f.value,onClick(e){O(a,o,e)}}):null,!0===o.hasTicking&&!0!==o.noTick?(0,e.h)(oi,{class:"q-tree__tickbox",modelValue:!0===o.indeterminate?null:o.ticked,color:m.value,dark:s.value,dense:!0,keepColor:!0,disable:!0!==o.tickable,onKeydown:k,"onUpdate:modelValue":e=>{!function(e,t){if(!0===e.indeterminate&&(t=e.indeterminateNextState),e.strictTicking)C([e.key],t);else if(e.leafTicking){let n=[],a=e=>{e.isParent?(!0!==t&&!0!==e.noTick&&!0===e.tickable&&n.push(e.key),!0===e.leafTicking&&e.children.forEach(a)):!0!==e.noTick&&!0===e.tickable&&(!0!==e.leafFilteredTicking||!0===e.matchesFilter)&&n.push(e.key)};a(e),C(n,t)}}(o,e)}}):null,(0,e.h)("div",{class:"q-tree__node-header-content col row no-wrap items-center"+(!0===o.selected?g.value:_.value)},[r?r(h):[E(a),(0,e.h)("div",a[t.labelKey])]])]),!0===u?!0===t.noTransition?!0===o.expanded?(0,e.h)("div",{class:"q-tree__node-collapsible"+_.value,key:`${i}__q`},[c,(0,e.h)("div",{class:"q-tree__children"+(!0===o.disabled?" q-tree__node--disabled":""),role:"group"},l)]):null:(0,e.h)(qr,{duration:t.duration,onShow:A,onHide:L},()=>(0,e.withDirectives)((0,e.h)("div",{class:"q-tree__node-collapsible"+_.value,key:`${i}__q`},[c,(0,e.h)("div",{class:"q-tree__children"+(!0===o.disabled?" q-tree__node--disabled":""),role:"group"},l)]),[[e.vShow,o.expanded]])):c])}function R(e){d[e]?.focus()}function z(e,n,a,o){!0!==o&&!1!==n.selectable&&R(n.key),p.value&&n.selectable?!1===t.noSelectionUnset?i("update:selected",n.key===t.selected?null:n.key):n.key!==t.selected&&i("update:selected",void 0===n.key?null:n.key):O(e,n,a,o),"function"==typeof e.handler&&e.handler(e)}function O(e,t,n,a){void 0!==n&&k(n),!0!==a&&!1!==t.selectable&&R(t.key),x(t.key,!t.expanded,e,t)}return(0,e.watch)(()=>t.ticked,e=>{u.value=e}),(0,e.watch)(()=>t.expanded,e=>{c.value=e}),!0===t.defaultExpandAll&&w(),Object.assign(o,{getNodeByKey:y,getTickedNodes:function(){return u.value.map(e=>y(e))},getExpandedNodes:function(){return c.value.map(e=>y(e))},isExpanded:function(e){return!(!e||!b.value[e])&&b.value[e].expanded},collapseAll:function(){void 0===t.expanded?c.value=[]:i("update:expanded",[])},expandAll:w,setExpanded:x,isTicked:function(e){return!(!e||!b.value[e])&&b.value[e].ticked},setTicked:C}),()=>{let n=P(t.nodes);return(0,e.h)("div",{class:h.value,role:"tree"},0===n.length?t.filter?t.noResultsLabel||r.lang.tree.noResults:t.noNodesLabel||r.lang.tree.noNodes:n)}}});function gc(e){return(100*e).toFixed(2)+"%"}let vc={...Xe,...ps,label:String,color:String,textColor:String,square:Boolean,flat:Boolean,bordered:Boolean,noThumbnails:Boolean,thumbnailFit:{type:String,default:"cover"},autoUpload:Boolean,hideUploadBtn:Boolean,disable:Boolean,readonly:Boolean},bc=[...fs,"start","finish","added","removed"];function yc(t,n){let o=(0,e.getCurrentInstance)(),{props:r,slots:s,emit:l,proxy:u}=o,{$q:c}=u,d=et(r,c);let h=(0,e.computed)(()=>!0!==r.disable&&!0!==r.readonly),p=(0,e.ref)(!1),f=(0,e.ref)(null),m=(0,e.ref)(null),_={files:(0,e.ref)([]),queuedFiles:(0,e.ref)([]),uploadedFiles:(0,e.ref)([]),uploadedSize:(0,e.ref)(0),updateFileStatus:function(e,t,n){if(e.__status=t,"idle"===t)return e.__uploaded=0,e.__progress=0,e.__sizeLabel=me(e.size),void(e.__progressLabel="0.00%");"failed"!==t?(e.__uploaded="uploaded"===t?e.size:n,e.__progress="uploaded"===t?1:Math.min(.9999,e.__uploaded/e.size),e.__progressLabel=gc(e.__progress),u.$forceUpdate()):u.$forceUpdate()},isAlive:()=>!1===dt(o)},{pickFiles:g,addFiles:v,onDragover:b,onDragleave:w,processFiles:k,getDndNode:x,maxFilesNumber:S,maxTotalSizeNumber:C}=ms({editable:h,dnd:p,getFileInput:B,addFilesToQueue:F});Object.assign(_,t({props:r,slots:s,emit:l,helpers:_,exposeApi:e=>{Object.assign(_,e)}})),void 0===_.isBusy&&(_.isBusy=(0,e.ref)(!1));let T=(0,e.ref)(0),P=(0,e.computed)(()=>0===T.value?0:_.uploadedSize.value/T.value),E=(0,e.computed)(()=>gc(P.value)),A=(0,e.computed)(()=>me(T.value)),L=(0,e.computed)(()=>!0===h.value&&!0!==_.isUploading.value&&(!0===r.multiple||0===_.queuedFiles.value.length)&&(void 0===r.maxFiles||_.files.value.length!0===h.value&&!0!==_.isBusy.value&&!0!==_.isUploading.value&&0!==_.queuedFiles.value.length);(0,e.provide)(ee,U);let R=(0,e.computed)(()=>"q-uploader column no-wrap"+(!0===d.value?" q-uploader--dark q-dark":"")+(!0===r.bordered?" q-uploader--bordered":"")+(!0===r.square?" q-uploader--square no-border-radius":"")+(!0===r.flat?" q-uploader--flat no-shadow":"")+(!0===r.disable?" disabled q-uploader--disable":"")+(!0===p.value?" q-uploader--dnd":"")),z=(0,e.computed)(()=>"q-uploader__header"+(void 0===r.color?"":` bg-${r.color}`)+(void 0===r.textColor?"":` text-${r.textColor}`));function O(){!1===r.disable&&(_.abort(),_.uploadedSize.value=0,T.value=0,j(),_.files.value=[],_.queuedFiles.value=[],_.uploadedFiles.value=[])}function I(){!1===r.disable&&D(["uploaded"],()=>{_.uploadedFiles.value=[]})}function N(){D(["idle","failed"],({size:e})=>{T.value-=e,_.queuedFiles.value=[]})}function D(e,t){if(!0===r.disable)return;let n={files:[],size:0},a=_.files.value.filter(t=>-1===e.indexOf(t.__status)||(n.size+=t.size,n.files.push(t),void 0!==t.__img&&window.URL.revokeObjectURL(t.__img.src),!1));0!==n.files.length&&(_.files.value=a,t(n),l("removed",n.files))}function q(e){r.disable||("uploaded"===e.__status?_.uploadedFiles.value=_.uploadedFiles.value.filter(t=>t.__key!==e.__key):"uploading"===e.__status?e.__abort():T.value-=e.size,_.files.value=_.files.value.filter(t=>t.__key!==e.__key||(void 0!==t.__img&&window.URL.revokeObjectURL(t.__img.src),!1)),_.queuedFiles.value=_.queuedFiles.value.filter(t=>t.__key!==e.__key),l("removed",[e]))}function j(){_.files.value.forEach(e=>{void 0!==e.__img&&window.URL.revokeObjectURL(e.__img.src)})}function B(){return m.value||f.value.getElementsByClassName("q-uploader__input")[0]}function F(e,t){let n=k(e,t,_.files.value,!0),a=B();null!=a&&(a.value=""),void 0!==n&&(n.forEach(e=>{if(_.updateFileStatus(e,"idle"),T.value+=e.size,!0!==r.noThumbnails&&e.type.toUpperCase().startsWith("IMAGE")){let t=new Image;t.src=window.URL.createObjectURL(e),e.__img=t}}),_.files.value=_.files.value.concat(n),_.queuedFiles.value=_.queuedFiles.value.concat(n),l("added",n),!0===r.autoUpload&&_.upload())}function $(){!0===M.value&&_.upload()}function V(t,n,a){if(!0===t){let t,i={type:"a",key:n,icon:c.iconSet.uploader[n],flat:!0,dense:!0};return"add"===n?(i.onClick=g,t=U):i.onClick=a,(0,e.h)(Kt,i,t)}}function U(){return(0,e.h)("input",{ref:m,class:"q-uploader__input overflow-hidden absolute-full",tabindex:-1,type:"file",title:"",accept:r.accept,multiple:!0===r.multiple?"multiple":void 0,capture:r.capture,onMousedown:y,onClick:g,onChange:F})}(0,e.watch)(_.isUploading,(e,t)=>{!1===t&&!0===e?l("start"):!0===t&&!1===e&&l("finish")}),(0,e.onBeforeUnmount)(()=>{!0===_.isUploading.value&&_.abort(),0!==_.files.value.length&&j()});let H={};for(let t in _)!0===(0,e.isRef)(_[t])?a(H,t,()=>_[t].value):H[t]=_[t];return Object.assign(H,{upload:$,reset:O,removeUploadedFiles:I,removeQueuedFiles:N,removeFile:q,pickFiles:g,addFiles:v}),i(H,{canAddFiles:()=>L.value,canUpload:()=>M.value,uploadSizeLabel:()=>A.value,uploadProgressLabel:()=>E.value}),n({..._,upload:$,reset:O,removeUploadedFiles:I,removeQueuedFiles:N,removeFile:q,pickFiles:g,addFiles:v,canAddFiles:L,canUpload:M,uploadSizeLabel:A,uploadProgressLabel:E}),()=>{let t=[(0,e.h)("div",{class:z.value},void 0===s.header?[(0,e.h)("div",{class:"q-uploader__header-content column"},[(0,e.h)("div",{class:"flex flex-center no-wrap q-gutter-xs"},[V(0!==_.queuedFiles.value.length,"removeQueue",N),V(0!==_.uploadedFiles.value.length,"removeUploaded",I),!0===_.isUploading.value?(0,e.h)(St,{class:"q-uploader__spinner"}):null,(0,e.h)("div",{class:"col column justify-center"},[void 0===r.label?null:(0,e.h)("div",{class:"q-uploader__title"},[r.label]),(0,e.h)("div",{class:"q-uploader__subtitle"},[A.value+" / "+E.value])]),V(L.value,"add"),V(!1===r.hideUploadBtn&&!0===M.value,"upload",_.upload),V(_.isUploading.value,"clear",_.abort)])])]:s.header(H)),(0,e.h)("div",{class:"q-uploader__list scroll"},void 0===s.list?_.files.value.map(t=>(0,e.h)("div",{key:t.__key,class:"q-uploader__file relative-position"+(!0!==r.noThumbnails&&void 0!==t.__img?" q-uploader__file--img":"")+("failed"===t.__status?" q-uploader__file--failed":"uploaded"===t.__status?" q-uploader__file--uploaded":""),style:!0!==r.noThumbnails&&void 0!==t.__img?{backgroundImage:'url("'+t.__img.src+'")',backgroundSize:r.thumbnailFit}:null},[(0,e.h)("div",{class:"q-uploader__file-header row flex-center no-wrap"},["failed"===t.__status?(0,e.h)(Ye,{class:"q-uploader__file-status",name:c.iconSet.type.negative,color:"negative"}):null,(0,e.h)("div",{class:"q-uploader__file-header-content col"},[(0,e.h)("div",{class:"q-uploader__title"},[t.name]),(0,e.h)("div",{class:"q-uploader__subtitle row items-center no-wrap"},[t.__sizeLabel+" / "+t.__progressLabel])]),"uploading"===t.__status?(0,e.h)(di,{value:t.__progress,min:0,max:1,indeterminate:0===t.__progress}):(0,e.h)(Kt,{round:!0,dense:!0,flat:!0,icon:c.iconSet.uploader["uploaded"===t.__status?"done":"clear"],onClick:()=>{q(t)}})])])):s.list(H)),x("uploader")];!0===_.isBusy.value&&t.push((0,e.h)("div",{class:"q-uploader__overlay absolute-full flex flex-center"},[(0,e.h)(St)]));let n={ref:f,class:R.value};return!0===L.value&&Object.assign(n,{onDragover:b,onDragleave:w}),(0,e.h)("div",n,t)}}let wc=()=>!0;function kc(e){let t={};return e.forEach(e=>{t[e]=wc}),t}let xc=kc(bc);var Sc=({name:e,props:t,emits:n,injectPlugin:a})=>h({name:e,props:{...vc,...t},emits:!0===oe(n)?{...xc,...n}:[...bc,...n],setup:(e,{expose:t})=>yc(a,t)});function Cc(e){return"function"==typeof e?e:()=>e}let Tc={url:[Function,String],method:{type:[Function,String],default:"POST"},fieldName:{type:[Function,String],default:()=>e=>e.name},headers:[Function,Array],formFields:[Function,Array],withCredentials:[Function,Boolean],sendRaw:[Function,Boolean],batch:[Function,Boolean],factory:Function};var Pc=Sc({name:"QUploader",props:Tc,emits:["factoryFailed","uploaded","failed","uploading"],injectPlugin:function({props:t,emit:n,helpers:a}){let i,o=(0,e.ref)([]),r=(0,e.ref)([]),s=(0,e.ref)(0),l=(0,e.computed)(()=>({url:Cc(t.url),method:Cc(t.method),headers:Cc(t.headers),formFields:Cc(t.formFields),fieldName:Cc(t.fieldName),withCredentials:Cc(t.withCredentials),sendRaw:Cc(t.sendRaw),batch:Cc(t.batch)}));function u(e){if(s.value++,"function"!=typeof t.factory)return void c(e,{});let o=t.factory(e);if(o)if("function"==typeof o.catch&&"function"==typeof o.then){r.value.push(o);let t=t=>{!0===a.isAlive()&&(r.value=r.value.filter(e=>e!==o),0===r.value.length&&(i=!1),a.queuedFiles.value=a.queuedFiles.value.concat(e),e.forEach(e=>{a.updateFileStatus(e,"failed")}),n("factoryFailed",t,e),s.value--)};o.then(n=>{!0===i?t(Error("Aborted")):!0===a.isAlive()&&(r.value=r.value.filter(e=>e!==o),c(e,n))}).catch(t)}else c(e,o||{});else n("factoryFailed",Error("QUploader: factory() does not return properly"),e),s.value--}function c(e,t){let i=new FormData,r=new XMLHttpRequest,u=(e,n)=>void 0===t[e]?l.value[e](n):Cc(t[e])(n),c=u("url",e);if(!c)return console.error("q-uploader: invalid or no URL specified"),void s.value--;let d=u("formFields",e);void 0!==d&&d.forEach(e=>{i.append(e.name,e.value)});let h,p=0,f=0,m=0,_=0;r.upload.addEventListener("progress",t=>{if(!0===h)return;let n=Math.min(_,t.loaded);a.uploadedSize.value+=n-m,m=n;let i=m-f;for(let t=p;i>0&&tn.size))return void a.updateFileStatus(n,"uploading",i);i-=n.size,p++,f+=n.size,a.updateFileStatus(n,"uploading",n.size)}},!1),r.onreadystatechange=()=>{r.readyState<4||(r.status&&r.status<400?(a.uploadedFiles.value=a.uploadedFiles.value.concat(e),e.forEach(e=>{a.updateFileStatus(e,"uploaded")}),n("uploaded",{files:e,xhr:r})):(h=!0,a.uploadedSize.value-=m,a.queuedFiles.value=a.queuedFiles.value.concat(e),e.forEach(e=>{a.updateFileStatus(e,"failed")}),n("failed",{files:e,xhr:r})),s.value--,o.value=o.value.filter(e=>e!==r))},r.open(u("method",e),c),!0===u("withCredentials",e)&&(r.withCredentials=!0);let g=u("headers",e);void 0!==g&&g.forEach(e=>{r.setRequestHeader(e.name,e.value)});let v=u("sendRaw",e);e.forEach(e=>{a.updateFileStatus(e,"uploading",0),!0!==v&&i.append(u("fieldName",e),e,e.name),e.xhr=r,e.__abort=()=>{r.abort()},_+=e.size}),n("uploading",{files:e,xhr:r}),o.value.push(r),!0===v?r.send(new Blob(e)):r.send(i)}return{isUploading:(0,e.computed)(()=>s.value>0),isBusy:(0,e.computed)(()=>0!==r.value.length),abort:function(){o.value.forEach(e=>{e.abort()}),0!==r.value.length&&(i=!0)},upload:function(){let e=a.queuedFiles.value.slice(0);a.queuedFiles.value=[],l.value.batch(e)?u(e):e.forEach(e=>{u([e])})}}}}),Ec=h({name:"QUploaderAddTrigger",setup(){let t=(0,e.inject)(ee,te);return t===te&&console.error("QUploaderAddTrigger needs to be child of QUploader"),t}}),Ac=h({name:"QVideo",props:{...ks,src:{type:String,required:!0},title:String,fetchpriority:{type:String,default:"auto"},loading:{type:String,default:"eager"},referrerpolicy:{type:String,default:"strict-origin-when-cross-origin"}},setup(t){let n=xs(t),a=(0,e.computed)(()=>"q-video"+(void 0===t.ratio?"":" q-video--responsive"));return()=>(0,e.h)("div",{class:a.value,style:n.value},[(0,e.h)("iframe",{src:t.src,title:t.title,fetchpriority:t.fetchpriority,loading:t.loading,referrerpolicy:t.referrerpolicy,frameborder:"0",allowfullscreen:!0})])}}),Lc=n({QAjaxBar:()=>Te,QAvatar:()=>Qe,QBadge:()=>Je,QBanner:()=>tt,QBar:()=>nt,QBreadcrumbs:()=>pt,QBreadcrumbsEl:()=>wt,QBtn:()=>Kt,QBtnDropdown:()=>ka,QBtnGroup:()=>Yt,QBtnToggle:()=>Pa,QCard:()=>Ea,QCardActions:()=>La,QCardSection:()=>Aa,QCarousel:()=>Qa,QCarouselControl:()=>Ja,QCarouselSlide:()=>Za,QChatMessage:()=>Xa,QCheckbox:()=>oi,QChip:()=>si,QCircularProgress:()=>di,QColor:()=>no,QDate:()=>Go,QDialog:()=>pr,QDrawer:()=>fr,QEditor:()=>Nr,QExpansionItem:()=>Ur,QFab:()=>Qr,QFabAction:()=>Xr,QField:()=>cs,QFile:()=>gs,QFooter:()=>vs,QForm:()=>bs,QFormChildMixin:()=>ys,QHeader:()=>ws,QIcon:()=>Ye,QImg:()=>Ss,QInfiniteScroll:()=>Ts,QInnerLoading:()=>Ps,QInput:()=>$s,QIntersection:()=>Gs,QItem:()=>wr,QItemLabel:()=>Dr,QItemSection:()=>kr,QKnob:()=>Js,QLayout:()=>nl,QLinearProgress:()=>El,QList:()=>Ys,QMarkupTable:()=>il,QMenu:()=>pa,QNoSsr:()=>ol,QOptionGroup:()=>dl,QPage:()=>hl,QPageContainer:()=>pl,QPageScroller:()=>_l,QPageSticky:()=>gl,QPagination:()=>bl,QParallax:()=>kl,QPopupEdit:()=>Sl,QPopupProxy:()=>Cl,QPullToRefresh:()=>Al,QRadio:()=>rl,QRange:()=>zl,QRating:()=>Ol,QResizeObserver:()=>Ti,QResponsive:()=>Il,QRouteTab:()=>lc,QScrollArea:()=>Fl,QScrollObserver:()=>tl,QSelect:()=>au,QSeparator:()=>Fr,QSkeleton:()=>ru,QSlideItem:()=>lu,QSlideTransition:()=>qr,QSlider:()=>ki,QSpace:()=>uu,QSpinner:()=>St,QSpinnerAudio:()=>cu,QSpinnerBall:()=>du,QSpinnerBars:()=>hu,QSpinnerBox:()=>pu,QSpinnerClock:()=>fu,QSpinnerComment:()=>mu,QSpinnerCube:()=>_u,QSpinnerDots:()=>gu,QSpinnerFacebook:()=>vu,QSpinnerGears:()=>bu,QSpinnerGrid:()=>yu,QSpinnerHearts:()=>wu,QSpinnerHourglass:()=>ku,QSpinnerInfinity:()=>xu,QSpinnerIos:()=>Su,QSpinnerOrbit:()=>Cu,QSpinnerOval:()=>Tu,QSpinnerPie:()=>Pu,QSpinnerPuff:()=>Eu,QSpinnerRadio:()=>Au,QSpinnerRings:()=>Lu,QSpinnerTail:()=>Mu,QSplitter:()=>Ru,QStep:()=>Nu,QStepper:()=>qu,QStepperNavigation:()=>ju,QTab:()=>Ii,QTabPanel:()=>Di,QTabPanels:()=>Ni,QTable:()=>oc,QTabs:()=>Li,QTd:()=>sc,QTh:()=>Bu,QTime:()=>cc,QTimeline:()=>dc,QTimelineEntry:()=>hc,QToggle:()=>sl,QToolbar:()=>pc,QToolbarTitle:()=>fc,QTooltip:()=>yr,QTr:()=>rc,QTree:()=>_c,QUploader:()=>Pc,QUploaderAddTrigger:()=>Ec,QVideo:()=>Ac,QVirtualScroll:()=>Uu});function Mc(e){if(!1===e)return 0;if(!0===e||void 0===e)return 1;let t=parseInt(e,10);return isNaN(t)?0:t}var Rc=p({name:"close-popup",beforeMount(e,{value:t}){let n={depth:Mc(t),handler(t){0!==n.depth&&setTimeout(()=>{let a=function(e){return _n.find(t=>null!==t.contentEl&&t.contentEl.contains(e))}(e);void 0!==a&&function(e,t,n){for(;0!==n&&null!=e;){if(!0===e.__qPortal){if(n--,"QMenu"===e.$options.name){e=gn(e,t);continue}e.hide(t)}e=st(e)}}(a,t,n.depth)})},handlerKey(e){!0===N(e,13)&&n.handler(e)}};e.__qclosepopup=n,e.addEventListener("click",n.handler),e.addEventListener("keyup",n.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=Mc(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener("click",t.handler),e.removeEventListener("keyup",t.handlerKey),delete e.__qclosepopup}});let zc,Oc=0;function Ic(e,t){void 0===zc&&(zc=document.createElement("div"),zc.style.cssText="position: absolute; left: 0; top: 0",document.body.appendChild(zc));let n=e.getBoundingClientRect(),a=zc.getBoundingClientRect(),{marginLeft:i,marginRight:o,marginTop:r,marginBottom:s}=window.getComputedStyle(e),l=parseInt(i,10)+parseInt(o,10),u=parseInt(r,10)+parseInt(s,10);return{left:n.left-a.left,top:n.top-a.top,width:n.right-n.left,height:n.bottom-n.top,widthM:n.right-n.left+(!0===t?0:l),heightM:n.bottom-n.top+(!0===t?0:u),marginH:!0===t?l:0,marginV:!0===t?u:0}}function Nc(e){return{width:e.scrollWidth,height:e.scrollHeight}}let Dc=["Top","Right","Bottom","Left"],qc=["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],jc=/-block|-inline|block-|inline-/,Bc=/(-block|-inline|block-|inline-).*:/;function Fc(e,t){let n=window.getComputedStyle(e),a={};for(let e=0;e!0!==Bc.test(e)).join(";"):n[i]}return a}let $c=["absolute","fixed","relative","sticky"];function Vc(e){let t=e,n=0;for(;null!==t&&t!==document;){let{position:a,zIndex:i}=window.getComputedStyle(t),o=Number(i);o>n&&(t===e||!0===$c.includes(a))&&(n=o),t=t.parentNode}return n}function Uc(e){let t=typeof e;return"function"===t?e():"string"===t?document.querySelector(e):e}function Hc(e){return e&&e.ownerDocument===document&&null!==e.parentNode}function Wc(e){let t=()=>!1,n=!1,a=!0,i=function(e){return{from:e.from,to:void 0===e.to?e.from:e.to}}(e),o=function(e){return"number"==typeof e?e={duration:e}:"function"==typeof e&&(e={onEnd:e}),{...e,waitFor:void 0===e.waitFor?0:e.waitFor,duration:!0===isNaN(e.duration)?300:parseInt(e.duration,10),easing:"string"==typeof e.easing&&0!==e.easing.length?e.easing:"ease-in-out",delay:!0===isNaN(e.delay)?0:parseInt(e.delay,10),fill:"string"==typeof e.fill&&0!==e.fill.length?e.fill:"none",resize:!0===e.resize,useCSS:!0===e.useCSS||!0===e.usecss,hideFromClone:!0===e.hideFromClone||!0===e.hidefromclone,keepToClone:!0===e.keepToClone||!0===e.keeptoclone,tween:!0===e.tween,tweenFromOpacity:!0===isNaN(e.tweenFromOpacity)?.6:parseFloat(e.tweenFromOpacity),tweenToOpacity:!0===isNaN(e.tweenToOpacity)?.5:parseFloat(e.tweenToOpacity)}}(e),r=Uc(i.from);if(!0!==Hc(r))return t;"function"==typeof r.qMorphCancel&&r.qMorphCancel();let s,l,u,c,d=r.parentNode,h=r.nextElementSibling,p=Ic(r,o.resize),{width:f,height:m}=Nc(d),{borderWidth:_,borderStyle:g,borderColor:v,borderRadius:b,backgroundColor:y,transform:w,position:k,cssText:x}=Fc(r,["borderWidth","borderStyle","borderColor","borderRadius","backgroundColor","transform","position","cssText"]),S=r.classList.toString(),C=r.style.cssText,T=r.cloneNode(!0),P=!0===o.tween?r.cloneNode(!0):void 0;return void 0!==P&&(P.className=P.classList.toString().split(" ").filter(e=>!1===/^bg-/.test(e)).join(" ")),!0===o.hideFromClone&&T.classList.add("q-morph--internal"),T.setAttribute("aria-hidden","true"),T.style.transition="none",T.style.animation="none",T.style.pointerEvents="none",d.insertBefore(T,h),r.qMorphCancel=()=>{n=!0,T.remove(),P?.remove(),!0===o.hideFromClone&&T.classList.remove("q-morph--internal"),r.qMorphCancel=void 0},"function"==typeof e.onToggle&&e.onToggle(),requestAnimationFrame(()=>{let e=Uc(i.to);if(!0===n||!0!==Hc(e))return void("function"==typeof r.qMorphCancel&&r.qMorphCancel());r!==e&&"function"==typeof e.qMorphCancel&&e.qMorphCancel(),!0!==o.keepToClone&&e.classList.add("q-morph--internal"),T.classList.add("q-morph--internal");let{width:h,height:E}=Nc(d),{width:A,height:L}=Nc(e.parentNode);!0!==o.hideFromClone&&T.classList.remove("q-morph--internal"),e.qMorphCancel=()=>{n=!0,T.remove(),P?.remove(),!0===o.hideFromClone&&T.classList.remove("q-morph--internal"),!0!==o.keepToClone&&e.classList.remove("q-morph--internal"),r.qMorphCancel=void 0,e.qMorphCancel=void 0};let M=()=>{if(!0===n)return void("function"==typeof e.qMorphCancel&&e.qMorphCancel());!0!==o.hideFromClone&&(T.classList.add("q-morph--internal"),T.innerHTML="",T.style.left=0,T.style.right="unset",T.style.top=0,T.style.bottom="unset",T.style.transform="none"),!0!==o.keepToClone&&e.classList.remove("q-morph--internal");let i=e.parentNode,{width:M,height:R}=Nc(i),z=e.cloneNode(o.keepToClone);z.setAttribute("aria-hidden","true"),!0!==o.keepToClone&&(z.style.left=0,z.style.right="unset",z.style.top=0,z.style.bottom="unset",z.style.transform="none",z.style.pointerEvents="none"),z.classList.add("q-morph--internal");let O=e===r&&d===i?T:e.nextElementSibling;i.insertBefore(z,O);let{borderWidth:I,borderStyle:N,borderColor:D,borderRadius:q,backgroundColor:j,transform:B,position:F,cssText:$}=Fc(e,["borderWidth","borderStyle","borderColor","borderRadius","backgroundColor","transform","position","cssText"]),V=e.classList.toString(),U=e.style.cssText;e.style.cssText=$,e.style.transform="none",e.style.animation="none",e.style.transition="none",e.className=V.split(" ").filter(e=>!1===/^bg-/.test(e)).join(" ");let H=Ic(e,o.resize),W=p.left-H.left,G=p.top-H.top,K=p.width/(H.width>0?H.width:10),Y=p.height/(H.height>0?H.height:100),Q=f-h,Z=m-E,J=M-A,X=R-L,ee=Math.max(p.widthM,Q),te=Math.max(p.heightM,Z),ne=Math.max(H.widthM,J),ae=Math.max(H.heightM,X),ie=r===e&&!1===["absolute","fixed"].includes(F)&&!1===["absolute","fixed"].includes(k),re="fixed"===F,se=i;for(;!0!==re&&se!==document;)re="fixed"===window.getComputedStyle(se).position,se=se.parentNode;if(!0!==o.hideFromClone&&(T.style.display="block",T.style.flex="0 0 auto",T.style.opacity=0,T.style.minWidth="unset",T.style.maxWidth="unset",T.style.minHeight="unset",T.style.maxHeight="unset",T.classList.remove("q-morph--internal")),!0!==o.keepToClone&&(z.style.display="block",z.style.flex="0 0 auto",z.style.opacity=0,z.style.minWidth="unset",z.style.maxWidth="unset",z.style.minHeight="unset",z.style.maxHeight="unset"),z.classList.remove("q-morph--internal"),"string"==typeof o.classes&&(e.className+=" "+o.classes),"string"==typeof o.style)e.style.cssText+=" "+o.style;else if(!0===oe(o.style))for(let t in o.style)e.style[t]=o.style[t];let le=Vc(T),ue=Vc(e),ce=!0===re?document.documentElement:{scrollLeft:0,scrollTop:0};e.style.position=!0===re?"fixed":"absolute",e.style.left=H.left-ce.scrollLeft+"px",e.style.right="unset",e.style.top=H.top-ce.scrollTop+"px",e.style.margin=0,!0===o.resize&&(e.style.minWidth="unset",e.style.maxWidth="unset",e.style.minHeight="unset",e.style.maxHeight="unset",e.style.overflow="hidden",e.style.overflowX="hidden",e.style.overflowY="hidden"),document.body.appendChild(e),void 0!==P&&(P.style.cssText=x,P.style.transform="none",P.style.animation="none",P.style.transition="none",P.style.position=e.style.position,P.style.left=p.left-ce.scrollLeft+"px",P.style.right="unset",P.style.top=p.top-ce.scrollTop+"px",P.style.margin=0,P.style.pointerEvents="none",!0===o.resize&&(P.style.minWidth="unset",P.style.maxWidth="unset",P.style.minHeight="unset",P.style.maxHeight="unset",P.style.overflow="hidden",P.style.overflowX="hidden",P.style.overflowY="hidden"),document.body.appendChild(P));let de=n=>{r===e&&!0!==a?(e.style.cssText=C,e.className=S):(e.style.cssText=U,e.className=V),z.parentNode===i&&i.insertBefore(e,z),T.remove(),z.remove(),P?.remove(),t=()=>!1,r.qMorphCancel=void 0,e.qMorphCancel=void 0,"function"==typeof o.onEnd&&o.onEnd(!0===a?"to":"from",!0===n)};if(!0!==o.useCSS&&"function"==typeof e.animate){let i=!0===o.resize?{transform:`translate(${W}px, ${G}px)`,width:`${ee}px`,height:`${te}px`}:{transform:`translate(${W}px, ${G}px) scale(${K}, ${Y})`},d=!0===o.resize?{width:`${ne}px`,height:`${ae}px`}:{},h=!0===o.resize?{width:`${ee}px`,height:`${te}px`}:{},f=!0===o.resize?{transform:`translate(${-1*W}px, ${-1*G}px)`,width:`${ne}px`,height:`${ae}px`}:{transform:`translate(${-1*W}px, ${-1*G}px) scale(${1/K}, ${1/Y})`},m=void 0===P?{backgroundColor:y}:{opacity:o.tweenToOpacity},k=void 0===P?{backgroundColor:j}:{opacity:1};c=e.animate([{margin:0,borderWidth:_,borderStyle:g,borderColor:v,borderRadius:b,zIndex:le,transformOrigin:"0 0",...i,...m},{margin:0,borderWidth:I,borderStyle:N,borderColor:D,borderRadius:q,zIndex:ue,transformOrigin:"0 0",transform:B,...d,...k}],{duration:o.duration,easing:o.easing,fill:o.fill,delay:o.delay}),l=void 0===P?void 0:P.animate([{opacity:o.tweenFromOpacity,margin:0,borderWidth:_,borderStyle:g,borderColor:v,borderRadius:b,zIndex:le,transformOrigin:"0 0",transform:w,...h},{opacity:0,margin:0,borderWidth:I,borderStyle:N,borderColor:D,borderRadius:q,zIndex:ue,transformOrigin:"0 0",...f}],{duration:o.duration,easing:o.easing,fill:o.fill,delay:o.delay}),s=!0===o.hideFromClone||!0===ie?void 0:T.animate([{margin:`${Z<0?Z/2:0}px ${Q<0?Q/2:0}px`,width:`${ee+p.marginH}px`,height:`${te+p.marginV}px`},{margin:0,width:0,height:0}],{duration:o.duration,easing:o.easing,fill:o.fill,delay:o.delay}),u=!0===o.keepToClone?void 0:z.animate([!0===ie?{margin:`${Z<0?Z/2:0}px ${Q<0?Q/2:0}px`,width:`${ee+p.marginH}px`,height:`${te+p.marginV}px`}:{margin:0,width:0,height:0},{margin:`${X<0?X/2:0}px ${J<0?J/2:0}px`,width:`${ne+H.marginH}px`,height:`${ae+H.marginV}px`}],{duration:o.duration,easing:o.easing,fill:o.fill,delay:o.delay});let x=e=>{s?.cancel(),l?.cancel(),u?.cancel(),c.cancel(),c.removeEventListener("finish",x),c.removeEventListener("cancel",x),de(e),s=void 0,l=void 0,u=void 0,c=void 0};r.qMorphCancel=()=>{r.qMorphCancel=void 0,n=!0,x()},e.qMorphCancel=()=>{e.qMorphCancel=void 0,n=!0,x()},c.addEventListener("finish",x),c.addEventListener("cancel",x),t=e=>!0!==n&&void 0!==c&&(!0===e?(x(!0),!0):(a=!0!==a,s?.reverse(),l?.reverse(),u?.reverse(),c.reverse(),!0))}else{let i="q-morph-anim-"+ ++Oc,s=document.createElement("style"),l=!0===o.resize?`\n transform: translate(${W}px, ${G}px);\n width: ${ee}px;\n height: ${te}px;\n `:`transform: translate(${W}px, ${G}px) scale(${K}, ${Y});`,u=!0===o.resize?`\n width: ${ne}px;\n height: ${ae}px;\n `:"",c=!0===o.resize?`\n width: ${ee}px;\n height: ${te}px;\n `:"",d=!0===o.resize?`\n transform: translate(${-1*W}px, ${-1*G}px);\n width: ${ne}px;\n height: ${ae}px;\n `:`transform: translate(${-1*W}px, ${-1*G}px) scale(${1/K}, ${1/Y});`,h=void 0===P?`background-color: ${y};`:`opacity: ${o.tweenToOpacity};`,f=void 0===P?`background-color: ${j};`:"opacity: 1;",m=void 0===P?"":`\n @keyframes ${i}-from-tween {\n 0% {\n opacity: ${o.tweenFromOpacity};\n margin: 0;\n border-width: ${_};\n border-style: ${g};\n border-color: ${v};\n border-radius: ${b};\n z-index: ${le};\n transform-origin: 0 0;\n transform: ${w};\n ${c}\n }\n\n 100% {\n opacity: 0;\n margin: 0;\n border-width: ${I};\n border-style: ${N};\n border-color: ${D};\n border-radius: ${q};\n z-index: ${ue};\n transform-origin: 0 0;\n ${d}\n }\n }\n `,k=!0===o.hideFromClone||!0===ie?"":`\n @keyframes ${i}-from {\n 0% {\n margin: ${Z<0?Z/2:0}px ${Q<0?Q/2:0}px;\n width: ${ee+p.marginH}px;\n height: ${te+p.marginV}px;\n }\n\n 100% {\n margin: 0;\n width: 0;\n height: 0;\n }\n }\n `,x=!0===ie?`\n margin: ${Z<0?Z/2:0}px ${Q<0?Q/2:0}px;\n width: ${ee+p.marginH}px;\n height: ${te+p.marginV}px;\n `:"\n margin: 0;\n width: 0;\n height: 0;\n ";s.innerHTML=`\n @keyframes ${i} {\n 0% {\n margin: 0;\n border-width: ${_};\n border-style: ${g};\n border-color: ${v};\n border-radius: ${b};\n background-color: ${y};\n z-index: ${le};\n transform-origin: 0 0;\n ${l}\n ${h}\n }\n\n 100% {\n margin: 0;\n border-width: ${I};\n border-style: ${N};\n border-color: ${D};\n border-radius: ${q};\n background-color: ${j};\n z-index: ${ue};\n transform-origin: 0 0;\n transform: ${B};\n ${u}\n ${f}\n }\n }\n\n ${k}\n\n ${m}\n\n ${!0===o.keepToClone?"":`\n @keyframes ${i}-to {\n 0% {\n ${x}\n }\n\n 100% {\n margin: ${X<0?X/2:0}px ${J<0?J/2:0}px;\n width: ${ne+H.marginH}px;\n height: ${ae+H.marginV}px;\n }\n }\n `}\n `,document.head.appendChild(s);let S="normal";T.style.animation=`${o.duration}ms ${o.easing} ${o.delay}ms ${S} ${o.fill} ${i}-from`,void 0!==P&&(P.style.animation=`${o.duration}ms ${o.easing} ${o.delay}ms ${S} ${o.fill} ${i}-from-tween`),z.style.animation=`${o.duration}ms ${o.easing} ${o.delay}ms ${S} ${o.fill} ${i}-to`,e.style.animation=`${o.duration}ms ${o.easing} ${o.delay}ms ${S} ${o.fill} ${i}`;let C=t=>{t===Object(t)&&t.animationName!==i||(e.removeEventListener("animationend",C),e.removeEventListener("animationcancel",C),de(),s.remove())};r.qMorphCancel=()=>{r.qMorphCancel=void 0,n=!0,C()},e.qMorphCancel=()=>{e.qMorphCancel=void 0,n=!0,C()},e.addEventListener("animationend",C),e.addEventListener("animationcancel",C),t=t=>!!(!0!==n&&e&&T&&z)&&(!0===t?(C(),!0):(a=!0!==a,S="normal"===S?"reverse":"normal",T.style.animationDirection=S,P.style.animationDirection=S,z.style.animationDirection=S,e.style.animationDirection=S,!0))}};o.waitFor>0||"transitionend"===o.waitFor||o.waitFor===Object(o.waitFor)&&"function"==typeof o.waitFor.then?(o.waitFor>0?new Promise(e=>setTimeout(e,o.waitFor)):"transitionend"===o.waitFor?new Promise(t=>{let n=()=>{null!==a&&(clearTimeout(a),a=null),e&&(e.removeEventListener("transitionend",n),e.removeEventListener("transitioncancel",n)),t()},a=setTimeout(n,400);e.addEventListener("transitionend",n),e.addEventListener("transitioncancel",n)}):o.waitFor).then(M).catch(()=>{"function"==typeof e.qMorphCancel&&e.qMorphCancel()}):M()}),e=>t(e)}let Gc={},Kc=["duration","delay","easing","fill","classes","style","duration","resize","useCSS","hideFromClone","keepToClone","tween","tweenFromOpacity","tweenToOpacity","waitFor","onEnd"],Yc=["resize","useCSS","hideFromClone","keepToClone","tween"];function Qc(e,t){e.clsAction!==t&&(e.clsAction=t,e.el.classList[t]("q-morph--invisible"))}function Zc(e){if(!0===e.animating||e.queue.length<2)return;let[t,n]=e.queue;e.animating=!0,t.animating=!0,n.animating=!0,Qc(t,"remove"),Qc(n,"remove");let a=Wc({from:t.el,to:n.el,onToggle(){Qc(t,"add"),Qc(n,"remove")},...n.opts,onEnd(a,i){n.opts.onEnd?.(a,i),!0!==i&&(t.animating=!1,n.animating=!1,e.animating=!1,e.cancel=void 0,e.queue.shift(),Zc(e))}});e.cancel=()=>{a(!0),e.cancel=void 0}}function Jc(e,t){let n=t.opts;Yc.forEach(t=>{n[t]=!0===e[t]})}function Xc(e,t){if(t.name===e){let n=Gc[t.group];return void(void 0===n?(Gc[t.group]={name:t.group,model:e,queue:[t],animating:!1},Qc(t,"remove")):n.model!==e&&(n.model=e,n.queue.push(t),!1===n.animating&&2===n.queue.length&&Zc(n)))}!1===t.animating&&Qc(t,"add")}function ed(e,t){let n;Object(t)===t?(n=String(t.model),function(e,t){void 0!==e.group&&(t.group=e.group),void 0!==e.name&&(t.name=e.name);let n=t.opts;Kc.forEach(t=>{void 0!==e[t]&&(n[t]=e[t])})}(t,e),Jc(t,e)):n=String(t),n===e.model?!1===e.animating&&void 0!==e.clsAction&&e.el.classList[e.clsAction]("q-morph--invisible"):(e.model=n,Xc(n,e))}var td=p({name:"morph",mounted(e,t){let n={el:e,animating:!1,opts:{}};Jc(t.modifiers,n),function(e,t){let n="string"==typeof e&&0!==e.length?e.split(":"):[];t.name=n[0],t.group=n[1],Object.assign(t.opts,{duration:!0===isNaN(n[2])?300:parseFloat(n[2]),waitFor:n[3]})}(t.arg,n),ed(n,t.value),e.__qmorph=n},updated(e,t){ed(e.__qmorph,t.value)},beforeUnmount(e){let t=e.__qmorph,n=Gc[t.group];void 0!==n&&-1!==n.queue.indexOf(t)&&(n.queue=n.queue.filter(e=>e!==t),0===n.queue.length&&(n.cancel?.(),delete Gc[t.group])),"add"===t.clsAction&&e.classList.remove("q-morph--invisible"),delete e.__qmorph}});let nd={childList:!0,subtree:!0,attributes:!0,characterData:!0,attributeOldValue:!0,characterDataOldValue:!0};function ad(e,t,n){t.handler=n,t.observer?.disconnect(),t.observer=new MutationObserver(n=>{"function"==typeof t.handler&&(!1===t.handler(n)||!0===t.once)&&id(e)}),t.observer.observe(e,t.opts)}function id(e){let t=e.__qmutation;void 0!==t&&(t.observer?.disconnect(),delete e.__qmutation)}var od=p({name:"mutation",mounted(e,{modifiers:{once:t,...n},value:a}){let i={once:t,opts:0===Object.keys(n).length?nd:n};ad(e,i,a),e.__qmutation=i},updated(e,{oldValue:t,value:n}){let a=e.__qmutation;void 0!==a&&t!==n&&ad(e,a,n)},beforeUnmount:id});let{passive:rd}=m;function sd(e,{value:t,oldValue:n}){"function"==typeof t?(e.handler=t,"function"!=typeof n&&(e.scrollTarget.addEventListener("scroll",e.scroll,rd),e.scroll())):e.scrollTarget.removeEventListener("scroll",e.scroll,rd)}var ld=p({name:"scroll-fire",mounted(e,t){let n={scrollTarget:Pn(e),scroll:P(()=>{let t,a;n.scrollTarget===window?(a=e.getBoundingClientRect().bottom,t=window.innerHeight):(a=Ct(e).top+Tt(e),t=Ct(n.scrollTarget).top+Tt(n.scrollTarget)),a>0&&a{a.styleCleanup=void 0;let t=()=>{document.body.classList.remove("non-selectable")};!0===e?(Qt(),setTimeout(t,10)):t()}),a.triggered=!1,a.sensitivity=!0===t?a.mouseSensitivity:a.touchSensitivity,a.timer=setTimeout(()=>{a.timer=void 0,Qt(),a.triggered=!0,a.handler({evt:e,touch:!0!==t,mouse:!0===t,position:a.origin,duration:Date.now()-n})},a.duration)},move(e){let{top:t,left:n}=v(e);void 0!==a.timer&&(Math.abs(n-a.origin.left)>=a.sensitivity||Math.abs(t-a.origin.top)>=a.sensitivity)&&(clearTimeout(a.timer),a.timer=void 0)},end(e){C(a,"temp"),a.styleCleanup?.(a.triggered),!0===a.triggered?void 0!==e&&k(e):void 0!==a.timer&&(clearTimeout(a.timer),a.timer=void 0)}},i=[600,5,7];"string"==typeof t.arg&&0!==t.arg.length&&t.arg.split(":").forEach((e,t)=>{let n=parseInt(e,10);n&&(i[t]=n)}),[a.duration,a.touchSensitivity,a.mouseSensitivity]=i,e.__qtouchhold=a,!0===n.mouse&&S(a,"main",[[e,"mousedown","mouseStart","passive"+(!0===n.mouseCapture||!0===n.mousecapture?"Capture":"")]]),!0===c.has.touch&&S(a,"main",[[e,"touchstart","touchStart","passive"+(!0===n.capture?"Capture":"")],[e,"touchend","noop","notPassiveCapture"]])},updated(e,t){let n=e.__qtouchhold;void 0!==n&&t.oldValue!==t.value&&("function"!=typeof t.value&&n.end(),n.handler=t.value)},beforeUnmount(e){let t=e.__qtouchhold;void 0!==t&&(C(t,"main"),C(t,"temp"),void 0!==t.timer&&clearTimeout(t.timer),t.styleCleanup?.(),delete e.__qtouchhold)}});let hd={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},pd=RegExp(`^([\\d+]+|${Object.keys(hd).join("|")})$`,"i");var fd=p({name:"touch-repeat",beforeMount(e,{modifiers:t,value:n,arg:a}){let i=Object.keys(t).reduce((e,t)=>{if(!0===pd.test(t)){let n=isNaN(parseInt(t,10))?hd[t.toLowerCase()]:parseInt(t,10);n>=0&&e.push(n)}return e},[]);if(!0!==t.mouse&&!0!==c.has.touch&&0===i.length)return;let o="string"==typeof a&&0!==a.length?a.split(":").map(e=>parseInt(e,10)):[0,600,300],r=o.length-1,s={keyboard:i,handler:n,noop:_,mouseStart(e){void 0===s.event&&"function"==typeof s.handler&&!0===g(e)&&(S(s,"temp",[[document,"mousemove","move","passiveCapture"],[document,"click","end","notPassiveCapture"]]),s.start(e,!0))},keyboardStart(t){if("function"==typeof s.handler&&!0===N(t,i)){if((0===o[0]||void 0!==s.event)&&(k(t),e.focus(),void 0!==s.event))return;S(s,"temp",[[document,"keyup","end","notPassiveCapture"],[document,"click","end","notPassiveCapture"]]),s.start(t,!1,!0)}},touchStart(e){if(void 0!==e.target&&"function"==typeof s.handler){let t=e.target;S(s,"temp",[[t,"touchmove","move","passiveCapture"],[t,"touchcancel","end","notPassiveCapture"],[t,"touchend","end","notPassiveCapture"]]),s.start(e)}},start(e,t,n){function a(e){s.styleCleanup=void 0,document.documentElement.style.cursor="";let t=()=>{document.body.classList.remove("non-selectable")};!0===e?(Qt(),setTimeout(t,10)):t()}!0!==n&&(s.origin=v(e)),!0===c.is.mobile&&(document.body.classList.add("non-selectable"),Qt(),s.styleCleanup=a),s.event={touch:!0!==t&&!0!==n,mouse:!0===t,keyboard:!0===n,startTime:Date.now(),repeatCount:0};let i=()=>{if(s.timer=void 0,void 0===s.event)return;0===s.event.repeatCount&&(s.event.evt=e,!0===n?s.event.keyCode=e.keyCode:s.event.position=v(e),!0!==c.is.mobile&&(document.documentElement.style.cursor="pointer",document.body.classList.add("non-selectable"),Qt(),s.styleCleanup=a)),s.event.duration=Date.now()-s.event.startTime,s.event.repeatCount+=1,s.handler(s.event);let t=r=7||Math.abs(n-t.top)>=7}(e,s.origin)&&(clearTimeout(s.timer),s.timer=void 0)},end(e){void 0!==s.event&&(s.styleCleanup?.(!0),void 0!==e&&s.event.repeatCount>0&&k(e),C(s,"temp"),void 0!==s.timer&&(clearTimeout(s.timer),s.timer=void 0),s.event=void 0)}};e.__qtouchrepeat=s,!0===t.mouse&&S(s,"main",[[e,"mousedown","mouseStart","passive"+(!0===t.mouseCapture||!0===t.mousecapture?"Capture":"")]]),!0===c.has.touch&&S(s,"main",[[e,"touchstart","touchStart","passive"+(!0===t.capture?"Capture":"")],[e,"touchend","noop","passiveCapture"]]),0!==i.length&&S(s,"main",[[e,"keydown","keyboardStart","notPassive"+(!0===t.keyCapture||!0===t.keycapture?"Capture":"")]])},updated(e,{oldValue:t,value:n}){let a=e.__qtouchrepeat;void 0!==a&&t!==n&&("function"!=typeof n&&a.end(),a.handler=n)},beforeUnmount(e){let t=e.__qtouchrepeat;void 0!==t&&(void 0!==t.timer&&clearTimeout(t.timer),C(t,"main"),C(t,"temp"),t.styleCleanup?.(),delete e.__qtouchrepeat)}}),md=n({ClosePopup:()=>Rc,Intersection:()=>Ws,Morph:()=>td,Mutation:()=>od,Ripple:()=>Ot,Scroll:()=>cd,ScrollFire:()=>ld,TouchHold:()=>dd,TouchPan:()=>fi,TouchRepeat:()=>fd,TouchSwipe:()=>Da});function _d(e,t=document.body){if("string"!=typeof e)throw TypeError("Expected a string as propName");if(!(t instanceof Element))throw TypeError("Expected a DOM element");return getComputedStyle(t).getPropertyValue(`--q-${e}`).trim()||null}let gd;function vd(e){void 0===gd&&(gd=c.is.winphone?"msapplication-navbutton-color":"theme-color");let t=function(e){let t=document.getElementsByTagName("META");for(let n in t)if(t[n].name===e)return t[n]}(gd),n=void 0===t;n&&(t=document.createElement("meta"),t.setAttribute("name",gd)),t.setAttribute("content",e),n&&document.head.appendChild(t)}var bd={set:!0!==c.is.mobile||!0!==c.is.nativeMobile&&!0!==c.is.winphone&&!0!==c.is.safari&&!0!==c.is.webkit&&!0!==c.is.vivaldi?_:e=>{let t=e||_d("primary");!0===c.is.nativeMobile&&window.StatusBar?window.StatusBar.backgroundColorByHexString(t):vd(t)},install({$q:e}){e.addressbarColor=this,e.config.addressbarColor&&this.set(e.config.addressbarColor)}};let yd={};function wd(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement||null}function kd(){let e=Cd.activeEl=!1===Cd.isActive?null:wd();!function(e){if(e===pn)return;if(pn=e,pn===document.body||dn.reduce((e,t)=>"dialog"===t?e+1:e,0)<2)return void cn.forEach(e=>{!1===e.contains(pn)&&pn.appendChild(e)});let t=dn.lastIndexOf("dialog");for(let e=0;evoid 0!==document.documentElement[e]),Cd.isCapable=void 0!==yd.request,!1===Cd.isCapable?function(e){Object.assign(Cd,{request:e,exit:e,toggle:e})}(()=>Promise.reject("Not capable")):(Object.assign(Cd,{request(e){let t=e||document.documentElement,{activeEl:n}=Cd;return t===n?Promise.resolve():(null!==n&&!0===t.contains(n)?Cd.exit():Promise.resolve()).finally(()=>Sd(t,yd.request))},exit:()=>!0===Cd.isActive?Sd(document,yd.exit):Promise.resolve(),toggle:e=>!0===Cd.isActive?Cd.exit():Cd.request(e)}),yd.exit=["exitFullscreen","msExitFullscreen","mozCancelFullScreen","webkitExitFullscreen"].find(e=>document[e]),Cd.isActive=!!wd(),!0===Cd.isActive&&kd(),["onfullscreenchange","onmsfullscreenchange","onwebkitfullscreenchange"].forEach(e=>{document[e]=xd}));let Td=f({appVisible:!0},{install({$q:e}){a(e,"appVisible",()=>this.appVisible)}});{let e,t;void 0===document.hidden?void 0===document.msHidden?void 0!==document.webkitHidden&&(e="webkitHidden",t="webkitvisibilitychange"):(e="msHidden",t="msvisibilitychange"):(e="hidden",t="visibilitychange"),t&&void 0!==document[e]&&document.addEventListener(t,()=>{Td.appVisible=!document[e]},!1)}var Pd=h({name:"BottomSheetComponent",props:{...Xe,title:String,message:String,actions:Array,grid:Boolean,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:["ok","hide"],setup(t,{emit:n}){let{proxy:a}=(0,e.getCurrentInstance)(),i=et(t,a.$q),o=(0,e.ref)(null);function r(){o.value.hide()}function s(e){n("ok",e),r()}function l(){n("hide")}function u(){let n=[];return t.title&&n.push((0,e.h)(Aa,{class:"q-dialog__title"},()=>t.title)),t.message&&n.push((0,e.h)(Aa,{class:"q-dialog__message"},()=>t.message)),n.push(!0===t.grid?(0,e.h)("div",{class:"row items-stretch justify-start",role:"list"},t.actions.map(t=>{let n=t.avatar||t.img;return void 0===t.label?(0,e.h)(Fr,{class:"col-all",dark:i.value}):(0,e.h)("div",{class:["q-bottom-sheet__item q-hoverable q-focusable cursor-pointer relative-position",t.class],style:t.style,tabindex:0,role:"listitem",onClick(){s(t)},onKeyup(e){13===e.keyCode&&s(t)}},[(0,e.h)("div",{class:"q-focus-helper"}),t.icon?(0,e.h)(Ye,{name:t.icon,color:t.color}):n?(0,e.h)("img",{class:t.avatar?"q-bottom-sheet__avatar":"",src:n}):(0,e.h)("div",{class:"q-bottom-sheet__empty-icon"}),(0,e.h)("div",t.label)])})):(0,e.h)("div",{role:"list"},t.actions.map(t=>{let n=t.avatar||t.img;return void 0===t.label?(0,e.h)(Fr,{spaced:!0,dark:i.value}):(0,e.h)(wr,{class:["q-bottom-sheet__item",t.classes],style:t.style,tabindex:0,clickable:!0,dark:i.value,onClick(){s(t)}},()=>[(0,e.h)(kr,{avatar:!0},()=>t.icon?(0,e.h)(Ye,{name:t.icon,color:t.color}):n?(0,e.h)("img",{class:t.avatar?"q-bottom-sheet__avatar":"",src:n}):null),(0,e.h)(kr,()=>t.label)])}))),n}function c(){return[(0,e.h)(Ea,{class:["q-bottom-sheet q-bottom-sheet--"+(!0===t.grid?"grid":"list")+(!0===i.value?" q-bottom-sheet--dark q-dark":""),t.cardClass],style:t.cardStyle},u)]}return Object.assign(a,{show:function(){o.value.show()},hide:r}),()=>(0,e.h)(pr,{ref:o,position:"bottom",onHide:l},c)}});function Ed(e,t){for(let n in t)"spinner"!==n&&Object(t[n])===t[n]?(e[n]=Object(e[n])===e[n]?{...e[n]}:{},Ed(e[n],t[n])):e[n]=t[n]}function Ad(t,n,a){return i=>{let o,r,s=!0===n&&void 0!==i.component;if(!0===s){let{component:e,componentProps:t}=i;o="string"==typeof e?a.component(e):e,r=t||{}}else{let{class:e,style:n,...a}=i;o=t,r=a,void 0!==e&&(a.cardClass=e),void 0!==n&&(a.cardStyle=n)}let l,u=!1,c=(0,e.ref)(null),d=fn(!1,"dialog"),h=e=>{if(void 0!==c.value?.[e])return void c.value[e]();let t=l.$.subTree;if(t?.component){if(t.component.proxy&&t.component.proxy[e])return void t.component.proxy[e]();if(t.component.subTree&&t.component.subTree.component&&t.component.subTree.component.proxy&&t.component.subTree.component.proxy[e])return void t.component.subTree.component.proxy[e]()}console.error("[Quasar] Incorrectly defined Dialog component")},p=[],f=[],m={onOk:e=>(p.push(e),m),onCancel:e=>(f.push(e),m),onDismiss:e=>(p.push(e),f.push(e),m),hide:()=>(h("hide"),m),update(e){if(null!==l){if(!0===s)Object.assign(r,e);else{let{class:t,style:n,...a}=e;void 0!==t&&(a.cardClass=t),void 0!==n&&(a.cardStyle=n),Ed(r,a)}l.$forceUpdate()}return m}},_=e=>{u=!0,p.forEach(t=>{t(e)})},g=()=>{v.unmount(d),mn(d),v=null,l=null,!0!==u&&f.forEach(e=>{e()})},v=de({name:"QGlobalDialog",setup:()=>()=>(0,e.h)(o,{...r,ref:c,onOk:_,onHide:g,onVnodeMounted(...t){"function"==typeof r.onVnodeMounted&&r.onVnodeMounted(...t),(0,e.nextTick)(()=>h("show"))}})},a);return l=v.mount(d),m}}var Ld={install({$q:e,parentApp:t}){e.bottomSheet=this.create=Ad(Pd,!1,t)}};function Md(e){return encodeURIComponent(e)}function Rd(e){return decodeURIComponent(e)}function zd(e){if(""===e)return e;0===e.indexOf('"')&&(e=e.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")),e=Rd(e.replace(/\+/g," "));try{let t=JSON.parse(e);(t===Object(t)||!0===Array.isArray(t))&&(e=t)}catch{}return e}function Od(e){let t=new Date;return t.setMilliseconds(t.getMilliseconds()+e),t.toUTCString()}function Id(e,t,n={},a){let i,o;void 0!==n.expires&&("[object Date]"===Object.prototype.toString.call(n.expires)?i=n.expires.toUTCString():"string"==typeof n.expires?i=function(e){let t=0,n=e.match(/(\d+)d/),a=e.match(/(\d+)h/),i=e.match(/(\d+)m/),o=e.match(/(\d+)s/);return n&&(t+=864e5*n[1]),a&&(t+=36e5*a[1]),i&&(t+=6e4*i[1]),o&&(t+=1e3*o[1]),0===t?e:Od(t)}(n.expires):(o=parseFloat(n.expires),i=!1===isNaN(o)?Od(864e5*o):n.expires));let r=`${Md(e)}=${function(e){return Md(e===Object(e)?JSON.stringify(e):String(e))}(t)}`,s=[r,void 0===i?"":"; Expires="+i,n.path?"; Path="+n.path:"",n.domain?"; Domain="+n.domain:"",n.sameSite?"; SameSite="+n.sameSite:"",n.httpOnly?"; HttpOnly":"",n.secure?"; Secure":"",n.other?"; "+n.other:""].join("");if(a){a.req.qCookies?a.req.qCookies.push(s):a.req.qCookies=[s],a.res.setHeader("Set-Cookie",a.req.qCookies);let t=a.req.headers.cookie||"";if(void 0!==i&&o<0){let n=Nd(e,a);void 0!==n&&(t=t.replace(`${e}=${n}; `,"").replace(`; ${e}=${n}`,"").replace(`${e}=${n}`,""))}else t=t?`${r}; ${t}`:s;a.req.headers.cookie=t}else document.cookie=s}function Nd(e,t){let n,a,i,o=t?t.req.headers:document,r=o.cookie?o.cookie.split("; "):[],s=r.length,l=e?null:{},u=0;for(;uNd(t,e),set:(t,n,a)=>Id(t,n,a,e),has:t=>function(e,t){return null!==Nd(e,t)}(t,e),remove:(t,n)=>function(e,t,n){Id(e,"",{expires:-1,...t},n)}(t,n,e),getAll:()=>Nd(null,e)}}());var qd=h({name:"DialogPluginComponent",props:{...Xe,title:String,message:String,prompt:Object,options:Object,progress:[Boolean,Object],html:Boolean,ok:{type:[String,Object,Boolean],default:!0},cancel:[String,Object,Boolean],focus:{type:String,default:"ok",validator:e=>["ok","cancel","none"].includes(e)},stackButtons:Boolean,color:String,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:["ok","hide"],setup(t,{emit:n}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:i}=a,o=et(t,i),r=(0,e.ref)(null),s=(0,e.ref)(void 0===t.prompt?void 0===t.options?void 0:t.options.model:t.prompt.model),l=(0,e.computed)(()=>"q-dialog-plugin"+(!0===o.value?" q-dialog-plugin--dark q-dark":"")+(!1===t.progress?"":" q-dialog-plugin--progress")),u=(0,e.computed)(()=>t.color||(!0===o.value?"amber":"primary")),c=(0,e.computed)(()=>!1===t.progress?null:!0===oe(t.progress)?{component:t.progress.spinner||St,props:{color:t.progress.color||u.value}}:{component:St,props:{color:u.value}}),d=(0,e.computed)(()=>void 0!==t.prompt||void 0!==t.options),h=(0,e.computed)(()=>{if(!0!==d.value)return{};let{model:e,isValid:n,items:a,...i}=void 0===t.prompt?t.options:t.prompt;return i}),p=(0,e.computed)(()=>!0===oe(t.ok)||!0===t.ok?i.lang.label.ok:t.ok),f=(0,e.computed)(()=>!0===oe(t.cancel)||!0===t.cancel?i.lang.label.cancel:t.cancel),m=(0,e.computed)(()=>void 0===t.prompt?void 0!==t.options&&(void 0!==t.options.isValid&&!0!==t.options.isValid(s.value)):void 0!==t.prompt.isValid&&!0!==t.prompt.isValid(s.value)),_=(0,e.computed)(()=>({color:u.value,label:p.value,ripple:!1,disable:m.value,...!0===oe(t.ok)?t.ok:{flat:!0},"data-autofocus":"ok"===t.focus&&!0!==d.value||void 0,onClick:b})),g=(0,e.computed)(()=>({color:u.value,label:f.value,ripple:!1,...!0===oe(t.cancel)?t.cancel:{flat:!0},"data-autofocus":"cancel"===t.focus&&!0!==d.value||void 0,onClick:y}));function v(){r.value.hide()}function b(){n("ok",(0,e.toRaw)(s.value)),v()}function y(){v()}function w(){n("hide")}function k(e){s.value=e}function x(e){!0!==m.value&&"textarea"!==t.prompt.type&&!0===N(e,13)&&b()}function S(n,a){return!0===t.html?(0,e.h)(Aa,{class:n,innerHTML:a}):(0,e.h)(Aa,{class:n},()=>a)}function C(){return[(0,e.h)($s,{color:u.value,dense:!0,autofocus:!0,dark:o.value,...h.value,modelValue:s.value,"onUpdate:modelValue":k,onKeyup:x})]}function T(){return[(0,e.h)(dl,{color:u.value,options:t.options.items,dark:o.value,...h.value,modelValue:s.value,"onUpdate:modelValue":k})]}function P(){let n=[];return t.title&&n.push(S("q-dialog__title",t.title)),!1!==t.progress&&n.push((0,e.h)(Aa,{class:"q-dialog__progress"},()=>(0,e.h)(c.value.component,c.value.props))),t.message&&n.push(S("q-dialog__message",t.message)),void 0===t.prompt?void 0!==t.options&&n.push((0,e.h)(Fr,{dark:o.value}),(0,e.h)(Aa,{class:"scroll q-dialog-plugin__form"},T),(0,e.h)(Fr,{dark:o.value})):n.push((0,e.h)(Aa,{class:"scroll q-dialog-plugin__form"},C)),(t.ok||t.cancel)&&n.push(function(){let n=[];return t.cancel&&n.push((0,e.h)(Kt,g.value)),t.ok&&n.push((0,e.h)(Kt,_.value)),(0,e.h)(La,{class:!0===t.stackButtons?"items-end":"",vertical:t.stackButtons,align:"right"},()=>n)}()),n}function E(){return[(0,e.h)(Ea,{class:[l.value,t.cardClass],style:t.cardStyle,dark:o.value},P)]}return(0,e.watch)(()=>t.prompt&&t.prompt.model,k),(0,e.watch)(()=>t.options&&t.options.model,k),Object.assign(a,{show:function(){r.value.show()},hide:v}),()=>(0,e.h)(pr,{ref:r,onHide:w},E)}}),jd={install({$q:e,parentApp:t}){e.dialog=this.create=Ad(qd,!0,t)}};let Bd,Fd,$d=0,Vd=null,Ud={},Hd={},Wd={group:"__default_quasar_group__",delay:0,message:!1,html:!1,spinnerSize:80,spinnerColor:"",messageColor:"",backgroundColor:"",boxClass:"",spinner:St,customClass:""},Gd={...Wd};let Kd,Yd=f({isActive:!1},{show(t){Ud=function(e){if(void 0!==e?.group&&void 0!==Hd[e.group])return Object.assign(Hd[e.group],e);let t=!0===oe(e)&&!0===e.ignoreDefaults?{...Wd,...e}:{...Gd,...e};return Hd[t.group]=t,t}(t);let{group:n}=Ud;return Yd.isActive=!0,void 0===Bd?(Ud.uid=++$d,null!==Vd&&clearTimeout(Vd),Vd=setTimeout(()=>{Vd=null;let t=fn("q-loading");Bd=de({name:"QLoading",setup(){function n(){!0!==Yd.isActive&&void 0!==Bd&&(lr(!1),Bd.unmount(t),mn(t),Bd=void 0,Fd=void 0)}function a(){if(!0!==Yd.isActive)return null;let t=[(0,e.h)(Ud.spinner,{class:"q-loading__spinner",color:Ud.spinnerColor,size:Ud.spinnerSize})];return Ud.message&&t.push((0,e.h)("div",{class:"q-loading__message"+(Ud.messageColor?` text-${Ud.messageColor}`:""),[!0===Ud.html?"innerHTML":"textContent"]:Ud.message})),(0,e.h)("div",{class:"q-loading fullscreen flex flex-center z-max "+Ud.customClass.trim(),key:Ud.uid},[(0,e.h)("div",{class:"q-loading__backdrop"+(Ud.backgroundColor?` bg-${Ud.backgroundColor}`:"")}),(0,e.h)("div",{class:"q-loading__box column items-center "+Ud.boxClass},t)])}return(0,e.onMounted)(()=>{lr(!0)}),()=>(0,e.h)(e.Transition,{name:"q-transition--fade",appear:!0,onAfterLeave:n},a)}},Yd.__parentApp),Fd=Bd.mount(t)},Ud.delay)):(Ud.uid=$d,Fd.$forceUpdate()),e=>{void 0!==e&&Object(e)===e?Yd.show({...e,group:n}):Yd.hide(n)}},hide(e){if(!0===Yd.isActive){if(void 0===e)Hd={};else{if(void 0===Hd[e])return;{delete Hd[e];let t=Object.keys(Hd);if(0!==t.length){let e=t[t.length-1];return void Yd.show({group:e})}}}null!==Vd&&(clearTimeout(Vd),Vd=null),Yd.isActive=!1}},setDefaults(e){!0===oe(e)&&Object.assign(Gd,e)},install({$q:e,parentApp:t}){e.loading=this,Yd.__parentApp=t,void 0!==e.config.loading&&this.setDefaults(e.config.loading)}}),Qd=(0,e.ref)(null),Zd=f({isActive:!1},{start:_,stop:_,increment:_,setDefaults:_,install({$q:t,parentApp:n}){if(t.loadingBar=this,!0===this.__installed)return void(void 0!==t.config.loadingBar&&this.setDefaults(t.config.loadingBar));let a=(0,e.ref)(void 0===t.config.loadingBar?{}:{...t.config.loadingBar});function i(){Zd.isActive=!0}function o(){Zd.isActive=!1}let r=fn("q-loading-bar");de({name:"LoadingBar",devtools:{hide:!0},setup:()=>()=>(0,e.h)(Te,{...a.value,onStart:i,onStop:o,ref:Qd})},n).mount(r),Object.assign(this,{start(e){Qd.value.start(e)},stop(){Qd.value.stop()},increment(){Qd.value.increment.apply(null,arguments)},setDefaults(e){!0===oe(e)&&Object.assign(a.value,e)}})}}),Jd=null,Xd=[];function eh(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!0;for(let n in e)if(e[n]!==t[n])return!0}function th(e){return!1===["class","style"].includes(e)}function nh(e){return!1===["lang","dir"].includes(e)}function ah(){Jd=null;let e={title:"",titleTemplate:null,meta:{},link:{},script:{},htmlAttr:{},bodyAttr:{}};for(let t=0;t{let n=e[t[0]],a=t[1];for(let e in n){let t=n[e];t.template&&(1===Object.keys(t).length?delete n[e]:(t[a]=t.template(t[a]||""),delete t.template))}})})(e),function({add:e,remove:t}){e.title&&(document.title=e.title),0!==Object.keys(t).length&&(["meta","link","script"].forEach(e=>{t[e].forEach(t=>{document.head.querySelector(`${e}[data-qmeta="${t}"]`).remove()})}),t.htmlAttr.filter(nh).forEach(e=>{document.documentElement.removeAttribute(e)}),t.bodyAttr.filter(th).forEach(e=>{document.body.removeAttribute(e)})),["meta","link","script"].forEach(t=>{let n=e[t];for(let e in n){let a=document.createElement(t);for(let t in n[e])"innerHTML"!==t&&a.setAttribute(t,n[e][t]);a.setAttribute("data-qmeta",e),"script"===t&&(a.innerHTML=n[e].innerHTML||""),document.head.appendChild(a)}}),Object.keys(e.htmlAttr).filter(nh).forEach(t=>{document.documentElement.setAttribute(t,e.htmlAttr[t]||"")}),Object.keys(e.bodyAttr).filter(th).forEach(t=>{document.body.setAttribute(t,e.bodyAttr[t]||"")})}(function(e,t){let n={},a={};return void 0===e?{add:t,remove:a}:(e.title!==t.title&&(n.title=t.title),["meta","link","script","htmlAttr","bodyAttr"].forEach(i=>{let o=e[i],r=t[i];if(a[i]=[],null!=o){n[i]={};for(let e in o)!1===r.hasOwnProperty(e)&&a[i].push(e);for(let e in r)!1===o.hasOwnProperty(e)?n[i][e]=r[e]:!0===eh(o[e],r[e])&&(a[i].push(e),n[i][e]=r[e])}else n[i]=r}),{add:n,remove:a})}(Kd,e)),Kd=e}function ih(){null!==Jd&&clearTimeout(Jd),Jd=setTimeout(ah,50)}var oh={install(e){!0!==this.__installed&&!0===r.value&&(Kd=window.__Q_META__,document.getElementById("qmeta-init").remove())}};let rh=0,sh={},lh={},uh={},ch={},dh=/^\s*$/,hh=[],ph=[void 0,null,!0,!1,""],fh=["top-left","top-right","bottom-left","bottom-right","top","bottom","left","right","center"],mh=["top-left","top-right","bottom-left","bottom-right"],_h={positive:{icon:e=>e.iconSet.type.positive,color:"positive"},negative:{icon:e=>e.iconSet.type.negative,color:"negative"},warning:{icon:e=>e.iconSet.type.warning,color:"warning",textColor:"dark"},info:{icon:e=>e.iconSet.type.info,color:"info"},ongoing:{group:!1,timeout:0,spinner:!0,color:"grey-8"}};function gh(t,n,a){if(!t)return bh("parameter required");let i,o={textColor:"white"};if(!0!==t.ignoreDefaults&&Object.assign(o,sh),!1===oe(t)&&(o.type&&Object.assign(o,_h[o.type]),t={message:t}),Object.assign(o,_h[t.type||o.type],t),"function"==typeof o.icon&&(o.icon=o.icon(n)),o.spinner?(!0===o.spinner&&(o.spinner=St),o.spinner=(0,e.markRaw)(o.spinner)):o.spinner=!1,o.meta={hasMedia:!(!1===o.spinner&&!o.icon&&!o.avatar),hasText:vh(o.message)||vh(o.caption)},o.position){if(!1===fh.includes(o.position))return bh("wrong position",t)}else o.position="bottom";if(!0===ph.includes(o.timeout))o.timeout=5e3;else{let e=Number(o.timeout);if(isNaN(e)||e<0)return bh("wrong timeout",t);o.timeout=Number.isFinite(e)?e:0}0===o.timeout?o.progress=!1:!0===o.progress&&(o.meta.progressClass="q-notification__progress"+(o.progressClass?` ${o.progressClass}`:""),o.meta.progressStyle={animationDuration:`${o.timeout+1e3}ms`});let r=(!0===Array.isArray(t.actions)?t.actions:[]).concat(!0!==t.ignoreDefaults&&!0===Array.isArray(sh.actions)?sh.actions:[]).concat(!0===Array.isArray(_h[t.type]?.actions)?_h[t.type].actions:[]),{closeBtn:s}=o;if(s&&r.push({label:"string"==typeof s?s:n.lang.label.close}),o.actions=r.map(({handler:e,noDismiss:t,...n})=>({flat:!0,...n,onClick:"function"==typeof e?()=>{e(),!0!==t&&l()}:()=>{l()}})),void 0===o.multiLine&&(o.multiLine=o.actions.length>1),Object.assign(o.meta,{class:"q-notification row items-stretch q-notification--"+(!0===o.multiLine?"multi-line":"standard")+(void 0===o.color?"":` bg-${o.color}`)+(void 0===o.textColor?"":` text-${o.textColor}`)+(void 0===o.classes?"":` ${o.classes}`),wrapperClass:"q-notification__wrapper col relative-position border-radius-inherit "+(!0===o.multiLine?"column no-wrap justify-center":"row items-center"),contentClass:"q-notification__content row items-center"+(!0===o.multiLine?"":" col"),leftClass:!0===o.meta.hasText?"additional":"single",attrs:{role:"alert",...o.attrs}}),!1===o.group?(o.group=void 0,o.meta.group=void 0):((void 0===o.group||!0===o.group)&&(o.group=[o.message,o.caption,o.multiline].concat(o.actions.map(e=>`${e.label}*${e.icon}`)).join("|")),o.meta.group=o.group+"|"+o.position),0===o.actions.length?o.actions=void 0:o.meta.actionsClass="q-notification__actions row items-center "+(!0===o.multiLine?"justify-end":"col-auto")+(!0===o.meta.hasMedia?" q-notification__actions--with-media":""),void 0!==a){a.notif.meta.timer&&(clearTimeout(a.notif.meta.timer),a.notif.meta.timer=void 0),o.meta.uid=a.notif.meta.uid;let e=uh[o.position].value.indexOf(a.notif);uh[o.position].value[e]=o}else{let e=lh[o.meta.group];if(void 0===e){if(o.meta.uid=rh++,o.meta.badge=1,-1!==["left","right","center"].indexOf(o.position))uh[o.position].value.splice(Math.floor(uh[o.position].value.length/2),0,o);else{let e=-1===o.position.indexOf("top")?"push":"unshift";uh[o.position].value[e](o)}void 0!==o.group&&(lh[o.meta.group]=o)}else{if(e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0),void 0!==o.badgePosition){if(!1===mh.includes(o.badgePosition))return bh("wrong badgePosition",t)}else o.badgePosition="top-"+(-1===o.position.indexOf("left")?"left":"right");o.meta.uid=e.meta.uid,o.meta.badge=e.meta.badge+1,o.meta.badgeClass=`q-notification__badge q-notification__badge--${o.badgePosition}`+(void 0===o.badgeColor?"":` bg-${o.badgeColor}`)+(void 0===o.badgeTextColor?"":` text-${o.badgeTextColor}`)+(o.badgeClass?` ${o.badgeClass}`:"");let n=uh[o.position].value.indexOf(e);uh[o.position].value[n]=lh[o.meta.group]=o}}let l=()=>{(function(e){e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0);let t=uh[e.position].value.indexOf(e);if(-1!==t){void 0!==e.group&&delete lh[e.meta.group];let n=hh[String(e.meta.uid)];if(n){let{width:e,height:t}=getComputedStyle(n);n.style.left=`${n.offsetLeft}px`,n.style.width=e,n.style.height=t}uh[e.position].value.splice(t,1),"function"==typeof e.onDismiss&&e.onDismiss()}})(o),i=void 0};return o.timeout>0&&(o.meta.timer=setTimeout(()=>{o.meta.timer=void 0,l()},o.timeout+1e3)),void 0!==o.group?e=>{void 0===e?l():bh("trying to update a grouped one which is forbidden",t)}:(i={dismiss:l,config:t,notif:o},void 0===a?e=>{void 0!==i&&(void 0===e?i.dismiss():gh(Object.assign({},i.config,e,{group:!1,position:o.position}),n,i))}:void Object.assign(a,i))}function vh(e){return null!=e&&!0!==dh.test(e)}function bh(e,t){return console.error(`Notify: ${e}`,t),!1}var yh={setDefaults(e){!0===oe(e)&&Object.assign(sh,e)},registerType(e,t){!0===oe(t)&&(_h[e]=t)},install({$q:t,parentApp:n}){if(t.notify=this.create=e=>gh(e,t),t.notify.setDefaults=this.setDefaults,t.notify.registerType=this.registerType,void 0!==t.config.notify&&this.setDefaults(t.config.notify),!0!==this.__installed){fh.forEach(t=>{uh[t]=(0,e.ref)([]);let n=!0===["left","center","right"].includes(t)?"center":-1===t.indexOf("top")?"bottom":"top",a=-1===t.indexOf("left")?-1===t.indexOf("right")?"center":"end":"start";ch[t]=`q-notifications__list q-notifications__list--${n} fixed column no-wrap ${["left","right"].includes(t)?`items-${"left"===t?"start":"end"} justify-center`:"center"===t?"flex-center":`items-${a}`}`});let t=fn("q-notify");de(h({name:"QNotifications",devtools:{hide:!0},setup:()=>()=>(0,e.h)("div",{class:"q-notifications"},fh.map(t=>(0,e.h)(e.TransitionGroup,{key:t,class:ch[t],tag:"div",name:`q-notification--${t}`},()=>uh[t].value.map(t=>{let n=t.meta,a=[];if(!0===n.hasMedia&&(!1===t.spinner?t.icon?a.push((0,e.h)(Ye,{class:"q-notification__icon q-notification__icon--"+n.leftClass,name:t.icon,color:t.iconColor,size:t.iconSize,role:"img"})):t.avatar&&a.push((0,e.h)(Qe,{class:"q-notification__avatar q-notification__avatar--"+n.leftClass},()=>(0,e.h)("img",{src:t.avatar,"aria-hidden":"true"}))):a.push((0,e.h)(t.spinner,{class:"q-notification__spinner q-notification__spinner--"+n.leftClass,color:t.spinnerColor,size:t.spinnerSize}))),!0===n.hasText){let n,i={class:"q-notification__message col"};if(!0===t.html)i.innerHTML=t.caption?`
${t.message}
${t.caption}
`:t.message;else{let a=[t.message];n=t.caption?[(0,e.h)("div",a),(0,e.h)("div",{class:"q-notification__caption"},[t.caption])]:a}a.push((0,e.h)("div",i,n))}let i=[(0,e.h)("div",{class:n.contentClass},a)];return!0===t.progress&&i.push((0,e.h)("div",{key:`${n.uid}|p|${n.badge}`,class:n.progressClass,style:n.progressStyle})),void 0!==t.actions&&i.push((0,e.h)("div",{class:n.actionsClass},t.actions.map(t=>(0,e.h)(Kt,t)))),n.badge>1&&i.push((0,e.h)("div",{key:`${n.uid}|${n.badge}`,class:t.meta.badgeClass,style:t.badgeStyle},[n.badge])),(0,e.h)("div",{ref:e=>{hh[String(n.uid)]=e},key:n.uid,class:n.class,...n.attrs},[(0,e.h)("div",{class:n.wrapperClass},i)])}))))}),n).mount(t)}}};function wh(){let e=()=>null;return{has:()=>!1,hasItem:()=>!1,getLength:()=>0,getItem:e,getIndex:e,getKey:e,getAll:()=>{},getAllKeys:()=>[],set:_,setItem:_,remove:_,removeItem:_,clear:_,isEmpty:()=>!0}}function kh(e){let t=window[e+"Storage"],n=e=>{let n=t.getItem(e);return n?function(e){if(e.length<9)return e;let t=e.substring(0,8),n=e.substring(9);switch(t){case"__q_date":let t=Number(n);return new Date(!0===Number.isNaN(t)?n:t);case"__q_expr":return new RegExp(n);case"__q_numb":return Number(n);case"__q_bool":return"1"===n;case"__q_strn":return String(n);case"__q_objt":return JSON.parse(n);default:return e}}(n):null},a=e=>null!==t.getItem(e),i=(e,n)=>{t.setItem(e,function(e){return!0===re(e)?"__q_date|"+e.getTime():!0===se(e)?"__q_expr|"+e.source:"number"==typeof e?"__q_numb|"+e:"boolean"==typeof e?"__q_bool|"+(e?"1":"0"):"string"==typeof e?"__q_strn|"+e:"function"==typeof e?"__q_strn|"+e.toString():e===Object(e)?"__q_objt|"+JSON.stringify(e):e}(n))},o=e=>{t.removeItem(e)};return{has:a,hasItem:a,getLength:()=>t.length,getItem:n,getIndex:e=>ee{let e,a={},i=t.length;for(let o=0;o{let e=[],n=t.length;for(let a=0;a{t.clear()},isEmpty:()=>0===t.length}}let xh=!1===c.has.webStorage?wh():kh("local"),Sh={install({$q:e}){e.localStorage=xh}};Object.assign(Sh,xh);let Ch=!1===c.has.webStorage?wh():kh("session"),Th={install({$q:e}){e.sessionStorage=Ch}};Object.assign(Th,Ch);var Ph=n({AddressbarColor:()=>bd,AppFullscreen:()=>Cd,AppVisibility:()=>Td,BottomSheet:()=>Ld,Cookies:()=>Dd,Dark:()=>M,Dialog:()=>jd,IconSet:()=>G,Lang:()=>H,Loading:()=>Yd,LoadingBar:()=>Zd,LocalStorage:()=>Sh,Meta:()=>oh,Notify:()=>yh,Platform:()=>d,Screen:()=>L,SessionStorage:()=>Th});function Eh(e){return void 0===navigator.clipboard?new Promise((t,n)=>{let a=function(e){let t=document.createElement("textarea");t.value=e,t.contentEditable="true",t.style.position="fixed";let n=()=>{};Qn(n),document.body.appendChild(t),t.focus(),t.select();let a=document.execCommand("copy");return t.remove(),Zn(n),a}(e);a?t(!0):n(a)}):navigator.clipboard.writeText(e)}var Ah=e=>{let t={activated(){this.__qMeta.active=!0,ih()},deactivated(){this.__qMeta.active=!1,ih()},unmounted(){Xd.splice(Xd.indexOf(this.__qMeta),1),ih(),this.__qMeta=void 0}};return"function"==typeof e?Object.assign(t,{computed:{__qMetaOptions(){return e.call(this)||{}}},watch:{__qMetaOptions(e){this.__qMeta.val=e,!0===this.__qMeta.active&&ih()}},created(){this.__qMeta={active:!0,val:this.__qMetaOptions},Xd.push(this.__qMeta),ih()}}):t.created=function(){this.__qMeta={active:!0,val:e},Xd.push(this.__qMeta),ih()},t},Lh=class{constructor(){this.__stack={}}on(e,t,n){return(this.__stack[e]||(this.__stack[e]=[])).push({fn:t,ctx:n}),this}once(e,t,n){let a=(...i)=>{this.off(e,a),t.apply(n,i)};return a.__callback=t,this.on(e,a,n)}emit(e){let t=this.__stack[e];if(void 0!==t){let e=[].slice.call(arguments,1);t.forEach(t=>{t.fn.apply(t.ctx,e)})}return this}off(e,t){let n=this.__stack[e];if(void 0===n)return this;if(void 0===t)return delete this.__stack[e],this;let a=n.filter(e=>e.fn!==t&&e.fn.__callback!==t);return 0===a.length?delete this.__stack[e]:this.__stack[e]=a,this}};function Mh(e){setTimeout(()=>{window.URL.revokeObjectURL(e.href)},1e4),e.remove()}function Rh(e,t,n={}){let{mimeType:a,byteOrderMark:i,encoding:o}="string"==typeof n?{mimeType:n}:n,r=void 0===o?t:new TextEncoder(o).encode([t]),s=new Blob(void 0===i?[r]:[i,r],{type:a||"application/octet-stream"}),l=document.createElement("a");l.href=window.URL.createObjectURL(s),l.setAttribute("download",e),void 0===l.download&&l.setAttribute("target","_blank"),l.classList.add("hidden"),l.style.position="fixed",document.body.appendChild(l);try{return l.click(),Mh(l),!0}catch(e){return Mh(l),e}}function zh(e,t,n){let a=window.open;if(!0===d.is.cordova)if(void 0!==cordova?.InAppBrowser?.open)a=cordova.InAppBrowser.open;else if(void 0!==navigator?.app)return navigator.app.loadUrl(e,{openExternal:!0});let i=Object.assign({noopener:!0},n),o=!0===i.noopener||!0===i.noreferrer,r=a(e,"_blank",function(e){let t=Object.assign({noopener:!0},e),n=[];for(let e in t){let a=t[e];!0===a?n.push(e):(le(a)||"string"==typeof a&&""!==a)&&n.push(e+"="+a)}return n.join(",")}(n));if(r)return d.is.desktop&&r.focus(),r;!1===o&&t?.()}var Oh=(e,t,n)=>{if(!0!==d.is.ios||void 0===window.SafariViewController)return zh(e,t,n);window.SafariViewController.isAvailable(a=>{a?window.SafariViewController.show({url:e},_,t):zh(e,t,n)})};function Ih(e,{threadsNumber:t=1,abortOnFail:n=!0}={}){let a=-1,i=!1,{isList:o,totalJobs:r,resultAggregator:s,resultKeys:l}=function(e){let t=Array.isArray(e);if(!0===t){let n=e.length;return{isList:t,totalJobs:n,resultAggregator:Array(n).fill(null)}}let n=Object.keys(e),a={};return n.forEach(e=>{a[e]=null}),{isList:t,totalJobs:n.length,resultAggregator:a,resultKeys:n}}(e),u=Array(Math.min(r,t)).fill(null).map(()=>new Promise((t,u)=>{!function c(){let d=++a;if(!0===i||d>=r)return void t();let h=!0===o?d:l[d];e[h](s).then(e=>{!0!==i?(s[h]={key:h,status:"fulfilled",value:e},setTimeout(c)):t()}).catch(e=>{if(!0===i)return void t();let a={key:h,status:"rejected",reason:e};if(s[h]=a,!0===n)return i=!0,void u({...a,resultAggregator:s});setTimeout(c)})}()}));return Promise.all(u).then(()=>s)}var Nh=n({EventBus:()=>Lh,clone:()=>xl,colors:()=>Xi,copyToClipboard:()=>Eh,createMetaMixin:()=>Ah,createUploaderComponent:()=>Sc,date:()=>Fo,debounce:()=>P,dom:()=>Lt,event:()=>T,exportFile:()=>Rh,extend:()=>Ir,format:()=>ye,frameDebounce:()=>yl,getCssVar:()=>_d,is:()=>ue,morph:()=>Wc,noop:()=>_,openURL:()=>Oh,patterns:()=>Ui,runSequentialPromises:()=>Ih,scroll:()=>jn,setCssVar:()=>R,throttle:()=>Mt,uid:()=>va});function Dh(){let{emit:t,proxy:n}=(0,e.getCurrentInstance)(),a=(0,e.ref)(null);function i(){a.value.hide()}return Object.assign(n,{show:function(){a.value.show()},hide:i}),{dialogRef:a,onDialogHide:function(){t("hide")},onDialogOK:function(e){t("ok",e),i()},onDialogCancel:i}}let qh=["ok","hide"];function jh(t){{let n={active:!0};if("function"==typeof t){let a=(0,e.computed)(t);n.val=a.value,(0,e.watch)(a,e=>{n.val=e,!0===n.active&&ih()})}else n.val=t;Xd.push(n),ih(),(0,e.onActivated)(()=>{n.active=!0,ih()}),(0,e.onDeactivated)(()=>{n.active=!1,ih()}),(0,e.onUnmounted)(()=>{Xd.splice(Xd.indexOf(n),1),ih()})}}function Bh(){return(0,e.inject)("_q_")}function Fh(){let t=null,n=(0,e.getCurrentInstance)();function a(){null!==t&&(clearInterval(t),t=null)}return(0,e.onDeactivated)(a),(0,e.onBeforeUnmount)(a),{removeInterval:a,registerInterval(e,i){a(),!1===dt(n)&&(t=setInterval(e,i))}}}Dh.emits=qh,Dh.emitsObject=kc(qh);var $h=n({useDialogPluginComponent:()=>Dh,useFormChild:()=>es,useHydration:()=>xi,useId:()=>ya,useInterval:()=>Fh,useMeta:()=>jh,useQuasar:()=>Bh,useRenderCache:()=>qa,useSplitAttrs:()=>Lr,useTick:()=>kn,useTimeout:()=>xn});void 0===window.Vue&&console.error("[ Quasar ] Vue is required to run. Please add a script tag for it before loading Quasar."),window.Quasar={version:"2.19.3",install(e,t){pe(e,{components:Lc,directives:md,plugins:Ph,...t})},lang:H,iconSet:G,...Lc,...md,...Ph,...$h,...Nh}}(window.Vue); /*! * vuex v4.1.0 * (c) 2022 Evan You * @license MIT */ -var Vuex=function(e){"use strict";var t="store";function n(){return"undefined"!=typeof navigator?window:"undefined"!=typeof global?global:{}}function a(e,t){var a=n().__VUE_DEVTOOLS_GLOBAL_HOOK__;if(a)a.emit("devtools-plugin:setup",e,t);else{var i=n();(i.__VUE_DEVTOOLS_PLUGINS__=i.__VUE_DEVTOOLS_PLUGINS__||[]).push({pluginDescriptor:e,setupFn:t})}}function i(e,t){if(void 0===t&&(t=[]),null===e||"object"!=typeof e)return e;var n,a=(n=function(t){return t.original===e},t.filter(n)[0]);if(a)return a.copy;var r=Array.isArray(e)?[]:{};return t.push({original:e,copy:r}),Object.keys(e).forEach(function(n){r[n]=i(e[n],t)}),r}function r(e,t){Object.keys(e).forEach(function(n){return t(e[n],n)})}function o(e){return null!==e&&"object"==typeof e}function s(e,t){if(!e)throw new Error("[vuex] "+t)}function l(e,t,n){return t.indexOf(e)<0&&(n&&n.prepend?t.unshift(e):t.push(e)),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}function u(e,t){e._actions=Object.create(null),e._mutations=Object.create(null),e._wrappedGetters=Object.create(null),e._modulesNamespaceMap=Object.create(null);var n=e.state;d(e,n,[],e._modules.root,!0),c(e,n,t)}function c(t,n,a){var i=t._state,o=t._scope;t.getters={},t._makeLocalGettersCache=Object.create(null);var l=t._wrappedGetters,u={},c={},d=e.effectScope(!0);d.run(function(){r(l,function(n,a){u[a]=function(e,t){return function(){return e(t)}}(n,t),c[a]=e.computed(function(){return u[a]()}),Object.defineProperty(t.getters,a,{get:function(){return c[a].value},enumerable:!0})})}),t._state=e.reactive({data:n}),t._scope=d,t.strict&&function(t){e.watch(function(){return t._state.data},function(){s(t._committing,"do not mutate vuex store state outside mutation handlers.")},{deep:!0,flush:"sync"})}(t),i&&a&&t._withCommit(function(){i.data=null}),o&&o.stop()}function d(e,t,n,a,i){var r=!n.length,o=e._modules.getNamespace(n);if(a.namespaced&&(e._modulesNamespaceMap[o]&&console.error("[vuex] duplicate namespace "+o+" for the namespaced module "+n.join("/")),e._modulesNamespaceMap[o]=a),!r&&!i){var s=p(t,n.slice(0,-1)),l=n[n.length-1];e._withCommit(function(){l in s&&console.warn('[vuex] state field "'+l+'" was overridden by a module with the same name at "'+n.join(".")+'"'),s[l]=a.state})}var u=a.context=function(e,t,n){var a=""===t,i={dispatch:a?e.dispatch:function(n,a,i){var r=f(n,a,i),o=r.payload,s=r.options,l=r.type;if(s&&s.root||(l=t+l,e._actions[l]))return e.dispatch(l,o);console.error("[vuex] unknown local action type: "+r.type+", global type: "+l)},commit:a?e.commit:function(n,a,i){var r=f(n,a,i),o=r.payload,s=r.options,l=r.type;s&&s.root||(l=t+l,e._mutations[l])?e.commit(l,o,s):console.error("[vuex] unknown local mutation type: "+r.type+", global type: "+l)}};return Object.defineProperties(i,{getters:{get:a?function(){return e.getters}:function(){return h(e,t)}},state:{get:function(){return p(e.state,n)}}}),i}(e,o,n);a.forEachMutation(function(t,n){!function(e,t,n,a){var i=e._mutations[t]||(e._mutations[t]=[]);i.push(function(t){n.call(e,a.state,t)})}(e,o+n,t,u)}),a.forEachAction(function(t,n){var a=t.root?n:o+n,i=t.handler||t;!function(e,t,n,a){var i=e._actions[t]||(e._actions[t]=[]);i.push(function(t){var i,r=n.call(e,{dispatch:a.dispatch,commit:a.commit,getters:a.getters,state:a.state,rootGetters:e.getters,rootState:e.state},t);return(i=r)&&"function"==typeof i.then||(r=Promise.resolve(r)),e._devtoolHook?r.catch(function(t){throw e._devtoolHook.emit("vuex:error",t),t}):r})}(e,a,i,u)}),a.forEachGetter(function(t,n){!function(e,t,n,a){if(e._wrappedGetters[t])return void console.error("[vuex] duplicate getter key: "+t);e._wrappedGetters[t]=function(e){return n(a.state,a.getters,e.state,e.getters)}}(e,o+n,t,u)}),a.forEachChild(function(a,r){d(e,t,n.concat(r),a,i)})}function h(e,t){if(!e._makeLocalGettersCache[t]){var n={},a=t.length;Object.keys(e.getters).forEach(function(i){if(i.slice(0,a)===t){var r=i.slice(a);Object.defineProperty(n,r,{get:function(){return e.getters[i]},enumerable:!0})}}),e._makeLocalGettersCache[t]=n}return e._makeLocalGettersCache[t]}function p(e,t){return t.reduce(function(e,t){return e[t]},e)}function f(e,t,n){return o(e)&&e.type&&(n=t,t=e,e=e.type),s("string"==typeof e,"expects string as the type, but found "+typeof e+"."),{type:e,payload:t,options:n}}var m="vuex:mutations",_="vuex:actions",g="vuex",v=0;function b(e,t){a({id:"org.vuejs.vuex",app:e,label:"Vuex",homepage:"https://next.vuex.vuejs.org/",logo:"https://vuejs.org/images/icons/favicon-96x96.png",packageName:"vuex",componentStateTypes:["vuex bindings"]},function(n){n.addTimelineLayer({id:m,label:"Vuex Mutations",color:y}),n.addTimelineLayer({id:_,label:"Vuex Actions",color:y}),n.addInspector({id:g,label:"Vuex",icon:"storage",treeFilterPlaceholder:"Filter stores..."}),n.on.getInspectorTree(function(n){if(n.app===e&&n.inspectorId===g)if(n.filter){var a=[];S(a,t._modules.root,n.filter,""),n.rootNodes=a}else n.rootNodes=[x(t._modules.root,"")]}),n.on.getInspectorState(function(n){if(n.app===e&&n.inspectorId===g){var a=n.nodeId;h(t,a),n.state=function(e,t,n){t="root"===n?t:t[n];var a=Object.keys(t),i={state:Object.keys(e.state).map(function(t){return{key:t,editable:!0,value:e.state[t]}})};if(a.length){var r=function(e){var t={};return Object.keys(e).forEach(function(n){var a=n.split("/");if(a.length>1){var i=t,r=a.pop();a.forEach(function(e){i[e]||(i[e]={_custom:{value:{},display:e,tooltip:"Module",abstract:!0}}),i=i[e]._custom.value}),i[r]=C(function(){return e[n]})}else t[n]=C(function(){return e[n]})}),t}(t);i.getters=Object.keys(r).map(function(e){return{key:e.endsWith("/")?k(e):e,editable:!1,value:C(function(){return r[e]})}})}return i}((i=t._modules,(o=(r=a).split("/").filter(function(e){return e})).reduce(function(e,t,n){var a=e[t];if(!a)throw new Error('Missing module "'+t+'" for path "'+r+'".');return n===o.length-1?a:a._children},"root"===r?i:i.root._children)),"root"===a?t.getters:t._makeLocalGettersCache,a)}var i,r,o}),n.on.editInspectorState(function(n){if(n.app===e&&n.inspectorId===g){var a=n.nodeId,i=n.path;"root"!==a&&(i=a.split("/").filter(Boolean).concat(i)),t._withCommit(function(){n.set(t._state.data,i,n.state.value)})}}),t.subscribe(function(e,t){var a={};e.payload&&(a.payload=e.payload),a.state=t,n.notifyComponentUpdate(),n.sendInspectorTree(g),n.sendInspectorState(g),n.addTimelineEvent({layerId:m,event:{time:Date.now(),title:e.type,data:a}})}),t.subscribeAction({before:function(e,t){var a={};e.payload&&(a.payload=e.payload),e._id=v++,e._time=Date.now(),a.state=t,n.addTimelineEvent({layerId:_,event:{time:e._time,title:e.type,groupId:e._id,subtitle:"start",data:a}})},after:function(e,t){var a={},i=Date.now()-e._time;a.duration={_custom:{type:"duration",display:i+"ms",tooltip:"Action duration",value:i}},e.payload&&(a.payload=e.payload),a.state=t,n.addTimelineEvent({layerId:_,event:{time:Date.now(),title:e.type,groupId:e._id,subtitle:"end",data:a}})}})})}var y=8702998,w={label:"namespaced",textColor:16777215,backgroundColor:6710886};function k(e){return e&&"root"!==e?e.split("/").slice(-2,-1)[0]:"Root"}function x(e,t){return{id:t||"root",label:k(t),tags:e.namespaced?[w]:[],children:Object.keys(e._children).map(function(n){return x(e._children[n],t+n+"/")})}}function S(e,t,n,a){a.includes(n)&&e.push({id:a||"root",label:a.endsWith("/")?a.slice(0,a.length-1):a||"Root",tags:t.namespaced?[w]:[]}),Object.keys(t._children).forEach(function(i){S(e,t._children[i],n,a+i+"/")})}function C(e){try{return e()}catch(e){return e}}var T=function(e,t){this.runtime=t,this._children=Object.create(null),this._rawModule=e;var n=e.state;this.state=("function"==typeof n?n():n)||{}},P={namespaced:{configurable:!0}};P.namespaced.get=function(){return!!this._rawModule.namespaced},T.prototype.addChild=function(e,t){this._children[e]=t},T.prototype.removeChild=function(e){delete this._children[e]},T.prototype.getChild=function(e){return this._children[e]},T.prototype.hasChild=function(e){return e in this._children},T.prototype.update=function(e){this._rawModule.namespaced=e.namespaced,e.actions&&(this._rawModule.actions=e.actions),e.mutations&&(this._rawModule.mutations=e.mutations),e.getters&&(this._rawModule.getters=e.getters)},T.prototype.forEachChild=function(e){r(this._children,e)},T.prototype.forEachGetter=function(e){this._rawModule.getters&&r(this._rawModule.getters,e)},T.prototype.forEachAction=function(e){this._rawModule.actions&&r(this._rawModule.actions,e)},T.prototype.forEachMutation=function(e){this._rawModule.mutations&&r(this._rawModule.mutations,e)},Object.defineProperties(T.prototype,P);var E=function(e){this.register([],e,!1)};function A(e,t,n){if(R(e,n),t.update(n),n.modules)for(var a in n.modules){if(!t.getChild(a))return void console.warn("[vuex] trying to add a new module '"+a+"' on hot reloading, manual reload is needed");A(e.concat(a),t.getChild(a),n.modules[a])}}E.prototype.get=function(e){return e.reduce(function(e,t){return e.getChild(t)},this.root)},E.prototype.getNamespace=function(e){var t=this.root;return e.reduce(function(e,n){return e+((t=t.getChild(n)).namespaced?n+"/":"")},"")},E.prototype.update=function(e){A([],this.root,e)},E.prototype.register=function(e,t,n){var a=this;void 0===n&&(n=!0),R(e,t);var i=new T(t,n);0===e.length?this.root=i:this.get(e.slice(0,-1)).addChild(e[e.length-1],i);t.modules&&r(t.modules,function(t,i){a.register(e.concat(i),t,n)})},E.prototype.unregister=function(e){var t=this.get(e.slice(0,-1)),n=e[e.length-1],a=t.getChild(n);a?a.runtime&&t.removeChild(n):console.warn("[vuex] trying to unregister module '"+n+"', which is not registered")},E.prototype.isRegistered=function(e){var t=this.get(e.slice(0,-1)),n=e[e.length-1];return!!t&&t.hasChild(n)};var L={assert:function(e){return"function"==typeof e},expected:"function"},M={getters:L,mutations:L,actions:{assert:function(e){return"function"==typeof e||"object"==typeof e&&"function"==typeof e.handler},expected:'function or object with "handler" function'}};function R(e,t){Object.keys(M).forEach(function(n){if(t[n]){var a=M[n];r(t[n],function(t,i){s(a.assert(t),function(e,t,n,a,i){var r=t+" should be "+i+' but "'+t+"."+n+'"';e.length>0&&(r+=' in module "'+e.join(".")+'"');return r+=" is "+JSON.stringify(a)+".",r}(e,n,i,t,a.expected))})}})}var z=function e(t){var n=this;void 0===t&&(t={}),s("undefined"!=typeof Promise,"vuex requires a Promise polyfill in this browser."),s(this instanceof e,"store must be called with the new operator.");var a=t.plugins;void 0===a&&(a=[]);var i=t.strict;void 0===i&&(i=!1);var r=t.devtools;this._committing=!1,this._actions=Object.create(null),this._actionSubscribers=[],this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._modules=new E(t),this._modulesNamespaceMap=Object.create(null),this._subscribers=[],this._makeLocalGettersCache=Object.create(null),this._scope=null,this._devtools=r;var o=this,l=this.dispatch,u=this.commit;this.dispatch=function(e,t){return l.call(o,e,t)},this.commit=function(e,t,n){return u.call(o,e,t,n)},this.strict=i;var h=this._modules.root.state;d(this,h,[],this._modules.root),c(this,h),a.forEach(function(e){return e(n)})},I={state:{configurable:!0}};z.prototype.install=function(e,n){e.provide(n||t,this),e.config.globalProperties.$store=this,(void 0===this._devtools||this._devtools)&&b(e,this)},I.state.get=function(){return this._state.data},I.state.set=function(e){s(!1,"use store.replaceState() to explicit replace store state.")},z.prototype.commit=function(e,t,n){var a=this,i=f(e,t,n),r=i.type,o=i.payload,s=i.options,l={type:r,payload:o},u=this._mutations[r];u?(this._withCommit(function(){u.forEach(function(e){e(o)})}),this._subscribers.slice().forEach(function(e){return e(l,a.state)}),s&&s.silent&&console.warn("[vuex] mutation type: "+r+". Silent option has been removed. Use the filter functionality in the vue-devtools")):console.error("[vuex] unknown mutation type: "+r)},z.prototype.dispatch=function(e,t){var n=this,a=f(e,t),i=a.type,r=a.payload,o={type:i,payload:r},s=this._actions[i];if(s){try{this._actionSubscribers.slice().filter(function(e){return e.before}).forEach(function(e){return e.before(o,n.state)})}catch(e){console.warn("[vuex] error in before action subscribers: "),console.error(e)}var l=s.length>1?Promise.all(s.map(function(e){return e(r)})):s[0](r);return new Promise(function(e,t){l.then(function(t){try{n._actionSubscribers.filter(function(e){return e.after}).forEach(function(e){return e.after(o,n.state)})}catch(e){console.warn("[vuex] error in after action subscribers: "),console.error(e)}e(t)},function(e){try{n._actionSubscribers.filter(function(e){return e.error}).forEach(function(t){return t.error(o,n.state,e)})}catch(e){console.warn("[vuex] error in error action subscribers: "),console.error(e)}t(e)})})}console.error("[vuex] unknown action type: "+i)},z.prototype.subscribe=function(e,t){return l(e,this._subscribers,t)},z.prototype.subscribeAction=function(e,t){return l("function"==typeof e?{before:e}:e,this._actionSubscribers,t)},z.prototype.watch=function(t,n,a){var i=this;return s("function"==typeof t,"store.watch only accepts a function."),e.watch(function(){return t(i.state,i.getters)},n,Object.assign({},a))},z.prototype.replaceState=function(e){var t=this;this._withCommit(function(){t._state.data=e})},z.prototype.registerModule=function(e,t,n){void 0===n&&(n={}),"string"==typeof e&&(e=[e]),s(Array.isArray(e),"module path must be a string or an Array."),s(e.length>0,"cannot register the root module by using registerModule."),this._modules.register(e,t),d(this,this.state,e,this._modules.get(e),n.preserveState),c(this,this.state)},z.prototype.unregisterModule=function(e){var t=this;"string"==typeof e&&(e=[e]),s(Array.isArray(e),"module path must be a string or an Array."),this._modules.unregister(e),this._withCommit(function(){delete p(t.state,e.slice(0,-1))[e[e.length-1]]}),u(this)},z.prototype.hasModule=function(e){return"string"==typeof e&&(e=[e]),s(Array.isArray(e),"module path must be a string or an Array."),this._modules.isRegistered(e)},z.prototype.hotUpdate=function(e){this._modules.update(e),u(this,!0)},z.prototype._withCommit=function(e){var t=this._committing;this._committing=!0,e(),this._committing=t},Object.defineProperties(z.prototype,I);var N=F(function(e,t){var n={};return B(t)||console.error("[vuex] mapState: mapper parameter must be either an Array or an Object"),q(t).forEach(function(t){var a=t.key,i=t.val;n[a]=function(){var t=this.$store.state,n=this.$store.getters;if(e){var a=V(this.$store,"mapState",e);if(!a)return;t=a.context.state,n=a.context.getters}return"function"==typeof i?i.call(this,t,n):t[i]},n[a].vuex=!0}),n}),O=F(function(e,t){var n={};return B(t)||console.error("[vuex] mapMutations: mapper parameter must be either an Array or an Object"),q(t).forEach(function(t){var a=t.key,i=t.val;n[a]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var a=this.$store.commit;if(e){var r=V(this.$store,"mapMutations",e);if(!r)return;a=r.context.commit}return"function"==typeof i?i.apply(this,[a].concat(t)):a.apply(this.$store,[i].concat(t))}}),n}),j=F(function(e,t){var n={};return B(t)||console.error("[vuex] mapGetters: mapper parameter must be either an Array or an Object"),q(t).forEach(function(t){var a=t.key,i=t.val;i=e+i,n[a]=function(){if(!e||V(this.$store,"mapGetters",e)){if(i in this.$store.getters)return this.$store.getters[i];console.error("[vuex] unknown getter: "+i)}},n[a].vuex=!0}),n}),D=F(function(e,t){var n={};return B(t)||console.error("[vuex] mapActions: mapper parameter must be either an Array or an Object"),q(t).forEach(function(t){var a=t.key,i=t.val;n[a]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var a=this.$store.dispatch;if(e){var r=V(this.$store,"mapActions",e);if(!r)return;a=r.context.dispatch}return"function"==typeof i?i.apply(this,[a].concat(t)):a.apply(this.$store,[i].concat(t))}}),n});function q(e){return B(e)?Array.isArray(e)?e.map(function(e){return{key:e,val:e}}):Object.keys(e).map(function(t){return{key:t,val:e[t]}}):[]}function B(e){return Array.isArray(e)||o(e)}function F(e){return function(t,n){return"string"!=typeof t?(n=t,t=""):"/"!==t.charAt(t.length-1)&&(t+="/"),e(t,n)}}function V(e,t,n){var a=e._modulesNamespaceMap[n];return a||console.error("[vuex] module namespace not found in "+t+"(): "+n),a}function U(e,t,n){var a=n?e.groupCollapsed:e.group;try{a.call(e,t)}catch(n){e.log(t)}}function $(e){try{e.groupEnd()}catch(t){e.log("—— log end ——")}}function H(){var e=new Date;return" @ "+W(e.getHours(),2)+":"+W(e.getMinutes(),2)+":"+W(e.getSeconds(),2)+"."+W(e.getMilliseconds(),3)}function W(e,t){return n="0",a=t-e.toString().length,new Array(a+1).join(n)+e;var n,a}return{version:"4.1.0",Store:z,storeKey:t,createStore:function(e){return new z(e)},useStore:function(n){return void 0===n&&(n=null),e.inject(null!==n?n:t)},mapState:N,mapMutations:O,mapGetters:j,mapActions:D,createNamespacedHelpers:function(e){return{mapState:N.bind(null,e),mapGetters:j.bind(null,e),mapMutations:O.bind(null,e),mapActions:D.bind(null,e)}},createLogger:function(e){void 0===e&&(e={});var t=e.collapsed;void 0===t&&(t=!0);var n=e.filter;void 0===n&&(n=function(e,t,n){return!0});var a=e.transformer;void 0===a&&(a=function(e){return e});var r=e.mutationTransformer;void 0===r&&(r=function(e){return e});var o=e.actionFilter;void 0===o&&(o=function(e,t){return!0});var s=e.actionTransformer;void 0===s&&(s=function(e){return e});var l=e.logMutations;void 0===l&&(l=!0);var u=e.logActions;void 0===u&&(u=!0);var c=e.logger;return void 0===c&&(c=console),function(e){var d=i(e.state);void 0!==c&&(l&&e.subscribe(function(e,o){var s=i(o);if(n(e,d,s)){var l=H(),u=r(e),h="mutation "+e.type+l;U(c,h,t),c.log("%c prev state","color: #9E9E9E; font-weight: bold",a(d)),c.log("%c mutation","color: #03A9F4; font-weight: bold",u),c.log("%c next state","color: #4CAF50; font-weight: bold",a(s)),$(c)}d=s}),u&&e.subscribeAction(function(e,n){if(o(e,n)){var a=H(),i=s(e),r="action "+e.type+a;U(c,r,t),c.log("%c action","color: #03A9F4; font-weight: bold",i),$(c)}}))}}}}(Vue),VueI18n=function(e,t){"use strict";var n=function(e){var t=Object.create(null);if(e)for(var n in e)t[n]=e[n];return t.default=e,Object.freeze(t)}(t);function a(e,t){"undefined"!=typeof console&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const i="undefined"!=typeof window,r=(e,t=!1)=>t?Symbol.for(e):Symbol(e),o=(e,t,n)=>s({l:e,k:t,s:n}),s=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),l=e=>"number"==typeof e&&isFinite(e),u=e=>"[object Date]"===C(e),c=e=>"[object RegExp]"===C(e),d=e=>T(e)&&0===Object.keys(e).length,h=Object.assign,p=Object.create,f=(e=null)=>p(e);function m(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/").replace(/=/g,"=")}function _(e){return e.replace(/&(?![a-zA-Z0-9#]{2,6};)/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}const g=Object.prototype.hasOwnProperty;function v(e,t){return g.call(e,t)}const b=Array.isArray,y=e=>"function"==typeof e,w=e=>"string"==typeof e,k=e=>"boolean"==typeof e,x=e=>null!==e&&"object"==typeof e,S=Object.prototype.toString,C=e=>S.call(e),T=e=>"[object Object]"===C(e);function P(e,t=""){return e.reduce((e,n,a)=>0===a?e+n:e+t+n,"")}const E=e=>!x(e)||b(e);function A(e,t){if(E(e)||E(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:e,des:t}=n.pop();Object.keys(e).forEach(a=>{"__proto__"!==a&&(x(e[a])&&!x(t[a])&&(t[a]=Array.isArray(e[a])?[]:f()),E(t[a])||E(e[a])?t[a]=e[a]:n.push({src:e[a],des:t[a]}))})}}function L(e){throw e}const M=" ",R="\n",z=String.fromCharCode(8232),I=String.fromCharCode(8233);function N(e){const t=e;let n=0,a=1,i=1,r=0;const o=e=>"\r"===t[e]&&t[e+1]===R,s=e=>t[e]===I,l=e=>t[e]===z,u=e=>o(e)||s(e)||l(e)?R:t[e];function c(){return r=0,(e=>o(e)||(e=>t[e]===R)(e)||s(e)||l(e))(n)&&(a++,i=0),o(n)&&n++,n++,i++,t[n]}return{index:()=>n,line:()=>a,column:()=>i,peekOffset:()=>r,charAt:u,currentChar:()=>u(n),currentPeek:()=>u(n+r),next:c,peek:function(){return o(n+r)&&r++,r++,t[n+r]},reset:function(){n=0,a=1,i=1,r=0},resetPeek:function(e=0){r=e},skipToPeek:function(){const e=n+r;for(;e!==n;)c();r=0}}}const O=void 0;function j(e,t={}){const n=!1!==t.location,a=N(e),i=()=>a.index(),r=()=>({line:a.line(),column:a.column(),offset:a.index()}),o=r(),s=i(),l={currentType:13,offset:s,startLoc:o,endLoc:o,lastType:13,lastOffset:s,lastStartLoc:o,lastEndLoc:o,braceNest:0,inLinked:!1,text:""},{onError:u}=t;function c(e,t,a){e.endLoc=r(),e.currentType=t;const i={type:t};return n&&(i.loc=function(e,t){return{start:e,end:t}}(e.startLoc,e.endLoc)),null!=a&&(i.value=a),i}const d=e=>c(e,13);function h(e,t){return e.currentChar()===t?(e.next(),t):(r(),"")}function p(e){let t="";for(;e.currentPeek()===M||e.currentPeek()===R;)t+=e.currentPeek(),e.peek();return t}function f(e){const t=p(e);return e.skipToPeek(),t}function m(e){if(e===O)return!1;const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||95===t}function _(e){p(e);const t="|"===e.currentPeek();return e.resetPeek(),t}function g(e,t=!0){const n=(t=!1,a="")=>{const i=e.currentPeek();return"{"===i?t:"@"!==i&&i?"|"===i?!(a===M||a===R):i===M?(e.peek(),n(!0,M)):i!==R||(e.peek(),n(!0,R)):t},a=n();return t&&e.resetPeek(),a}function v(e,t){const n=e.currentChar();return n===O?O:t(n)?(e.next(),n):null}function b(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t}function y(e){return v(e,b)}function w(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t||45===t}function k(e){return v(e,w)}function x(e){const t=e.charCodeAt(0);return t>=48&&t<=57}function S(e){return v(e,x)}function C(e){const t=e.charCodeAt(0);return t>=48&&t<=57||t>=65&&t<=70||t>=97&&t<=102}function T(e){return v(e,C)}function P(e){let t="",n="";for(;t=S(e);)n+=t;return n}function E(e){return"'"!==e&&e!==R}function A(e){const t=e.currentChar();switch(t){case"\\":case"'":return e.next(),`\\${t}`;case"u":return L(e,t,4);case"U":return L(e,t,6);default:return r(),""}}function L(e,t,n){h(e,t);let a="";for(let t=0;t=1&&r(),e.next(),n=c(t,2,"{"),f(e),t.braceNest++,n;case"}":return t.braceNest>0&&2===t.currentType&&r(),e.next(),n=c(t,3,"}"),t.braceNest--,t.braceNest>0&&f(e),t.inLinked&&0===t.braceNest&&(t.inLinked=!1),n;case"@":return t.braceNest>0&&r(),n=q(e,t)||d(t),t.braceNest=0,n;default:{let a=!0,i=!0,o=!0;if(_(e))return t.braceNest>0&&r(),n=c(t,1,j(e)),t.braceNest=0,t.inLinked=!1,n;if(t.braceNest>0&&(4===t.currentType||5===t.currentType||6===t.currentType))return r(),t.braceNest=0,B(e,t);if(a=function(e,t){const{currentType:n}=t;if(2!==n)return!1;p(e);const a=m(e.currentPeek());return e.resetPeek(),a}(e,t))return n=c(t,4,function(e){f(e);let t="",n="";for(;t=k(e);)n+=t;const a=e.currentChar();if(a&&"}"!==a&&a!==O&&a!==M&&a!==R&&" "!==a){const t=I(e);return r(),n+t}return e.currentChar()===O&&r(),n}(e)),f(e),n;if(i=function(e,t){const{currentType:n}=t;if(2!==n)return!1;p(e);const a=function(e){if(e===O)return!1;const t=e.charCodeAt(0);return t>=48&&t<=57}("-"===e.currentPeek()?e.peek():e.currentPeek());return e.resetPeek(),a}(e,t))return n=c(t,5,function(e){f(e);let t="";return"-"===e.currentChar()?(e.next(),t+=`-${P(e)}`):t+=P(e),e.currentChar()===O&&r(),t}(e)),f(e),n;if(o=function(e,t){const{currentType:n}=t;if(2!==n)return!1;p(e);const a="'"===e.currentPeek();return e.resetPeek(),a}(e,t))return n=c(t,6,function(e){f(e),h(e,"'");let t="",n="";for(;t=v(e,E);)n+="\\"===t?A(e):t;const a=e.currentChar();return a===R||a===O?(r(),a===R&&(e.next(),h(e,"'")),n):(h(e,"'"),n)}(e)),f(e),n;if(!a&&!i&&!o)return n=c(t,12,I(e)),r(),n.value,f(e),n;break}}return n}function q(e,t){const{currentType:n}=t;let a=null;const i=e.currentChar();switch(7!==n&&8!==n&&11!==n&&9!==n||i!==R&&i!==M||r(),i){case"@":return e.next(),a=c(t,7,"@"),t.inLinked=!0,a;case".":return f(e),e.next(),c(t,8,".");case":":return f(e),e.next(),c(t,9,":");default:return _(e)?(a=c(t,1,j(e)),t.braceNest=0,t.inLinked=!1,a):function(e,t){const{currentType:n}=t;if(7!==n)return!1;p(e);const a="."===e.currentPeek();return e.resetPeek(),a}(e,t)||function(e,t){const{currentType:n}=t;if(7!==n&&11!==n)return!1;p(e);const a=":"===e.currentPeek();return e.resetPeek(),a}(e,t)?(f(e),q(e,t)):function(e,t){const{currentType:n}=t;if(8!==n)return!1;p(e);const a=m(e.currentPeek());return e.resetPeek(),a}(e,t)?(f(e),c(t,11,function(e){let t="",n="";for(;t=y(e);)n+=t;return n}(e))):function(e,t){const{currentType:n}=t;if(9!==n)return!1;const a=()=>{const t=e.currentPeek();return"{"===t?m(e.peek()):!("@"===t||"|"===t||":"===t||"."===t||t===M||!t)&&(t===R?(e.peek(),a()):g(e,!1))},i=a();return e.resetPeek(),i}(e,t)?(f(e),"{"===i?D(e,t)||a:c(t,10,function(e){const t=n=>{const a=e.currentChar();return"{"!==a&&"@"!==a&&"|"!==a&&"("!==a&&")"!==a&&a?a===M?n:(n+=a,e.next(),t(n)):n};return t("")}(e))):(7===n&&r(),t.braceNest=0,t.inLinked=!1,B(e,t))}}function B(e,t){let n={type:13};if(t.braceNest>0)return D(e,t)||d(t);if(t.inLinked)return q(e,t)||d(t);switch(e.currentChar()){case"{":return D(e,t)||d(t);case"}":return r(),e.next(),c(t,3,"}");case"@":return q(e,t)||d(t);default:if(_(e))return n=c(t,1,j(e)),t.braceNest=0,t.inLinked=!1,n;if(g(e))return c(t,0,function(e){let t="";for(;;){const n=e.currentChar();if("\\"===n){const a=e.peek();"{"===a||"}"===a||"@"===a||"|"===a||"\\"===a?(t+=n+a,e.next(),e.next()):(e.resetPeek(),t+=n,e.next())}else{if("{"===n||"}"===n||"@"===n||"|"===n||!n)break;if(n===M||n===R)if(g(e))t+=n,e.next();else{if(_(e))break;t+=n,e.next()}else t+=n,e.next()}}return t}(e))}return n}return{nextToken:function(){const{currentType:e,offset:t,startLoc:n,endLoc:o}=l;return l.lastType=e,l.lastOffset=t,l.lastStartLoc=n,l.lastEndLoc=o,l.offset=i(),l.startLoc=r(),a.currentChar()===O?c(l,13):B(a,l)},currentOffset:i,currentPosition:r,context:()=>l}}const D=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g,q=/\\([\\@{}|])/g;function B(e,t){return t}function F(e,t,n){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const e=parseInt(t||n,16);return e<=55295||e>=57344?String.fromCodePoint(e):"�"}}}function V(e={}){const t=!1!==e.location,{onError:n}=e;function a(e,n,a){const i={type:e};return t&&(i.start=n,i.end=n,i.loc={start:a,end:a}),i}function i(e,n,a,i){t&&(e.end=n,e.loc&&(e.loc.end=a))}function r(e,t){const n=e.context(),r=a(3,n.offset,n.startLoc);return r.value=t.replace(q,B),i(r,e.currentOffset(),e.currentPosition()),r}function o(e,t){const n=e.context(),{lastOffset:r,lastStartLoc:o}=n,s=a(5,r,o);return s.index=parseInt(t,10),e.nextToken(),i(s,e.currentOffset(),e.currentPosition()),s}function s(e,t){const n=e.context(),{lastOffset:r,lastStartLoc:o}=n,s=a(4,r,o);return s.key=t,e.nextToken(),i(s,e.currentOffset(),e.currentPosition()),s}function l(e,t){const n=e.context(),{lastOffset:r,lastStartLoc:o}=n,s=a(9,r,o);return s.value=t.replace(D,F),e.nextToken(),i(s,e.currentOffset(),e.currentPosition()),s}function u(e){const t=e.context(),n=a(6,t.offset,t.startLoc);let r=e.nextToken();if(8===r.type){const t=function(e){const t=e.nextToken(),n=e.context(),{lastOffset:r,lastStartLoc:o}=n,s=a(8,r,o);return 11!==t.type?(n.lastStartLoc,s.value="",i(s,r,o),{nextConsumeToken:t,node:s}):(null==t.value&&(n.lastStartLoc,U(t)),s.value=t.value||"",i(s,e.currentOffset(),e.currentPosition()),{node:s})}(e);n.modifier=t.node,r=t.nextConsumeToken||e.nextToken()}switch(9!==r.type&&(t.lastStartLoc,U(r)),r=e.nextToken(),2===r.type&&(r=e.nextToken()),r.type){case 10:null==r.value&&(t.lastStartLoc,U(r)),n.key=function(e,t){const n=e.context(),r=a(7,n.offset,n.startLoc);return r.value=t,i(r,e.currentOffset(),e.currentPosition()),r}(e,r.value||"");break;case 4:null==r.value&&(t.lastStartLoc,U(r)),n.key=s(e,r.value||"");break;case 5:null==r.value&&(t.lastStartLoc,U(r)),n.key=o(e,r.value||"");break;case 6:null==r.value&&(t.lastStartLoc,U(r)),n.key=l(e,r.value||"");break;default:{t.lastStartLoc;const o=e.context(),s=a(7,o.offset,o.startLoc);return s.value="",i(s,o.offset,o.startLoc),n.key=s,i(n,o.offset,o.startLoc),{nextConsumeToken:r,node:n}}}return i(n,e.currentOffset(),e.currentPosition()),{node:n}}function c(e){const t=e.context(),n=a(2,1===t.currentType?e.currentOffset():t.offset,1===t.currentType?t.endLoc:t.startLoc);n.items=[];let c=null;do{const a=c||e.nextToken();switch(c=null,a.type){case 0:null==a.value&&(t.lastStartLoc,U(a)),n.items.push(r(e,a.value||""));break;case 5:null==a.value&&(t.lastStartLoc,U(a)),n.items.push(o(e,a.value||""));break;case 4:null==a.value&&(t.lastStartLoc,U(a)),n.items.push(s(e,a.value||""));break;case 6:null==a.value&&(t.lastStartLoc,U(a)),n.items.push(l(e,a.value||""));break;case 7:{const t=u(e);n.items.push(t.node),c=t.nextConsumeToken||null;break}}}while(13!==t.currentType&&1!==t.currentType);return i(n,1===t.currentType?t.lastOffset:e.currentOffset(),1===t.currentType?t.lastEndLoc:e.currentPosition()),n}return{parse:function(n){const r=j(n,h({},e)),o=r.context(),s=a(0,o.offset,o.startLoc);return t&&s.loc&&(s.loc.source=n),s.body=function(e){const t=e.context(),{offset:n,startLoc:r}=t,o=c(e);return 13===t.currentType?o:function(e,t,n,r){const o=e.context();let s=0===r.items.length;const l=a(1,t,n);l.cases=[],l.cases.push(r);do{const t=c(e);s||(s=0===t.items.length),l.cases.push(t)}while(13!==o.currentType);return i(l,e.currentOffset(),e.currentPosition()),l}(e,n,r,o)}(r),e.onCacheKey&&(s.cacheKey=e.onCacheKey(n)),13!==o.currentType&&(o.lastStartLoc,n[o.offset]),i(s,r.currentOffset(),r.currentPosition()),s}}}function U(e){if(13===e.type)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function $(e,t){for(let n=0;n1){e.push(`${n("plural")}([`),e.indent(a());const i=t.cases.length;for(let n=0;n{const n=w(t.mode)?t.mode:"normal",a=w(t.filename)?t.filename:"message.intl",i=!!t.sourceMap,r=null!=t.breakLineCode?t.breakLineCode:"arrow"===n?";":"\n",o=t.needIndent?t.needIndent:"arrow"!==n,s=e.helpers||[],l=function(e,t){const{sourceMap:n,filename:a,breakLineCode:i,needIndent:r}=t,o={filename:a,code:"",column:1,line:1,offset:0,map:void 0,breakLineCode:i,needIndent:r,indentLevel:0};function s(e,t){o.code+=e}function l(e,t=!0){const n=t?i:"";s(r?n+" ".repeat(e):n)}return!1!==t.location&&e.loc&&(o.source=e.loc.source),{context:()=>o,push:s,indent:function(e=!0){const t=++o.indentLevel;e&&l(t)},deindent:function(e=!0){const t=--o.indentLevel;e&&l(t)},newline:function(){l(o.indentLevel)},helper:e=>`_${e}`,needIndent:()=>o.needIndent}}(e,{mode:n,filename:a,sourceMap:i,breakLineCode:r,needIndent:o});l.push("normal"===n?"function __msg__ (ctx) {":"(ctx) => {"),l.indent(o),s.length>0&&(l.push(`const { ${P(s.map(e=>`${e}: _${e}`),", ")} } = ctx`),l.newline()),l.push("return "),K(l,e),l.deindent(o),l.push("}"),delete e.helpers;const{code:u,map:c}=l.context();return{ast:e,code:u,map:c?c.toJSON():void 0}};function Q(e,t={}){const n=h({},t),a=!!n.jit,i=!!n.minify,r=null==n.optimize||n.optimize,o=V(n).parse(e);return a?(r&&function(e){const t=e.body;2===t.type?W(t):t.cases.forEach(e=>W(e))}(o),i&&G(o),{ast:o,code:""}):(function(e){const t=function(e){const t={ast:e,helpers:new Set};return{context:()=>t,helper:e=>(t.helpers.add(e),e)}}(e);t.helper("normalize"),e.body&&H(e.body,t);const n=t.context();e.helpers=Array.from(n.helpers)}(o,n),Y(o,n))}function Z(e){return x(e)&&0===ae(e)&&(v(e,"b")||v(e,"body"))}const J=["b","body"],X=["c","cases"],ee=["s","static"],te=["i","items"],ne=["t","type"];function ae(e){return se(e,ne)}const ie=["v","value"];const re=["m","modifier"],oe=["k","key"];function se(e,t,n){for(let n=0;nfunction(e,t){const n=se(t,J);if(null==n)throw ue(0);if(1===ae(n)){const t=function(e){return se(e,X,[])}(n);return e.plural(t.reduce((t,n)=>[...t,de(e,n)],[]))}return de(e,n)}(t,e)}function de(e,t){const n=function(e){return se(e,ee)}(t);if(null!=n)return"text"===e.type?n:e.normalize([n]);{const n=function(e){return se(e,te,[])}(t).reduce((t,n)=>[...t,he(e,n)],[]);return e.normalize(n)}}function he(e,t){const n=ae(t);switch(n){case 3:case 9:case 7:case 8:return function(e,t){const n=se(e,ie);if(null!=n)return n;throw ue(t)}(t,n);case 4:{const a=t;if(v(a,"k")&&a.k)return e.interpolate(e.named(a.k));if(v(a,"key")&&a.key)return e.interpolate(e.named(a.key));throw ue(n)}case 5:{const a=t;if(v(a,"i")&&l(a.i))return e.interpolate(e.list(a.i));if(v(a,"index")&&l(a.index))return e.interpolate(e.list(a.index));throw ue(n)}case 6:{const n=t,a=function(e){return se(e,re)}(n),i=function(e){const t=se(e,oe);if(t)return t;throw ue(6)}(n);return e.linked(he(e,i),a?he(e,a):void 0,e.type)}default:throw new Error(`unhandled node on format message part: ${n}`)}}const pe=e=>e;let fe=f();const me=17,_e=18,ge=19,ve=21,be=22,ye=23;function we(e,t){return null!=t.locale?xe(t.locale):xe(e.locale)}let ke;function xe(e){if(w(e))return e;if(y(e)){if(e.resolvedOnce&&null!=ke)return ke;if("Function"===e.constructor.name){const t=e();if((e=>x(e)&&y(e.then)&&y(e.catch))(t))throw Error(ve);return ke=t}throw Error(be)}throw Error(ye)}function Se(e,t,n){return[...new Set([n,...b(t)?t:x(t)?Object.keys(t):w(t)?[t]:[n]])]}function Ce(e,t,n){const a=w(n)?n:Ie,i=e;i.__localeChainCache||(i.__localeChainCache=new Map);let r=i.__localeChainCache.get(a);if(!r){r=[];let e=[n];for(;b(e);)e=Te(r,e,t);const o=b(t)||!T(t)?t:t.default?t.default:null;e=w(o)?[o]:o,b(e)&&Te(r,e,!1),i.__localeChainCache.set(a,r)}return r}function Te(e,t,n){let a=!0;for(let i=0;i`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;let Oe,je,De,qe=null;const Be=e=>{qe=e};let Fe=0;function Ve(e={}){const t=y(e.onWarn)?e.onWarn:a,n=w(e.version)?e.version:"11.4.2",i=w(e.locale)||y(e.locale)?e.locale:Ie,r=y(i)?Ie:i,o=b(e.fallbackLocale)||T(e.fallbackLocale)||w(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:r,s=T(e.messages)?e.messages:Ue(r),l=T(e.datetimeFormats)?e.datetimeFormats:Ue(r),u=T(e.numberFormats)?e.numberFormats:Ue(r),d=h(f(),e.modifiers,{upper:(e,t)=>"text"===t&&w(e)?e.toUpperCase():"vnode"===t&&x(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>"text"===t&&w(e)?e.toLowerCase():"vnode"===t&&x(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>"text"===t&&w(e)?Ne(e):"vnode"===t&&x(e)&&"__v_isVNode"in e?Ne(e.children):e}),p=e.pluralRules||f(),m=y(e.missing)?e.missing:null,_=!k(e.missingWarn)&&!c(e.missingWarn)||e.missingWarn,g=!k(e.fallbackWarn)&&!c(e.fallbackWarn)||e.fallbackWarn,v=!!e.fallbackFormat,S=!!e.unresolving,C=y(e.postTranslation)?e.postTranslation:null,P=T(e.processor)?e.processor:null,E=!k(e.warnHtmlMessage)||e.warnHtmlMessage,A=!!e.escapeParameter,L=y(e.messageCompiler)?e.messageCompiler:Oe,M=y(e.messageResolver)?e.messageResolver:je||ze,R=y(e.localeFallbacker)?e.localeFallbacker:De||Se,z=x(e.fallbackContext)?e.fallbackContext:void 0,I=e,N=x(I.__datetimeFormatters)?I.__datetimeFormatters:new Map,O=x(I.__numberFormatters)?I.__numberFormatters:new Map,j=x(I.__meta)?I.__meta:{};Fe++;const D={version:n,cid:Fe,locale:i,fallbackLocale:o,messages:s,modifiers:d,pluralRules:p,missing:m,missingWarn:_,fallbackWarn:g,fallbackFormat:v,unresolving:S,postTranslation:C,processor:P,warnHtmlMessage:E,escapeParameter:A,messageCompiler:L,messageResolver:M,localeFallbacker:R,fallbackContext:z,onWarn:t,__meta:j};return D.datetimeFormats=l,D.numberFormats=u,D.__datetimeFormatters=N,D.__numberFormatters=O,D}const Ue=e=>({[e]:f()});function $e(e,t,n,a,i){const{missing:r,onWarn:o}=e;if(null!==r){const a=r(e,n,t,i);return w(a)?a:t}return t}function He(e,t,n){e.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function We(e,t){const n=t.indexOf(e);if(-1===n)return!1;for(let r=n+1;r{Ke.includes(e)?s[e]=n[e]:r[e]=n[e]}),w(a)?r.locale=a:T(a)&&(s=a),T(i)&&(s=i),[r.key||"",o,r,s]}function Qe(e,t,n){const a=e;for(const e in n){const n=`${t}__${e}`;a.__datetimeFormatters.has(n)&&a.__datetimeFormatters.delete(n)}}function Ze(e,...t){const{numberFormats:n,unresolving:a,fallbackLocale:i,onWarn:r,localeFallbacker:o}=e,{__numberFormatters:s}=e;if(!l(t[0]))return"";const[u,c,p,f]=Xe(...t);k(p.missingWarn)?p.missingWarn:e.missingWarn,k(p.fallbackWarn)?p.fallbackWarn:e.fallbackWarn;const m=!!p.part,_=we(e,p),g=o(e,i,_);if(!w(u)||""===u)return new Intl.NumberFormat(_.replace(/!/g,""),f).format(c);let v,b={},y=null;for(let t=0;t{Je.includes(e)?o[e]=n[e]:r[e]=n[e]}),w(a)?r.locale=a:T(a)&&(o=a),T(i)&&(o=i),[r.key||"",s,r,o]}function et(e,t,n){const a=e;for(const e in n){const n=`${t}__${e}`;a.__numberFormatters.has(n)&&a.__numberFormatters.delete(n)}}const tt=e=>e,nt=e=>"",at=e=>0===e.length?"":P(e),it=e=>null==e?"":b(e)||T(e)&&e.toString===S?JSON.stringify(e,null,2):String(e);function rt(e,t){return e=Math.abs(e),2===t?1===e?0:1:Math.min(e,2)}function ot(e={}){const t=e.locale,n=function(e){const t=l(e.pluralIndex)?e.pluralIndex:-1;return l(e.named?.count)?e.named.count:l(e.named?.n)?e.named.n:t}(e),a=w(t)&&y(e.pluralRules?.[t])?e.pluralRules[t]:rt,i=a===rt?void 0:rt,r=e.list||[],o=e.named||f();function s(t,n){return(y(e.messages)?e.messages(t,!!n):!!x(e.messages)&&e.messages[t])||(e.parent?e.parent.message(t):nt)}l(e.pluralIndex)&&(o.count||=e.pluralIndex,o.n||=e.pluralIndex);const u=y(e.processor?.normalize)?e.processor.normalize:at,c=y(e.processor?.interpolate)?e.processor.interpolate:it,d={list:e=>r[e],named:e=>o[e],plural:e=>e[a(n,e.length,i)],linked:(t,...n)=>{const[a,i]=n;let r="text",o="";1===n.length?x(a)?(o=a.modifier||o,r=a.type||r):w(a)&&(o=a||o):2===n.length&&(w(a)&&(o=a||o),w(i)&&(r=i||r));const l=s(t,!0)(d),u=""===l||void 0===l?t:l,c="vnode"===r&&b(u)&&o?u[0]:u;return o?(h=o,e.modifiers?e.modifiers[h]:tt)(c,r):c;var h},message:s,type:w(e.processor?.type)?e.processor.type:"text",interpolate:c,normalize:u,values:h(f(),r,o)};return d}const st=()=>"",lt=e=>y(e);function ut(e,...t){const{fallbackFormat:n,postTranslation:a,unresolving:i,messageCompiler:r,fallbackLocale:o,messages:s}=e,[u,c]=ht(...t),d=k(c.missingWarn)?c.missingWarn:e.missingWarn,h=k(c.fallbackWarn)?c.fallbackWarn:e.fallbackWarn,p=k(c.escapeParameter)?c.escapeParameter:e.escapeParameter,g=!!c.resolvedMessage,v=w(c.default)||k(c.default)?k(c.default)?r?u:()=>u:c.default:n?r?u:()=>u:null,S=n||null!=v&&(w(v)||y(v)),C=we(e,c);p&&function(e){b(e.list)?e.list=e.list.map(e=>w(e)?m(e):e):x(e.named)&&Object.keys(e.named).forEach(t=>{w(e.named[t])&&(e.named[t]=m(e.named[t]))})}(c);let[T,P,E]=g?[u,C,s[C]||f()]:ct(e,u,C,o,h,d),A=T,L=u;if(g||w(A)||Z(A)||lt(A)||S&&(A=v,L=A),!(g||(w(A)||Z(A)||lt(A))&&w(P)))return i?-1:u;let M=!1;const R=lt(A)?A:dt(e,u,P,A,L,()=>{M=!0});if(M)return A;const z=function(e,t,n,a){const{modifiers:i,pluralRules:r,messageResolver:o,fallbackLocale:s,fallbackWarn:u,missingWarn:c,fallbackContext:d}=e,h={locale:t,modifiers:i,pluralRules:r,messages:(a,i)=>{let r=o(n,a);if(null==r&&(d||i)){const[n,,i]=ct(d||e,a,t,s,u,c);r=n??o(i,a)}if(w(r)||Z(r)){let n=!1;const i=dt(e,a,t,r,a,()=>{n=!0});return n?st:i}return lt(r)?r:st}};return e.processor&&(h.processor=e.processor),a.list&&(h.list=a.list),a.named&&(h.named=a.named),l(a.plural)&&(h.pluralIndex=a.plural),h}(e,P,E,c),I=function(e,t,n){return t(n)}(0,R,ot(z));let N=a?a(I,u):I;var O;return p&&w(N)&&(O=(O=(O=N).replace(/(\w+)\s*=\s*"([^"]*)"/g,(e,t,n)=>`${t}="${_(n)}"`)).replace(/(\w+)\s*=\s*'([^']*)'/g,(e,t,n)=>`${t}='${_(n)}'`),/\s*on\w+\s*=\s*["']?[^"'>]+["']?/gi.test(O)&&(O=O.replace(/(\s+)(on)(\w+\s*=)/gi,"$1on$3")),[/(\s+(?:href|src|action|formaction)\s*=\s*["']?)\s*javascript:/gi,/(style\s*=\s*["'][^"']*url\s*\(\s*)javascript:/gi].forEach(e=>{O=O.replace(e,"$1javascript:")}),N=O),N}function ct(e,t,n,a,i,r){const{messages:o,onWarn:s,messageResolver:l,localeFallbacker:u}=e,c=u(e,a,n);let d,h=f(),p=null;for(let n=0;na;return e.locale=n,e.key=t,e}const u=s(a,function(e,t,n,a,i,r){return{locale:t,key:n,warnHtmlMessage:i,onError:e=>{throw r&&r(e),e},onCacheKey:e=>o(t,n,e)}}(0,n,i,0,l,r));return u.locale=n,u.key=t,u.source=a,u}function ht(...e){const[t,n,a]=e,i=f();if(!(w(t)||l(t)||lt(t)||Z(t)))throw Error(me);const r=l(t)?String(t):(lt(t),t);return l(n)?i.plural=n:w(n)?i.default=n:T(n)&&!d(n)?i.named=n:b(n)&&(i.list=n),l(a)?i.plural=a:w(a)?i.default=a:T(a)&&h(i,a),[r,i]}const pt="11.4.2",ft=24,mt=25,_t=26,gt=27,vt=28,bt=29,yt=31,wt=32,kt=34,xt=r("__translateVNode"),St=r("__datetimeParts"),Ct=r("__numberParts"),Tt=r("__setPluralRules"),Pt=r("__injectWithOption"),Et=r("__dispose");function At(e){if(!x(e))return e;if(Z(e))return e;for(const t in e)if(v(e,t))if(t.includes(".")){const n=t.split("."),a=n.length-1;let i=e,r=!1;for(let e=0;e{if("locale"in e&&"resource"in e){const{locale:t,resource:n}=e;t?(o[t]=o[t]||f(),A(n,o[t])):A(n,o)}else w(e)&&A(JSON.parse(e),o)}),null==i&&r)for(const e in o)v(o,e)&&At(o[e]);return o}function Mt(e,t,n){let a=x(t.messages)?t.messages:f();"__i18nGlobal"in n&&(a=Lt(e.locale.value,{messages:a,__i18n:n.__i18nGlobal}));const i=Object.keys(a);if(i.length&&i.forEach(t=>{e.mergeLocaleMessage(t,a[t])}),x(t.datetimeFormats)){const n=Object.keys(t.datetimeFormats);n.length&&n.forEach(n=>{e.mergeDateTimeFormat(n,t.datetimeFormats[n])})}if(x(t.numberFormats)){const n=Object.keys(t.numberFormats);n.length&&n.forEach(n=>{e.mergeNumberFormat(n,t.numberFormats[n])})}}function Rt(e){return t.createVNode(t.Text,null,e,0)}function zt(){const e="currentInstance";return e in n?n[e]:n.getCurrentInstance()}const It=()=>[],Nt=()=>!1;let Ot=0;function jt(e){return(t,n,a,i)=>e(n,a,zt()||void 0,i)}function Dt(e={}){const{__root:n,__injectWithOption:a}=e,r=void 0===n,o=e.flatJson,s=i?t.ref:t.shallowRef;let u=!k(e.inheritLocale)||e.inheritLocale;const d=s(n&&u?n.locale.value:w(e.locale)?e.locale:Ie),p=s(n&&u?n.fallbackLocale.value:w(e.fallbackLocale)||b(e.fallbackLocale)||T(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:d.value),f=s(Lt(d.value,e)),m=s(T(e.datetimeFormats)?e.datetimeFormats:{[d.value]:{}}),_=s(T(e.numberFormats)?e.numberFormats:{[d.value]:{}});let g=n?n.missingWarn:!k(e.missingWarn)&&!c(e.missingWarn)||e.missingWarn,S=n?n.fallbackWarn:!k(e.fallbackWarn)&&!c(e.fallbackWarn)||e.fallbackWarn,C=n?n.fallbackRoot:!k(e.fallbackRoot)||e.fallbackRoot,P=!!e.fallbackFormat,E=y(e.missing)?e.missing:null,L=y(e.missing)?jt(e.missing):null,M=y(e.postTranslation)?e.postTranslation:null,R=n?n.warnHtmlMessage:!k(e.warnHtmlMessage)||e.warnHtmlMessage,z=!!e.escapeParameter;const I=n?n.modifiers:T(e.modifiers)?e.modifiers:{};let N,O=e.pluralRules||n&&n.pluralRules;N=(()=>{r&&Be(null);const t={version:pt,locale:d.value,fallbackLocale:p.value,messages:f.value,modifiers:I,pluralRules:O,missing:null===L?void 0:L,missingWarn:g,fallbackWarn:S,fallbackFormat:P,unresolving:!0,postTranslation:null===M?void 0:M,warnHtmlMessage:R,escapeParameter:z,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};t.datetimeFormats=m.value,t.numberFormats=_.value,t.__datetimeFormatters=T(N)?N.__datetimeFormatters:void 0,t.__numberFormatters=T(N)?N.__numberFormatters:void 0;const n=Ve(t);return r&&Be(n),n})(),He(N,d.value,p.value);const j=t.computed({get:()=>d.value,set:e=>{N.locale=e,d.value=e}}),D=t.computed({get:()=>p.value,set:e=>{N.fallbackLocale=e,p.value=e,He(N,d.value,e)}}),q=t.computed(()=>f.value),B=t.computed(()=>m.value),F=t.computed(()=>_.value),V=(e,t,a,i,o,s)=>{let u;d.value,p.value,f.value,m.value,_.value;try{r||(N.fallbackContext=n?qe:void 0),u=e(N)}finally{r||(N.fallbackContext=void 0)}if("translate exists"!==a&&l(u)&&-1===u||"translate exists"===a&&!u){const[e,a]=t();return n&&C?i(n):o(e)}if(s(u))return u;throw Error(ft)};function U(...e){return V(t=>Reflect.apply(ut,null,[t,...e]),()=>ht(...e),"translate",t=>Reflect.apply(t.t,t,[...e]),e=>e,e=>w(e))}const $={normalize:function(e){return e.map(e=>w(e)||l(e)||k(e)?Rt(String(e)):e)},interpolate:e=>e,type:"vnode"};function H(e){return f.value[e]||{}}Ot++,n&&i&&(t.watch(n.locale,e=>{u&&(d.value=e,N.locale=e,He(N,d.value,p.value))}),t.watch(n.fallbackLocale,e=>{u&&(p.value=e,N.fallbackLocale=e,He(N,d.value,p.value))}));const W={id:Ot,locale:j,fallbackLocale:D,get inheritLocale(){return u},set inheritLocale(e){u=e,e&&n&&(d.value=n.locale.value,p.value=n.fallbackLocale.value,He(N,d.value,p.value))},get availableLocales(){return Object.keys(f.value).sort()},messages:q,get modifiers(){return I},get pluralRules(){return O||{}},get isGlobal(){return r},get missingWarn(){return g},set missingWarn(e){g=e,N.missingWarn=g},get fallbackWarn(){return S},set fallbackWarn(e){S=e,N.fallbackWarn=S},get fallbackRoot(){return C},set fallbackRoot(e){C=e},get fallbackFormat(){return P},set fallbackFormat(e){P=e,N.fallbackFormat=P},get warnHtmlMessage(){return R},set warnHtmlMessage(e){R=e,N.warnHtmlMessage=e},get escapeParameter(){return z},set escapeParameter(e){z=e,N.escapeParameter=e},t:U,getLocaleMessage:H,setLocaleMessage:function(e,t){if(o){const n={[e]:t};for(const e in n)v(n,e)&&At(n[e]);t=n[e]}f.value[e]=t,N.messages=f.value},mergeLocaleMessage:function(e,t){f.value[e]=f.value[e]||{};const n={[e]:t};if(o)for(const e in n)v(n,e)&&At(n[e]);A(t=n[e],f.value[e]),N.messages=f.value},getPostTranslationHandler:function(){return y(M)?M:null},setPostTranslationHandler:function(e){M=e,N.postTranslation=e},getMissingHandler:function(){return E},setMissingHandler:function(e){null!==e&&(L=jt(e)),E=e,N.missing=L},[Tt]:function(e){O=e,N.pluralRules=O}};return W.datetimeFormats=B,W.numberFormats=F,W.rt=function(...e){const[t,n,a]=e;if(a&&!x(a))throw Error(mt);return U(t,n,h({resolvedMessage:!0},a||{}))},W.te=function(e,t){return V(()=>{if(!e)return!1;const n=w(t)?t:d.value,a=w(t)?[n]:Ce(N,p.value,n);for(let t=0;t[e],"translate exists",n=>Reflect.apply(n.te,n,[e,t]),Nt,e=>k(e))},W.tm=function(e){const t=function(e){let t=null;const n=Ce(N,p.value,d.value);for(let a=0;aReflect.apply(Ge,null,[t,...e]),()=>Ye(...e),"datetime format",t=>Reflect.apply(t.d,t,[...e]),()=>"",e=>w(e)||b(e))},W.n=function(...e){return V(t=>Reflect.apply(Ze,null,[t,...e]),()=>Xe(...e),"number format",t=>Reflect.apply(t.n,t,[...e]),()=>"",e=>w(e)||b(e))},W.getDateTimeFormat=function(e){return m.value[e]||{}},W.setDateTimeFormat=function(e,t){m.value[e]=t,N.datetimeFormats=m.value,Qe(N,e,t)},W.mergeDateTimeFormat=function(e,t){m.value[e]=h(m.value[e]||{},t),N.datetimeFormats=m.value,Qe(N,e,t)},W.getNumberFormat=function(e){return _.value[e]||{}},W.setNumberFormat=function(e,t){_.value[e]=t,N.numberFormats=_.value,et(N,e,t)},W.mergeNumberFormat=function(e,t){_.value[e]=h(_.value[e]||{},t),N.numberFormats=_.value,et(N,e,t)},W[Pt]=a,W[xt]=function(...e){return V(t=>{let n;const a=t;try{a.processor=$,n=Reflect.apply(ut,null,[a,...e])}finally{a.processor=null}return n},()=>ht(...e),"translate",t=>t[xt](...e),e=>[Rt(e)],e=>b(e))},W[St]=function(...e){return V(t=>Reflect.apply(Ge,null,[t,...e]),()=>Ye(...e),"datetime format",t=>t[St](...e),It,e=>w(e)||b(e))},W[Ct]=function(...e){return V(t=>Reflect.apply(Ze,null,[t,...e]),()=>Xe(...e),"number format",t=>t[Ct](...e),It,e=>w(e)||b(e))},W}function qt(e={}){const t=Dt(function(e){const t=w(e.locale)?e.locale:Ie,n=w(e.fallbackLocale)||b(e.fallbackLocale)||T(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:t,a=y(e.missing)?e.missing:void 0,i=!k(e.silentTranslationWarn)&&!c(e.silentTranslationWarn)||!e.silentTranslationWarn,r=!k(e.silentFallbackWarn)&&!c(e.silentFallbackWarn)||!e.silentFallbackWarn,o=!k(e.fallbackRoot)||e.fallbackRoot,s=!!e.formatFallbackMessages,l=T(e.modifiers)?e.modifiers:{},u=e.pluralizationRules,d=y(e.postTranslation)?e.postTranslation:void 0,p=!w(e.warnHtmlInMessage)||"off"!==e.warnHtmlInMessage,f=!!e.escapeParameterHtml,m=!k(e.sync)||e.sync;let _=e.messages;if(T(e.sharedMessages)){const t=e.sharedMessages;_=Object.keys(t).reduce((e,n)=>{const a=e[n]||(e[n]={});return h(a,t[n]),e},_||{})}const{__i18n:g,__root:v,__injectWithOption:x}=e,S=e.datetimeFormats,C=e.numberFormats;return{locale:t,fallbackLocale:n,messages:_,flatJson:e.flatJson,datetimeFormats:S,numberFormats:C,missing:a,missingWarn:i,fallbackWarn:r,fallbackRoot:o,fallbackFormat:s,modifiers:l,pluralRules:u,postTranslation:d,warnHtmlMessage:p,escapeParameter:f,messageResolver:e.messageResolver,inheritLocale:m,__i18n:g,__root:v,__injectWithOption:x}}(e)),{__extender:n}=e,a={id:t.id,get locale(){return t.locale.value},set locale(e){t.locale.value=e},get fallbackLocale(){return t.fallbackLocale.value},set fallbackLocale(e){t.fallbackLocale.value=e},get messages(){return t.messages.value},get datetimeFormats(){return t.datetimeFormats.value},get numberFormats(){return t.numberFormats.value},get availableLocales(){return t.availableLocales},get missing(){return t.getMissingHandler()},set missing(e){t.setMissingHandler(e)},get silentTranslationWarn(){return k(t.missingWarn)?!t.missingWarn:t.missingWarn},set silentTranslationWarn(e){t.missingWarn=k(e)?!e:e},get silentFallbackWarn(){return k(t.fallbackWarn)?!t.fallbackWarn:t.fallbackWarn},set silentFallbackWarn(e){t.fallbackWarn=k(e)?!e:e},get modifiers(){return t.modifiers},get formatFallbackMessages(){return t.fallbackFormat},set formatFallbackMessages(e){t.fallbackFormat=e},get postTranslation(){return t.getPostTranslationHandler()},set postTranslation(e){t.setPostTranslationHandler(e)},get sync(){return t.inheritLocale},set sync(e){t.inheritLocale=e},get warnHtmlInMessage(){return t.warnHtmlMessage?"warn":"off"},set warnHtmlInMessage(e){t.warnHtmlMessage="off"!==e},get escapeParameterHtml(){return t.escapeParameter},set escapeParameterHtml(e){t.escapeParameter=e},get pluralizationRules(){return t.pluralRules||{}},__composer:t,t:(...e)=>Reflect.apply(t.t,t,[...e]),rt:(...e)=>Reflect.apply(t.rt,t,[...e]),te:(e,n)=>t.te(e,n),tm:e=>t.tm(e),getLocaleMessage:e=>t.getLocaleMessage(e),setLocaleMessage(e,n){t.setLocaleMessage(e,n)},mergeLocaleMessage(e,n){t.mergeLocaleMessage(e,n)},d:(...e)=>Reflect.apply(t.d,t,[...e]),getDateTimeFormat:e=>t.getDateTimeFormat(e),setDateTimeFormat(e,n){t.setDateTimeFormat(e,n)},mergeDateTimeFormat(e,n){t.mergeDateTimeFormat(e,n)},n:(...e)=>Reflect.apply(t.n,t,[...e]),getNumberFormat:e=>t.getNumberFormat(e),setNumberFormat(e,n){t.setNumberFormat(e,n)},mergeNumberFormat(e,n){t.mergeNumberFormat(e,n)}};return a.__extender=n,a}function Bt(e,t){e.locale=t.locale||e.locale,e.fallbackLocale=t.fallbackLocale||e.fallbackLocale,e.missing=t.missing||e.missing,e.silentTranslationWarn=t.silentTranslationWarn||e.silentFallbackWarn,e.silentFallbackWarn=t.silentFallbackWarn||e.silentFallbackWarn,e.formatFallbackMessages=t.formatFallbackMessages||e.formatFallbackMessages,e.postTranslation=t.postTranslation||e.postTranslation,e.warnHtmlInMessage=t.warnHtmlInMessage||e.warnHtmlInMessage,e.escapeParameterHtml=t.escapeParameterHtml||e.escapeParameterHtml,e.sync=t.sync||e.sync,e.__composer[Tt](t.pluralizationRules||e.pluralizationRules);const n=Lt(e.locale,{messages:t.messages,__i18n:t.__i18n});return Object.keys(n).forEach(t=>e.mergeLocaleMessage(t,n[t])),t.datetimeFormats&&Object.keys(t.datetimeFormats).forEach(n=>e.mergeDateTimeFormat(n,t.datetimeFormats[n])),t.numberFormats&&Object.keys(t.numberFormats).forEach(n=>e.mergeNumberFormat(n,t.numberFormats[n])),e}const Ft={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>"parent"===e||"global"===e,default:"parent"},i18n:{type:Object}};function Vt(){return t.Fragment}const Ut=t.defineComponent({name:"i18n-t",props:h({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>l(e)||!isNaN(e)}},Ft),setup(e,n){const{slots:a,attrs:i}=n,r=e.i18n||Jt({useScope:e.scope,__useComponent:!0});return()=>{const o=()=>{const i=Object.keys(a).filter(e=>"_"!==e[0]),o=f();e.locale&&(o.locale=e.locale),void 0!==e.plural&&(o.plural=w(e.plural)?+e.plural:e.plural);const s=function({slots:e},n){return 1===n.length&&"default"===n[0]?(e.default?e.default():[]).reduce((e,n)=>[...e,...n.type===t.Fragment?n.children:[n]],[]):n.reduce((t,n)=>{const a=e[n];return a&&(t[n]=a()),t},f())}(n,i);return r[xt](e.keypath,s,o)},s=h(f(),i),l=w(e.tag)||x(e.tag)?e.tag:Vt();return x(l)?t.h(l,s,{default:o}):t.h(l,s,o())}}}),$t=Ut;function Ht(e,n,a,i){const{slots:r,attrs:o}=n;return()=>{const n=()=>{const t={part:!0};let n=f();e.locale&&(t.locale=e.locale),w(e.format)?t.key=e.format:x(e.format)&&(w(e.format.key)&&(t.key=e.format.key),n=Object.keys(e.format).reduce((t,n)=>a.includes(n)?h(f(),t,{[n]:e.format[n]}):t,f()));const o=i(e.value,t,n);let s=[t.key];return b(o)?s=o.map((e,t)=>{const n=r[e.type],a=n?n({[e.type]:e.value,index:t,parts:o}):[e.value];var i;return b(i=a)&&!w(i[0])&&(a[0].key=`${e.type}-${t}`),a}):w(o)&&(s=[o]),s},s=h(f(),o),l=w(e.tag)||x(e.tag)?e.tag:Vt();return x(l)?t.h(l,s,{default:n}):t.h(l,s,n())}}const Wt=t.defineComponent({name:"i18n-n",props:h({value:{type:Number,required:!0},format:{type:[String,Object]}},Ft),setup(e,t){const n=e.i18n||Jt({useScope:e.scope,__useComponent:!0});return Ht(e,t,Je,(...e)=>n[Ct](...e))}}),Gt=Wt;function Kt(e){const n=t=>{const{instance:n,value:a}=t;if(!n||!n.$)throw Error(wt);const i=function(e,t){const n=e;if("composition"===e.mode)return n.__getInstance(t)||e.global;{const a=n.__getInstance(t);return null!=a?a.__composer:e.global.__composer}}(e,n.$),r=Yt(a);return[Reflect.apply(i.t,i,[...Qt(r)]),i]};return{created:(e,a)=>{const[r,o]=n(a);i&&(e.__i18nWatcher=t.watch(o.locale,()=>{a.instance&&a.instance.$forceUpdate()})),e.__composer=o,e.textContent=r},unmounted:e=>{i&&e.__i18nWatcher&&(e.__i18nWatcher(),e.__i18nWatcher=void 0,delete e.__i18nWatcher),e.__composer&&(e.__composer=void 0,delete e.__composer)},beforeUpdate:(e,{value:t})=>{if(e.__composer){const n=e.__composer,a=Yt(t);e.textContent=Reflect.apply(n.t,n,[...Qt(a)])}},getSSRProps:e=>{const[t]=n(e);return{textContent:t}}}}function Yt(e){if(w(e))return{path:e};if(T(e)){if(!("path"in e))throw Error(vt,"path");return e}throw Error(bt)}function Qt(e){const{path:t,locale:n,args:a,choice:i,plural:r}=e,o={},s=a||{};return w(n)&&(o.locale=n),l(i)&&(o.plural=i),l(r)&&(o.plural=r),[t,s,o]}const Zt=r("global-vue-i18n");function Jt(e={}){const n=zt();if(null==n)throw Error(_t);if(!n.isCE&&null!=n.appContext.app&&!n.appContext.app.__VUE_I18N_SYMBOL__)throw Error(gt);const a=function(e){const n=t.inject(e.isCE?Zt:e.appContext.app.__VUE_I18N_SYMBOL__);if(!n)throw Error(e.isCE?yt:wt);return n}(n),i=function(e){return"composition"===e.mode?e.global:e.global.__composer}(a),r=function(e){return e.type}(n),o=function(e,t){return d(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}(e,r);if("global"===o)return Mt(i,e,r),i;if("parent"===o){let t=Xt(a,n,e.__useComponent);return null==t&&(t=i),t}if("isolated"===o){if("composition"!==a.mode)throw Error(kt);const r=a,o=h({},e),s=Xt(a,n);o.__root=s||i;const l=Dt(o);return r.__composerExtend&&(l[Et]=r.__composerExtend(l)),t.getCurrentScope()&&t.onScopeDispose(()=>{const e=l[Et];e&&(e(),delete l[Et])}),l}const s=a;let l=s.__getInstance(n);if(null==l){const a=h({},e);"__i18n"in r&&(a.__i18n=r.__i18n),i&&(a.__root=i),l=Dt(a),s.__composerExtend&&(l[Et]=s.__composerExtend(l)),function(e,n,a){t.onMounted(()=>{},n),t.onUnmounted(()=>{const t=a;e.__deleteInstance(n);const i=t[Et];i&&(i(),delete t[Et])},n)}(s,n,l),s.__setInstance(n,l)}return l}function Xt(e,t,n=!1){let a=null;const i=t.root;let r=function(e,t=!1){return null==e?null:t&&e.vnode.ctx||e.parent}(t,n);for(;null!=r;){const t=e;if("composition"===e.mode)a=t.__getInstance(r);else{const e=t.__getInstance(r);null!=e&&(a=e.__composer,n&&a&&!a[Pt]&&(a=null))}if(null!=a)break;if(i===r)break;r=r.parent}return a}const en=["locale","fallbackLocale","availableLocales"],tn=["t","rt","d","n","tm","te"],nn=t.defineComponent({name:"i18n-d",props:h({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},Ft),setup(e,t){const n=e.i18n||Jt({useScope:e.scope,__useComponent:!0});return Ht(e,t,Ke,(...e)=>n[St](...e))}}),an=nn;return Oe=function(e,t){if(w(e)){!k(t.warnHtmlMessage)||t.warnHtmlMessage;const n=(t.onCacheKey||pe)(e),a=fe[n];if(a)return a;const{ast:i,detectError:r}=function(e,t={}){let n=!1;const a=t.onError||L;return t.onError=e=>{n=!0,a(e)},{...Q(e,t),detectError:n}}(e,{...t,location:!1,jit:!0}),o=ce(i);return r?o:fe[n]=o}{const t=e.cacheKey;if(t){return fe[t]||(fe[t]=ce(e))}return ce(e)}},je=function(e,t){if(!x(e))return null;let n=Re.get(t);if(n||(n=function(e){const t=[];let n,a,i,r,o,s,l,u=-1,c=0,d=0;const h=[];function p(){const t=e[u+1];if(5===c&&"'"===t||6===c&&'"'===t)return u++,i="\\"+t,h[0](),!0}for(h[0]=()=>{void 0===a?a=i:a+=i},h[1]=()=>{void 0!==a&&(t.push(a),a=void 0)},h[2]=()=>{h[0](),d++},h[3]=()=>{if(d>0)d--,c=4,h[0]();else{if(d=0,void 0===a)return!1;if(a=function(e){const t=e.trim();return("0"!==e.charAt(0)||!isNaN(parseInt(e)))&&(n=t,Le.test(n)?function(e){const t=e.charCodeAt(0);return t!==e.charCodeAt(e.length-1)||34!==t&&39!==t?e:e.slice(1,-1)}(t):"*"+t);var n}(a),!1===a)return!1;h[1]()}};null!==c;)if(u++,n=e[u],"\\"!==n||!p()){if(r=Me(n),l=Ae[c],o=l[r]||l.l||8,8===o)return;if(c=o[0],void 0!==o[1]&&(s=h[o[1]],s&&(i=n,!1===s())))return;if(7===c)return t}}(t),n&&Re.set(t,n)),!n)return null;const a=n.length;let i=e,r=0;for(;rqt(e)):a.run(()=>Dt(e));if(null==i)throw Error(wt);return[a,i]}(e,n),l=r(""),u={get mode(){return n?"legacy":"composition"},async install(e,...i){if(e.__VUE_I18N_SYMBOL__=l,e.provide(e.__VUE_I18N_SYMBOL__,u),T(i[0])){const e=i[0];u.__composerExtend=e.__composerExtend,u.__vueI18nExtend=e.__vueI18nExtend}let r=null;!n&&a&&(r=function(e,n){const a=Object.create(null);en.forEach(e=>{const i=Object.getOwnPropertyDescriptor(n,e);if(!i)throw Error(wt);const r=t.isRef(i.value)?{get:()=>i.value.value,set(e){i.value.value=e}}:{get:()=>i.get&&i.get()};Object.defineProperty(a,e,r)}),e.config.globalProperties.$i18n=a,tn.forEach(t=>{const a=Object.getOwnPropertyDescriptor(n,t);if(!a||!a.value)throw Error(wt);Object.defineProperty(e.config.globalProperties,`$${t}`,a)});return()=>{delete e.config.globalProperties.$i18n,tn.forEach(t=>{delete e.config.globalProperties[`$${t}`]})}}(e,u.global)),function(e,t,...n){const a=T(n[0])?n[0]:{};(!k(a.globalInstall)||a.globalInstall)&&([Ut.name,"I18nT"].forEach(t=>e.component(t,Ut)),[Wt.name,"I18nN"].forEach(t=>e.component(t,Wt)),[nn.name,"I18nD"].forEach(t=>e.component(t,nn))),e.directive("t",Kt(t))}(e,u,...i),n&&e.mixin(function(e,t,n){return{beforeCreate(){const a=zt();if(!a)throw Error(wt);const i=this.$options;if(i.i18n){const a=i.i18n;if(i.__i18n&&(a.__i18n=i.__i18n),a.__root=t,this===this.$root)this.$i18n=Bt(e,a);else{a.__injectWithOption=!0,a.__extender=n.__vueI18nExtend,this.$i18n=qt(a);const e=this.$i18n;e.__extender&&(e.__disposer=e.__extender(this.$i18n))}}else if(i.__i18n)if(this===this.$root)this.$i18n=Bt(e,i);else{this.$i18n=qt({__i18n:i.__i18n,__injectWithOption:!0,__extender:n.__vueI18nExtend,__root:t});const e=this.$i18n;e.__extender&&(e.__disposer=e.__extender(this.$i18n))}else this.$i18n=e;i.__i18nGlobal&&Mt(t,i,i),this.$t=(...e)=>this.$i18n.t(...e),this.$rt=(...e)=>this.$i18n.rt(...e),this.$te=(e,t)=>this.$i18n.te(e,t),this.$d=(...e)=>this.$i18n.d(...e),this.$n=(...e)=>this.$i18n.n(...e),this.$tm=e=>this.$i18n.tm(e),n.__setInstance(a,this.$i18n)},mounted(){},unmounted(){const e=zt();if(!e)throw Error(wt);const t=this.$i18n;delete this.$t,delete this.$rt,delete this.$te,delete this.$d,delete this.$n,delete this.$tm,t.__disposer&&(t.__disposer(),delete t.__disposer,delete t.__extender),n.__deleteInstance(e),delete this.$i18n}}}(s,s.__composer,u));const o=e.unmount;e.unmount=()=>{r&&r(),u.dispose(),o()}},get global(){return s},dispose(){o.stop()},__instances:i,__getInstance:function(e){return i.get(e)||null},__setInstance:function(e,t){i.set(e,t)},__deleteInstance:function(e){i.delete(e)}};return u},e.useI18n=Jt,e.vTDirective=Kt,e}({},Vue),VueRouter=function(e,t){const n="undefined"!=typeof document;function a(e){return"object"==typeof e||"displayName"in e||"props"in e||"__vccOpts"in e}function i(e){return e.__esModule||"Module"===e[Symbol.toStringTag]||e.default&&a(e.default)}const r=Object.assign;function o(e,t){const n={};for(const a in t){const i=t[a];n[a]=l(i)?i.map(e):e(i)}return n}const s=()=>{},l=Array.isArray;function u(e,t){const n={};for(const a in e)n[a]=a in t?t[a]:e[a];return n}function c(e){const t=Array.from(arguments).slice(1);console.warn.apply(console,["[Vue Router warn]: "+e].concat(t))}const d=/#/g,h=/&/g,p=/\//g,f=/=/g,m=/\?/g,_=/\+/g,g=/%5B/g,v=/%5D/g,b=/%5E/g,y=/%60/g,w=/%7B/g,k=/%7C/g,x=/%7D/g,S=/%20/g;function C(e){return null==e?"":encodeURI(""+e).replace(k,"|").replace(g,"[").replace(v,"]")}function T(e){return C(e).replace(_,"%2B").replace(S,"+").replace(d,"%23").replace(h,"%26").replace(y,"`").replace(w,"{").replace(x,"}").replace(b,"^")}function P(e){return T(e).replace(f,"%3D")}function E(e){return function(e){return C(e).replace(d,"%23").replace(m,"%3F")}(e).replace(p,"%2F")}function A(e){if(null==e)return null;try{return decodeURIComponent(""+e)}catch{c(`Error decoding "${e}". Using original value`)}return""+e}const L=/\/$/;function M(e,t,n="/"){let a,i={},r="",o="";const s=t.indexOf("#");let l=t.indexOf("?");return l=s>=0&&l>s?-1:l,l>=0&&(a=t.slice(0,l),r=t.slice(l,s>0?s:t.length),i=e(r.slice(1))),s>=0&&(a=a||t.slice(0,s),o=t.slice(s,t.length)),a=function(e,t){if(e.startsWith("/"))return e;if(!t.startsWith("/"))return c(`Cannot resolve a relative location without an absolute path. Trying to resolve "${e}" from "${t}". It should look like "/${t}".`),e;if(!e)return t;const n=t.split("/"),a=e.split("/"),i=a[a.length-1];".."!==i&&"."!==i||a.push("");let r,o,s=n.length-1;for(r=0;r1&&s--}return n.slice(0,s).join("/")+"/"+a.slice(r).join("/")}(null!=a?a:t,n),{fullPath:a+r+o,path:a,query:i,hash:A(o)}}function R(e,t){return t&&e.toLowerCase().startsWith(t.toLowerCase())?e.slice(t.length)||"/":e}function z(e,t,n){const a=t.matched.length-1,i=n.matched.length-1;return a>-1&&a===i&&I(t.matched[a],n.matched[i])&&N(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function I(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function N(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!O(e[n],t[n]))return!1;return!0}function O(e,t){return l(e)?j(e,t):l(t)?j(t,e):(e&&e.valueOf())===(t&&t.valueOf())}function j(e,t){return l(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):1===e.length&&e[0]===t}const D={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let q=function(e){return e.pop="pop",e.push="push",e}({}),B=function(e){return e.back="back",e.forward="forward",e.unknown="",e}({});function F(e){if(!e)if(n){const t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^\w+:\/\/[^/]+/,"")}else e="/";return"/"!==e[0]&&"#"!==e[0]&&(e="/"+e),e.replace(L,"")}const V=/^[^#]+#/;function U(e,t){return e.replace(V,"#")+t}const $=()=>({left:window.scrollX,top:window.scrollY});function H(e){let t;if("el"in e){const n=e.el,a="string"==typeof n&&n.startsWith("#");if(!("string"!=typeof e.el||a&&document.getElementById(e.el.slice(1))))try{const t=document.querySelector(e.el);if(a&&t)return void c(`The selector "${e.el}" should be passed as "el: document.querySelector('${e.el}')" because it starts with "#".`)}catch{return void c(`The selector "${e.el}" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`)}const i="string"==typeof n?a?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return void c(`Couldn't find element using selector "${e.el}" returned by scrollBehavior.`);t=function(e,t){const n=document.documentElement.getBoundingClientRect(),a=e.getBoundingClientRect();return{behavior:t.behavior,left:a.left-n.left-(t.left||0),top:a.top-n.top-(t.top||0)}}(i,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(null!=t.left?t.left:window.scrollX,null!=t.top?t.top:window.scrollY)}function W(e,t){return(history.state?history.state.position-t:-1)+e}const G=new Map;let K=()=>location.protocol+"//"+location.host;function Y(e,t){const{pathname:n,search:a,hash:i}=t,r=e.indexOf("#");if(r>-1){let t=i.includes(e.slice(r))?e.slice(r).length:1,n=i.slice(t);return"/"!==n[0]&&(n="/"+n),R(n,"")}return R(n,e)+a+i}function Q(e,t,n,a=!1,i=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:i?$():null}}function Z(e){const t=function(e){const{history:t,location:n}=window,a={value:Y(e,n)},i={value:t.state};function o(a,r,o){const s=e.indexOf("#"),l=s>-1?(n.host&&document.querySelector("base")?e:e.slice(s))+a:K()+e+a;try{t[o?"replaceState":"pushState"](r,"",l),i.value=r}catch(e){c("Error with push/replace State",e),n[o?"replace":"assign"](l)}}return i.value||o(a.value,{back:null,current:a.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0),{location:a,state:i,push:function(e,n){const s=r({},i.value,t.state,{forward:e,scroll:$()});t.state||c("history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:\n\nhistory.replaceState(history.state, '', url)\n\nYou can find more information at https://router.vuejs.org/guide/migration/#Usage-of-history-state"),o(s.current,s,!0),o(e,r({},Q(a.value,e,null),{position:s.position+1},n),!1),a.value=e},replace:function(e,n){o(e,r({},t.state,Q(i.value.back,e,i.value.forward,!0),n,{position:i.value.position}),!0),a.value=e}}}(e=F(e)),n=function(e,t,n,a){let i=[],o=[],s=null;const l=({state:r})=>{const o=Y(e,location),l=n.value,u=t.value;let c=0;if(r){if(n.value=o,t.value=r,s&&s===l)return void(s=null);c=u?r.position-u.position:0}else a(o);i.forEach(e=>{e(n.value,l,{delta:c,type:q.pop,direction:c?c>0?B.forward:B.back:B.unknown})})};function u(){if("hidden"===document.visibilityState){const{history:e}=window;if(!e.state)return;e.replaceState(r({},e.state,{scroll:$()}),"")}}return window.addEventListener("popstate",l),window.addEventListener("pagehide",u),document.addEventListener("visibilitychange",u),{pauseListeners:function(){s=n.value},listen:function(e){i.push(e);const t=()=>{const t=i.indexOf(e);t>-1&&i.splice(t,1)};return o.push(t),t},destroy:function(){for(const e of o)e();o=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",u),document.removeEventListener("visibilitychange",u)}}}(e,t.state,t.location,t.replace);const a=r({location:"",base:e,go:function(e,t=!0){t||n.pauseListeners(),history.go(e)},createHref:U.bind(null,e)},t,n);return Object.defineProperty(a,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(a,"state",{enumerable:!0,get:()=>t.state.value}),a}function J(e){return"string"==typeof e||e&&"object"==typeof e}function X(e){return"string"==typeof e||"symbol"==typeof e}let ee=function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e}({});const te=Symbol("navigation failure");let ne=function(e){return e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated",e}({});const ae={[ee.MATCHER_NOT_FOUND]:({location:e,currentLocation:t})=>`No match for\n ${JSON.stringify(e)}${t?"\nwhile being at\n"+JSON.stringify(t):""}`,[ee.NAVIGATION_GUARD_REDIRECT]:({from:e,to:t})=>`Redirected from "${e.fullPath}" to "${function(e){if("string"==typeof e)return e;if(null!=e.path)return e.path;const t={};for(const n of oe)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}(t)}" via a navigation guard.`,[ee.NAVIGATION_ABORTED]:({from:e,to:t})=>`Navigation aborted from "${e.fullPath}" to "${t.fullPath}" via a navigation guard.`,[ee.NAVIGATION_CANCELLED]:({from:e,to:t})=>`Navigation cancelled from "${e.fullPath}" to "${t.fullPath}" with a new navigation.`,[ee.NAVIGATION_DUPLICATED]:({from:e,to:t})=>`Avoided redundant navigation to current location: "${e.fullPath}".`};function ie(e,t){return r(new Error(ae[e](t)),{type:e,[te]:!0},t)}function re(e,t){return e instanceof Error&&te in e&&(null==t||!!(e.type&t))}const oe=["params","query","hash"];let se=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var le=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(le||{});const ue={type:se.Static,value:""},ce=/[a-zA-Z0-9_]/;const de="[^/]+?",he={sensitive:!1,strict:!1,start:!0,end:!0};var pe=function(e){return e[e._multiplier=10]="_multiplier",e[e.Root=90]="Root",e[e.Segment=40]="Segment",e[e.SubSegment=30]="SubSegment",e[e.Static=40]="Static",e[e.Dynamic=20]="Dynamic",e[e.BonusCustomRegExp=10]="BonusCustomRegExp",e[e.BonusWildcard=-50]="BonusWildcard",e[e.BonusRepeatable=-20]="BonusRepeatable",e[e.BonusOptional=-8]="BonusOptional",e[e.BonusStrict=.7000000000000001]="BonusStrict",e[e.BonusCaseSensitive=.25]="BonusCaseSensitive",e}(pe||{});const fe=/[.+*?^${}()[\]/\\]/g;function me(e,t){let n=0;for(;nt.length?1===t.length&&t[0]===pe.Static+pe.Segment?1:-1:0}function _e(e,t){let n=0;const a=e.score,i=t.score;for(;n0&&t[t.length-1]<0}const ve={strict:!1,end:!0,sensitive:!1};function be(e,t,n){const a=function(e,t){const n=r({},he,t),a=[];let i=n.start?"^":"";const o=[];for(const t of e){const e=t.length?[]:[pe.Root];n.strict&&!t.length&&(i+="/");for(let a=0;a1&&("*"===s||"+"===s)&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),r.push({type:se.Param,value:u,regexp:c,repeatable:"*"===s||"+"===s,optional:"*"===s||"?"===s})):t("Invalid state to consume buffer"),u="")}function h(){u+=s}for(;l{o(_)}:s}function o(e){if(X(e)){const t=a.get(e);t&&(a.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(o),t.alias.forEach(o))}else{const t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&a.delete(e.record.name),e.children.forEach(o),e.alias.forEach(o))}}function l(e){const t=function(e,t){let n=0,a=t.length;for(;n!==a;){const i=n+a>>1;_e(e,t[i])<0?a=i:n=i+1}const i=function(e){let t=e;for(;t=t.parent;)if(Le(t)&&0===_e(e,t))return t}(e);i&&(a=t.lastIndexOf(i,a-1),a<0&&c(`Finding ancestor route "${i.record.path}" failed for "${e.record.path}"`));return a}(e,n);n.splice(t,0,e),e.record.name&&!Se(e)&&a.set(e.record.name,e)}return t=u(ve,t),e.forEach(e=>i(e)),{addRoute:i,resolve:function(e,t){let i,o,s,l={};if("name"in e&&e.name){if(i=a.get(e.name),!i)throw ie(ee.MATCHER_NOT_FOUND,{location:e});{const t=Object.keys(e.params||{}).filter(e=>!i.keys.find(t=>t.name===e));t.length&&c(`Discarded invalid param(s) "${t.join('", "')}" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`)}s=i.record.name,l=r(we(t.params,i.keys.filter(e=>!e.optional).concat(i.parent?i.parent.keys.filter(e=>e.optional):[]).map(e=>e.name)),e.params&&we(e.params,i.keys.map(e=>e.name))),o=i.stringify(l)}else if(null!=e.path)o=e.path,o.startsWith("/")||c(`The Matcher cannot resolve relative paths but received "${o}". Unless you directly called \`matcher.resolve("${o}")\`, this is probably a bug in vue-router. Please open an issue at https://github.com/vuejs/router/issues/new/choose.`),i=n.find(e=>e.re.test(o)),i&&(l=i.parse(o),s=i.record.name);else{if(i=t.name?a.get(t.name):n.find(e=>e.re.test(t.path)),!i)throw ie(ee.MATCHER_NOT_FOUND,{location:e,currentLocation:t});s=i.record.name,l=r({},t.params,e.params),o=i.stringify(l)}const u=[];let d=i;for(;d;)u.unshift(d.record),d=d.parent;return{name:s,path:o,params:l,matched:u,meta:Ce(u)}},removeRoute:o,clearRoutes:function(){n.length=0,a.clear()},getRoutes:function(){return n},getRecordMatcher:function(e){return a.get(e)}}}function we(e,t){const n={};for(const a of t)a in e&&(n[a]=e[a]);return n}function ke(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:xe(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function xe(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const a in e.components)t[a]="object"==typeof n?n[a]:n;return t}function Se(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Ce(e){return e.reduce((e,t)=>r(e,t.meta),{})}function Te(e,t){return e.name===t.name&&e.optional===t.optional&&e.repeatable===t.repeatable}function Pe(e,t){for(const n of e.keys)if(!n.optional&&!t.keys.find(Te.bind(null,n)))return c(`Alias "${t.record.path}" and the original record: "${e.record.path}" must have the exact same param named "${n.name}"`);for(const n of t.keys)if(!n.optional&&!e.keys.find(Te.bind(null,n)))return c(`Alias "${t.record.path}" and the original record: "${e.record.path}" must have the exact same param named "${n.name}"`)}function Ee(e,t){for(let n=t;n;n=n.parent)if(n.record.name===e.name)throw new Error(`A route named "${String(e.name)}" has been added as a ${t===n?"child":"descendant"} of a route with the same name. Route names must be unique and a nested route cannot use the same name as an ancestor.`)}function Ae(e,t){for(const n of t.keys)if(!e.keys.find(Te.bind(null,n)))return c(`Absolute path "${e.record.path}" must have the exact same param named "${n.name}" as its parent "${t.record.path}".`)}function Le({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Me(e){const t={};if(""===e||"?"===e)return t;const n=("?"===e[0]?e.slice(1):e).split("&");for(let e=0;ee&&T(e)):[a&&T(a)]).forEach(e=>{void 0!==e&&(t+=(t.length?"&":"")+n,null!=e&&(t+="="+e))}):void 0!==a&&(t+=(t.length?"&":"")+n)}return t}function ze(e){const t={};for(const n in e){const a=e[n];void 0!==a&&(t[n]=l(a)?a.map(e=>null==e?null:""+e):null==a?a:""+a)}return t}const Ie=Symbol("router view location matched"),Ne=Symbol("router view depth"),Oe=Symbol("router"),je=Symbol("route location"),De=Symbol("router view location");function qe(){let e=[];return{add:function(t){return e.push(t),()=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)}},list:()=>e.slice(),reset:function(){e=[]}}}function Be(e,n,a){const i=e.value;if(!i)return void c(`No active route record was found when calling \`${"updateGuards"===n?"onBeforeRouteUpdate":"onBeforeRouteLeave"}()\`. Make sure you call this function inside a component child of . Maybe you called it inside of App.vue?`);let r=i;const o=()=>{r[n].delete(a)};(0,t.onUnmounted)(o),(0,t.onDeactivated)(o),(0,t.onActivated)(()=>{const t=e.value;t||c("No active route record was found when reactivating component with navigation guard. This is likely a bug in vue-router. Please report it."),t&&(r=t),r[n].add(a)}),r[n].add(a)}function Fe(e,t,n,a,i,r=e=>e()){const o=a&&(a.enterCallbacks[i]=a.enterCallbacks[i]||[]);return()=>new Promise((s,l)=>{const u=e=>{!1===e?l(ie(ee.NAVIGATION_ABORTED,{from:n,to:t})):e instanceof Error?l(e):J(e)?l(ie(ee.NAVIGATION_GUARD_REDIRECT,{from:t,to:e})):(o&&a.enterCallbacks[i]===o&&"function"==typeof e&&o.push(e),s())},d=r(()=>e.call(a&&a.instances[i],t,n,function(e){let t=!1;return function(){return t||(t=!0,c("The `next()` callback in navigation guards is deprecated. Return the value instead of calling `next(value)`.")),e.apply(this,arguments)}}(function(e,t,n){let a=0;return function(){1===a++&&c(`The "next" callback was called more than once in one navigation guard when going from "${n.fullPath}" to "${t.fullPath}". It should be called exactly one time in each navigation guard. This will fail in production.`),e._called=!0,1===a&&e.apply(null,arguments)}}(u,t,n))));let h=Promise.resolve(d);if(e.length<3&&(h=h.then(u)),e.length>2){const t=`The "next" callback was never called inside of ${e.name?'"'+e.name+'"':""}:\n${e.toString()}\n. If you are returning a value instead of calling "next", make sure to remove the "next" parameter from your function.`;if("object"==typeof d&&"then"in d)h=h.then(e=>u._called?e:(c(t),Promise.reject(new Error("Invalid navigation guard"))));else if(void 0!==d&&!u._called)return c(t),void l(new Error("Invalid navigation guard"))}h.catch(e=>l(e))})}function Ve(e,t,n,r,o=e=>e()){const s=[];for(const l of e){l.components||!l.children||l.children.length||c(`Record with path "${l.path}" is either missing a "component(s)" or "children" property.`);for(const e in l.components){let u=l.components[e];if(!u||"object"!=typeof u&&"function"!=typeof u)throw c(`Component "${e}" in record with path "${l.path}" is not a valid component. Received "${String(u)}".`),new Error("Invalid route component");if("then"in u){c(`Component "${e}" in record with path "${l.path}" is a Promise instead of a function that returns a Promise. Did you write "import('./MyPage.vue')" instead of "() => import('./MyPage.vue')" ? This will break in production if not fixed.`);const t=u;u=()=>t}else u.__asyncLoader&&!u.__warnedDefineAsync&&(u.__warnedDefineAsync=!0,c(`Component "${e}" in record with path "${l.path}" is defined using "defineAsyncComponent()". Write "() => import('./MyPage.vue')" instead of "defineAsyncComponent(() => import('./MyPage.vue'))".`));if("beforeRouteEnter"===t||l.instances[e])if(a(u)){const a=(u.__vccOpts||u)[t];a&&s.push(Fe(a,n,r,l,e,o))}else{let a=u();"catch"in a||(c(`Component "${e}" in record with path "${l.path}" is a function that does not return a Promise. If you were passing a functional component, make sure to add a "displayName" to the component. This will break in production if not fixed.`),a=Promise.resolve(a)),s.push(()=>a.then(a=>{if(!a)throw new Error(`Couldn't resolve component "${e}" at "${l.path}"`);const s=i(a)?a.default:a;l.mods[e]=a,l.components[e]=s;const u=(s.__vccOpts||s)[t];return u&&Fe(u,n,r,l,e,o)()}))}}}return s}function Ue(e){const a=(0,t.inject)(Oe),i=(0,t.inject)(je);let r=!1,o=null;const u=(0,t.computed)(()=>{const n=(0,t.unref)(e.to);return r&&n===o||(J(n)||(r?c('Invalid value for prop "to" in useLink()\n- to:',n,"\n- previous to:",o,"\n- props:",e):c('Invalid value for prop "to" in useLink()\n- to:',n,"\n- props:",e)),o=n,r=!0),a.resolve(n)}),d=(0,t.computed)(()=>{const{matched:e}=u.value,{length:t}=e,n=e[t-1],a=i.matched;if(!n||!a.length)return-1;const r=a.findIndex(I.bind(null,n));if(r>-1)return r;const o=He(e[t-2]);return t>1&&He(n)===o&&a[a.length-1].path!==o?a.findIndex(I.bind(null,e[t-2])):r}),h=(0,t.computed)(()=>d.value>-1&&function(e,t){for(const n in t){const a=t[n],i=e[n];if("string"==typeof a){if(a!==i)return!1}else if(!l(i)||i.length!==a.length||a.some((e,t)=>e.valueOf()!==i[t].valueOf()))return!1}return!0}(i.params,u.value.params)),p=(0,t.computed)(()=>d.value>-1&&d.value===i.matched.length-1&&N(i.params,u.value.params));if(n){const n=(0,t.getCurrentInstance)();if(n){const a={route:u.value,isActive:h.value,isExactActive:p.value,error:null};n.__vrl_devtools=n.__vrl_devtools||[],n.__vrl_devtools.push(a),(0,t.watchEffect)(()=>{a.route=u.value,a.isActive=h.value,a.isExactActive=p.value,a.error=J((0,t.unref)(e.to))?null:'Invalid "to" value'},{flush:"post"})}}return{route:u,href:(0,t.computed)(()=>u.value.href),isActive:h,isExactActive:p,navigate:function(n={}){if(function(e){if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)return;if(e.defaultPrevented)return;if(void 0!==e.button&&0!==e.button)return;if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}e.preventDefault&&e.preventDefault();return!0}(n)){const n=a[(0,t.unref)(e.replace)?"replace":"push"]((0,t.unref)(e.to)).catch(s);return e.viewTransition&&"undefined"!=typeof document&&"startViewTransition"in document&&document.startViewTransition(()=>n),n}return Promise.resolve()}}}const $e=(0,t.defineComponent)({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Ue,setup(e,{slots:n}){const a=(0,t.reactive)(Ue(e)),{options:i}=(0,t.inject)(Oe),r=(0,t.computed)(()=>({[We(e.activeClass,i.linkActiveClass,"router-link-active")]:a.isActive,[We(e.exactActiveClass,i.linkExactActiveClass,"router-link-exact-active")]:a.isExactActive}));return()=>{const i=n.default&&(1===(o=n.default(a)).length?o[0]:o);var o;return e.custom?i:(0,t.h)("a",{"aria-current":a.isExactActive?e.ariaCurrentValue:null,href:a.href,onClick:a.navigate,class:r.value},i)}}});function He(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const We=(e,t,n)=>null!=e?e:null!=t?t:n;function Ge(e,t){if(!e)return null;const n=e(t);return 1===n.length?n[0]:n}const Ke=(0,t.defineComponent)({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:a,slots:i}){!function(){const e=(0,t.getCurrentInstance)(),n=e.parent&&e.parent.type.name,a=e.parent&&e.parent.subTree&&e.parent.subTree.type;if(n&&("KeepAlive"===n||n.includes("Transition"))&&"object"==typeof a&&"RouterView"===a.name){const e="KeepAlive"===n?"keep-alive":"transition";c(` can no longer be used directly inside or .\nUse slot props instead:\n\n\n <${e}>\n \n \n`)}}();const o=(0,t.inject)(De),s=(0,t.computed)(()=>e.route||o.value),u=(0,t.inject)(Ne,0),d=(0,t.computed)(()=>{let e=(0,t.unref)(u);const{matched:n}=s.value;let a;for(;(a=n[e])&&!a.components;)e++;return e}),h=(0,t.computed)(()=>s.value.matched[d.value]);(0,t.provide)(Ne,(0,t.computed)(()=>d.value+1)),(0,t.provide)(Ie,h),(0,t.provide)(De,s);const p=(0,t.ref)();return(0,t.watch)(()=>[p.value,h.value,e.name],([e,t,n],[a,i,r])=>{t&&(t.instances[n]=e,i&&i!==t&&e&&e===a&&(t.leaveGuards.size||(t.leaveGuards=i.leaveGuards),t.updateGuards.size||(t.updateGuards=i.updateGuards))),!e||!t||i&&I(t,i)&&a||(t.enterCallbacks[n]||[]).forEach(t=>t(e))},{flush:"post"}),()=>{const o=s.value,u=e.name,c=h.value,f=c&&c.components[u];if(!f)return Ge(i.default,{Component:f,route:o});const m=c.props[u],_=m?!0===m?o.params:"function"==typeof m?m(o):m:null,g=(0,t.h)(f,r({},_,a,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(c.instances[u]=null)},ref:p}));if(n&&g.ref){const e={depth:d.value,name:c.name,path:c.path,meta:c.meta};(l(g.ref)?g.ref.map(e=>e.i):[g.ref.i]).forEach(t=>{t.__vrv_devtools=e})}return Ge(i.default,{Component:g,route:o})||g}}});return e.NavigationFailureType=ne,e.RouterLink=$e,e.RouterView=Ke,e.START_LOCATION=D,e.createMemoryHistory=function(e=""){let t=[],n=[["",{}]],a=0;function i(e,t={}){a++,a!==n.length&&n.splice(a),n.push([e,t])}const r={location:"",state:{},base:e=F(e),createHref:U.bind(null,e),replace(e,t){n.splice(a--,1),i(e,t)},push(e,t){i(e,t)},listen:e=>(t.push(e),()=>{const n=t.indexOf(e);n>-1&&t.splice(n,1)}),destroy(){t=[],n=[["",{}]],a=0},go(e,i=!0){const r=this.location,o=e<0?B.back:B.forward;a=Math.max(0,Math.min(a+e,n.length-1)),i&&function(e,n,{direction:a,delta:i}){const r={direction:a,delta:i,type:q.pop};for(const a of t)a(e,n,r)}(this.location,r,{direction:o,delta:e})}};return Object.defineProperty(r,"location",{enumerable:!0,get:()=>n[a][0]}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>n[a][1]}),r},e.createRouter=function(e){const a=ye(e.routes,e),i=e.parseQuery||Me,u=e.stringifyQuery||Re,d=e.history;if(!d)throw new Error('Provide the "history" option when calling "createRouter()": https://router.vuejs.org/api/interfaces/RouterOptions.html#history');const h=qe(),p=qe(),f=qe(),m=(0,t.shallowRef)(D);let _=D;n&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const g=o.bind(null,e=>""+e),v=o.bind(null,E),y=o.bind(null,A);function k(e,t){if(t=r({},t||m.value),"string"==typeof e){const n=M(i,e,t.path),o=a.resolve({path:n.path},t),s=d.createHref(n.fullPath);return s.startsWith("//")?c(`Location "${e}" resolved to "${s}". A resolved location cannot start with multiple slashes.`):o.matched.length||c(`No match found for location with path "${e}"`),r(n,o,{params:y(o.params),redirectedFrom:void 0,href:s})}if(!J(e))return c("router.resolve() was passed an invalid location. This will fail in production.\n- Location:",e),k({});let n;if(null!=e.path)"params"in e&&!("name"in e)&&Object.keys(e.params).length&&c(`Path "${e.path}" was passed with params but they will be ignored. Use a named route alongside params instead.`),n=r({},e,{path:M(i,e.path,t.path).path});else{const a=r({},e.params);for(const e in a)null==a[e]&&delete a[e];n=r({},e,{params:v(a)}),t.params=v(t.params)}const o=a.resolve(n,t),s=e.hash||"";s&&!s.startsWith("#")&&c(`A \`hash\` should always start with the character "#". Replace "${s}" with "#${s}".`),o.params=g(y(o.params));const l=function(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}(u,r({},e,{hash:(h=s,C(h).replace(w,"{").replace(x,"}").replace(b,"^")),path:o.path}));var h;const p=d.createHref(l);return p.startsWith("//")?c(`Location "${e}" resolved to "${p}". A resolved location cannot start with multiple slashes.`):o.matched.length||c(`No match found for location with path "${null!=e.path?e.path:e}"`),r({fullPath:l,hash:s,query:u===Re?ze(e.query):e.query||{}},o,{redirectedFrom:void 0,href:p})}function S(e){return"string"==typeof e?M(i,e,m.value.path):r({},e)}function T(e,t){if(_!==e)return ie(ee.NAVIGATION_CANCELLED,{from:t,to:e})}function P(e){return R(e)}function L(e,t){const n=e.matched[e.matched.length-1];if(n&&n.redirect){const{redirect:a}=n;let i="function"==typeof a?a(e,t):a;if("string"==typeof i&&(i=i.includes("?")||i.includes("#")?i=S(i):{path:i},i.params={}),null==i.path&&!("name"in i))throw c(`Invalid redirect found:\n${JSON.stringify(i,null,2)}\n when navigating to "${e.fullPath}". A redirect must contain a name or path. This will break in production.`),new Error("Invalid redirect");return r({query:e.query,hash:e.hash,params:null!=i.path?{}:e.params},i)}}function R(e,t){const n=_=k(e),a=m.value,i=e.state,o=e.force,s=!0===e.replace,l=L(n,a);if(l)return R(r(S(l),{state:"object"==typeof l?r({},i,l.state):i,force:o,replace:s}),t||n);const d=n;let h;return d.redirectedFrom=t,!o&&z(u,a,n)&&(h=ie(ee.NAVIGATION_DUPLICATED,{to:d,from:a}),ne(a,a,!0,!1)),(h?Promise.resolve(h):j(d,a)).catch(e=>re(e)?re(e,ee.NAVIGATION_GUARD_REDIRECT)?e:te(e):Z(e,d,a)).then(e=>{if(e){if(re(e,ee.NAVIGATION_GUARD_REDIRECT))return z(u,k(e.to),d)&&t&&(t._count=t._count?t._count+1:1)>30?(c(`Detected a possibly infinite redirection in a navigation guard when going from "${a.fullPath}" to "${d.fullPath}". Aborting to avoid a Stack Overflow.\n Are you always returning a new location within a navigation guard? That would lead to this error. Only return when redirecting or aborting, that should fix this. This might break in production if not fixed.`),Promise.reject(new Error("Infinite redirect in navigation guard"))):R(r({replace:s},S(e.to),{state:"object"==typeof e.to?r({},i,e.to.state):i,force:o}),t||d)}else e=F(d,a,!0,s,i);return B(d,a,e),e})}function N(e,t){const n=T(e,t);return n?Promise.reject(n):Promise.resolve()}function O(e){const t=se.values().next().value;return t&&"function"==typeof t.runWithContext?t.runWithContext(e):e()}function j(e,t){let n;const[a,i,r]=function(e,t){const n=[],a=[],i=[],r=Math.max(t.matched.length,e.matched.length);for(let o=0;oI(e,r))?a.push(r):n.push(r));const s=e.matched[o];s&&(t.matched.find(e=>I(e,s))||i.push(s))}return[n,a,i]}(e,t);n=Ve(a.reverse(),"beforeRouteLeave",e,t);for(const i of a)i.leaveGuards.forEach(a=>{n.push(Fe(a,e,t))});const o=N.bind(null,e,t);return n.push(o),ue(n).then(()=>{n=[];for(const a of h.list())n.push(Fe(a,e,t));return n.push(o),ue(n)}).then(()=>{n=Ve(i,"beforeRouteUpdate",e,t);for(const a of i)a.updateGuards.forEach(a=>{n.push(Fe(a,e,t))});return n.push(o),ue(n)}).then(()=>{n=[];for(const a of r)if(a.beforeEnter)if(l(a.beforeEnter))for(const i of a.beforeEnter)n.push(Fe(i,e,t));else n.push(Fe(a.beforeEnter,e,t));return n.push(o),ue(n)}).then(()=>(e.matched.forEach(e=>e.enterCallbacks={}),n=Ve(r,"beforeRouteEnter",e,t,O),n.push(o),ue(n))).then(()=>{n=[];for(const a of p.list())n.push(Fe(a,e,t));return n.push(o),ue(n)}).catch(e=>re(e,ee.NAVIGATION_CANCELLED)?e:Promise.reject(e))}function B(e,t,n){f.list().forEach(a=>O(()=>a(e,t,n)))}function F(e,t,a,i,o){const s=T(e,t);if(s)return s;const l=t===D,u=n?history.state:{};a&&(i||l?d.replace(e.fullPath,r({scroll:l&&u&&u.scroll},o)):d.push(e.fullPath,o)),m.value=e,ne(e,t,a,l),te()}let V;function U(){V||(V=d.listen((e,t,a)=>{if(!le.listening)return;const i=k(e),o=L(i,le.currentRoute.value);if(o)return void R(r(o,{replace:!0,force:!0}),i).catch(s);_=i;const l=m.value;var u,c;n&&(u=W(l.fullPath,a.delta),c=$(),G.set(u,c)),j(i,l).catch(e=>re(e,ee.NAVIGATION_ABORTED|ee.NAVIGATION_CANCELLED)?e:re(e,ee.NAVIGATION_GUARD_REDIRECT)?(R(r(S(e.to),{force:!0}),i).then(e=>{re(e,ee.NAVIGATION_ABORTED|ee.NAVIGATION_DUPLICATED)&&!a.delta&&a.type===q.pop&&d.go(-1,!1)}).catch(s),Promise.reject()):(a.delta&&d.go(-a.delta,!1),Z(e,i,l))).then(e=>{(e=e||F(i,l,!1))&&(a.delta&&!re(e,ee.NAVIGATION_CANCELLED)?d.go(-a.delta,!1):a.type===q.pop&&re(e,ee.NAVIGATION_ABORTED|ee.NAVIGATION_DUPLICATED)&&d.go(-1,!1)),B(i,l,e)}).catch(s)}))}let K,Y=qe(),Q=qe();function Z(e,t,n){te(e);const a=Q.list();return a.length?a.forEach(a=>a(e,t,n)):(c("uncaught error during route navigation:"),console.error(e)),Promise.reject(e)}function te(e){return K||(K=!e,U(),Y.list().forEach(([t,n])=>e?n(e):t()),Y.reset()),e}function ne(a,i,r,o){const{scrollBehavior:s}=e;if(!n||!s)return Promise.resolve();const l=!r&&function(e){const t=G.get(e);return G.delete(e),t}(W(a.fullPath,0))||(o||!r)&&history.state&&history.state.scroll||null;return(0,t.nextTick)().then(()=>s(a,i,l)).then(e=>e&&H(e)).catch(e=>Z(e,a,i))}const ae=e=>d.go(e);let oe;const se=new Set,le={currentRoute:m,listening:!0,addRoute:function(e,t){let n,i;return X(e)?(n=a.getRecordMatcher(e),n||c(`Parent route "${String(e)}" not found when adding child route`,t),i=t):i=e,a.addRoute(i,n)},removeRoute:function(e){const t=a.getRecordMatcher(e);t?a.removeRoute(t):c(`Cannot remove non-existent route "${String(e)}"`)},clearRoutes:a.clearRoutes,hasRoute:function(e){return!!a.getRecordMatcher(e)},getRoutes:function(){return a.getRoutes().map(e=>e.record)},resolve:k,options:e,push:P,replace:function(e){return P(r(S(e),{replace:!0}))},go:ae,back:()=>ae(-1),forward:()=>ae(1),beforeEach:h.add,beforeResolve:p.add,afterEach:f.add,onError:Q.add,isReady:function(){return K&&m.value!==D?Promise.resolve():new Promise((e,t)=>{Y.add([e,t])})},install(e){e.component("RouterLink",$e),e.component("RouterView",Ke),e.config.globalProperties.$router=le,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>(0,t.unref)(m)}),n&&!oe&&m.value===D&&(oe=!0,P(d.location).catch(e=>{c("Unexpected error when starting the router:",e)}));const a={};for(const e in D)Object.defineProperty(a,e,{get:()=>m.value[e],enumerable:!0});e.provide(Oe,le),e.provide(je,(0,t.shallowReactive)(a)),e.provide(De,m);const i=e.unmount;se.add(e),e.unmount=function(){se.delete(e),se.size<1&&(_=D,V&&V(),V=null,m.value=D,oe=!1,K=!1),i()}}};function ue(e){return e.reduce((e,t)=>e.then(()=>O(t)),Promise.resolve())}return le},e.createRouterMatcher=ye,e.createWebHashHistory=function(e){return(e=location.host?e||location.pathname+location.search:"").includes("#")||(e+="#"),e.endsWith("#/")||e.endsWith("#")||c(`A hash base must end with a "#":\n"${e}" should be "${e.replace(/#.*$/,"#")}".`),Z(e)},e.createWebHistory=Z,e.isNavigationFailure=re,e.loadRouteLocation=function(e){return e.matched.every(e=>e.redirect)?Promise.reject(new Error("Cannot load a route that redirects.")):Promise.all(e.matched.map(e=>e.components&&Promise.all(Object.keys(e.components).reduce((t,n)=>{const a=e.components[n];return"function"!=typeof a||"displayName"in a||t.push(a().then(t=>{if(!t)return Promise.reject(new Error(`Couldn't resolve component "${n}" at "${e.path}". Ensure you passed a function that returns a promise.`));const a=i(t)?t.default:t;e.mods[n]=t,e.components[n]=a})),t},[])))).then(()=>e)},e.matchedRouteKey=Ie,e.onBeforeRouteLeave=function(e){(0,t.getCurrentInstance)()?Be((0,t.inject)(Ie,{}),"leaveGuards",e):c("getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function")},e.onBeforeRouteUpdate=function(e){(0,t.getCurrentInstance)()?Be((0,t.inject)(Ie,{}),"updateGuards",e):c("getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function")},e.parseQuery=Me,e.routeLocationKey=je,e.routerKey=Oe,e.routerViewLocationKey=De,e.stringifyQuery=Re,e.useLink=Ue,e.useRoute=function(e){return(0,t.inject)(je)},e.useRouter=function(){return(0,t.inject)(Oe)},e.viewDepthKey=Ne,e}({},Vue); +var Vuex=function(e){"use strict";var t="store";function n(){return"undefined"!=typeof navigator?window:"undefined"!=typeof global?global:{}}function a(e,t){var a=n().__VUE_DEVTOOLS_GLOBAL_HOOK__;if(a)a.emit("devtools-plugin:setup",e,t);else{var i=n();(i.__VUE_DEVTOOLS_PLUGINS__=i.__VUE_DEVTOOLS_PLUGINS__||[]).push({pluginDescriptor:e,setupFn:t})}}function i(e,t){if(void 0===t&&(t=[]),null===e||"object"!=typeof e)return e;var n,a=(n=function(t){return t.original===e},t.filter(n)[0]);if(a)return a.copy;var o=Array.isArray(e)?[]:{};return t.push({original:e,copy:o}),Object.keys(e).forEach(function(n){o[n]=i(e[n],t)}),o}function o(e,t){Object.keys(e).forEach(function(n){return t(e[n],n)})}function r(e){return null!==e&&"object"==typeof e}function s(e,t){if(!e)throw new Error("[vuex] "+t)}function l(e,t,n){return t.indexOf(e)<0&&(n&&n.prepend?t.unshift(e):t.push(e)),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}function u(e,t){e._actions=Object.create(null),e._mutations=Object.create(null),e._wrappedGetters=Object.create(null),e._modulesNamespaceMap=Object.create(null);var n=e.state;d(e,n,[],e._modules.root,!0),c(e,n,t)}function c(t,n,a){var i=t._state,r=t._scope;t.getters={},t._makeLocalGettersCache=Object.create(null);var l=t._wrappedGetters,u={},c={},d=e.effectScope(!0);d.run(function(){o(l,function(n,a){u[a]=function(e,t){return function(){return e(t)}}(n,t),c[a]=e.computed(function(){return u[a]()}),Object.defineProperty(t.getters,a,{get:function(){return c[a].value},enumerable:!0})})}),t._state=e.reactive({data:n}),t._scope=d,t.strict&&function(t){e.watch(function(){return t._state.data},function(){s(t._committing,"do not mutate vuex store state outside mutation handlers.")},{deep:!0,flush:"sync"})}(t),i&&a&&t._withCommit(function(){i.data=null}),r&&r.stop()}function d(e,t,n,a,i){var o=!n.length,r=e._modules.getNamespace(n);if(a.namespaced&&(e._modulesNamespaceMap[r]&&console.error("[vuex] duplicate namespace "+r+" for the namespaced module "+n.join("/")),e._modulesNamespaceMap[r]=a),!o&&!i){var s=p(t,n.slice(0,-1)),l=n[n.length-1];e._withCommit(function(){l in s&&console.warn('[vuex] state field "'+l+'" was overridden by a module with the same name at "'+n.join(".")+'"'),s[l]=a.state})}var u=a.context=function(e,t,n){var a=""===t,i={dispatch:a?e.dispatch:function(n,a,i){var o=f(n,a,i),r=o.payload,s=o.options,l=o.type;if(s&&s.root||(l=t+l,e._actions[l]))return e.dispatch(l,r);console.error("[vuex] unknown local action type: "+o.type+", global type: "+l)},commit:a?e.commit:function(n,a,i){var o=f(n,a,i),r=o.payload,s=o.options,l=o.type;s&&s.root||(l=t+l,e._mutations[l])?e.commit(l,r,s):console.error("[vuex] unknown local mutation type: "+o.type+", global type: "+l)}};return Object.defineProperties(i,{getters:{get:a?function(){return e.getters}:function(){return h(e,t)}},state:{get:function(){return p(e.state,n)}}}),i}(e,r,n);a.forEachMutation(function(t,n){!function(e,t,n,a){var i=e._mutations[t]||(e._mutations[t]=[]);i.push(function(t){n.call(e,a.state,t)})}(e,r+n,t,u)}),a.forEachAction(function(t,n){var a=t.root?n:r+n,i=t.handler||t;!function(e,t,n,a){var i=e._actions[t]||(e._actions[t]=[]);i.push(function(t){var i,o=n.call(e,{dispatch:a.dispatch,commit:a.commit,getters:a.getters,state:a.state,rootGetters:e.getters,rootState:e.state},t);return(i=o)&&"function"==typeof i.then||(o=Promise.resolve(o)),e._devtoolHook?o.catch(function(t){throw e._devtoolHook.emit("vuex:error",t),t}):o})}(e,a,i,u)}),a.forEachGetter(function(t,n){!function(e,t,n,a){if(e._wrappedGetters[t])return void console.error("[vuex] duplicate getter key: "+t);e._wrappedGetters[t]=function(e){return n(a.state,a.getters,e.state,e.getters)}}(e,r+n,t,u)}),a.forEachChild(function(a,o){d(e,t,n.concat(o),a,i)})}function h(e,t){if(!e._makeLocalGettersCache[t]){var n={},a=t.length;Object.keys(e.getters).forEach(function(i){if(i.slice(0,a)===t){var o=i.slice(a);Object.defineProperty(n,o,{get:function(){return e.getters[i]},enumerable:!0})}}),e._makeLocalGettersCache[t]=n}return e._makeLocalGettersCache[t]}function p(e,t){return t.reduce(function(e,t){return e[t]},e)}function f(e,t,n){return r(e)&&e.type&&(n=t,t=e,e=e.type),s("string"==typeof e,"expects string as the type, but found "+typeof e+"."),{type:e,payload:t,options:n}}var m="vuex:mutations",_="vuex:actions",g="vuex",v=0;function b(e,t){a({id:"org.vuejs.vuex",app:e,label:"Vuex",homepage:"https://next.vuex.vuejs.org/",logo:"https://vuejs.org/images/icons/favicon-96x96.png",packageName:"vuex",componentStateTypes:["vuex bindings"]},function(n){n.addTimelineLayer({id:m,label:"Vuex Mutations",color:y}),n.addTimelineLayer({id:_,label:"Vuex Actions",color:y}),n.addInspector({id:g,label:"Vuex",icon:"storage",treeFilterPlaceholder:"Filter stores..."}),n.on.getInspectorTree(function(n){if(n.app===e&&n.inspectorId===g)if(n.filter){var a=[];S(a,t._modules.root,n.filter,""),n.rootNodes=a}else n.rootNodes=[x(t._modules.root,"")]}),n.on.getInspectorState(function(n){if(n.app===e&&n.inspectorId===g){var a=n.nodeId;h(t,a),n.state=function(e,t,n){t="root"===n?t:t[n];var a=Object.keys(t),i={state:Object.keys(e.state).map(function(t){return{key:t,editable:!0,value:e.state[t]}})};if(a.length){var o=function(e){var t={};return Object.keys(e).forEach(function(n){var a=n.split("/");if(a.length>1){var i=t,o=a.pop();a.forEach(function(e){i[e]||(i[e]={_custom:{value:{},display:e,tooltip:"Module",abstract:!0}}),i=i[e]._custom.value}),i[o]=C(function(){return e[n]})}else t[n]=C(function(){return e[n]})}),t}(t);i.getters=Object.keys(o).map(function(e){return{key:e.endsWith("/")?k(e):e,editable:!1,value:C(function(){return o[e]})}})}return i}((i=t._modules,(r=(o=a).split("/").filter(function(e){return e})).reduce(function(e,t,n){var a=e[t];if(!a)throw new Error('Missing module "'+t+'" for path "'+o+'".');return n===r.length-1?a:a._children},"root"===o?i:i.root._children)),"root"===a?t.getters:t._makeLocalGettersCache,a)}var i,o,r}),n.on.editInspectorState(function(n){if(n.app===e&&n.inspectorId===g){var a=n.nodeId,i=n.path;"root"!==a&&(i=a.split("/").filter(Boolean).concat(i)),t._withCommit(function(){n.set(t._state.data,i,n.state.value)})}}),t.subscribe(function(e,t){var a={};e.payload&&(a.payload=e.payload),a.state=t,n.notifyComponentUpdate(),n.sendInspectorTree(g),n.sendInspectorState(g),n.addTimelineEvent({layerId:m,event:{time:Date.now(),title:e.type,data:a}})}),t.subscribeAction({before:function(e,t){var a={};e.payload&&(a.payload=e.payload),e._id=v++,e._time=Date.now(),a.state=t,n.addTimelineEvent({layerId:_,event:{time:e._time,title:e.type,groupId:e._id,subtitle:"start",data:a}})},after:function(e,t){var a={},i=Date.now()-e._time;a.duration={_custom:{type:"duration",display:i+"ms",tooltip:"Action duration",value:i}},e.payload&&(a.payload=e.payload),a.state=t,n.addTimelineEvent({layerId:_,event:{time:Date.now(),title:e.type,groupId:e._id,subtitle:"end",data:a}})}})})}var y=8702998,w={label:"namespaced",textColor:16777215,backgroundColor:6710886};function k(e){return e&&"root"!==e?e.split("/").slice(-2,-1)[0]:"Root"}function x(e,t){return{id:t||"root",label:k(t),tags:e.namespaced?[w]:[],children:Object.keys(e._children).map(function(n){return x(e._children[n],t+n+"/")})}}function S(e,t,n,a){a.includes(n)&&e.push({id:a||"root",label:a.endsWith("/")?a.slice(0,a.length-1):a||"Root",tags:t.namespaced?[w]:[]}),Object.keys(t._children).forEach(function(i){S(e,t._children[i],n,a+i+"/")})}function C(e){try{return e()}catch(e){return e}}var T=function(e,t){this.runtime=t,this._children=Object.create(null),this._rawModule=e;var n=e.state;this.state=("function"==typeof n?n():n)||{}},P={namespaced:{configurable:!0}};P.namespaced.get=function(){return!!this._rawModule.namespaced},T.prototype.addChild=function(e,t){this._children[e]=t},T.prototype.removeChild=function(e){delete this._children[e]},T.prototype.getChild=function(e){return this._children[e]},T.prototype.hasChild=function(e){return e in this._children},T.prototype.update=function(e){this._rawModule.namespaced=e.namespaced,e.actions&&(this._rawModule.actions=e.actions),e.mutations&&(this._rawModule.mutations=e.mutations),e.getters&&(this._rawModule.getters=e.getters)},T.prototype.forEachChild=function(e){o(this._children,e)},T.prototype.forEachGetter=function(e){this._rawModule.getters&&o(this._rawModule.getters,e)},T.prototype.forEachAction=function(e){this._rawModule.actions&&o(this._rawModule.actions,e)},T.prototype.forEachMutation=function(e){this._rawModule.mutations&&o(this._rawModule.mutations,e)},Object.defineProperties(T.prototype,P);var E=function(e){this.register([],e,!1)};function A(e,t,n){if(R(e,n),t.update(n),n.modules)for(var a in n.modules){if(!t.getChild(a))return void console.warn("[vuex] trying to add a new module '"+a+"' on hot reloading, manual reload is needed");A(e.concat(a),t.getChild(a),n.modules[a])}}E.prototype.get=function(e){return e.reduce(function(e,t){return e.getChild(t)},this.root)},E.prototype.getNamespace=function(e){var t=this.root;return e.reduce(function(e,n){return e+((t=t.getChild(n)).namespaced?n+"/":"")},"")},E.prototype.update=function(e){A([],this.root,e)},E.prototype.register=function(e,t,n){var a=this;void 0===n&&(n=!0),R(e,t);var i=new T(t,n);0===e.length?this.root=i:this.get(e.slice(0,-1)).addChild(e[e.length-1],i);t.modules&&o(t.modules,function(t,i){a.register(e.concat(i),t,n)})},E.prototype.unregister=function(e){var t=this.get(e.slice(0,-1)),n=e[e.length-1],a=t.getChild(n);a?a.runtime&&t.removeChild(n):console.warn("[vuex] trying to unregister module '"+n+"', which is not registered")},E.prototype.isRegistered=function(e){var t=this.get(e.slice(0,-1)),n=e[e.length-1];return!!t&&t.hasChild(n)};var L={assert:function(e){return"function"==typeof e},expected:"function"},M={getters:L,mutations:L,actions:{assert:function(e){return"function"==typeof e||"object"==typeof e&&"function"==typeof e.handler},expected:'function or object with "handler" function'}};function R(e,t){Object.keys(M).forEach(function(n){if(t[n]){var a=M[n];o(t[n],function(t,i){s(a.assert(t),function(e,t,n,a,i){var o=t+" should be "+i+' but "'+t+"."+n+'"';e.length>0&&(o+=' in module "'+e.join(".")+'"');return o+=" is "+JSON.stringify(a)+".",o}(e,n,i,t,a.expected))})}})}var z=function e(t){var n=this;void 0===t&&(t={}),s("undefined"!=typeof Promise,"vuex requires a Promise polyfill in this browser."),s(this instanceof e,"store must be called with the new operator.");var a=t.plugins;void 0===a&&(a=[]);var i=t.strict;void 0===i&&(i=!1);var o=t.devtools;this._committing=!1,this._actions=Object.create(null),this._actionSubscribers=[],this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._modules=new E(t),this._modulesNamespaceMap=Object.create(null),this._subscribers=[],this._makeLocalGettersCache=Object.create(null),this._scope=null,this._devtools=o;var r=this,l=this.dispatch,u=this.commit;this.dispatch=function(e,t){return l.call(r,e,t)},this.commit=function(e,t,n){return u.call(r,e,t,n)},this.strict=i;var h=this._modules.root.state;d(this,h,[],this._modules.root),c(this,h),a.forEach(function(e){return e(n)})},O={state:{configurable:!0}};z.prototype.install=function(e,n){e.provide(n||t,this),e.config.globalProperties.$store=this,(void 0===this._devtools||this._devtools)&&b(e,this)},O.state.get=function(){return this._state.data},O.state.set=function(e){s(!1,"use store.replaceState() to explicit replace store state.")},z.prototype.commit=function(e,t,n){var a=this,i=f(e,t,n),o=i.type,r=i.payload,s=i.options,l={type:o,payload:r},u=this._mutations[o];u?(this._withCommit(function(){u.forEach(function(e){e(r)})}),this._subscribers.slice().forEach(function(e){return e(l,a.state)}),s&&s.silent&&console.warn("[vuex] mutation type: "+o+". Silent option has been removed. Use the filter functionality in the vue-devtools")):console.error("[vuex] unknown mutation type: "+o)},z.prototype.dispatch=function(e,t){var n=this,a=f(e,t),i=a.type,o=a.payload,r={type:i,payload:o},s=this._actions[i];if(s){try{this._actionSubscribers.slice().filter(function(e){return e.before}).forEach(function(e){return e.before(r,n.state)})}catch(e){console.warn("[vuex] error in before action subscribers: "),console.error(e)}var l=s.length>1?Promise.all(s.map(function(e){return e(o)})):s[0](o);return new Promise(function(e,t){l.then(function(t){try{n._actionSubscribers.filter(function(e){return e.after}).forEach(function(e){return e.after(r,n.state)})}catch(e){console.warn("[vuex] error in after action subscribers: "),console.error(e)}e(t)},function(e){try{n._actionSubscribers.filter(function(e){return e.error}).forEach(function(t){return t.error(r,n.state,e)})}catch(e){console.warn("[vuex] error in error action subscribers: "),console.error(e)}t(e)})})}console.error("[vuex] unknown action type: "+i)},z.prototype.subscribe=function(e,t){return l(e,this._subscribers,t)},z.prototype.subscribeAction=function(e,t){return l("function"==typeof e?{before:e}:e,this._actionSubscribers,t)},z.prototype.watch=function(t,n,a){var i=this;return s("function"==typeof t,"store.watch only accepts a function."),e.watch(function(){return t(i.state,i.getters)},n,Object.assign({},a))},z.prototype.replaceState=function(e){var t=this;this._withCommit(function(){t._state.data=e})},z.prototype.registerModule=function(e,t,n){void 0===n&&(n={}),"string"==typeof e&&(e=[e]),s(Array.isArray(e),"module path must be a string or an Array."),s(e.length>0,"cannot register the root module by using registerModule."),this._modules.register(e,t),d(this,this.state,e,this._modules.get(e),n.preserveState),c(this,this.state)},z.prototype.unregisterModule=function(e){var t=this;"string"==typeof e&&(e=[e]),s(Array.isArray(e),"module path must be a string or an Array."),this._modules.unregister(e),this._withCommit(function(){delete p(t.state,e.slice(0,-1))[e[e.length-1]]}),u(this)},z.prototype.hasModule=function(e){return"string"==typeof e&&(e=[e]),s(Array.isArray(e),"module path must be a string or an Array."),this._modules.isRegistered(e)},z.prototype.hotUpdate=function(e){this._modules.update(e),u(this,!0)},z.prototype._withCommit=function(e){var t=this._committing;this._committing=!0,e(),this._committing=t},Object.defineProperties(z.prototype,O);var I=F(function(e,t){var n={};return B(t)||console.error("[vuex] mapState: mapper parameter must be either an Array or an Object"),j(t).forEach(function(t){var a=t.key,i=t.val;n[a]=function(){var t=this.$store.state,n=this.$store.getters;if(e){var a=$(this.$store,"mapState",e);if(!a)return;t=a.context.state,n=a.context.getters}return"function"==typeof i?i.call(this,t,n):t[i]},n[a].vuex=!0}),n}),N=F(function(e,t){var n={};return B(t)||console.error("[vuex] mapMutations: mapper parameter must be either an Array or an Object"),j(t).forEach(function(t){var a=t.key,i=t.val;n[a]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var a=this.$store.commit;if(e){var o=$(this.$store,"mapMutations",e);if(!o)return;a=o.context.commit}return"function"==typeof i?i.apply(this,[a].concat(t)):a.apply(this.$store,[i].concat(t))}}),n}),D=F(function(e,t){var n={};return B(t)||console.error("[vuex] mapGetters: mapper parameter must be either an Array or an Object"),j(t).forEach(function(t){var a=t.key,i=t.val;i=e+i,n[a]=function(){if(!e||$(this.$store,"mapGetters",e)){if(i in this.$store.getters)return this.$store.getters[i];console.error("[vuex] unknown getter: "+i)}},n[a].vuex=!0}),n}),q=F(function(e,t){var n={};return B(t)||console.error("[vuex] mapActions: mapper parameter must be either an Array or an Object"),j(t).forEach(function(t){var a=t.key,i=t.val;n[a]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var a=this.$store.dispatch;if(e){var o=$(this.$store,"mapActions",e);if(!o)return;a=o.context.dispatch}return"function"==typeof i?i.apply(this,[a].concat(t)):a.apply(this.$store,[i].concat(t))}}),n});function j(e){return B(e)?Array.isArray(e)?e.map(function(e){return{key:e,val:e}}):Object.keys(e).map(function(t){return{key:t,val:e[t]}}):[]}function B(e){return Array.isArray(e)||r(e)}function F(e){return function(t,n){return"string"!=typeof t?(n=t,t=""):"/"!==t.charAt(t.length-1)&&(t+="/"),e(t,n)}}function $(e,t,n){var a=e._modulesNamespaceMap[n];return a||console.error("[vuex] module namespace not found in "+t+"(): "+n),a}function V(e,t,n){var a=n?e.groupCollapsed:e.group;try{a.call(e,t)}catch(n){e.log(t)}}function U(e){try{e.groupEnd()}catch(t){e.log("—— log end ——")}}function H(){var e=new Date;return" @ "+W(e.getHours(),2)+":"+W(e.getMinutes(),2)+":"+W(e.getSeconds(),2)+"."+W(e.getMilliseconds(),3)}function W(e,t){return n="0",a=t-e.toString().length,new Array(a+1).join(n)+e;var n,a}return{version:"4.1.0",Store:z,storeKey:t,createStore:function(e){return new z(e)},useStore:function(n){return void 0===n&&(n=null),e.inject(null!==n?n:t)},mapState:I,mapMutations:N,mapGetters:D,mapActions:q,createNamespacedHelpers:function(e){return{mapState:I.bind(null,e),mapGetters:D.bind(null,e),mapMutations:N.bind(null,e),mapActions:q.bind(null,e)}},createLogger:function(e){void 0===e&&(e={});var t=e.collapsed;void 0===t&&(t=!0);var n=e.filter;void 0===n&&(n=function(e,t,n){return!0});var a=e.transformer;void 0===a&&(a=function(e){return e});var o=e.mutationTransformer;void 0===o&&(o=function(e){return e});var r=e.actionFilter;void 0===r&&(r=function(e,t){return!0});var s=e.actionTransformer;void 0===s&&(s=function(e){return e});var l=e.logMutations;void 0===l&&(l=!0);var u=e.logActions;void 0===u&&(u=!0);var c=e.logger;return void 0===c&&(c=console),function(e){var d=i(e.state);void 0!==c&&(l&&e.subscribe(function(e,r){var s=i(r);if(n(e,d,s)){var l=H(),u=o(e),h="mutation "+e.type+l;V(c,h,t),c.log("%c prev state","color: #9E9E9E; font-weight: bold",a(d)),c.log("%c mutation","color: #03A9F4; font-weight: bold",u),c.log("%c next state","color: #4CAF50; font-weight: bold",a(s)),U(c)}d=s}),u&&e.subscribeAction(function(e,n){if(r(e,n)){var a=H(),i=s(e),o="action "+e.type+a;V(c,o,t),c.log("%c action","color: #03A9F4; font-weight: bold",i),U(c)}}))}}}}(Vue),VueI18n=function(e,t){"use strict";var n=function(e){var t=Object.create(null);if(e)for(var n in e)t[n]=e[n];return t.default=e,Object.freeze(t)}(t);function a(e,t){"undefined"!=typeof console&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const i="undefined"!=typeof window,o=(e,t=!1)=>t?Symbol.for(e):Symbol(e),r=(e,t,n)=>s({l:e,k:t,s:n}),s=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),l=e=>"number"==typeof e&&isFinite(e),u=e=>"[object Date]"===C(e),c=e=>"[object RegExp]"===C(e),d=e=>T(e)&&0===Object.keys(e).length,h=Object.assign,p=Object.create,f=(e=null)=>p(e);function m(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/").replace(/=/g,"=")}function _(e){return e.replace(/&(?![a-zA-Z0-9#]{2,6};)/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}const g=Object.prototype.hasOwnProperty;function v(e,t){return g.call(e,t)}const b=Array.isArray,y=e=>"function"==typeof e,w=e=>"string"==typeof e,k=e=>"boolean"==typeof e,x=e=>null!==e&&"object"==typeof e,S=Object.prototype.toString,C=e=>S.call(e),T=e=>"[object Object]"===C(e);function P(e,t=""){return e.reduce((e,n,a)=>0===a?e+n:e+t+n,"")}const E=e=>!x(e)||b(e);function A(e,t){if(E(e)||E(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:e,des:t}=n.pop();Object.keys(e).forEach(a=>{"__proto__"!==a&&(x(e[a])&&!x(t[a])&&(t[a]=Array.isArray(e[a])?[]:f()),E(t[a])||E(e[a])?t[a]=e[a]:n.push({src:e[a],des:t[a]}))})}}function L(e){throw e}const M=" ",R="\n",z=String.fromCharCode(8232),O=String.fromCharCode(8233);function I(e){const t=e;let n=0,a=1,i=1,o=0;const r=e=>"\r"===t[e]&&t[e+1]===R,s=e=>t[e]===O,l=e=>t[e]===z,u=e=>r(e)||s(e)||l(e)?R:t[e];function c(){return o=0,(e=>r(e)||(e=>t[e]===R)(e)||s(e)||l(e))(n)&&(a++,i=0),r(n)&&n++,n++,i++,t[n]}return{index:()=>n,line:()=>a,column:()=>i,peekOffset:()=>o,charAt:u,currentChar:()=>u(n),currentPeek:()=>u(n+o),next:c,peek:function(){return r(n+o)&&o++,o++,t[n+o]},reset:function(){n=0,a=1,i=1,o=0},resetPeek:function(e=0){o=e},skipToPeek:function(){const e=n+o;for(;e!==n;)c();o=0}}}const N=void 0;function D(e,t={}){const n=!1!==t.location,a=I(e),i=()=>a.index(),o=()=>({line:a.line(),column:a.column(),offset:a.index()}),r=o(),s=i(),l={currentType:13,offset:s,startLoc:r,endLoc:r,lastType:13,lastOffset:s,lastStartLoc:r,lastEndLoc:r,braceNest:0,inLinked:!1,text:""},{onError:u}=t;function c(e,t,a){e.endLoc=o(),e.currentType=t;const i={type:t};return n&&(i.loc=function(e,t){return{start:e,end:t}}(e.startLoc,e.endLoc)),null!=a&&(i.value=a),i}const d=e=>c(e,13);function h(e,t){return e.currentChar()===t?(e.next(),t):(o(),"")}function p(e){let t="";for(;e.currentPeek()===M||e.currentPeek()===R;)t+=e.currentPeek(),e.peek();return t}function f(e){const t=p(e);return e.skipToPeek(),t}function m(e){if(e===N)return!1;const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||95===t}function _(e){p(e);const t="|"===e.currentPeek();return e.resetPeek(),t}function g(e,t=!0){const n=(t=!1,a="")=>{const i=e.currentPeek();return"{"===i?t:"@"!==i&&i?"|"===i?!(a===M||a===R):i===M?(e.peek(),n(!0,M)):i!==R||(e.peek(),n(!0,R)):t},a=n();return t&&e.resetPeek(),a}function v(e,t){const n=e.currentChar();return n===N?N:t(n)?(e.next(),n):null}function b(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t}function y(e){return v(e,b)}function w(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t||45===t}function k(e){return v(e,w)}function x(e){const t=e.charCodeAt(0);return t>=48&&t<=57}function S(e){return v(e,x)}function C(e){const t=e.charCodeAt(0);return t>=48&&t<=57||t>=65&&t<=70||t>=97&&t<=102}function T(e){return v(e,C)}function P(e){let t="",n="";for(;t=S(e);)n+=t;return n}function E(e){return"'"!==e&&e!==R}function A(e){const t=e.currentChar();switch(t){case"\\":case"'":return e.next(),`\\${t}`;case"u":return L(e,t,4);case"U":return L(e,t,6);default:return o(),""}}function L(e,t,n){h(e,t);let a="";for(let t=0;t=1&&o(),e.next(),n=c(t,2,"{"),f(e),t.braceNest++,n;case"}":return t.braceNest>0&&2===t.currentType&&o(),e.next(),n=c(t,3,"}"),t.braceNest--,t.braceNest>0&&f(e),t.inLinked&&0===t.braceNest&&(t.inLinked=!1),n;case"@":return t.braceNest>0&&o(),n=j(e,t)||d(t),t.braceNest=0,n;default:{let a=!0,i=!0,r=!0;if(_(e))return t.braceNest>0&&o(),n=c(t,1,D(e)),t.braceNest=0,t.inLinked=!1,n;if(t.braceNest>0&&(4===t.currentType||5===t.currentType||6===t.currentType))return o(),t.braceNest=0,B(e,t);if(a=function(e,t){const{currentType:n}=t;if(2!==n)return!1;p(e);const a=m(e.currentPeek());return e.resetPeek(),a}(e,t))return n=c(t,4,function(e){f(e);let t="",n="";for(;t=k(e);)n+=t;const a=e.currentChar();if(a&&"}"!==a&&a!==N&&a!==M&&a!==R&&" "!==a){const t=O(e);return o(),n+t}return e.currentChar()===N&&o(),n}(e)),f(e),n;if(i=function(e,t){const{currentType:n}=t;if(2!==n)return!1;p(e);const a=function(e){if(e===N)return!1;const t=e.charCodeAt(0);return t>=48&&t<=57}("-"===e.currentPeek()?e.peek():e.currentPeek());return e.resetPeek(),a}(e,t))return n=c(t,5,function(e){f(e);let t="";return"-"===e.currentChar()?(e.next(),t+=`-${P(e)}`):t+=P(e),e.currentChar()===N&&o(),t}(e)),f(e),n;if(r=function(e,t){const{currentType:n}=t;if(2!==n)return!1;p(e);const a="'"===e.currentPeek();return e.resetPeek(),a}(e,t))return n=c(t,6,function(e){f(e),h(e,"'");let t="",n="";for(;t=v(e,E);)n+="\\"===t?A(e):t;const a=e.currentChar();return a===R||a===N?(o(),a===R&&(e.next(),h(e,"'")),n):(h(e,"'"),n)}(e)),f(e),n;if(!a&&!i&&!r)return n=c(t,12,O(e)),o(),n.value,f(e),n;break}}return n}function j(e,t){const{currentType:n}=t;let a=null;const i=e.currentChar();switch(7!==n&&8!==n&&11!==n&&9!==n||i!==R&&i!==M||o(),i){case"@":return e.next(),a=c(t,7,"@"),t.inLinked=!0,a;case".":return f(e),e.next(),c(t,8,".");case":":return f(e),e.next(),c(t,9,":");default:return _(e)?(a=c(t,1,D(e)),t.braceNest=0,t.inLinked=!1,a):function(e,t){const{currentType:n}=t;if(7!==n)return!1;p(e);const a="."===e.currentPeek();return e.resetPeek(),a}(e,t)||function(e,t){const{currentType:n}=t;if(7!==n&&11!==n)return!1;p(e);const a=":"===e.currentPeek();return e.resetPeek(),a}(e,t)?(f(e),j(e,t)):function(e,t){const{currentType:n}=t;if(8!==n)return!1;p(e);const a=m(e.currentPeek());return e.resetPeek(),a}(e,t)?(f(e),c(t,11,function(e){let t="",n="";for(;t=y(e);)n+=t;return n}(e))):function(e,t){const{currentType:n}=t;if(9!==n)return!1;const a=()=>{const t=e.currentPeek();return"{"===t?m(e.peek()):!("@"===t||"|"===t||":"===t||"."===t||t===M||!t)&&(t===R?(e.peek(),a()):g(e,!1))},i=a();return e.resetPeek(),i}(e,t)?(f(e),"{"===i?q(e,t)||a:c(t,10,function(e){const t=n=>{const a=e.currentChar();return"{"!==a&&"@"!==a&&"|"!==a&&"("!==a&&")"!==a&&a?a===M?n:(n+=a,e.next(),t(n)):n};return t("")}(e))):(7===n&&o(),t.braceNest=0,t.inLinked=!1,B(e,t))}}function B(e,t){let n={type:13};if(t.braceNest>0)return q(e,t)||d(t);if(t.inLinked)return j(e,t)||d(t);switch(e.currentChar()){case"{":return q(e,t)||d(t);case"}":return o(),e.next(),c(t,3,"}");case"@":return j(e,t)||d(t);default:if(_(e))return n=c(t,1,D(e)),t.braceNest=0,t.inLinked=!1,n;if(g(e))return c(t,0,function(e){let t="";for(;;){const n=e.currentChar();if("\\"===n){const a=e.peek();"{"===a||"}"===a||"@"===a||"|"===a||"\\"===a?(t+=n+a,e.next(),e.next()):(e.resetPeek(),t+=n,e.next())}else{if("{"===n||"}"===n||"@"===n||"|"===n||!n)break;if(n===M||n===R)if(g(e))t+=n,e.next();else{if(_(e))break;t+=n,e.next()}else t+=n,e.next()}}return t}(e))}return n}return{nextToken:function(){const{currentType:e,offset:t,startLoc:n,endLoc:r}=l;return l.lastType=e,l.lastOffset=t,l.lastStartLoc=n,l.lastEndLoc=r,l.offset=i(),l.startLoc=o(),a.currentChar()===N?c(l,13):B(a,l)},currentOffset:i,currentPosition:o,context:()=>l}}const q=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g,j=/\\([\\@{}|])/g;function B(e,t){return t}function F(e,t,n){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const e=parseInt(t||n,16);return e<=55295||e>=57344?String.fromCodePoint(e):"�"}}}function $(e={}){const t=!1!==e.location,{onError:n}=e;function a(e,n,a){const i={type:e};return t&&(i.start=n,i.end=n,i.loc={start:a,end:a}),i}function i(e,n,a,i){t&&(e.end=n,e.loc&&(e.loc.end=a))}function o(e,t){const n=e.context(),o=a(3,n.offset,n.startLoc);return o.value=t.replace(j,B),i(o,e.currentOffset(),e.currentPosition()),o}function r(e,t){const n=e.context(),{lastOffset:o,lastStartLoc:r}=n,s=a(5,o,r);return s.index=parseInt(t,10),e.nextToken(),i(s,e.currentOffset(),e.currentPosition()),s}function s(e,t){const n=e.context(),{lastOffset:o,lastStartLoc:r}=n,s=a(4,o,r);return s.key=t,e.nextToken(),i(s,e.currentOffset(),e.currentPosition()),s}function l(e,t){const n=e.context(),{lastOffset:o,lastStartLoc:r}=n,s=a(9,o,r);return s.value=t.replace(q,F),e.nextToken(),i(s,e.currentOffset(),e.currentPosition()),s}function u(e){const t=e.context(),n=a(6,t.offset,t.startLoc);let o=e.nextToken();if(8===o.type){const t=function(e){const t=e.nextToken(),n=e.context(),{lastOffset:o,lastStartLoc:r}=n,s=a(8,o,r);return 11!==t.type?(n.lastStartLoc,s.value="",i(s,o,r),{nextConsumeToken:t,node:s}):(null==t.value&&(n.lastStartLoc,V(t)),s.value=t.value||"",i(s,e.currentOffset(),e.currentPosition()),{node:s})}(e);n.modifier=t.node,o=t.nextConsumeToken||e.nextToken()}switch(9!==o.type&&(t.lastStartLoc,V(o)),o=e.nextToken(),2===o.type&&(o=e.nextToken()),o.type){case 10:null==o.value&&(t.lastStartLoc,V(o)),n.key=function(e,t){const n=e.context(),o=a(7,n.offset,n.startLoc);return o.value=t,i(o,e.currentOffset(),e.currentPosition()),o}(e,o.value||"");break;case 4:null==o.value&&(t.lastStartLoc,V(o)),n.key=s(e,o.value||"");break;case 5:null==o.value&&(t.lastStartLoc,V(o)),n.key=r(e,o.value||"");break;case 6:null==o.value&&(t.lastStartLoc,V(o)),n.key=l(e,o.value||"");break;default:{t.lastStartLoc;const r=e.context(),s=a(7,r.offset,r.startLoc);return s.value="",i(s,r.offset,r.startLoc),n.key=s,i(n,r.offset,r.startLoc),{nextConsumeToken:o,node:n}}}return i(n,e.currentOffset(),e.currentPosition()),{node:n}}function c(e){const t=e.context(),n=a(2,1===t.currentType?e.currentOffset():t.offset,1===t.currentType?t.endLoc:t.startLoc);n.items=[];let c=null;do{const a=c||e.nextToken();switch(c=null,a.type){case 0:null==a.value&&(t.lastStartLoc,V(a)),n.items.push(o(e,a.value||""));break;case 5:null==a.value&&(t.lastStartLoc,V(a)),n.items.push(r(e,a.value||""));break;case 4:null==a.value&&(t.lastStartLoc,V(a)),n.items.push(s(e,a.value||""));break;case 6:null==a.value&&(t.lastStartLoc,V(a)),n.items.push(l(e,a.value||""));break;case 7:{const t=u(e);n.items.push(t.node),c=t.nextConsumeToken||null;break}}}while(13!==t.currentType&&1!==t.currentType);return i(n,1===t.currentType?t.lastOffset:e.currentOffset(),1===t.currentType?t.lastEndLoc:e.currentPosition()),n}return{parse:function(n){const o=D(n,h({},e)),r=o.context(),s=a(0,r.offset,r.startLoc);return t&&s.loc&&(s.loc.source=n),s.body=function(e){const t=e.context(),{offset:n,startLoc:o}=t,r=c(e);return 13===t.currentType?r:function(e,t,n,o){const r=e.context();let s=0===o.items.length;const l=a(1,t,n);l.cases=[],l.cases.push(o);do{const t=c(e);s||(s=0===t.items.length),l.cases.push(t)}while(13!==r.currentType);return i(l,e.currentOffset(),e.currentPosition()),l}(e,n,o,r)}(o),e.onCacheKey&&(s.cacheKey=e.onCacheKey(n)),13!==r.currentType&&(r.lastStartLoc,n[r.offset]),i(s,o.currentOffset(),o.currentPosition()),s}}}function V(e){if(13===e.type)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function U(e,t){for(let n=0;n1){e.push(`${n("plural")}([`),e.indent(a());const i=t.cases.length;for(let n=0;n{const n=w(t.mode)?t.mode:"normal",a=w(t.filename)?t.filename:"message.intl",i=!!t.sourceMap,o=null!=t.breakLineCode?t.breakLineCode:"arrow"===n?";":"\n",r=t.needIndent?t.needIndent:"arrow"!==n,s=e.helpers||[],l=function(e,t){const{sourceMap:n,filename:a,breakLineCode:i,needIndent:o}=t,r={filename:a,code:"",column:1,line:1,offset:0,map:void 0,breakLineCode:i,needIndent:o,indentLevel:0};function s(e,t){r.code+=e}function l(e,t=!0){const n=t?i:"";s(o?n+" ".repeat(e):n)}return!1!==t.location&&e.loc&&(r.source=e.loc.source),{context:()=>r,push:s,indent:function(e=!0){const t=++r.indentLevel;e&&l(t)},deindent:function(e=!0){const t=--r.indentLevel;e&&l(t)},newline:function(){l(r.indentLevel)},helper:e=>`_${e}`,needIndent:()=>r.needIndent}}(e,{mode:n,filename:a,sourceMap:i,breakLineCode:o,needIndent:r});l.push("normal"===n?"function __msg__ (ctx) {":"(ctx) => {"),l.indent(r),s.length>0&&(l.push(`const { ${P(s.map(e=>`${e}: _${e}`),", ")} } = ctx`),l.newline()),l.push("return "),K(l,e),l.deindent(r),l.push("}"),delete e.helpers;const{code:u,map:c}=l.context();return{ast:e,code:u,map:c?c.toJSON():void 0}};function Q(e,t={}){const n=h({},t),a=!!n.jit,i=!!n.minify,o=null==n.optimize||n.optimize,r=$(n).parse(e);return a?(o&&function(e){const t=e.body;2===t.type?W(t):t.cases.forEach(e=>W(e))}(r),i&&G(r),{ast:r,code:""}):(function(e){const t=function(e){const t={ast:e,helpers:new Set};return{context:()=>t,helper:e=>(t.helpers.add(e),e)}}(e);t.helper("normalize"),e.body&&H(e.body,t);const n=t.context();e.helpers=Array.from(n.helpers)}(r,n),Y(r,n))}function Z(e){return x(e)&&0===ae(e)&&(v(e,"b")||v(e,"body"))}const J=["b","body"],X=["c","cases"],ee=["s","static"],te=["i","items"],ne=["t","type"];function ae(e){return se(e,ne)}const ie=["v","value"];const oe=["m","modifier"],re=["k","key"];function se(e,t,n){for(let n=0;nfunction(e,t){const n=se(t,J);if(null==n)throw ue(0);if(1===ae(n)){const t=function(e){return se(e,X,[])}(n);return e.plural(t.reduce((t,n)=>[...t,de(e,n)],[]))}return de(e,n)}(t,e)}function de(e,t){const n=function(e){return se(e,ee)}(t);if(null!=n)return"text"===e.type?n:e.normalize([n]);{const n=function(e){return se(e,te,[])}(t).reduce((t,n)=>[...t,he(e,n)],[]);return e.normalize(n)}}function he(e,t){const n=ae(t);switch(n){case 3:case 9:case 7:case 8:return function(e,t){const n=se(e,ie);if(null!=n)return n;throw ue(t)}(t,n);case 4:{const a=t;if(v(a,"k")&&a.k)return e.interpolate(e.named(a.k));if(v(a,"key")&&a.key)return e.interpolate(e.named(a.key));throw ue(n)}case 5:{const a=t;if(v(a,"i")&&l(a.i))return e.interpolate(e.list(a.i));if(v(a,"index")&&l(a.index))return e.interpolate(e.list(a.index));throw ue(n)}case 6:{const n=t,a=function(e){return se(e,oe)}(n),i=function(e){const t=se(e,re);if(t)return t;throw ue(6)}(n);return e.linked(he(e,i),a?he(e,a):void 0,e.type)}default:throw new Error(`unhandled node on format message part: ${n}`)}}const pe=e=>e;let fe=f();const me=17,_e=18,ge=19,ve=21,be=22,ye=23;function we(e,t){return null!=t.locale?xe(t.locale):xe(e.locale)}let ke;function xe(e){if(w(e))return e;if(y(e)){if(e.resolvedOnce&&null!=ke)return ke;if("Function"===e.constructor.name){const t=e();if((e=>x(e)&&y(e.then)&&y(e.catch))(t))throw Error(ve);return ke=t}throw Error(be)}throw Error(ye)}function Se(e,t,n){return[...new Set([n,...b(t)?t:x(t)?Object.keys(t):w(t)?[t]:[n]])]}function Ce(e,t,n){const a=w(n)?n:Oe,i=e;i.__localeChainCache||(i.__localeChainCache=new Map);let o=i.__localeChainCache.get(a);if(!o){o=[];let e=[n];for(;b(e);)e=Te(o,e,t);const r=b(t)||!T(t)?t:t.default?t.default:null;e=w(r)?[r]:r,b(e)&&Te(o,e,!1),i.__localeChainCache.set(a,o)}return o}function Te(e,t,n){let a=!0;for(let i=0;i`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;let Ne,De,qe,je=null;const Be=e=>{je=e};let Fe=0;function $e(e={}){const t=y(e.onWarn)?e.onWarn:a,n=w(e.version)?e.version:"11.4.2",i=w(e.locale)||y(e.locale)?e.locale:Oe,o=y(i)?Oe:i,r=b(e.fallbackLocale)||T(e.fallbackLocale)||w(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:o,s=T(e.messages)?e.messages:Ve(o),l=T(e.datetimeFormats)?e.datetimeFormats:Ve(o),u=T(e.numberFormats)?e.numberFormats:Ve(o),d=h(f(),e.modifiers,{upper:(e,t)=>"text"===t&&w(e)?e.toUpperCase():"vnode"===t&&x(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>"text"===t&&w(e)?e.toLowerCase():"vnode"===t&&x(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>"text"===t&&w(e)?Ie(e):"vnode"===t&&x(e)&&"__v_isVNode"in e?Ie(e.children):e}),p=e.pluralRules||f(),m=y(e.missing)?e.missing:null,_=!k(e.missingWarn)&&!c(e.missingWarn)||e.missingWarn,g=!k(e.fallbackWarn)&&!c(e.fallbackWarn)||e.fallbackWarn,v=!!e.fallbackFormat,S=!!e.unresolving,C=y(e.postTranslation)?e.postTranslation:null,P=T(e.processor)?e.processor:null,E=!k(e.warnHtmlMessage)||e.warnHtmlMessage,A=!!e.escapeParameter,L=y(e.messageCompiler)?e.messageCompiler:Ne,M=y(e.messageResolver)?e.messageResolver:De||ze,R=y(e.localeFallbacker)?e.localeFallbacker:qe||Se,z=x(e.fallbackContext)?e.fallbackContext:void 0,O=e,I=x(O.__datetimeFormatters)?O.__datetimeFormatters:new Map,N=x(O.__numberFormatters)?O.__numberFormatters:new Map,D=x(O.__meta)?O.__meta:{};Fe++;const q={version:n,cid:Fe,locale:i,fallbackLocale:r,messages:s,modifiers:d,pluralRules:p,missing:m,missingWarn:_,fallbackWarn:g,fallbackFormat:v,unresolving:S,postTranslation:C,processor:P,warnHtmlMessage:E,escapeParameter:A,messageCompiler:L,messageResolver:M,localeFallbacker:R,fallbackContext:z,onWarn:t,__meta:D};return q.datetimeFormats=l,q.numberFormats=u,q.__datetimeFormatters=I,q.__numberFormatters=N,q}const Ve=e=>({[e]:f()});function Ue(e,t,n,a,i){const{missing:o,onWarn:r}=e;if(null!==o){const a=o(e,n,t,i);return w(a)?a:t}return t}function He(e,t,n){e.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function We(e,t){const n=t.indexOf(e);if(-1===n)return!1;for(let o=n+1;o{Ke.includes(e)?s[e]=n[e]:o[e]=n[e]}),w(a)?o.locale=a:T(a)&&(s=a),T(i)&&(s=i),[o.key||"",r,o,s]}function Qe(e,t,n){const a=e;for(const e in n){const n=`${t}__${e}`;a.__datetimeFormatters.has(n)&&a.__datetimeFormatters.delete(n)}}function Ze(e,...t){const{numberFormats:n,unresolving:a,fallbackLocale:i,onWarn:o,localeFallbacker:r}=e,{__numberFormatters:s}=e;if(!l(t[0]))return"";const[u,c,p,f]=Xe(...t);k(p.missingWarn)?p.missingWarn:e.missingWarn,k(p.fallbackWarn)?p.fallbackWarn:e.fallbackWarn;const m=!!p.part,_=we(e,p),g=r(e,i,_);if(!w(u)||""===u)return new Intl.NumberFormat(_.replace(/!/g,""),f).format(c);let v,b={},y=null;for(let t=0;t{Je.includes(e)?r[e]=n[e]:o[e]=n[e]}),w(a)?o.locale=a:T(a)&&(r=a),T(i)&&(r=i),[o.key||"",s,o,r]}function et(e,t,n){const a=e;for(const e in n){const n=`${t}__${e}`;a.__numberFormatters.has(n)&&a.__numberFormatters.delete(n)}}const tt=e=>e,nt=e=>"",at=e=>0===e.length?"":P(e),it=e=>null==e?"":b(e)||T(e)&&e.toString===S?JSON.stringify(e,null,2):String(e);function ot(e,t){return e=Math.abs(e),2===t?1===e?0:1:Math.min(e,2)}function rt(e={}){const t=e.locale,n=function(e){const t=l(e.pluralIndex)?e.pluralIndex:-1;return l(e.named?.count)?e.named.count:l(e.named?.n)?e.named.n:t}(e),a=w(t)&&y(e.pluralRules?.[t])?e.pluralRules[t]:ot,i=a===ot?void 0:ot,o=e.list||[],r=e.named||f();function s(t,n){return(y(e.messages)?e.messages(t,!!n):!!x(e.messages)&&e.messages[t])||(e.parent?e.parent.message(t):nt)}l(e.pluralIndex)&&(r.count||=e.pluralIndex,r.n||=e.pluralIndex);const u=y(e.processor?.normalize)?e.processor.normalize:at,c=y(e.processor?.interpolate)?e.processor.interpolate:it,d={list:e=>o[e],named:e=>r[e],plural:e=>e[a(n,e.length,i)],linked:(t,...n)=>{const[a,i]=n;let o="text",r="";1===n.length?x(a)?(r=a.modifier||r,o=a.type||o):w(a)&&(r=a||r):2===n.length&&(w(a)&&(r=a||r),w(i)&&(o=i||o));const l=s(t,!0)(d),u=""===l||void 0===l?t:l,c="vnode"===o&&b(u)&&r?u[0]:u;return r?(h=r,e.modifiers?e.modifiers[h]:tt)(c,o):c;var h},message:s,type:w(e.processor?.type)?e.processor.type:"text",interpolate:c,normalize:u,values:h(f(),o,r)};return d}const st=()=>"",lt=e=>y(e);function ut(e,...t){const{fallbackFormat:n,postTranslation:a,unresolving:i,messageCompiler:o,fallbackLocale:r,messages:s}=e,[u,c]=ht(...t),d=k(c.missingWarn)?c.missingWarn:e.missingWarn,h=k(c.fallbackWarn)?c.fallbackWarn:e.fallbackWarn,p=k(c.escapeParameter)?c.escapeParameter:e.escapeParameter,g=!!c.resolvedMessage,v=w(c.default)||k(c.default)?k(c.default)?o?u:()=>u:c.default:n?o?u:()=>u:null,S=n||null!=v&&(w(v)||y(v)),C=we(e,c);p&&function(e){b(e.list)?e.list=e.list.map(e=>w(e)?m(e):e):x(e.named)&&Object.keys(e.named).forEach(t=>{w(e.named[t])&&(e.named[t]=m(e.named[t]))})}(c);let[T,P,E]=g?[u,C,s[C]||f()]:ct(e,u,C,r,h,d),A=T,L=u;if(g||w(A)||Z(A)||lt(A)||S&&(A=v,L=A),!(g||(w(A)||Z(A)||lt(A))&&w(P)))return i?-1:u;let M=!1;const R=lt(A)?A:dt(e,u,P,A,L,()=>{M=!0});if(M)return A;const z=function(e,t,n,a){const{modifiers:i,pluralRules:o,messageResolver:r,fallbackLocale:s,fallbackWarn:u,missingWarn:c,fallbackContext:d}=e,h={locale:t,modifiers:i,pluralRules:o,messages:(a,i)=>{let o=r(n,a);if(null==o&&(d||i)){const[n,,i]=ct(d||e,a,t,s,u,c);o=n??r(i,a)}if(w(o)||Z(o)){let n=!1;const i=dt(e,a,t,o,a,()=>{n=!0});return n?st:i}return lt(o)?o:st}};return e.processor&&(h.processor=e.processor),a.list&&(h.list=a.list),a.named&&(h.named=a.named),l(a.plural)&&(h.pluralIndex=a.plural),h}(e,P,E,c),O=function(e,t,n){return t(n)}(0,R,rt(z));let I=a?a(O,u):O;var N;return p&&w(I)&&(N=(N=(N=I).replace(/(\w+)\s*=\s*"([^"]*)"/g,(e,t,n)=>`${t}="${_(n)}"`)).replace(/(\w+)\s*=\s*'([^']*)'/g,(e,t,n)=>`${t}='${_(n)}'`),/\s*on\w+\s*=\s*["']?[^"'>]+["']?/gi.test(N)&&(N=N.replace(/(\s+)(on)(\w+\s*=)/gi,"$1on$3")),[/(\s+(?:href|src|action|formaction)\s*=\s*["']?)\s*javascript:/gi,/(style\s*=\s*["'][^"']*url\s*\(\s*)javascript:/gi].forEach(e=>{N=N.replace(e,"$1javascript:")}),I=N),I}function ct(e,t,n,a,i,o){const{messages:r,onWarn:s,messageResolver:l,localeFallbacker:u}=e,c=u(e,a,n);let d,h=f(),p=null;for(let n=0;na;return e.locale=n,e.key=t,e}const u=s(a,function(e,t,n,a,i,o){return{locale:t,key:n,warnHtmlMessage:i,onError:e=>{throw o&&o(e),e},onCacheKey:e=>r(t,n,e)}}(0,n,i,0,l,o));return u.locale=n,u.key=t,u.source=a,u}function ht(...e){const[t,n,a]=e,i=f();if(!(w(t)||l(t)||lt(t)||Z(t)))throw Error(me);const o=l(t)?String(t):(lt(t),t);return l(n)?i.plural=n:w(n)?i.default=n:T(n)&&!d(n)?i.named=n:b(n)&&(i.list=n),l(a)?i.plural=a:w(a)?i.default=a:T(a)&&h(i,a),[o,i]}const pt="11.4.2",ft=24,mt=25,_t=26,gt=27,vt=28,bt=29,yt=31,wt=32,kt=34,xt=o("__translateVNode"),St=o("__datetimeParts"),Ct=o("__numberParts"),Tt=o("__setPluralRules"),Pt=o("__injectWithOption"),Et=o("__dispose");function At(e){if(!x(e))return e;if(Z(e))return e;for(const t in e)if(v(e,t))if(t.includes(".")){const n=t.split("."),a=n.length-1;let i=e,o=!1;for(let e=0;e{if("locale"in e&&"resource"in e){const{locale:t,resource:n}=e;t?(r[t]=r[t]||f(),A(n,r[t])):A(n,r)}else w(e)&&A(JSON.parse(e),r)}),null==i&&o)for(const e in r)v(r,e)&&At(r[e]);return r}function Mt(e,t,n){let a=x(t.messages)?t.messages:f();"__i18nGlobal"in n&&(a=Lt(e.locale.value,{messages:a,__i18n:n.__i18nGlobal}));const i=Object.keys(a);if(i.length&&i.forEach(t=>{e.mergeLocaleMessage(t,a[t])}),x(t.datetimeFormats)){const n=Object.keys(t.datetimeFormats);n.length&&n.forEach(n=>{e.mergeDateTimeFormat(n,t.datetimeFormats[n])})}if(x(t.numberFormats)){const n=Object.keys(t.numberFormats);n.length&&n.forEach(n=>{e.mergeNumberFormat(n,t.numberFormats[n])})}}function Rt(e){return t.createVNode(t.Text,null,e,0)}function zt(){const e="currentInstance";return e in n?n[e]:n.getCurrentInstance()}const Ot=()=>[],It=()=>!1;let Nt=0;function Dt(e){return(t,n,a,i)=>e(n,a,zt()||void 0,i)}function qt(e={}){const{__root:n,__injectWithOption:a}=e,o=void 0===n,r=e.flatJson,s=i?t.ref:t.shallowRef;let u=!k(e.inheritLocale)||e.inheritLocale;const d=s(n&&u?n.locale.value:w(e.locale)?e.locale:Oe),p=s(n&&u?n.fallbackLocale.value:w(e.fallbackLocale)||b(e.fallbackLocale)||T(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:d.value),f=s(Lt(d.value,e)),m=s(T(e.datetimeFormats)?e.datetimeFormats:{[d.value]:{}}),_=s(T(e.numberFormats)?e.numberFormats:{[d.value]:{}});let g=n?n.missingWarn:!k(e.missingWarn)&&!c(e.missingWarn)||e.missingWarn,S=n?n.fallbackWarn:!k(e.fallbackWarn)&&!c(e.fallbackWarn)||e.fallbackWarn,C=n?n.fallbackRoot:!k(e.fallbackRoot)||e.fallbackRoot,P=!!e.fallbackFormat,E=y(e.missing)?e.missing:null,L=y(e.missing)?Dt(e.missing):null,M=y(e.postTranslation)?e.postTranslation:null,R=n?n.warnHtmlMessage:!k(e.warnHtmlMessage)||e.warnHtmlMessage,z=!!e.escapeParameter;const O=n?n.modifiers:T(e.modifiers)?e.modifiers:{};let I,N=e.pluralRules||n&&n.pluralRules;I=(()=>{o&&Be(null);const t={version:pt,locale:d.value,fallbackLocale:p.value,messages:f.value,modifiers:O,pluralRules:N,missing:null===L?void 0:L,missingWarn:g,fallbackWarn:S,fallbackFormat:P,unresolving:!0,postTranslation:null===M?void 0:M,warnHtmlMessage:R,escapeParameter:z,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};t.datetimeFormats=m.value,t.numberFormats=_.value,t.__datetimeFormatters=T(I)?I.__datetimeFormatters:void 0,t.__numberFormatters=T(I)?I.__numberFormatters:void 0;const n=$e(t);return o&&Be(n),n})(),He(I,d.value,p.value);const D=t.computed({get:()=>d.value,set:e=>{I.locale=e,d.value=e}}),q=t.computed({get:()=>p.value,set:e=>{I.fallbackLocale=e,p.value=e,He(I,d.value,e)}}),j=t.computed(()=>f.value),B=t.computed(()=>m.value),F=t.computed(()=>_.value),$=(e,t,a,i,r,s)=>{let u;d.value,p.value,f.value,m.value,_.value;try{o||(I.fallbackContext=n?je:void 0),u=e(I)}finally{o||(I.fallbackContext=void 0)}if("translate exists"!==a&&l(u)&&-1===u||"translate exists"===a&&!u){const[e,a]=t();return n&&C?i(n):r(e)}if(s(u))return u;throw Error(ft)};function V(...e){return $(t=>Reflect.apply(ut,null,[t,...e]),()=>ht(...e),"translate",t=>Reflect.apply(t.t,t,[...e]),e=>e,e=>w(e))}const U={normalize:function(e){return e.map(e=>w(e)||l(e)||k(e)?Rt(String(e)):e)},interpolate:e=>e,type:"vnode"};function H(e){return f.value[e]||{}}Nt++,n&&i&&(t.watch(n.locale,e=>{u&&(d.value=e,I.locale=e,He(I,d.value,p.value))}),t.watch(n.fallbackLocale,e=>{u&&(p.value=e,I.fallbackLocale=e,He(I,d.value,p.value))}));const W={id:Nt,locale:D,fallbackLocale:q,get inheritLocale(){return u},set inheritLocale(e){u=e,e&&n&&(d.value=n.locale.value,p.value=n.fallbackLocale.value,He(I,d.value,p.value))},get availableLocales(){return Object.keys(f.value).sort()},messages:j,get modifiers(){return O},get pluralRules(){return N||{}},get isGlobal(){return o},get missingWarn(){return g},set missingWarn(e){g=e,I.missingWarn=g},get fallbackWarn(){return S},set fallbackWarn(e){S=e,I.fallbackWarn=S},get fallbackRoot(){return C},set fallbackRoot(e){C=e},get fallbackFormat(){return P},set fallbackFormat(e){P=e,I.fallbackFormat=P},get warnHtmlMessage(){return R},set warnHtmlMessage(e){R=e,I.warnHtmlMessage=e},get escapeParameter(){return z},set escapeParameter(e){z=e,I.escapeParameter=e},t:V,getLocaleMessage:H,setLocaleMessage:function(e,t){if(r){const n={[e]:t};for(const e in n)v(n,e)&&At(n[e]);t=n[e]}f.value[e]=t,I.messages=f.value},mergeLocaleMessage:function(e,t){f.value[e]=f.value[e]||{};const n={[e]:t};if(r)for(const e in n)v(n,e)&&At(n[e]);A(t=n[e],f.value[e]),I.messages=f.value},getPostTranslationHandler:function(){return y(M)?M:null},setPostTranslationHandler:function(e){M=e,I.postTranslation=e},getMissingHandler:function(){return E},setMissingHandler:function(e){null!==e&&(L=Dt(e)),E=e,I.missing=L},[Tt]:function(e){N=e,I.pluralRules=N}};return W.datetimeFormats=B,W.numberFormats=F,W.rt=function(...e){const[t,n,a]=e;if(a&&!x(a))throw Error(mt);return V(t,n,h({resolvedMessage:!0},a||{}))},W.te=function(e,t){return $(()=>{if(!e)return!1;const n=w(t)?t:d.value,a=w(t)?[n]:Ce(I,p.value,n);for(let t=0;t[e],"translate exists",n=>Reflect.apply(n.te,n,[e,t]),It,e=>k(e))},W.tm=function(e){const t=function(e){let t=null;const n=Ce(I,p.value,d.value);for(let a=0;aReflect.apply(Ge,null,[t,...e]),()=>Ye(...e),"datetime format",t=>Reflect.apply(t.d,t,[...e]),()=>"",e=>w(e)||b(e))},W.n=function(...e){return $(t=>Reflect.apply(Ze,null,[t,...e]),()=>Xe(...e),"number format",t=>Reflect.apply(t.n,t,[...e]),()=>"",e=>w(e)||b(e))},W.getDateTimeFormat=function(e){return m.value[e]||{}},W.setDateTimeFormat=function(e,t){m.value[e]=t,I.datetimeFormats=m.value,Qe(I,e,t)},W.mergeDateTimeFormat=function(e,t){m.value[e]=h(m.value[e]||{},t),I.datetimeFormats=m.value,Qe(I,e,t)},W.getNumberFormat=function(e){return _.value[e]||{}},W.setNumberFormat=function(e,t){_.value[e]=t,I.numberFormats=_.value,et(I,e,t)},W.mergeNumberFormat=function(e,t){_.value[e]=h(_.value[e]||{},t),I.numberFormats=_.value,et(I,e,t)},W[Pt]=a,W[xt]=function(...e){return $(t=>{let n;const a=t;try{a.processor=U,n=Reflect.apply(ut,null,[a,...e])}finally{a.processor=null}return n},()=>ht(...e),"translate",t=>t[xt](...e),e=>[Rt(e)],e=>b(e))},W[St]=function(...e){return $(t=>Reflect.apply(Ge,null,[t,...e]),()=>Ye(...e),"datetime format",t=>t[St](...e),Ot,e=>w(e)||b(e))},W[Ct]=function(...e){return $(t=>Reflect.apply(Ze,null,[t,...e]),()=>Xe(...e),"number format",t=>t[Ct](...e),Ot,e=>w(e)||b(e))},W}function jt(e={}){const t=qt(function(e){const t=w(e.locale)?e.locale:Oe,n=w(e.fallbackLocale)||b(e.fallbackLocale)||T(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:t,a=y(e.missing)?e.missing:void 0,i=!k(e.silentTranslationWarn)&&!c(e.silentTranslationWarn)||!e.silentTranslationWarn,o=!k(e.silentFallbackWarn)&&!c(e.silentFallbackWarn)||!e.silentFallbackWarn,r=!k(e.fallbackRoot)||e.fallbackRoot,s=!!e.formatFallbackMessages,l=T(e.modifiers)?e.modifiers:{},u=e.pluralizationRules,d=y(e.postTranslation)?e.postTranslation:void 0,p=!w(e.warnHtmlInMessage)||"off"!==e.warnHtmlInMessage,f=!!e.escapeParameterHtml,m=!k(e.sync)||e.sync;let _=e.messages;if(T(e.sharedMessages)){const t=e.sharedMessages;_=Object.keys(t).reduce((e,n)=>{const a=e[n]||(e[n]={});return h(a,t[n]),e},_||{})}const{__i18n:g,__root:v,__injectWithOption:x}=e,S=e.datetimeFormats,C=e.numberFormats;return{locale:t,fallbackLocale:n,messages:_,flatJson:e.flatJson,datetimeFormats:S,numberFormats:C,missing:a,missingWarn:i,fallbackWarn:o,fallbackRoot:r,fallbackFormat:s,modifiers:l,pluralRules:u,postTranslation:d,warnHtmlMessage:p,escapeParameter:f,messageResolver:e.messageResolver,inheritLocale:m,__i18n:g,__root:v,__injectWithOption:x}}(e)),{__extender:n}=e,a={id:t.id,get locale(){return t.locale.value},set locale(e){t.locale.value=e},get fallbackLocale(){return t.fallbackLocale.value},set fallbackLocale(e){t.fallbackLocale.value=e},get messages(){return t.messages.value},get datetimeFormats(){return t.datetimeFormats.value},get numberFormats(){return t.numberFormats.value},get availableLocales(){return t.availableLocales},get missing(){return t.getMissingHandler()},set missing(e){t.setMissingHandler(e)},get silentTranslationWarn(){return k(t.missingWarn)?!t.missingWarn:t.missingWarn},set silentTranslationWarn(e){t.missingWarn=k(e)?!e:e},get silentFallbackWarn(){return k(t.fallbackWarn)?!t.fallbackWarn:t.fallbackWarn},set silentFallbackWarn(e){t.fallbackWarn=k(e)?!e:e},get modifiers(){return t.modifiers},get formatFallbackMessages(){return t.fallbackFormat},set formatFallbackMessages(e){t.fallbackFormat=e},get postTranslation(){return t.getPostTranslationHandler()},set postTranslation(e){t.setPostTranslationHandler(e)},get sync(){return t.inheritLocale},set sync(e){t.inheritLocale=e},get warnHtmlInMessage(){return t.warnHtmlMessage?"warn":"off"},set warnHtmlInMessage(e){t.warnHtmlMessage="off"!==e},get escapeParameterHtml(){return t.escapeParameter},set escapeParameterHtml(e){t.escapeParameter=e},get pluralizationRules(){return t.pluralRules||{}},__composer:t,t:(...e)=>Reflect.apply(t.t,t,[...e]),rt:(...e)=>Reflect.apply(t.rt,t,[...e]),te:(e,n)=>t.te(e,n),tm:e=>t.tm(e),getLocaleMessage:e=>t.getLocaleMessage(e),setLocaleMessage(e,n){t.setLocaleMessage(e,n)},mergeLocaleMessage(e,n){t.mergeLocaleMessage(e,n)},d:(...e)=>Reflect.apply(t.d,t,[...e]),getDateTimeFormat:e=>t.getDateTimeFormat(e),setDateTimeFormat(e,n){t.setDateTimeFormat(e,n)},mergeDateTimeFormat(e,n){t.mergeDateTimeFormat(e,n)},n:(...e)=>Reflect.apply(t.n,t,[...e]),getNumberFormat:e=>t.getNumberFormat(e),setNumberFormat(e,n){t.setNumberFormat(e,n)},mergeNumberFormat(e,n){t.mergeNumberFormat(e,n)}};return a.__extender=n,a}function Bt(e,t){e.locale=t.locale||e.locale,e.fallbackLocale=t.fallbackLocale||e.fallbackLocale,e.missing=t.missing||e.missing,e.silentTranslationWarn=t.silentTranslationWarn||e.silentFallbackWarn,e.silentFallbackWarn=t.silentFallbackWarn||e.silentFallbackWarn,e.formatFallbackMessages=t.formatFallbackMessages||e.formatFallbackMessages,e.postTranslation=t.postTranslation||e.postTranslation,e.warnHtmlInMessage=t.warnHtmlInMessage||e.warnHtmlInMessage,e.escapeParameterHtml=t.escapeParameterHtml||e.escapeParameterHtml,e.sync=t.sync||e.sync,e.__composer[Tt](t.pluralizationRules||e.pluralizationRules);const n=Lt(e.locale,{messages:t.messages,__i18n:t.__i18n});return Object.keys(n).forEach(t=>e.mergeLocaleMessage(t,n[t])),t.datetimeFormats&&Object.keys(t.datetimeFormats).forEach(n=>e.mergeDateTimeFormat(n,t.datetimeFormats[n])),t.numberFormats&&Object.keys(t.numberFormats).forEach(n=>e.mergeNumberFormat(n,t.numberFormats[n])),e}const Ft={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>"parent"===e||"global"===e,default:"parent"},i18n:{type:Object}};function $t(){return t.Fragment}const Vt=t.defineComponent({name:"i18n-t",props:h({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>l(e)||!isNaN(e)}},Ft),setup(e,n){const{slots:a,attrs:i}=n,o=e.i18n||Jt({useScope:e.scope,__useComponent:!0});return()=>{const r=()=>{const i=Object.keys(a).filter(e=>"_"!==e[0]),r=f();e.locale&&(r.locale=e.locale),void 0!==e.plural&&(r.plural=w(e.plural)?+e.plural:e.plural);const s=function({slots:e},n){return 1===n.length&&"default"===n[0]?(e.default?e.default():[]).reduce((e,n)=>[...e,...n.type===t.Fragment?n.children:[n]],[]):n.reduce((t,n)=>{const a=e[n];return a&&(t[n]=a()),t},f())}(n,i);return o[xt](e.keypath,s,r)},s=h(f(),i),l=w(e.tag)||x(e.tag)?e.tag:$t();return x(l)?t.h(l,s,{default:r}):t.h(l,s,r())}}}),Ut=Vt;function Ht(e,n,a,i){const{slots:o,attrs:r}=n;return()=>{const n=()=>{const t={part:!0};let n=f();e.locale&&(t.locale=e.locale),w(e.format)?t.key=e.format:x(e.format)&&(w(e.format.key)&&(t.key=e.format.key),n=Object.keys(e.format).reduce((t,n)=>a.includes(n)?h(f(),t,{[n]:e.format[n]}):t,f()));const r=i(e.value,t,n);let s=[t.key];return b(r)?s=r.map((e,t)=>{const n=o[e.type],a=n?n({[e.type]:e.value,index:t,parts:r}):[e.value];var i;return b(i=a)&&!w(i[0])&&(a[0].key=`${e.type}-${t}`),a}):w(r)&&(s=[r]),s},s=h(f(),r),l=w(e.tag)||x(e.tag)?e.tag:$t();return x(l)?t.h(l,s,{default:n}):t.h(l,s,n())}}const Wt=t.defineComponent({name:"i18n-n",props:h({value:{type:Number,required:!0},format:{type:[String,Object]}},Ft),setup(e,t){const n=e.i18n||Jt({useScope:e.scope,__useComponent:!0});return Ht(e,t,Je,(...e)=>n[Ct](...e))}}),Gt=Wt;function Kt(e){const n=t=>{const{instance:n,value:a}=t;if(!n||!n.$)throw Error(wt);const i=function(e,t){const n=e;if("composition"===e.mode)return n.__getInstance(t)||e.global;{const a=n.__getInstance(t);return null!=a?a.__composer:e.global.__composer}}(e,n.$),o=Yt(a);return[Reflect.apply(i.t,i,[...Qt(o)]),i]};return{created:(e,a)=>{const[o,r]=n(a);i&&(e.__i18nWatcher=t.watch(r.locale,()=>{a.instance&&a.instance.$forceUpdate()})),e.__composer=r,e.textContent=o},unmounted:e=>{i&&e.__i18nWatcher&&(e.__i18nWatcher(),e.__i18nWatcher=void 0,delete e.__i18nWatcher),e.__composer&&(e.__composer=void 0,delete e.__composer)},beforeUpdate:(e,{value:t})=>{if(e.__composer){const n=e.__composer,a=Yt(t);e.textContent=Reflect.apply(n.t,n,[...Qt(a)])}},getSSRProps:e=>{const[t]=n(e);return{textContent:t}}}}function Yt(e){if(w(e))return{path:e};if(T(e)){if(!("path"in e))throw Error(vt,"path");return e}throw Error(bt)}function Qt(e){const{path:t,locale:n,args:a,choice:i,plural:o}=e,r={},s=a||{};return w(n)&&(r.locale=n),l(i)&&(r.plural=i),l(o)&&(r.plural=o),[t,s,r]}const Zt=o("global-vue-i18n");function Jt(e={}){const n=zt();if(null==n)throw Error(_t);if(!n.isCE&&null!=n.appContext.app&&!n.appContext.app.__VUE_I18N_SYMBOL__)throw Error(gt);const a=function(e){const n=t.inject(e.isCE?Zt:e.appContext.app.__VUE_I18N_SYMBOL__);if(!n)throw Error(e.isCE?yt:wt);return n}(n),i=function(e){return"composition"===e.mode?e.global:e.global.__composer}(a),o=function(e){return e.type}(n),r=function(e,t){return d(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}(e,o);if("global"===r)return Mt(i,e,o),i;if("parent"===r){let t=Xt(a,n,e.__useComponent);return null==t&&(t=i),t}if("isolated"===r){if("composition"!==a.mode)throw Error(kt);const o=a,r=h({},e),s=Xt(a,n);r.__root=s||i;const l=qt(r);return o.__composerExtend&&(l[Et]=o.__composerExtend(l)),t.getCurrentScope()&&t.onScopeDispose(()=>{const e=l[Et];e&&(e(),delete l[Et])}),l}const s=a;let l=s.__getInstance(n);if(null==l){const a=h({},e);"__i18n"in o&&(a.__i18n=o.__i18n),i&&(a.__root=i),l=qt(a),s.__composerExtend&&(l[Et]=s.__composerExtend(l)),function(e,n,a){t.onMounted(()=>{},n),t.onUnmounted(()=>{const t=a;e.__deleteInstance(n);const i=t[Et];i&&(i(),delete t[Et])},n)}(s,n,l),s.__setInstance(n,l)}return l}function Xt(e,t,n=!1){let a=null;const i=t.root;let o=function(e,t=!1){return null==e?null:t&&e.vnode.ctx||e.parent}(t,n);for(;null!=o;){const t=e;if("composition"===e.mode)a=t.__getInstance(o);else{const e=t.__getInstance(o);null!=e&&(a=e.__composer,n&&a&&!a[Pt]&&(a=null))}if(null!=a)break;if(i===o)break;o=o.parent}return a}const en=["locale","fallbackLocale","availableLocales"],tn=["t","rt","d","n","tm","te"],nn=t.defineComponent({name:"i18n-d",props:h({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},Ft),setup(e,t){const n=e.i18n||Jt({useScope:e.scope,__useComponent:!0});return Ht(e,t,Ke,(...e)=>n[St](...e))}}),an=nn;return Ne=function(e,t){if(w(e)){!k(t.warnHtmlMessage)||t.warnHtmlMessage;const n=(t.onCacheKey||pe)(e),a=fe[n];if(a)return a;const{ast:i,detectError:o}=function(e,t={}){let n=!1;const a=t.onError||L;return t.onError=e=>{n=!0,a(e)},{...Q(e,t),detectError:n}}(e,{...t,location:!1,jit:!0}),r=ce(i);return o?r:fe[n]=r}{const t=e.cacheKey;if(t){return fe[t]||(fe[t]=ce(e))}return ce(e)}},De=function(e,t){if(!x(e))return null;let n=Re.get(t);if(n||(n=function(e){const t=[];let n,a,i,o,r,s,l,u=-1,c=0,d=0;const h=[];function p(){const t=e[u+1];if(5===c&&"'"===t||6===c&&'"'===t)return u++,i="\\"+t,h[0](),!0}for(h[0]=()=>{void 0===a?a=i:a+=i},h[1]=()=>{void 0!==a&&(t.push(a),a=void 0)},h[2]=()=>{h[0](),d++},h[3]=()=>{if(d>0)d--,c=4,h[0]();else{if(d=0,void 0===a)return!1;if(a=function(e){const t=e.trim();return("0"!==e.charAt(0)||!isNaN(parseInt(e)))&&(n=t,Le.test(n)?function(e){const t=e.charCodeAt(0);return t!==e.charCodeAt(e.length-1)||34!==t&&39!==t?e:e.slice(1,-1)}(t):"*"+t);var n}(a),!1===a)return!1;h[1]()}};null!==c;)if(u++,n=e[u],"\\"!==n||!p()){if(o=Me(n),l=Ae[c],r=l[o]||l.l||8,8===r)return;if(c=r[0],void 0!==r[1]&&(s=h[r[1]],s&&(i=n,!1===s())))return;if(7===c)return t}}(t),n&&Re.set(t,n)),!n)return null;const a=n.length;let i=e,o=0;for(;ojt(e)):a.run(()=>qt(e));if(null==i)throw Error(wt);return[a,i]}(e,n),l=o(""),u={get mode(){return n?"legacy":"composition"},async install(e,...i){if(e.__VUE_I18N_SYMBOL__=l,e.provide(e.__VUE_I18N_SYMBOL__,u),T(i[0])){const e=i[0];u.__composerExtend=e.__composerExtend,u.__vueI18nExtend=e.__vueI18nExtend}let o=null;!n&&a&&(o=function(e,n){const a=Object.create(null);en.forEach(e=>{const i=Object.getOwnPropertyDescriptor(n,e);if(!i)throw Error(wt);const o=t.isRef(i.value)?{get:()=>i.value.value,set(e){i.value.value=e}}:{get:()=>i.get&&i.get()};Object.defineProperty(a,e,o)}),e.config.globalProperties.$i18n=a,tn.forEach(t=>{const a=Object.getOwnPropertyDescriptor(n,t);if(!a||!a.value)throw Error(wt);Object.defineProperty(e.config.globalProperties,`$${t}`,a)});return()=>{delete e.config.globalProperties.$i18n,tn.forEach(t=>{delete e.config.globalProperties[`$${t}`]})}}(e,u.global)),function(e,t,...n){const a=T(n[0])?n[0]:{};(!k(a.globalInstall)||a.globalInstall)&&([Vt.name,"I18nT"].forEach(t=>e.component(t,Vt)),[Wt.name,"I18nN"].forEach(t=>e.component(t,Wt)),[nn.name,"I18nD"].forEach(t=>e.component(t,nn))),e.directive("t",Kt(t))}(e,u,...i),n&&e.mixin(function(e,t,n){return{beforeCreate(){const a=zt();if(!a)throw Error(wt);const i=this.$options;if(i.i18n){const a=i.i18n;if(i.__i18n&&(a.__i18n=i.__i18n),a.__root=t,this===this.$root)this.$i18n=Bt(e,a);else{a.__injectWithOption=!0,a.__extender=n.__vueI18nExtend,this.$i18n=jt(a);const e=this.$i18n;e.__extender&&(e.__disposer=e.__extender(this.$i18n))}}else if(i.__i18n)if(this===this.$root)this.$i18n=Bt(e,i);else{this.$i18n=jt({__i18n:i.__i18n,__injectWithOption:!0,__extender:n.__vueI18nExtend,__root:t});const e=this.$i18n;e.__extender&&(e.__disposer=e.__extender(this.$i18n))}else this.$i18n=e;i.__i18nGlobal&&Mt(t,i,i),this.$t=(...e)=>this.$i18n.t(...e),this.$rt=(...e)=>this.$i18n.rt(...e),this.$te=(e,t)=>this.$i18n.te(e,t),this.$d=(...e)=>this.$i18n.d(...e),this.$n=(...e)=>this.$i18n.n(...e),this.$tm=e=>this.$i18n.tm(e),n.__setInstance(a,this.$i18n)},mounted(){},unmounted(){const e=zt();if(!e)throw Error(wt);const t=this.$i18n;delete this.$t,delete this.$rt,delete this.$te,delete this.$d,delete this.$n,delete this.$tm,t.__disposer&&(t.__disposer(),delete t.__disposer,delete t.__extender),n.__deleteInstance(e),delete this.$i18n}}}(s,s.__composer,u));const r=e.unmount;e.unmount=()=>{o&&o(),u.dispose(),r()}},get global(){return s},dispose(){r.stop()},__instances:i,__getInstance:function(e){return i.get(e)||null},__setInstance:function(e,t){i.set(e,t)},__deleteInstance:function(e){i.delete(e)}};return u},e.useI18n=Jt,e.vTDirective=Kt,e}({},Vue),VueRouter=function(e,t){const n="undefined"!=typeof document;function a(e){return"object"==typeof e||"displayName"in e||"props"in e||"__vccOpts"in e}function i(e){return e.__esModule||"Module"===e[Symbol.toStringTag]||e.default&&a(e.default)}const o=Object.assign;function r(e,t){const n={};for(const a in t){const i=t[a];n[a]=l(i)?i.map(e):e(i)}return n}const s=()=>{},l=Array.isArray;function u(e,t){const n={};for(const a in e)n[a]=a in t?t[a]:e[a];return n}function c(e){const t=Array.from(arguments).slice(1);console.warn.apply(console,["[Vue Router warn]: "+e].concat(t))}const d=/#/g,h=/&/g,p=/\//g,f=/=/g,m=/\?/g,_=/\+/g,g=/%5B/g,v=/%5D/g,b=/%5E/g,y=/%60/g,w=/%7B/g,k=/%7C/g,x=/%7D/g,S=/%20/g;function C(e){return null==e?"":encodeURI(""+e).replace(k,"|").replace(g,"[").replace(v,"]")}function T(e){return C(e).replace(_,"%2B").replace(S,"+").replace(d,"%23").replace(h,"%26").replace(y,"`").replace(w,"{").replace(x,"}").replace(b,"^")}function P(e){return T(e).replace(f,"%3D")}function E(e){return function(e){return C(e).replace(d,"%23").replace(m,"%3F")}(e).replace(p,"%2F")}function A(e){if(null==e)return null;try{return decodeURIComponent(""+e)}catch{c(`Error decoding "${e}". Using original value`)}return""+e}const L=/\/$/;function M(e,t,n="/"){let a,i={},o="",r="";const s=t.indexOf("#");let l=t.indexOf("?");return l=s>=0&&l>s?-1:l,l>=0&&(a=t.slice(0,l),o=t.slice(l,s>0?s:t.length),i=e(o.slice(1))),s>=0&&(a=a||t.slice(0,s),r=t.slice(s,t.length)),a=function(e,t){if(e.startsWith("/"))return e;if(!t.startsWith("/"))return c(`Cannot resolve a relative location without an absolute path. Trying to resolve "${e}" from "${t}". It should look like "/${t}".`),e;if(!e)return t;const n=t.split("/"),a=e.split("/"),i=a[a.length-1];".."!==i&&"."!==i||a.push("");let o,r,s=n.length-1;for(o=0;o1&&s--}return n.slice(0,s).join("/")+"/"+a.slice(o).join("/")}(null!=a?a:t,n),{fullPath:a+o+r,path:a,query:i,hash:A(r)}}function R(e,t){return t&&e.toLowerCase().startsWith(t.toLowerCase())?e.slice(t.length)||"/":e}function z(e,t,n){const a=t.matched.length-1,i=n.matched.length-1;return a>-1&&a===i&&O(t.matched[a],n.matched[i])&&I(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function O(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function I(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!N(e[n],t[n]))return!1;return!0}function N(e,t){return l(e)?D(e,t):l(t)?D(t,e):(e&&e.valueOf())===(t&&t.valueOf())}function D(e,t){return l(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):1===e.length&&e[0]===t}const q={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let j=function(e){return e.pop="pop",e.push="push",e}({}),B=function(e){return e.back="back",e.forward="forward",e.unknown="",e}({});function F(e){if(!e)if(n){const t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^\w+:\/\/[^/]+/,"")}else e="/";return"/"!==e[0]&&"#"!==e[0]&&(e="/"+e),e.replace(L,"")}const $=/^[^#]+#/;function V(e,t){return e.replace($,"#")+t}const U=()=>({left:window.scrollX,top:window.scrollY});function H(e){let t;if("el"in e){const n=e.el,a="string"==typeof n&&n.startsWith("#");if(!("string"!=typeof e.el||a&&document.getElementById(e.el.slice(1))))try{const t=document.querySelector(e.el);if(a&&t)return void c(`The selector "${e.el}" should be passed as "el: document.querySelector('${e.el}')" because it starts with "#".`)}catch{return void c(`The selector "${e.el}" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`)}const i="string"==typeof n?a?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return void c(`Couldn't find element using selector "${e.el}" returned by scrollBehavior.`);t=function(e,t){const n=document.documentElement.getBoundingClientRect(),a=e.getBoundingClientRect();return{behavior:t.behavior,left:a.left-n.left-(t.left||0),top:a.top-n.top-(t.top||0)}}(i,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(null!=t.left?t.left:window.scrollX,null!=t.top?t.top:window.scrollY)}function W(e,t){return(history.state?history.state.position-t:-1)+e}const G=new Map;let K=()=>location.protocol+"//"+location.host;function Y(e,t){const{pathname:n,search:a,hash:i}=t,o=e.indexOf("#");if(o>-1){let t=i.includes(e.slice(o))?e.slice(o).length:1,n=i.slice(t);return"/"!==n[0]&&(n="/"+n),R(n,"")}return R(n,e)+a+i}function Q(e,t,n,a=!1,i=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:i?U():null}}function Z(e){const t=function(e){const{history:t,location:n}=window,a={value:Y(e,n)},i={value:t.state};function r(a,o,r){const s=e.indexOf("#"),l=s>-1?(n.host&&document.querySelector("base")?e:e.slice(s))+a:K()+e+a;try{t[r?"replaceState":"pushState"](o,"",l),i.value=o}catch(e){c("Error with push/replace State",e),n[r?"replace":"assign"](l)}}return i.value||r(a.value,{back:null,current:a.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0),{location:a,state:i,push:function(e,n){const s=o({},i.value,t.state,{forward:e,scroll:U()});t.state||c("history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:\n\nhistory.replaceState(history.state, '', url)\n\nYou can find more information at https://router.vuejs.org/guide/migration/#Usage-of-history-state"),r(s.current,s,!0),r(e,o({},Q(a.value,e,null),{position:s.position+1},n),!1),a.value=e},replace:function(e,n){r(e,o({},t.state,Q(i.value.back,e,i.value.forward,!0),n,{position:i.value.position}),!0),a.value=e}}}(e=F(e)),n=function(e,t,n,a){let i=[],r=[],s=null;const l=({state:o})=>{const r=Y(e,location),l=n.value,u=t.value;let c=0;if(o){if(n.value=r,t.value=o,s&&s===l)return void(s=null);c=u?o.position-u.position:0}else a(r);i.forEach(e=>{e(n.value,l,{delta:c,type:j.pop,direction:c?c>0?B.forward:B.back:B.unknown})})};function u(){if("hidden"===document.visibilityState){const{history:e}=window;if(!e.state)return;e.replaceState(o({},e.state,{scroll:U()}),"")}}return window.addEventListener("popstate",l),window.addEventListener("pagehide",u),document.addEventListener("visibilitychange",u),{pauseListeners:function(){s=n.value},listen:function(e){i.push(e);const t=()=>{const t=i.indexOf(e);t>-1&&i.splice(t,1)};return r.push(t),t},destroy:function(){for(const e of r)e();r=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",u),document.removeEventListener("visibilitychange",u)}}}(e,t.state,t.location,t.replace);const a=o({location:"",base:e,go:function(e,t=!0){t||n.pauseListeners(),history.go(e)},createHref:V.bind(null,e)},t,n);return Object.defineProperty(a,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(a,"state",{enumerable:!0,get:()=>t.state.value}),a}function J(e){return"string"==typeof e||e&&"object"==typeof e}function X(e){return"string"==typeof e||"symbol"==typeof e}let ee=function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e}({});const te=Symbol("navigation failure");let ne=function(e){return e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated",e}({});const ae={[ee.MATCHER_NOT_FOUND]:({location:e,currentLocation:t})=>`No match for\n ${JSON.stringify(e)}${t?"\nwhile being at\n"+JSON.stringify(t):""}`,[ee.NAVIGATION_GUARD_REDIRECT]:({from:e,to:t})=>`Redirected from "${e.fullPath}" to "${function(e){if("string"==typeof e)return e;if(null!=e.path)return e.path;const t={};for(const n of re)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}(t)}" via a navigation guard.`,[ee.NAVIGATION_ABORTED]:({from:e,to:t})=>`Navigation aborted from "${e.fullPath}" to "${t.fullPath}" via a navigation guard.`,[ee.NAVIGATION_CANCELLED]:({from:e,to:t})=>`Navigation cancelled from "${e.fullPath}" to "${t.fullPath}" with a new navigation.`,[ee.NAVIGATION_DUPLICATED]:({from:e,to:t})=>`Avoided redundant navigation to current location: "${e.fullPath}".`};function ie(e,t){return o(new Error(ae[e](t)),{type:e,[te]:!0},t)}function oe(e,t){return e instanceof Error&&te in e&&(null==t||!!(e.type&t))}const re=["params","query","hash"];let se=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var le=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(le||{});const ue={type:se.Static,value:""},ce=/[a-zA-Z0-9_]/;const de="[^/]+?",he={sensitive:!1,strict:!1,start:!0,end:!0};var pe=function(e){return e[e._multiplier=10]="_multiplier",e[e.Root=90]="Root",e[e.Segment=40]="Segment",e[e.SubSegment=30]="SubSegment",e[e.Static=40]="Static",e[e.Dynamic=20]="Dynamic",e[e.BonusCustomRegExp=10]="BonusCustomRegExp",e[e.BonusWildcard=-50]="BonusWildcard",e[e.BonusRepeatable=-20]="BonusRepeatable",e[e.BonusOptional=-8]="BonusOptional",e[e.BonusStrict=.7000000000000001]="BonusStrict",e[e.BonusCaseSensitive=.25]="BonusCaseSensitive",e}(pe||{});const fe=/[.+*?^${}()[\]/\\]/g;function me(e,t){let n=0;for(;nt.length?1===t.length&&t[0]===pe.Static+pe.Segment?1:-1:0}function _e(e,t){let n=0;const a=e.score,i=t.score;for(;n0&&t[t.length-1]<0}const ve={strict:!1,end:!0,sensitive:!1};function be(e,t,n){const a=function(e,t){const n=o({},he,t),a=[];let i=n.start?"^":"";const r=[];for(const t of e){const e=t.length?[]:[pe.Root];n.strict&&!t.length&&(i+="/");for(let a=0;a1&&("*"===s||"+"===s)&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),o.push({type:se.Param,value:u,regexp:c,repeatable:"*"===s||"+"===s,optional:"*"===s||"?"===s})):t("Invalid state to consume buffer"),u="")}function h(){u+=s}for(;l{r(_)}:s}function r(e){if(X(e)){const t=a.get(e);t&&(a.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(r),t.alias.forEach(r))}else{const t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&a.delete(e.record.name),e.children.forEach(r),e.alias.forEach(r))}}function l(e){const t=function(e,t){let n=0,a=t.length;for(;n!==a;){const i=n+a>>1;_e(e,t[i])<0?a=i:n=i+1}const i=function(e){let t=e;for(;t=t.parent;)if(Le(t)&&0===_e(e,t))return t}(e);i&&(a=t.lastIndexOf(i,a-1),a<0&&c(`Finding ancestor route "${i.record.path}" failed for "${e.record.path}"`));return a}(e,n);n.splice(t,0,e),e.record.name&&!Se(e)&&a.set(e.record.name,e)}return t=u(ve,t),e.forEach(e=>i(e)),{addRoute:i,resolve:function(e,t){let i,r,s,l={};if("name"in e&&e.name){if(i=a.get(e.name),!i)throw ie(ee.MATCHER_NOT_FOUND,{location:e});{const t=Object.keys(e.params||{}).filter(e=>!i.keys.find(t=>t.name===e));t.length&&c(`Discarded invalid param(s) "${t.join('", "')}" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`)}s=i.record.name,l=o(we(t.params,i.keys.filter(e=>!e.optional).concat(i.parent?i.parent.keys.filter(e=>e.optional):[]).map(e=>e.name)),e.params&&we(e.params,i.keys.map(e=>e.name))),r=i.stringify(l)}else if(null!=e.path)r=e.path,r.startsWith("/")||c(`The Matcher cannot resolve relative paths but received "${r}". Unless you directly called \`matcher.resolve("${r}")\`, this is probably a bug in vue-router. Please open an issue at https://github.com/vuejs/router/issues/new/choose.`),i=n.find(e=>e.re.test(r)),i&&(l=i.parse(r),s=i.record.name);else{if(i=t.name?a.get(t.name):n.find(e=>e.re.test(t.path)),!i)throw ie(ee.MATCHER_NOT_FOUND,{location:e,currentLocation:t});s=i.record.name,l=o({},t.params,e.params),r=i.stringify(l)}const u=[];let d=i;for(;d;)u.unshift(d.record),d=d.parent;return{name:s,path:r,params:l,matched:u,meta:Ce(u)}},removeRoute:r,clearRoutes:function(){n.length=0,a.clear()},getRoutes:function(){return n},getRecordMatcher:function(e){return a.get(e)}}}function we(e,t){const n={};for(const a of t)a in e&&(n[a]=e[a]);return n}function ke(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:xe(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function xe(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const a in e.components)t[a]="object"==typeof n?n[a]:n;return t}function Se(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Ce(e){return e.reduce((e,t)=>o(e,t.meta),{})}function Te(e,t){return e.name===t.name&&e.optional===t.optional&&e.repeatable===t.repeatable}function Pe(e,t){for(const n of e.keys)if(!n.optional&&!t.keys.find(Te.bind(null,n)))return c(`Alias "${t.record.path}" and the original record: "${e.record.path}" must have the exact same param named "${n.name}"`);for(const n of t.keys)if(!n.optional&&!e.keys.find(Te.bind(null,n)))return c(`Alias "${t.record.path}" and the original record: "${e.record.path}" must have the exact same param named "${n.name}"`)}function Ee(e,t){for(let n=t;n;n=n.parent)if(n.record.name===e.name)throw new Error(`A route named "${String(e.name)}" has been added as a ${t===n?"child":"descendant"} of a route with the same name. Route names must be unique and a nested route cannot use the same name as an ancestor.`)}function Ae(e,t){for(const n of t.keys)if(!e.keys.find(Te.bind(null,n)))return c(`Absolute path "${e.record.path}" must have the exact same param named "${n.name}" as its parent "${t.record.path}".`)}function Le({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Me(e){const t={};if(""===e||"?"===e)return t;const n=("?"===e[0]?e.slice(1):e).split("&");for(let e=0;ee&&T(e)):[a&&T(a)]).forEach(e=>{void 0!==e&&(t+=(t.length?"&":"")+n,null!=e&&(t+="="+e))}):void 0!==a&&(t+=(t.length?"&":"")+n)}return t}function ze(e){const t={};for(const n in e){const a=e[n];void 0!==a&&(t[n]=l(a)?a.map(e=>null==e?null:""+e):null==a?a:""+a)}return t}const Oe=Symbol("router view location matched"),Ie=Symbol("router view depth"),Ne=Symbol("router"),De=Symbol("route location"),qe=Symbol("router view location");function je(){let e=[];return{add:function(t){return e.push(t),()=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)}},list:()=>e.slice(),reset:function(){e=[]}}}function Be(e,n,a){const i=e.value;if(!i)return void c(`No active route record was found when calling \`${"updateGuards"===n?"onBeforeRouteUpdate":"onBeforeRouteLeave"}()\`. Make sure you call this function inside a component child of . Maybe you called it inside of App.vue?`);let o=i;const r=()=>{o[n].delete(a)};(0,t.onUnmounted)(r),(0,t.onDeactivated)(r),(0,t.onActivated)(()=>{const t=e.value;t||c("No active route record was found when reactivating component with navigation guard. This is likely a bug in vue-router. Please report it."),t&&(o=t),o[n].add(a)}),o[n].add(a)}function Fe(e,t,n,a,i,o=e=>e()){const r=a&&(a.enterCallbacks[i]=a.enterCallbacks[i]||[]);return()=>new Promise((s,l)=>{const u=e=>{!1===e?l(ie(ee.NAVIGATION_ABORTED,{from:n,to:t})):e instanceof Error?l(e):J(e)?l(ie(ee.NAVIGATION_GUARD_REDIRECT,{from:t,to:e})):(r&&a.enterCallbacks[i]===r&&"function"==typeof e&&r.push(e),s())},d=o(()=>e.call(a&&a.instances[i],t,n,function(e){let t=!1;return function(){return t||(t=!0,c("The `next()` callback in navigation guards is deprecated. Return the value instead of calling `next(value)`.")),e.apply(this,arguments)}}(function(e,t,n){let a=0;return function(){1===a++&&c(`The "next" callback was called more than once in one navigation guard when going from "${n.fullPath}" to "${t.fullPath}". It should be called exactly one time in each navigation guard. This will fail in production.`),e._called=!0,1===a&&e.apply(null,arguments)}}(u,t,n))));let h=Promise.resolve(d);if(e.length<3&&(h=h.then(u)),e.length>2){const t=`The "next" callback was never called inside of ${e.name?'"'+e.name+'"':""}:\n${e.toString()}\n. If you are returning a value instead of calling "next", make sure to remove the "next" parameter from your function.`;if("object"==typeof d&&"then"in d)h=h.then(e=>u._called?e:(c(t),Promise.reject(new Error("Invalid navigation guard"))));else if(void 0!==d&&!u._called)return c(t),void l(new Error("Invalid navigation guard"))}h.catch(e=>l(e))})}function $e(e,t,n,o,r=e=>e()){const s=[];for(const l of e){l.components||!l.children||l.children.length||c(`Record with path "${l.path}" is either missing a "component(s)" or "children" property.`);for(const e in l.components){let u=l.components[e];if(!u||"object"!=typeof u&&"function"!=typeof u)throw c(`Component "${e}" in record with path "${l.path}" is not a valid component. Received "${String(u)}".`),new Error("Invalid route component");if("then"in u){c(`Component "${e}" in record with path "${l.path}" is a Promise instead of a function that returns a Promise. Did you write "import('./MyPage.vue')" instead of "() => import('./MyPage.vue')" ? This will break in production if not fixed.`);const t=u;u=()=>t}else u.__asyncLoader&&!u.__warnedDefineAsync&&(u.__warnedDefineAsync=!0,c(`Component "${e}" in record with path "${l.path}" is defined using "defineAsyncComponent()". Write "() => import('./MyPage.vue')" instead of "defineAsyncComponent(() => import('./MyPage.vue'))".`));if("beforeRouteEnter"===t||l.instances[e])if(a(u)){const a=(u.__vccOpts||u)[t];a&&s.push(Fe(a,n,o,l,e,r))}else{let a=u();"catch"in a||(c(`Component "${e}" in record with path "${l.path}" is a function that does not return a Promise. If you were passing a functional component, make sure to add a "displayName" to the component. This will break in production if not fixed.`),a=Promise.resolve(a)),s.push(()=>a.then(a=>{if(!a)throw new Error(`Couldn't resolve component "${e}" at "${l.path}"`);const s=i(a)?a.default:a;l.mods[e]=a,l.components[e]=s;const u=(s.__vccOpts||s)[t];return u&&Fe(u,n,o,l,e,r)()}))}}}return s}function Ve(e){const a=(0,t.inject)(Ne),i=(0,t.inject)(De);let o=!1,r=null;const u=(0,t.computed)(()=>{const n=(0,t.unref)(e.to);return o&&n===r||(J(n)||(o?c('Invalid value for prop "to" in useLink()\n- to:',n,"\n- previous to:",r,"\n- props:",e):c('Invalid value for prop "to" in useLink()\n- to:',n,"\n- props:",e)),r=n,o=!0),a.resolve(n)}),d=(0,t.computed)(()=>{const{matched:e}=u.value,{length:t}=e,n=e[t-1],a=i.matched;if(!n||!a.length)return-1;const o=a.findIndex(O.bind(null,n));if(o>-1)return o;const r=He(e[t-2]);return t>1&&He(n)===r&&a[a.length-1].path!==r?a.findIndex(O.bind(null,e[t-2])):o}),h=(0,t.computed)(()=>d.value>-1&&function(e,t){for(const n in t){const a=t[n],i=e[n];if("string"==typeof a){if(a!==i)return!1}else if(!l(i)||i.length!==a.length||a.some((e,t)=>e.valueOf()!==i[t].valueOf()))return!1}return!0}(i.params,u.value.params)),p=(0,t.computed)(()=>d.value>-1&&d.value===i.matched.length-1&&I(i.params,u.value.params));if(n){const n=(0,t.getCurrentInstance)();if(n){const a={route:u.value,isActive:h.value,isExactActive:p.value,error:null};n.__vrl_devtools=n.__vrl_devtools||[],n.__vrl_devtools.push(a),(0,t.watchEffect)(()=>{a.route=u.value,a.isActive=h.value,a.isExactActive=p.value,a.error=J((0,t.unref)(e.to))?null:'Invalid "to" value'},{flush:"post"})}}return{route:u,href:(0,t.computed)(()=>u.value.href),isActive:h,isExactActive:p,navigate:function(n={}){if(function(e){if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)return;if(e.defaultPrevented)return;if(void 0!==e.button&&0!==e.button)return;if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}e.preventDefault&&e.preventDefault();return!0}(n)){const n=a[(0,t.unref)(e.replace)?"replace":"push"]((0,t.unref)(e.to)).catch(s);return e.viewTransition&&"undefined"!=typeof document&&"startViewTransition"in document&&document.startViewTransition(()=>n),n}return Promise.resolve()}}}const Ue=(0,t.defineComponent)({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Ve,setup(e,{slots:n}){const a=(0,t.reactive)(Ve(e)),{options:i}=(0,t.inject)(Ne),o=(0,t.computed)(()=>({[We(e.activeClass,i.linkActiveClass,"router-link-active")]:a.isActive,[We(e.exactActiveClass,i.linkExactActiveClass,"router-link-exact-active")]:a.isExactActive}));return()=>{const i=n.default&&(1===(r=n.default(a)).length?r[0]:r);var r;return e.custom?i:(0,t.h)("a",{"aria-current":a.isExactActive?e.ariaCurrentValue:null,href:a.href,onClick:a.navigate,class:o.value},i)}}});function He(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const We=(e,t,n)=>null!=e?e:null!=t?t:n;function Ge(e,t){if(!e)return null;const n=e(t);return 1===n.length?n[0]:n}const Ke=(0,t.defineComponent)({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:a,slots:i}){!function(){const e=(0,t.getCurrentInstance)(),n=e.parent&&e.parent.type.name,a=e.parent&&e.parent.subTree&&e.parent.subTree.type;if(n&&("KeepAlive"===n||n.includes("Transition"))&&"object"==typeof a&&"RouterView"===a.name){const e="KeepAlive"===n?"keep-alive":"transition";c(` can no longer be used directly inside or .\nUse slot props instead:\n\n\n <${e}>\n \n \n`)}}();const r=(0,t.inject)(qe),s=(0,t.computed)(()=>e.route||r.value),u=(0,t.inject)(Ie,0),d=(0,t.computed)(()=>{let e=(0,t.unref)(u);const{matched:n}=s.value;let a;for(;(a=n[e])&&!a.components;)e++;return e}),h=(0,t.computed)(()=>s.value.matched[d.value]);(0,t.provide)(Ie,(0,t.computed)(()=>d.value+1)),(0,t.provide)(Oe,h),(0,t.provide)(qe,s);const p=(0,t.ref)();return(0,t.watch)(()=>[p.value,h.value,e.name],([e,t,n],[a,i,o])=>{t&&(t.instances[n]=e,i&&i!==t&&e&&e===a&&(t.leaveGuards.size||(t.leaveGuards=i.leaveGuards),t.updateGuards.size||(t.updateGuards=i.updateGuards))),!e||!t||i&&O(t,i)&&a||(t.enterCallbacks[n]||[]).forEach(t=>t(e))},{flush:"post"}),()=>{const r=s.value,u=e.name,c=h.value,f=c&&c.components[u];if(!f)return Ge(i.default,{Component:f,route:r});const m=c.props[u],_=m?!0===m?r.params:"function"==typeof m?m(r):m:null,g=(0,t.h)(f,o({},_,a,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(c.instances[u]=null)},ref:p}));if(n&&g.ref){const e={depth:d.value,name:c.name,path:c.path,meta:c.meta};(l(g.ref)?g.ref.map(e=>e.i):[g.ref.i]).forEach(t=>{t.__vrv_devtools=e})}return Ge(i.default,{Component:g,route:r})||g}}});return e.NavigationFailureType=ne,e.RouterLink=Ue,e.RouterView=Ke,e.START_LOCATION=q,e.createMemoryHistory=function(e=""){let t=[],n=[["",{}]],a=0;function i(e,t={}){a++,a!==n.length&&n.splice(a),n.push([e,t])}const o={location:"",state:{},base:e=F(e),createHref:V.bind(null,e),replace(e,t){n.splice(a--,1),i(e,t)},push(e,t){i(e,t)},listen:e=>(t.push(e),()=>{const n=t.indexOf(e);n>-1&&t.splice(n,1)}),destroy(){t=[],n=[["",{}]],a=0},go(e,i=!0){const o=this.location,r=e<0?B.back:B.forward;a=Math.max(0,Math.min(a+e,n.length-1)),i&&function(e,n,{direction:a,delta:i}){const o={direction:a,delta:i,type:j.pop};for(const a of t)a(e,n,o)}(this.location,o,{direction:r,delta:e})}};return Object.defineProperty(o,"location",{enumerable:!0,get:()=>n[a][0]}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>n[a][1]}),o},e.createRouter=function(e){const a=ye(e.routes,e),i=e.parseQuery||Me,u=e.stringifyQuery||Re,d=e.history;if(!d)throw new Error('Provide the "history" option when calling "createRouter()": https://router.vuejs.org/api/interfaces/RouterOptions.html#history');const h=je(),p=je(),f=je(),m=(0,t.shallowRef)(q);let _=q;n&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const g=r.bind(null,e=>""+e),v=r.bind(null,E),y=r.bind(null,A);function k(e,t){if(t=o({},t||m.value),"string"==typeof e){const n=M(i,e,t.path),r=a.resolve({path:n.path},t),s=d.createHref(n.fullPath);return s.startsWith("//")?c(`Location "${e}" resolved to "${s}". A resolved location cannot start with multiple slashes.`):r.matched.length||c(`No match found for location with path "${e}"`),o(n,r,{params:y(r.params),redirectedFrom:void 0,href:s})}if(!J(e))return c("router.resolve() was passed an invalid location. This will fail in production.\n- Location:",e),k({});let n;if(null!=e.path)"params"in e&&!("name"in e)&&Object.keys(e.params).length&&c(`Path "${e.path}" was passed with params but they will be ignored. Use a named route alongside params instead.`),n=o({},e,{path:M(i,e.path,t.path).path});else{const a=o({},e.params);for(const e in a)null==a[e]&&delete a[e];n=o({},e,{params:v(a)}),t.params=v(t.params)}const r=a.resolve(n,t),s=e.hash||"";s&&!s.startsWith("#")&&c(`A \`hash\` should always start with the character "#". Replace "${s}" with "#${s}".`),r.params=g(y(r.params));const l=function(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}(u,o({},e,{hash:(h=s,C(h).replace(w,"{").replace(x,"}").replace(b,"^")),path:r.path}));var h;const p=d.createHref(l);return p.startsWith("//")?c(`Location "${e}" resolved to "${p}". A resolved location cannot start with multiple slashes.`):r.matched.length||c(`No match found for location with path "${null!=e.path?e.path:e}"`),o({fullPath:l,hash:s,query:u===Re?ze(e.query):e.query||{}},r,{redirectedFrom:void 0,href:p})}function S(e){return"string"==typeof e?M(i,e,m.value.path):o({},e)}function T(e,t){if(_!==e)return ie(ee.NAVIGATION_CANCELLED,{from:t,to:e})}function P(e){return R(e)}function L(e,t){const n=e.matched[e.matched.length-1];if(n&&n.redirect){const{redirect:a}=n;let i="function"==typeof a?a(e,t):a;if("string"==typeof i&&(i=i.includes("?")||i.includes("#")?i=S(i):{path:i},i.params={}),null==i.path&&!("name"in i))throw c(`Invalid redirect found:\n${JSON.stringify(i,null,2)}\n when navigating to "${e.fullPath}". A redirect must contain a name or path. This will break in production.`),new Error("Invalid redirect");return o({query:e.query,hash:e.hash,params:null!=i.path?{}:e.params},i)}}function R(e,t){const n=_=k(e),a=m.value,i=e.state,r=e.force,s=!0===e.replace,l=L(n,a);if(l)return R(o(S(l),{state:"object"==typeof l?o({},i,l.state):i,force:r,replace:s}),t||n);const d=n;let h;return d.redirectedFrom=t,!r&&z(u,a,n)&&(h=ie(ee.NAVIGATION_DUPLICATED,{to:d,from:a}),ne(a,a,!0,!1)),(h?Promise.resolve(h):D(d,a)).catch(e=>oe(e)?oe(e,ee.NAVIGATION_GUARD_REDIRECT)?e:te(e):Z(e,d,a)).then(e=>{if(e){if(oe(e,ee.NAVIGATION_GUARD_REDIRECT))return z(u,k(e.to),d)&&t&&(t._count=t._count?t._count+1:1)>30?(c(`Detected a possibly infinite redirection in a navigation guard when going from "${a.fullPath}" to "${d.fullPath}". Aborting to avoid a Stack Overflow.\n Are you always returning a new location within a navigation guard? That would lead to this error. Only return when redirecting or aborting, that should fix this. This might break in production if not fixed.`),Promise.reject(new Error("Infinite redirect in navigation guard"))):R(o({replace:s},S(e.to),{state:"object"==typeof e.to?o({},i,e.to.state):i,force:r}),t||d)}else e=F(d,a,!0,s,i);return B(d,a,e),e})}function I(e,t){const n=T(e,t);return n?Promise.reject(n):Promise.resolve()}function N(e){const t=se.values().next().value;return t&&"function"==typeof t.runWithContext?t.runWithContext(e):e()}function D(e,t){let n;const[a,i,o]=function(e,t){const n=[],a=[],i=[],o=Math.max(t.matched.length,e.matched.length);for(let r=0;rO(e,o))?a.push(o):n.push(o));const s=e.matched[r];s&&(t.matched.find(e=>O(e,s))||i.push(s))}return[n,a,i]}(e,t);n=$e(a.reverse(),"beforeRouteLeave",e,t);for(const i of a)i.leaveGuards.forEach(a=>{n.push(Fe(a,e,t))});const r=I.bind(null,e,t);return n.push(r),ue(n).then(()=>{n=[];for(const a of h.list())n.push(Fe(a,e,t));return n.push(r),ue(n)}).then(()=>{n=$e(i,"beforeRouteUpdate",e,t);for(const a of i)a.updateGuards.forEach(a=>{n.push(Fe(a,e,t))});return n.push(r),ue(n)}).then(()=>{n=[];for(const a of o)if(a.beforeEnter)if(l(a.beforeEnter))for(const i of a.beforeEnter)n.push(Fe(i,e,t));else n.push(Fe(a.beforeEnter,e,t));return n.push(r),ue(n)}).then(()=>(e.matched.forEach(e=>e.enterCallbacks={}),n=$e(o,"beforeRouteEnter",e,t,N),n.push(r),ue(n))).then(()=>{n=[];for(const a of p.list())n.push(Fe(a,e,t));return n.push(r),ue(n)}).catch(e=>oe(e,ee.NAVIGATION_CANCELLED)?e:Promise.reject(e))}function B(e,t,n){f.list().forEach(a=>N(()=>a(e,t,n)))}function F(e,t,a,i,r){const s=T(e,t);if(s)return s;const l=t===q,u=n?history.state:{};a&&(i||l?d.replace(e.fullPath,o({scroll:l&&u&&u.scroll},r)):d.push(e.fullPath,r)),m.value=e,ne(e,t,a,l),te()}let $;function V(){$||($=d.listen((e,t,a)=>{if(!le.listening)return;const i=k(e),r=L(i,le.currentRoute.value);if(r)return void R(o(r,{replace:!0,force:!0}),i).catch(s);_=i;const l=m.value;var u,c;n&&(u=W(l.fullPath,a.delta),c=U(),G.set(u,c)),D(i,l).catch(e=>oe(e,ee.NAVIGATION_ABORTED|ee.NAVIGATION_CANCELLED)?e:oe(e,ee.NAVIGATION_GUARD_REDIRECT)?(R(o(S(e.to),{force:!0}),i).then(e=>{oe(e,ee.NAVIGATION_ABORTED|ee.NAVIGATION_DUPLICATED)&&!a.delta&&a.type===j.pop&&d.go(-1,!1)}).catch(s),Promise.reject()):(a.delta&&d.go(-a.delta,!1),Z(e,i,l))).then(e=>{(e=e||F(i,l,!1))&&(a.delta&&!oe(e,ee.NAVIGATION_CANCELLED)?d.go(-a.delta,!1):a.type===j.pop&&oe(e,ee.NAVIGATION_ABORTED|ee.NAVIGATION_DUPLICATED)&&d.go(-1,!1)),B(i,l,e)}).catch(s)}))}let K,Y=je(),Q=je();function Z(e,t,n){te(e);const a=Q.list();return a.length?a.forEach(a=>a(e,t,n)):(c("uncaught error during route navigation:"),console.error(e)),Promise.reject(e)}function te(e){return K||(K=!e,V(),Y.list().forEach(([t,n])=>e?n(e):t()),Y.reset()),e}function ne(a,i,o,r){const{scrollBehavior:s}=e;if(!n||!s)return Promise.resolve();const l=!o&&function(e){const t=G.get(e);return G.delete(e),t}(W(a.fullPath,0))||(r||!o)&&history.state&&history.state.scroll||null;return(0,t.nextTick)().then(()=>s(a,i,l)).then(e=>e&&H(e)).catch(e=>Z(e,a,i))}const ae=e=>d.go(e);let re;const se=new Set,le={currentRoute:m,listening:!0,addRoute:function(e,t){let n,i;return X(e)?(n=a.getRecordMatcher(e),n||c(`Parent route "${String(e)}" not found when adding child route`,t),i=t):i=e,a.addRoute(i,n)},removeRoute:function(e){const t=a.getRecordMatcher(e);t?a.removeRoute(t):c(`Cannot remove non-existent route "${String(e)}"`)},clearRoutes:a.clearRoutes,hasRoute:function(e){return!!a.getRecordMatcher(e)},getRoutes:function(){return a.getRoutes().map(e=>e.record)},resolve:k,options:e,push:P,replace:function(e){return P(o(S(e),{replace:!0}))},go:ae,back:()=>ae(-1),forward:()=>ae(1),beforeEach:h.add,beforeResolve:p.add,afterEach:f.add,onError:Q.add,isReady:function(){return K&&m.value!==q?Promise.resolve():new Promise((e,t)=>{Y.add([e,t])})},install(e){e.component("RouterLink",Ue),e.component("RouterView",Ke),e.config.globalProperties.$router=le,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>(0,t.unref)(m)}),n&&!re&&m.value===q&&(re=!0,P(d.location).catch(e=>{c("Unexpected error when starting the router:",e)}));const a={};for(const e in q)Object.defineProperty(a,e,{get:()=>m.value[e],enumerable:!0});e.provide(Ne,le),e.provide(De,(0,t.shallowReactive)(a)),e.provide(qe,m);const i=e.unmount;se.add(e),e.unmount=function(){se.delete(e),se.size<1&&(_=q,$&&$(),$=null,m.value=q,re=!1,K=!1),i()}}};function ue(e){return e.reduce((e,t)=>e.then(()=>N(t)),Promise.resolve())}return le},e.createRouterMatcher=ye,e.createWebHashHistory=function(e){return(e=location.host?e||location.pathname+location.search:"").includes("#")||(e+="#"),e.endsWith("#/")||e.endsWith("#")||c(`A hash base must end with a "#":\n"${e}" should be "${e.replace(/#.*$/,"#")}".`),Z(e)},e.createWebHistory=Z,e.isNavigationFailure=oe,e.loadRouteLocation=function(e){return e.matched.every(e=>e.redirect)?Promise.reject(new Error("Cannot load a route that redirects.")):Promise.all(e.matched.map(e=>e.components&&Promise.all(Object.keys(e.components).reduce((t,n)=>{const a=e.components[n];return"function"!=typeof a||"displayName"in a||t.push(a().then(t=>{if(!t)return Promise.reject(new Error(`Couldn't resolve component "${n}" at "${e.path}". Ensure you passed a function that returns a promise.`));const a=i(t)?t.default:t;e.mods[n]=t,e.components[n]=a})),t},[])))).then(()=>e)},e.matchedRouteKey=Oe,e.onBeforeRouteLeave=function(e){(0,t.getCurrentInstance)()?Be((0,t.inject)(Oe,{}),"leaveGuards",e):c("getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function")},e.onBeforeRouteUpdate=function(e){(0,t.getCurrentInstance)()?Be((0,t.inject)(Oe,{}),"updateGuards",e):c("getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function")},e.parseQuery=Me,e.routeLocationKey=De,e.routerKey=Ne,e.routerViewLocationKey=qe,e.stringifyQuery=Re,e.useLink=Ve,e.useRoute=function(e){return(0,t.inject)(De)},e.useRouter=function(){return(0,t.inject)(Ne)},e.viewDepthKey=Ie,e}({},Vue); /*! * vue-i18n v11.4.2 * (c) 2026 kazuya kawaguchi * Released under the MIT License. - */!function(e,t){"object"==typeof exports&&typeof module<"u"?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e=typeof globalThis<"u"?globalThis:e||self).VueQrcodeReader={},e.Vue)}(this,function(e,t){"use strict";var n=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)},a=(e,t,a)=>(n(e,t,"read from private field"),a?a.call(e):t.get(e));const i=[["aztec","Aztec"],["code_128","Code128"],["code_39","Code39"],["code_93","Code93"],["codabar","Codabar"],["databar","DataBar"],["databar_expanded","DataBarExpanded"],["data_matrix","DataMatrix"],["dx_film_edge","DXFilmEdge"],["ean_13","EAN-13"],["ean_8","EAN-8"],["itf","ITF"],["maxi_code","MaxiCode"],["micro_qr_code","MicroQRCode"],["pdf417","PDF417"],["qr_code","QRCode"],["rm_qr_code","rMQRCode"],["upc_a","UPC-A"],["upc_e","UPC-E"],["linear_codes","Linear-Codes"],["matrix_codes","Matrix-Codes"]],r=[...i,["unknown"]].map(e=>e[0]),o=new Map(i);function s(e){for(const[t,n]of o)if(e===n)return t;return"unknown"}function l(e){try{return e instanceof HTMLImageElement}catch(e){return!1}}function u(e){try{return e instanceof SVGImageElement}catch(e){return!1}}function c(e){try{return e instanceof HTMLVideoElement}catch(e){return!1}}function d(e){try{return e instanceof HTMLCanvasElement}catch(e){return!1}}function h(e){try{return e instanceof ImageBitmap}catch(e){return!1}}function p(e){try{return e instanceof OffscreenCanvas}catch(e){return!1}}function f(e){try{return e instanceof VideoFrame}catch(e){return!1}}function m(e){try{return e instanceof Blob}catch(e){return!1}}async function _(e){if(l(e)&&!await async function(e){try{return await e.decode(),!0}catch(e){return!1}}(e))throw new DOMException("Failed to load or decode HTMLImageElement.","InvalidStateError");if(u(e)&&!await async function(e){var t;try{return await(null==(t=e.decode)?void 0:t.call(e)),!0}catch(e){return!1}}(e))throw new DOMException("Failed to load or decode SVGImageElement.","InvalidStateError");if(f(e)&&function(e){return null===e.format}(e))throw new DOMException("VideoFrame is closed.","InvalidStateError");if(c(e)&&(0===e.readyState||1===e.readyState))throw new DOMException("Invalid element or state.","InvalidStateError");if(h(e)&&function(e){return 0===e.width&&0===e.height}(e))throw new DOMException("The image source is detached.","InvalidStateError");const{width:t,height:n}=function(e){if(l(e))return{width:e.naturalWidth,height:e.naturalHeight};if(u(e))return{width:e.width.baseVal.value,height:e.height.baseVal.value};if(c(e))return{width:e.videoWidth,height:e.videoHeight};if(h(e))return{width:e.width,height:e.height};if(f(e))return{width:e.displayWidth,height:e.displayHeight};if(d(e))return{width:e.width,height:e.height};if(p(e))return{width:e.width,height:e.height};throw new TypeError("The provided value is not of type '(Blob or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or ImageData or OffscreenCanvas or SVGImageElement or VideoFrame)'.")}(e);if(0===t||0===n)return null;const a=function(e,t){try{const n=new OffscreenCanvas(e,t);if(n.getContext("2d")instanceof OffscreenCanvasRenderingContext2D)return n;throw void 0}catch(n){const a=document.createElement("canvas");return a.width=e,a.height=t,a}}(t,n).getContext("2d");a.drawImage(e,0,0);try{return a.getImageData(0,0,t,n)}catch(e){throw new DOMException("Source would taint origin.","SecurityError")}}async function g(e){if(m(e))return await async function(e){let t;try{if(globalThis.createImageBitmap)t=await createImageBitmap(e);else{if(!globalThis.Image)return e;{t=new Image;let n="";try{n=URL.createObjectURL(e),t.src=n,await t.decode()}finally{URL.revokeObjectURL(n)}}}}catch(e){throw new DOMException("Failed to load or decode Blob.","InvalidStateError")}return await _(t)}(e);if(function(e){try{return e instanceof ImageData}catch(e){return!1}}(e)){if(function(e){return 0===e.data.buffer.byteLength}(e))throw new DOMException("The image data has been detached.","InvalidStateError");return e}return d(e)||p(e)?function(e){const{width:t,height:n}=e;if(0===t||0===n)return null;const a=e.getContext("2d");try{return a.getImageData(0,0,t,n)}catch(e){throw new DOMException("Source would taint origin.","SecurityError")}}(e):await _(e)}function v(e,t){return e instanceof DOMException?new DOMException(`${t}: ${e.message}`,e.name):e instanceof Error?new e.constructor(`${t}: ${e.message}`):new Error(`${t}: ${e}`)}const b=["Aztec","Codabar","Code128","Code39","Code93","DataBar","DataBarExpanded","DataMatrix","DXFilmEdge","EAN-13","EAN-8","ITF","Linear-Codes","Matrix-Codes","MaxiCode","MicroQRCode","None","PDF417","QRCode","rMQRCode","UPC-A","UPC-E"];function y(e){return e.join("|")}function w(e){const t=k(e);let n=0,a=b.length-1;for(;n<=a;){const e=Math.floor((n+a)/2),i=b[e],r=k(i);if(r===t)return i;r{const n=e.match(/_(.+?)\.wasm$/);return n?`https://fastly.jsdelivr.net/npm/zxing-wasm@1.1.3/dist/${n[1]}/${e}`:t+e}};let z=new WeakMap;function I(e,t){var n;const a=z.get(e);if(null!=a&&a.modulePromise&&void 0===t)return a.modulePromise;const i=null!=(n=null==a?void 0:a.moduleOverrides)?n:R,r=e({...i});return z.set(e,{moduleOverrides:i,modulePromise:r}),r}var N,O,j=(N=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0,function(e={}){var t,n,a=e;a.ready=new Promise((e,a)=>{t=e,n=a});var i=Object.assign({},a),r="./this.program",o="object"==typeof window,s="function"==typeof importScripts;"object"==typeof process&&"object"==typeof process.versions&&process.versions.node;var l,u="";(o||s)&&(s?u=self.location.href:typeof document<"u"&&document.currentScript&&(u=document.currentScript.src),N&&(u=N),u=0!==u.indexOf("blob:")?u.substr(0,u.replace(/[?#].*/,"").lastIndexOf("/")+1):"",s&&(l=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)})),a.print||console.log.bind(console);var c,d=a.printErr||console.error.bind(console);Object.assign(a,i),i=null,a.arguments&&a.arguments,a.thisProgram&&(r=a.thisProgram),a.quit&&a.quit,a.wasmBinary&&(c=a.wasmBinary),"object"!=typeof WebAssembly&&L("no native wasm support detected");var h,p,f,m,_,g,v,b,y,w=!1;function k(){var e=h.buffer;a.HEAP8=p=new Int8Array(e),a.HEAP16=m=new Int16Array(e),a.HEAPU8=f=new Uint8Array(e),a.HEAPU16=_=new Uint16Array(e),a.HEAP32=g=new Int32Array(e),a.HEAPU32=v=new Uint32Array(e),a.HEAPF32=b=new Float32Array(e),a.HEAPF64=y=new Float64Array(e)}var x=[],S=[],C=[];function T(e){x.unshift(e)}function P(e){C.unshift(e)}var E=0,A=null;function L(e){var t;null===(t=a.onAbort)||void 0===t||t.call(a,e),d(e="Aborted("+e+")"),w=!0,e+=". Build with -sASSERTIONS for more info.";var i=new WebAssembly.RuntimeError(e);throw n(i),i}var M,R,z=e=>e.startsWith("data:application/octet-stream;base64,");function I(e){if(e==M&&c)return new Uint8Array(c);if(l)return l(e);throw"both async and sync fetching of the wasm failed"}function O(e,t,n){return function(e){return c||!o&&!s||"function"!=typeof fetch?Promise.resolve().then(()=>I(e)):fetch(e,{credentials:"same-origin"}).then(t=>{if(!t.ok)throw"failed to load wasm binary file at '"+e+"'";return t.arrayBuffer()}).catch(()=>I(e))}(e).then(e=>WebAssembly.instantiate(e,t)).then(e=>e).then(n,e=>{d(`failed to asynchronously prepare wasm: ${e}`),L(e)})}z(M="zxing_reader.wasm")||(R=M,M=a.locateFile?a.locateFile(R,u):u+R);var j=e=>{for(;e.length>0;)e.shift()(a)};a.noExitRuntime;var D=[],q=0,B=0;function F(e){this.excPtr=e,this.ptr=e-24,this.set_type=function(e){v[this.ptr+4>>2]=e},this.get_type=function(){return v[this.ptr+4>>2]},this.set_destructor=function(e){v[this.ptr+8>>2]=e},this.get_destructor=function(){return v[this.ptr+8>>2]},this.set_caught=function(e){e=e?1:0,p[this.ptr+12|0]=e},this.get_caught=function(){return 0!=p[this.ptr+12|0]},this.set_rethrown=function(e){e=e?1:0,p[this.ptr+13|0]=e},this.get_rethrown=function(){return 0!=p[this.ptr+13|0]},this.init=function(e,t){this.set_adjusted_ptr(0),this.set_type(e),this.set_destructor(t)},this.set_adjusted_ptr=function(e){v[this.ptr+16>>2]=e},this.get_adjusted_ptr=function(){return v[this.ptr+16>>2]},this.get_exception_ptr=function(){if(Nt(this.get_type()))return v[this.excPtr>>2];var e=this.get_adjusted_ptr();return 0!==e?e:this.excPtr}}var V=e=>{var t=B;if(!t)return At(0),0;var n=new F(t);n.set_adjusted_ptr(t);var a=n.get_type();if(!a)return At(0),t;for(var i in e){var r=e[i];if(0===r||r===a)break;var o=n.ptr+16;if(It(r,a,o))return At(r),t}return At(a),t},U={},$=e=>{for(;e.length;){var t=e.pop();e.pop()(t)}};function H(e){return this.fromWireType(g[e>>2])}var W,G,K,Y={},Q={},Z={},J=e=>{throw new W(e)},X=(e,t,n)=>{function a(t){var a=n(t);a.length!==e.length&&J("Mismatched type converter count");for(var i=0;i{Q.hasOwnProperty(e)?i[t]=Q[e]:(r.push(e),Y.hasOwnProperty(e)||(Y[e]=[]),Y[e].push(()=>{i[t]=Q[e],++o===r.length&&a(i)}))}),0===r.length&&a(i)},ee=e=>{for(var t="",n=e;f[n];)t+=G[f[n++]];return t},te=e=>{throw new K(e)};function ne(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!("argPackAdvance"in t))throw new TypeError("registerType registeredInstance requires argPackAdvance");return function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};var a=t.name;if(e||te(`type "${a}" must have a positive integer typeid pointer`),Q.hasOwnProperty(e)){if(n.ignoreDuplicateRegistrations)return;te(`Cannot register type '${a}' twice`)}if(Q[e]=t,delete Z[e],Y.hasOwnProperty(e)){var i=Y[e];delete Y[e],i.forEach(e=>e())}}(e,t,n)}var ae,ie=8,re=e=>({count:e.count,deleteScheduled:e.deleteScheduled,preservePointerOnDelete:e.preservePointerOnDelete,ptr:e.ptr,ptrType:e.ptrType,smartPtr:e.smartPtr,smartPtrType:e.smartPtrType}),oe=e=>{te(e.$$.ptrType.registeredClass.name+" instance already deleted")},se=!1,le=e=>{},ue=e=>{e.count.value-=1,0===e.count.value&&(e=>{e.smartPtr?e.smartPtrType.rawDestructor(e.smartPtr):e.ptrType.registeredClass.rawDestructor(e.ptr)})(e)},ce=(e,t,n)=>{if(t===n)return e;if(void 0===n.baseClass)return null;var a=ce(e,t,n.baseClass);return null===a?null:n.downcast(a)},de={},he=()=>Object.keys(ge).length,pe=()=>{var e=[];for(var t in ge)ge.hasOwnProperty(t)&&e.push(ge[t]);return e},fe=[],me=()=>{for(;fe.length;){var e=fe.pop();e.$$.deleteScheduled=!1,e.delete()}},_e=e=>{ae=e,fe.length&&ae&&ae(me)},ge={},ve=(e,t)=>(t=((e,t)=>{for(void 0===t&&te("ptr should not be undefined");e.baseClass;)t=e.upcast(t),e=e.baseClass;return t})(e,t),ge[t]),be=(e,t)=>((!t.ptrType||!t.ptr)&&J("makeClassHandle requires ptr and ptrType"),!!t.smartPtrType!=!!t.smartPtr&&J("Both smartPtrType and smartPtr must be specified"),t.count={value:1},we(Object.create(e,{$$:{value:t,writable:!0}})));function ye(e){var t=this.getPointee(e);if(!t)return this.destructor(e),null;var n=ve(this.registeredClass,t);if(void 0!==n){if(0===n.$$.count.value)return n.$$.ptr=t,n.$$.smartPtr=e,n.clone();var a=n.clone();return this.destructor(e),a}function i(){return this.isSmartPointer?be(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:t,smartPtrType:this,smartPtr:e}):be(this.registeredClass.instancePrototype,{ptrType:this,ptr:e})}var r,o=this.registeredClass.getActualType(t),s=de[o];if(!s)return i.call(this);r=this.isConst?s.constPointerType:s.pointerType;var l=ce(t,this.registeredClass,r.registeredClass);return null===l?i.call(this):this.isSmartPointer?be(r.registeredClass.instancePrototype,{ptrType:r,ptr:l,smartPtrType:this,smartPtr:e}):be(r.registeredClass.instancePrototype,{ptrType:r,ptr:l})}var we=e=>typeof FinalizationRegistry>"u"?(we=e=>e,e):(se=new FinalizationRegistry(e=>{ue(e.$$)}),le=e=>se.unregister(e),(we=e=>{var t=e.$$;if(t.smartPtr){var n={$$:t};se.register(e,n,e)}return e})(e));function ke(){}var xe=(e,t)=>Object.defineProperty(t,"name",{value:e}),Se=(e,t,n)=>{if(void 0===e[t].overloadTable){var a=e[t];e[t]=function(){return e[t].overloadTable.hasOwnProperty(arguments.length)||te(`Function '${n}' called with an invalid number of arguments (${arguments.length}) - expects one of (${e[t].overloadTable})!`),e[t].overloadTable[arguments.length].apply(this,arguments)},e[t].overloadTable=[],e[t].overloadTable[a.argCount]=a}},Ce=(e,t,n)=>{a.hasOwnProperty(e)?((void 0===n||void 0!==a[e].overloadTable&&void 0!==a[e].overloadTable[n])&&te(`Cannot register public name '${e}' twice`),Se(a,e,e),a.hasOwnProperty(n)&&te(`Cannot register multiple overloads of a function with the same number of arguments (${n})!`),a[e].overloadTable[n]=t):(a[e]=t,void 0!==n&&(a[e].numArguments=n))};function Te(e,t,n,a,i,r,o,s){this.name=e,this.constructor=t,this.instancePrototype=n,this.rawDestructor=a,this.baseClass=i,this.getActualType=r,this.upcast=o,this.downcast=s,this.pureVirtualFunctions=[]}var Pe=(e,t,n)=>{for(;t!==n;)t.upcast||te(`Expected null or instance of ${n.name}, got an instance of ${t.name}`),e=t.upcast(e),t=t.baseClass;return e};function Ee(e,t){if(null===t)return this.isReference&&te(`null is not a valid ${this.name}`),0;t.$$||te(`Cannot pass "${Je(t)}" as a ${this.name}`),t.$$.ptr||te(`Cannot pass deleted object as a pointer of type ${this.name}`);var n=t.$$.ptrType.registeredClass;return Pe(t.$$.ptr,n,this.registeredClass)}function Ae(e,t){var n;if(null===t)return this.isReference&&te(`null is not a valid ${this.name}`),this.isSmartPointer?(n=this.rawConstructor(),null!==e&&e.push(this.rawDestructor,n),n):0;(!t||!t.$$)&&te(`Cannot pass "${Je(t)}" as a ${this.name}`),t.$$.ptr||te(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&t.$$.ptrType.isConst&&te(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);var a=t.$$.ptrType.registeredClass;if(n=Pe(t.$$.ptr,a,this.registeredClass),this.isSmartPointer)switch(void 0===t.$$.smartPtr&&te("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:t.$$.smartPtrType===this?n=t.$$.smartPtr:te(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:n=t.$$.smartPtr;break;case 2:if(t.$$.smartPtrType===this)n=t.$$.smartPtr;else{var i=t.clone();n=this.rawShare(n,Ye.toHandle(()=>i.delete())),null!==e&&e.push(this.rawDestructor,n)}break;default:te("Unsupporting sharing policy")}return n}function Le(e,t){if(null===t)return this.isReference&&te(`null is not a valid ${this.name}`),0;t.$$||te(`Cannot pass "${Je(t)}" as a ${this.name}`),t.$$.ptr||te(`Cannot pass deleted object as a pointer of type ${this.name}`),t.$$.ptrType.isConst&&te(`Cannot convert argument of type ${t.$$.ptrType.name} to parameter type ${this.name}`);var n=t.$$.ptrType.registeredClass;return Pe(t.$$.ptr,n,this.registeredClass)}function Me(e){return this.fromWireType(v[e>>2])}function Re(e,t,n,a,i,r,o,s,l,u,c){this.name=e,this.registeredClass=t,this.isReference=n,this.isConst=a,this.isSmartPointer=i,this.pointeeType=r,this.sharingPolicy=o,this.rawGetPointee=s,this.rawConstructor=l,this.rawShare=u,this.rawDestructor=c,i||void 0!==t.baseClass?this.toWireType=Ae:a?(this.toWireType=Ee,this.destructorFunction=null):(this.toWireType=Le,this.destructorFunction=null)}var ze,Ie,Ne=(e,t,n)=>{a.hasOwnProperty(e)||J("Replacing nonexistant public symbol"),void 0!==a[e].overloadTable&&void 0!==n?a[e].overloadTable[n]=t:(a[e]=t,a[e].argCount=n)},Oe=[],je=e=>{var t=Oe[e];return t||(e>=Oe.length&&(Oe.length=e+1),Oe[e]=t=ze.get(e)),t},De=(e,t,n)=>e.includes("j")?((e,t,n)=>{var i=a["dynCall_"+e];return n&&n.length?i.apply(null,[t].concat(n)):i.call(null,t)})(e,t,n):je(t).apply(null,n),qe=(e,t)=>{var n=(e=ee(e)).includes("j")?((e,t)=>{var n=[];return function(){return n.length=0,Object.assign(n,arguments),De(e,t,n)}})(e,t):je(t);return"function"!=typeof n&&te(`unknown function pointer with signature ${e}: ${t}`),n},Be=e=>{var t=Pt(e),n=ee(t);return Ct(t),n},Fe=(e,t)=>{var n=[],a={};throw t.forEach(function e(t){if(!a[t]&&!Q[t]){if(Z[t])return void Z[t].forEach(e);n.push(t),a[t]=!0}}),new Ie(`${e}: `+n.map(Be).join([", "]))},Ve=(e,t)=>{for(var n=[],a=0;a>2]);return n};function Ue(e,t,n,a,i,r){var o=t.length;o<2&&te("argTypes array size mismatch! Must at least get return value and 'this' types!");var s=null!==t[1]&&null!==n,l=function(e){for(var t=1;t{const t=(e=e.trim()).indexOf("(");return-1!==t?e.substr(0,t):e};function He(){this.allocated=[void 0],this.freelist=[]}var We=new He,Ge=e=>{e>=We.reserved&&0===--We.get(e).refcount&&We.free(e)},Ke=()=>{for(var e=0,t=We.reserved;t(e||te("Cannot use deleted val. handle = "+e),We.get(e).value),toHandle:e=>{switch(e){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:return We.allocate({refcount:1,value:e})}}},Qe=(e,t,n)=>{switch(t){case 1:return n?function(e){return this.fromWireType(p[0|e])}:function(e){return this.fromWireType(f[0|e])};case 2:return n?function(e){return this.fromWireType(m[e>>1])}:function(e){return this.fromWireType(_[e>>1])};case 4:return n?function(e){return this.fromWireType(g[e>>2])}:function(e){return this.fromWireType(v[e>>2])};default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},Ze=(e,t)=>{var n=Q[e];return void 0===n&&te(t+" has unknown type "+Be(e)),n},Je=e=>{if(null===e)return"null";var t=typeof e;return"object"===t||"array"===t||"function"===t?e.toString():""+e},Xe=(e,t)=>{switch(t){case 4:return function(e){return this.fromWireType(b[e>>2])};case 8:return function(e){return this.fromWireType(y[e>>3])};default:throw new TypeError(`invalid float width (${t}): ${e}`)}},et=(e,t,n)=>{switch(t){case 1:return n?e=>p[0|e]:e=>f[0|e];case 2:return n?e=>m[e>>1]:e=>_[e>>1];case 4:return n?e=>g[e>>2]:e=>v[e>>2];default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},tt=(e,t,n,a)=>{if(!(a>0))return 0;for(var i=n,r=n+a-1,o=0;o=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++o)),s<=127){if(n>=r)break;t[n++]=s}else if(s<=2047){if(n+1>=r)break;t[n++]=192|s>>6,t[n++]=128|63&s}else if(s<=65535){if(n+2>=r)break;t[n++]=224|s>>12,t[n++]=128|s>>6&63,t[n++]=128|63&s}else{if(n+3>=r)break;t[n++]=240|s>>18,t[n++]=128|s>>12&63,t[n++]=128|s>>6&63,t[n++]=128|63&s}}return t[n]=0,n-i},nt=e=>{for(var t=0,n=0;n=55296&&a<=57343?(t+=4,++n):t+=3}return t},at=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,it=(e,t)=>e?((e,t,n)=>{for(var a=t+n,i=t;e[i]&&!(i>=a);)++i;if(i-t>16&&e.buffer&&at)return at.decode(e.subarray(t,i));for(var r="";t>10,56320|1023&u)}}else r+=String.fromCharCode((31&o)<<6|s)}else r+=String.fromCharCode(o)}return r})(f,e,t):"",rt=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,ot=(e,t)=>{for(var n=e,a=n>>1,i=a+t/2;!(a>=i)&&_[a];)++a;if((n=a<<1)-e>32&&rt)return rt.decode(f.subarray(e,n));for(var r="",o=0;!(o>=t/2);++o){var s=m[e+2*o>>1];if(0==s)break;r+=String.fromCharCode(s)}return r},st=(e,t,n)=>{var a;if(null!==(a=n)&&void 0!==a||(n=2147483647),n<2)return 0;for(var i=t,r=(n-=2)<2*e.length?n/2:e.length,o=0;o>1]=s,t+=2}return m[t>>1]=0,t-i},lt=e=>2*e.length,ut=(e,t)=>{for(var n=0,a="";!(n>=t/4);){var i=g[e+4*n>>2];if(0==i)break;if(++n,i>=65536){var r=i-65536;a+=String.fromCharCode(55296|r>>10,56320|1023&r)}else a+=String.fromCharCode(i)}return a},ct=(e,t,n)=>{var a;if(null!==(a=n)&&void 0!==a||(n=2147483647),n<4)return 0;for(var i=t,r=i+n-4,o=0;o=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++o)),g[t>>2]=s,(t+=4)+4>r)break}return g[t>>2]=0,t-i},dt=e=>{for(var t=0,n=0;n=55296&&a<=57343&&++n,t+=4}return t},ht=[],pt={},ft=()=>{if("object"==typeof globalThis)return globalThis;function e(e){e.$$$embind_global$$$=e;var t="object"==typeof $$$embind_global$$$&&e.$$$embind_global$$$==e;return t||delete e.$$$embind_global$$$,t}if("object"==typeof $$$embind_global$$$||("object"==typeof global&&e(global)?$$$embind_global$$$=global:"object"==typeof self&&e(self)&&($$$embind_global$$$=self),"object"==typeof $$$embind_global$$$))return $$$embind_global$$$;throw Error("unable to get global object.")},mt=Reflect.construct,_t=e=>{var t=(e-h.buffer.byteLength+65535)/65536;try{return h.grow(t),k(),1}catch(e){}},gt={},vt=()=>{if(!vt.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:r||"./this.program"};for(var t in gt)void 0===gt[t]?delete e[t]:e[t]=gt[t];var n=[];for(var t in e)n.push(`${t}=${e[t]}`);vt.strings=n}return vt.strings},bt=e=>e%4==0&&(e%100!=0||e%400==0),yt=[31,29,31,30,31,30,31,31,30,31,30,31],wt=[31,28,31,30,31,30,31,31,30,31,30,31],kt=(e,t,n,a)=>{var i=v[a+40>>2],r={tm_sec:g[a>>2],tm_min:g[a+4>>2],tm_hour:g[a+8>>2],tm_mday:g[a+12>>2],tm_mon:g[a+16>>2],tm_year:g[a+20>>2],tm_wday:g[a+24>>2],tm_yday:g[a+28>>2],tm_isdst:g[a+32>>2],tm_gmtoff:g[a+36>>2],tm_zone:i?it(i):""},o=it(n),s={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var l in s)o=o.replace(new RegExp(l,"g"),s[l]);var u=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],c=["January","February","March","April","May","June","July","August","September","October","November","December"];function d(e,t,n){for(var a="number"==typeof e?e.toString():e||"";a.length0?1:0}var a;return 0===(a=n(e.getFullYear()-t.getFullYear()))&&0===(a=n(e.getMonth()-t.getMonth()))&&(a=n(e.getDate()-t.getDate())),a}function m(e){switch(e.getDay()){case 0:return new Date(e.getFullYear()-1,11,29);case 1:return e;case 2:return new Date(e.getFullYear(),0,3);case 3:return new Date(e.getFullYear(),0,2);case 4:return new Date(e.getFullYear(),0,1);case 5:return new Date(e.getFullYear()-1,11,31);case 6:return new Date(e.getFullYear()-1,11,30)}}function _(e){var t=((e,t)=>{for(var n=new Date(e.getTime());t>0;){var a=bt(n.getFullYear()),i=n.getMonth(),r=(a?yt:wt)[i];if(!(t>r-n.getDate()))return n.setDate(n.getDate()+t),n;t-=r-n.getDate()+1,n.setDate(1),i<11?n.setMonth(i+1):(n.setMonth(0),n.setFullYear(n.getFullYear()+1))}return n})(new Date(e.tm_year+1900,0,1),e.tm_yday),n=new Date(t.getFullYear(),0,4),a=new Date(t.getFullYear()+1,0,4),i=m(n),r=m(a);return f(i,t)<=0?f(r,t)<=0?t.getFullYear()+1:t.getFullYear():t.getFullYear()-1}var b={"%a":e=>u[e.tm_wday].substring(0,3),"%A":e=>u[e.tm_wday],"%b":e=>c[e.tm_mon].substring(0,3),"%B":e=>c[e.tm_mon],"%C":e=>h((e.tm_year+1900)/100|0,2),"%d":e=>h(e.tm_mday,2),"%e":e=>d(e.tm_mday,2," "),"%g":e=>_(e).toString().substring(2),"%G":e=>_(e),"%H":e=>h(e.tm_hour,2),"%I":e=>{var t=e.tm_hour;return 0==t?t=12:t>12&&(t-=12),h(t,2)},"%j":e=>h(e.tm_mday+((e,t)=>{for(var n=0,a=0;a<=t;n+=e[a++]);return n})(bt(e.tm_year+1900)?yt:wt,e.tm_mon-1),3),"%m":e=>h(e.tm_mon+1,2),"%M":e=>h(e.tm_min,2),"%n":()=>"\n","%p":e=>e.tm_hour>=0&&e.tm_hour<12?"AM":"PM","%S":e=>h(e.tm_sec,2),"%t":()=>"\t","%u":e=>e.tm_wday||7,"%U":e=>{var t=e.tm_yday+7-e.tm_wday;return h(Math.floor(t/7),2)},"%V":e=>{var t=Math.floor((e.tm_yday+7-(e.tm_wday+6)%7)/7);if((e.tm_wday+371-e.tm_yday-2)%7<=2&&t++,t){if(53==t){var n=(e.tm_wday+371-e.tm_yday)%7;4!=n&&(3!=n||!bt(e.tm_year))&&(t=1)}}else{t=52;var a=(e.tm_wday+7-e.tm_yday-1)%7;(4==a||5==a&&bt(e.tm_year%400-1))&&t++}return h(t,2)},"%w":e=>e.tm_wday,"%W":e=>{var t=e.tm_yday+7-(e.tm_wday+6)%7;return h(Math.floor(t/7),2)},"%y":e=>(e.tm_year+1900).toString().substring(2),"%Y":e=>e.tm_year+1900,"%z":e=>{var t=e.tm_gmtoff;return(t>=0?"+":"-")+("0000"+(t=(t=Math.abs(t)/60)/60*100+t%60)).slice(-4)},"%Z":e=>e.tm_zone,"%%":()=>"%"};for(var l in o=o.replace(/%%/g,"\0\0"),b)o.includes(l)&&(o=o.replace(new RegExp(l,"g"),b[l](r)));var y=function(e){var t=nt(e)+1,n=new Array(t);return tt(e,n,0,n.length),n}(o=o.replace(/\0\0/g,"%"));return y.length>t?0:(((e,t)=>{p.set(e,t)})(y,e),y.length-1)};W=a.InternalError=class extends Error{constructor(e){super(e),this.name="InternalError"}},(()=>{for(var e=new Array(256),t=0;t<256;++t)e[t]=String.fromCharCode(t);G=e})(),K=a.BindingError=class extends Error{constructor(e){super(e),this.name="BindingError"}},Object.assign(ke.prototype,{isAliasOf(e){if(!(this instanceof ke&&e instanceof ke))return!1;var t=this.$$.ptrType.registeredClass,n=this.$$.ptr;e.$$=e.$$;for(var a=e.$$.ptrType.registeredClass,i=e.$$.ptr;t.baseClass;)n=t.upcast(n),t=t.baseClass;for(;a.baseClass;)i=a.upcast(i),a=a.baseClass;return t===a&&n===i},clone(){if(this.$$.ptr||oe(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var e=we(Object.create(Object.getPrototypeOf(this),{$$:{value:re(this.$$)}}));return e.$$.count.value+=1,e.$$.deleteScheduled=!1,e},delete(){this.$$.ptr||oe(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&te("Object already scheduled for deletion"),le(this),ue(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||oe(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&te("Object already scheduled for deletion"),fe.push(this),1===fe.length&&ae&&ae(me),this.$$.deleteScheduled=!0,this}}),a.getInheritedInstanceCount=he,a.getLiveInheritedInstances=pe,a.flushPendingDeletes=me,a.setDelayFunction=_e,Object.assign(Re.prototype,{getPointee(e){return this.rawGetPointee&&(e=this.rawGetPointee(e)),e},destructor(e){var t;null===(t=this.rawDestructor)||void 0===t||t.call(this,e)},argPackAdvance:ie,readValueFromPointer:Me,deleteObject(e){null!==e&&e.delete()},fromWireType:ye}),Ie=a.UnboundTypeError=((e,t)=>{var n=xe(t,function(e){this.name=t,this.message=e;var n=new Error(e).stack;void 0!==n&&(this.stack=this.toString()+"\n"+n.replace(/^Error(:[^\n]*)?\n/,""))});return n.prototype=Object.create(e.prototype),n.prototype.constructor=n,n.prototype.toString=function(){return void 0===this.message?this.name:`${this.name}: ${this.message}`},n})(Error,"UnboundTypeError"),Object.assign(He.prototype,{get(e){return this.allocated[e]},has(e){return void 0!==this.allocated[e]},allocate(e){var t=this.freelist.pop()||this.allocated.length;return this.allocated[t]=e,t},free(e){this.allocated[e]=void 0,this.freelist.push(e)}}),We.allocated.push({value:void 0},{value:null},{value:!0},{value:!1}),We.reserved=We.allocated.length,a.count_emval_handles=Ke;var xt={s:e=>{var t=new F(e);return t.get_caught()||(t.set_caught(!0),q--),t.set_rethrown(!1),D.push(t),zt(t.excPtr),t.get_exception_ptr()},u:()=>{Et(0,0);var e=D.pop();Rt(e.excPtr),B=0},b:()=>V([]),g:e=>V([e]),q:(e,t)=>V([e,t]),J:()=>{var e=D.pop();e||L("no exception to throw");var t=e.excPtr;throw e.get_rethrown()||(D.push(e),e.set_rethrown(!0),e.set_caught(!1),q++),B=t},f:(e,t,n)=>{throw new F(e).init(t,n),q++,B=e},V:()=>q,d:e=>{throw B||(B=e),B},da:e=>{var t=U[e];delete U[e];var n=t.rawConstructor,a=t.rawDestructor,i=t.fields,r=i.map(e=>e.getterReturnType).concat(i.map(e=>e.setterArgumentType));X([e],r,e=>{var r={};return i.forEach((t,n)=>{var a=t.fieldName,o=e[n],s=t.getter,l=t.getterContext,u=e[n+i.length],c=t.setter,d=t.setterContext;r[a]={read:e=>o.fromWireType(s(l,e)),write:(e,t)=>{var n=[];c(d,e,u.toWireType(n,t)),$(n)}}}),[{name:t.name,fromWireType:e=>{var t={};for(var n in r)t[n]=r[n].read(e);return a(e),t},toWireType:(e,t)=>{for(var i in r)if(!(i in t))throw new TypeError(`Missing field: "${i}"`);var o=n();for(i in r)r[i].write(o,t[i]);return null!==e&&e.push(a,o),o},argPackAdvance:ie,readValueFromPointer:H,destructorFunction:a}]})},Q:(e,t,n,a,i)=>{},_:(e,t,n,a)=>{ne(e,{name:t=ee(t),fromWireType:function(e){return!!e},toWireType:function(e,t){return t?n:a},argPackAdvance:ie,readValueFromPointer:function(e){return this.fromWireType(f[e])},destructorFunction:null})},ca:(e,t,n,a,i,r,o,s,l,u,c,d,h)=>{c=ee(c),r=qe(i,r),s&&(s=qe(o,s)),u&&(u=qe(l,u)),h=qe(d,h);var p=(e=>{if(void 0===e)return"_unknown";var t=(e=e.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);return t>=48&&t<=57?`_${e}`:e})(c);Ce(p,function(){Fe(`Cannot construct ${c} due to unbound types`,[a])}),X([e,t,n],a?[a]:[],function(t){var n,i;t=t[0],i=a?(n=t.registeredClass).instancePrototype:ke.prototype;var o=xe(c,function(){if(Object.getPrototypeOf(this)!==l)throw new K("Use 'new' to construct "+c);if(void 0===m.constructor_body)throw new K(c+" has no accessible constructor");var e=m.constructor_body[arguments.length];if(void 0===e)throw new K(`Tried to invoke ctor of ${c} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(m.constructor_body).toString()}) parameters instead!`);return e.apply(this,arguments)}),l=Object.create(i,{constructor:{value:o}});o.prototype=l;var d,f,m=new Te(c,o,l,h,n,r,s,u);m.baseClass&&(null!==(f=(d=m.baseClass).__derivedClasses)&&void 0!==f||(d.__derivedClasses=[]),m.baseClass.__derivedClasses.push(m));var _=new Re(c,m,!0,!1,!1),g=new Re(c+"*",m,!1,!1,!1),v=new Re(c+" const*",m,!1,!0,!1);return de[e]={pointerType:g,constPointerType:v},Ne(p,o),[_,g,v]})},ba:(e,t,n,a,i,r)=>{var o=Ve(t,n);i=qe(a,i),X([],[e],function(e){var n=`constructor ${(e=e[0]).name}`;if(void 0===e.registeredClass.constructor_body&&(e.registeredClass.constructor_body=[]),void 0!==e.registeredClass.constructor_body[t-1])throw new K(`Cannot register multiple constructors with identical number of parameters (${t-1}) for class '${e.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return e.registeredClass.constructor_body[t-1]=()=>{Fe(`Cannot construct ${e.name} due to unbound types`,o)},X([],o,a=>(a.splice(1,0,null),e.registeredClass.constructor_body[t-1]=Ue(n,a,null,i,r),[])),[]})},w:(e,t,n,a,i,r,o,s,l)=>{var u=Ve(n,a);t=ee(t),t=$e(t),r=qe(i,r),X([],[e],function(e){var a=`${(e=e[0]).name}.${t}`;function i(){Fe(`Cannot call ${a} due to unbound types`,u)}t.startsWith("@@")&&(t=Symbol[t.substring(2)]),s&&e.registeredClass.pureVirtualFunctions.push(t);var l=e.registeredClass.instancePrototype,c=l[t];return void 0===c||void 0===c.overloadTable&&c.className!==e.name&&c.argCount===n-2?(i.argCount=n-2,i.className=e.name,l[t]=i):(Se(l,t,a),l[t].overloadTable[n-2]=i),X([],u,function(i){var s=Ue(a,i,e,r,o);return void 0===l[t].overloadTable?(s.argCount=n-2,l[t]=s):l[t].overloadTable[n-2]=s,[]}),[]})},Y:(e,t)=>{ne(e,{name:t=ee(t),fromWireType:e=>{var t=Ye.toValue(e);return Ge(e),t},toWireType:(e,t)=>Ye.toHandle(t),argPackAdvance:ie,readValueFromPointer:H,destructorFunction:null})},x:(e,t,n,a)=>{function i(){}t=ee(t),i.values={},ne(e,{name:t,constructor:i,fromWireType:function(e){return this.constructor.values[e]},toWireType:(e,t)=>t.value,argPackAdvance:ie,readValueFromPointer:Qe(t,n,a),destructorFunction:null}),Ce(t,i)},h:(e,t,n)=>{var a=Ze(e,"enum");t=ee(t);var i=a.constructor,r=Object.create(a.constructor.prototype,{value:{value:n},constructor:{value:xe(`${a.name}_${t}`,function(){})}});i.values[n]=r,i[t]=r},L:(e,t,n)=>{ne(e,{name:t=ee(t),fromWireType:e=>e,toWireType:(e,t)=>t,argPackAdvance:ie,readValueFromPointer:Xe(t,n),destructorFunction:null})},M:(e,t,n,a,i,r,o)=>{var s=Ve(t,n);e=ee(e),e=$e(e),i=qe(a,i),Ce(e,function(){Fe(`Cannot call ${e} due to unbound types`,s)},t-1),X([],s,function(n){var a=[n[0],null].concat(n.slice(1));return Ne(e,Ue(e,a,null,i,r),t-1),[]})},t:(e,t,n,a,i)=>{t=ee(t);var r=e=>e;if(0===a){var o=32-8*n;r=e=>e<>>o}var s=t.includes("unsigned");ne(e,{name:t,fromWireType:r,toWireType:s?function(e,t){return this.name,t>>>0}:function(e,t){return this.name,t},argPackAdvance:ie,readValueFromPointer:et(t,n,0!==a),destructorFunction:null})},o:(e,t,n)=>{var a=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][t];function i(e){var t=v[e>>2],n=v[e+4>>2];return new a(p.buffer,n,t)}ne(e,{name:n=ee(n),fromWireType:i,argPackAdvance:ie,readValueFromPointer:i},{ignoreDuplicateRegistrations:!0})},K:(e,t)=>{var n="std::string"===(t=ee(t));ne(e,{name:t,fromWireType(e){var t,a=v[e>>2],i=e+4;if(n)for(var r=i,o=0;o<=a;++o){var s=i+o;if(o==a||0==f[s]){var l=it(r,s-r);void 0===t?t=l:(t+="\0",t+=l),r=s+1}}else{var u=new Array(a);for(o=0;o>2]=a,n&&i)((e,t,n)=>{tt(e,f,t,n)})(t,o,a+1);else if(i)for(var s=0;s255&&(Ct(o),te("String has UTF-16 code units that do not fit in 8 bits")),f[o+s]=l}else for(s=0;s{var a,i,r,o,s;n=ee(n),2===t?(a=ot,i=st,o=lt,r=()=>_,s=1):4===t&&(a=ut,i=ct,o=dt,r=()=>v,s=2),ne(e,{name:n,fromWireType:e=>{for(var n,i=v[e>>2],o=r(),l=e+4,u=0;u<=i;++u){var c=e+4+u*t;if(u==i||0==o[c>>s]){var d=a(l,c-l);void 0===n?n=d:(n+="\0",n+=d),l=c+t}}return Ct(e),n},toWireType:(e,a)=>{"string"!=typeof a&&te(`Cannot pass non-string to C++ string type ${n}`);var r=o(a),l=Tt(4+r+t);return v[l>>2]=r>>s,i(a,l+4,r+t),null!==e&&e.push(Ct,l),l},argPackAdvance:ie,readValueFromPointer:H,destructorFunction(e){Ct(e)}})},A:(e,t,n,a,i,r)=>{U[e]={name:ee(t),rawConstructor:qe(n,a),rawDestructor:qe(i,r),fields:[]}},ea:(e,t,n,a,i,r,o,s,l,u)=>{U[e].fields.push({fieldName:ee(t),getterReturnType:n,getter:qe(a,i),getterContext:r,setterArgumentType:o,setter:qe(s,l),setterContext:u})},$:(e,t)=>{ne(e,{isVoid:!0,name:t=ee(t),argPackAdvance:0,fromWireType:()=>{},toWireType:(e,t)=>{}})},R:(e,t,n,a)=>(e=ht[e])(null,t=Ye.toValue(t),n,a),ha:Ge,fa:e=>0===e?Ye.toHandle(ft()):(e=(e=>{var t=pt[e];return void 0===t?ee(e):t})(e),Ye.toHandle(ft()[e])),Z:(e,t,n)=>{var a=((e,t)=>{for(var n=new Array(e),a=0;a>2],"parameter "+a);return n})(e,t),i=a.shift();e--;var r=new Array(e),o=`methodCaller<(${a.map(e=>e.name).join(", ")}) => ${i.name}>`;return(e=>{var t=ht.length;return ht.push(e),t})(xe(o,(t,o,s,l)=>{for(var u=0,c=0;c{var a=[],i=e.toWireType(a,n);return a.length&&(v[t>>2]=Ye.toHandle(a)),i})(i,s,d)}))},N:e=>{e>4&&(We.get(e).refcount+=1)},O:e=>{var t=Ye.toValue(e);$(t),Ge(e)},aa:(e,t)=>{var n=(e=Ze(e,"_emval_take_value")).readValueFromPointer(t);return Ye.toHandle(n)},B:()=>{L("")},X:(e,t,n)=>f.copyWithin(e,t,t+n),W:e=>{var t=f.length,n=2147483648;if((e>>>=0)>n)return!1;for(var a=(e,t)=>e+(t-e%t)%t,i=1;i<=4;i*=2){var r=t*(1+.2/i);r=Math.min(r,e+100663296);var o=Math.min(n,a(Math.max(e,r),65536));if(_t(o))return!0}return!1},T:(e,t)=>{var n=0;return vt().forEach((a,i)=>{var r=t+n;v[e+4*i>>2]=r,((e,t)=>{for(var n=0;n{var n=vt();v[e>>2]=n.length;var a=0;return n.forEach(e=>a+=e.length+1),v[t>>2]=a,0},E:function(e,t,n,a){var i=Lt();try{return je(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},D:function(e,t,n,a,i){var r=Lt();try{return je(e)(t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},F:function(e,t,n,a){var i=Lt();try{return je(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},n:function(e){var t=Lt();try{return je(e)()}catch(e){if(Mt(t),e!==e+0)throw e;Et(1,0)}},a:function(e,t){var n=Lt();try{return je(e)(t)}catch(e){if(Mt(n),e!==e+0)throw e;Et(1,0)}},e:function(e,t,n){var a=Lt();try{return je(e)(t,n)}catch(e){if(Mt(a),e!==e+0)throw e;Et(1,0)}},m:function(e,t,n,a){var i=Lt();try{return je(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},k:function(e,t,n,a,i){var r=Lt();try{return je(e)(t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},H:function(e,t,n,a,i,r){var o=Lt();try{return je(e)(t,n,a,i,r)}catch(e){if(Mt(o),e!==e+0)throw e;Et(1,0)}},v:function(e,t,n,a,i,r,o){var s=Lt();try{return je(e)(t,n,a,i,r,o)}catch(e){if(Mt(s),e!==e+0)throw e;Et(1,0)}},G:function(e,t,n,a,i,r,o,s){var l=Lt();try{return je(e)(t,n,a,i,r,o,s)}catch(e){if(Mt(l),e!==e+0)throw e;Et(1,0)}},z:function(e,t,n,a,i,r,o,s,l,u,c,d){var h=Lt();try{return je(e)(t,n,a,i,r,o,s,l,u,c,d)}catch(e){if(Mt(h),e!==e+0)throw e;Et(1,0)}},P:function(e,t,n,a,i){var r=Lt();try{return jt(e,t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},l:function(e){var t=Lt();try{je(e)()}catch(e){if(Mt(t),e!==e+0)throw e;Et(1,0)}},j:function(e,t){var n=Lt();try{je(e)(t)}catch(e){if(Mt(n),e!==e+0)throw e;Et(1,0)}},c:function(e,t,n){var a=Lt();try{je(e)(t,n)}catch(e){if(Mt(a),e!==e+0)throw e;Et(1,0)}},p:function(e,t,n,a){var i=Lt();try{je(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},I:function(e,t,n,a,i){var r=Lt();try{je(e)(t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},r:function(e,t,n,a,i,r,o,s){var l=Lt();try{je(e)(t,n,a,i,r,o,s)}catch(e){if(Mt(l),e!==e+0)throw e;Et(1,0)}},i:function(e,t,n,a,i,r,o,s,l,u,c){var d=Lt();try{je(e)(t,n,a,i,r,o,s,l,u,c)}catch(e){if(Mt(d),e!==e+0)throw e;Et(1,0)}},y:function(e,t,n,a,i,r,o,s,l,u,c,d,h,p,f,m){var _=Lt();try{je(e)(t,n,a,i,r,o,s,l,u,c,d,h,p,f,m)}catch(e){if(Mt(_),e!==e+0)throw e;Et(1,0)}},ga:e=>e,S:(e,t,n,a,i)=>kt(e,t,n,a)},St=function(){var e={a:xt};function t(e,t){return St=e.exports,h=St.ia,k(),ze=St.ma,function(e){S.unshift(e)}(St.ja),function(){var e;if(E--,null===(e=a.monitorRunDependencies)||void 0===e||e.call(a,E),0==E&&A){var t=A;A=null,t()}}(),St}if(function(){var e;E++,null===(e=a.monitorRunDependencies)||void 0===e||e.call(a,E)}(),a.instantiateWasm)try{return a.instantiateWasm(e,t)}catch(e){d(`Module.instantiateWasm callback failed with error: ${e}`),n(e)}return function(e,t,n,a){return e||"function"!=typeof WebAssembly.instantiateStreaming||z(t)||"function"!=typeof fetch?O(t,n,a):fetch(t,{credentials:"same-origin"}).then(e=>WebAssembly.instantiateStreaming(e,n).then(a,function(e){return d(`wasm streaming compile failed: ${e}`),d("falling back to ArrayBuffer instantiation"),O(t,n,a)}))}(c,M,e,function(e){t(e.instance)}).catch(n),{}}(),Ct=a._free=e=>(Ct=a._free=St.ka)(e),Tt=a._malloc=e=>(Tt=a._malloc=St.la)(e),Pt=e=>(Pt=St.na)(e),Et=(e,t)=>(Et=St.oa)(e,t),At=e=>(At=St.pa)(e),Lt=()=>(Lt=St.qa)(),Mt=e=>(Mt=St.ra)(e),Rt=e=>(Rt=St.sa)(e),zt=e=>(zt=St.ta)(e),It=(e,t,n)=>(It=St.ua)(e,t,n),Nt=e=>(Nt=St.va)(e);a.dynCall_viijii=(e,t,n,i,r,o,s)=>(a.dynCall_viijii=St.wa)(e,t,n,i,r,o,s);var Ot,jt=a.dynCall_jiiii=(e,t,n,i,r)=>(jt=a.dynCall_jiiii=St.xa)(e,t,n,i,r);function Dt(){function e(){Ot||(Ot=!0,a.calledRun=!0,!w&&(j(S),t(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),function(){if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)P(a.postRun.shift());j(C)}()))}E>0||(function(){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)T(a.preRun.shift());j(x)}(),E>0)||(a.setStatus?(a.setStatus("Running..."),setTimeout(function(){setTimeout(function(){a.setStatus("")},1),e()},1)):e())}if(a.dynCall_iiiiij=(e,t,n,i,r,o,s)=>(a.dynCall_iiiiij=St.ya)(e,t,n,i,r,o,s),a.dynCall_iiiiijj=(e,t,n,i,r,o,s,l,u)=>(a.dynCall_iiiiijj=St.za)(e,t,n,i,r,o,s,l,u),a.dynCall_iiiiiijj=(e,t,n,i,r,o,s,l,u,c)=>(a.dynCall_iiiiiijj=St.Aa)(e,t,n,i,r,o,s,l,u,c),A=function e(){Ot||Dt(),Ot||(A=e)},a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();return Dt(),e.ready});async function D(e,t){return async function(e,t,n=A){const a={...A,...n},i=await I(e),{size:r}=t,o=new Uint8Array(await t.arrayBuffer()),s=i._malloc(r);i.HEAPU8.set(o,s);const l=i.readBarcodesFromImage(s,r,L(i,a));i._free(s);const u=[];for(let e=0;e{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)})(this,O,void 0);try{const a=null==(t=null==e?void 0:e.formats)?void 0:t.filter(e=>"unknown"!==e);if(0===(null==a?void 0:a.length))throw new TypeError("Hint option provided, but is empty.");null==a||a.forEach(e=>{if(!o.has(e))throw new TypeError(`Failed to read the 'formats' property from 'BarcodeDetectorOptions': The provided value '${e}' is not a valid enum value of type BarcodeFormat.`)}),((e,t,a)=>{n(e,t,"write to private field"),t.set(e,a)})(this,O,null!=a?a:[]),function(e){return I(j,e)}().then(e=>{this.dispatchEvent(new CustomEvent("load",{detail:e}))}).catch(e=>{this.dispatchEvent(new CustomEvent("error",{detail:e}))})}catch(e){throw v(e,"Failed to construct 'BarcodeDetector'")}}static async getSupportedFormats(){return r.filter(e=>"unknown"!==e)}async detect(e){try{const t=await g(e);if(null===t)return[];let n;try{n=m(t)?await D(t,{tryHarder:!0,formats:a(this,O).map(e=>o.get(e))}):await q(t,{tryHarder:!0,formats:a(this,O).map(e=>o.get(e))})}catch(e){throw console.error(e),new DOMException("Barcode detection service unavailable.","NotSupportedError")}return n.map(e=>{const{topLeft:{x:t,y:n},topRight:{x:a,y:i},bottomLeft:{x:r,y:o},bottomRight:{x:l,y:u}}=e.position,c=Math.min(t,a,r,l),d=Math.min(n,i,o,u),h=Math.max(t,a,r,l),p=Math.max(n,i,o,u);return{boundingBox:new DOMRectReadOnly(c,d,h-c,p-d),rawValue:e.text,format:s(e.format),cornerPoints:[{x:t,y:n},{x:a,y:i},{x:l,y:u},{x:r,y:o}]}})}catch(e){throw v(e,"Failed to execute 'detect' on 'BarcodeDetector'")}}}O=new WeakMap;const F=(e,t,n="error")=>{let a,i;const r=new Promise((r,o)=>{a=r,i=o,e.addEventListener(t,a),e.addEventListener(n,i)});return r.finally(()=>{e.removeEventListener(t,a),e.removeEventListener(n,i)}),r},V=e=>new Promise(t=>setTimeout(t,e));class U extends Error{constructor(){super("can't process cross-origin image"),this.name="DropImageFetchError"}}class $ extends Error{constructor(){super("this browser has no Stream API support"),this.name="StreamApiNotSupportedError"}}class H extends Error{constructor(){super("camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP."),this.name="InsecureContextError"}}class W extends Error{constructor(){super("Loading camera stream timed out after 6 seconds. If you are on iOS in PWA mode, this is a known issue (see https://github.com/gruhn/vue-qrcode-reader/issues/298)"),this.name="StreamLoadTimeoutError"}}let G;function K(e){G=new B({formats:e})}const Y=async(e,t=["qr_code"])=>await new B({formats:t}).detect(e),Q=async(e,t=["qr_code"])=>{const n=new B({formats:t}),a=await(async e=>{if(e.startsWith("http")&&!1===e.includes(location.host))throw new U;const t=document.createElement("img");return t.src=e,await F(t,"load"),t})(e);return await n.detect(a)};var Z={},J={};Object.defineProperty(J,"__esModule",{value:!0}),J.compactObject=function e(t){return ie(t)?Object.keys(t).reduce(function(n,a){var i=ie(t[a]),r=i?e(t[a]):t[a],o=i&&!Object.keys(r).length;return void 0===r||o?n:Object.assign(n,function(e,t,n){return t=function(e){var t=function(e,t){if("object"!==ee(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t);if("object"!==ee(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ee(t)?t:String(t)}(t),t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},a,r))},{}):t},J.deprecated=function(e,t){ne&&console.warn(e+" is deprecated, please use "+t+" instead.")};var X=J.detectBrowser=function(e){var t={browser:null,version:null};if(typeof e>"u"||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;var n=e.navigator;if(n.mozGetUserMedia)t.browser="firefox",t.version=ae(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=ae(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=ae(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t};function ee(e){return(ee="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)}J.disableLog=function(e){return"boolean"!=typeof e?new Error("Argument type: "+ee(e)+". Please use a boolean."):(te=e,e?"adapter.js logging disabled":"adapter.js logging enabled")},J.disableWarnings=function(e){return"boolean"!=typeof e?new Error("Argument type: "+ee(e)+". Please use a boolean."):(ne=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))},J.extractVersion=ae,J.filterStats=function(e,t,n){var a=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;var r=[];return e.forEach(function(e){"track"===e.type&&e.trackIdentifier===t.id&&r.push(e)}),r.forEach(function(t){e.forEach(function(n){n.type===a&&n.trackId===t.id&&re(e,n,i)})}),i},J.log=function(){if("object"===(typeof window>"u"?"undefined":ee(window))){if(te)return;typeof console<"u"&&"function"==typeof console.log&&console.log.apply(console,arguments)}},J.walkStats=re,J.wrapPeerConnectionEvent=function(e,t,n){if(e.RTCPeerConnection){var a=e.RTCPeerConnection.prototype,i=a.addEventListener;a.addEventListener=function(e,a){if(e!==t)return i.apply(this,arguments);var r=function(e){var t=n(e);t&&(a.handleEvent?a.handleEvent(t):a(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(a,r),i.apply(this,[e,r])};var r=a.removeEventListener;a.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return r.apply(this,arguments);if(!this._eventMap[t].has(n))return r.apply(this,arguments);var a=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,r.apply(this,[e,a])},Object.defineProperty(a,"on"+t,{get:function(){return this["_on"+t]},set:function(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}};var te=!0,ne=!0;function ae(e,t,n){var a=e.match(t);return a&&a.length>=n&&parseInt(a[n],10)}function ie(e){return"[object Object]"===Object.prototype.toString.call(e)}function re(e,t,n){!t||n.has(t.id)||(n.set(t.id,t),Object.keys(t).forEach(function(a){a.endsWith("Id")?re(e,e.get(t[a]),n):a.endsWith("Ids")&&t[a].forEach(function(t){re(e,e.get(t),n)})}))}Object.defineProperty(Z,"__esModule",{value:!0});var oe=Z.shimGetUserMedia=function(e,t){var n=e&&e.navigator;if(n.mediaDevices){var a=function(e){if("object"!==ue(e)||e.mandatory||e.optional)return e;var t={};return Object.keys(e).forEach(function(n){if("require"!==n&&"advanced"!==n&&"mediaSource"!==n){var a="object"===ue(e[n])?e[n]:{ideal:e[n]};void 0!==a.exact&&"number"==typeof a.exact&&(a.min=a.max=a.exact);var i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==a.ideal){t.optional=t.optional||[];var r={};"number"==typeof a.ideal?(r[i("min",n)]=a.ideal,t.optional.push(r),(r={})[i("max",n)]=a.ideal,t.optional.push(r)):(r[i("",n)]=a.ideal,t.optional.push(r))}void 0!==a.exact&&"number"!=typeof a.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=a.exact):["min","max"].forEach(function(e){void 0!==a[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=a[e])})}}),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"===ue(e.audio)){var r=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])};r((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),r(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=a(e.audio)}if(e&&"object"===ue(e.video)){var o=e.video.facingMode;o=o&&("object"===ue(o)?o:{ideal:o});var s,l=t.version<66;if(o&&("user"===o.exact||"environment"===o.exact||"user"===o.ideal||"environment"===o.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.mediaDevices.getSupportedConstraints().facingMode||l))if(delete e.video.facingMode,"environment"===o.exact||"environment"===o.ideal?s=["back","rear"]:("user"===o.exact||"user"===o.ideal)&&(s=["front"]),s)return n.mediaDevices.enumerateDevices().then(function(t){var n=(t=t.filter(function(e){return"videoinput"===e.kind})).find(function(e){return s.some(function(t){return e.label.toLowerCase().includes(t)})});return!n&&t.length&&s.includes("back")&&(n=t[t.length-1]),n&&(e.video.deviceId=o.exact?{exact:n.deviceId}:{ideal:n.deviceId}),e.video=a(e.video),ce("chrome: "+JSON.stringify(e)),i(e)});e.video=a(e.video)}return ce("chrome: "+JSON.stringify(e)),i(e)},r=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}};if(n.getUserMedia=function(e,t,a){i(e,function(e){n.webkitGetUserMedia(e,t,function(e){a&&a(r(e))})})}.bind(n),n.mediaDevices.getUserMedia){var o=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(e){return i(e,function(e){return o(e).then(function(t){if(e.audio&&!t.getAudioTracks().length||e.video&&!t.getVideoTracks().length)throw t.getTracks().forEach(function(e){e.stop()}),new DOMException("","NotFoundError");return t},function(e){return Promise.reject(r(e))})})}}}},se=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==ue(e)&&"function"!=typeof e)return{default:e};var n=le(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if("default"!==r&&Object.prototype.hasOwnProperty.call(e,r)){var o=i?Object.getOwnPropertyDescriptor(e,r):null;o&&(o.get||o.set)?Object.defineProperty(a,r,o):a[r]=e[r]}return a.default=e,n&&n.set(e,a),a}(J);function le(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(le=function(e){return e?n:t})(e)}function ue(e){return(ue="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)}var ce=se.log;var de={};Object.defineProperty(de,"__esModule",{value:!0});var he=de.shimGetUserMedia=function(e,t){var n=e&&e.navigator,a=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,a){pe.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,a)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){var i=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},r=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(e){return"object"===me(e)&&"object"===me(e.audio)&&(e=JSON.parse(JSON.stringify(e)),i(e.audio,"autoGainControl","mozAutoGainControl"),i(e.audio,"noiseSuppression","mozNoiseSuppression")),r(e)},a&&a.prototype.getSettings){var o=a.prototype.getSettings;a.prototype.getSettings=function(){var e=o.apply(this,arguments);return i(e,"mozAutoGainControl","autoGainControl"),i(e,"mozNoiseSuppression","noiseSuppression"),e}}if(a&&a.prototype.applyConstraints){var s=a.prototype.applyConstraints;a.prototype.applyConstraints=function(e){return"audio"===this.kind&&"object"===me(e)&&(e=JSON.parse(JSON.stringify(e)),i(e,"autoGainControl","mozAutoGainControl"),i(e,"noiseSuppression","mozNoiseSuppression")),s.apply(this,[e])}}}},pe=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==me(e)&&"function"!=typeof e)return{default:e};var n=fe(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if("default"!==r&&Object.prototype.hasOwnProperty.call(e,r)){var o=i?Object.getOwnPropertyDescriptor(e,r):null;o&&(o.get||o.set)?Object.defineProperty(a,r,o):a[r]=e[r]}return a.default=e,n&&n.set(e,a),a}(J);function fe(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(fe=function(e){return e?n:t})(e)}function me(e){return(me="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)}var _e={};Object.defineProperty(_e,"__esModule",{value:!0}),_e.shimAudioContext=function(e){"object"!==ye(e)||e.AudioContext||(e.AudioContext=e.webkitAudioContext)},_e.shimCallbacksAPI=function(e){if("object"===ye(e)&&e.RTCPeerConnection){var t=e.RTCPeerConnection.prototype,n=t.createOffer,a=t.createAnswer,i=t.setLocalDescription,r=t.setRemoteDescription,o=t.addIceCandidate;t.createOffer=function(e,t){var a=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[a]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){var n=arguments.length>=2?arguments[2]:arguments[0],i=a.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};var s=function(e,t,n){var a=i.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a};t.setLocalDescription=s,s=function(e,t,n){var a=r.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a},t.setRemoteDescription=s,s=function(e,t,n){var a=o.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a},t.addIceCandidate=s}},_e.shimConstraints=we,_e.shimCreateOfferLegacy=function(e){var t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){typeof e.offerToReceiveAudio<"u"&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);var n=this.getTransceivers().find(function(e){return"audio"===e.receiver.track.kind});!1===e.offerToReceiveAudio&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0===e.offerToReceiveAudio&&!n&&this.addTransceiver("audio",{direction:"recvonly"}),typeof e.offerToReceiveVideo<"u"&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);var a=this.getTransceivers().find(function(e){return"video"===e.receiver.track.kind});!1===e.offerToReceiveVideo&&a?"sendrecv"===a.direction?a.setDirection?a.setDirection("sendonly"):a.direction="sendonly":"recvonly"===a.direction&&(a.setDirection?a.setDirection("inactive"):a.direction="inactive"):!0===e.offerToReceiveVideo&&!a&&this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}};var ge=_e.shimGetUserMedia=function(e){var t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){var n=t.mediaDevices,a=n.getUserMedia.bind(n);t.mediaDevices.getUserMedia=function(e){return a(we(e))}}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,a){t.mediaDevices.getUserMedia(e).then(n,a)}.bind(t))};_e.shimLocalStreamsAPI=function(e){if("object"===ye(e)&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){var t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){var n=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach(function(a){return t.call(n,a,e)}),e.getVideoTracks().forEach(function(a){return t.call(n,a,e)})},e.RTCPeerConnection.prototype.addTrack=function(e){for(var n=this,a=arguments.length,i=new Array(a>1?a-1:0),r=1;r=0)){e._remoteStreams.push(t);var n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}})}),t.apply(e,arguments)}}},_e.shimTrackEventTransceiver=function(e){"object"===ye(e)&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})};var ve=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==ye(e)&&"function"!=typeof e)return{default:e};var n=be(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if("default"!==r&&Object.prototype.hasOwnProperty.call(e,r)){var o=i?Object.getOwnPropertyDescriptor(e,r):null;o&&(o.get||o.set)?Object.defineProperty(a,r,o):a[r]=e[r]}return a.default=e,n&&n.set(e,a),a}(J);function be(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(be=function(e){return e?n:t})(e)}function ye(e){return(ye="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 we(e){return e&&void 0!==e.video?Object.assign({},e,{video:ve.compactObject(e.video)}):e}function ke(e,t){if(!1===e)throw new Error(null!=t?t:"assertion failure")}function xe(e){throw new Error("this code should be unreachable")}const Se=(e=>{let t,n=!1;return(...a)=>(n||(t=e(a),n=!0),t)})(()=>{const e=X(window);switch(e.browser){case"chrome":oe(window,e);break;case"firefox":he(window,e);break;case"safari":ge(window,e);break;default:throw new $}});let Ce=Promise.resolve({type:"stop",data:{}});async function Te(e,t,n){var a,i,r;if(console.debug("[vue-qrcode-reader] starting camera with constraints: ",JSON.stringify(t)),!0!==window.isSecureContext)throw new H;if(void 0===(null==(a=null==navigator?void 0:navigator.mediaDevices)?void 0:a.getUserMedia))throw new $;Se(),console.debug("[vue-qrcode-reader] calling getUserMedia");const o=await navigator.mediaDevices.getUserMedia({audio:!1,video:t});void 0!==e.srcObject?e.srcObject=o:void 0!==e.mozSrcObject?e.mozSrcObject=o:window.URL.createObjectURL?e.src=window.URL.createObjectURL(o):window.webkitURL?e.src=window.webkitURL.createObjectURL(o):e.src=o.id,e.play(),console.debug("[vue-qrcode-reader] waiting for video element to load"),await Promise.race([F(e,"loadeddata"),V(6e3).then(()=>{throw new W})]),console.debug("[vue-qrcode-reader] video element loaded"),await V(500);const[s]=o.getVideoTracks(),l=null!=(r=null==(i=null==s?void 0:s.getCapabilities)?void 0:i.call(s))?r:{};let u=!1;return n&&l.torch&&(await s.applyConstraints({advanced:[{torch:!0}]}),u=!0),console.debug("[vue-qrcode-reader] camera ready"),{type:"start",data:{videoEl:e,stream:o,capabilities:l,constraints:t,isTorchOn:u}}}async function Pe(e,t,n){console.debug("[vue-qrcode-reader] stopping camera"),e.src="",e.srcObject=null,e.load(),await F(e,"error");for(const e of t.getTracks())null!=n||await e.applyConstraints({advanced:[{torch:!1}]}),t.removeTrack(e),e.stop();return{type:"stop",data:{}}}async function Ee(){if(Ce=Ce.then(e=>{if("stop"===e.type||"failed"===e.type)return e;const{data:{videoEl:t,stream:n,isTorchOn:a}}=e;return Pe(t,n,a)}),"start"===(await Ce).type)throw new Error("Something went wrong with the camera task queue (stop task).")}const Ae=t.defineComponent({__name:"QrcodeStream",props:{constraints:{default:()=>({facingMode:"environment"})},formats:{default:()=>["qr_code"]},paused:{type:Boolean,default:!1},torch:{type:Boolean,default:!1},track:{type:Function,default:void 0}},emits:["detect","camera-on","camera-off","error"],setup(e,{emit:n}){const a=e,i=n,r=t.ref(a.constraints),o=t.ref(a.formats);t.watch(()=>a.constraints,(e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&(r.value=e)},{deep:!0}),t.watch(()=>a.formats,(e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&(o.value=e)},{deep:!0});const s=t.ref(),l=t.ref(),u=t.ref(),c=t.ref(!1),d=t.ref(!1);t.onMounted(()=>{d.value=!0}),t.onUnmounted(()=>{Ee()});const h=t.computed(()=>({torch:a.torch,constraints:r.value,shouldStream:d.value&&!a.paused}));t.watch(h,async e=>{const t=u.value;ke(void 0!==t,"cameraSettings watcher should never be triggered when component is not mounted. Thus video element should always be defined.");const n=s.value;ke(void 0!==n,"cameraSettings watcher should never be triggered when component is not mounted. Thus canvas should always be defined.");const a=n.getContext("2d");if(ke(null!==a,"if cavnas is defined, canvas 2d context should also be non-null"),e.shouldStream){Ee(),c.value=!1;try{const n=await async function(e,{constraints:t,torch:n,restart:a=!1}){Ce=Ce.then(i=>{if("start"===i.type){const{data:{videoEl:r,stream:o,constraints:s,isTorchOn:l}}=i;return a||e!==r||t!==s||n!==l?Pe(r,o,l).then(()=>Te(e,t,n)):i}if("stop"===i.type||"failed"===i.type)return Te(e,t,n);xe()}).catch(e=>(console.debug(`[vue-qrcode-reader] starting camera failed with "${e}"`),{type:"failed",error:e}));const i=await Ce;if("stop"===i.type)throw new Error("Something went wrong with the camera task queue (start task).");if("failed"===i.type)throw i.error;if("start"===i.type)return i.data.capabilities;xe()}(t,e);d.value?(c.value=!0,i("camera-on",n)):await Ee()}catch(e){i("error",e)}}else n.width=t.videoWidth,n.height=t.videoHeight,a.drawImage(t,0,0,t.videoWidth,t.videoHeight),Ee(),c.value=!1,i("camera-off")},{deep:!0}),t.watch(o,e=>{d.value&&K(e)});const p=t.computed(()=>h.value.shouldStream&&c.value);t.watch(p,e=>{if(e){ke(void 0!==s.value,"shouldScan watcher should only be triggered when component is mounted. Thus pause frame canvas is defined"),f(s.value),ke(void 0!==l.value,"shouldScan watcher should only be triggered when component is mounted. Thus tracking canvas is defined"),f(l.value);const e=()=>void 0===a.track?500:40;ke(void 0!==u.value,"shouldScan watcher should only be triggered when component is mounted. Thus video element is defined"),(async(e,{detectHandler:t,locateHandler:n,minDelay:a,formats:i})=>{console.debug("[vue-qrcode-reader] start scanning"),K(i);const r=i=>async o=>{if(0===e.readyState)console.debug("[vue-qrcode-reader] stop scanning: video element readyState is 0");else{const{lastScanned:s,contentBefore:l,lastScanHadContent:u}=i;if(o-s!l.includes(e.rawValue));i&&t(a);const s=a.length>0;s&&n(a),!s&&u&&n(a);const c={lastScanned:o,lastScanHadContent:s,contentBefore:i?a.map(e=>e.rawValue):l};window.requestAnimationFrame(r(c))}}};r({lastScanned:performance.now(),contentBefore:[],lastScanHadContent:!1})(performance.now())})(u.value,{detectHandler:e=>i("detect",e),formats:o.value,locateHandler:m,minDelay:e()})}});const f=e=>{const t=e.getContext("2d");ke(null!==t,"canvas 2d context should always be non-null"),t.clearRect(0,0,e.width,e.height)},m=e=>{const t=l.value;ke(void 0!==t,"onLocate handler should only be called when component is mounted. Thus tracking canvas is always defined.");const n=u.value;if(ke(void 0!==n,"onLocate handler should only be called when component is mounted. Thus video element is always defined."),0===e.length||void 0===a.track)f(t);else{const i=n.offsetWidth,r=n.offsetHeight,o=n.videoWidth,s=n.videoHeight,l=Math.max(i/o,r/s),u=o*l,c=s*l,d=u/o,h=c/s,p=(i-u)/2,f=(r-c)/2,m=({x:e,y:t})=>({x:Math.floor(e*d),y:Math.floor(t*h)}),_=({x:e,y:t})=>({x:Math.floor(e+p),y:Math.floor(t+f)}),g=e.map(e=>{const{boundingBox:t,cornerPoints:n}=e,{x:a,y:i}=_(m({x:t.x,y:t.y})),{x:r,y:o}=m({x:t.width,y:t.height});return{...e,cornerPoints:n.map(e=>_(m(e))),boundingBox:DOMRectReadOnly.fromRect({x:a,y:i,width:r,height:o})}});t.width=n.offsetWidth,t.height=n.offsetHeight;const v=t.getContext("2d");ke(null!==v,"canvas 2d context should always be non-null"),a.track(g,v)}},_={width:"100%",height:"100%",position:"relative","z-index":"0"},g={width:"100%",height:"100%",position:"absolute",top:"0",left:"0"},v={width:"100%",height:"100%","object-fit":"cover"},b=t.computed(()=>p.value?v:{...v,visibility:"hidden",position:"absolute"});return(e,n)=>(t.openBlock(),t.createElementBlock("div",{style:_},[t.createElementVNode("video",{ref_key:"videoRef",ref:u,style:t.normalizeStyle(b.value),autoplay:"",muted:"",playsinline:""},null,4),t.withDirectives(t.createElementVNode("canvas",{id:"qrcode-stream-pause-frame",ref_key:"pauseFrameRef",ref:s,style:v},null,512),[[t.vShow,!p.value]]),t.createElementVNode("canvas",{id:"qrcode-stream-tracking-layer",ref_key:"trackingLayerRef",ref:l,style:g},null,512),t.createElementVNode("div",{style:g},[t.renderSlot(e.$slots,"default")])]))}}),Le=t.defineComponent({__name:"QrcodeCapture",props:{formats:{default:()=>["qr_code"]}},emits:["detect"],setup(e,{emit:n}){const a=e,i=n,r=e=>{if(e.target instanceof HTMLInputElement&&e.target.files)for(const t of Array.from(e.target.files))Y(t,a.formats).then(e=>{i("detect",e)})};return(e,n)=>(t.openBlock(),t.createElementBlock("input",{onChange:r,type:"file",name:"image",accept:"image/*",capture:"environment",multiple:""},null,32))}}),Me=t.defineComponent({__name:"QrcodeDropZone",props:{formats:{default:()=>["qr_code"]}},emits:["detect","dragover","error"],setup(e,{emit:n}){const a=e,i=n,r=async e=>{try{const t=await e;i("detect",t)}catch(e){i("error",e)}},o=e=>{i("dragover",e)},s=({dataTransfer:e})=>{if(!e)return;o(!1);const t=[...Array.from(e.files)],n=e.getData("text/uri-list");t.forEach(e=>{r(Y(e,a.formats))}),""!==n&&r(Q(n,a.formats))};return(e,n)=>(t.openBlock(),t.createElementBlock("div",{onDrop:t.withModifiers(s,["prevent","stop"]),onDragenter:n[0]||(n[0]=t.withModifiers(e=>o(!0),["prevent","stop"])),onDragleave:n[1]||(n[1]=t.withModifiers(e=>o(!1),["prevent","stop"])),onDragover:n[2]||(n[2]=t.withModifiers(()=>{},["prevent","stop"]))},[t.renderSlot(e.$slots,"default")],32))}});function Re(e){e.component("qrcode-stream",Ae),e.component("qrcode-capture",Le),e.component("qrcode-drop-zone",Me)}const ze={install:Re};e.QrcodeCapture=Le,e.QrcodeDropZone=Me,e.QrcodeStream=Ae,e.VueQrcodeReader=ze,e.install=Re,e.setZXingModuleOverrides=function(e){return function(e,t){z.set(e,{moduleOverrides:t})}(j,e)},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}), + */!function(e,t){"object"==typeof exports&&typeof module<"u"?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e=typeof globalThis<"u"?globalThis:e||self).VueQrcodeReader={},e.Vue)}(this,function(e,t){"use strict";var n=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)},a=(e,t,a)=>(n(e,t,"read from private field"),a?a.call(e):t.get(e));const i=[["aztec","Aztec"],["code_128","Code128"],["code_39","Code39"],["code_93","Code93"],["codabar","Codabar"],["databar","DataBar"],["databar_expanded","DataBarExpanded"],["data_matrix","DataMatrix"],["dx_film_edge","DXFilmEdge"],["ean_13","EAN-13"],["ean_8","EAN-8"],["itf","ITF"],["maxi_code","MaxiCode"],["micro_qr_code","MicroQRCode"],["pdf417","PDF417"],["qr_code","QRCode"],["rm_qr_code","rMQRCode"],["upc_a","UPC-A"],["upc_e","UPC-E"],["linear_codes","Linear-Codes"],["matrix_codes","Matrix-Codes"]],o=[...i,["unknown"]].map(e=>e[0]),r=new Map(i);function s(e){for(const[t,n]of r)if(e===n)return t;return"unknown"}function l(e){try{return e instanceof HTMLImageElement}catch(e){return!1}}function u(e){try{return e instanceof SVGImageElement}catch(e){return!1}}function c(e){try{return e instanceof HTMLVideoElement}catch(e){return!1}}function d(e){try{return e instanceof HTMLCanvasElement}catch(e){return!1}}function h(e){try{return e instanceof ImageBitmap}catch(e){return!1}}function p(e){try{return e instanceof OffscreenCanvas}catch(e){return!1}}function f(e){try{return e instanceof VideoFrame}catch(e){return!1}}function m(e){try{return e instanceof Blob}catch(e){return!1}}async function _(e){if(l(e)&&!await async function(e){try{return await e.decode(),!0}catch(e){return!1}}(e))throw new DOMException("Failed to load or decode HTMLImageElement.","InvalidStateError");if(u(e)&&!await async function(e){var t;try{return await(null==(t=e.decode)?void 0:t.call(e)),!0}catch(e){return!1}}(e))throw new DOMException("Failed to load or decode SVGImageElement.","InvalidStateError");if(f(e)&&function(e){return null===e.format}(e))throw new DOMException("VideoFrame is closed.","InvalidStateError");if(c(e)&&(0===e.readyState||1===e.readyState))throw new DOMException("Invalid element or state.","InvalidStateError");if(h(e)&&function(e){return 0===e.width&&0===e.height}(e))throw new DOMException("The image source is detached.","InvalidStateError");const{width:t,height:n}=function(e){if(l(e))return{width:e.naturalWidth,height:e.naturalHeight};if(u(e))return{width:e.width.baseVal.value,height:e.height.baseVal.value};if(c(e))return{width:e.videoWidth,height:e.videoHeight};if(h(e))return{width:e.width,height:e.height};if(f(e))return{width:e.displayWidth,height:e.displayHeight};if(d(e))return{width:e.width,height:e.height};if(p(e))return{width:e.width,height:e.height};throw new TypeError("The provided value is not of type '(Blob or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or ImageData or OffscreenCanvas or SVGImageElement or VideoFrame)'.")}(e);if(0===t||0===n)return null;const a=function(e,t){try{const n=new OffscreenCanvas(e,t);if(n.getContext("2d")instanceof OffscreenCanvasRenderingContext2D)return n;throw void 0}catch(n){const a=document.createElement("canvas");return a.width=e,a.height=t,a}}(t,n).getContext("2d");a.drawImage(e,0,0);try{return a.getImageData(0,0,t,n)}catch(e){throw new DOMException("Source would taint origin.","SecurityError")}}async function g(e){if(m(e))return await async function(e){let t;try{if(globalThis.createImageBitmap)t=await createImageBitmap(e);else{if(!globalThis.Image)return e;{t=new Image;let n="";try{n=URL.createObjectURL(e),t.src=n,await t.decode()}finally{URL.revokeObjectURL(n)}}}}catch(e){throw new DOMException("Failed to load or decode Blob.","InvalidStateError")}return await _(t)}(e);if(function(e){try{return e instanceof ImageData}catch(e){return!1}}(e)){if(function(e){return 0===e.data.buffer.byteLength}(e))throw new DOMException("The image data has been detached.","InvalidStateError");return e}return d(e)||p(e)?function(e){const{width:t,height:n}=e;if(0===t||0===n)return null;const a=e.getContext("2d");try{return a.getImageData(0,0,t,n)}catch(e){throw new DOMException("Source would taint origin.","SecurityError")}}(e):await _(e)}function v(e,t){return e instanceof DOMException?new DOMException(`${t}: ${e.message}`,e.name):e instanceof Error?new e.constructor(`${t}: ${e.message}`):new Error(`${t}: ${e}`)}const b=["Aztec","Codabar","Code128","Code39","Code93","DataBar","DataBarExpanded","DataMatrix","DXFilmEdge","EAN-13","EAN-8","ITF","Linear-Codes","Matrix-Codes","MaxiCode","MicroQRCode","None","PDF417","QRCode","rMQRCode","UPC-A","UPC-E"];function y(e){return e.join("|")}function w(e){const t=k(e);let n=0,a=b.length-1;for(;n<=a;){const e=Math.floor((n+a)/2),i=b[e],o=k(i);if(o===t)return i;o{const n=e.match(/_(.+?)\.wasm$/);return n?`https://fastly.jsdelivr.net/npm/zxing-wasm@1.1.3/dist/${n[1]}/${e}`:t+e}};let z=new WeakMap;function O(e,t){var n;const a=z.get(e);if(null!=a&&a.modulePromise&&void 0===t)return a.modulePromise;const i=null!=(n=null==a?void 0:a.moduleOverrides)?n:R,o=e({...i});return z.set(e,{moduleOverrides:i,modulePromise:o}),o}var I,N,D=(I=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0,function(e={}){var t,n,a=e;a.ready=new Promise((e,a)=>{t=e,n=a});var i=Object.assign({},a),o="./this.program",r="object"==typeof window,s="function"==typeof importScripts;"object"==typeof process&&"object"==typeof process.versions&&process.versions.node;var l,u="";(r||s)&&(s?u=self.location.href:typeof document<"u"&&document.currentScript&&(u=document.currentScript.src),I&&(u=I),u=0!==u.indexOf("blob:")?u.substr(0,u.replace(/[?#].*/,"").lastIndexOf("/")+1):"",s&&(l=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)})),a.print||console.log.bind(console);var c,d=a.printErr||console.error.bind(console);Object.assign(a,i),i=null,a.arguments&&a.arguments,a.thisProgram&&(o=a.thisProgram),a.quit&&a.quit,a.wasmBinary&&(c=a.wasmBinary),"object"!=typeof WebAssembly&&L("no native wasm support detected");var h,p,f,m,_,g,v,b,y,w=!1;function k(){var e=h.buffer;a.HEAP8=p=new Int8Array(e),a.HEAP16=m=new Int16Array(e),a.HEAPU8=f=new Uint8Array(e),a.HEAPU16=_=new Uint16Array(e),a.HEAP32=g=new Int32Array(e),a.HEAPU32=v=new Uint32Array(e),a.HEAPF32=b=new Float32Array(e),a.HEAPF64=y=new Float64Array(e)}var x=[],S=[],C=[];function T(e){x.unshift(e)}function P(e){C.unshift(e)}var E=0,A=null;function L(e){var t;null===(t=a.onAbort)||void 0===t||t.call(a,e),d(e="Aborted("+e+")"),w=!0,e+=". Build with -sASSERTIONS for more info.";var i=new WebAssembly.RuntimeError(e);throw n(i),i}var M,R,z=e=>e.startsWith("data:application/octet-stream;base64,");function O(e){if(e==M&&c)return new Uint8Array(c);if(l)return l(e);throw"both async and sync fetching of the wasm failed"}function N(e,t,n){return function(e){return c||!r&&!s||"function"!=typeof fetch?Promise.resolve().then(()=>O(e)):fetch(e,{credentials:"same-origin"}).then(t=>{if(!t.ok)throw"failed to load wasm binary file at '"+e+"'";return t.arrayBuffer()}).catch(()=>O(e))}(e).then(e=>WebAssembly.instantiate(e,t)).then(e=>e).then(n,e=>{d(`failed to asynchronously prepare wasm: ${e}`),L(e)})}z(M="zxing_reader.wasm")||(R=M,M=a.locateFile?a.locateFile(R,u):u+R);var D=e=>{for(;e.length>0;)e.shift()(a)};a.noExitRuntime;var q=[],j=0,B=0;function F(e){this.excPtr=e,this.ptr=e-24,this.set_type=function(e){v[this.ptr+4>>2]=e},this.get_type=function(){return v[this.ptr+4>>2]},this.set_destructor=function(e){v[this.ptr+8>>2]=e},this.get_destructor=function(){return v[this.ptr+8>>2]},this.set_caught=function(e){e=e?1:0,p[this.ptr+12|0]=e},this.get_caught=function(){return 0!=p[this.ptr+12|0]},this.set_rethrown=function(e){e=e?1:0,p[this.ptr+13|0]=e},this.get_rethrown=function(){return 0!=p[this.ptr+13|0]},this.init=function(e,t){this.set_adjusted_ptr(0),this.set_type(e),this.set_destructor(t)},this.set_adjusted_ptr=function(e){v[this.ptr+16>>2]=e},this.get_adjusted_ptr=function(){return v[this.ptr+16>>2]},this.get_exception_ptr=function(){if(It(this.get_type()))return v[this.excPtr>>2];var e=this.get_adjusted_ptr();return 0!==e?e:this.excPtr}}var $=e=>{var t=B;if(!t)return At(0),0;var n=new F(t);n.set_adjusted_ptr(t);var a=n.get_type();if(!a)return At(0),t;for(var i in e){var o=e[i];if(0===o||o===a)break;var r=n.ptr+16;if(Ot(o,a,r))return At(o),t}return At(a),t},V={},U=e=>{for(;e.length;){var t=e.pop();e.pop()(t)}};function H(e){return this.fromWireType(g[e>>2])}var W,G,K,Y={},Q={},Z={},J=e=>{throw new W(e)},X=(e,t,n)=>{function a(t){var a=n(t);a.length!==e.length&&J("Mismatched type converter count");for(var i=0;i{Q.hasOwnProperty(e)?i[t]=Q[e]:(o.push(e),Y.hasOwnProperty(e)||(Y[e]=[]),Y[e].push(()=>{i[t]=Q[e],++r===o.length&&a(i)}))}),0===o.length&&a(i)},ee=e=>{for(var t="",n=e;f[n];)t+=G[f[n++]];return t},te=e=>{throw new K(e)};function ne(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!("argPackAdvance"in t))throw new TypeError("registerType registeredInstance requires argPackAdvance");return function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};var a=t.name;if(e||te(`type "${a}" must have a positive integer typeid pointer`),Q.hasOwnProperty(e)){if(n.ignoreDuplicateRegistrations)return;te(`Cannot register type '${a}' twice`)}if(Q[e]=t,delete Z[e],Y.hasOwnProperty(e)){var i=Y[e];delete Y[e],i.forEach(e=>e())}}(e,t,n)}var ae,ie=8,oe=e=>({count:e.count,deleteScheduled:e.deleteScheduled,preservePointerOnDelete:e.preservePointerOnDelete,ptr:e.ptr,ptrType:e.ptrType,smartPtr:e.smartPtr,smartPtrType:e.smartPtrType}),re=e=>{te(e.$$.ptrType.registeredClass.name+" instance already deleted")},se=!1,le=e=>{},ue=e=>{e.count.value-=1,0===e.count.value&&(e=>{e.smartPtr?e.smartPtrType.rawDestructor(e.smartPtr):e.ptrType.registeredClass.rawDestructor(e.ptr)})(e)},ce=(e,t,n)=>{if(t===n)return e;if(void 0===n.baseClass)return null;var a=ce(e,t,n.baseClass);return null===a?null:n.downcast(a)},de={},he=()=>Object.keys(ge).length,pe=()=>{var e=[];for(var t in ge)ge.hasOwnProperty(t)&&e.push(ge[t]);return e},fe=[],me=()=>{for(;fe.length;){var e=fe.pop();e.$$.deleteScheduled=!1,e.delete()}},_e=e=>{ae=e,fe.length&&ae&&ae(me)},ge={},ve=(e,t)=>(t=((e,t)=>{for(void 0===t&&te("ptr should not be undefined");e.baseClass;)t=e.upcast(t),e=e.baseClass;return t})(e,t),ge[t]),be=(e,t)=>((!t.ptrType||!t.ptr)&&J("makeClassHandle requires ptr and ptrType"),!!t.smartPtrType!=!!t.smartPtr&&J("Both smartPtrType and smartPtr must be specified"),t.count={value:1},we(Object.create(e,{$$:{value:t,writable:!0}})));function ye(e){var t=this.getPointee(e);if(!t)return this.destructor(e),null;var n=ve(this.registeredClass,t);if(void 0!==n){if(0===n.$$.count.value)return n.$$.ptr=t,n.$$.smartPtr=e,n.clone();var a=n.clone();return this.destructor(e),a}function i(){return this.isSmartPointer?be(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:t,smartPtrType:this,smartPtr:e}):be(this.registeredClass.instancePrototype,{ptrType:this,ptr:e})}var o,r=this.registeredClass.getActualType(t),s=de[r];if(!s)return i.call(this);o=this.isConst?s.constPointerType:s.pointerType;var l=ce(t,this.registeredClass,o.registeredClass);return null===l?i.call(this):this.isSmartPointer?be(o.registeredClass.instancePrototype,{ptrType:o,ptr:l,smartPtrType:this,smartPtr:e}):be(o.registeredClass.instancePrototype,{ptrType:o,ptr:l})}var we=e=>typeof FinalizationRegistry>"u"?(we=e=>e,e):(se=new FinalizationRegistry(e=>{ue(e.$$)}),le=e=>se.unregister(e),(we=e=>{var t=e.$$;if(t.smartPtr){var n={$$:t};se.register(e,n,e)}return e})(e));function ke(){}var xe=(e,t)=>Object.defineProperty(t,"name",{value:e}),Se=(e,t,n)=>{if(void 0===e[t].overloadTable){var a=e[t];e[t]=function(){return e[t].overloadTable.hasOwnProperty(arguments.length)||te(`Function '${n}' called with an invalid number of arguments (${arguments.length}) - expects one of (${e[t].overloadTable})!`),e[t].overloadTable[arguments.length].apply(this,arguments)},e[t].overloadTable=[],e[t].overloadTable[a.argCount]=a}},Ce=(e,t,n)=>{a.hasOwnProperty(e)?((void 0===n||void 0!==a[e].overloadTable&&void 0!==a[e].overloadTable[n])&&te(`Cannot register public name '${e}' twice`),Se(a,e,e),a.hasOwnProperty(n)&&te(`Cannot register multiple overloads of a function with the same number of arguments (${n})!`),a[e].overloadTable[n]=t):(a[e]=t,void 0!==n&&(a[e].numArguments=n))};function Te(e,t,n,a,i,o,r,s){this.name=e,this.constructor=t,this.instancePrototype=n,this.rawDestructor=a,this.baseClass=i,this.getActualType=o,this.upcast=r,this.downcast=s,this.pureVirtualFunctions=[]}var Pe=(e,t,n)=>{for(;t!==n;)t.upcast||te(`Expected null or instance of ${n.name}, got an instance of ${t.name}`),e=t.upcast(e),t=t.baseClass;return e};function Ee(e,t){if(null===t)return this.isReference&&te(`null is not a valid ${this.name}`),0;t.$$||te(`Cannot pass "${Je(t)}" as a ${this.name}`),t.$$.ptr||te(`Cannot pass deleted object as a pointer of type ${this.name}`);var n=t.$$.ptrType.registeredClass;return Pe(t.$$.ptr,n,this.registeredClass)}function Ae(e,t){var n;if(null===t)return this.isReference&&te(`null is not a valid ${this.name}`),this.isSmartPointer?(n=this.rawConstructor(),null!==e&&e.push(this.rawDestructor,n),n):0;(!t||!t.$$)&&te(`Cannot pass "${Je(t)}" as a ${this.name}`),t.$$.ptr||te(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&t.$$.ptrType.isConst&&te(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);var a=t.$$.ptrType.registeredClass;if(n=Pe(t.$$.ptr,a,this.registeredClass),this.isSmartPointer)switch(void 0===t.$$.smartPtr&&te("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:t.$$.smartPtrType===this?n=t.$$.smartPtr:te(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:n=t.$$.smartPtr;break;case 2:if(t.$$.smartPtrType===this)n=t.$$.smartPtr;else{var i=t.clone();n=this.rawShare(n,Ye.toHandle(()=>i.delete())),null!==e&&e.push(this.rawDestructor,n)}break;default:te("Unsupporting sharing policy")}return n}function Le(e,t){if(null===t)return this.isReference&&te(`null is not a valid ${this.name}`),0;t.$$||te(`Cannot pass "${Je(t)}" as a ${this.name}`),t.$$.ptr||te(`Cannot pass deleted object as a pointer of type ${this.name}`),t.$$.ptrType.isConst&&te(`Cannot convert argument of type ${t.$$.ptrType.name} to parameter type ${this.name}`);var n=t.$$.ptrType.registeredClass;return Pe(t.$$.ptr,n,this.registeredClass)}function Me(e){return this.fromWireType(v[e>>2])}function Re(e,t,n,a,i,o,r,s,l,u,c){this.name=e,this.registeredClass=t,this.isReference=n,this.isConst=a,this.isSmartPointer=i,this.pointeeType=o,this.sharingPolicy=r,this.rawGetPointee=s,this.rawConstructor=l,this.rawShare=u,this.rawDestructor=c,i||void 0!==t.baseClass?this.toWireType=Ae:a?(this.toWireType=Ee,this.destructorFunction=null):(this.toWireType=Le,this.destructorFunction=null)}var ze,Oe,Ie=(e,t,n)=>{a.hasOwnProperty(e)||J("Replacing nonexistant public symbol"),void 0!==a[e].overloadTable&&void 0!==n?a[e].overloadTable[n]=t:(a[e]=t,a[e].argCount=n)},Ne=[],De=e=>{var t=Ne[e];return t||(e>=Ne.length&&(Ne.length=e+1),Ne[e]=t=ze.get(e)),t},qe=(e,t,n)=>e.includes("j")?((e,t,n)=>{var i=a["dynCall_"+e];return n&&n.length?i.apply(null,[t].concat(n)):i.call(null,t)})(e,t,n):De(t).apply(null,n),je=(e,t)=>{var n=(e=ee(e)).includes("j")?((e,t)=>{var n=[];return function(){return n.length=0,Object.assign(n,arguments),qe(e,t,n)}})(e,t):De(t);return"function"!=typeof n&&te(`unknown function pointer with signature ${e}: ${t}`),n},Be=e=>{var t=Pt(e),n=ee(t);return Ct(t),n},Fe=(e,t)=>{var n=[],a={};throw t.forEach(function e(t){if(!a[t]&&!Q[t]){if(Z[t])return void Z[t].forEach(e);n.push(t),a[t]=!0}}),new Oe(`${e}: `+n.map(Be).join([", "]))},$e=(e,t)=>{for(var n=[],a=0;a>2]);return n};function Ve(e,t,n,a,i,o){var r=t.length;r<2&&te("argTypes array size mismatch! Must at least get return value and 'this' types!");var s=null!==t[1]&&null!==n,l=function(e){for(var t=1;t{const t=(e=e.trim()).indexOf("(");return-1!==t?e.substr(0,t):e};function He(){this.allocated=[void 0],this.freelist=[]}var We=new He,Ge=e=>{e>=We.reserved&&0===--We.get(e).refcount&&We.free(e)},Ke=()=>{for(var e=0,t=We.reserved;t(e||te("Cannot use deleted val. handle = "+e),We.get(e).value),toHandle:e=>{switch(e){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:return We.allocate({refcount:1,value:e})}}},Qe=(e,t,n)=>{switch(t){case 1:return n?function(e){return this.fromWireType(p[0|e])}:function(e){return this.fromWireType(f[0|e])};case 2:return n?function(e){return this.fromWireType(m[e>>1])}:function(e){return this.fromWireType(_[e>>1])};case 4:return n?function(e){return this.fromWireType(g[e>>2])}:function(e){return this.fromWireType(v[e>>2])};default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},Ze=(e,t)=>{var n=Q[e];return void 0===n&&te(t+" has unknown type "+Be(e)),n},Je=e=>{if(null===e)return"null";var t=typeof e;return"object"===t||"array"===t||"function"===t?e.toString():""+e},Xe=(e,t)=>{switch(t){case 4:return function(e){return this.fromWireType(b[e>>2])};case 8:return function(e){return this.fromWireType(y[e>>3])};default:throw new TypeError(`invalid float width (${t}): ${e}`)}},et=(e,t,n)=>{switch(t){case 1:return n?e=>p[0|e]:e=>f[0|e];case 2:return n?e=>m[e>>1]:e=>_[e>>1];case 4:return n?e=>g[e>>2]:e=>v[e>>2];default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},tt=(e,t,n,a)=>{if(!(a>0))return 0;for(var i=n,o=n+a-1,r=0;r=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++r)),s<=127){if(n>=o)break;t[n++]=s}else if(s<=2047){if(n+1>=o)break;t[n++]=192|s>>6,t[n++]=128|63&s}else if(s<=65535){if(n+2>=o)break;t[n++]=224|s>>12,t[n++]=128|s>>6&63,t[n++]=128|63&s}else{if(n+3>=o)break;t[n++]=240|s>>18,t[n++]=128|s>>12&63,t[n++]=128|s>>6&63,t[n++]=128|63&s}}return t[n]=0,n-i},nt=e=>{for(var t=0,n=0;n=55296&&a<=57343?(t+=4,++n):t+=3}return t},at=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,it=(e,t)=>e?((e,t,n)=>{for(var a=t+n,i=t;e[i]&&!(i>=a);)++i;if(i-t>16&&e.buffer&&at)return at.decode(e.subarray(t,i));for(var o="";t>10,56320|1023&u)}}else o+=String.fromCharCode((31&r)<<6|s)}else o+=String.fromCharCode(r)}return o})(f,e,t):"",ot=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,rt=(e,t)=>{for(var n=e,a=n>>1,i=a+t/2;!(a>=i)&&_[a];)++a;if((n=a<<1)-e>32&&ot)return ot.decode(f.subarray(e,n));for(var o="",r=0;!(r>=t/2);++r){var s=m[e+2*r>>1];if(0==s)break;o+=String.fromCharCode(s)}return o},st=(e,t,n)=>{var a;if(null!==(a=n)&&void 0!==a||(n=2147483647),n<2)return 0;for(var i=t,o=(n-=2)<2*e.length?n/2:e.length,r=0;r>1]=s,t+=2}return m[t>>1]=0,t-i},lt=e=>2*e.length,ut=(e,t)=>{for(var n=0,a="";!(n>=t/4);){var i=g[e+4*n>>2];if(0==i)break;if(++n,i>=65536){var o=i-65536;a+=String.fromCharCode(55296|o>>10,56320|1023&o)}else a+=String.fromCharCode(i)}return a},ct=(e,t,n)=>{var a;if(null!==(a=n)&&void 0!==a||(n=2147483647),n<4)return 0;for(var i=t,o=i+n-4,r=0;r=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++r)),g[t>>2]=s,(t+=4)+4>o)break}return g[t>>2]=0,t-i},dt=e=>{for(var t=0,n=0;n=55296&&a<=57343&&++n,t+=4}return t},ht=[],pt={},ft=()=>{if("object"==typeof globalThis)return globalThis;function e(e){e.$$$embind_global$$$=e;var t="object"==typeof $$$embind_global$$$&&e.$$$embind_global$$$==e;return t||delete e.$$$embind_global$$$,t}if("object"==typeof $$$embind_global$$$||("object"==typeof global&&e(global)?$$$embind_global$$$=global:"object"==typeof self&&e(self)&&($$$embind_global$$$=self),"object"==typeof $$$embind_global$$$))return $$$embind_global$$$;throw Error("unable to get global object.")},mt=Reflect.construct,_t=e=>{var t=(e-h.buffer.byteLength+65535)/65536;try{return h.grow(t),k(),1}catch(e){}},gt={},vt=()=>{if(!vt.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:o||"./this.program"};for(var t in gt)void 0===gt[t]?delete e[t]:e[t]=gt[t];var n=[];for(var t in e)n.push(`${t}=${e[t]}`);vt.strings=n}return vt.strings},bt=e=>e%4==0&&(e%100!=0||e%400==0),yt=[31,29,31,30,31,30,31,31,30,31,30,31],wt=[31,28,31,30,31,30,31,31,30,31,30,31],kt=(e,t,n,a)=>{var i=v[a+40>>2],o={tm_sec:g[a>>2],tm_min:g[a+4>>2],tm_hour:g[a+8>>2],tm_mday:g[a+12>>2],tm_mon:g[a+16>>2],tm_year:g[a+20>>2],tm_wday:g[a+24>>2],tm_yday:g[a+28>>2],tm_isdst:g[a+32>>2],tm_gmtoff:g[a+36>>2],tm_zone:i?it(i):""},r=it(n),s={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var l in s)r=r.replace(new RegExp(l,"g"),s[l]);var u=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],c=["January","February","March","April","May","June","July","August","September","October","November","December"];function d(e,t,n){for(var a="number"==typeof e?e.toString():e||"";a.length0?1:0}var a;return 0===(a=n(e.getFullYear()-t.getFullYear()))&&0===(a=n(e.getMonth()-t.getMonth()))&&(a=n(e.getDate()-t.getDate())),a}function m(e){switch(e.getDay()){case 0:return new Date(e.getFullYear()-1,11,29);case 1:return e;case 2:return new Date(e.getFullYear(),0,3);case 3:return new Date(e.getFullYear(),0,2);case 4:return new Date(e.getFullYear(),0,1);case 5:return new Date(e.getFullYear()-1,11,31);case 6:return new Date(e.getFullYear()-1,11,30)}}function _(e){var t=((e,t)=>{for(var n=new Date(e.getTime());t>0;){var a=bt(n.getFullYear()),i=n.getMonth(),o=(a?yt:wt)[i];if(!(t>o-n.getDate()))return n.setDate(n.getDate()+t),n;t-=o-n.getDate()+1,n.setDate(1),i<11?n.setMonth(i+1):(n.setMonth(0),n.setFullYear(n.getFullYear()+1))}return n})(new Date(e.tm_year+1900,0,1),e.tm_yday),n=new Date(t.getFullYear(),0,4),a=new Date(t.getFullYear()+1,0,4),i=m(n),o=m(a);return f(i,t)<=0?f(o,t)<=0?t.getFullYear()+1:t.getFullYear():t.getFullYear()-1}var b={"%a":e=>u[e.tm_wday].substring(0,3),"%A":e=>u[e.tm_wday],"%b":e=>c[e.tm_mon].substring(0,3),"%B":e=>c[e.tm_mon],"%C":e=>h((e.tm_year+1900)/100|0,2),"%d":e=>h(e.tm_mday,2),"%e":e=>d(e.tm_mday,2," "),"%g":e=>_(e).toString().substring(2),"%G":e=>_(e),"%H":e=>h(e.tm_hour,2),"%I":e=>{var t=e.tm_hour;return 0==t?t=12:t>12&&(t-=12),h(t,2)},"%j":e=>h(e.tm_mday+((e,t)=>{for(var n=0,a=0;a<=t;n+=e[a++]);return n})(bt(e.tm_year+1900)?yt:wt,e.tm_mon-1),3),"%m":e=>h(e.tm_mon+1,2),"%M":e=>h(e.tm_min,2),"%n":()=>"\n","%p":e=>e.tm_hour>=0&&e.tm_hour<12?"AM":"PM","%S":e=>h(e.tm_sec,2),"%t":()=>"\t","%u":e=>e.tm_wday||7,"%U":e=>{var t=e.tm_yday+7-e.tm_wday;return h(Math.floor(t/7),2)},"%V":e=>{var t=Math.floor((e.tm_yday+7-(e.tm_wday+6)%7)/7);if((e.tm_wday+371-e.tm_yday-2)%7<=2&&t++,t){if(53==t){var n=(e.tm_wday+371-e.tm_yday)%7;4!=n&&(3!=n||!bt(e.tm_year))&&(t=1)}}else{t=52;var a=(e.tm_wday+7-e.tm_yday-1)%7;(4==a||5==a&&bt(e.tm_year%400-1))&&t++}return h(t,2)},"%w":e=>e.tm_wday,"%W":e=>{var t=e.tm_yday+7-(e.tm_wday+6)%7;return h(Math.floor(t/7),2)},"%y":e=>(e.tm_year+1900).toString().substring(2),"%Y":e=>e.tm_year+1900,"%z":e=>{var t=e.tm_gmtoff;return(t>=0?"+":"-")+("0000"+(t=(t=Math.abs(t)/60)/60*100+t%60)).slice(-4)},"%Z":e=>e.tm_zone,"%%":()=>"%"};for(var l in r=r.replace(/%%/g,"\0\0"),b)r.includes(l)&&(r=r.replace(new RegExp(l,"g"),b[l](o)));var y=function(e){var t=nt(e)+1,n=new Array(t);return tt(e,n,0,n.length),n}(r=r.replace(/\0\0/g,"%"));return y.length>t?0:(((e,t)=>{p.set(e,t)})(y,e),y.length-1)};W=a.InternalError=class extends Error{constructor(e){super(e),this.name="InternalError"}},(()=>{for(var e=new Array(256),t=0;t<256;++t)e[t]=String.fromCharCode(t);G=e})(),K=a.BindingError=class extends Error{constructor(e){super(e),this.name="BindingError"}},Object.assign(ke.prototype,{isAliasOf(e){if(!(this instanceof ke&&e instanceof ke))return!1;var t=this.$$.ptrType.registeredClass,n=this.$$.ptr;e.$$=e.$$;for(var a=e.$$.ptrType.registeredClass,i=e.$$.ptr;t.baseClass;)n=t.upcast(n),t=t.baseClass;for(;a.baseClass;)i=a.upcast(i),a=a.baseClass;return t===a&&n===i},clone(){if(this.$$.ptr||re(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var e=we(Object.create(Object.getPrototypeOf(this),{$$:{value:oe(this.$$)}}));return e.$$.count.value+=1,e.$$.deleteScheduled=!1,e},delete(){this.$$.ptr||re(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&te("Object already scheduled for deletion"),le(this),ue(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||re(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&te("Object already scheduled for deletion"),fe.push(this),1===fe.length&&ae&&ae(me),this.$$.deleteScheduled=!0,this}}),a.getInheritedInstanceCount=he,a.getLiveInheritedInstances=pe,a.flushPendingDeletes=me,a.setDelayFunction=_e,Object.assign(Re.prototype,{getPointee(e){return this.rawGetPointee&&(e=this.rawGetPointee(e)),e},destructor(e){var t;null===(t=this.rawDestructor)||void 0===t||t.call(this,e)},argPackAdvance:ie,readValueFromPointer:Me,deleteObject(e){null!==e&&e.delete()},fromWireType:ye}),Oe=a.UnboundTypeError=((e,t)=>{var n=xe(t,function(e){this.name=t,this.message=e;var n=new Error(e).stack;void 0!==n&&(this.stack=this.toString()+"\n"+n.replace(/^Error(:[^\n]*)?\n/,""))});return n.prototype=Object.create(e.prototype),n.prototype.constructor=n,n.prototype.toString=function(){return void 0===this.message?this.name:`${this.name}: ${this.message}`},n})(Error,"UnboundTypeError"),Object.assign(He.prototype,{get(e){return this.allocated[e]},has(e){return void 0!==this.allocated[e]},allocate(e){var t=this.freelist.pop()||this.allocated.length;return this.allocated[t]=e,t},free(e){this.allocated[e]=void 0,this.freelist.push(e)}}),We.allocated.push({value:void 0},{value:null},{value:!0},{value:!1}),We.reserved=We.allocated.length,a.count_emval_handles=Ke;var xt={s:e=>{var t=new F(e);return t.get_caught()||(t.set_caught(!0),j--),t.set_rethrown(!1),q.push(t),zt(t.excPtr),t.get_exception_ptr()},u:()=>{Et(0,0);var e=q.pop();Rt(e.excPtr),B=0},b:()=>$([]),g:e=>$([e]),q:(e,t)=>$([e,t]),J:()=>{var e=q.pop();e||L("no exception to throw");var t=e.excPtr;throw e.get_rethrown()||(q.push(e),e.set_rethrown(!0),e.set_caught(!1),j++),B=t},f:(e,t,n)=>{throw new F(e).init(t,n),j++,B=e},V:()=>j,d:e=>{throw B||(B=e),B},da:e=>{var t=V[e];delete V[e];var n=t.rawConstructor,a=t.rawDestructor,i=t.fields,o=i.map(e=>e.getterReturnType).concat(i.map(e=>e.setterArgumentType));X([e],o,e=>{var o={};return i.forEach((t,n)=>{var a=t.fieldName,r=e[n],s=t.getter,l=t.getterContext,u=e[n+i.length],c=t.setter,d=t.setterContext;o[a]={read:e=>r.fromWireType(s(l,e)),write:(e,t)=>{var n=[];c(d,e,u.toWireType(n,t)),U(n)}}}),[{name:t.name,fromWireType:e=>{var t={};for(var n in o)t[n]=o[n].read(e);return a(e),t},toWireType:(e,t)=>{for(var i in o)if(!(i in t))throw new TypeError(`Missing field: "${i}"`);var r=n();for(i in o)o[i].write(r,t[i]);return null!==e&&e.push(a,r),r},argPackAdvance:ie,readValueFromPointer:H,destructorFunction:a}]})},Q:(e,t,n,a,i)=>{},_:(e,t,n,a)=>{ne(e,{name:t=ee(t),fromWireType:function(e){return!!e},toWireType:function(e,t){return t?n:a},argPackAdvance:ie,readValueFromPointer:function(e){return this.fromWireType(f[e])},destructorFunction:null})},ca:(e,t,n,a,i,o,r,s,l,u,c,d,h)=>{c=ee(c),o=je(i,o),s&&(s=je(r,s)),u&&(u=je(l,u)),h=je(d,h);var p=(e=>{if(void 0===e)return"_unknown";var t=(e=e.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);return t>=48&&t<=57?`_${e}`:e})(c);Ce(p,function(){Fe(`Cannot construct ${c} due to unbound types`,[a])}),X([e,t,n],a?[a]:[],function(t){var n,i;t=t[0],i=a?(n=t.registeredClass).instancePrototype:ke.prototype;var r=xe(c,function(){if(Object.getPrototypeOf(this)!==l)throw new K("Use 'new' to construct "+c);if(void 0===m.constructor_body)throw new K(c+" has no accessible constructor");var e=m.constructor_body[arguments.length];if(void 0===e)throw new K(`Tried to invoke ctor of ${c} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(m.constructor_body).toString()}) parameters instead!`);return e.apply(this,arguments)}),l=Object.create(i,{constructor:{value:r}});r.prototype=l;var d,f,m=new Te(c,r,l,h,n,o,s,u);m.baseClass&&(null!==(f=(d=m.baseClass).__derivedClasses)&&void 0!==f||(d.__derivedClasses=[]),m.baseClass.__derivedClasses.push(m));var _=new Re(c,m,!0,!1,!1),g=new Re(c+"*",m,!1,!1,!1),v=new Re(c+" const*",m,!1,!0,!1);return de[e]={pointerType:g,constPointerType:v},Ie(p,r),[_,g,v]})},ba:(e,t,n,a,i,o)=>{var r=$e(t,n);i=je(a,i),X([],[e],function(e){var n=`constructor ${(e=e[0]).name}`;if(void 0===e.registeredClass.constructor_body&&(e.registeredClass.constructor_body=[]),void 0!==e.registeredClass.constructor_body[t-1])throw new K(`Cannot register multiple constructors with identical number of parameters (${t-1}) for class '${e.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return e.registeredClass.constructor_body[t-1]=()=>{Fe(`Cannot construct ${e.name} due to unbound types`,r)},X([],r,a=>(a.splice(1,0,null),e.registeredClass.constructor_body[t-1]=Ve(n,a,null,i,o),[])),[]})},w:(e,t,n,a,i,o,r,s,l)=>{var u=$e(n,a);t=ee(t),t=Ue(t),o=je(i,o),X([],[e],function(e){var a=`${(e=e[0]).name}.${t}`;function i(){Fe(`Cannot call ${a} due to unbound types`,u)}t.startsWith("@@")&&(t=Symbol[t.substring(2)]),s&&e.registeredClass.pureVirtualFunctions.push(t);var l=e.registeredClass.instancePrototype,c=l[t];return void 0===c||void 0===c.overloadTable&&c.className!==e.name&&c.argCount===n-2?(i.argCount=n-2,i.className=e.name,l[t]=i):(Se(l,t,a),l[t].overloadTable[n-2]=i),X([],u,function(i){var s=Ve(a,i,e,o,r);return void 0===l[t].overloadTable?(s.argCount=n-2,l[t]=s):l[t].overloadTable[n-2]=s,[]}),[]})},Y:(e,t)=>{ne(e,{name:t=ee(t),fromWireType:e=>{var t=Ye.toValue(e);return Ge(e),t},toWireType:(e,t)=>Ye.toHandle(t),argPackAdvance:ie,readValueFromPointer:H,destructorFunction:null})},x:(e,t,n,a)=>{function i(){}t=ee(t),i.values={},ne(e,{name:t,constructor:i,fromWireType:function(e){return this.constructor.values[e]},toWireType:(e,t)=>t.value,argPackAdvance:ie,readValueFromPointer:Qe(t,n,a),destructorFunction:null}),Ce(t,i)},h:(e,t,n)=>{var a=Ze(e,"enum");t=ee(t);var i=a.constructor,o=Object.create(a.constructor.prototype,{value:{value:n},constructor:{value:xe(`${a.name}_${t}`,function(){})}});i.values[n]=o,i[t]=o},L:(e,t,n)=>{ne(e,{name:t=ee(t),fromWireType:e=>e,toWireType:(e,t)=>t,argPackAdvance:ie,readValueFromPointer:Xe(t,n),destructorFunction:null})},M:(e,t,n,a,i,o,r)=>{var s=$e(t,n);e=ee(e),e=Ue(e),i=je(a,i),Ce(e,function(){Fe(`Cannot call ${e} due to unbound types`,s)},t-1),X([],s,function(n){var a=[n[0],null].concat(n.slice(1));return Ie(e,Ve(e,a,null,i,o),t-1),[]})},t:(e,t,n,a,i)=>{t=ee(t);var o=e=>e;if(0===a){var r=32-8*n;o=e=>e<>>r}var s=t.includes("unsigned");ne(e,{name:t,fromWireType:o,toWireType:s?function(e,t){return this.name,t>>>0}:function(e,t){return this.name,t},argPackAdvance:ie,readValueFromPointer:et(t,n,0!==a),destructorFunction:null})},o:(e,t,n)=>{var a=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][t];function i(e){var t=v[e>>2],n=v[e+4>>2];return new a(p.buffer,n,t)}ne(e,{name:n=ee(n),fromWireType:i,argPackAdvance:ie,readValueFromPointer:i},{ignoreDuplicateRegistrations:!0})},K:(e,t)=>{var n="std::string"===(t=ee(t));ne(e,{name:t,fromWireType(e){var t,a=v[e>>2],i=e+4;if(n)for(var o=i,r=0;r<=a;++r){var s=i+r;if(r==a||0==f[s]){var l=it(o,s-o);void 0===t?t=l:(t+="\0",t+=l),o=s+1}}else{var u=new Array(a);for(r=0;r>2]=a,n&&i)((e,t,n)=>{tt(e,f,t,n)})(t,r,a+1);else if(i)for(var s=0;s255&&(Ct(r),te("String has UTF-16 code units that do not fit in 8 bits")),f[r+s]=l}else for(s=0;s{var a,i,o,r,s;n=ee(n),2===t?(a=rt,i=st,r=lt,o=()=>_,s=1):4===t&&(a=ut,i=ct,r=dt,o=()=>v,s=2),ne(e,{name:n,fromWireType:e=>{for(var n,i=v[e>>2],r=o(),l=e+4,u=0;u<=i;++u){var c=e+4+u*t;if(u==i||0==r[c>>s]){var d=a(l,c-l);void 0===n?n=d:(n+="\0",n+=d),l=c+t}}return Ct(e),n},toWireType:(e,a)=>{"string"!=typeof a&&te(`Cannot pass non-string to C++ string type ${n}`);var o=r(a),l=Tt(4+o+t);return v[l>>2]=o>>s,i(a,l+4,o+t),null!==e&&e.push(Ct,l),l},argPackAdvance:ie,readValueFromPointer:H,destructorFunction(e){Ct(e)}})},A:(e,t,n,a,i,o)=>{V[e]={name:ee(t),rawConstructor:je(n,a),rawDestructor:je(i,o),fields:[]}},ea:(e,t,n,a,i,o,r,s,l,u)=>{V[e].fields.push({fieldName:ee(t),getterReturnType:n,getter:je(a,i),getterContext:o,setterArgumentType:r,setter:je(s,l),setterContext:u})},$:(e,t)=>{ne(e,{isVoid:!0,name:t=ee(t),argPackAdvance:0,fromWireType:()=>{},toWireType:(e,t)=>{}})},R:(e,t,n,a)=>(e=ht[e])(null,t=Ye.toValue(t),n,a),ha:Ge,fa:e=>0===e?Ye.toHandle(ft()):(e=(e=>{var t=pt[e];return void 0===t?ee(e):t})(e),Ye.toHandle(ft()[e])),Z:(e,t,n)=>{var a=((e,t)=>{for(var n=new Array(e),a=0;a>2],"parameter "+a);return n})(e,t),i=a.shift();e--;var o=new Array(e),r=`methodCaller<(${a.map(e=>e.name).join(", ")}) => ${i.name}>`;return(e=>{var t=ht.length;return ht.push(e),t})(xe(r,(t,r,s,l)=>{for(var u=0,c=0;c{var a=[],i=e.toWireType(a,n);return a.length&&(v[t>>2]=Ye.toHandle(a)),i})(i,s,d)}))},N:e=>{e>4&&(We.get(e).refcount+=1)},O:e=>{var t=Ye.toValue(e);U(t),Ge(e)},aa:(e,t)=>{var n=(e=Ze(e,"_emval_take_value")).readValueFromPointer(t);return Ye.toHandle(n)},B:()=>{L("")},X:(e,t,n)=>f.copyWithin(e,t,t+n),W:e=>{var t=f.length,n=2147483648;if((e>>>=0)>n)return!1;for(var a=(e,t)=>e+(t-e%t)%t,i=1;i<=4;i*=2){var o=t*(1+.2/i);o=Math.min(o,e+100663296);var r=Math.min(n,a(Math.max(e,o),65536));if(_t(r))return!0}return!1},T:(e,t)=>{var n=0;return vt().forEach((a,i)=>{var o=t+n;v[e+4*i>>2]=o,((e,t)=>{for(var n=0;n{var n=vt();v[e>>2]=n.length;var a=0;return n.forEach(e=>a+=e.length+1),v[t>>2]=a,0},E:function(e,t,n,a){var i=Lt();try{return De(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},D:function(e,t,n,a,i){var o=Lt();try{return De(e)(t,n,a,i)}catch(e){if(Mt(o),e!==e+0)throw e;Et(1,0)}},F:function(e,t,n,a){var i=Lt();try{return De(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},n:function(e){var t=Lt();try{return De(e)()}catch(e){if(Mt(t),e!==e+0)throw e;Et(1,0)}},a:function(e,t){var n=Lt();try{return De(e)(t)}catch(e){if(Mt(n),e!==e+0)throw e;Et(1,0)}},e:function(e,t,n){var a=Lt();try{return De(e)(t,n)}catch(e){if(Mt(a),e!==e+0)throw e;Et(1,0)}},m:function(e,t,n,a){var i=Lt();try{return De(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},k:function(e,t,n,a,i){var o=Lt();try{return De(e)(t,n,a,i)}catch(e){if(Mt(o),e!==e+0)throw e;Et(1,0)}},H:function(e,t,n,a,i,o){var r=Lt();try{return De(e)(t,n,a,i,o)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},v:function(e,t,n,a,i,o,r){var s=Lt();try{return De(e)(t,n,a,i,o,r)}catch(e){if(Mt(s),e!==e+0)throw e;Et(1,0)}},G:function(e,t,n,a,i,o,r,s){var l=Lt();try{return De(e)(t,n,a,i,o,r,s)}catch(e){if(Mt(l),e!==e+0)throw e;Et(1,0)}},z:function(e,t,n,a,i,o,r,s,l,u,c,d){var h=Lt();try{return De(e)(t,n,a,i,o,r,s,l,u,c,d)}catch(e){if(Mt(h),e!==e+0)throw e;Et(1,0)}},P:function(e,t,n,a,i){var o=Lt();try{return Dt(e,t,n,a,i)}catch(e){if(Mt(o),e!==e+0)throw e;Et(1,0)}},l:function(e){var t=Lt();try{De(e)()}catch(e){if(Mt(t),e!==e+0)throw e;Et(1,0)}},j:function(e,t){var n=Lt();try{De(e)(t)}catch(e){if(Mt(n),e!==e+0)throw e;Et(1,0)}},c:function(e,t,n){var a=Lt();try{De(e)(t,n)}catch(e){if(Mt(a),e!==e+0)throw e;Et(1,0)}},p:function(e,t,n,a){var i=Lt();try{De(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},I:function(e,t,n,a,i){var o=Lt();try{De(e)(t,n,a,i)}catch(e){if(Mt(o),e!==e+0)throw e;Et(1,0)}},r:function(e,t,n,a,i,o,r,s){var l=Lt();try{De(e)(t,n,a,i,o,r,s)}catch(e){if(Mt(l),e!==e+0)throw e;Et(1,0)}},i:function(e,t,n,a,i,o,r,s,l,u,c){var d=Lt();try{De(e)(t,n,a,i,o,r,s,l,u,c)}catch(e){if(Mt(d),e!==e+0)throw e;Et(1,0)}},y:function(e,t,n,a,i,o,r,s,l,u,c,d,h,p,f,m){var _=Lt();try{De(e)(t,n,a,i,o,r,s,l,u,c,d,h,p,f,m)}catch(e){if(Mt(_),e!==e+0)throw e;Et(1,0)}},ga:e=>e,S:(e,t,n,a,i)=>kt(e,t,n,a)},St=function(){var e={a:xt};function t(e,t){return St=e.exports,h=St.ia,k(),ze=St.ma,function(e){S.unshift(e)}(St.ja),function(){var e;if(E--,null===(e=a.monitorRunDependencies)||void 0===e||e.call(a,E),0==E&&A){var t=A;A=null,t()}}(),St}if(function(){var e;E++,null===(e=a.monitorRunDependencies)||void 0===e||e.call(a,E)}(),a.instantiateWasm)try{return a.instantiateWasm(e,t)}catch(e){d(`Module.instantiateWasm callback failed with error: ${e}`),n(e)}return function(e,t,n,a){return e||"function"!=typeof WebAssembly.instantiateStreaming||z(t)||"function"!=typeof fetch?N(t,n,a):fetch(t,{credentials:"same-origin"}).then(e=>WebAssembly.instantiateStreaming(e,n).then(a,function(e){return d(`wasm streaming compile failed: ${e}`),d("falling back to ArrayBuffer instantiation"),N(t,n,a)}))}(c,M,e,function(e){t(e.instance)}).catch(n),{}}(),Ct=a._free=e=>(Ct=a._free=St.ka)(e),Tt=a._malloc=e=>(Tt=a._malloc=St.la)(e),Pt=e=>(Pt=St.na)(e),Et=(e,t)=>(Et=St.oa)(e,t),At=e=>(At=St.pa)(e),Lt=()=>(Lt=St.qa)(),Mt=e=>(Mt=St.ra)(e),Rt=e=>(Rt=St.sa)(e),zt=e=>(zt=St.ta)(e),Ot=(e,t,n)=>(Ot=St.ua)(e,t,n),It=e=>(It=St.va)(e);a.dynCall_viijii=(e,t,n,i,o,r,s)=>(a.dynCall_viijii=St.wa)(e,t,n,i,o,r,s);var Nt,Dt=a.dynCall_jiiii=(e,t,n,i,o)=>(Dt=a.dynCall_jiiii=St.xa)(e,t,n,i,o);function qt(){function e(){Nt||(Nt=!0,a.calledRun=!0,!w&&(D(S),t(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),function(){if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)P(a.postRun.shift());D(C)}()))}E>0||(function(){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)T(a.preRun.shift());D(x)}(),E>0)||(a.setStatus?(a.setStatus("Running..."),setTimeout(function(){setTimeout(function(){a.setStatus("")},1),e()},1)):e())}if(a.dynCall_iiiiij=(e,t,n,i,o,r,s)=>(a.dynCall_iiiiij=St.ya)(e,t,n,i,o,r,s),a.dynCall_iiiiijj=(e,t,n,i,o,r,s,l,u)=>(a.dynCall_iiiiijj=St.za)(e,t,n,i,o,r,s,l,u),a.dynCall_iiiiiijj=(e,t,n,i,o,r,s,l,u,c)=>(a.dynCall_iiiiiijj=St.Aa)(e,t,n,i,o,r,s,l,u,c),A=function e(){Nt||qt(),Nt||(A=e)},a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();return qt(),e.ready});async function q(e,t){return async function(e,t,n=A){const a={...A,...n},i=await O(e),{size:o}=t,r=new Uint8Array(await t.arrayBuffer()),s=i._malloc(o);i.HEAPU8.set(r,s);const l=i.readBarcodesFromImage(s,o,L(i,a));i._free(s);const u=[];for(let e=0;e{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)})(this,N,void 0);try{const a=null==(t=null==e?void 0:e.formats)?void 0:t.filter(e=>"unknown"!==e);if(0===(null==a?void 0:a.length))throw new TypeError("Hint option provided, but is empty.");null==a||a.forEach(e=>{if(!r.has(e))throw new TypeError(`Failed to read the 'formats' property from 'BarcodeDetectorOptions': The provided value '${e}' is not a valid enum value of type BarcodeFormat.`)}),((e,t,a)=>{n(e,t,"write to private field"),t.set(e,a)})(this,N,null!=a?a:[]),function(e){return O(D,e)}().then(e=>{this.dispatchEvent(new CustomEvent("load",{detail:e}))}).catch(e=>{this.dispatchEvent(new CustomEvent("error",{detail:e}))})}catch(e){throw v(e,"Failed to construct 'BarcodeDetector'")}}static async getSupportedFormats(){return o.filter(e=>"unknown"!==e)}async detect(e){try{const t=await g(e);if(null===t)return[];let n;try{n=m(t)?await q(t,{tryHarder:!0,formats:a(this,N).map(e=>r.get(e))}):await j(t,{tryHarder:!0,formats:a(this,N).map(e=>r.get(e))})}catch(e){throw console.error(e),new DOMException("Barcode detection service unavailable.","NotSupportedError")}return n.map(e=>{const{topLeft:{x:t,y:n},topRight:{x:a,y:i},bottomLeft:{x:o,y:r},bottomRight:{x:l,y:u}}=e.position,c=Math.min(t,a,o,l),d=Math.min(n,i,r,u),h=Math.max(t,a,o,l),p=Math.max(n,i,r,u);return{boundingBox:new DOMRectReadOnly(c,d,h-c,p-d),rawValue:e.text,format:s(e.format),cornerPoints:[{x:t,y:n},{x:a,y:i},{x:l,y:u},{x:o,y:r}]}})}catch(e){throw v(e,"Failed to execute 'detect' on 'BarcodeDetector'")}}}N=new WeakMap;const F=(e,t,n="error")=>{let a,i;const o=new Promise((o,r)=>{a=o,i=r,e.addEventListener(t,a),e.addEventListener(n,i)});return o.finally(()=>{e.removeEventListener(t,a),e.removeEventListener(n,i)}),o},$=e=>new Promise(t=>setTimeout(t,e));class V extends Error{constructor(){super("can't process cross-origin image"),this.name="DropImageFetchError"}}class U extends Error{constructor(){super("this browser has no Stream API support"),this.name="StreamApiNotSupportedError"}}class H extends Error{constructor(){super("camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP."),this.name="InsecureContextError"}}class W extends Error{constructor(){super("Loading camera stream timed out after 6 seconds. If you are on iOS in PWA mode, this is a known issue (see https://github.com/gruhn/vue-qrcode-reader/issues/298)"),this.name="StreamLoadTimeoutError"}}let G;function K(e){G=new B({formats:e})}const Y=async(e,t=["qr_code"])=>await new B({formats:t}).detect(e),Q=async(e,t=["qr_code"])=>{const n=new B({formats:t}),a=await(async e=>{if(e.startsWith("http")&&!1===e.includes(location.host))throw new V;const t=document.createElement("img");return t.src=e,await F(t,"load"),t})(e);return await n.detect(a)};var Z={},J={};Object.defineProperty(J,"__esModule",{value:!0}),J.compactObject=function e(t){return ie(t)?Object.keys(t).reduce(function(n,a){var i=ie(t[a]),o=i?e(t[a]):t[a],r=i&&!Object.keys(o).length;return void 0===o||r?n:Object.assign(n,function(e,t,n){return t=function(e){var t=function(e,t){if("object"!==ee(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t);if("object"!==ee(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ee(t)?t:String(t)}(t),t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},a,o))},{}):t},J.deprecated=function(e,t){ne&&console.warn(e+" is deprecated, please use "+t+" instead.")};var X=J.detectBrowser=function(e){var t={browser:null,version:null};if(typeof e>"u"||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;var n=e.navigator;if(n.mozGetUserMedia)t.browser="firefox",t.version=ae(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=ae(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=ae(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t};function ee(e){return(ee="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)}J.disableLog=function(e){return"boolean"!=typeof e?new Error("Argument type: "+ee(e)+". Please use a boolean."):(te=e,e?"adapter.js logging disabled":"adapter.js logging enabled")},J.disableWarnings=function(e){return"boolean"!=typeof e?new Error("Argument type: "+ee(e)+". Please use a boolean."):(ne=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))},J.extractVersion=ae,J.filterStats=function(e,t,n){var a=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;var o=[];return e.forEach(function(e){"track"===e.type&&e.trackIdentifier===t.id&&o.push(e)}),o.forEach(function(t){e.forEach(function(n){n.type===a&&n.trackId===t.id&&oe(e,n,i)})}),i},J.log=function(){if("object"===(typeof window>"u"?"undefined":ee(window))){if(te)return;typeof console<"u"&&"function"==typeof console.log&&console.log.apply(console,arguments)}},J.walkStats=oe,J.wrapPeerConnectionEvent=function(e,t,n){if(e.RTCPeerConnection){var a=e.RTCPeerConnection.prototype,i=a.addEventListener;a.addEventListener=function(e,a){if(e!==t)return i.apply(this,arguments);var o=function(e){var t=n(e);t&&(a.handleEvent?a.handleEvent(t):a(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(a,o),i.apply(this,[e,o])};var o=a.removeEventListener;a.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return o.apply(this,arguments);if(!this._eventMap[t].has(n))return o.apply(this,arguments);var a=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,o.apply(this,[e,a])},Object.defineProperty(a,"on"+t,{get:function(){return this["_on"+t]},set:function(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}};var te=!0,ne=!0;function ae(e,t,n){var a=e.match(t);return a&&a.length>=n&&parseInt(a[n],10)}function ie(e){return"[object Object]"===Object.prototype.toString.call(e)}function oe(e,t,n){!t||n.has(t.id)||(n.set(t.id,t),Object.keys(t).forEach(function(a){a.endsWith("Id")?oe(e,e.get(t[a]),n):a.endsWith("Ids")&&t[a].forEach(function(t){oe(e,e.get(t),n)})}))}Object.defineProperty(Z,"__esModule",{value:!0});var re=Z.shimGetUserMedia=function(e,t){var n=e&&e.navigator;if(n.mediaDevices){var a=function(e){if("object"!==ue(e)||e.mandatory||e.optional)return e;var t={};return Object.keys(e).forEach(function(n){if("require"!==n&&"advanced"!==n&&"mediaSource"!==n){var a="object"===ue(e[n])?e[n]:{ideal:e[n]};void 0!==a.exact&&"number"==typeof a.exact&&(a.min=a.max=a.exact);var i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==a.ideal){t.optional=t.optional||[];var o={};"number"==typeof a.ideal?(o[i("min",n)]=a.ideal,t.optional.push(o),(o={})[i("max",n)]=a.ideal,t.optional.push(o)):(o[i("",n)]=a.ideal,t.optional.push(o))}void 0!==a.exact&&"number"!=typeof a.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=a.exact):["min","max"].forEach(function(e){void 0!==a[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=a[e])})}}),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"===ue(e.audio)){var o=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])};o((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),o(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=a(e.audio)}if(e&&"object"===ue(e.video)){var r=e.video.facingMode;r=r&&("object"===ue(r)?r:{ideal:r});var s,l=t.version<66;if(r&&("user"===r.exact||"environment"===r.exact||"user"===r.ideal||"environment"===r.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.mediaDevices.getSupportedConstraints().facingMode||l))if(delete e.video.facingMode,"environment"===r.exact||"environment"===r.ideal?s=["back","rear"]:("user"===r.exact||"user"===r.ideal)&&(s=["front"]),s)return n.mediaDevices.enumerateDevices().then(function(t){var n=(t=t.filter(function(e){return"videoinput"===e.kind})).find(function(e){return s.some(function(t){return e.label.toLowerCase().includes(t)})});return!n&&t.length&&s.includes("back")&&(n=t[t.length-1]),n&&(e.video.deviceId=r.exact?{exact:n.deviceId}:{ideal:n.deviceId}),e.video=a(e.video),ce("chrome: "+JSON.stringify(e)),i(e)});e.video=a(e.video)}return ce("chrome: "+JSON.stringify(e)),i(e)},o=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}};if(n.getUserMedia=function(e,t,a){i(e,function(e){n.webkitGetUserMedia(e,t,function(e){a&&a(o(e))})})}.bind(n),n.mediaDevices.getUserMedia){var r=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(e){return i(e,function(e){return r(e).then(function(t){if(e.audio&&!t.getAudioTracks().length||e.video&&!t.getVideoTracks().length)throw t.getTracks().forEach(function(e){e.stop()}),new DOMException("","NotFoundError");return t},function(e){return Promise.reject(o(e))})})}}}},se=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==ue(e)&&"function"!=typeof e)return{default:e};var n=le(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var r=i?Object.getOwnPropertyDescriptor(e,o):null;r&&(r.get||r.set)?Object.defineProperty(a,o,r):a[o]=e[o]}return a.default=e,n&&n.set(e,a),a}(J);function le(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(le=function(e){return e?n:t})(e)}function ue(e){return(ue="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)}var ce=se.log;var de={};Object.defineProperty(de,"__esModule",{value:!0});var he=de.shimGetUserMedia=function(e,t){var n=e&&e.navigator,a=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,a){pe.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,a)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){var i=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},o=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(e){return"object"===me(e)&&"object"===me(e.audio)&&(e=JSON.parse(JSON.stringify(e)),i(e.audio,"autoGainControl","mozAutoGainControl"),i(e.audio,"noiseSuppression","mozNoiseSuppression")),o(e)},a&&a.prototype.getSettings){var r=a.prototype.getSettings;a.prototype.getSettings=function(){var e=r.apply(this,arguments);return i(e,"mozAutoGainControl","autoGainControl"),i(e,"mozNoiseSuppression","noiseSuppression"),e}}if(a&&a.prototype.applyConstraints){var s=a.prototype.applyConstraints;a.prototype.applyConstraints=function(e){return"audio"===this.kind&&"object"===me(e)&&(e=JSON.parse(JSON.stringify(e)),i(e,"autoGainControl","mozAutoGainControl"),i(e,"noiseSuppression","mozNoiseSuppression")),s.apply(this,[e])}}}},pe=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==me(e)&&"function"!=typeof e)return{default:e};var n=fe(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var r=i?Object.getOwnPropertyDescriptor(e,o):null;r&&(r.get||r.set)?Object.defineProperty(a,o,r):a[o]=e[o]}return a.default=e,n&&n.set(e,a),a}(J);function fe(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(fe=function(e){return e?n:t})(e)}function me(e){return(me="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)}var _e={};Object.defineProperty(_e,"__esModule",{value:!0}),_e.shimAudioContext=function(e){"object"!==ye(e)||e.AudioContext||(e.AudioContext=e.webkitAudioContext)},_e.shimCallbacksAPI=function(e){if("object"===ye(e)&&e.RTCPeerConnection){var t=e.RTCPeerConnection.prototype,n=t.createOffer,a=t.createAnswer,i=t.setLocalDescription,o=t.setRemoteDescription,r=t.addIceCandidate;t.createOffer=function(e,t){var a=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[a]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){var n=arguments.length>=2?arguments[2]:arguments[0],i=a.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};var s=function(e,t,n){var a=i.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a};t.setLocalDescription=s,s=function(e,t,n){var a=o.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a},t.setRemoteDescription=s,s=function(e,t,n){var a=r.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a},t.addIceCandidate=s}},_e.shimConstraints=we,_e.shimCreateOfferLegacy=function(e){var t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){typeof e.offerToReceiveAudio<"u"&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);var n=this.getTransceivers().find(function(e){return"audio"===e.receiver.track.kind});!1===e.offerToReceiveAudio&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0===e.offerToReceiveAudio&&!n&&this.addTransceiver("audio",{direction:"recvonly"}),typeof e.offerToReceiveVideo<"u"&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);var a=this.getTransceivers().find(function(e){return"video"===e.receiver.track.kind});!1===e.offerToReceiveVideo&&a?"sendrecv"===a.direction?a.setDirection?a.setDirection("sendonly"):a.direction="sendonly":"recvonly"===a.direction&&(a.setDirection?a.setDirection("inactive"):a.direction="inactive"):!0===e.offerToReceiveVideo&&!a&&this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}};var ge=_e.shimGetUserMedia=function(e){var t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){var n=t.mediaDevices,a=n.getUserMedia.bind(n);t.mediaDevices.getUserMedia=function(e){return a(we(e))}}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,a){t.mediaDevices.getUserMedia(e).then(n,a)}.bind(t))};_e.shimLocalStreamsAPI=function(e){if("object"===ye(e)&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){var t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){var n=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach(function(a){return t.call(n,a,e)}),e.getVideoTracks().forEach(function(a){return t.call(n,a,e)})},e.RTCPeerConnection.prototype.addTrack=function(e){for(var n=this,a=arguments.length,i=new Array(a>1?a-1:0),o=1;o=0)){e._remoteStreams.push(t);var n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}})}),t.apply(e,arguments)}}},_e.shimTrackEventTransceiver=function(e){"object"===ye(e)&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})};var ve=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==ye(e)&&"function"!=typeof e)return{default:e};var n=be(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var r=i?Object.getOwnPropertyDescriptor(e,o):null;r&&(r.get||r.set)?Object.defineProperty(a,o,r):a[o]=e[o]}return a.default=e,n&&n.set(e,a),a}(J);function be(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(be=function(e){return e?n:t})(e)}function ye(e){return(ye="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 we(e){return e&&void 0!==e.video?Object.assign({},e,{video:ve.compactObject(e.video)}):e}function ke(e,t){if(!1===e)throw new Error(null!=t?t:"assertion failure")}function xe(e){throw new Error("this code should be unreachable")}const Se=(e=>{let t,n=!1;return(...a)=>(n||(t=e(a),n=!0),t)})(()=>{const e=X(window);switch(e.browser){case"chrome":re(window,e);break;case"firefox":he(window,e);break;case"safari":ge(window,e);break;default:throw new U}});let Ce=Promise.resolve({type:"stop",data:{}});async function Te(e,t,n){var a,i,o;if(console.debug("[vue-qrcode-reader] starting camera with constraints: ",JSON.stringify(t)),!0!==window.isSecureContext)throw new H;if(void 0===(null==(a=null==navigator?void 0:navigator.mediaDevices)?void 0:a.getUserMedia))throw new U;Se(),console.debug("[vue-qrcode-reader] calling getUserMedia");const r=await navigator.mediaDevices.getUserMedia({audio:!1,video:t});void 0!==e.srcObject?e.srcObject=r:void 0!==e.mozSrcObject?e.mozSrcObject=r:window.URL.createObjectURL?e.src=window.URL.createObjectURL(r):window.webkitURL?e.src=window.webkitURL.createObjectURL(r):e.src=r.id,e.play(),console.debug("[vue-qrcode-reader] waiting for video element to load"),await Promise.race([F(e,"loadeddata"),$(6e3).then(()=>{throw new W})]),console.debug("[vue-qrcode-reader] video element loaded"),await $(500);const[s]=r.getVideoTracks(),l=null!=(o=null==(i=null==s?void 0:s.getCapabilities)?void 0:i.call(s))?o:{};let u=!1;return n&&l.torch&&(await s.applyConstraints({advanced:[{torch:!0}]}),u=!0),console.debug("[vue-qrcode-reader] camera ready"),{type:"start",data:{videoEl:e,stream:r,capabilities:l,constraints:t,isTorchOn:u}}}async function Pe(e,t,n){console.debug("[vue-qrcode-reader] stopping camera"),e.src="",e.srcObject=null,e.load(),await F(e,"error");for(const e of t.getTracks())null!=n||await e.applyConstraints({advanced:[{torch:!1}]}),t.removeTrack(e),e.stop();return{type:"stop",data:{}}}async function Ee(){if(Ce=Ce.then(e=>{if("stop"===e.type||"failed"===e.type)return e;const{data:{videoEl:t,stream:n,isTorchOn:a}}=e;return Pe(t,n,a)}),"start"===(await Ce).type)throw new Error("Something went wrong with the camera task queue (stop task).")}const Ae=t.defineComponent({__name:"QrcodeStream",props:{constraints:{default:()=>({facingMode:"environment"})},formats:{default:()=>["qr_code"]},paused:{type:Boolean,default:!1},torch:{type:Boolean,default:!1},track:{type:Function,default:void 0}},emits:["detect","camera-on","camera-off","error"],setup(e,{emit:n}){const a=e,i=n,o=t.ref(a.constraints),r=t.ref(a.formats);t.watch(()=>a.constraints,(e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&(o.value=e)},{deep:!0}),t.watch(()=>a.formats,(e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&(r.value=e)},{deep:!0});const s=t.ref(),l=t.ref(),u=t.ref(),c=t.ref(!1),d=t.ref(!1);t.onMounted(()=>{d.value=!0}),t.onUnmounted(()=>{Ee()});const h=t.computed(()=>({torch:a.torch,constraints:o.value,shouldStream:d.value&&!a.paused}));t.watch(h,async e=>{const t=u.value;ke(void 0!==t,"cameraSettings watcher should never be triggered when component is not mounted. Thus video element should always be defined.");const n=s.value;ke(void 0!==n,"cameraSettings watcher should never be triggered when component is not mounted. Thus canvas should always be defined.");const a=n.getContext("2d");if(ke(null!==a,"if cavnas is defined, canvas 2d context should also be non-null"),e.shouldStream){Ee(),c.value=!1;try{const n=await async function(e,{constraints:t,torch:n,restart:a=!1}){Ce=Ce.then(i=>{if("start"===i.type){const{data:{videoEl:o,stream:r,constraints:s,isTorchOn:l}}=i;return a||e!==o||t!==s||n!==l?Pe(o,r,l).then(()=>Te(e,t,n)):i}if("stop"===i.type||"failed"===i.type)return Te(e,t,n);xe()}).catch(e=>(console.debug(`[vue-qrcode-reader] starting camera failed with "${e}"`),{type:"failed",error:e}));const i=await Ce;if("stop"===i.type)throw new Error("Something went wrong with the camera task queue (start task).");if("failed"===i.type)throw i.error;if("start"===i.type)return i.data.capabilities;xe()}(t,e);d.value?(c.value=!0,i("camera-on",n)):await Ee()}catch(e){i("error",e)}}else n.width=t.videoWidth,n.height=t.videoHeight,a.drawImage(t,0,0,t.videoWidth,t.videoHeight),Ee(),c.value=!1,i("camera-off")},{deep:!0}),t.watch(r,e=>{d.value&&K(e)});const p=t.computed(()=>h.value.shouldStream&&c.value);t.watch(p,e=>{if(e){ke(void 0!==s.value,"shouldScan watcher should only be triggered when component is mounted. Thus pause frame canvas is defined"),f(s.value),ke(void 0!==l.value,"shouldScan watcher should only be triggered when component is mounted. Thus tracking canvas is defined"),f(l.value);const e=()=>void 0===a.track?500:40;ke(void 0!==u.value,"shouldScan watcher should only be triggered when component is mounted. Thus video element is defined"),(async(e,{detectHandler:t,locateHandler:n,minDelay:a,formats:i})=>{console.debug("[vue-qrcode-reader] start scanning"),K(i);const o=i=>async r=>{if(0===e.readyState)console.debug("[vue-qrcode-reader] stop scanning: video element readyState is 0");else{const{lastScanned:s,contentBefore:l,lastScanHadContent:u}=i;if(r-s!l.includes(e.rawValue));i&&t(a);const s=a.length>0;s&&n(a),!s&&u&&n(a);const c={lastScanned:r,lastScanHadContent:s,contentBefore:i?a.map(e=>e.rawValue):l};window.requestAnimationFrame(o(c))}}};o({lastScanned:performance.now(),contentBefore:[],lastScanHadContent:!1})(performance.now())})(u.value,{detectHandler:e=>i("detect",e),formats:r.value,locateHandler:m,minDelay:e()})}});const f=e=>{const t=e.getContext("2d");ke(null!==t,"canvas 2d context should always be non-null"),t.clearRect(0,0,e.width,e.height)},m=e=>{const t=l.value;ke(void 0!==t,"onLocate handler should only be called when component is mounted. Thus tracking canvas is always defined.");const n=u.value;if(ke(void 0!==n,"onLocate handler should only be called when component is mounted. Thus video element is always defined."),0===e.length||void 0===a.track)f(t);else{const i=n.offsetWidth,o=n.offsetHeight,r=n.videoWidth,s=n.videoHeight,l=Math.max(i/r,o/s),u=r*l,c=s*l,d=u/r,h=c/s,p=(i-u)/2,f=(o-c)/2,m=({x:e,y:t})=>({x:Math.floor(e*d),y:Math.floor(t*h)}),_=({x:e,y:t})=>({x:Math.floor(e+p),y:Math.floor(t+f)}),g=e.map(e=>{const{boundingBox:t,cornerPoints:n}=e,{x:a,y:i}=_(m({x:t.x,y:t.y})),{x:o,y:r}=m({x:t.width,y:t.height});return{...e,cornerPoints:n.map(e=>_(m(e))),boundingBox:DOMRectReadOnly.fromRect({x:a,y:i,width:o,height:r})}});t.width=n.offsetWidth,t.height=n.offsetHeight;const v=t.getContext("2d");ke(null!==v,"canvas 2d context should always be non-null"),a.track(g,v)}},_={width:"100%",height:"100%",position:"relative","z-index":"0"},g={width:"100%",height:"100%",position:"absolute",top:"0",left:"0"},v={width:"100%",height:"100%","object-fit":"cover"},b=t.computed(()=>p.value?v:{...v,visibility:"hidden",position:"absolute"});return(e,n)=>(t.openBlock(),t.createElementBlock("div",{style:_},[t.createElementVNode("video",{ref_key:"videoRef",ref:u,style:t.normalizeStyle(b.value),autoplay:"",muted:"",playsinline:""},null,4),t.withDirectives(t.createElementVNode("canvas",{id:"qrcode-stream-pause-frame",ref_key:"pauseFrameRef",ref:s,style:v},null,512),[[t.vShow,!p.value]]),t.createElementVNode("canvas",{id:"qrcode-stream-tracking-layer",ref_key:"trackingLayerRef",ref:l,style:g},null,512),t.createElementVNode("div",{style:g},[t.renderSlot(e.$slots,"default")])]))}}),Le=t.defineComponent({__name:"QrcodeCapture",props:{formats:{default:()=>["qr_code"]}},emits:["detect"],setup(e,{emit:n}){const a=e,i=n,o=e=>{if(e.target instanceof HTMLInputElement&&e.target.files)for(const t of Array.from(e.target.files))Y(t,a.formats).then(e=>{i("detect",e)})};return(e,n)=>(t.openBlock(),t.createElementBlock("input",{onChange:o,type:"file",name:"image",accept:"image/*",capture:"environment",multiple:""},null,32))}}),Me=t.defineComponent({__name:"QrcodeDropZone",props:{formats:{default:()=>["qr_code"]}},emits:["detect","dragover","error"],setup(e,{emit:n}){const a=e,i=n,o=async e=>{try{const t=await e;i("detect",t)}catch(e){i("error",e)}},r=e=>{i("dragover",e)},s=({dataTransfer:e})=>{if(!e)return;r(!1);const t=[...Array.from(e.files)],n=e.getData("text/uri-list");t.forEach(e=>{o(Y(e,a.formats))}),""!==n&&o(Q(n,a.formats))};return(e,n)=>(t.openBlock(),t.createElementBlock("div",{onDrop:t.withModifiers(s,["prevent","stop"]),onDragenter:n[0]||(n[0]=t.withModifiers(e=>r(!0),["prevent","stop"])),onDragleave:n[1]||(n[1]=t.withModifiers(e=>r(!1),["prevent","stop"])),onDragover:n[2]||(n[2]=t.withModifiers(()=>{},["prevent","stop"]))},[t.renderSlot(e.$slots,"default")],32))}});function Re(e){e.component("qrcode-stream",Ae),e.component("qrcode-capture",Le),e.component("qrcode-drop-zone",Me)}const ze={install:Re};e.QrcodeCapture=Le,e.QrcodeDropZone=Me,e.QrcodeStream=Ae,e.VueQrcodeReader=ze,e.install=Re,e.setZXingModuleOverrides=function(e){return function(e,t){z.set(e,{moduleOverrides:t})}(D,e)},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}), /*! * qrcode.vue v3.9.0 * A Vue.js component to generate QRCode. Both support Vue 2 and Vue 3 * © 2017-PRESENT @scopewu(https://github.com/scopewu) * MIT License. */ -function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).QrcodeVue={},e.Vue)}(this,function(e,t){"use strict";var n,a=function(){return a=Object.assign||function(e){for(var t,n=1,a=arguments.length;nt.MAX_VERSION)throw new RangeError("Version value out of range");if(r<-1||r>7)throw new RangeError("Mask value out of range");this.size=4*e+17;for(var o=[],s=0;s7)throw new RangeError("Invalid value");var c,d;for(c=o;;c++){var h=8*t.getNumDataCodewords(c,a),p=r.getTotalBits(e,c);if(p<=h){d=p;break}if(c>=s)throw new RangeError("Data too long")}for(var f=0,m=[t.Ecc.MEDIUM,t.Ecc.QUARTILE,t.Ecc.HIGH];f>>3]|=e<<7-(7&t)}),new t(c,a,T,l)},t.prototype.getModule=function(e,t){return 0<=e&&e>>9);var o=21522^(t<<10|n);i(o>>>15==0);for(r=0;r<=5;r++)this.setFunctionModule(8,r,a(o,r));this.setFunctionModule(8,7,a(o,6)),this.setFunctionModule(8,8,a(o,7)),this.setFunctionModule(7,8,a(o,8));for(r=9;r<15;r++)this.setFunctionModule(14-r,8,a(o,r));for(r=0;r<8;r++)this.setFunctionModule(this.size-1-r,8,a(o,r));for(r=8;r<15;r++)this.setFunctionModule(8,this.size-15+r,a(o,r));this.setFunctionModule(8,this.size-8,!0)},t.prototype.drawVersion=function(){if(!(this.version<7)){for(var e=this.version,t=0;t<12;t++)e=e<<1^7973*(e>>>11);var n=this.version<<12|e;i(n>>>18==0);for(t=0;t<18;t++){var r=a(n,t),o=this.size-11+t%3,s=Math.floor(t/3);this.setFunctionModule(o,s,r),this.setFunctionModule(s,o,r)}}},t.prototype.drawFinderPattern=function(e,t){for(var n=-4;n<=4;n++)for(var a=-4;a<=4;a++){var i=Math.max(Math.abs(a),Math.abs(n)),r=e+a,o=t+n;0<=r&&r=l)&&_.push(t[e])})};for(h=0;h=1;r-=2){6==r&&(r=5);for(var o=0;o>>3],7-(7&n)),n++)}}i(n==8*e.length)},t.prototype.applyMask=function(e){if(e<0||e>7)throw new RangeError("Mask value out of range");for(var t=0;t5&&e++:(this.finderPenaltyAddHistory(r,o),a||(e+=this.finderPenaltyCountPatterns(o)*t.PENALTY_N3),a=this.modules[n][s],r=1);e+=this.finderPenaltyTerminateAndCount(a,r,o)*t.PENALTY_N3}for(s=0;s5&&e++:(this.finderPenaltyAddHistory(l,o),a||(e+=this.finderPenaltyCountPatterns(o)*t.PENALTY_N3),a=this.modules[n][s],l=1);e+=this.finderPenaltyTerminateAndCount(a,l,o)*t.PENALTY_N3}for(n=0;nt.MAX_VERSION)throw new RangeError("Version number out of range");var n=(16*e+128)*e+64;if(e>=2){var a=Math.floor(e/7)+2;n-=(25*a-10)*a-55,e>=7&&(n-=36)}return i(208<=n&&n<=29648),n},t.getNumDataCodewords=function(e,n){return Math.floor(t.getNumRawDataModules(e)/8)-t.ECC_CODEWORDS_PER_BLOCK[n.ordinal][e]*t.NUM_ERROR_CORRECTION_BLOCKS[n.ordinal][e]},t.reedSolomonComputeDivisor=function(e){if(e<1||e>255)throw new RangeError("Degree out of range");for(var n=[],a=0;a>>8!=0||t>>>8!=0)throw new RangeError("Byte out of range");for(var n=0,a=7;a>=0;a--)n=n<<1^285*(n>>>7),n^=(t>>>a&1)*e;return i(n>>>8==0),n},t.prototype.finderPenaltyCountPatterns=function(e){var t=e[1];i(t<=3*this.size);var n=t>0&&e[2]==t&&e[3]==3*t&&e[4]==t&&e[5]==t;return(n&&e[0]>=4*t&&e[6]>=t?1:0)+(n&&e[6]>=4*t&&e[0]>=t?1:0)},t.prototype.finderPenaltyTerminateAndCount=function(e,t,n){return e&&(this.finderPenaltyAddHistory(t,n),t=0),t+=this.size,this.finderPenaltyAddHistory(t,n),this.finderPenaltyCountPatterns(n)},t.prototype.finderPenaltyAddHistory=function(e,t){0==t[0]&&(e+=this.size),t.pop(),t.unshift(e)},t.MIN_VERSION=1,t.MAX_VERSION=40,t.PENALTY_N1=3,t.PENALTY_N2=3,t.PENALTY_N3=40,t.PENALTY_N4=10,t.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],t.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],t}();function n(e,t,n){if(t<0||t>31||e>>>t!=0)throw new RangeError("Value out of range");for(var a=t-1;a>=0;a--)n.push(e>>>a&1)}function a(e,t){return!!(e>>>t&1)}function i(e){if(!e)throw new Error("Assertion error")}e.QrCode=t;var r=function(){function e(e,t,n){if(this.mode=e,this.numChars=t,this.bitData=n,t<0)throw new RangeError("Invalid argument");this.bitData=n.slice()}return e.makeBytes=function(t){for(var a=[],i=0,r=t;i=1<0&&e[t-1][n],i=t0&&e[t][n-1],o=n>>0}),a=t.computed(function(){var t=l(e.level)?e.level:"L";return i.QrCode.encodeText(e.value,o[t]).getModules()}),r=t.computed(function(){return a.value.length+2*n.value}),s=t.computed(function(){return e.radius>0?function(e,t,n){void 0===t&&(t=0),void 0===n&&(n=0);for(var a=[],i=Math.min(n,.5),r=0;r-1}},gradientStartColor:{type:String,required:!1,default:"#000"},gradientEndColor:{type:String,required:!1,default:"#fff"},radius:{type:Number,required:!1,default:0,validator:function(e){return!isNaN(e)&&e>=0&&e<=.5}}},h=a(a({},d),{renderAs:{type:String,required:!1,default:"canvas",validator:function(e){return["canvas","svg"].indexOf(e)>-1}}}),p=t.defineComponent({name:"QRCodeSvg",props:d,setup:function(e){var n=c(e),i=n.numCells,o=n.fgPath,s=n.imageProps,l=n.imageBorderProps,u="function"==typeof t.useId?"".concat(t.useId(),"-").concat(r++):"vue-".concat(Math.random().toString(36).slice(2),"-").concat(r++),d="qrcode.vue-gradient-".concat(u),h="qrcode.vue-logo-clip-path-".concat(u),p=t.computed(function(){if(!e.gradient)return null;var n="linear"===e.gradientType?{x1:"0%",y1:"0%",x2:"100%",y2:"100%"}:{cx:"50%",cy:"50%",r:"50%",fx:"50%",fy:"50%"};return t.h("linear"===e.gradientType?"linearGradient":"radialGradient",a({id:d},n),[t.h("stop",{offset:"0%",style:{stopColor:e.gradientStartColor}}),t.h("stop",{offset:"100%",style:{stopColor:e.gradientEndColor}})])}),f=t.computed(function(){if(!s.value)return null;var e=s.value.borderRadius;return e<=0?null:t.h("clipPath",{id:h},[t.h("rect",{x:s.value.x,y:s.value.y,width:s.value.width,height:s.value.height,rx:e,ry:e})])});return function(){return t.h("svg",{width:e.size,height:e.size,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(i.value," ").concat(i.value),role:"img","aria-label":e.value},[t.h("defs",{},[p.value,f.value]),t.h("rect",{width:"100%",height:"100%",fill:e.background}),t.h("path",{fill:e.gradient?"url(#".concat(d,")"):e.foreground,d:o.value}),l.value&&t.h("rect",{x:l.value.x,y:l.value.y,width:l.value.width,height:l.value.height,fill:e.background,rx:l.value.borderRadius,ry:l.value.borderRadius}),e.imageSettings.src&&s.value&&t.h("image",a(a({href:e.imageSettings.src},s.value),s.value.borderRadius>0?{"clip-path":"url(#".concat(h,")")}:{}))])}}}),f=t.defineComponent({name:"QRCodeCanvas",props:d,setup:function(e,n){var i=c(e),r=i.margin,o=i.cells,l=i.numCells,u=i.fgPath,d=i.imageProps,h=i.imageBorderProps,p=t.ref(null),f=t.ref(null),m=function(e,t,n,a,i,r){e.beginPath(),e.roundRect?e.roundRect(t,n,a,i,r):e.rect(t,n,a,i)},_=function(){var t=e.size,n=e.background,a=e.foreground,i=e.gradient,c=e.gradientType,_=e.gradientStartColor,g=e.gradientEndColor,v=p.value;if(v){var b=v.getContext("2d");if(b){var y=f.value,w="undefined"!=typeof window&&window.devicePixelRatio||1,k=t/l.value*w;if(v.height=v.width=t*w,b.setTransform(k,0,0,k,0,0),b.fillStyle=n,b.fillRect(0,0,l.value,l.value),i){var x=void 0;(x="linear"===c?b.createLinearGradient(0,0,l.value,l.value):b.createRadialGradient(l.value/2,l.value/2,0,l.value/2,l.value/2,l.value/2)).addColorStop(0,_),x.addColorStop(1,g),b.fillStyle=x}else b.fillStyle=a;if(s?b.fill(new Path2D(u.value)):o.value.forEach(function(e,t){e.forEach(function(e,n){e&&b.fillRect(n+r.value,t+r.value,1,1)})}),e.imageSettings.src&&y&&0!==y.naturalWidth&&0!==y.naturalHeight&&d.value){if(h.value){var S=h.value;b.fillStyle=e.background,m(b,S.x,S.y,S.width,S.height,S.borderRadius),b.fill()}var C=d.value.borderRadius;C>0?(b.save(),m(b,d.value.x,d.value.y,d.value.width,d.value.height,C),b.clip(),b.drawImage(y,d.value.x,d.value.y,d.value.width,d.value.height),b.restore()):b.drawImage(y,d.value.x,d.value.y,d.value.width,d.value.height)}}}};return t.onMounted(_),t.watchEffect(_),function(){return t.h(t.Fragment,[t.h("canvas",a(a({},n.attrs),{ref:p,role:"img","aria-label":e.value,style:a(a({},n.attrs.style),{width:"".concat(e.size,"px"),height:"".concat(e.size,"px")})})),e.imageSettings.src&&t.h("img",{ref:f,src:e.imageSettings.src,style:{display:"none"},onLoad:_})])}}}),m=t.defineComponent({name:"Qrcode",props:h,setup:function(e){return function(){return t.h("svg"===e.renderAs?p:f,{value:e.value,size:e.size,margin:e.margin,level:e.level,background:e.background,foreground:e.foreground,imageSettings:e.imageSettings,gradient:e.gradient,gradientType:e.gradientType,gradientStartColor:e.gradientStartColor,gradientEndColor:e.gradientEndColor,radius:e.radius})}}});e.QrcodeCanvas=f,e.QrcodeSvg=p,e.default=m,Object.defineProperty(e,"__esModule",{value:!0})}),function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Chart=t()}(this,function(){"use strict";var e=Object.freeze({__proto__:null,get Colors(){return zr},get Decimation(){return Or},get Filler(){return eo},get Legend(){return io},get SubTitle(){return lo},get Title(){return oo},get Tooltip(){return So}});function t(){}const n=(()=>{let e=0;return()=>e++})();function a(e){return null==e}function i(e){if(Array.isArray&&Array.isArray(e))return!0;const t=Object.prototype.toString.call(e);return"[object"===t.slice(0,7)&&"Array]"===t.slice(-6)}function r(e){return null!==e&&"[object Object]"===Object.prototype.toString.call(e)}function o(e){return("number"==typeof e||e instanceof Number)&&isFinite(+e)}function s(e,t){return o(e)?e:t}function l(e,t){return void 0===e?t:e}const u=(e,t)=>"string"==typeof e&&e.endsWith("%")?parseFloat(e)/100:+e/t,c=(e,t)=>"string"==typeof e&&e.endsWith("%")?parseFloat(e)/100*t:+e;function d(e,t,n){if(e&&"function"==typeof e.call)return e.apply(n,t)}function h(e,t,n,a){let o,s,l;if(i(e))if(s=e.length,a)for(o=s-1;o>=0;o--)t.call(n,e[o],o);else for(o=0;oe,x:e=>e.x,y:e=>e.y};function w(e){const t=e.split("."),n=[];let a="";for(const e of t)a+=e,a.endsWith("\\")?a=a.slice(0,-1)+".":(n.push(a),a="");return n}function k(e,t){const n=y[t]||(y[t]=function(e){const t=w(e);return e=>{for(const n of t){if(""===n)break;e=e&&e[n]}return e}}(t));return n(e)}function x(e){return e.charAt(0).toUpperCase()+e.slice(1)}const S=e=>void 0!==e,C=e=>"function"==typeof e,T=(e,t)=>{if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0};function P(e){return"mouseup"===e.type||"click"===e.type||"contextmenu"===e.type}const E=Math.PI,A=2*E,L=A+E,M=Number.POSITIVE_INFINITY,R=E/180,z=E/2,I=E/4,N=2*E/3,O=Math.log10,j=Math.sign;function D(e,t,n){return Math.abs(e-t)e-t).pop(),t}function F(e){return!function(e){return"symbol"==typeof e||"object"==typeof e&&null!==e&&!(Symbol.toPrimitive in e||"toString"in e||"valueOf"in e)}(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function V(e,t){const n=Math.round(e);return n-t<=e&&n+t>=e}function U(e,t,n){let a,i,r;for(a=0,i=e.length;al&&u=Math.min(t,n)-a&&e<=Math.max(t,n)+a}function te(e,t,n){n=n||(n=>e[n]1;)a=r+i>>1,n(a)?r=a:i=a;return{lo:r,hi:i}}const ne=(e,t,n,a)=>te(e,n,a?a=>{const i=e[a][t];return ie[a][t]te(e,n,a=>e[a][t]>=n);function ie(e,t,n){let a=0,i=e.length;for(;aa&&e[i-1]>n;)i--;return a>0||i{const n="_onData"+x(t),a=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){const i=a.apply(this,t);return e._chartjs.listeners.forEach(e=>{"function"==typeof e[n]&&e[n](...t)}),i}})}))}function se(e,t){const n=e._chartjs;if(!n)return;const a=n.listeners,i=a.indexOf(t);-1!==i&&a.splice(i,1),a.length>0||(re.forEach(t=>{delete e[t]}),delete e._chartjs)}function le(e){const t=new Set(e);return t.size===e.length?e:Array.from(t)}const ue="undefined"==typeof window?function(e){return e()}:window.requestAnimationFrame;function ce(e,t){let n=[],a=!1;return function(...i){n=i,a||(a=!0,ue.call(window,()=>{a=!1,e.apply(t,n)}))}}function de(e,t){let n;return function(...a){return t?(clearTimeout(n),n=setTimeout(e,t,a)):e.apply(this,a),t}}const he=e=>"start"===e?"left":"end"===e?"right":"center",pe=(e,t,n)=>"start"===e?t:"end"===e?n:(t+n)/2,fe=(e,t,n,a)=>e===(a?"left":"right")?n:"center"===e?(t+n)/2:t;function me(e,t,n){const i=t.length;let r=0,o=i;if(e._sorted){const{iScale:s,vScale:l,_parsed:u}=e,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,d=s.axis,{min:h,max:p,minDefined:f,maxDefined:m}=s.getUserBounds();if(f){if(r=Math.min(ne(u,d,h).lo,n?i:ne(t,d,s.getPixelForValue(h)).lo),c){const e=u.slice(0,r+1).reverse().findIndex(e=>!a(e[l.axis]));r-=Math.max(0,e)}r=J(r,0,i-1)}if(m){let e=Math.max(ne(u,s.axis,p,!0).hi+1,n?0:ne(t,d,s.getPixelForValue(p),!0).hi+1);if(c){const t=u.slice(e-1).findIndex(e=>!a(e[l.axis]));e+=Math.max(0,t)}o=J(e,r,i)-r}else o=i-r}return{start:r,count:o}}function _e(e){const{xScale:t,yScale:n,_scaleRanges:a}=e,i={xmin:t.min,xmax:t.max,ymin:n.min,ymax:n.max};if(!a)return e._scaleRanges=i,!0;const r=a.xmin!==t.min||a.xmax!==t.max||a.ymin!==n.min||a.ymax!==n.max;return Object.assign(a,i),r}var ge=new class{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(e,t,n,a){const i=t.listeners[a],r=t.duration;i.forEach(a=>a({chart:e,initial:t.initial,numSteps:r,currentStep:Math.min(n-t.start,r)}))}_refresh(){this._request||(this._running=!0,this._request=ue.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((n,a)=>{if(!n.running||!n.items.length)return;const i=n.items;let r,o=i.length-1,s=!1;for(;o>=0;--o)r=i[o],r._active?(r._total>n.duration&&(n.duration=r._total),r.tick(e),s=!0):(i[o]=i[i.length-1],i.pop());s&&(a.draw(),this._notify(a,n,e,"progress")),i.length||(n.running=!1,this._notify(a,n,e,"complete"),n.initial=!1),t+=i.length}),this._lastDate=e,0===t&&(this._running=!1)}_getAnims(e){const t=this._charts;let n=t.get(e);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,n)),n}listen(e,t,n){this._getAnims(e).listeners[t].push(n)}add(e,t){t&&t.length&&this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){const t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;const t=this._charts.get(e);return!!(t&&t.running&&t.items.length)}stop(e){const t=this._charts.get(e);if(!t||!t.items.length)return;const n=t.items;let a=n.length-1;for(;a>=0;--a)n[a].cancel();t.items=[],this._notify(e,t,Date.now(),"complete")}remove(e){return this._charts.delete(e)}}; +function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).QrcodeVue={},e.Vue)}(this,function(e,t){"use strict";var n,a=function(){return a=Object.assign||function(e){for(var t,n=1,a=arguments.length;nt.MAX_VERSION)throw new RangeError("Version value out of range");if(o<-1||o>7)throw new RangeError("Mask value out of range");this.size=4*e+17;for(var r=[],s=0;s7)throw new RangeError("Invalid value");var c,d;for(c=r;;c++){var h=8*t.getNumDataCodewords(c,a),p=o.getTotalBits(e,c);if(p<=h){d=p;break}if(c>=s)throw new RangeError("Data too long")}for(var f=0,m=[t.Ecc.MEDIUM,t.Ecc.QUARTILE,t.Ecc.HIGH];f>>3]|=e<<7-(7&t)}),new t(c,a,T,l)},t.prototype.getModule=function(e,t){return 0<=e&&e>>9);var r=21522^(t<<10|n);i(r>>>15==0);for(o=0;o<=5;o++)this.setFunctionModule(8,o,a(r,o));this.setFunctionModule(8,7,a(r,6)),this.setFunctionModule(8,8,a(r,7)),this.setFunctionModule(7,8,a(r,8));for(o=9;o<15;o++)this.setFunctionModule(14-o,8,a(r,o));for(o=0;o<8;o++)this.setFunctionModule(this.size-1-o,8,a(r,o));for(o=8;o<15;o++)this.setFunctionModule(8,this.size-15+o,a(r,o));this.setFunctionModule(8,this.size-8,!0)},t.prototype.drawVersion=function(){if(!(this.version<7)){for(var e=this.version,t=0;t<12;t++)e=e<<1^7973*(e>>>11);var n=this.version<<12|e;i(n>>>18==0);for(t=0;t<18;t++){var o=a(n,t),r=this.size-11+t%3,s=Math.floor(t/3);this.setFunctionModule(r,s,o),this.setFunctionModule(s,r,o)}}},t.prototype.drawFinderPattern=function(e,t){for(var n=-4;n<=4;n++)for(var a=-4;a<=4;a++){var i=Math.max(Math.abs(a),Math.abs(n)),o=e+a,r=t+n;0<=o&&o=l)&&_.push(t[e])})};for(h=0;h=1;o-=2){6==o&&(o=5);for(var r=0;r>>3],7-(7&n)),n++)}}i(n==8*e.length)},t.prototype.applyMask=function(e){if(e<0||e>7)throw new RangeError("Mask value out of range");for(var t=0;t5&&e++:(this.finderPenaltyAddHistory(o,r),a||(e+=this.finderPenaltyCountPatterns(r)*t.PENALTY_N3),a=this.modules[n][s],o=1);e+=this.finderPenaltyTerminateAndCount(a,o,r)*t.PENALTY_N3}for(s=0;s5&&e++:(this.finderPenaltyAddHistory(l,r),a||(e+=this.finderPenaltyCountPatterns(r)*t.PENALTY_N3),a=this.modules[n][s],l=1);e+=this.finderPenaltyTerminateAndCount(a,l,r)*t.PENALTY_N3}for(n=0;nt.MAX_VERSION)throw new RangeError("Version number out of range");var n=(16*e+128)*e+64;if(e>=2){var a=Math.floor(e/7)+2;n-=(25*a-10)*a-55,e>=7&&(n-=36)}return i(208<=n&&n<=29648),n},t.getNumDataCodewords=function(e,n){return Math.floor(t.getNumRawDataModules(e)/8)-t.ECC_CODEWORDS_PER_BLOCK[n.ordinal][e]*t.NUM_ERROR_CORRECTION_BLOCKS[n.ordinal][e]},t.reedSolomonComputeDivisor=function(e){if(e<1||e>255)throw new RangeError("Degree out of range");for(var n=[],a=0;a>>8!=0||t>>>8!=0)throw new RangeError("Byte out of range");for(var n=0,a=7;a>=0;a--)n=n<<1^285*(n>>>7),n^=(t>>>a&1)*e;return i(n>>>8==0),n},t.prototype.finderPenaltyCountPatterns=function(e){var t=e[1];i(t<=3*this.size);var n=t>0&&e[2]==t&&e[3]==3*t&&e[4]==t&&e[5]==t;return(n&&e[0]>=4*t&&e[6]>=t?1:0)+(n&&e[6]>=4*t&&e[0]>=t?1:0)},t.prototype.finderPenaltyTerminateAndCount=function(e,t,n){return e&&(this.finderPenaltyAddHistory(t,n),t=0),t+=this.size,this.finderPenaltyAddHistory(t,n),this.finderPenaltyCountPatterns(n)},t.prototype.finderPenaltyAddHistory=function(e,t){0==t[0]&&(e+=this.size),t.pop(),t.unshift(e)},t.MIN_VERSION=1,t.MAX_VERSION=40,t.PENALTY_N1=3,t.PENALTY_N2=3,t.PENALTY_N3=40,t.PENALTY_N4=10,t.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],t.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],t}();function n(e,t,n){if(t<0||t>31||e>>>t!=0)throw new RangeError("Value out of range");for(var a=t-1;a>=0;a--)n.push(e>>>a&1)}function a(e,t){return!!(e>>>t&1)}function i(e){if(!e)throw new Error("Assertion error")}e.QrCode=t;var o=function(){function e(e,t,n){if(this.mode=e,this.numChars=t,this.bitData=n,t<0)throw new RangeError("Invalid argument");this.bitData=n.slice()}return e.makeBytes=function(t){for(var a=[],i=0,o=t;i=1<0&&e[t-1][n],i=t0&&e[t][n-1],r=n>>0}),a=t.computed(function(){var t=l(e.level)?e.level:"L";return i.QrCode.encodeText(e.value,r[t]).getModules()}),o=t.computed(function(){return a.value.length+2*n.value}),s=t.computed(function(){return e.radius>0?function(e,t,n){void 0===t&&(t=0),void 0===n&&(n=0);for(var a=[],i=Math.min(n,.5),o=0;o-1}},gradientStartColor:{type:String,required:!1,default:"#000"},gradientEndColor:{type:String,required:!1,default:"#fff"},radius:{type:Number,required:!1,default:0,validator:function(e){return!isNaN(e)&&e>=0&&e<=.5}}},h=a(a({},d),{renderAs:{type:String,required:!1,default:"canvas",validator:function(e){return["canvas","svg"].indexOf(e)>-1}}}),p=t.defineComponent({name:"QRCodeSvg",props:d,setup:function(e){var n=c(e),i=n.numCells,r=n.fgPath,s=n.imageProps,l=n.imageBorderProps,u="function"==typeof t.useId?"".concat(t.useId(),"-").concat(o++):"vue-".concat(Math.random().toString(36).slice(2),"-").concat(o++),d="qrcode.vue-gradient-".concat(u),h="qrcode.vue-logo-clip-path-".concat(u),p=t.computed(function(){if(!e.gradient)return null;var n="linear"===e.gradientType?{x1:"0%",y1:"0%",x2:"100%",y2:"100%"}:{cx:"50%",cy:"50%",r:"50%",fx:"50%",fy:"50%"};return t.h("linear"===e.gradientType?"linearGradient":"radialGradient",a({id:d},n),[t.h("stop",{offset:"0%",style:{stopColor:e.gradientStartColor}}),t.h("stop",{offset:"100%",style:{stopColor:e.gradientEndColor}})])}),f=t.computed(function(){if(!s.value)return null;var e=s.value.borderRadius;return e<=0?null:t.h("clipPath",{id:h},[t.h("rect",{x:s.value.x,y:s.value.y,width:s.value.width,height:s.value.height,rx:e,ry:e})])});return function(){return t.h("svg",{width:e.size,height:e.size,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(i.value," ").concat(i.value),role:"img","aria-label":e.value},[t.h("defs",{},[p.value,f.value]),t.h("rect",{width:"100%",height:"100%",fill:e.background}),t.h("path",{fill:e.gradient?"url(#".concat(d,")"):e.foreground,d:r.value}),l.value&&t.h("rect",{x:l.value.x,y:l.value.y,width:l.value.width,height:l.value.height,fill:e.background,rx:l.value.borderRadius,ry:l.value.borderRadius}),e.imageSettings.src&&s.value&&t.h("image",a(a({href:e.imageSettings.src},s.value),s.value.borderRadius>0?{"clip-path":"url(#".concat(h,")")}:{}))])}}}),f=t.defineComponent({name:"QRCodeCanvas",props:d,setup:function(e,n){var i=c(e),o=i.margin,r=i.cells,l=i.numCells,u=i.fgPath,d=i.imageProps,h=i.imageBorderProps,p=t.ref(null),f=t.ref(null),m=function(e,t,n,a,i,o){e.beginPath(),e.roundRect?e.roundRect(t,n,a,i,o):e.rect(t,n,a,i)},_=function(){var t=e.size,n=e.background,a=e.foreground,i=e.gradient,c=e.gradientType,_=e.gradientStartColor,g=e.gradientEndColor,v=p.value;if(v){var b=v.getContext("2d");if(b){var y=f.value,w="undefined"!=typeof window&&window.devicePixelRatio||1,k=t/l.value*w;if(v.height=v.width=t*w,b.setTransform(k,0,0,k,0,0),b.fillStyle=n,b.fillRect(0,0,l.value,l.value),i){var x=void 0;(x="linear"===c?b.createLinearGradient(0,0,l.value,l.value):b.createRadialGradient(l.value/2,l.value/2,0,l.value/2,l.value/2,l.value/2)).addColorStop(0,_),x.addColorStop(1,g),b.fillStyle=x}else b.fillStyle=a;if(s?b.fill(new Path2D(u.value)):r.value.forEach(function(e,t){e.forEach(function(e,n){e&&b.fillRect(n+o.value,t+o.value,1,1)})}),e.imageSettings.src&&y&&0!==y.naturalWidth&&0!==y.naturalHeight&&d.value){if(h.value){var S=h.value;b.fillStyle=e.background,m(b,S.x,S.y,S.width,S.height,S.borderRadius),b.fill()}var C=d.value.borderRadius;C>0?(b.save(),m(b,d.value.x,d.value.y,d.value.width,d.value.height,C),b.clip(),b.drawImage(y,d.value.x,d.value.y,d.value.width,d.value.height),b.restore()):b.drawImage(y,d.value.x,d.value.y,d.value.width,d.value.height)}}}};return t.onMounted(_),t.watchEffect(_),function(){return t.h(t.Fragment,[t.h("canvas",a(a({},n.attrs),{ref:p,role:"img","aria-label":e.value,style:a(a({},n.attrs.style),{width:"".concat(e.size,"px"),height:"".concat(e.size,"px")})})),e.imageSettings.src&&t.h("img",{ref:f,src:e.imageSettings.src,style:{display:"none"},onLoad:_})])}}}),m=t.defineComponent({name:"Qrcode",props:h,setup:function(e){return function(){return t.h("svg"===e.renderAs?p:f,{value:e.value,size:e.size,margin:e.margin,level:e.level,background:e.background,foreground:e.foreground,imageSettings:e.imageSettings,gradient:e.gradient,gradientType:e.gradientType,gradientStartColor:e.gradientStartColor,gradientEndColor:e.gradientEndColor,radius:e.radius})}}});e.QrcodeCanvas=f,e.QrcodeSvg=p,e.default=m,Object.defineProperty(e,"__esModule",{value:!0})}),function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Chart=t()}(this,function(){"use strict";var e=Object.freeze({__proto__:null,get Colors(){return Oo},get Decimation(){return Do},get Filler(){return tr},get Legend(){return or},get SubTitle(){return ur},get Title(){return sr},get Tooltip(){return Sr}});function t(){}const n=(()=>{let e=0;return()=>e++})();function a(e){return null==e}function i(e){if(Array.isArray&&Array.isArray(e))return!0;const t=Object.prototype.toString.call(e);return"[object"===t.slice(0,7)&&"Array]"===t.slice(-6)}function o(e){return null!==e&&"[object Object]"===Object.prototype.toString.call(e)}function r(e){return("number"==typeof e||e instanceof Number)&&isFinite(+e)}function s(e,t){return r(e)?e:t}function l(e,t){return void 0===e?t:e}const u=(e,t)=>"string"==typeof e&&e.endsWith("%")?parseFloat(e)/100:+e/t,c=(e,t)=>"string"==typeof e&&e.endsWith("%")?parseFloat(e)/100*t:+e;function d(e,t,n){if(e&&"function"==typeof e.call)return e.apply(n,t)}function h(e,t,n,a){let r,s,l;if(i(e))if(s=e.length,a)for(r=s-1;r>=0;r--)t.call(n,e[r],r);else for(r=0;re,x:e=>e.x,y:e=>e.y};function w(e){const t=e.split("."),n=[];let a="";for(const e of t)a+=e,a.endsWith("\\")?a=a.slice(0,-1)+".":(n.push(a),a="");return n}function k(e,t){const n=y[t]||(y[t]=function(e){const t=w(e);return e=>{for(const n of t){if(""===n)break;e=e&&e[n]}return e}}(t));return n(e)}function x(e){return e.charAt(0).toUpperCase()+e.slice(1)}const S=e=>void 0!==e,C=e=>"function"==typeof e,T=(e,t)=>{if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0};function P(e){return"mouseup"===e.type||"click"===e.type||"contextmenu"===e.type}const E=Math.PI,A=2*E,L=A+E,M=Number.POSITIVE_INFINITY,R=E/180,z=E/2,O=E/4,I=2*E/3,N=Math.log10,D=Math.sign;function q(e,t,n){return Math.abs(e-t)e-t).pop(),t}function F(e){return!function(e){return"symbol"==typeof e||"object"==typeof e&&null!==e&&!(Symbol.toPrimitive in e||"toString"in e||"valueOf"in e)}(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function $(e,t){const n=Math.round(e);return n-t<=e&&n+t>=e}function V(e,t,n){let a,i,o;for(a=0,i=e.length;al&&u=Math.min(t,n)-a&&e<=Math.max(t,n)+a}function te(e,t,n){n=n||(n=>e[n]1;)a=o+i>>1,n(a)?o=a:i=a;return{lo:o,hi:i}}const ne=(e,t,n,a)=>te(e,n,a?a=>{const i=e[a][t];return ie[a][t]te(e,n,a=>e[a][t]>=n);function ie(e,t,n){let a=0,i=e.length;for(;aa&&e[i-1]>n;)i--;return a>0||i{const n="_onData"+x(t),a=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){const i=a.apply(this,t);return e._chartjs.listeners.forEach(e=>{"function"==typeof e[n]&&e[n](...t)}),i}})}))}function se(e,t){const n=e._chartjs;if(!n)return;const a=n.listeners,i=a.indexOf(t);-1!==i&&a.splice(i,1),a.length>0||(oe.forEach(t=>{delete e[t]}),delete e._chartjs)}function le(e){const t=new Set(e);return t.size===e.length?e:Array.from(t)}const ue="undefined"==typeof window?function(e){return e()}:window.requestAnimationFrame;function ce(e,t){let n=[],a=!1;return function(...i){n=i,a||(a=!0,ue.call(window,()=>{a=!1,e.apply(t,n)}))}}function de(e,t){let n;return function(...a){return t?(clearTimeout(n),n=setTimeout(e,t,a)):e.apply(this,a),t}}const he=e=>"start"===e?"left":"end"===e?"right":"center",pe=(e,t,n)=>"start"===e?t:"end"===e?n:(t+n)/2,fe=(e,t,n,a)=>e===(a?"left":"right")?n:"center"===e?(t+n)/2:t;function me(e,t,n){const i=t.length;let o=0,r=i;if(e._sorted){const{iScale:s,vScale:l,_parsed:u}=e,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,d=s.axis,{min:h,max:p,minDefined:f,maxDefined:m}=s.getUserBounds();if(f){if(o=Math.min(ne(u,d,h).lo,n?i:ne(t,d,s.getPixelForValue(h)).lo),c){const e=u.slice(0,o+1).reverse().findIndex(e=>!a(e[l.axis]));o-=Math.max(0,e)}o=J(o,0,i-1)}if(m){let e=Math.max(ne(u,s.axis,p,!0).hi+1,n?0:ne(t,d,s.getPixelForValue(p),!0).hi+1);if(c){const t=u.slice(e-1).findIndex(e=>!a(e[l.axis]));e+=Math.max(0,t)}r=J(e,o,i)-o}else r=i-o}return{start:o,count:r}}function _e(e){const{xScale:t,yScale:n,_scaleRanges:a}=e,i={xmin:t.min,xmax:t.max,ymin:n.min,ymax:n.max};if(!a)return e._scaleRanges=i,!0;const o=a.xmin!==t.min||a.xmax!==t.max||a.ymin!==n.min||a.ymax!==n.max;return Object.assign(a,i),o}var ge=new class{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(e,t,n,a){const i=t.listeners[a],o=t.duration;i.forEach(a=>a({chart:e,initial:t.initial,numSteps:o,currentStep:Math.min(n-t.start,o)}))}_refresh(){this._request||(this._running=!0,this._request=ue.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((n,a)=>{if(!n.running||!n.items.length)return;const i=n.items;let o,r=i.length-1,s=!1;for(;r>=0;--r)o=i[r],o._active?(o._total>n.duration&&(n.duration=o._total),o.tick(e),s=!0):(i[r]=i[i.length-1],i.pop());s&&(a.draw(),this._notify(a,n,e,"progress")),i.length||(n.running=!1,this._notify(a,n,e,"complete"),n.initial=!1),t+=i.length}),this._lastDate=e,0===t&&(this._running=!1)}_getAnims(e){const t=this._charts;let n=t.get(e);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,n)),n}listen(e,t,n){this._getAnims(e).listeners[t].push(n)}add(e,t){t&&t.length&&this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){const t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;const t=this._charts.get(e);return!!(t&&t.running&&t.items.length)}stop(e){const t=this._charts.get(e);if(!t||!t.items.length)return;const n=t.items;let a=n.length-1;for(;a>=0;--a)n[a].cancel();t.items=[],this._notify(e,t,Date.now(),"complete")}remove(e){return this._charts.delete(e)}}; /*! * @kurkle/color v0.3.2 * https://github.com/kurkle/color#readme * (c) 2023 Jukka Kurkela * Released under the MIT License - */function ve(e){return e+.5|0}const be=(e,t,n)=>Math.max(Math.min(e,n),t);function ye(e){return be(ve(2.55*e),0,255)}function we(e){return be(ve(255*e),0,255)}function ke(e){return be(ve(e/2.55)/100,0,1)}function xe(e){return be(ve(100*e),0,100)}const Se={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Ce=[..."0123456789ABCDEF"],Te=e=>Ce[15&e],Pe=e=>Ce[(240&e)>>4]+Ce[15&e],Ee=e=>(240&e)>>4==(15&e);const Ae=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Le(e,t,n){const a=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-a*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function Me(e,t,n){const a=(a,i=(a+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[a(5),a(3),a(1)]}function Re(e,t,n){const a=Le(e,1,.5);let i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)a[i]*=1-t-n,a[i]+=t;return a}function ze(e){const t=e.r/255,n=e.g/255,a=e.b/255,i=Math.max(t,n,a),r=Math.min(t,n,a),o=(i+r)/2;let s,l,u;return i!==r&&(u=i-r,l=o>.5?u/(2-i-r):u/(i+r),s=function(e,t,n,a,i){return e===i?(t-n)/a+(te<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055,Ve=e=>e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4);function Ue(e,t,n){if(e){let a=ze(e);a[t]=Math.max(0,Math.min(a[t]+a[t]*n,0===t?360:1)),a=Ne(a),e.r=a[0],e.g=a[1],e.b=a[2]}}function $e(e,t){return e?Object.assign(t||{},e):e}function He(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=we(e[3]))):(t=$e(e,{r:0,g:0,b:0,a:1})).a=we(t.a),t}function We(e){return"r"===e.charAt(0)?function(e){const t=Be.exec(e);let n,a,i,r=255;if(t){if(t[7]!==n){const e=+t[7];r=t[8]?ye(e):be(255*e,0,255)}return n=+t[1],a=+t[3],i=+t[5],n=255&(t[2]?ye(n):be(n,0,255)),a=255&(t[4]?ye(a):be(a,0,255)),i=255&(t[6]?ye(i):be(i,0,255)),{r:n,g:a,b:i,a:r}}}(e):function(e){const t=Ae.exec(e);let n,a=255;if(!t)return;t[5]!==n&&(a=t[6]?ye(+t[5]):we(+t[5]));const i=Oe(+t[2]),r=+t[3]/100,o=+t[4]/100;return n="hwb"===t[1]?function(e,t,n){return Ie(Re,e,t,n)}(i,r,o):"hsv"===t[1]?function(e,t,n){return Ie(Me,e,t,n)}(i,r,o):Ne(i,r,o),{r:n[0],g:n[1],b:n[2],a:a}}(e)}class Ge{constructor(e){if(e instanceof Ge)return e;const t=typeof e;let n;var a,i,r;"object"===t?n=He(e):"string"===t&&(r=(a=e).length,"#"===a[0]&&(4===r||5===r?i={r:255&17*Se[a[1]],g:255&17*Se[a[2]],b:255&17*Se[a[3]],a:5===r?17*Se[a[4]]:255}:7!==r&&9!==r||(i={r:Se[a[1]]<<4|Se[a[2]],g:Se[a[3]]<<4|Se[a[4]],b:Se[a[5]]<<4|Se[a[6]],a:9===r?Se[a[7]]<<4|Se[a[8]]:255})),n=i||function(e){qe||(qe=function(){const e={},t=Object.keys(De),n=Object.keys(je);let a,i,r,o,s;for(a=0;a>16&255,r>>8&255,255&r]}return e}(),qe.transparent=[0,0,0,0]);const t=qe[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:4===t.length?t[3]:255}}(e)||We(e)),this._rgb=n,this._valid=!!n}get valid(){return this._valid}get rgb(){var e=$e(this._rgb);return e&&(e.a=ke(e.a)),e}set rgb(e){this._rgb=He(e)}rgbString(){return this._valid?(e=this._rgb)&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${ke(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`):void 0;var e}hexString(){return this._valid?function(e){var t=(e=>Ee(e.r)&&Ee(e.g)&&Ee(e.b)&&Ee(e.a))(e)?Te:Pe;return e?"#"+t(e.r)+t(e.g)+t(e.b)+((e,t)=>e<255?t(e):"")(e.a,t):void 0}(this._rgb):void 0}hslString(){return this._valid?function(e){if(!e)return;const t=ze(e),n=t[0],a=xe(t[1]),i=xe(t[2]);return e.a<255?`hsla(${n}, ${a}%, ${i}%, ${ke(e.a)})`:`hsl(${n}, ${a}%, ${i}%)`}(this._rgb):void 0}mix(e,t){if(e){const n=this.rgb,a=e.rgb;let i;const r=t===i?.5:t,o=2*r-1,s=n.a-a.a,l=((o*s==-1?o:(o+s)/(1+o*s))+1)/2;i=1-l,n.r=255&l*n.r+i*a.r+.5,n.g=255&l*n.g+i*a.g+.5,n.b=255&l*n.b+i*a.b+.5,n.a=r*n.a+(1-r)*a.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=function(e,t,n){const a=Ve(ke(e.r)),i=Ve(ke(e.g)),r=Ve(ke(e.b));return{r:we(Fe(a+n*(Ve(ke(t.r))-a))),g:we(Fe(i+n*(Ve(ke(t.g))-i))),b:we(Fe(r+n*(Ve(ke(t.b))-r))),a:e.a+n*(t.a-e.a)}}(this._rgb,e._rgb,t)),this}clone(){return new Ge(this.rgb)}alpha(e){return this._rgb.a=we(e),this}clearer(e){return this._rgb.a*=1-e,this}greyscale(){const e=this._rgb,t=ve(.3*e.r+.59*e.g+.11*e.b);return e.r=e.g=e.b=t,this}opaquer(e){return this._rgb.a*=1+e,this}negate(){const e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return Ue(this._rgb,2,e),this}darken(e){return Ue(this._rgb,2,-e),this}saturate(e){return Ue(this._rgb,1,e),this}desaturate(e){return Ue(this._rgb,1,-e),this}rotate(e){return function(e,t){var n=ze(e);n[0]=Oe(n[0]+t),n=Ne(n),e.r=n[0],e.g=n[1],e.b=n[2]}(this._rgb,e),this}}function Ke(e){if(e&&"object"==typeof e){const t=e.toString();return"[object CanvasPattern]"===t||"[object CanvasGradient]"===t}return!1}function Ye(e){return Ke(e)?e:new Ge(e)}function Qe(e){return Ke(e)?e:new Ge(e).saturate(.5).darken(.1).hexString()}const Ze=["x","y","borderWidth","radius","tension"],Je=["color","borderColor","backgroundColor"],Xe=new Map;function et(e,t,n){return function(e,t){t=t||{};const n=e+JSON.stringify(t);let a=Xe.get(n);return a||(a=new Intl.NumberFormat(e,t),Xe.set(n,a)),a}(t,n).format(e)}const tt={values:e=>i(e)?e:""+e,numeric(e,t,n){if(0===e)return"0";const a=this.chart.options.locale;let i,r=e;if(n.length>1){const t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>1e15)&&(i="scientific"),r=function(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}(e,n)}const o=O(Math.abs(r)),s=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),l={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(l,this.options.ticks.format),et(e,a,l)},logarithmic(e,t,n){if(0===e)return"0";const a=n[t].significand||e/Math.pow(10,Math.floor(O(e)));return[1,2,3,5,10,15].includes(a)||t>.8*n.length?tt.numeric.call(this,e,t,n):""}};var nt={formatters:tt};const at=Object.create(null),it=Object.create(null);function rt(e,t){if(!t)return e;const n=t.split(".");for(let t=0,a=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>Qe(t.backgroundColor),this.hoverBorderColor=(e,t)=>Qe(t.borderColor),this.hoverColor=(e,t)=>Qe(t.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return ot(this,e,t)}get(e){return rt(this,e)}describe(e,t){return ot(it,e,t)}override(e,t){return ot(at,e,t)}route(e,t,n,a){const i=rt(this,e),o=rt(this,n),s="_"+t;Object.defineProperties(i,{[s]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){const e=this[s],t=o[a];return r(e)?Object.assign({},t,e):l(e,t)},set(e){this[s]=e}}})}apply(e){e.forEach(e=>e(this))}}({_scriptable:e=>!e.startsWith("on"),_indexable:e=>"events"!==e,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(e){e.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:e=>"onProgress"!==e&&"onComplete"!==e&&"fn"!==e}),e.set("animations",{colors:{type:"color",properties:Je},numbers:{type:"number",properties:Ze}}),e.describe("animations",{_fallback:"animation"}),e.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:e=>0|e}}}})},function(e){e.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(e){e.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:nt.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),e.route("scale.ticks","color","","color"),e.route("scale.grid","color","","borderColor"),e.route("scale.border","color","","borderColor"),e.route("scale.title","color","","color"),e.describe("scale",{_fallback:!1,_scriptable:e=>!e.startsWith("before")&&!e.startsWith("after")&&"callback"!==e&&"parser"!==e,_indexable:e=>"borderDash"!==e&&"tickBorderDash"!==e&&"dash"!==e}),e.describe("scales",{_fallback:"scale"}),e.describe("scale.ticks",{_scriptable:e=>"backdropPadding"!==e&&"callback"!==e,_indexable:e=>"backdropPadding"!==e})}]);function lt(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ut(e){let t=e.parentNode;return t&&"[object ShadowRoot]"===t.toString()&&(t=t.host),t}function ct(e,t,n){let a;return"string"==typeof e?(a=parseInt(e,10),-1!==e.indexOf("%")&&(a=a/100*t.parentNode[n])):a=e,a}const dt=e=>e.ownerDocument.defaultView.getComputedStyle(e,null);function ht(e,t){return dt(e).getPropertyValue(t)}const pt=["top","right","bottom","left"];function ft(e,t,n){const a={};n=n?"-"+n:"";for(let i=0;i<4;i++){const r=pt[i];a[r]=parseFloat(e[t+"-"+r+n])||0}return a.width=a.left+a.right,a.height=a.top+a.bottom,a}function mt(e,t){if("native"in e)return e;const{canvas:n,currentDevicePixelRatio:a}=t,i=dt(n),r="border-box"===i.boxSizing,o=ft(i,"padding"),s=ft(i,"border","width"),{x:l,y:u,box:c}=function(e,t){const n=e.touches,a=n&&n.length?n[0]:e,{offsetX:i,offsetY:r}=a;let o,s,l=!1;if(((e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot))(i,r,e.target))o=i,s=r;else{const e=t.getBoundingClientRect();o=a.clientX-e.left,s=a.clientY-e.top,l=!0}return{x:o,y:s,box:l}}(e,n),d=o.left+(c&&s.left),h=o.top+(c&&s.top);let{width:p,height:f}=t;return r&&(p-=o.width+s.width,f-=o.height+s.height),{x:Math.round((l-d)/p*n.width/a),y:Math.round((u-h)/f*n.height/a)}}const _t=e=>Math.round(10*e)/10;function gt(e,t,n,a){const i=dt(e),r=ft(i,"margin"),o=ct(i.maxWidth,e,"clientWidth")||M,s=ct(i.maxHeight,e,"clientHeight")||M,l=function(e,t,n){let a,i;if(void 0===t||void 0===n){const r=e&&ut(e);if(r){const e=r.getBoundingClientRect(),o=dt(r),s=ft(o,"border","width"),l=ft(o,"padding");t=e.width-l.width-s.width,n=e.height-l.height-s.height,a=ct(o.maxWidth,r,"clientWidth"),i=ct(o.maxHeight,r,"clientHeight")}else t=e.clientWidth,n=e.clientHeight}return{width:t,height:n,maxWidth:a||M,maxHeight:i||M}}(e,t,n);let{width:u,height:c}=l;if("content-box"===i.boxSizing){const e=ft(i,"border","width"),t=ft(i,"padding");u-=t.width+e.width,c-=t.height+e.height}return u=Math.max(0,u-r.width),c=Math.max(0,a?u/a:c-r.height),u=_t(Math.min(u,o,l.maxWidth)),c=_t(Math.min(c,s,l.maxHeight)),u&&!c&&(c=_t(u/2)),(void 0!==t||void 0!==n)&&a&&l.height&&c>l.height&&(c=l.height,u=_t(Math.floor(c*a))),{width:u,height:c}}function vt(e,t,n){const a=t||1,i=_t(e.height*a),r=_t(e.width*a);e.height=_t(e.height),e.width=_t(e.width);const o=e.canvas;return o.style&&(n||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`),(e.currentDevicePixelRatio!==a||o.height!==i||o.width!==r)&&(e.currentDevicePixelRatio=a,o.height=i,o.width=r,e.ctx.setTransform(a,0,0,a,0,0),!0)}const bt=function(){let e=!1;try{const t={get passive(){return e=!0,!1}};lt()&&(window.addEventListener("test",null,t),window.removeEventListener("test",null,t))}catch(e){}return e}();function yt(e,t){const n=ht(e,t),a=n&&n.match(/^(\d+)(\.\d+)?px$/);return a?+a[1]:void 0}function wt(e){return!e||a(e.size)||a(e.family)?null:(e.style?e.style+" ":"")+(e.weight?e.weight+" ":"")+e.size+"px "+e.family}function kt(e,t,n,a,i){let r=t[i];return r||(r=t[i]=e.measureText(i).width,n.push(i)),r>a&&(a=r),a}function xt(e,t,n,a){let r=(a=a||{}).data=a.data||{},o=a.garbageCollect=a.garbageCollect||[];a.font!==t&&(r=a.data={},o=a.garbageCollect=[],a.font=t),e.save(),e.font=t;let s=0;const l=n.length;let u,c,d,h,p;for(u=0;un.length){for(u=0;u0&&e.stroke()}}function Et(e,t,n){return n=n||.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&""!==s.strokeColor;let c,d;for(e.save(),e.font=o.string,function(e,t){t.translation&&e.translate(t.translation[0],t.translation[1]),a(t.rotation)||e.rotate(t.rotation),t.color&&(e.fillStyle=t.color),t.textAlign&&(e.textAlign=t.textAlign),t.textBaseline&&(e.textBaseline=t.textBaseline)}(e,s),c=0;ce[0]){const r=n||e;void 0===a&&(a=Kt("_fallback",e));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:e,_rootScopes:r,_fallback:a,_getTarget:i,override:n=>jt([n,...e],t,r,a)};return new Proxy(o,{deleteProperty:(t,n)=>(delete t[n],delete t._keys,delete e[0][n],!0),get:(n,a)=>Vt(n,a,()=>function(e,t,n,a){let i;for(const r of t)if(i=Kt(Bt(r,e),n),void 0!==i)return Ft(e,i)?Wt(n,a,e,i):i}(a,t,e,n)),getOwnPropertyDescriptor:(e,t)=>Reflect.getOwnPropertyDescriptor(e._scopes[0],t),getPrototypeOf:()=>Reflect.getPrototypeOf(e[0]),has:(e,t)=>Yt(e).includes(t),ownKeys:e=>Yt(e),set(e,t,n){const a=e._storage||(e._storage=i());return e[t]=a[t]=n,delete e._keys,!0}})}function Dt(e,t,n,a){const o={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:qt(e,a),setContext:t=>Dt(e,t,n,a),override:i=>Dt(e.override(i),t,n,a)};return new Proxy(o,{deleteProperty:(t,n)=>(delete t[n],delete e[n],!0),get:(e,t,n)=>Vt(e,t,()=>function(e,t,n){const{_proxy:a,_context:o,_subProxy:s,_descriptors:l}=e;let u=a[t];return C(u)&&l.isScriptable(t)&&(u=function(e,t,n,a){const{_proxy:i,_context:r,_subProxy:o,_stack:s}=n;if(s.has(e))throw new Error("Recursion detected: "+Array.from(s).join("->")+"->"+e);s.add(e);let l=t(r,o||a);return s.delete(e),Ft(e,l)&&(l=Wt(i._scopes,i,e,l)),l}(t,u,e,n)),i(u)&&u.length&&(u=function(e,t,n,a){const{_proxy:i,_context:o,_subProxy:s,_descriptors:l}=n;if(void 0!==o.index&&a(e))return t[o.index%t.length];if(r(t[0])){const n=t,a=i._scopes.filter(e=>e!==n);t=[];for(const r of n){const n=Wt(a,i,e,r);t.push(Dt(n,o,s&&s[e],l))}}return t}(t,u,e,l.isIndexable)),Ft(t,u)&&(u=Dt(u,o,s&&s[t],l)),u}(e,t,n)),getOwnPropertyDescriptor:(t,n)=>t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n),getPrototypeOf:()=>Reflect.getPrototypeOf(e),has:(t,n)=>Reflect.has(e,n),ownKeys:()=>Reflect.ownKeys(e),set:(t,n,a)=>(e[n]=a,delete t[n],!0)})}function qt(e,t={scriptable:!0,indexable:!0}){const{_scriptable:n=t.scriptable,_indexable:a=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:a,isScriptable:C(n)?n:()=>n,isIndexable:C(a)?a:()=>a}}const Bt=(e,t)=>e?e+x(t):t,Ft=(e,t)=>r(t)&&"adapters"!==e&&(null===Object.getPrototypeOf(t)||t.constructor===Object);function Vt(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||"constructor"===t)return e[t];const a=n();return e[t]=a,a}function Ut(e,t,n){return C(e)?e(t,n):e}const $t=(e,t)=>!0===e?t:"string"==typeof e?k(t,e):void 0;function Ht(e,t,n,a,i){for(const r of t){const t=$t(n,r);if(t){e.add(t);const r=Ut(t._fallback,n,i);if(void 0!==r&&r!==n&&r!==a)return r}else if(!1===t&&void 0!==a&&n!==a)return null}return!1}function Wt(e,t,n,a){const o=t._rootScopes,s=Ut(t._fallback,n,a),l=[...e,...o],u=new Set;u.add(a);let c=Gt(u,l,n,s||n,a);return null!==c&&(void 0===s||s===n||(c=Gt(u,l,s,c,a),null!==c))&&jt(Array.from(u),[""],o,s,()=>function(e,t,n){const a=e._getTarget();t in a||(a[t]={});const o=a[t];return i(o)&&r(n)?n:o||{}}(t,n,a))}function Gt(e,t,n,a,i){for(;n;)n=Ht(e,t,n,a,i);return n}function Kt(e,t){for(const n of t){if(!n)continue;const t=n[e];if(void 0!==t)return t}}function Yt(e){let t=e._keys;return t||(t=e._keys=function(e){const t=new Set;for(const n of e)for(const e of Object.keys(n).filter(e=>!e.startsWith("_")))t.add(e);return Array.from(t)}(e._scopes)),t}function Qt(e,t,n,a){const{iScale:i}=e,{key:r="r"}=this._parsing,o=new Array(a);let s,l,u,c;for(s=0,l=a;st"x"===e?"y":"x";function en(e,t,n,a){const i=e.skip?t:e,r=t,o=n.skip?t:n,s=K(r,i),l=K(o,r);let u=s/(s+l),c=l/(s+l);u=isNaN(u)?0:u,c=isNaN(c)?0:c;const d=a*u,h=a*c;return{previous:{x:r.x-d*(o.x-i.x),y:r.y-d*(o.y-i.y)},next:{x:r.x+h*(o.x-i.x),y:r.y+h*(o.y-i.y)}}}function tn(e,t="x"){const n=Xt(t),a=e.length,i=Array(a).fill(0),r=Array(a);let o,s,l,u=Jt(e,0);for(o=0;o!e.skip)),"monotone"===t.cubicInterpolationMode)tn(e,i);else{let n=a?e[e.length-1]:e[0];for(r=0,o=e.length;r0===e||1===e,on=(e,t,n)=>-Math.pow(2,10*(e-=1))*Math.sin((e-t)*A/n),sn=(e,t,n)=>Math.pow(2,-10*e)*Math.sin((e-t)*A/n)+1,ln={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>(e-=1)*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-((e-=1)*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>(e-=1)*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>1-Math.cos(e*z),easeOutSine:e=>Math.sin(e*z),easeInOutSine:e=>-.5*(Math.cos(E*e)-1),easeInExpo:e=>0===e?0:Math.pow(2,10*(e-1)),easeOutExpo:e=>1===e?1:1-Math.pow(2,-10*e),easeInOutExpo:e=>rn(e)?e:e<.5?.5*Math.pow(2,10*(2*e-1)):.5*(2-Math.pow(2,-10*(2*e-1))),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1-(e-=1)*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>rn(e)?e:on(e,.075,.3),easeOutElastic:e=>rn(e)?e:sn(e,.075,.3),easeInOutElastic(e){const t=.1125;return rn(e)?e:e<.5?.5*on(2*e,t,.45):.5+.5*sn(2*e-1,t,.45)},easeInBack(e){const t=1.70158;return e*e*((t+1)*e-t)},easeOutBack(e){const t=1.70158;return(e-=1)*e*((t+1)*e+t)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?e*e*((1+(t*=1.525))*e-t)*.5:.5*((e-=2)*e*((1+(t*=1.525))*e+t)+2)},easeInBounce:e=>1-ln.easeOutBounce(1-e),easeOutBounce(e){const t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?.5*ln.easeInBounce(2*e):.5*ln.easeOutBounce(2*e-1)+.5};function un(e,t,n,a){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function cn(e,t,n,a){return{x:e.x+n*(t.x-e.x),y:"middle"===a?n<.5?e.y:t.y:"after"===a?n<1?e.y:t.y:n>0?t.y:e.y}}function dn(e,t,n,a){const i={x:e.cp2x,y:e.cp2y},r={x:t.cp1x,y:t.cp1y},o=un(e,i,n),s=un(i,r,n),l=un(r,t,n),u=un(o,s,n),c=un(s,l,n);return un(u,c,n)}const hn=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,pn=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function fn(e,t){const n=(""+e).match(hn);if(!n||"normal"===n[1])return 1.2*t;switch(e=+n[2],n[3]){case"px":return e;case"%":e/=100}return t*e}const mn=e=>+e||0;function _n(e,t){const n={},a=r(t),i=a?Object.keys(t):t,o=r(e)?a?n=>l(e[n],e[t[n]]):t=>e[t]:()=>e;for(const e of i)n[e]=mn(o(e));return n}function gn(e){return _n(e,{top:"y",right:"x",bottom:"y",left:"x"})}function vn(e){return _n(e,["topLeft","topRight","bottomLeft","bottomRight"])}function bn(e){const t=gn(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function yn(e,t){e=e||{},t=t||st.font;let n=l(e.size,t.size);"string"==typeof n&&(n=parseInt(n,10));let a=l(e.style,t.style);a&&!(""+a).match(pn)&&(console.warn('Invalid font style specified: "'+a+'"'),a=void 0);const i={family:l(e.family,t.family),lineHeight:fn(l(e.lineHeight,t.lineHeight),n),size:n,style:a,weight:l(e.weight,t.weight),string:""};return i.string=wt(i),i}function wn(e,t,n,a){let r,o,s,l=!0;for(r=0,o=e.length;rn&&0===e?0:e+t;return{min:o(a,-Math.abs(r)),max:o(i,r)}}function xn(e,t){return Object.assign(Object.create(e),t)}function Sn(e,t,n){return e?function(e,t){return{x:n=>e+e+t-n,setWidth(e){t=e},textAlign:e=>"center"===e?e:"right"===e?"left":"right",xPlus:(e,t)=>e-t,leftForLtr:(e,t)=>e-t}}(t,n):{x:e=>e,setWidth(e){},textAlign:e=>e,xPlus:(e,t)=>e+t,leftForLtr:(e,t)=>e}}function Cn(e,t){let n,a;"ltr"!==t&&"rtl"!==t||(n=e.canvas.style,a=[n.getPropertyValue("direction"),n.getPropertyPriority("direction")],n.setProperty("direction",t,"important"),e.prevTextDirection=a)}function Tn(e,t){void 0!==t&&(delete e.prevTextDirection,e.canvas.style.setProperty("direction",t[0],t[1]))}function Pn(e){return"angle"===e?{between:Z,compare:Y,normalize:Q}:{between:ee,compare:(e,t)=>e-t,normalize:e=>e}}function En({start:e,end:t,count:n,loop:a,style:i}){return{start:e%n,end:t%n,loop:a&&(t-e+1)%n==0,style:i}}function An(e,t,n){if(!n)return[e];const{property:a,start:i,end:r}=n,o=t.length,{compare:s,between:l,normalize:u}=Pn(a),{start:c,end:d,loop:h,style:p}=function(e,t,n){const{property:a,start:i,end:r}=n,{between:o,normalize:s}=Pn(a),l=t.length;let u,c,{start:d,end:h,loop:p}=e;if(p){for(d+=l,h+=l,u=0,c=l;uv||l(i,g,m)&&0!==s(i,g),w=()=>!v||0===s(r,m)||l(r,g,m);for(let e=c,n=c;e<=d;++e)_=t[e%o],_.skip||(m=u(_[a]),m!==g&&(v=l(m,i,r),null===b&&y()&&(b=0===s(m,i)?e:n),null!==b&&w()&&(f.push(En({start:b,end:e,loop:h,count:o,style:p})),b=null),n=e,g=m));return null!==b&&f.push(En({start:b,end:d,loop:h,count:o,style:p})),f}function Ln(e,t){const n=[],a=e.segments;for(let i=0;ii&&e[r%t].skip;)r--;return r%=t,{start:i,end:r}}(n,i,r,a);return Rn(e,!0===a?[{start:o,end:s,loop:r}]:function(e,t,n,a){const i=e.length,r=[];let o,s=t,l=e[t];for(o=t+1;o<=n;++o){const n=e[o%i];n.skip||n.stop?l.skip||(a=!1,r.push({start:t%i,end:(o-1)%i,loop:a}),t=s=n.stop?o:null):(s=o,l.skip&&(t=o)),l=n}return null!==s&&r.push({start:t%i,end:s%i,loop:a}),r}(n,o,s!a(e[t.axis]));i.lo-=Math.max(0,o);const s=n.slice(i.hi).findIndex(e=>!a(e[t.axis]));i.hi+=Math.max(0,s)}return i}if(r._sharedOptions){const e=o[0],a="function"==typeof e.getRange&&e.getRange(t);if(a){const e=s(o,t,n-a),i=s(o,t,n+a);return{lo:e.lo,hi:i.hi}}}}return{lo:0,hi:o.length-1}}function qn(e,t,n,a,i){const r=e.getSortedVisibleDatasetMetas(),o=n[t];for(let e=0,n=r.length;e{e[o]&&e[o](t[n],i)&&(r.push({element:e,datasetIndex:a,index:l}),s=s||e.inRange(t.x,t.y,i))}),a&&!s?[]:r}var Un={evaluateInteractionItems:qn,modes:{index(e,t,n,a){const i=mt(t,e),r=n.axis||"x",o=n.includeInvisible||!1,s=n.intersect?Bn(e,i,r,a,o):Fn(e,i,r,!1,a,o),l=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{const t=s[0].index,n=e.data[t];n&&!n.skip&&l.push({element:n,datasetIndex:e.index,index:t})}),l):[]},dataset(e,t,n,a){const i=mt(t,e),r=n.axis||"xy",o=n.includeInvisible||!1;let s=n.intersect?Bn(e,i,r,a,o):Fn(e,i,r,!1,a,o);if(s.length>0){const t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;eBn(e,mt(t,e),n.axis||"xy",a,n.includeInvisible||!1),nearest(e,t,n,a){const i=mt(t,e),r=n.axis||"xy",o=n.includeInvisible||!1;return Fn(e,i,r,n.intersect,a,o)},x:(e,t,n,a)=>Vn(e,mt(t,e),"x",n.intersect,a),y:(e,t,n,a)=>Vn(e,mt(t,e),"y",n.intersect,a)}};const $n=["left","top","right","bottom"];function Hn(e,t){return e.filter(e=>e.pos===t)}function Wn(e,t){return e.filter(e=>-1===$n.indexOf(e.pos)&&e.box.axis===t)}function Gn(e,t){return e.sort((e,n)=>{const a=t?n:e,i=t?e:n;return a.weight===i.weight?a.index-i.index:a.weight-i.weight})}function Kn(e,t,n,a){return Math.max(e[n],t[n])+Math.max(e[a],t[a])}function Yn(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function Qn(e,t,n,a){const{pos:i,box:o}=n,s=e.maxPadding;if(!r(i)){n.size&&(e[i]-=n.size);const t=a[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?o.height:o.width),n.size=t.size/t.count,e[i]+=n.size}o.getPadding&&Yn(s,o.getPadding());const l=Math.max(0,t.outerWidth-Kn(s,e,"left","right")),u=Math.max(0,t.outerHeight-Kn(s,e,"top","bottom")),c=l!==e.w,d=u!==e.h;return e.w=l,e.h=u,n.horizontal?{same:c,other:d}:{same:d,other:c}}function Zn(e,t){const n=t.maxPadding;return function(e){const a={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{a[e]=Math.max(t[e],n[e])}),a}(e?["left","right"]:["top","bottom"])}function Jn(e,t,n,a){const i=[];let r,o,s,l,u,c;for(r=0,o=e.length,u=0;re.box.fullSize),!0),a=Gn(Hn(t,"left"),!0),i=Gn(Hn(t,"right")),r=Gn(Hn(t,"top"),!0),o=Gn(Hn(t,"bottom")),s=Wn(t,"x"),l=Wn(t,"y");return{fullSize:n,leftAndTop:a.concat(r),rightAndBottom:i.concat(l).concat(o).concat(s),chartArea:Hn(t,"chartArea"),vertical:a.concat(i).concat(l),horizontal:r.concat(o).concat(s)}}(e.boxes),l=s.vertical,u=s.horizontal;h(e.boxes,e=>{"function"==typeof e.beforeLayout&&e.beforeLayout()});const c=l.reduce((e,t)=>t.box.options&&!1===t.box.options.display?e:e+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:r,availableHeight:o,vBoxMaxWidth:r/2/c,hBoxMaxHeight:o/2}),p=Object.assign({},i);Yn(p,bn(a));const f=Object.assign({maxPadding:p,w:r,h:o,x:i.left,y:i.top},i),m=function(e,t){const n=function(e){const t={};for(const n of e){const{stack:e,pos:a,stackWeight:i}=n;if(!e||!$n.includes(a))continue;const r=t[e]||(t[e]={count:0,placed:0,weight:0,size:0});r.count++,r.weight+=i}return t}(e),{vBoxMaxWidth:a,hBoxMaxHeight:i}=t;let r,o,s;for(r=0,o=e.length;r{const n=t.box;Object.assign(n,e.chartArea),n.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}};class na{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,a){return t=Math.max(0,t||e.width),n=n||e.height,{width:t,height:Math.max(0,a?Math.floor(t/a):n)}}isAttached(e){return!0}updateConfig(e){}}class aa extends na{acquireContext(e){return e&&e.getContext&&e.getContext("2d")||null}updateConfig(e){e.options.animation=!1}}const ia="$chartjs",ra={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},oa=e=>null===e||""===e,sa=!!bt&&{passive:!0};function la(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,sa)}function ua(e,t){for(const n of e)if(n===t||n.contains(t))return!0}function ca(e,t,n){const a=e.canvas,i=new MutationObserver(e=>{let t=!1;for(const n of e)t=t||ua(n.addedNodes,a),t=t&&!ua(n.removedNodes,a);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}function da(e,t,n){const a=e.canvas,i=new MutationObserver(e=>{let t=!1;for(const n of e)t=t||ua(n.removedNodes,a),t=t&&!ua(n.addedNodes,a);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}const ha=new Map;let pa=0;function fa(){const e=window.devicePixelRatio;e!==pa&&(pa=e,ha.forEach((t,n)=>{n.currentDevicePixelRatio!==e&&t()}))}function ma(e,t,n){const a=e.canvas,i=a&&ut(a);if(!i)return;const r=ce((e,t)=>{const a=i.clientWidth;n(e,t),a{const t=e[0],n=t.contentRect.width,a=t.contentRect.height;0===n&&0===a||r(n,a)});return o.observe(i),function(e,t){ha.size||window.addEventListener("resize",fa),ha.set(e,t)}(e,r),o}function _a(e,t,n){n&&n.disconnect(),"resize"===t&&function(e){ha.delete(e),ha.size||window.removeEventListener("resize",fa)}(e)}function ga(e,t,n){const a=e.canvas,i=ce(t=>{null!==e.ctx&&n(function(e,t){const n=ra[e.type]||e.type,{x:a,y:i}=mt(e,t);return{type:n,chart:t,native:e,x:void 0!==a?a:null,y:void 0!==i?i:null}}(t,e))},e);return function(e,t,n){e&&e.addEventListener(t,n,sa)}(a,t,i),i}class va extends na{acquireContext(e,t){const n=e&&e.getContext&&e.getContext("2d");return n&&n.canvas===e?(function(e,t){const n=e.style,a=e.getAttribute("height"),i=e.getAttribute("width");if(e[ia]={initial:{height:a,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||"block",n.boxSizing=n.boxSizing||"border-box",oa(i)){const t=yt(e,"width");void 0!==t&&(e.width=t)}if(oa(a))if(""===e.style.height)e.height=e.width/(t||2);else{const t=yt(e,"height");void 0!==t&&(e.height=t)}}(e,t),n):null}releaseContext(e){const t=e.canvas;if(!t[ia])return!1;const n=t[ia].initial;["height","width"].forEach(e=>{const i=n[e];a(i)?t.removeAttribute(e):t.setAttribute(e,i)});const i=n.style||{};return Object.keys(i).forEach(e=>{t.style[e]=i[e]}),t.width=t.width,delete t[ia],!0}addEventListener(e,t,n){this.removeEventListener(e,t);const a=e.$proxies||(e.$proxies={}),i={attach:ca,detach:da,resize:ma}[t]||ga;a[t]=i(e,t,n)}removeEventListener(e,t){const n=e.$proxies||(e.$proxies={}),a=n[t];a&&(({attach:_a,detach:_a,resize:_a}[t]||la)(e,t,a),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,a){return gt(e,t,n,a)}isAttached(e){const t=e&&ut(e);return!(!t||!t.isConnected)}}function ba(e){return!lt()||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?aa:va}var ya=Object.freeze({__proto__:null,BasePlatform:na,BasicPlatform:aa,DomPlatform:va,_detectPlatform:ba});const wa="transparent",ka={boolean:(e,t,n)=>n>.5?t:e,color(e,t,n){const a=Ye(e||wa),i=a.valid&&Ye(t||wa);return i&&i.valid?i.mix(a,n).hexString():t},number:(e,t,n)=>e+(t-e)*n};class xa{constructor(e,t,n,a){const i=t[n];a=wn([e.to,a,i,e.from]);const r=wn([e.from,i,a]);this._active=!0,this._fn=e.fn||ka[e.type||typeof r],this._easing=ln[e.easing]||ln.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=r,this._to=a,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);const a=this._target[this._prop],i=n-this._start,r=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(r,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=wn([e.to,t,a,e.from]),this._from=wn([e.from,a,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){const t=e-this._start,n=this._duration,a=this._prop,i=this._from,r=this._loop,o=this._to;let s;if(this._active=i!==o&&(r||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[a]=this._fn(i,o,s))}wait(){const e=this._promises||(this._promises=[]);return new Promise((t,n)=>{e.push({res:t,rej:n})})}_notify(e){const t=e?"res":"rej",n=this._promises||[];for(let e=0;e{const o=e[a];if(!r(o))return;const s={};for(const e of t)s[e]=o[e];(i(o.properties)&&o.properties||[a]).forEach(e=>{e!==a&&n.has(e)||n.set(e,s)})})}_animateOptions(e,t){const n=t.options,a=function(e,t){if(!t)return;let n=e.options;if(n)return n.$shared&&(e.options=n=Object.assign({},n,{$shared:!1,$animations:{}})),n;e.options=t}(e,n);if(!a)return[];const i=this._createAnimations(a,n);return n.$shared&&function(e,t){const n=[],a=Object.keys(t);for(let t=0;t{e.options=n},()=>{}),i}_createAnimations(e,t){const n=this._properties,a=[],i=e.$animations||(e.$animations={}),r=Object.keys(t),o=Date.now();let s;for(s=r.length-1;s>=0;--s){const l=r[s];if("$"===l.charAt(0))continue;if("options"===l){a.push(...this._animateOptions(e,t));continue}const u=t[l];let c=i[l];const d=n.get(l);if(c){if(d&&c.active()){c.update(d,u,o);continue}c.cancel()}d&&d.duration?(i[l]=c=new xa(d,e,l,u),a.push(c)):e[l]=u}return a}update(e,t){if(0===this._properties.size)return void Object.assign(e,t);const n=this._createAnimations(e,t);return n.length?(ge.add(this._chart,n),!0):void 0}}function Ca(e,t){const n=e&&e.options||{},a=n.reverse,i=void 0===n.min?t:0,r=void 0===n.max?t:0;return{start:a?r:i,end:a?i:r}}function Ta(e,t){const n=[],a=e._getSortedDatasetMetas(t);let i,r;for(i=0,r=a.length;i0||!n&&t<0)return i.index}return null}function Ma(e,t){const{chart:n,_cachedMeta:a}=e,i=n._stacks||(n._stacks={}),{iScale:r,vScale:o,index:s}=a,l=r.axis,u=o.axis,c=function(e,t,n){return`${e.id}.${t.id}.${n.stack||n.type}`}(r,o,a),d=t.length;let h;for(let e=0;en[e].axis===t).shift()}function za(e,t){const n=e.controller.index,a=e.vScale&&e.vScale.axis;if(a){t=t||e._parsed;for(const e of t){const t=e._stacks;if(!t||void 0===t[a]||void 0===t[a][n])return;delete t[a][n],void 0!==t[a]._visualValues&&void 0!==t[a]._visualValues[n]&&delete t[a]._visualValues[n]}}}const Ia=e=>"reset"===e||"none"===e,Na=(e,t)=>t?e:Object.assign({},e);class Oa{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=Ea(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(e){this.index!==e&&za(this._cachedMeta),this.index=e}linkScales(){const e=this.chart,t=this._cachedMeta,n=this.getDataset(),a=(e,t,n,a)=>"x"===e?t:"r"===e?a:n,i=t.xAxisID=l(n.xAxisID,Ra(e,"x")),r=t.yAxisID=l(n.yAxisID,Ra(e,"y")),o=t.rAxisID=l(n.rAxisID,Ra(e,"r")),s=t.indexAxis,u=t.iAxisID=a(s,i,r,o),c=t.vAxisID=a(s,r,i,o);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(r),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(u),t.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){const t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update("reset")}_destroy(){const e=this._cachedMeta;this._data&&se(this._data,this),e._stacked&&za(e)}_dataCheck(){const e=this.getDataset(),t=e.data||(e.data=[]),n=this._data;if(r(t)){const e=this._cachedMeta;this._data=function(e,t){const{iScale:n,vScale:a}=t,i="x"===n.axis?"x":"y",r="x"===a.axis?"x":"y",o=Object.keys(e),s=new Array(o.length);let l,u,c;for(l=0,u=o.length;l0&&n._parsed[e-1];if(!1===this._parsing)n._parsed=a,n._sorted=!0,d=a;else{d=i(a[e])?this.parseArrayData(n,a,e,t):r(a[e])?this.parseObjectData(n,a,e,t):this.parsePrimitiveData(n,a,e,t);const o=()=>null===c[l]||p&&c[l]e&&!t.hidden&&t._stacked&&{keys:Ta(n,!0),values:null})(t,n,this.chart),u={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(e){const{min:t,max:n,minDefined:a,maxDefined:i}=e.getUserBounds();return{min:a?t:Number.NEGATIVE_INFINITY,max:i?n:Number.POSITIVE_INFINITY}}(s);let h,p;function f(){p=a[h];const t=p[s.axis];return!o(p[e.axis])||c>t||d=0;--h)if(!f()){this.updateRangeFromParsed(u,e,p,l);break}return u}getAllParsedValues(e){const t=this._cachedMeta._parsed,n=[];let a,i,r;for(a=0,i=t.length;a=0&&ethis.getContext(n,a,t),c);return p.$shared&&(p.$shared=s,i[r]=Object.freeze(Na(p,s))),p}_resolveAnimations(e,t,n){const a=this.chart,i=this._cachedDataOpts,r=`animation-${t}`,o=i[r];if(o)return o;let s;if(!1!==a.options.animation){const a=this.chart.config,i=a.datasetAnimationScopeKeys(this._type,t),r=a.getOptionScopes(this.getDataset(),i);s=a.createResolver(r,this.getContext(e,n,t))}const l=new Sa(a,s&&s.animations);return s&&s._cacheable&&(i[r]=Object.freeze(l)),l}getSharedOptions(e){if(e.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},e))}includeOptions(e,t){return!t||Ia(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){const n=this.resolveDataElementOptions(e,t),a=this._sharedOptions,i=this.getSharedOptions(n),r=this.includeOptions(t,i)||i!==a;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:r}}updateElement(e,t,n,a){Ia(a)?Object.assign(e,n):this._resolveAnimations(t,a).update(e,n)}updateSharedOptions(e,t,n){e&&!Ia(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,a){e.active=a;const i=this.getStyle(t,a);this._resolveAnimations(t,n,a).update(e,{options:!a&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,"active",!1)}setHoverStyle(e,t,n){this._setStyle(e,n,"active",!0)}_removeDatasetHoverStyle(){const e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,"active",!1)}_setDatasetHoverStyle(){const e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,"active",!0)}_resyncElements(e){const t=this._data,n=this._cachedMeta.data;for(const[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];const a=n.length,i=t.length,r=Math.min(i,a);r&&this.parse(0,r),i>a?this._insertElements(a,i-a,e):i{for(e.length+=t,o=e.length-1;o>=r;o--)e[o]=e[o-t]};for(s(i),o=e;o{a[e]=n[e]&&n[e].active()?n[e]._to:this[e]}),a}}function Da(e,t){const n=e.options.ticks,i=function(e){const t=e.options.offset,n=e._tickSize(),a=e._length/n+(t?0:1),i=e._maxLength/n;return Math.floor(Math.min(a,i))}(e),r=Math.min(n.maxTicksLimit||i,i),o=n.major.enabled?function(e){const t=[];let n,a;for(n=0,a=e.length;nr)return function(e,t,n,a){let i,r=0,o=n[0];for(a=Math.ceil(a),i=0;ii)return t}return Math.max(i,1)}(o,t,r);if(s>0){let e,n;const i=s>1?Math.round((u-l)/(s-1)):null;for(qa(t,c,d,a(i)?0:l-i,l),e=0,n=s-1;e"top"===t||"left"===t?e[t]+n:e[t]-n,Fa=(e,t)=>Math.min(t||e,e);function Va(e,t){const n=[],a=e.length/t,i=e.length;let r=0;for(;ro+s)))return u}function $a(e){return e.drawTicks?e.tickLength:0}function Ha(e,t){if(!e.display)return 0;const n=yn(e.font,t),a=bn(e.padding);return(i(e.text)?e.text.length:1)*n.lineHeight+a.height}function Wa(e,t,n){let a=he(e);return(n&&"right"!==t||!n&&"right"===t)&&(a=(e=>"left"===e?"right":"right"===e?"left":e)(a)),a}class Ga extends ja{constructor(e){super(),this.id=e.id,this.type=e.type,this.options=void 0,this.ctx=e.ctx,this.chart=e.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(e){this.options=e.setContext(this.getContext()),this.axis=e.axis,this._userMin=this.parse(e.min),this._userMax=this.parse(e.max),this._suggestedMin=this.parse(e.suggestedMin),this._suggestedMax=this.parse(e.suggestedMax)}parse(e,t){return e}getUserBounds(){let{_userMin:e,_userMax:t,_suggestedMin:n,_suggestedMax:a}=this;return e=s(e,Number.POSITIVE_INFINITY),t=s(t,Number.NEGATIVE_INFINITY),n=s(n,Number.POSITIVE_INFINITY),a=s(a,Number.NEGATIVE_INFINITY),{min:s(e,n),max:s(t,a),minDefined:o(e),maxDefined:o(t)}}getMinMax(e){let t,{min:n,max:a,minDefined:i,maxDefined:r}=this.getUserBounds();if(i&&r)return{min:n,max:a};const o=this.getMatchingVisibleMetas();for(let s=0,l=o.length;sa?a:n,a=i&&n>a?n:a,{min:s(n,s(a,n)),max:s(a,s(n,a))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(e))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(e,t,n){const{beginAtZero:a,grace:i,ticks:r}=this.options,o=r.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=kn(this,i,a),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const s=o=i||n<=1||!this.isHorizontal())return void(this.labelRotation=a);const u=this._getLabelSizes(),c=u.widest.width,d=u.highest.height,h=J(this.chart.width-c,0,this.maxWidth);r=e.offset?this.maxWidth/n:h/(n-1),c+6>r&&(r=h/(n-(e.offset?.5:1)),o=this.maxHeight-$a(e.grid)-t.padding-Ha(e.title,this.chart.options.font),s=Math.sqrt(c*c+d*d),l=H(Math.min(Math.asin(J((u.highest.height+6)/r,-1,1)),Math.asin(J(o/s,-1,1))-Math.asin(J(d/s,-1,1)))),l=Math.max(a,Math.min(i,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const e={width:0,height:0},{chart:t,options:{ticks:n,title:a,grid:i}}=this,r=this._isVisible(),o=this.isHorizontal();if(r){const r=Ha(a,t.options.font);if(o?(e.width=this.maxWidth,e.height=$a(i)+r):(e.height=this.maxHeight,e.width=$a(i)+r),n.display&&this.ticks.length){const{first:t,last:a,widest:i,highest:r}=this._getLabelSizes(),s=2*n.padding,l=$(this.labelRotation),u=Math.cos(l),c=Math.sin(l);if(o){const t=n.mirror?0:c*i.width+u*r.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{const t=n.mirror?0:u*i.width+c*r.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,a,c,u)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,a){const{ticks:{align:i,padding:r},position:o}=this.options,s=0!==this.labelRotation,l="top"!==o&&"x"===this.axis;if(this.isHorizontal()){const o=this.getPixelForTick(0)-this.left,u=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;s?l?(c=a*e.width,d=n*t.height):(c=n*e.height,d=a*t.width):"start"===i?d=t.width:"end"===i?c=e.width:"inner"!==i&&(c=e.width/2,d=t.width/2),this.paddingLeft=Math.max((c-o+r)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-u+r)*this.width/(this.width-u),0)}else{let n=t.height/2,a=e.height/2;"start"===i?(n=0,a=e.height):"end"===i&&(n=t.height,a=0),this.paddingTop=n+r,this.paddingBottom=a+r}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:e,position:t}=this.options;return"top"===t||"bottom"===t||"x"===e}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){let t,n;for(this.beforeTickToLabelConversion(),this.generateTickLabels(e),t=0,n=e.length;t{const n=e.gc,a=n.length/2;let i;if(a>t){for(i=0;i({width:s[e]||0,height:l[e]||0});return{first:T(0),last:T(t-1),widest:T(S),highest:T(C),widths:s,heights:l}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){const t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);const t=this._startPixel+e*this._length;return X(this._alignToPixels?St(this.chart,t,0):t)}getDecimalForPixel(e){const t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){const t=this.ticks||[];if(e>=0&&eo*a?o/n:s/a:s*a0}_computeGridLineItems(e){const t=this.axis,n=this.chart,a=this.options,{grid:i,position:o,border:s}=a,u=i.offset,c=this.isHorizontal(),d=this.ticks.length+(u?1:0),h=$a(i),p=[],f=s.setContext(this.getContext()),m=f.display?f.width:0,_=m/2,g=function(e){return St(n,e,m)};let v,b,y,w,k,x,S,C,T,P,E,A;if("top"===o)v=g(this.bottom),x=this.bottom-h,C=v-_,P=g(e.top)+_,A=e.bottom;else if("bottom"===o)v=g(this.top),P=e.top,A=g(e.bottom)-_,x=v+_,C=this.top+h;else if("left"===o)v=g(this.right),k=this.right-h,S=v-_,T=g(e.left)+_,E=e.right;else if("right"===o)v=g(this.left),T=e.left,E=g(e.right)-_,k=v+_,S=this.left+h;else if("x"===t){if("center"===o)v=g((e.top+e.bottom)/2+.5);else if(r(o)){const e=Object.keys(o)[0],t=o[e];v=g(this.chart.scales[e].getPixelForValue(t))}P=e.top,A=e.bottom,x=v+_,C=x+h}else if("y"===t){if("center"===o)v=g((e.left+e.right)/2);else if(r(o)){const e=Object.keys(o)[0],t=o[e];v=g(this.chart.scales[e].getPixelForValue(t))}k=v-_,S=k-h,T=e.left,E=e.right}const L=l(a.ticks.maxTicksLimit,d),M=Math.max(1,Math.ceil(d/L));for(b=0;b0&&(r-=a/2)}d={left:r,top:i,width:a+t.width,height:n+t.height,color:e.backdropColor}}g.push({label:w,font:T,textOffset:A,options:{rotation:_,color:n,strokeColor:r,strokeWidth:u,textAlign:p,textBaseline:L,translation:[k,x],backdrop:d}})}return g}_getXAxisLabelAlignment(){const{position:e,ticks:t}=this.options;if(-$(this.labelRotation))return"top"===e?"left":"right";let n="center";return"start"===t.align?n="left":"end"===t.align?n="right":"inner"===t.align&&(n="inner"),n}_getYAxisLabelAlignment(e){const{position:t,ticks:{crossAlign:n,mirror:a,padding:i}}=this.options,r=e+i,o=this._getLabelSizes().widest.width;let s,l;return"left"===t?a?(l=this.right+i,"near"===n?s="left":"center"===n?(s="center",l+=o/2):(s="right",l+=o)):(l=this.right-r,"near"===n?s="right":"center"===n?(s="center",l-=o/2):(s="left",l=this.left)):"right"===t?a?(l=this.left+i,"near"===n?s="right":"center"===n?(s="center",l-=o/2):(s="left",l-=o)):(l=this.left+r,"near"===n?s="left":"center"===n?(s="center",l+=o/2):(s="right",l=this.right)):s="right",{textAlign:s,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const e=this.chart,t=this.options.position;return"left"===t||"right"===t?{top:0,left:this.left,bottom:e.height,right:this.right}:"top"===t||"bottom"===t?{top:this.top,left:0,bottom:this.bottom,right:e.width}:void 0}drawBackground(){const{ctx:e,options:{backgroundColor:t},left:n,top:a,width:i,height:r}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,a,i,r),e.restore())}getLineWidthForValue(e){const t=this.options.grid;if(!this._isVisible()||!t.display)return 0;const n=this.ticks.findIndex(t=>t.value===e);return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){const t=this.options.grid,n=this.ctx,a=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(e));let i,r;const o=(e,t,a)=>{a.width&&a.color&&(n.save(),n.lineWidth=a.width,n.strokeStyle=a.color,n.setLineDash(a.borderDash||[]),n.lineDashOffset=a.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,r=a.length;i{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:a,draw:()=>{this.drawBorder()}},{z:t,draw:e=>{this.drawLabels(e)}}]:[{z:t,draw:e=>{this.draw(e)}}]}getMatchingVisibleMetas(e){const t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+"AxisID",a=[];let i,r;for(i=0,r=t.length;i{const a=n.split("."),i=a.pop(),r=[e].concat(a).join("."),o=t[n].split("."),s=o.pop(),l=o.join(".");st.route(r,i,l,s)})}(t,e.defaultRoutes),e.descriptors&&st.describe(t,e.descriptors)}(e,r,n),this.override&&st.override(e.id,e.overrides)),r}get(e){return this.items[e]}unregister(e){const t=this.items,n=e.id,a=this.scope;n in t&&delete t[n],a&&n in st[a]&&(delete st[a][n],this.override&&delete at[n])}}var Ya=new class{constructor(){this.controllers=new Ka(Oa,"datasets",!0),this.elements=new Ka(ja,"elements"),this.plugins=new Ka(Object,"plugins"),this.scales=new Ka(Ga,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each("register",e)}remove(...e){this._each("unregister",e)}addControllers(...e){this._each("register",e,this.controllers)}addElements(...e){this._each("register",e,this.elements)}addPlugins(...e){this._each("register",e,this.plugins)}addScales(...e){this._each("register",e,this.scales)}getController(e){return this._get(e,this.controllers,"controller")}getElement(e){return this._get(e,this.elements,"element")}getPlugin(e){return this._get(e,this.plugins,"plugin")}getScale(e){return this._get(e,this.scales,"scale")}removeControllers(...e){this._each("unregister",e,this.controllers)}removeElements(...e){this._each("unregister",e,this.elements)}removePlugins(...e){this._each("unregister",e,this.plugins)}removeScales(...e){this._each("unregister",e,this.scales)}_each(e,t,n){[...t].forEach(t=>{const a=n||this._getRegistryForType(t);n||a.isForType(t)||a===this.plugins&&t.id?this._exec(e,a,t):h(t,t=>{const a=n||this._getRegistryForType(t);this._exec(e,a,t)})})}_exec(e,t,n){const a=x(e);d(n["before"+a],[],n),t[e](n),d(n["after"+a],[],n)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(a(t,n),e,"stop"),this._notify(a(n,t),e,"start")}}function Za(e,t){return t||!1!==e?!0===e?{}:e:null}function Ja(e,{plugin:t,local:n},a,i){const r=e.pluginScopeKeys(t),o=e.getOptionScopes(a,r);return n&&t.defaults&&o.push(t.defaults),e.createResolver(o,i,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function Xa(e,t){const n=st.datasets[e]||{};return((t.datasets||{})[e]||{}).indexAxis||t.indexAxis||n.indexAxis||"x"}function ei(e){if("x"===e||"y"===e||"r"===e)return e}function ti(e,...t){if(ei(e))return e;for(const a of t){const t=a.axis||("top"===(n=a.position)||"bottom"===n?"x":"left"===n||"right"===n?"y":void 0)||e.length>1&&ei(e[0].toLowerCase());if(t)return t}var n;throw new Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function ni(e,t,n){if(n[t+"AxisID"]===e)return{axis:t}}function ai(e){const t=e.options||(e.options={});t.plugins=l(t.plugins,{}),t.scales=function(e,t){const n=at[e.type]||{scales:{}},a=t.scales||{},i=Xa(e.type,t),o=Object.create(null);return Object.keys(a).forEach(t=>{const s=a[t];if(!r(s))return console.error(`Invalid scale configuration for scale: ${t}`);if(s._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const l=ti(t,s,function(e,t){if(t.data&&t.data.datasets){const n=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(n.length)return ni(e,"x",n[0])||ni(e,"y",n[0])}return{}}(t,e),st.scales[s.type]),u=function(e,t){return e===t?"_index_":"_value_"}(l,i),c=n.scales||{};o[t]=v(Object.create(null),[{axis:l},s,c[l],c[u]])}),e.data.datasets.forEach(n=>{const i=n.type||e.type,r=n.indexAxis||Xa(i,t),s=(at[i]||{}).scales||{};Object.keys(s).forEach(e=>{const t=function(e,t){let n=e;return"_index_"===e?n=t:"_value_"===e&&(n="x"===t?"y":"x"),n}(e,r),i=n[t+"AxisID"]||t;o[i]=o[i]||Object.create(null),v(o[i],[{axis:t},a[i],s[e]])})}),Object.keys(o).forEach(e=>{const t=o[e];v(t,[st.scales[t.type],st.scale])}),o}(e,t)}function ii(e){return(e=e||{}).datasets=e.datasets||[],e.labels=e.labels||[],e}const ri=new Map,oi=new Set;function si(e,t){let n=ri.get(e);return n||(n=t(),ri.set(e,n),oi.add(n)),n}const li=(e,t,n)=>{const a=k(t,n);void 0!==a&&e.add(a)};class ui{constructor(e){this._config=function(e){return(e=e||{}).data=ii(e.data),ai(e),e}(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=ii(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){const e=this._config;this.clearCache(),ai(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return si(e,()=>[[`datasets.${e}`,""]])}datasetAnimationScopeKeys(e,t){return si(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,""]])}datasetElementScopeKeys(e,t){return si(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,""]])}pluginScopeKeys(e){const t=e.id;return si(`${this.type}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){const n=this._scopeCache;let a=n.get(e);return a&&!t||(a=new Map,n.set(e,a)),a}getOptionScopes(e,t,n){const{options:a,type:i}=this,r=this._cachedScopes(e,n),o=r.get(t);if(o)return o;const s=new Set;t.forEach(t=>{e&&(s.add(e),t.forEach(t=>li(s,e,t))),t.forEach(e=>li(s,a,e)),t.forEach(e=>li(s,at[i]||{},e)),t.forEach(e=>li(s,st,e)),t.forEach(e=>li(s,it,e))});const l=Array.from(s);return 0===l.length&&l.push(Object.create(null)),oi.has(t)&&r.set(t,l),l}chartOptionScopes(){const{options:e,type:t}=this;return[e,at[t]||{},st.datasets[t]||{},{type:t},st,it]}resolveNamedOptions(e,t,n,a=[""]){const r={$shared:!0},{resolver:o,subPrefixes:s}=ci(this._resolverCache,e,a);let l=o;(function(e,t){const{isScriptable:n,isIndexable:a}=qt(e);for(const r of t){const t=n(r),o=a(r),s=(o||t)&&e[r];if(t&&(C(s)||di(s))||o&&i(s))return!0}return!1})(o,t)&&(r.$shared=!1,l=Dt(o,n=C(n)?n():n,this.createResolver(e,n,s)));for(const e of t)r[e]=l[e];return r}createResolver(e,t,n=[""],a){const{resolver:i}=ci(this._resolverCache,e,n);return r(t)?Dt(i,t,void 0,a):i}}function ci(e,t,n){let a=e.get(t);a||(a=new Map,e.set(t,a));const i=n.join();let r=a.get(i);return r||(r={resolver:jt(t,n),subPrefixes:n.filter(e=>!e.toLowerCase().includes("hover"))},a.set(i,r)),r}const di=e=>r(e)&&Object.getOwnPropertyNames(e).some(t=>C(e[t])),hi=["top","bottom","left","right","chartArea"];function pi(e,t){return"top"===e||"bottom"===e||-1===hi.indexOf(e)&&"x"===t}function fi(e,t){return function(n,a){return n[e]===a[e]?n[t]-a[t]:n[e]-a[e]}}function mi(e){const t=e.chart,n=t.options.animation;t.notifyPlugins("afterRender"),d(n&&n.onComplete,[e],t)}function _i(e){const t=e.chart,n=t.options.animation;d(n&&n.onProgress,[e],t)}function gi(e){return lt()&&"string"==typeof e?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}const vi={},bi=e=>{const t=gi(e);return Object.values(vi).filter(e=>e.canvas===t).pop()};function yi(e,t,n){const a=Object.keys(e);for(const i of a){const a=+i;if(a>=t){const r=e[i];delete e[i],(n>0||a>t)&&(e[a+n]=r)}}}class wi{static defaults=st;static instances=vi;static overrides=at;static registry=Ya;static version="4.5.1";static getChart=bi;static register(...e){Ya.add(...e),ki()}static unregister(...e){Ya.remove(...e),ki()}constructor(e,t){const a=this.config=new ui(t),i=gi(e),r=bi(i);if(r)throw new Error("Canvas is already in use. Chart with ID '"+r.id+"' must be destroyed before the canvas with ID '"+r.canvas.id+"' can be reused.");const o=a.createResolver(a.chartOptionScopes(),this.getContext());this.platform=new(a.platform||ba(i)),this.platform.updateConfig(a);const s=this.platform.acquireContext(i,o.aspectRatio),l=s&&s.canvas,u=l&&l.height,c=l&&l.width;this.id=n(),this.ctx=s,this.canvas=l,this.width=c,this.height=u,this._options=o,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Qa,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=de(e=>this.update(e),o.resizeDelay||0),this._dataChanges=[],vi[this.id]=this,s&&l?(ge.listen(this,"complete",mi),ge.listen(this,"progress",_i),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:i,_aspectRatio:r}=this;return a(e)?t&&r?r:i?n/i:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return Ya}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():vt(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Ct(this.canvas,this.ctx),this}stop(){return ge.stop(this),this}resize(e,t){ge.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){const n=this.options,a=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,r=this.platform.getMaximumSize(a,e,t,i),o=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?"resize":"attach";this.width=r.width,this.height=r.height,this._aspectRatio=this.aspectRatio,vt(this,o,!0)&&(this.notifyPlugins("resize",{size:r}),d(n.onResize,[this,r],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){h(this.options.scales||{},(e,t)=>{e.id=t})}buildOrUpdateScales(){const e=this.options,t=e.scales,n=this.scales,a=Object.keys(n).reduce((e,t)=>(e[t]=!1,e),{});let i=[];t&&(i=i.concat(Object.keys(t).map(e=>{const n=t[e],a=ti(e,n),i="r"===a,r="x"===a;return{options:n,dposition:i?"chartArea":r?"bottom":"left",dtype:i?"radialLinear":r?"category":"linear"}}))),h(i,t=>{const i=t.options,r=i.id,o=ti(r,i),s=l(i.type,t.dtype);void 0!==i.position&&pi(i.position,o)===pi(t.dposition)||(i.position=t.dposition),a[r]=!0;let u=null;r in n&&n[r].type===s?u=n[r]:(u=new(Ya.getScale(s))({id:r,type:s,ctx:this.ctx,chart:this}),n[u.id]=u),u.init(i,e)}),h(a,(e,t)=>{e||delete n[t]}),h(n,e=>{ta.configure(this,e,e.options),ta.addBox(this,e)})}_updateMetasets(){const e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort((e,t)=>e.index-t.index),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,n)=>{0===t.filter(t=>t===e._dataset).length&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){const e=[],t=this.data.datasets;let n,a;for(this._removeUnreferencedMetasets(),n=0,a=t.length;n{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(e){const t=this.config;t.update();const n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),a=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:e,cancelable:!0}))return;const i=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let r=0;for(let e=0,t=this.data.datasets.length;e{e.reset()}),this._updateDatasets(e),this.notifyPlugins("afterUpdate",{mode:e}),this._layers.sort(fi("z","_idx"));const{_active:o,_lastEvent:s}=this;s?this._eventHandler(s,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){h(this.scales,e=>{ta.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const e=this.options,t=new Set(Object.keys(this._listeners)),n=new Set(e.events);T(t,n)&&!!this._responsiveListeners===e.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(const{method:n,start:a,count:i}of t)yi(e,a,"_removeElements"===n?-i:i)}_getUniformDataChanges(){const e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];const t=this.data.datasets.length,n=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+","+e.splice(1).join(","))),a=n(0);for(let e=1;ee.split(",")).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;ta.update(this,this.width,this.height,e);const t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],h(this.boxes,e=>{n&&"chartArea"===e.position||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins("afterLayout")}_updateDatasets(e){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:e,cancelable:!0})){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(e){const t=this.ctx,n={meta:e,index:e.index,cancelable:!0},a=On(this,e);!1!==this.notifyPlugins("beforeDatasetDraw",n)&&(a&&At(t,a),e.controller.draw(),a&&Lt(t),n.cancelable=!1,this.notifyPlugins("afterDatasetDraw",n))}isPointInArea(e){return Et(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,a){const i=Un.modes[t];return"function"==typeof i?i(this,e,n,a):[]}getDatasetMeta(e){const t=this.data.datasets[e],n=this._metasets;let a=n.filter(e=>e&&e._dataset===t).pop();return a||(a={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(a)),a}getContext(){return this.$context||(this.$context=xn(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){const t=this.data.datasets[e];if(!t)return!1;const n=this.getDatasetMeta(e);return"boolean"==typeof n.hidden?!n.hidden:!t.hidden}setDatasetVisibility(e,t){this.getDatasetMeta(e).hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){const a=n?"show":"hide",i=this.getDatasetMeta(e),r=i.controller._resolveAnimations(void 0,a);S(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),r.update(i,{visible:n}),this.update(t=>t.datasetIndex===e?a:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){const t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),ge.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,a),e[n]=a},a=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};h(this.options.events,e=>n(e,a))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const e=this._responsiveListeners,t=this.platform,n=(n,a)=>{t.addEventListener(this,n,a),e[n]=a},a=(n,a)=>{e[n]&&(t.removeEventListener(this,n,a),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)};let r;const o=()=>{a("attach",o),this.attached=!0,this.resize(),n("resize",i),n("detach",r)};r=()=>{this.attached=!1,a("resize",i),this._stop(),this._resize(0,0),n("attach",o)},t.isAttached(this.canvas)?o():r()}unbindEvents(){h(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},h(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){const a=n?"set":"remove";let i,r,o,s;for("dataset"===t&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller["_"+a+"DatasetHoverStyle"]()),o=0,s=e.length;o{const n=this.getDatasetMeta(e);if(!n)throw new Error("No dataset found at index "+e);return{datasetIndex:e,element:n.data[t],index:t}});!p(n,t)&&(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return 1===this._plugins._cache.filter(t=>t.plugin.id===e).length}_updateHoverStyles(e,t,n){const a=this.options.hover,i=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),r=i(t,e),o=n?e:i(e,t);r.length&&this.updateHoverStyle(r,a.mode,!1),o.length&&a.mode&&this.updateHoverStyle(o,a.mode,!0)}_eventHandler(e,t){const n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},a=t=>(t.options.events||this.options.events).includes(e.native.type);if(!1===this.notifyPlugins("beforeEvent",n,a))return;const i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins("afterEvent",n,a),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){const{_active:a=[],options:i}=this,r=t,o=this._getActiveElements(e,a,n,r),s=P(e),l=function(e,t,n,a){return n&&"mouseout"!==e.type?a?t:e:null}(e,this._lastEvent,n,s);n&&(this._lastEvent=null,d(i.onHover,[e,o,this],this),s&&d(i.onClick,[e,o,this],this));const u=!p(o,a);return(u||t)&&(this._active=o,this._updateHoverStyles(o,a,t)),this._lastEvent=l,u}_getActiveElements(e,t,n,a){if("mouseout"===e.type)return[];if(!n)return t;const i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,a)}}function ki(){return h(wi.instances,e=>e._plugins.invalidate())}function xi(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class Si{static override(e){Object.assign(Si.prototype,e)}options;constructor(e){this.options=e||{}}init(){}formats(){return xi()}parse(){return xi()}format(){return xi()}add(){return xi()}diff(){return xi()}startOf(){return xi()}endOf(){return xi()}}var Ci={_date:Si};function Ti(e){const t=e.iScale,n=function(e,t){if(!e._cache.$bar){const n=e.getMatchingVisibleMetas(t);let a=[];for(let t=0,i=n.length;te-t))}return e._cache.$bar}(t,e.type);let a,i,r,o,s=t._length;const l=()=>{32767!==r&&-32768!==r&&(S(o)&&(s=Math.min(s,Math.abs(r-o)||s)),o=r)};for(a=0,i=n.length;aMath.abs(s)&&(l=s,u=o),t[n.axis]=u,t._custom={barStart:l,barEnd:u,start:i,end:r,min:o,max:s}}(e,t,n,a):t[n.axis]=n.parse(e,a),t}function Ei(e,t,n,a){const i=e.iScale,r=e.vScale,o=i.getLabels(),s=i===r,l=[];let u,c,d,h;for(u=n,c=n+a;ue.x,n="left",a="right"):(t=e.base"spacing"!==e,_indexable:e=>"spacing"!==e&&!e.startsWith("borderDash")&&!e.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){const t=e.data,{labels:{pointStyle:n,textAlign:a,color:i,useBorderRadius:r,borderRadius:o}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,s)=>{const l=e.getDatasetMeta(0).controller.getStyle(s);return{text:t,fillStyle:l.backgroundColor,fontColor:i,hidden:!e.getDataVisibility(s),lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:l.borderWidth,strokeStyle:l.borderColor,textAlign:a,pointStyle:n,borderRadius:r&&(o||l.borderRadius),index:s}}):[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}};constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){const n=this.getDataset().data,a=this._cachedMeta;if(!1===this._parsing)a._parsed=n;else{let i,o,s=e=>+n[e];if(r(n[e])){const{key:e="value"}=this._parsing;s=t=>+k(n[t],e)}for(i=e,o=e+t;iZ(e,s,l,!0)?1:Math.max(t,t*n,a,a*n),f=(e,t,a)=>Z(e,s,l,!0)?-1:Math.min(t,t*n,a,a*n),m=p(0,u,d),_=p(z,c,h),g=f(E,u,d),v=f(E+z,c,h);a=(m-g)/2,i=(_-v)/2,r=-(m+g)/2,o=-(_+v)/2}return{ratioX:a,ratioY:i,offsetX:r,offsetY:o}}(h,d,s),g=(n.width-r)/p,v=(n.height-r)/f,b=Math.max(Math.min(g,v)/2,0),y=c(this.options.radius,b),w=(y-Math.max(y*s,0))/this._getVisibleDatasetWeightTotal();this.offsetX=m*y,this.offsetY=_*y,a.total=this.calculateTotal(),this.outerRadius=y-w*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-w*l,0),this.updateElements(i,0,i.length,e)}_circumference(e,t){const n=this.options,a=this._cachedMeta,i=this._getCircumference();return t&&n.animation.animateRotate||!this.chart.getDataVisibility(e)||null===a._parsed[e]||a.data[e].hidden?0:this.calculateCircumference(a._parsed[e]*i/A)}updateElements(e,t,n,a){const i="reset"===a,r=this.chart,o=r.chartArea,s=r.options.animation,l=(o.left+o.right)/2,u=(o.top+o.bottom)/2,c=i&&s.animateScale,d=c?0:this.innerRadius,h=c?0:this.outerRadius,{sharedOptions:p,includeOptions:f}=this._getSharedOptions(t,a);let m,_=this._getRotation();for(m=0;m0&&!isNaN(e)?A*(Math.abs(e)/t):0}getLabelAndValue(e){const t=this._cachedMeta,n=this.chart,a=n.data.labels||[],i=et(t._parsed[e],n.options.locale);return{label:a[e]||"",value:i}}getMaxBorderWidth(e){let t=0;const n=this.chart;let a,i,r,o,s;if(!e)for(a=0,i=n.data.datasets.length;a{const r=e.getDatasetMeta(0).controller.getStyle(i);return{text:t,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,fontColor:a,lineWidth:r.borderWidth,pointStyle:n,hidden:!e.getDataVisibility(i),index:i}})}return[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(e,t){super(e,t),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(e){const t=this._cachedMeta,n=this.chart,a=n.data.labels||[],i=et(t._parsed[e].r,n.options.locale);return{label:a[e]||"",value:i}}parseObjectData(e,t,n,a){return Qt.bind(this)(e,t,n,a)}update(e){const t=this._cachedMeta.data;this._updateRadius(),this.updateElements(t,0,t.length,e)}getMinMax(){const e=this._cachedMeta,t={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return e.data.forEach((e,n)=>{const a=this.getParsed(n).r;!isNaN(a)&&this.chart.getDataVisibility(n)&&(at.max&&(t.max=a))}),t}_updateRadius(){const e=this.chart,t=e.chartArea,n=e.options,a=Math.min(t.right-t.left,t.bottom-t.top),i=Math.max(a/2,0),r=(i-Math.max(n.cutoutPercentage?i/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();this.outerRadius=i-r*this.index,this.innerRadius=this.outerRadius-r}updateElements(e,t,n,a){const i="reset"===a,r=this.chart,o=r.options.animation,s=this._cachedMeta.rScale,l=s.xCenter,u=s.yCenter,c=s.getIndexAngle(0)-.5*E;let d,h=c;const p=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&t++}),t}_computeAngle(e,t,n){return this.chart.getDataVisibility(e)?$(this.resolveDataElementOptions(e,t).angle||n):0}}var Oi=Object.freeze({__proto__:null,BarController:class extends Oa{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(e,t,n,a){return Ei(e,t,n,a)}parseArrayData(e,t,n,a){return Ei(e,t,n,a)}parseObjectData(e,t,n,a){const{iScale:i,vScale:r}=e,{xAxisKey:o="x",yAxisKey:s="y"}=this._parsing,l="x"===i.axis?o:s,u="x"===r.axis?o:s,c=[];let d,h,p,f;for(d=n,h=n+a;de.controller.options.grouped),r=n.options.stacked,o=[],s=this._cachedMeta.controller.getParsed(t),l=s&&s[n.axis],u=e=>{const t=e._parsed.find(e=>e[n.axis]===l),i=t&&t[e.vScale.axis];if(a(i)||isNaN(i))return!0};for(const n of i)if((void 0===t||!u(n))&&((!1===r||-1===o.indexOf(n.stack)||void 0===r&&void 0===n.stack)&&o.push(n.stack),n.index===e))break;return o.length||o.push(void 0),o}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(n=>e[n].axis===t).shift()}_getAxis(){const e={},t=this.getFirstScaleIdForIndexAxis();for(const n of this.chart.data.datasets)e[l("x"===this.chart.options.indexAxis?n.xAxisID:n.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,n){const a=this._getStacks(e,n),i=void 0!==t?a.indexOf(t):-1;return-1===i?a.length-1:i}_getRuler(){const e=this.options,t=this._cachedMeta,n=t.iScale,a=[];let i,r;for(i=0,r=t.data.length;i=n?1:-1)}(h,t,s)*o,p===s&&(g-=h/2);const e=t.getPixelForDecimal(0),a=t.getPixelForDecimal(1),r=Math.min(e,a),u=Math.max(e,a);g=Math.max(Math.min(g,u),r),d=g+h,n&&!c&&(l._stacks[t.axis]._visualValues[i]=t.getValueForPixel(d)-t.getValueForPixel(g))}if(g===t.getPixelForValue(s)){const e=j(h)*t.getLineWidthForValue(s)/2;g+=e,h-=e}return{size:h,base:g,head:d,center:d+h/2}}_calculateBarIndexPixels(e,t){const n=t.scale,i=this.options,r=i.skipNull,o=l(i.maxBarThickness,1/0);let s,u;const c=this._getAxisCount();if(t.grouped){const n=r?this._getStackCount(e):t.stackCount,d="flex"===i.barThickness?function(e,t,n,a){const i=t.pixels,r=i[e];let o=e>0?i[e-1]:null,s=e=0;--n)t=Math.max(t,e[n].size(this.resolveDataElementOptions(n))/2);return t>0&&t}getLabelAndValue(e){const t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:a,yScale:i}=t,r=this.getParsed(e),o=a.getLabelForValue(r.x),s=i.getLabelForValue(r.y),l=r._custom;return{label:n[e]||"",value:"("+o+", "+s+(l?", "+l:"")+")"}}update(e){const t=this._cachedMeta.data;this.updateElements(t,0,t.length,e)}updateElements(e,t,n,a){const i="reset"===a,{iScale:r,vScale:o}=this._cachedMeta,{sharedOptions:s,includeOptions:l}=this._getSharedOptions(t,a),u=r.axis,c=o.axis;for(let d=t;d0&&this.getParsed(t-1);for(let n=0;n=v){b.skip=!0;continue}const w=this.getParsed(n),k=a(w[p]),x=b[h]=o.getPixelForValue(w[h],n),S=b[p]=r||k?s.getBasePixel():s.getPixelForValue(l?this.applyStack(s,w,l):w[p],n);b.skip=isNaN(x)||isNaN(S)||k,b.stop=n>0&&Math.abs(w[h]-y[h])>_,m&&(b.parsed=w,b.raw=u.data[n]),d&&(b.options=c||this.resolveDataElementOptions(n,f.active?"active":i)),g||this.updateElement(f,n,b,i),y=w}}getMaxOverflow(){const e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,a=e.data||[];if(!a.length)return n;const i=a[0].size(this.resolveDataElementOptions(0)),r=a[a.length-1].size(this.resolveDataElementOptions(a.length-1));return Math.max(n,i,r)/2}draw(){const e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}},PieController:class extends Ii{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:Ni,RadarController:class extends Oa{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(e){const t=this._cachedMeta.vScale,n=this.getParsed(e);return{label:t.getLabels()[e],value:""+t.getLabelForValue(n[t.axis])}}parseObjectData(e,t,n,a){return Qt.bind(this)(e,t,n,a)}update(e){const t=this._cachedMeta,n=t.dataset,a=t.data||[],i=t.iScale.getLabels();if(n.points=a,"resize"!==e){const t=this.resolveDatasetElementOptions(e);this.options.showLine||(t.borderWidth=0);const r={_loop:!0,_fullLoop:i.length===a.length,options:t};this.updateElement(n,void 0,r,e)}this.updateElements(a,0,a.length,e)}updateElements(e,t,n,a){const i=this._cachedMeta.rScale,r="reset"===a;for(let o=t;o0&&this.getParsed(t-1);for(let c=t;c0&&Math.abs(n[p]-b[p])>g,_&&(m.parsed=n,m.raw=u.data[c]),h&&(m.options=d||this.resolveDataElementOptions(c,t.active?"active":i)),v||this.updateElement(t,c,m,i),b=n}this.updateSharedOptions(d,i,c)}getMaxOverflow(){const e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}const n=e.dataset,a=n.options&&n.options.borderWidth||0;if(!t.length)return a;const i=t[0].size(this.resolveDataElementOptions(0)),r=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(a,i,r)/2}}});function ji(e,t,n,a){return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}function Di(e,t,n,a,i,r){const{x:o,y:s,startAngle:l,pixelMargin:u,innerRadius:c}=t,d=Math.max(t.outerRadius+a+n-u,0),h=c>0?c+a+n+u:0;let p=0;const f=i-l;if(a){const e=((c>0?c-a:0)+(d>0?d-a:0))/2;p=(f-(0!==e?f*e/(e+a):f))/2}const m=(f-Math.max(.001,f*d-n/E)/d)/2,_=l+m+p,g=i-m-p,{outerStart:v,outerEnd:b,innerStart:y,innerEnd:w}=function(e,t,n,a){const i=_n(e.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]),r=(n-t)/2,o=Math.min(r,a*t/2),s=e=>{const t=(n-Math.min(r,e))*a/2;return J(e,0,Math.min(r,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:J(i.innerStart,0,o),innerEnd:J(i.innerEnd,0,o)}}(t,h,d,g-_),k=d-v,x=d-b,S=_+v/k,C=g-b/x,T=h+y,P=h+w,A=_+y/T,L=g-w/P;if(e.beginPath(),r){const t=(S+C)/2;if(e.arc(o,s,d,S,t),e.arc(o,s,d,t,C),b>0){const t=ji(x,C,o,s);e.arc(t.x,t.y,b,C,g+z)}const n=ji(P,g,o,s);if(e.lineTo(n.x,n.y),w>0){const t=ji(P,L,o,s);e.arc(t.x,t.y,w,g+z,L+Math.PI)}const a=(g-w/h+(_+y/h))/2;if(e.arc(o,s,h,g-w/h,a,!0),e.arc(o,s,h,a,_+y/h,!0),y>0){const t=ji(T,A,o,s);e.arc(t.x,t.y,y,A+Math.PI,_-z)}const i=ji(k,_,o,s);if(e.lineTo(i.x,i.y),v>0){const t=ji(k,S,o,s);e.arc(t.x,t.y,v,_-z,S)}}else{e.moveTo(o,s);const t=Math.cos(S)*d+o,n=Math.sin(S)*d+s;e.lineTo(t,n);const a=Math.cos(C)*d+o,i=Math.sin(C)*d+s;e.lineTo(a,i)}e.closePath()}function qi(e,t,n=t){e.lineCap=l(n.borderCapStyle,t.borderCapStyle),e.setLineDash(l(n.borderDash,t.borderDash)),e.lineDashOffset=l(n.borderDashOffset,t.borderDashOffset),e.lineJoin=l(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=l(n.borderWidth,t.borderWidth),e.strokeStyle=l(n.borderColor,t.borderColor)}function Bi(e,t,n){e.lineTo(n.x,n.y)}function Fi(e,t,n={}){const a=e.length,{start:i=0,end:r=a-1}=n,{start:o,end:s}=t,l=Math.max(i,o),u=Math.min(r,s),c=is&&r>s;return{count:a,start:l,loop:t.loop,ilen:u(o+(u?s-e:e))%r,b=()=>{p!==f&&(e.lineTo(_,f),e.lineTo(_,p),e.lineTo(_,m))};for(l&&(d=i[v(0)],e.moveTo(d.x,d.y)),c=0;c<=s;++c){if(d=i[v(c)],d.skip)continue;const t=d.x,n=d.y,a=0|t;a===h?(nf&&(f=n),_=(g*_+t)/++g):(b(),e.lineTo(t,n),h=a,g=0,p=f=n),m=n}b()}function $i(e){const t=e.options,n=t.borderDash&&t.borderDash.length;return e._decimated||e._loop||t.tension||"monotone"===t.cubicInterpolationMode||t.stepped||n?Vi:Ui}const Hi="function"==typeof Path2D;class Wi extends ja{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:e=>"borderDash"!==e&&"fill"!==e};constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){const n=this.options;if((n.tension||"monotone"===n.cubicInterpolationMode)&&!n.stepped&&!this._pointsUpdated){const a=n.spanGaps?this._loop:this._fullLoop;an(this._points,n,e,a,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Mn(this,this.options.segment))}first(){const e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){const e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){const n=this.options,a=e[t],i=this.points,r=Ln(this,{property:t,start:a,end:a});if(!r.length)return;const o=[],s=function(e){return e.stepped?cn:e.tension||"monotone"===e.cubicInterpolationMode?dn:un}(n);let l,u;for(l=0,u=r.length;l"borderDash"!==e};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(e){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,t,n){const a=this.getProps(["x","y"],n),{angle:i,distance:r}=G(a,{x:e,y:t}),{startAngle:o,endAngle:s,innerRadius:u,outerRadius:c,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],n),h=(this.options.spacing+this.options.borderWidth)/2,p=l(d,s-o),f=Z(i,o,s)&&o!==s,m=p>=A||f,_=ee(r,u+h,c+h);return m&&_}getCenterPoint(e){const{x:t,y:n,startAngle:a,endAngle:i,innerRadius:r,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],e),{offset:s,spacing:l}=this.options,u=(a+i)/2,c=(r+o+l+s)/2;return{x:t+Math.cos(u)*c,y:n+Math.sin(u)*c}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){const{options:t,circumference:n}=this,a=(t.offset||0)/4,i=(t.spacing||0)/2,r=t.circular;if(this.pixelMargin="inner"===t.borderAlign?.33:0,this.fullCircles=n>A?Math.floor(n/A):0,0===n||this.innerRadius<0||this.outerRadius<0)return;e.save();const o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*a,Math.sin(o)*a);const s=a*(1-Math.sin(Math.min(E,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,function(e,t,n,a,i){const{fullCircles:r,startAngle:o,circumference:s}=t;let l=t.endAngle;if(r){Di(e,t,n,a,l,i);for(let t=0;ti?(u=i/l,e.arc(r,o,l,n+u,a-u,!0)):e.arc(r,o,i,n+z,a-z),e.closePath(),e.clip()}(e,t,m),l.selfJoin&&m-o>=E&&0===p&&"miter"!==c&&function(e,t,n){const{startAngle:a,x:i,y:r,outerRadius:o,innerRadius:s,options:l}=t,{borderWidth:u,borderJoinStyle:c}=l,d=Math.min(u/o,Q(a-n));if(e.beginPath(),e.arc(i,r,o-u/2,a+d/2,n-d/2),s>0){const t=Math.min(u/s,Q(a-n));e.arc(i,r,s+u/2,n-t/2,a+t/2,!0)}else{const t=Math.min(u/2,o*Q(a-n));if("round"===c)e.arc(i,r,t,n-E/2,a+E/2,!0);else if("bevel"===c){const o=2*t*t,s=-o*Math.cos(n+E/2)+i,l=-o*Math.sin(n+E/2)+r,u=o*Math.cos(a+E/2)+i,c=o*Math.sin(a+E/2)+r;e.lineTo(s,l),e.lineTo(u,c)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip("evenodd")}(e,t,m),r||(Di(e,t,n,a,m,i),e.stroke())}(e,this,s,i,r),e.restore()}},BarElement:class extends ja{static id="bar";static defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,inflateAmount:"auto",pointStyle:void 0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(e){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,e&&Object.assign(this,e)}draw(e){const{inflateAmount:t,options:{borderColor:n,backgroundColor:a}}=this,{inner:i,outer:r}=Qi(this),o=(s=r.radius).topLeft||s.topRight||s.bottomLeft||s.bottomRight?Ot:Ji;var s;e.save(),r.w===i.w&&r.h===i.h||(e.beginPath(),o(e,Xi(r,t,i)),e.clip(),o(e,Xi(i,-t,r)),e.fillStyle=n,e.fill("evenodd")),e.beginPath(),o(e,Xi(i,t)),e.fillStyle=a,e.fill(),e.restore()}inRange(e,t,n){return Zi(this,e,t,n)}inXRange(e,t){return Zi(this,e,null,t)}inYRange(e,t){return Zi(this,null,e,t)}getCenterPoint(e){const{x:t,y:n,base:a,horizontal:i}=this.getProps(["x","y","base","horizontal"],e);return{x:i?(t+a)/2:t,y:i?n:(n+a)/2}}getRange(e){return"x"===e?this.width/2:this.height/2}},LineElement:Wi,PointElement:class extends ja{static id="point";parsed;skip;stop;static defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(e){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,e&&Object.assign(this,e)}inRange(e,t,n){const a=this.options,{x:i,y:r}=this.getProps(["x","y"],n);return Math.pow(e-i,2)+Math.pow(t-r,2)=0&&ea=t?a:e,o=e=>i=n?i:e;if(e){const e=j(a),t=j(i);e<0&&t<0?o(0):e>0&&t>0&&r(0)}if(a===i){let t=0===i?1:Math.abs(.05*i);o(i+t),e||r(a-t)}this.min=a,this.max=i}getTickLimit(){const e=this.options.ticks;let t,{maxTicksLimit:n,stepSize:a}=e;return a?(t=Math.ceil(this.max/a)-Math.floor(this.min/a)+1,t>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${a} would result generating up to ${t} ticks. Limiting to 1000.`),t=1e3)):(t=this.computeTickLimit(),n=n||11),n&&(t=Math.min(n,t)),t}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const e=this.options,t=e.ticks;let n=this.getTickLimit();n=Math.max(2,n);const i=function(e,t){const n=[],{bounds:i,step:r,min:o,max:s,precision:l,count:u,maxTicks:c,maxDigits:d,includeBounds:h}=e,p=r||1,f=c-1,{min:m,max:_}=t,g=!a(o),v=!a(s),b=!a(u),y=(_-m)/(d+1);let w,k,x,S,C=q((_-m)/f/p)*p;if(C<1e-14&&!g&&!v)return[{value:m},{value:_}];S=Math.ceil(_/C)-Math.floor(m/C),S>f&&(C=q(S*C/f/p)*p),a(l)||(w=Math.pow(10,l),C=Math.ceil(C*w)/w),"ticks"===i?(k=Math.floor(m/C)*C,x=Math.ceil(_/C)*C):(k=m,x=_),g&&v&&r&&V((s-o)/r,C/1e3)?(S=Math.round(Math.min((s-o)/C,c)),C=(s-o)/S,k=o,x=s):b?(k=g?o:k,x=v?s:x,S=u-1,C=(x-k)/S):(S=(x-k)/C,S=D(S,Math.round(S),C/1e3)?Math.round(S):Math.ceil(S));const T=Math.max(W(C),W(k));w=Math.pow(10,a(l)?T:l),k=Math.round(k*w)/w,x=Math.round(x*w)/w;let P=0;for(g&&(h&&k!==o?(n.push({value:o}),ks)break;n.push({value:e})}return v&&h&&x!==s?n.length&&D(n[n.length-1].value,s,nr(s,y,e))?n[n.length-1].value=s:n.push({value:s}):v&&x!==s||n.push({value:x}),n}({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:!1!==t.includeBounds},this._range||this);return"ticks"===e.bounds&&U(i,this,"value"),e.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}configure(){const e=this.ticks;let t=this.min,n=this.max;if(super.configure(),this.options.offset&&e.length){const a=(n-t)/Math.max(e.length-1,1)/2;t-=a,n+=a}this._startValue=t,this._endValue=n,this._valueRange=n-t}getLabelForValue(e){return et(e,this.chart.options.locale,this.options.ticks.format)}}class ir extends ar{static id="linear";static defaults={ticks:{callback:nt.formatters.numeric}};determineDataLimits(){const{min:e,max:t}=this.getMinMax(!0);this.min=o(e)?e:0,this.max=o(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){const e=this.isHorizontal(),t=e?this.width:this.height,n=$(this.options.ticks.minRotation),a=(e?Math.sin(n):Math.cos(n))||.001,i=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,i.lineHeight/a))}getPixelForValue(e){return null===e?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}}const rr=e=>Math.floor(O(e)),or=(e,t)=>Math.pow(10,rr(e)+t);function sr(e){return 1===e/Math.pow(10,rr(e))}function lr(e,t,n){const a=Math.pow(10,n),i=Math.floor(e/a);return Math.ceil(t/a)-i}class ur extends Ga{static id="logarithmic";static defaults={ticks:{callback:nt.formatters.logarithmic,major:{enabled:!0}}};constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){const n=ar.prototype.parse.apply(this,[e,t]);if(0!==n)return o(n)&&n>0?n:null;this._zero=!0}determineDataLimits(){const{min:e,max:t}=this.getMinMax(!0);this.min=o(e)?Math.max(0,e):null,this.max=o(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!o(this._userMin)&&(this.min=e===or(this.min,0)?or(this.min,-1):or(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:e,maxDefined:t}=this.getUserBounds();let n=this.min,a=this.max;const i=t=>n=e?n:t,r=e=>a=t?a:e;n===a&&(n<=0?(i(1),r(10)):(i(or(n,-1)),r(or(a,1)))),n<=0&&i(or(a,-1)),a<=0&&r(or(n,1)),this.min=n,this.max=a}buildTicks(){const e=this.options,t=function(e,{min:t,max:n}){t=s(e.min,t);const a=[],i=rr(t);let r=function(e,t){let n=rr(t-e);for(;lr(e,t,n)>10;)n++;for(;lr(e,t,n)<10;)n--;return Math.min(n,rr(e))}(t,n),o=r<0?Math.pow(10,Math.abs(r)):1;const l=Math.pow(10,r),u=i>r?Math.pow(10,i):0,c=Math.round((t-u)*o)/o,d=Math.floor((t-u)/l/10)*l*10;let h=Math.floor((c-d)/Math.pow(10,r)),p=s(e.min,Math.round((u+d+h*Math.pow(10,r))*o)/o);for(;p=10?h=h<15?15:20:h++,h>=20&&(r++,h=2,o=r>=0?1:o),p=Math.round((u+d+h*Math.pow(10,r))*o)/o;const f=s(e.max,p);return a.push({value:f,major:sr(f),significand:h}),a}({min:this._userMin,max:this._userMax},this);return"ticks"===e.bounds&&U(t,this,"value"),e.reverse?(t.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),t}getLabelForValue(e){return void 0===e?"0":et(e,this.chart.options.locale,this.options.ticks.format)}configure(){const e=this.min;super.configure(),this._startValue=O(e),this._valueRange=O(this.max)-O(e)}getPixelForValue(e){return void 0!==e&&0!==e||(e=this.min),null===e||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(O(e)-this._startValue)/this._valueRange)}getValueForPixel(e){const t=this.getDecimalForPixel(e);return Math.pow(10,this._startValue+t*this._valueRange)}}function cr(e){const t=e.ticks;if(t.display&&e.display){const e=bn(t.backdropPadding);return l(t.font&&t.font.size,st.font.size)+e.height}return 0}function dr(e,t,n,a,i){return e===a||e===i?{start:t-n/2,end:t+n/2}:ei?{start:t-n,end:t}:{start:t,end:t+n}}function hr(e,t,n,a,i){const r=Math.abs(Math.sin(n)),o=Math.abs(Math.cos(n));let s=0,l=0;a.startt.r&&(s=(a.end-t.r)/r,e.r=Math.max(e.r,t.r+s)),i.startt.b&&(l=(i.end-t.b)/o,e.b=Math.max(e.b,t.b+l))}function pr(e,t,n){const a=e.drawingArea,{extra:i,additionalAngle:r,padding:o,size:s}=n,l=e.getPointPosition(t,a+i+o,r),u=Math.round(H(Q(l.angle+z))),c=function(e,t,n){return 90===n||270===n?e-=t/2:(n>270||n<90)&&(e-=t),e}(l.y,s.h,u),d=function(e){return 0===e||180===e?"center":e<180?"left":"right"}(u),h=function(e,t,n){return"right"===n?e-=t:"center"===n&&(e-=t/2),e}(l.x,s.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:h,top:c,right:h+s.w,bottom:c+s.h}}function fr(e,t){if(!t)return!0;const{left:n,top:a,right:i,bottom:r}=e;return!(Et({x:n,y:a},t)||Et({x:n,y:r},t)||Et({x:i,y:a},t)||Et({x:i,y:r},t))}function mr(e,t,n){const{left:i,top:r,right:o,bottom:s}=n,{backdropColor:l}=t;if(!a(l)){const n=vn(t.borderRadius),a=bn(t.backdropPadding);e.fillStyle=l;const u=i-a.left,c=r-a.top,d=o-i+a.width,h=s-r+a.height;Object.values(n).some(e=>0!==e)?(e.beginPath(),Ot(e,{x:u,y:c,w:d,h:h,radius:n}),e.fill()):e.fillRect(u,c,d,h)}}function _r(e,t,n,a){const{ctx:i}=e;if(n)i.arc(e.xCenter,e.yCenter,t,0,A);else{let n=e.getPointPosition(0,t);i.moveTo(n.x,n.y);for(let r=1;re,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(e){super(e),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const e=this._padding=bn(cr(this.options)/2),t=this.width=this.maxWidth-e.width,n=this.height=this.maxHeight-e.height;this.xCenter=Math.floor(this.left+t/2+e.left),this.yCenter=Math.floor(this.top+n/2+e.top),this.drawingArea=Math.floor(Math.min(t,n)/2)}determineDataLimits(){const{min:e,max:t}=this.getMinMax(!1);this.min=o(e)&&!isNaN(e)?e:0,this.max=o(t)&&!isNaN(t)?t:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/cr(this.options))}generateTickLabels(e){ar.prototype.generateTickLabels.call(this,e),this._pointLabels=this.getLabels().map((e,t)=>{const n=d(this.options.pointLabels.callback,[e,t],this);return n||0===n?n:""}).filter((e,t)=>this.chart.getDataVisibility(t))}fit(){const e=this.options;e.display&&e.pointLabels.display?function(e){const t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},n=Object.assign({},t),a=[],r=[],o=e._pointLabels.length,s=e.options.pointLabels,l=s.centerPointLabels?E/o:0;for(let h=0;h=0&&e=0;i--){const t=e._pointLabelItems[i];if(!t.visible)continue;const r=a.setContext(e.getPointLabelContext(i));mr(n,r,t);const o=yn(r.font),{x:s,y:l,textAlign:u}=t;Nt(n,e._pointLabels[i],s,l+o.lineHeight/2,o,{color:r.color,textAlign:u,textBaseline:"middle"})}}(this,r),a.display&&this.ticks.forEach((e,t)=>{if(0!==t||0===t&&this.min<0){s=this.getDistanceFromCenterForValue(e.value);const n=this.getContext(t),o=a.setContext(n),l=i.setContext(n);!function(e,t,n,a,i){const r=e.ctx,o=t.circular,{color:s,lineWidth:l}=t;!o&&!a||!s||!l||n<0||(r.save(),r.strokeStyle=s,r.lineWidth=l,r.setLineDash(i.dash||[]),r.lineDashOffset=i.dashOffset,r.beginPath(),_r(e,n,o,a),r.closePath(),r.stroke(),r.restore())}(this,o,s,r,l)}}),n.display){for(e.save(),o=r-1;o>=0;o--){const a=n.setContext(this.getPointLabelContext(o)),{color:i,lineWidth:r}=a;r&&i&&(e.lineWidth=r,e.strokeStyle=i,e.setLineDash(a.borderDash),e.lineDashOffset=a.borderDashOffset,s=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),l=this.getPointPosition(o,s),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(l.x,l.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){const e=this.ctx,t=this.options,n=t.ticks;if(!n.display)return;const a=this.getIndexAngle(0);let i,r;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(a),e.textAlign="center",e.textBaseline="middle",this.ticks.forEach((a,o)=>{if(0===o&&this.min>=0&&!t.reverse)return;const s=n.setContext(this.getContext(o)),l=yn(s.font);if(i=this.getDistanceFromCenterForValue(this.ticks[o].value),s.showLabelBackdrop){e.font=l.string,r=e.measureText(a.label).width,e.fillStyle=s.backdropColor;const t=bn(s.backdropPadding);e.fillRect(-r/2-t.left,-i-l.size/2-t.top,r+t.width,l.size+t.height)}Nt(e,a.label,0,-i,l,{color:s.color,strokeColor:s.textStrokeColor,strokeWidth:s.textStrokeWidth})}),e.restore()}drawTitle(){}}const vr={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},br=Object.keys(vr);function yr(e,t){return e-t}function wr(e,t){if(a(t))return null;const n=e._adapter,{parser:i,round:r,isoWeekday:s}=e._parseOpts;let l=t;return"function"==typeof i&&(l=i(l)),o(l)||(l="string"==typeof i?n.parse(l,i):n.parse(l)),null===l?null:(r&&(l="week"!==r||!F(s)&&!0!==s?n.startOf(l,r):n.startOf(l,"isoWeek",s)),+l)}function kr(e,t,n,a){const i=br.length;for(let r=br.indexOf(e);r=t?n[a]:n[i]]=!0}}else e[t]=!0}function Sr(e,t,n){const a=[],i={},r=t.length;let o,s;for(o=0;o=0&&(t[l].major=!0);return t}(e,a,i,n):a}class Cr extends Ga{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(e){super(e),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(e,t={}){const n=e.time||(e.time={}),a=this._adapter=new Ci._date(e.adapters.date);a.init(t),v(n.displayFormats,a.formats()),this._parseOpts={parser:n.parser,round:n.round,isoWeekday:n.isoWeekday},super.init(e),this._normalized=t.normalized}parse(e,t){return void 0===e?null:wr(this,e)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const e=this.options,t=this._adapter,n=e.time.unit||"day";let{min:a,max:i,minDefined:r,maxDefined:s}=this.getUserBounds();function l(e){r||isNaN(e.min)||(a=Math.min(a,e.min)),s||isNaN(e.max)||(i=Math.max(i,e.max))}r&&s||(l(this._getLabelBounds()),"ticks"===e.bounds&&"labels"===e.ticks.source||l(this.getMinMax(!1))),a=o(a)&&!isNaN(a)?a:+t.startOf(Date.now(),n),i=o(i)&&!isNaN(i)?i:+t.endOf(Date.now(),n)+1,this.min=Math.min(a,i-1),this.max=Math.max(a+1,i)}_getLabelBounds(){const e=this.getLabelTimestamps();let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;return e.length&&(t=e[0],n=e[e.length-1]),{min:t,max:n}}buildTicks(){const e=this.options,t=e.time,n=e.ticks,a="labels"===n.source?this.getLabelTimestamps():this._generate();"ticks"===e.bounds&&a.length&&(this.min=this._userMin||a[0],this.max=this._userMax||a[a.length-1]);const i=this.min,r=ie(a,i,this.max);return this._unit=t.unit||(n.autoSkip?kr(t.minUnit,this.min,this.max,this._getLabelCapacity(i)):function(e,t,n,a,i){for(let r=br.length-1;r>=br.indexOf(n);r--){const n=br[r];if(vr[n].common&&e._adapter.diff(i,a,n)>=t-1)return n}return br[n?br.indexOf(n):0]}(this,r.length,t.minUnit,this.min,this.max)),this._majorUnit=n.major.enabled&&"year"!==this._unit?function(e){for(let t=br.indexOf(e)+1,n=br.length;t+e.value))}initOffsets(e=[]){let t,n,a=0,i=0;this.options.offset&&e.length&&(t=this.getDecimalForValue(e[0]),a=1===e.length?1-t:(this.getDecimalForValue(e[1])-t)/2,n=this.getDecimalForValue(e[e.length-1]),i=1===e.length?n:(n-this.getDecimalForValue(e[e.length-2]))/2);const r=e.length<3?.5:.25;a=J(a,0,r),i=J(i,0,r),this._offsets={start:a,end:i,factor:1/(a+1+i)}}_generate(){const e=this._adapter,t=this.min,n=this.max,a=this.options,i=a.time,r=i.unit||kr(i.minUnit,t,n,this._getLabelCapacity(t)),o=l(a.ticks.stepSize,1),s="week"===r&&i.isoWeekday,u=F(s)||!0===s,c={};let d,h,p=t;if(u&&(p=+e.startOf(p,"isoWeek",s)),p=+e.startOf(p,u?"day":r),e.diff(n,t,r)>1e5*o)throw new Error(t+" and "+n+" are too far apart with stepSize of "+o+" "+r);const f="data"===a.ticks.source&&this.getDataTimestamps();for(d=p,h=0;d+e)}getLabelForValue(e){const t=this._adapter,n=this.options.time;return n.tooltipFormat?t.format(e,n.tooltipFormat):t.format(e,n.displayFormats.datetime)}format(e,t){const n=this.options.time.displayFormats,a=this._unit,i=t||n[a];return this._adapter.format(e,i)}_tickFormatFunction(e,t,n,a){const i=this.options,r=i.ticks.callback;if(r)return d(r,[e,t,n],this);const o=i.time.displayFormats,s=this._unit,l=this._majorUnit,u=s&&o[s],c=l&&o[l],h=n[t],p=l&&c&&h&&h.major;return this._adapter.format(e,a||(p?c:u))}generateTickLabels(e){let t,n,a;for(t=0,n=e.length;t0?o:1}getDataTimestamps(){let e,t,n=this._cache.data||[];if(n.length)return n;const a=this.getMatchingVisibleMetas();if(this._normalized&&a.length)return this._cache.data=a[0].controller.getAllParsedValues(this);for(e=0,t=a.length;e=e[s].pos&&t<=e[l].pos&&({lo:s,hi:l}=ne(e,"pos",t)),({pos:a,time:r}=e[s]),({pos:i,time:o}=e[l])):(t>=e[s].time&&t<=e[l].time&&({lo:s,hi:l}=ne(e,"time",t)),({time:a,pos:r}=e[s]),({time:i,pos:o}=e[l]));const u=i-a;return u?r+(o-r)*(t-a)/u:r}var Pr=Object.freeze({__proto__:null,CategoryScale:class extends Ga{static id="category";static defaults={ticks:{callback:tr}};constructor(e){super(e),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(e){const t=this._addedLabels;if(t.length){const e=this.getLabels();for(const{index:n,label:a}of t)e[n]===a&&e.splice(n,1);this._addedLabels=[]}super.init(e)}parse(e,t){if(a(e))return null;const n=this.getLabels();return((e,t)=>null===e?null:J(Math.round(e),0,t))(t=isFinite(t)&&n[t]===e?t:function(e,t,n,a){const i=e.indexOf(t);return-1===i?((e,t,n,a)=>("string"==typeof t?(n=e.push(t)-1,a.unshift({index:n,label:t})):isNaN(t)&&(n=null),n))(e,t,n,a):i!==e.lastIndexOf(t)?n:i}(n,e,l(t,e),this._addedLabels),n.length-1)}determineDataLimits(){const{minDefined:e,maxDefined:t}=this.getUserBounds();let{min:n,max:a}=this.getMinMax(!0);"ticks"===this.options.bounds&&(e||(n=0),t||(a=this.getLabels().length-1)),this.min=n,this.max=a}buildTicks(){const e=this.min,t=this.max,n=this.options.offset,a=[];let i=this.getLabels();i=0===e&&t===i.length-1?i:i.slice(e,t+1),this._valueRange=Math.max(i.length-(n?0:1),1),this._startValue=this.min-(n?.5:0);for(let n=e;n<=t;n++)a.push({value:n});return a}getLabelForValue(e){return tr.call(this,e)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(e){return"number"!=typeof e&&(e=this.parse(e)),null===e?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getPixelForTick(e){const t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:ir,LogarithmicScale:ur,RadialLinearScale:gr,TimeScale:Cr,TimeSeriesScale:class extends Cr{static id="timeseries";static defaults=Cr.defaults;constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=Tr(t,this.min),this._tableRange=Tr(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){const{min:t,max:n}=this,a=[],i=[];let r,o,s,l,u;for(r=0,o=e.length;r=t&&l<=n&&a.push(l);if(a.length<2)return[{time:t,pos:0},{time:n,pos:1}];for(r=0,o=a.length;re-t)}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;const t=this.getDataTimestamps(),n=this.getLabelTimestamps();return e=t.length&&n.length?this.normalize(t.concat(n)):t.length?t:n,e=this._cache.all=e,e}getDecimalForValue(e){return(Tr(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){const t=this._offsets,n=this.getDecimalForPixel(e)/t.factor-t.end;return Tr(this._table,n*this._tableRange+this._minPos,!0)}}});const Er=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Ar=Er.map(e=>e.replace("rgb(","rgba(").replace(")",", 0.5)"));function Lr(e){return Er[e%Er.length]}function Mr(e){return Ar[e%Ar.length]}function Rr(e){let t;for(t in e)if(e[t].borderColor||e[t].backgroundColor)return!0;return!1}var zr={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(e,t,n){if(!n.enabled)return;const{data:{datasets:a},options:i}=e.config,{elements:r}=i,o=Rr(a)||(s=i)&&(s.borderColor||s.backgroundColor)||r&&Rr(r)||"rgba(0,0,0,0.1)"!==st.borderColor||"rgba(0,0,0,0.1)"!==st.backgroundColor;var s;if(!n.forceOverride&&o)return;const l=function(e){let t=0;return(n,a)=>{const i=e.getDatasetMeta(a).controller;i instanceof Ii?t=function(e,t){return e.backgroundColor=e.data.map(()=>Lr(t++)),t}(n,t):i instanceof Ni?t=function(e,t){return e.backgroundColor=e.data.map(()=>Mr(t++)),t}(n,t):i&&(t=function(e,t){return e.borderColor=Lr(t),e.backgroundColor=Mr(t),++t}(n,t))}}(e);a.forEach(l)}};function Ir(e){if(e._decimated){const t=e._data;delete e._decimated,delete e._data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function Nr(e){e.data.datasets.forEach(e=>{Ir(e)})}var Or={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(e,t,n)=>{if(!n.enabled)return void Nr(e);const i=e.width;e.data.datasets.forEach((t,r)=>{const{_data:o,indexAxis:s}=t,l=e.getDatasetMeta(r),u=o||t.data;if("y"===wn([s,e.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=e.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(e.options.parsing)return;let d,{start:h,count:p}=function(e,t){const n=t.length;let a,i=0;const{iScale:r}=e,{min:o,max:s,minDefined:l,maxDefined:u}=r.getUserBounds();return l&&(i=J(ne(t,r.axis,o).lo,0,n-1)),a=u?J(ne(t,r.axis,s).hi+1,i,n)-i:n-i,{start:i,count:a}}(l,u);if(p<=(n.threshold||4*i))Ir(t);else{switch(a(o)&&(t._data=u,delete t.data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(e){this._data=e}})),n.algorithm){case"lttb":d=function(e,t,n,a,i){const r=i.samples||a;if(r>=n)return e.slice(t,t+n);const o=[],s=(n-2)/(r-2);let l=0;const u=t+n-1;let c,d,h,p,f,m=t;for(o[l++]=e[m],c=0;ch&&(h=p,d=e[a],f=a);o[l++]=d,m=f}return o[l++]=e[u],o}(u,h,p,i,n);break;case"min-max":d=function(e,t,n,i){let r,o,s,l,u,c,d,h,p,f,m=0,_=0;const g=[],v=t+n-1,b=e[t].x,y=e[v].x-b;for(r=t;rf&&(f=l,d=r),m=(_*m+o.x)/++_;else{const n=r-1;if(!a(c)&&!a(d)){const t=Math.min(c,d),a=Math.max(c,d);t!==h&&t!==n&&g.push({...e[t],x:m}),a!==h&&a!==n&&g.push({...e[a],x:m})}r>0&&n!==h&&g.push(e[n]),g.push(o),u=t,_=0,p=f=l,c=d=h=r}}return g}(u,h,p,i);break;default:throw new Error(`Unsupported decimation algorithm '${n.algorithm}'`)}t._decimated=d}})},destroy(e){Nr(e)}};function jr(e,t,n,a){if(a)return;let i=t[e],r=n[e];return"angle"===e&&(i=Q(i),r=Q(r)),{property:e,start:i,end:r}}function Dr(e,t,n){for(;t>e;t--){const e=n[t];if(!isNaN(e.x)&&!isNaN(e.y))break}return t}function qr(e,t,n,a){return e&&t?a(e[n],t[n]):e?e[n]:t?t[n]:0}function Br(e,t){let n=[],a=!1;return i(e)?(a=!0,n=e):n=function(e,t){const{x:n=null,y:a=null}=e||{},i=t.points,r=[];return t.segments.forEach(({start:e,end:t})=>{t=Dr(e,t,i);const o=i[e],s=i[t];null!==a?(r.push({x:o.x,y:a}),r.push({x:s.x,y:a})):null!==n&&(r.push({x:n,y:o.y}),r.push({x:n,y:s.y}))}),r}(e,t),n.length?new Wi({points:n,options:{tension:0},_loop:a,_fullLoop:a}):null}function Fr(e){return e&&!1!==e.fill}function Vr(e,t,n){let a=e[t].fill;const i=[t];let r;if(!n)return a;for(;!1!==a&&-1===i.indexOf(a);){if(!o(a))return a;if(r=e[a],!r)return!1;if(r.visible)return a;i.push(a),a=r.fill}return!1}function Ur(e,t,n){const a=function(e){const t=e.options,n=t.fill;let a=l(n&&n.target,n);return void 0===a&&(a=!!t.backgroundColor),!1!==a&&null!==a&&(!0===a?"origin":a)}(e);if(r(a))return!isNaN(a.value)&&a;let i=parseFloat(a);return o(i)&&Math.floor(i)===i?function(e,t,n,a){return"-"!==e&&"+"!==e||(n=t+n),!(n===t||n<0||n>=a)&&n}(a[0],t,i,n):["origin","start","end","stack","shape"].indexOf(a)>=0&&a}function $r(e,t,n){const a=[];for(let i=0;i=0;--t){const n=i[t].$filler;n&&(n.line.updateControlPoints(r,n.axis),a&&n.fill&&Kr(e.ctx,n,r))}},beforeDatasetsDraw(e,t,n){if("beforeDatasetsDraw"!==n.drawTime)return;const a=e.getSortedVisibleDatasetMetas();for(let t=a.length-1;t>=0;--t){const n=a[t].$filler;Fr(n)&&Kr(e.ctx,n,e.chartArea)}},beforeDatasetDraw(e,t,n){const a=t.meta.$filler;Fr(a)&&"beforeDatasetDraw"===n.drawTime&&Kr(e.ctx,a,e.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const to=(e,t)=>{let{boxHeight:n=t,boxWidth:a=t}=e;return e.usePointStyle&&(n=Math.min(n,t),a=e.pointStyleWidth||Math.min(a,t)),{boxWidth:a,boxHeight:n,itemHeight:Math.max(t,n)}};class no extends ja{constructor(e){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t,n){this.maxWidth=e,this.maxHeight=t,this._margins=n,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const e=this.options.labels||{};let t=d(e.generateLabels,[this.chart],this)||[];e.filter&&(t=t.filter(t=>e.filter(t,this.chart.data))),e.sort&&(t=t.sort((t,n)=>e.sort(t,n,this.chart.data))),this.options.reverse&&t.reverse(),this.legendItems=t}fit(){const{options:e,ctx:t}=this;if(!e.display)return void(this.width=this.height=0);const n=e.labels,a=yn(n.font),i=a.size,r=this._computeTitleHeight(),{boxWidth:o,itemHeight:s}=to(n,i);let l,u;t.font=a.string,this.isHorizontal()?(l=this.maxWidth,u=this._fitRows(r,i,o,s)+10):(u=this.maxHeight,l=this._fitCols(r,a,o,s)+10),this.width=Math.min(l,e.maxWidth||this.maxWidth),this.height=Math.min(u,e.maxHeight||this.maxHeight)}_fitRows(e,t,n,a){const{ctx:i,maxWidth:r,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],l=this.lineWidths=[0],u=a+o;let c=e;i.textAlign="left",i.textBaseline="middle";let d=-1,h=-u;return this.legendItems.forEach((e,p)=>{const f=n+t/2+i.measureText(e.text).width;(0===p||l[l.length-1]+f+2*o>r)&&(c+=u,l[l.length-(p>0?0:1)]=0,h+=u,d++),s[p]={left:0,top:h,row:d,width:f,height:a},l[l.length-1]+=f+o}),c}_fitCols(e,t,n,a){const{ctx:i,maxHeight:r,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],l=this.columnSizes=[],u=r-e;let c=o,d=0,h=0,p=0,f=0;return this.legendItems.forEach((e,r)=>{const{itemWidth:m,itemHeight:_}=function(e,t,n,a,i){const r=function(e,t,n,a){let i=e.text;return i&&"string"!=typeof i&&(i=i.reduce((e,t)=>e.length>t.length?e:t)),t+n.size/2+a.measureText(i).width}(a,e,t,n),o=function(e,t,n){let a=e;return"string"!=typeof t.text&&(a=ao(t,n)),a}(i,a,t.lineHeight);return{itemWidth:r,itemHeight:o}}(n,t,i,e,a);r>0&&h+_+2*o>u&&(c+=d+o,l.push({width:d,height:h}),p+=d+o,f++,d=h=0),s[r]={left:p,top:h,col:f,width:m,height:_},d=Math.max(d,m),h+=_+o}),c+=d,l.push({width:d,height:h}),c}adjustHitBoxes(){if(!this.options.display)return;const e=this._computeTitleHeight(),{legendHitBoxes:t,options:{align:n,labels:{padding:a},rtl:i}}=this,r=Sn(i,this.left,this.width);if(this.isHorizontal()){let i=0,o=pe(n,this.left+a,this.right-this.lineWidths[i]);for(const s of t)i!==s.row&&(i=s.row,o=pe(n,this.left+a,this.right-this.lineWidths[i])),s.top+=this.top+e+a,s.left=r.leftForLtr(r.x(o),s.width),o+=s.width+a}else{let i=0,o=pe(n,this.top+e+a,this.bottom-this.columnSizes[i].height);for(const s of t)s.col!==i&&(i=s.col,o=pe(n,this.top+e+a,this.bottom-this.columnSizes[i].height)),s.top=o,s.left+=this.left+a,s.left=r.leftForLtr(r.x(s.left),s.width),o+=s.height+a}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const e=this.ctx;At(e,this),this._draw(),Lt(e)}}_draw(){const{options:e,columnSizes:t,lineWidths:n,ctx:a}=this,{align:i,labels:r}=e,o=st.color,s=Sn(e.rtl,this.left,this.width),u=yn(r.font),{padding:c}=r,d=u.size,h=d/2;let p;this.drawTitle(),a.textAlign=s.textAlign("left"),a.textBaseline="middle",a.lineWidth=.5,a.font=u.string;const{boxWidth:f,boxHeight:m,itemHeight:_}=to(r,d),g=this.isHorizontal(),v=this._computeTitleHeight();p=g?{x:pe(i,this.left+c,this.right-n[0]),y:this.top+c+v,line:0}:{x:this.left+c,y:pe(i,this.top+v+c,this.bottom-t[0].height),line:0},Cn(this.ctx,e.textDirection);const b=_+c;this.legendItems.forEach((y,w)=>{a.strokeStyle=y.fontColor,a.fillStyle=y.fontColor;const k=a.measureText(y.text).width,x=s.textAlign(y.textAlign||(y.textAlign=r.textAlign)),S=f+h+k;let C=p.x,T=p.y;if(s.setWidth(this.width),g?w>0&&C+S+c>this.right&&(T=p.y+=b,p.line++,C=p.x=pe(i,this.left+c,this.right-n[p.line])):w>0&&T+b>this.bottom&&(C=p.x=C+t[p.line].width+c,p.line++,T=p.y=pe(i,this.top+v+c,this.bottom-t[p.line].height)),function(e,t,n){if(isNaN(f)||f<=0||isNaN(m)||m<0)return;a.save();const i=l(n.lineWidth,1);if(a.fillStyle=l(n.fillStyle,o),a.lineCap=l(n.lineCap,"butt"),a.lineDashOffset=l(n.lineDashOffset,0),a.lineJoin=l(n.lineJoin,"miter"),a.lineWidth=i,a.strokeStyle=l(n.strokeStyle,o),a.setLineDash(l(n.lineDash,[])),r.usePointStyle){const o={radius:m*Math.SQRT2/2,pointStyle:n.pointStyle,rotation:n.rotation,borderWidth:i},l=s.xPlus(e,f/2);Pt(a,o,l,t+h,r.pointStyleWidth&&f)}else{const r=t+Math.max((d-m)/2,0),o=s.leftForLtr(e,f),l=vn(n.borderRadius);a.beginPath(),Object.values(l).some(e=>0!==e)?Ot(a,{x:o,y:r,w:f,h:m,radius:l}):a.rect(o,r,f,m),a.fill(),0!==i&&a.stroke()}a.restore()}(s.x(C),T,y),C=fe(x,C+f+h,g?C+S:this.right,e.rtl),function(e,t,n){Nt(a,n.text,e,t+_/2,u,{strikethrough:n.hidden,textAlign:s.textAlign(n.textAlign)})}(s.x(C),T,y),g)p.x+=S+c;else if("string"!=typeof y.text){const e=u.lineHeight;p.y+=ao(y,e)+c}else p.y+=b}),Tn(this.ctx,e.textDirection)}drawTitle(){const e=this.options,t=e.title,n=yn(t.font),a=bn(t.padding);if(!t.display)return;const i=Sn(e.rtl,this.left,this.width),r=this.ctx,o=t.position,s=n.size/2,l=a.top+s;let u,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),u=this.top+l,c=pe(e.align,c,this.right-d);else{const t=this.columnSizes.reduce((e,t)=>Math.max(e,t.height),0);u=l+pe(e.align,this.top,this.bottom-t-e.labels.padding-this._computeTitleHeight())}const h=pe(o,c,c+d);r.textAlign=i.textAlign(he(o)),r.textBaseline="middle",r.strokeStyle=t.color,r.fillStyle=t.color,r.font=n.string,Nt(r,t.text,h,u,n)}_computeTitleHeight(){const e=this.options.title,t=yn(e.font),n=bn(e.padding);return e.display?t.lineHeight+n.height:0}_getLegendItemAt(e,t){let n,a,i;if(ee(e,this.left,this.right)&&ee(t,this.top,this.bottom))for(i=this.legendHitBoxes,n=0;ne.chart.options.color,boxWidth:40,padding:10,generateLabels(e){const t=e.data.datasets,{labels:{usePointStyle:n,pointStyle:a,textAlign:i,color:r,useBorderRadius:o,borderRadius:s}}=e.legend.options;return e._getSortedDatasetMetas().map(e=>{const l=e.controller.getStyle(n?0:void 0),u=bn(l.borderWidth);return{text:t[e.index].label,fillStyle:l.backgroundColor,fontColor:r,hidden:!e.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(u.width+u.height)/4,strokeStyle:l.borderColor,pointStyle:a||l.pointStyle,rotation:l.rotation,textAlign:i||l.textAlign,borderRadius:o&&(s||l.borderRadius),datasetIndex:e.index}},this)}},title:{color:e=>e.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:e=>!e.startsWith("on"),labels:{_scriptable:e=>!["generateLabels","filter","sort"].includes(e)}}};class ro extends ja{constructor(e){super(),this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t){const n=this.options;if(this.left=0,this.top=0,!n.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=e,this.height=this.bottom=t;const a=i(n.text)?n.text.length:1;this._padding=bn(n.padding);const r=a*yn(n.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=r:this.width=r}isHorizontal(){const e=this.options.position;return"top"===e||"bottom"===e}_drawArgs(e){const{top:t,left:n,bottom:a,right:i,options:r}=this,o=r.align;let s,l,u,c=0;return this.isHorizontal()?(l=pe(o,n,i),u=t+e,s=i-n):("left"===r.position?(l=n+e,u=pe(o,a,t),c=-.5*E):(l=i-e,u=pe(o,t,a),c=.5*E),s=a-t),{titleX:l,titleY:u,maxWidth:s,rotation:c}}draw(){const e=this.ctx,t=this.options;if(!t.display)return;const n=yn(t.font),a=n.lineHeight/2+this._padding.top,{titleX:i,titleY:r,maxWidth:o,rotation:s}=this._drawArgs(a);Nt(e,t.text,0,0,n,{color:t.color,maxWidth:o,rotation:s,textAlign:he(t.align),textBaseline:"middle",translation:[i,r]})}}var oo={id:"title",_element:ro,start(e,t,n){!function(e,t){const n=new ro({ctx:e.ctx,options:t,chart:e});ta.configure(e,n,t),ta.addBox(e,n),e.titleBlock=n}(e,n)},stop(e){const t=e.titleBlock;ta.removeBox(e,t),delete e.titleBlock},beforeUpdate(e,t,n){const a=e.titleBlock;ta.configure(e,a,n),a.options=n},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const so=new WeakMap;var lo={id:"subtitle",start(e,t,n){const a=new ro({ctx:e.ctx,options:n,chart:e});ta.configure(e,a,n),ta.addBox(e,a),so.set(e,a)},stop(e){ta.removeBox(e,so.get(e)),so.delete(e)},beforeUpdate(e,t,n){const a=so.get(e);ta.configure(e,a,n),a.options=n},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const uo={average(e){if(!e.length)return!1;let t,n,a=new Set,i=0,r=0;for(t=0,n=e.length;te+t)/a.size,y:i/r}},nearest(e,t){if(!e.length)return!1;let n,a,i,r=t.x,o=t.y,s=Number.POSITIVE_INFINITY;for(n=0,a=e.length;n-1?e.split("\n"):e}function po(e,t){const{element:n,datasetIndex:a,index:i}=t,r=e.getDatasetMeta(a).controller,{label:o,value:s}=r.getLabelAndValue(i);return{chart:e,label:o,parsed:r.getParsed(i),raw:e.data.datasets[a].data[i],formattedValue:s,dataset:r.getDataset(),dataIndex:i,datasetIndex:a,element:n}}function fo(e,t){const n=e.chart.ctx,{body:a,footer:i,title:r}=e,{boxWidth:o,boxHeight:s}=t,l=yn(t.bodyFont),u=yn(t.titleFont),c=yn(t.footerFont),d=r.length,p=i.length,f=a.length,m=bn(t.padding);let _=m.height,g=0,v=a.reduce((e,t)=>e+t.before.length+t.lines.length+t.after.length,0);v+=e.beforeBody.length+e.afterBody.length,d&&(_+=d*u.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),v&&(_+=f*(t.displayColors?Math.max(s,l.lineHeight):l.lineHeight)+(v-f)*l.lineHeight+(v-1)*t.bodySpacing),p&&(_+=t.footerMarginTop+p*c.lineHeight+(p-1)*t.footerSpacing);let b=0;const y=function(e){g=Math.max(g,n.measureText(e).width+b)};return n.save(),n.font=u.string,h(e.title,y),n.font=l.string,h(e.beforeBody.concat(e.afterBody),y),b=t.displayColors?o+2+t.boxPadding:0,h(a,e=>{h(e.before,y),h(e.lines,y),h(e.after,y)}),b=0,n.font=c.string,h(e.footer,y),n.restore(),g+=m.width,{width:g,height:_}}function mo(e,t,n,a){const{x:i,width:r}=n,{width:o,chartArea:{left:s,right:l}}=e;let u="center";return"center"===a?u=i<=(s+l)/2?"left":"right":i<=r/2?u="left":i>=o-r/2&&(u="right"),function(e,t,n,a){const{x:i,width:r}=a,o=n.caretSize+n.caretPadding;return"left"===e&&i+r+o>t.width||"right"===e&&i-r-o<0||void 0}(u,e,t,n)&&(u="center"),u}function _o(e,t,n){const a=n.yAlign||t.yAlign||function(e,t){const{y:n,height:a}=t;return ne.height-a/2?"bottom":"center"}(e,n);return{xAlign:n.xAlign||t.xAlign||mo(e,t,n,a),yAlign:a}}function go(e,t,n,a){const{caretSize:i,caretPadding:r,cornerRadius:o}=e,{xAlign:s,yAlign:l}=n,u=i+r,{topLeft:c,topRight:d,bottomLeft:h,bottomRight:p}=vn(o);let f=function(e,t){let{x:n,width:a}=e;return"right"===t?n-=a:"center"===t&&(n-=a/2),n}(t,s);const m=function(e,t,n){let{y:a,height:i}=e;return"top"===t?a+=n:a-="bottom"===t?i+n:i/2,a}(t,l,u);return"center"===l?"left"===s?f+=u:"right"===s&&(f-=u):"left"===s?f-=Math.max(c,h)+i:"right"===s&&(f+=Math.max(d,p)+i),{x:J(f,0,a.width-t.width),y:J(m,0,a.height-t.height)}}function vo(e,t,n){const a=bn(n.padding);return"center"===t?e.x+e.width/2:"right"===t?e.x+e.width-a.right:e.x+a.left}function bo(e){return co([],ho(e))}function yo(e,t){const n=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return n?e.override(n):e}const wo={beforeTitle:t,title(e){if(e.length>0){const t=e[0],n=t.chart.data.labels,a=n?n.length:0;if(this&&this.options&&"dataset"===this.options.mode)return t.dataset.label||"";if(t.label)return t.label;if(a>0&&t.dataIndex{const t={before:[],lines:[],after:[]},i=yo(n,e);co(t.before,ho(ko(i,"beforeLabel",this,e))),co(t.lines,ko(i,"label",this,e)),co(t.after,ho(ko(i,"afterLabel",this,e))),a.push(t)}),a}getAfterBody(e,t){return bo(ko(t.callbacks,"afterBody",this,e))}getFooter(e,t){const{callbacks:n}=t,a=ko(n,"beforeFooter",this,e),i=ko(n,"footer",this,e),r=ko(n,"afterFooter",this,e);let o=[];return o=co(o,ho(a)),o=co(o,ho(i)),o=co(o,ho(r)),o}_createItems(e){const t=this._active,n=this.chart.data,a=[],i=[],r=[];let o,s,l=[];for(o=0,s=t.length;oe.filter(t,a,i,n))),e.itemSort&&(l=l.sort((t,a)=>e.itemSort(t,a,n))),h(l,t=>{const n=yo(e.callbacks,t);a.push(ko(n,"labelColor",this,t)),i.push(ko(n,"labelPointStyle",this,t)),r.push(ko(n,"labelTextColor",this,t))}),this.labelColors=a,this.labelPointStyles=i,this.labelTextColors=r,this.dataPoints=l,l}update(e,t){const n=this.options.setContext(this.getContext()),a=this._active;let i,r=[];if(a.length){const e=uo[n.position].call(this,a,this._eventPosition);r=this._createItems(n),this.title=this.getTitle(r,n),this.beforeBody=this.getBeforeBody(r,n),this.body=this.getBody(r,n),this.afterBody=this.getAfterBody(r,n),this.footer=this.getFooter(r,n);const t=this._size=fo(this,n),o=Object.assign({},e,t),s=_o(this.chart,n,o),l=go(n,o,s,this.chart);this.xAlign=s.xAlign,this.yAlign=s.yAlign,i={opacity:1,x:l.x,y:l.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}else 0!==this.opacity&&(i={opacity:0});this._tooltipItems=r,this.$context=void 0,i&&this._resolveAnimations().update(this,i),e&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,n,a){const i=this.getCaretPosition(e,n,a);t.lineTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineTo(i.x3,i.y3)}getCaretPosition(e,t,n){const{xAlign:a,yAlign:i}=this,{caretSize:r,cornerRadius:o}=n,{topLeft:s,topRight:l,bottomLeft:u,bottomRight:c}=vn(o),{x:d,y:h}=e,{width:p,height:f}=t;let m,_,g,v,b,y;return"center"===i?(b=h+f/2,"left"===a?(m=d,_=m-r,v=b+r,y=b-r):(m=d+p,_=m+r,v=b-r,y=b+r),g=m):(_="left"===a?d+Math.max(s,u)+r:"right"===a?d+p-Math.max(l,c)-r:this.caretX,"top"===i?(v=h,b=v-r,m=_-r,g=_+r):(v=h+f,b=v+r,m=_+r,g=_-r),y=v),{x1:m,x2:_,x3:g,y1:v,y2:b,y3:y}}drawTitle(e,t,n){const a=this.title,i=a.length;let r,o,s;if(i){const l=Sn(n.rtl,this.x,this.width);for(e.x=vo(this,n.titleAlign,n),t.textAlign=l.textAlign(n.titleAlign),t.textBaseline="middle",r=yn(n.titleFont),o=n.titleSpacing,t.fillStyle=n.titleColor,t.font=r.string,s=0;s0!==e)?(e.beginPath(),e.fillStyle=i.multiKeyBackground,Ot(e,{x:t,y:f,w:u,h:l,radius:s}),e.fill(),e.stroke(),e.fillStyle=o.backgroundColor,e.beginPath(),Ot(e,{x:n,y:f+1,w:u-2,h:l-2,radius:s}),e.fill()):(e.fillStyle=i.multiKeyBackground,e.fillRect(t,f,u,l),e.strokeRect(t,f,u,l),e.fillStyle=o.backgroundColor,e.fillRect(n,f+1,u-2,l-2))}e.fillStyle=this.labelTextColors[n]}drawBody(e,t,n){const{body:a}=this,{bodySpacing:i,bodyAlign:r,displayColors:o,boxHeight:s,boxWidth:l,boxPadding:u}=n,c=yn(n.bodyFont);let d=c.lineHeight,p=0;const f=Sn(n.rtl,this.x,this.width),m=function(n){t.fillText(n,f.x(e.x+p),e.y+d/2),e.y+=d+i},_=f.textAlign(r);let g,v,b,y,w,k,x;for(t.textAlign=r,t.textBaseline="middle",t.font=c.string,e.x=vo(this,_,n),t.fillStyle=n.bodyColor,h(this.beforeBody,m),p=o&&"right"!==_?"center"===r?l/2+u:l+2+u:0,y=0,k=a.length;y0&&t.stroke()}_updateAnimationTarget(e){const t=this.chart,n=this.$animations,a=n&&n.x,i=n&&n.y;if(a||i){const n=uo[e.position].call(this,this._active,this._eventPosition);if(!n)return;const r=this._size=fo(this,e),o=Object.assign({},n,this._size),s=_o(t,e,o),l=go(e,o,s,t);a._to===l.x&&i._to===l.y||(this.xAlign=s.xAlign,this.yAlign=s.yAlign,this.width=r.width,this.height=r.height,this.caretX=n.x,this.caretY=n.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(e){const t=this.options.setContext(this.getContext());let n=this.opacity;if(!n)return;this._updateAnimationTarget(t);const a={width:this.width,height:this.height},i={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;const r=bn(t.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&o&&(e.save(),e.globalAlpha=n,this.drawBackground(i,e,a,t),Cn(e,t.textDirection),i.y+=r.top,this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),Tn(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){const n=this._active,a=e.map(({datasetIndex:e,index:t})=>{const n=this.chart.getDatasetMeta(e);if(!n)throw new Error("Cannot find a dataset at index "+e);return{datasetIndex:e,element:n.data[t],index:t}}),i=!p(n,a),r=this._positionChanged(a,t);(i||r)&&(this._active=a,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,n=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const a=this.options,i=this._active||[],r=this._getActiveElements(e,i,t,n),o=this._positionChanged(r,e),s=t||!p(r,i)||o;return s&&(this._active=r,(a.enabled||a.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),s}_getActiveElements(e,t,n,a){const i=this.options;if("mouseout"===e.type)return[];if(!a)return t.filter(e=>this.chart.data.datasets[e.datasetIndex]&&void 0!==this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index));const r=this.chart.getElementsAtEventForMode(e,i.mode,i,n);return i.reverse&&r.reverse(),r}_positionChanged(e,t){const{caretX:n,caretY:a,options:i}=this,r=uo[i.position].call(this,e,t);return!1!==r&&(n!==r.x||a!==r.y)}}var So={id:"tooltip",_element:xo,positioners:uo,afterInit(e,t,n){n&&(e.tooltip=new xo({chart:e,options:n}))},beforeUpdate(e,t,n){e.tooltip&&e.tooltip.initialize(n)},reset(e,t,n){e.tooltip&&e.tooltip.initialize(n)},afterDraw(e){const t=e.tooltip;if(t&&t._willRender()){const n={tooltip:t};if(!1===e.notifyPlugins("beforeTooltipDraw",{...n,cancelable:!0}))return;t.draw(e.ctx),e.notifyPlugins("afterTooltipDraw",n)}},afterEvent(e,t){if(e.tooltip){const n=t.replay;e.tooltip.handleEvent(t.event,n,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:wo},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:e=>"filter"!==e&&"itemSort"!==e&&"external"!==e,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};return wi.register(Oi,Pr,er,e),wi.helpers={...jn},wi._adapters=Ci,wi.Animation=xa,wi.Animations=Sa,wi.animator=ge,wi.controllers=Ya.controllers.items,wi.DatasetController=Oa,wi.Element=ja,wi.elements=er,wi.Interaction=Un,wi.layouts=ta,wi.platforms=ya,wi.Scale=Ga,wi.Ticks=nt,Object.assign(wi,Oi,Pr,er,e,ya),wi.Chart=wi,"undefined"!=typeof window&&(window.Chart=wi),wi}),/*! showdown v 2.1.0 - 21-04-2022 */ -function(){function e(e){"use strict";var t={omitExtraWLInCodeBlocks:{defaultValue:!1,describe:"Omit the default extra whiteline added to code blocks",type:"boolean"},noHeaderId:{defaultValue:!1,describe:"Turn on/off generated header id",type:"boolean"},prefixHeaderId:{defaultValue:!1,describe:"Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic 'section-' prefix",type:"string"},rawPrefixHeaderId:{defaultValue:!1,describe:'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)',type:"boolean"},ghCompatibleHeaderId:{defaultValue:!1,describe:"Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)",type:"boolean"},rawHeaderId:{defaultValue:!1,describe:"Remove only spaces, ' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids",type:"boolean"},headerLevelStart:{defaultValue:!1,describe:"The header blocks level start",type:"integer"},parseImgDimensions:{defaultValue:!1,describe:"Turn on/off image dimension parsing",type:"boolean"},simplifiedAutoLink:{defaultValue:!1,describe:"Turn on/off GFM autolink style",type:"boolean"},excludeTrailingPunctuationFromURLs:{defaultValue:!1,describe:"Excludes trailing punctuation from links generated with autoLinking",type:"boolean"},literalMidWordUnderscores:{defaultValue:!1,describe:"Parse midword underscores as literal underscores",type:"boolean"},literalMidWordAsterisks:{defaultValue:!1,describe:"Parse midword asterisks as literal asterisks",type:"boolean"},strikethrough:{defaultValue:!1,describe:"Turn on/off strikethrough support",type:"boolean"},tables:{defaultValue:!1,describe:"Turn on/off tables support",type:"boolean"},tablesHeaderId:{defaultValue:!1,describe:"Add an id to table headers",type:"boolean"},ghCodeBlocks:{defaultValue:!0,describe:"Turn on/off GFM fenced code blocks support",type:"boolean"},tasklists:{defaultValue:!1,describe:"Turn on/off GFM tasklist support",type:"boolean"},smoothLivePreview:{defaultValue:!1,describe:"Prevents weird effects in live previews due to incomplete input",type:"boolean"},smartIndentationFix:{defaultValue:!1,describe:"Tries to smartly fix indentation in es6 strings",type:"boolean"},disableForced4SpacesIndentedSublists:{defaultValue:!1,describe:"Disables the requirement of indenting nested sublists by 4 spaces",type:"boolean"},simpleLineBreaks:{defaultValue:!1,describe:"Parses simple line breaks as
(GFM Style)",type:"boolean"},requireSpaceBeforeHeadingText:{defaultValue:!1,describe:"Makes adding a space between `#` and the header text mandatory (GFM Style)",type:"boolean"},ghMentions:{defaultValue:!1,describe:"Enables github @mentions",type:"boolean"},ghMentionsLink:{defaultValue:"https://github.com/{u}",describe:"Changes the link generated by @mentions. Only applies if ghMentions option is enabled.",type:"string"},encodeEmails:{defaultValue:!0,describe:"Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities",type:"boolean"},openLinksInNewWindow:{defaultValue:!1,describe:"Open all links in new windows",type:"boolean"},backslashEscapesHTMLTags:{defaultValue:!1,describe:"Support for HTML Tag escaping. ex:
foo
",type:"boolean"},emoji:{defaultValue:!1,describe:"Enable emoji support. Ex: `this is a :smile: emoji`",type:"boolean"},underline:{defaultValue:!1,describe:"Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``",type:"boolean"},ellipsis:{defaultValue:!0,describe:"Replaces three dots with the ellipsis unicode character",type:"boolean"},completeHTMLDocument:{defaultValue:!1,describe:"Outputs a complete html document, including ``, `` and `` tags",type:"boolean"},metadata:{defaultValue:!1,describe:"Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).",type:"boolean"},splitAdjacentBlockquotes:{defaultValue:!1,describe:"Split adjacent blockquote blocks",type:"boolean"}};if(!1===e)return JSON.parse(JSON.stringify(t));var n={};for(var a in t)t.hasOwnProperty(a)&&(n[a]=t[a].defaultValue);return n}var t={},n={},a={},i=e(!0),r="vanilla",o={github:{omitExtraWLInCodeBlocks:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,disableForced4SpacesIndentedSublists:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghCompatibleHeaderId:!0,ghMentions:!0,backslashEscapesHTMLTags:!0,emoji:!0,splitAdjacentBlockquotes:!0},original:{noHeaderId:!0,ghCodeBlocks:!1},ghost:{omitExtraWLInCodeBlocks:!0,parseImgDimensions:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,smoothLivePreview:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghMentions:!1,encodeEmails:!0},vanilla:e(!0),allOn:function(){"use strict";var t=e(!0),n={};for(var a in t)t.hasOwnProperty(a)&&(n[a]=!0);return n}()};function s(e,n){"use strict";var a=n?"Error in "+n+" extension->":"Error in unnamed extension",i={valid:!0,error:""};t.helper.isArray(e)||(e=[e]);for(var r=0;r").replace(/&/g,"&")};var u=function(e,t,n,a){"use strict";var i,r,o,s,l,u=a||"",c=u.indexOf("g")>-1,d=new RegExp(t+"|"+n,"g"+u.replace(/g/g,"")),h=new RegExp(t,u.replace(/g/g,"")),p=[];do{for(i=0;o=d.exec(e);)if(h.test(o[0]))i++||(s=(r=d.lastIndex)-o[0].length);else if(i&&! --i){l=o.index+o[0].length;var f={left:{start:s,end:r},match:{start:r,end:o.index},right:{start:o.index,end:l},wholeMatch:{start:s,end:l}};if(p.push(f),!c)return p}}while(i&&(d.lastIndex=r));return p};t.helper.matchRecursiveRegExp=function(e,t,n,a){"use strict";for(var i=u(e,t,n,a),r=[],o=0;o0){var d=[];0!==s[0].wholeMatch.start&&d.push(e.slice(0,s[0].wholeMatch.start));for(var h=0;h=0?i+(a||0):i},t.helper.splitAtIndex=function(e,n){"use strict";if(!t.helper.isString(e))throw"InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string";return[e.substring(0,n),e.substring(n)]},t.helper.encodeEmailAddress=function(e){"use strict";var t=[function(e){return"&#"+e.charCodeAt(0)+";"},function(e){return"&#x"+e.charCodeAt(0).toString(16)+";"},function(e){return e}];return e=e.replace(/./g,function(e){if("@"===e)e=t[Math.floor(2*Math.random())](e);else{var n=Math.random();e=n>.9?t[2](e):n>.45?t[1](e):t[0](e)}return e})},t.helper.padEnd=function(e,t,n){"use strict";return t|=0,n=String(n||" "),e.length>t?String(e):((t-=e.length)>n.length&&(n+=n.repeat(t/n.length)),String(e)+n.slice(0,t))},"undefined"==typeof console&&(console={warn:function(e){"use strict";alert(e)},log:function(e){"use strict";alert(e)},error:function(e){"use strict";throw e}}),t.helper.regexes={asteriskDashAndColon:/([*_:~])/g},t.helper.emojis={"+1":"👍","-1":"👎",100:"💯",1234:"🔢","1st_place_medal":"🥇","2nd_place_medal":"🥈","3rd_place_medal":"🥉","8ball":"🎱",a:"🅰️",ab:"🆎",abc:"🔤",abcd:"🔡",accept:"🉑",aerial_tramway:"🚡",airplane:"✈️",alarm_clock:"⏰",alembic:"⚗️",alien:"👽",ambulance:"🚑",amphora:"🏺",anchor:"⚓️",angel:"👼",anger:"💢",angry:"😠",anguished:"😧",ant:"🐜",apple:"🍎",aquarius:"♒️",aries:"♈️",arrow_backward:"◀️",arrow_double_down:"⏬",arrow_double_up:"⏫",arrow_down:"⬇️",arrow_down_small:"🔽",arrow_forward:"▶️",arrow_heading_down:"⤵️",arrow_heading_up:"⤴️",arrow_left:"⬅️",arrow_lower_left:"↙️",arrow_lower_right:"↘️",arrow_right:"➡️",arrow_right_hook:"↪️",arrow_up:"⬆️",arrow_up_down:"↕️",arrow_up_small:"🔼",arrow_upper_left:"↖️",arrow_upper_right:"↗️",arrows_clockwise:"🔃",arrows_counterclockwise:"🔄",art:"🎨",articulated_lorry:"🚛",artificial_satellite:"🛰",astonished:"😲",athletic_shoe:"👟",atm:"🏧",atom_symbol:"⚛️",avocado:"🥑",b:"🅱️",baby:"👶",baby_bottle:"🍼",baby_chick:"🐤",baby_symbol:"🚼",back:"🔙",bacon:"🥓",badminton:"🏸",baggage_claim:"🛄",baguette_bread:"🥖",balance_scale:"⚖️",balloon:"🎈",ballot_box:"🗳",ballot_box_with_check:"☑️",bamboo:"🎍",banana:"🍌",bangbang:"‼️",bank:"🏦",bar_chart:"📊",barber:"💈",baseball:"⚾️",basketball:"🏀",basketball_man:"⛹️",basketball_woman:"⛹️‍♀️",bat:"🦇",bath:"🛀",bathtub:"🛁",battery:"🔋",beach_umbrella:"🏖",bear:"🐻",bed:"🛏",bee:"🐝",beer:"🍺",beers:"🍻",beetle:"🐞",beginner:"🔰",bell:"🔔",bellhop_bell:"🛎",bento:"🍱",biking_man:"🚴",bike:"🚲",biking_woman:"🚴‍♀️",bikini:"👙",biohazard:"☣️",bird:"🐦",birthday:"🎂",black_circle:"⚫️",black_flag:"🏴",black_heart:"🖤",black_joker:"🃏",black_large_square:"⬛️",black_medium_small_square:"◾️",black_medium_square:"◼️",black_nib:"✒️",black_small_square:"▪️",black_square_button:"🔲",blonde_man:"👱",blonde_woman:"👱‍♀️",blossom:"🌼",blowfish:"🐡",blue_book:"📘",blue_car:"🚙",blue_heart:"💙",blush:"😊",boar:"🐗",boat:"⛵️",bomb:"💣",book:"📖",bookmark:"🔖",bookmark_tabs:"📑",books:"📚",boom:"💥",boot:"👢",bouquet:"💐",bowing_man:"🙇",bow_and_arrow:"🏹",bowing_woman:"🙇‍♀️",bowling:"🎳",boxing_glove:"🥊",boy:"👦",bread:"🍞",bride_with_veil:"👰",bridge_at_night:"🌉",briefcase:"💼",broken_heart:"💔",bug:"🐛",building_construction:"🏗",bulb:"💡",bullettrain_front:"🚅",bullettrain_side:"🚄",burrito:"🌯",bus:"🚌",business_suit_levitating:"🕴",busstop:"🚏",bust_in_silhouette:"👤",busts_in_silhouette:"👥",butterfly:"🦋",cactus:"🌵",cake:"🍰",calendar:"📆",call_me_hand:"🤙",calling:"📲",camel:"🐫",camera:"📷",camera_flash:"📸",camping:"🏕",cancer:"♋️",candle:"🕯",candy:"🍬",canoe:"🛶",capital_abcd:"🔠",capricorn:"♑️",car:"🚗",card_file_box:"🗃",card_index:"📇",card_index_dividers:"🗂",carousel_horse:"🎠",carrot:"🥕",cat:"🐱",cat2:"🐈",cd:"💿",chains:"⛓",champagne:"🍾",chart:"💹",chart_with_downwards_trend:"📉",chart_with_upwards_trend:"📈",checkered_flag:"🏁",cheese:"🧀",cherries:"🍒",cherry_blossom:"🌸",chestnut:"🌰",chicken:"🐔",children_crossing:"🚸",chipmunk:"🐿",chocolate_bar:"🍫",christmas_tree:"🎄",church:"⛪️",cinema:"🎦",circus_tent:"🎪",city_sunrise:"🌇",city_sunset:"🌆",cityscape:"🏙",cl:"🆑",clamp:"🗜",clap:"👏",clapper:"🎬",classical_building:"🏛",clinking_glasses:"🥂",clipboard:"📋",clock1:"🕐",clock10:"🕙",clock1030:"🕥",clock11:"🕚",clock1130:"🕦",clock12:"🕛",clock1230:"🕧",clock130:"🕜",clock2:"🕑",clock230:"🕝",clock3:"🕒",clock330:"🕞",clock4:"🕓",clock430:"🕟",clock5:"🕔",clock530:"🕠",clock6:"🕕",clock630:"🕡",clock7:"🕖",clock730:"🕢",clock8:"🕗",clock830:"🕣",clock9:"🕘",clock930:"🕤",closed_book:"📕",closed_lock_with_key:"🔐",closed_umbrella:"🌂",cloud:"☁️",cloud_with_lightning:"🌩",cloud_with_lightning_and_rain:"⛈",cloud_with_rain:"🌧",cloud_with_snow:"🌨",clown_face:"🤡",clubs:"♣️",cocktail:"🍸",coffee:"☕️",coffin:"⚰️",cold_sweat:"😰",comet:"☄️",computer:"💻",computer_mouse:"🖱",confetti_ball:"🎊",confounded:"😖",confused:"😕",congratulations:"㊗️",construction:"🚧",construction_worker_man:"👷",construction_worker_woman:"👷‍♀️",control_knobs:"🎛",convenience_store:"🏪",cookie:"🍪",cool:"🆒",policeman:"👮",copyright:"©️",corn:"🌽",couch_and_lamp:"🛋",couple:"👫",couple_with_heart_woman_man:"💑",couple_with_heart_man_man:"👨‍❤️‍👨",couple_with_heart_woman_woman:"👩‍❤️‍👩",couplekiss_man_man:"👨‍❤️‍💋‍👨",couplekiss_man_woman:"💏",couplekiss_woman_woman:"👩‍❤️‍💋‍👩",cow:"🐮",cow2:"🐄",cowboy_hat_face:"🤠",crab:"🦀",crayon:"🖍",credit_card:"💳",crescent_moon:"🌙",cricket:"🏏",crocodile:"🐊",croissant:"🥐",crossed_fingers:"🤞",crossed_flags:"🎌",crossed_swords:"⚔️",crown:"👑",cry:"😢",crying_cat_face:"😿",crystal_ball:"🔮",cucumber:"🥒",cupid:"💘",curly_loop:"➰",currency_exchange:"💱",curry:"🍛",custard:"🍮",customs:"🛃",cyclone:"🌀",dagger:"🗡",dancer:"💃",dancing_women:"👯",dancing_men:"👯‍♂️",dango:"🍡",dark_sunglasses:"🕶",dart:"🎯",dash:"💨",date:"📅",deciduous_tree:"🌳",deer:"🦌",department_store:"🏬",derelict_house:"🏚",desert:"🏜",desert_island:"🏝",desktop_computer:"🖥",male_detective:"🕵️",diamond_shape_with_a_dot_inside:"💠",diamonds:"♦️",disappointed:"😞",disappointed_relieved:"😥",dizzy:"💫",dizzy_face:"😵",do_not_litter:"🚯",dog:"🐶",dog2:"🐕",dollar:"💵",dolls:"🎎",dolphin:"🐬",door:"🚪",doughnut:"🍩",dove:"🕊",dragon:"🐉",dragon_face:"🐲",dress:"👗",dromedary_camel:"🐪",drooling_face:"🤤",droplet:"💧",drum:"🥁",duck:"🦆",dvd:"📀","e-mail":"📧",eagle:"🦅",ear:"👂",ear_of_rice:"🌾",earth_africa:"🌍",earth_americas:"🌎",earth_asia:"🌏",egg:"🥚",eggplant:"🍆",eight_pointed_black_star:"✴️",eight_spoked_asterisk:"✳️",electric_plug:"🔌",elephant:"🐘",email:"✉️",end:"🔚",envelope_with_arrow:"📩",euro:"💶",european_castle:"🏰",european_post_office:"🏤",evergreen_tree:"🌲",exclamation:"❗️",expressionless:"😑",eye:"👁",eye_speech_bubble:"👁‍🗨",eyeglasses:"👓",eyes:"👀",face_with_head_bandage:"🤕",face_with_thermometer:"🤒",fist_oncoming:"👊",factory:"🏭",fallen_leaf:"🍂",family_man_woman_boy:"👪",family_man_boy:"👨‍👦",family_man_boy_boy:"👨‍👦‍👦",family_man_girl:"👨‍👧",family_man_girl_boy:"👨‍👧‍👦",family_man_girl_girl:"👨‍👧‍👧",family_man_man_boy:"👨‍👨‍👦",family_man_man_boy_boy:"👨‍👨‍👦‍👦",family_man_man_girl:"👨‍👨‍👧",family_man_man_girl_boy:"👨‍👨‍👧‍👦",family_man_man_girl_girl:"👨‍👨‍👧‍👧",family_man_woman_boy_boy:"👨‍👩‍👦‍👦",family_man_woman_girl:"👨‍👩‍👧",family_man_woman_girl_boy:"👨‍👩‍👧‍👦",family_man_woman_girl_girl:"👨‍👩‍👧‍👧",family_woman_boy:"👩‍👦",family_woman_boy_boy:"👩‍👦‍👦",family_woman_girl:"👩‍👧",family_woman_girl_boy:"👩‍👧‍👦",family_woman_girl_girl:"👩‍👧‍👧",family_woman_woman_boy:"👩‍👩‍👦",family_woman_woman_boy_boy:"👩‍👩‍👦‍👦",family_woman_woman_girl:"👩‍👩‍👧",family_woman_woman_girl_boy:"👩‍👩‍👧‍👦",family_woman_woman_girl_girl:"👩‍👩‍👧‍👧",fast_forward:"⏩",fax:"📠",fearful:"😨",feet:"🐾",female_detective:"🕵️‍♀️",ferris_wheel:"🎡",ferry:"⛴",field_hockey:"🏑",file_cabinet:"🗄",file_folder:"📁",film_projector:"📽",film_strip:"🎞",fire:"🔥",fire_engine:"🚒",fireworks:"🎆",first_quarter_moon:"🌓",first_quarter_moon_with_face:"🌛",fish:"🐟",fish_cake:"🍥",fishing_pole_and_fish:"🎣",fist_raised:"✊",fist_left:"🤛",fist_right:"🤜",flags:"🎏",flashlight:"🔦",fleur_de_lis:"⚜️",flight_arrival:"🛬",flight_departure:"🛫",floppy_disk:"💾",flower_playing_cards:"🎴",flushed:"😳",fog:"🌫",foggy:"🌁",football:"🏈",footprints:"👣",fork_and_knife:"🍴",fountain:"⛲️",fountain_pen:"🖋",four_leaf_clover:"🍀",fox_face:"🦊",framed_picture:"🖼",free:"🆓",fried_egg:"🍳",fried_shrimp:"🍤",fries:"🍟",frog:"🐸",frowning:"😦",frowning_face:"☹️",frowning_man:"🙍‍♂️",frowning_woman:"🙍",middle_finger:"🖕",fuelpump:"⛽️",full_moon:"🌕",full_moon_with_face:"🌝",funeral_urn:"⚱️",game_die:"🎲",gear:"⚙️",gem:"💎",gemini:"♊️",ghost:"👻",gift:"🎁",gift_heart:"💝",girl:"👧",globe_with_meridians:"🌐",goal_net:"🥅",goat:"🐐",golf:"⛳️",golfing_man:"🏌️",golfing_woman:"🏌️‍♀️",gorilla:"🦍",grapes:"🍇",green_apple:"🍏",green_book:"📗",green_heart:"💚",green_salad:"🥗",grey_exclamation:"❕",grey_question:"❔",grimacing:"😬",grin:"😁",grinning:"😀",guardsman:"💂",guardswoman:"💂‍♀️",guitar:"🎸",gun:"🔫",haircut_woman:"💇",haircut_man:"💇‍♂️",hamburger:"🍔",hammer:"🔨",hammer_and_pick:"⚒",hammer_and_wrench:"🛠",hamster:"🐹",hand:"✋",handbag:"👜",handshake:"🤝",hankey:"💩",hatched_chick:"🐥",hatching_chick:"🐣",headphones:"🎧",hear_no_evil:"🙉",heart:"❤️",heart_decoration:"💟",heart_eyes:"😍",heart_eyes_cat:"😻",heartbeat:"💓",heartpulse:"💗",hearts:"♥️",heavy_check_mark:"✔️",heavy_division_sign:"➗",heavy_dollar_sign:"💲",heavy_heart_exclamation:"❣️",heavy_minus_sign:"➖",heavy_multiplication_x:"✖️",heavy_plus_sign:"➕",helicopter:"🚁",herb:"🌿",hibiscus:"🌺",high_brightness:"🔆",high_heel:"👠",hocho:"🔪",hole:"🕳",honey_pot:"🍯",horse:"🐴",horse_racing:"🏇",hospital:"🏥",hot_pepper:"🌶",hotdog:"🌭",hotel:"🏨",hotsprings:"♨️",hourglass:"⌛️",hourglass_flowing_sand:"⏳",house:"🏠",house_with_garden:"🏡",houses:"🏘",hugs:"🤗",hushed:"😯",ice_cream:"🍨",ice_hockey:"🏒",ice_skate:"⛸",icecream:"🍦",id:"🆔",ideograph_advantage:"🉐",imp:"👿",inbox_tray:"📥",incoming_envelope:"📨",tipping_hand_woman:"💁",information_source:"ℹ️",innocent:"😇",interrobang:"⁉️",iphone:"📱",izakaya_lantern:"🏮",jack_o_lantern:"🎃",japan:"🗾",japanese_castle:"🏯",japanese_goblin:"👺",japanese_ogre:"👹",jeans:"👖",joy:"😂",joy_cat:"😹",joystick:"🕹",kaaba:"🕋",key:"🔑",keyboard:"⌨️",keycap_ten:"🔟",kick_scooter:"🛴",kimono:"👘",kiss:"💋",kissing:"😗",kissing_cat:"😽",kissing_closed_eyes:"😚",kissing_heart:"😘",kissing_smiling_eyes:"😙",kiwi_fruit:"🥝",koala:"🐨",koko:"🈁",label:"🏷",large_blue_circle:"🔵",large_blue_diamond:"🔷",large_orange_diamond:"🔶",last_quarter_moon:"🌗",last_quarter_moon_with_face:"🌜",latin_cross:"✝️",laughing:"😆",leaves:"🍃",ledger:"📒",left_luggage:"🛅",left_right_arrow:"↔️",leftwards_arrow_with_hook:"↩️",lemon:"🍋",leo:"♌️",leopard:"🐆",level_slider:"🎚",libra:"♎️",light_rail:"🚈",link:"🔗",lion:"🦁",lips:"👄",lipstick:"💄",lizard:"🦎",lock:"🔒",lock_with_ink_pen:"🔏",lollipop:"🍭",loop:"➿",loud_sound:"🔊",loudspeaker:"📢",love_hotel:"🏩",love_letter:"💌",low_brightness:"🔅",lying_face:"🤥",m:"Ⓜ️",mag:"🔍",mag_right:"🔎",mahjong:"🀄️",mailbox:"📫",mailbox_closed:"📪",mailbox_with_mail:"📬",mailbox_with_no_mail:"📭",man:"👨",man_artist:"👨‍🎨",man_astronaut:"👨‍🚀",man_cartwheeling:"🤸‍♂️",man_cook:"👨‍🍳",man_dancing:"🕺",man_facepalming:"🤦‍♂️",man_factory_worker:"👨‍🏭",man_farmer:"👨‍🌾",man_firefighter:"👨‍🚒",man_health_worker:"👨‍⚕️",man_in_tuxedo:"🤵",man_judge:"👨‍⚖️",man_juggling:"🤹‍♂️",man_mechanic:"👨‍🔧",man_office_worker:"👨‍💼",man_pilot:"👨‍✈️",man_playing_handball:"🤾‍♂️",man_playing_water_polo:"🤽‍♂️",man_scientist:"👨‍🔬",man_shrugging:"🤷‍♂️",man_singer:"👨‍🎤",man_student:"👨‍🎓",man_teacher:"👨‍🏫",man_technologist:"👨‍💻",man_with_gua_pi_mao:"👲",man_with_turban:"👳",tangerine:"🍊",mans_shoe:"👞",mantelpiece_clock:"🕰",maple_leaf:"🍁",martial_arts_uniform:"🥋",mask:"😷",massage_woman:"💆",massage_man:"💆‍♂️",meat_on_bone:"🍖",medal_military:"🎖",medal_sports:"🏅",mega:"📣",melon:"🍈",memo:"📝",men_wrestling:"🤼‍♂️",menorah:"🕎",mens:"🚹",metal:"🤘",metro:"🚇",microphone:"🎤",microscope:"🔬",milk_glass:"🥛",milky_way:"🌌",minibus:"🚐",minidisc:"💽",mobile_phone_off:"📴",money_mouth_face:"🤑",money_with_wings:"💸",moneybag:"💰",monkey:"🐒",monkey_face:"🐵",monorail:"🚝",moon:"🌔",mortar_board:"🎓",mosque:"🕌",motor_boat:"🛥",motor_scooter:"🛵",motorcycle:"🏍",motorway:"🛣",mount_fuji:"🗻",mountain:"⛰",mountain_biking_man:"🚵",mountain_biking_woman:"🚵‍♀️",mountain_cableway:"🚠",mountain_railway:"🚞",mountain_snow:"🏔",mouse:"🐭",mouse2:"🐁",movie_camera:"🎥",moyai:"🗿",mrs_claus:"🤶",muscle:"💪",mushroom:"🍄",musical_keyboard:"🎹",musical_note:"🎵",musical_score:"🎼",mute:"🔇",nail_care:"💅",name_badge:"📛",national_park:"🏞",nauseated_face:"🤢",necktie:"👔",negative_squared_cross_mark:"❎",nerd_face:"🤓",neutral_face:"😐",new:"🆕",new_moon:"🌑",new_moon_with_face:"🌚",newspaper:"📰",newspaper_roll:"🗞",next_track_button:"⏭",ng:"🆖",no_good_man:"🙅‍♂️",no_good_woman:"🙅",night_with_stars:"🌃",no_bell:"🔕",no_bicycles:"🚳",no_entry:"⛔️",no_entry_sign:"🚫",no_mobile_phones:"📵",no_mouth:"😶",no_pedestrians:"🚷",no_smoking:"🚭","non-potable_water":"🚱",nose:"👃",notebook:"📓",notebook_with_decorative_cover:"📔",notes:"🎶",nut_and_bolt:"🔩",o:"⭕️",o2:"🅾️",ocean:"🌊",octopus:"🐙",oden:"🍢",office:"🏢",oil_drum:"🛢",ok:"🆗",ok_hand:"👌",ok_man:"🙆‍♂️",ok_woman:"🙆",old_key:"🗝",older_man:"👴",older_woman:"👵",om:"🕉",on:"🔛",oncoming_automobile:"🚘",oncoming_bus:"🚍",oncoming_police_car:"🚔",oncoming_taxi:"🚖",open_file_folder:"📂",open_hands:"👐",open_mouth:"😮",open_umbrella:"☂️",ophiuchus:"⛎",orange_book:"📙",orthodox_cross:"☦️",outbox_tray:"📤",owl:"🦉",ox:"🐂",package:"📦",page_facing_up:"📄",page_with_curl:"📃",pager:"📟",paintbrush:"🖌",palm_tree:"🌴",pancakes:"🥞",panda_face:"🐼",paperclip:"📎",paperclips:"🖇",parasol_on_ground:"⛱",parking:"🅿️",part_alternation_mark:"〽️",partly_sunny:"⛅️",passenger_ship:"🛳",passport_control:"🛂",pause_button:"⏸",peace_symbol:"☮️",peach:"🍑",peanuts:"🥜",pear:"🍐",pen:"🖊",pencil2:"✏️",penguin:"🐧",pensive:"😔",performing_arts:"🎭",persevere:"😣",person_fencing:"🤺",pouting_woman:"🙎",phone:"☎️",pick:"⛏",pig:"🐷",pig2:"🐖",pig_nose:"🐽",pill:"💊",pineapple:"🍍",ping_pong:"🏓",pisces:"♓️",pizza:"🍕",place_of_worship:"🛐",plate_with_cutlery:"🍽",play_or_pause_button:"⏯",point_down:"👇",point_left:"👈",point_right:"👉",point_up:"☝️",point_up_2:"👆",police_car:"🚓",policewoman:"👮‍♀️",poodle:"🐩",popcorn:"🍿",post_office:"🏣",postal_horn:"📯",postbox:"📮",potable_water:"🚰",potato:"🥔",pouch:"👝",poultry_leg:"🍗",pound:"💷",rage:"😡",pouting_cat:"😾",pouting_man:"🙎‍♂️",pray:"🙏",prayer_beads:"📿",pregnant_woman:"🤰",previous_track_button:"⏮",prince:"🤴",princess:"👸",printer:"🖨",purple_heart:"💜",purse:"👛",pushpin:"📌",put_litter_in_its_place:"🚮",question:"❓",rabbit:"🐰",rabbit2:"🐇",racehorse:"🐎",racing_car:"🏎",radio:"📻",radio_button:"🔘",radioactive:"☢️",railway_car:"🚃",railway_track:"🛤",rainbow:"🌈",rainbow_flag:"🏳️‍🌈",raised_back_of_hand:"🤚",raised_hand_with_fingers_splayed:"🖐",raised_hands:"🙌",raising_hand_woman:"🙋",raising_hand_man:"🙋‍♂️",ram:"🐏",ramen:"🍜",rat:"🐀",record_button:"⏺",recycle:"♻️",red_circle:"🔴",registered:"®️",relaxed:"☺️",relieved:"😌",reminder_ribbon:"🎗",repeat:"🔁",repeat_one:"🔂",rescue_worker_helmet:"⛑",restroom:"🚻",revolving_hearts:"💞",rewind:"⏪",rhinoceros:"🦏",ribbon:"🎀",rice:"🍚",rice_ball:"🍙",rice_cracker:"🍘",rice_scene:"🎑",right_anger_bubble:"🗯",ring:"💍",robot:"🤖",rocket:"🚀",rofl:"🤣",roll_eyes:"🙄",roller_coaster:"🎢",rooster:"🐓",rose:"🌹",rosette:"🏵",rotating_light:"🚨",round_pushpin:"📍",rowing_man:"🚣",rowing_woman:"🚣‍♀️",rugby_football:"🏉",running_man:"🏃",running_shirt_with_sash:"🎽",running_woman:"🏃‍♀️",sa:"🈂️",sagittarius:"♐️",sake:"🍶",sandal:"👡",santa:"🎅",satellite:"📡",saxophone:"🎷",school:"🏫",school_satchel:"🎒",scissors:"✂️",scorpion:"🦂",scorpius:"♏️",scream:"😱",scream_cat:"🙀",scroll:"📜",seat:"💺",secret:"㊙️",see_no_evil:"🙈",seedling:"🌱",selfie:"🤳",shallow_pan_of_food:"🥘",shamrock:"☘️",shark:"🦈",shaved_ice:"🍧",sheep:"🐑",shell:"🐚",shield:"🛡",shinto_shrine:"⛩",ship:"🚢",shirt:"👕",shopping:"🛍",shopping_cart:"🛒",shower:"🚿",shrimp:"🦐",signal_strength:"📶",six_pointed_star:"🔯",ski:"🎿",skier:"⛷",skull:"💀",skull_and_crossbones:"☠️",sleeping:"😴",sleeping_bed:"🛌",sleepy:"😪",slightly_frowning_face:"🙁",slightly_smiling_face:"🙂",slot_machine:"🎰",small_airplane:"🛩",small_blue_diamond:"🔹",small_orange_diamond:"🔸",small_red_triangle:"🔺",small_red_triangle_down:"🔻",smile:"😄",smile_cat:"😸",smiley:"😃",smiley_cat:"😺",smiling_imp:"😈",smirk:"😏",smirk_cat:"😼",smoking:"🚬",snail:"🐌",snake:"🐍",sneezing_face:"🤧",snowboarder:"🏂",snowflake:"❄️",snowman:"⛄️",snowman_with_snow:"☃️",sob:"😭",soccer:"⚽️",soon:"🔜",sos:"🆘",sound:"🔉",space_invader:"👾",spades:"♠️",spaghetti:"🍝",sparkle:"❇️",sparkler:"🎇",sparkles:"✨",sparkling_heart:"💖",speak_no_evil:"🙊",speaker:"🔈",speaking_head:"🗣",speech_balloon:"💬",speedboat:"🚤",spider:"🕷",spider_web:"🕸",spiral_calendar:"🗓",spiral_notepad:"🗒",spoon:"🥄",squid:"🦑",stadium:"🏟",star:"⭐️",star2:"🌟",star_and_crescent:"☪️",star_of_david:"✡️",stars:"🌠",station:"🚉",statue_of_liberty:"🗽",steam_locomotive:"🚂",stew:"🍲",stop_button:"⏹",stop_sign:"🛑",stopwatch:"⏱",straight_ruler:"📏",strawberry:"🍓",stuck_out_tongue:"😛",stuck_out_tongue_closed_eyes:"😝",stuck_out_tongue_winking_eye:"😜",studio_microphone:"🎙",stuffed_flatbread:"🥙",sun_behind_large_cloud:"🌥",sun_behind_rain_cloud:"🌦",sun_behind_small_cloud:"🌤",sun_with_face:"🌞",sunflower:"🌻",sunglasses:"😎",sunny:"☀️",sunrise:"🌅",sunrise_over_mountains:"🌄",surfing_man:"🏄",surfing_woman:"🏄‍♀️",sushi:"🍣",suspension_railway:"🚟",sweat:"😓",sweat_drops:"💦",sweat_smile:"😅",sweet_potato:"🍠",swimming_man:"🏊",swimming_woman:"🏊‍♀️",symbols:"🔣",synagogue:"🕍",syringe:"💉",taco:"🌮",tada:"🎉",tanabata_tree:"🎋",taurus:"♉️",taxi:"🚕",tea:"🍵",telephone_receiver:"📞",telescope:"🔭",tennis:"🎾",tent:"⛺️",thermometer:"🌡",thinking:"🤔",thought_balloon:"💭",ticket:"🎫",tickets:"🎟",tiger:"🐯",tiger2:"🐅",timer_clock:"⏲",tipping_hand_man:"💁‍♂️",tired_face:"😫",tm:"™️",toilet:"🚽",tokyo_tower:"🗼",tomato:"🍅",tongue:"👅",top:"🔝",tophat:"🎩",tornado:"🌪",trackball:"🖲",tractor:"🚜",traffic_light:"🚥",train:"🚋",train2:"🚆",tram:"🚊",triangular_flag_on_post:"🚩",triangular_ruler:"📐",trident:"🔱",triumph:"😤",trolleybus:"🚎",trophy:"🏆",tropical_drink:"🍹",tropical_fish:"🐠",truck:"🚚",trumpet:"🎺",tulip:"🌷",tumbler_glass:"🥃",turkey:"🦃",turtle:"🐢",tv:"📺",twisted_rightwards_arrows:"🔀",two_hearts:"💕",two_men_holding_hands:"👬",two_women_holding_hands:"👭",u5272:"🈹",u5408:"🈴",u55b6:"🈺",u6307:"🈯️",u6708:"🈷️",u6709:"🈶",u6e80:"🈵",u7121:"🈚️",u7533:"🈸",u7981:"🈲",u7a7a:"🈳",umbrella:"☔️",unamused:"😒",underage:"🔞",unicorn:"🦄",unlock:"🔓",up:"🆙",upside_down_face:"🙃",v:"✌️",vertical_traffic_light:"🚦",vhs:"📼",vibration_mode:"📳",video_camera:"📹",video_game:"🎮",violin:"🎻",virgo:"♍️",volcano:"🌋",volleyball:"🏐",vs:"🆚",vulcan_salute:"🖖",walking_man:"🚶",walking_woman:"🚶‍♀️",waning_crescent_moon:"🌘",waning_gibbous_moon:"🌖",warning:"⚠️",wastebasket:"🗑",watch:"⌚️",water_buffalo:"🐃",watermelon:"🍉",wave:"👋",wavy_dash:"〰️",waxing_crescent_moon:"🌒",wc:"🚾",weary:"😩",wedding:"💒",weight_lifting_man:"🏋️",weight_lifting_woman:"🏋️‍♀️",whale:"🐳",whale2:"🐋",wheel_of_dharma:"☸️",wheelchair:"♿️",white_check_mark:"✅",white_circle:"⚪️",white_flag:"🏳️",white_flower:"💮",white_large_square:"⬜️",white_medium_small_square:"◽️",white_medium_square:"◻️",white_small_square:"▫️",white_square_button:"🔳",wilted_flower:"🥀",wind_chime:"🎐",wind_face:"🌬",wine_glass:"🍷",wink:"😉",wolf:"🐺",woman:"👩",woman_artist:"👩‍🎨",woman_astronaut:"👩‍🚀",woman_cartwheeling:"🤸‍♀️",woman_cook:"👩‍🍳",woman_facepalming:"🤦‍♀️",woman_factory_worker:"👩‍🏭",woman_farmer:"👩‍🌾",woman_firefighter:"👩‍🚒",woman_health_worker:"👩‍⚕️",woman_judge:"👩‍⚖️",woman_juggling:"🤹‍♀️",woman_mechanic:"👩‍🔧",woman_office_worker:"👩‍💼",woman_pilot:"👩‍✈️",woman_playing_handball:"🤾‍♀️",woman_playing_water_polo:"🤽‍♀️",woman_scientist:"👩‍🔬",woman_shrugging:"🤷‍♀️",woman_singer:"👩‍🎤",woman_student:"👩‍🎓",woman_teacher:"👩‍🏫",woman_technologist:"👩‍💻",woman_with_turban:"👳‍♀️",womans_clothes:"👚",womans_hat:"👒",women_wrestling:"🤼‍♀️",womens:"🚺",world_map:"🗺",worried:"😟",wrench:"🔧",writing_hand:"✍️",x:"❌",yellow_heart:"💛",yen:"💴",yin_yang:"☯️",yum:"😋",zap:"⚡️",zipper_mouth_face:"🤐",zzz:"💤",octocat:':octocat:',showdown:"S"},t.Converter=function(e){"use strict";var n={},l=[],u=[],c={},d=r,h={parsed:{},raw:"",format:""};function p(e,n){if(n=n||null,t.helper.isString(e)){if(n=e=t.helper.stdExtName(e),t.extensions[e])return console.warn("DEPRECATION WARNING: "+e+" is an old extension that uses a deprecated loading method.Please inform the developer that the extension should be updated!"),void function(e,n){"function"==typeof e&&(e=e(new t.Converter));t.helper.isArray(e)||(e=[e]);var a=s(e,n);if(!a.valid)throw Error(a.error);for(var i=0;i[ \t]+¨NBSP;<"),!n){if(!window||!window.document)throw new Error("HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM");n=window.document}var a=n.createElement("div");a.innerHTML=e;var i={preList:function(e){for(var n=e.querySelectorAll("pre"),a=[],i=0;i'}else a.push(n[i].innerHTML),n[i].innerHTML="",n[i].setAttribute("prenum",i.toString());return a}(a)};!function e(t){for(var n=0;n? ?(['"].*['"])?\)$/m)>-1)o="";else if(!o){if(r||(r=i.toLowerCase().replace(/ ?\n/g," ")),o="#"+r,t.helper.isUndefined(a.gUrls[r]))return e;o=a.gUrls[r],t.helper.isUndefined(a.gTitles[r])||(u=a.gTitles[r])}var c='
"};return e=(e=(e=(e=(e=a.converter._dispatch("anchors.before",e,n,a)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g,i)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,i)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]??(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,i)).replace(/\[([^\[\]]+)]()()()()()/g,i),n.ghMentions&&(e=e.replace(/(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gim,function(e,a,i,r,o){if("\\"===i)return a+r;if(!t.helper.isString(n.ghMentionsLink))throw new Error("ghMentionsLink option must be a string");var s=n.ghMentionsLink.replace(/\{u}/g,o),l="";return n.openLinksInNewWindow&&(l=' rel="noopener noreferrer" target="¨E95Eblank"'),a+'"+r+""})),e=a.converter._dispatch("anchors.after",e,n,a)});var c=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi,d=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi,h=/()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi,p=/(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gim,f=/<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,m=function(e){"use strict";return function(n,a,i,r,o,s,l){var u=i=i.replace(t.helper.regexes.asteriskDashAndColon,t.helper.escapeCharactersCallback),c="",d="",h=a||"",p=l||"";return/^www\./i.test(i)&&(i=i.replace(/^www\./i,"http://www.")),e.excludeTrailingPunctuationFromURLs&&s&&(c=s),e.openLinksInNewWindow&&(d=' rel="noopener noreferrer" target="¨E95Eblank"'),h+'"+u+""+c+p}},_=function(e,n){"use strict";return function(a,i,r){var o="mailto:";return i=i||"",r=t.subParser("unescapeSpecialChars")(r,e,n),e.encodeEmails?(o=t.helper.encodeEmailAddress(o+r),r=t.helper.encodeEmailAddress(r)):o+=r,i+''+r+""}};t.subParser("autoLinks",function(e,t,n){"use strict";return e=(e=(e=n.converter._dispatch("autoLinks.before",e,t,n)).replace(h,m(t))).replace(f,_(t,n)),e=n.converter._dispatch("autoLinks.after",e,t,n)}),t.subParser("simplifiedAutoLinks",function(e,t,n){"use strict";return t.simplifiedAutoLink?(e=n.converter._dispatch("simplifiedAutoLinks.before",e,t,n),e=(e=t.excludeTrailingPunctuationFromURLs?e.replace(d,m(t)):e.replace(c,m(t))).replace(p,_(t,n)),e=n.converter._dispatch("simplifiedAutoLinks.after",e,t,n)):e}),t.subParser("blockGamut",function(e,n,a){"use strict";return e=a.converter._dispatch("blockGamut.before",e,n,a),e=t.subParser("blockQuotes")(e,n,a),e=t.subParser("headers")(e,n,a),e=t.subParser("horizontalRule")(e,n,a),e=t.subParser("lists")(e,n,a),e=t.subParser("codeBlocks")(e,n,a),e=t.subParser("tables")(e,n,a),e=t.subParser("hashHTMLBlocks")(e,n,a),e=t.subParser("paragraphs")(e,n,a),e=a.converter._dispatch("blockGamut.after",e,n,a)}),t.subParser("blockQuotes",function(e,n,a){"use strict";e=a.converter._dispatch("blockQuotes.before",e,n,a),e+="\n\n";var i=/(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm;return n.splitAdjacentBlockquotes&&(i=/^ {0,3}>[\s\S]*?(?:\n\n)/gm),e=e.replace(i,function(e){return e=(e=(e=e.replace(/^[ \t]*>[ \t]?/gm,"")).replace(/¨0/g,"")).replace(/^[ \t]+$/gm,""),e=t.subParser("githubCodeBlocks")(e,n,a),e=(e=(e=t.subParser("blockGamut")(e,n,a)).replace(/(^|\n)/g,"$1 ")).replace(/(\s*
[^\r]+?<\/pre>)/gm,function(e,t){var n=t;return n=(n=n.replace(/^  /gm,"¨0")).replace(/¨0/g,"")}),t.subParser("hashBlock")("
\n"+e+"\n
",n,a)}),e=a.converter._dispatch("blockQuotes.after",e,n,a)}),t.subParser("codeBlocks",function(e,n,a){"use strict";e=a.converter._dispatch("codeBlocks.before",e,n,a);return e=(e=(e+="¨0").replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g,function(e,i,r){var o=i,s=r,l="\n";return o=t.subParser("outdent")(o,n,a),o=t.subParser("encodeCode")(o,n,a),o=(o=(o=t.subParser("detab")(o,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,""),n.omitExtraWLInCodeBlocks&&(l=""),o="
"+o+l+"
",t.subParser("hashBlock")(o,n,a)+s})).replace(/¨0/,""),e=a.converter._dispatch("codeBlocks.after",e,n,a)}),t.subParser("codeSpans",function(e,n,a){"use strict";return void 0===(e=a.converter._dispatch("codeSpans.before",e,n,a))&&(e=""),e=e.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(e,i,r,o){var s=o;return s=(s=s.replace(/^([ \t]*)/g,"")).replace(/[ \t]*$/g,""),s=i+""+(s=t.subParser("encodeCode")(s,n,a))+"",s=t.subParser("hashHTMLSpans")(s,n,a)}),e=a.converter._dispatch("codeSpans.after",e,n,a)}),t.subParser("completeHTMLDocument",function(e,t,n){"use strict";if(!t.completeHTMLDocument)return e;e=n.converter._dispatch("completeHTMLDocument.before",e,t,n);var a="html",i="\n",r="",o='\n',s="",l="";for(var u in void 0!==n.metadata.parsed.doctype&&(i="\n","html"!==(a=n.metadata.parsed.doctype.toString().toLowerCase())&&"html5"!==a||(o='')),n.metadata.parsed)if(n.metadata.parsed.hasOwnProperty(u))switch(u.toLowerCase()){case"doctype":break;case"title":r=""+n.metadata.parsed.title+"\n";break;case"charset":o="html"===a||"html5"===a?'\n':'\n';break;case"language":case"lang":s=' lang="'+n.metadata.parsed[u]+'"',l+='\n';break;default:l+='\n'}return e=i+"\n\n"+r+o+l+"\n\n"+e.trim()+"\n\n",e=n.converter._dispatch("completeHTMLDocument.after",e,t,n)}),t.subParser("detab",function(e,t,n){"use strict";return e=(e=(e=(e=(e=(e=n.converter._dispatch("detab.before",e,t,n)).replace(/\t(?=\t)/g," ")).replace(/\t/g,"¨A¨B")).replace(/¨B(.+?)¨A/g,function(e,t){for(var n=t,a=4-n.length%4,i=0;i/g,">"),e=n.converter._dispatch("encodeAmpsAndAngles.after",e,t,n)}),t.subParser("encodeBackslashEscapes",function(e,n,a){"use strict";return e=(e=(e=a.converter._dispatch("encodeBackslashEscapes.before",e,n,a)).replace(/\\(\\)/g,t.helper.escapeCharactersCallback)).replace(/\\([`*_{}\[\]()>#+.!~=|:-])/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("encodeBackslashEscapes.after",e,n,a)}),t.subParser("encodeCode",function(e,n,a){"use strict";return e=(e=a.converter._dispatch("encodeCode.before",e,n,a)).replace(/&/g,"&").replace(//g,">").replace(/([*_{}\[\]\\=~-])/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("encodeCode.after",e,n,a)}),t.subParser("escapeSpecialCharsWithinTagAttributes",function(e,n,a){"use strict";return e=(e=(e=a.converter._dispatch("escapeSpecialCharsWithinTagAttributes.before",e,n,a)).replace(/<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi,function(e){return e.replace(/(.)<\/?code>(?=.)/g,"$1`").replace(/([\\`*_~=|])/g,t.helper.escapeCharactersCallback)})).replace(/-]|-[^>])(?:[^-]|-[^-])*)--)>/gi,function(e){return e.replace(/([\\`*_~=|])/g,t.helper.escapeCharactersCallback)}),e=a.converter._dispatch("escapeSpecialCharsWithinTagAttributes.after",e,n,a)}),t.subParser("githubCodeBlocks",function(e,n,a){"use strict";return n.ghCodeBlocks?(e=a.converter._dispatch("githubCodeBlocks.before",e,n,a),e=(e=(e+="¨0").replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g,function(e,i,r,o){var s=n.omitExtraWLInCodeBlocks?"":"\n";return o=t.subParser("encodeCode")(o,n,a),o="
"+(o=(o=(o=t.subParser("detab")(o,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,""))+s+"
",o=t.subParser("hashBlock")(o,n,a),"\n\n¨G"+(a.ghCodeBlocks.push({text:e,codeblock:o})-1)+"G\n\n"})).replace(/¨0/,""),a.converter._dispatch("githubCodeBlocks.after",e,n,a)):e}),t.subParser("hashBlock",function(e,t,n){"use strict";return e=(e=n.converter._dispatch("hashBlock.before",e,t,n)).replace(/(^\n+|\n+$)/g,""),e="\n\n¨K"+(n.gHtmlBlocks.push(e)-1)+"K\n\n",e=n.converter._dispatch("hashBlock.after",e,t,n)}),t.subParser("hashCodeTags",function(e,n,a){"use strict";e=a.converter._dispatch("hashCodeTags.before",e,n,a);return e=t.helper.replaceRecursiveRegExp(e,function(e,i,r,o){var s=r+t.subParser("encodeCode")(i,n,a)+o;return"¨C"+(a.gHtmlSpans.push(s)-1)+"C"},"]*>","","gim"),e=a.converter._dispatch("hashCodeTags.after",e,n,a)}),t.subParser("hashElement",function(e,t,n){"use strict";return function(e,t){var a=t;return a=(a=(a=a.replace(/\n\n/g,"\n")).replace(/^\n/,"")).replace(/\n+$/g,""),a="\n\n¨K"+(n.gHtmlBlocks.push(a)-1)+"K\n\n"}}),t.subParser("hashHTMLBlocks",function(e,n,a){"use strict";e=a.converter._dispatch("hashHTMLBlocks.before",e,n,a);var i=["pre","div","h1","h2","h3","h4","h5","h6","blockquote","table","dl","ol","ul","script","noscript","form","fieldset","iframe","math","style","section","header","footer","nav","article","aside","address","audio","canvas","figure","hgroup","output","video","p"],r=function(e,t,n,i){var r=e;return-1!==n.search(/\bmarkdown\b/)&&(r=n+a.converter.makeHtml(t)+i),"\n\n¨K"+(a.gHtmlBlocks.push(r)-1)+"K\n\n"};n.backslashEscapesHTMLTags&&(e=e.replace(/\\<(\/?[^>]+?)>/g,function(e,t){return"<"+t+">"}));for(var o=0;o]*>)","im"),u="<"+i[o]+"\\b[^>]*>",c="";-1!==(s=t.helper.regexIndexOf(e,l));){var d=t.helper.splitAtIndex(e,s),h=t.helper.replaceRecursiveRegExp(d[1],r,u,c,"im");if(h===d[1])break;e=d[0].concat(h)}return e=e.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,t.subParser("hashElement")(e,n,a)),e=(e=t.helper.replaceRecursiveRegExp(e,function(e){return"\n\n¨K"+(a.gHtmlBlocks.push(e)-1)+"K\n\n"},"^ {0,3}\x3c!--","--\x3e","gm")).replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,t.subParser("hashElement")(e,n,a)),e=a.converter._dispatch("hashHTMLBlocks.after",e,n,a)}),t.subParser("hashHTMLSpans",function(e,t,n){"use strict";function a(e){return"¨C"+(n.gHtmlSpans.push(e)-1)+"C"}return e=(e=(e=(e=(e=n.converter._dispatch("hashHTMLSpans.before",e,t,n)).replace(/<[^>]+?\/>/gi,function(e){return a(e)})).replace(/<([^>]+?)>[\s\S]*?<\/\1>/g,function(e){return a(e)})).replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g,function(e){return a(e)})).replace(/<[^>]+?>/gi,function(e){return a(e)}),e=n.converter._dispatch("hashHTMLSpans.after",e,t,n)}),t.subParser("unhashHTMLSpans",function(e,t,n){"use strict";e=n.converter._dispatch("unhashHTMLSpans.before",e,t,n);for(var a=0;a]*>\\s*]*>","^ {0,3}\\s*
","gim"),e=a.converter._dispatch("hashPreCodeTags.after",e,n,a)}),t.subParser("headers",function(e,n,a){"use strict";e=a.converter._dispatch("headers.before",e,n,a);var i=isNaN(parseInt(n.headerLevelStart))?1:parseInt(n.headerLevelStart),r=n.smoothLivePreview?/^(.+)[ \t]*\n={2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n=+[ \t]*\n+/gm,o=n.smoothLivePreview?/^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n-+[ \t]*\n+/gm;e=(e=e.replace(r,function(e,r){var o=t.subParser("spanGamut")(r,n,a),s=n.noHeaderId?"":' id="'+l(r)+'"',u=""+o+"";return t.subParser("hashBlock")(u,n,a)})).replace(o,function(e,r){var o=t.subParser("spanGamut")(r,n,a),s=n.noHeaderId?"":' id="'+l(r)+'"',u=i+1,c=""+o+"";return t.subParser("hashBlock")(c,n,a)});var s=n.requireSpaceBeforeHeadingText?/^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm:/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm;function l(e){var i,r;if(n.customizedHeaderId){var o=e.match(/\{([^{]+?)}\s*$/);o&&o[1]&&(e=o[1])}return i=e,r=t.helper.isString(n.prefixHeaderId)?n.prefixHeaderId:!0===n.prefixHeaderId?"section-":"",n.rawPrefixHeaderId||(i=r+i),i=n.ghCompatibleHeaderId?i.replace(/ /g,"-").replace(/&/g,"").replace(/¨T/g,"").replace(/¨D/g,"").replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g,"").toLowerCase():n.rawHeaderId?i.replace(/ /g,"-").replace(/&/g,"&").replace(/¨T/g,"¨").replace(/¨D/g,"$").replace(/["']/g,"-").toLowerCase():i.replace(/[^\w]/g,"").toLowerCase(),n.rawPrefixHeaderId&&(i=r+i),a.hashLinkCounts[i]?i=i+"-"+a.hashLinkCounts[i]++:a.hashLinkCounts[i]=1,i}return e=e.replace(s,function(e,r,o){var s=o;n.customizedHeaderId&&(s=o.replace(/\s?\{([^{]+?)}\s*$/,""));var u=t.subParser("spanGamut")(s,n,a),c=n.noHeaderId?"":' id="'+l(o)+'"',d=i-1+r.length,h=""+u+"";return t.subParser("hashBlock")(h,n,a)}),e=a.converter._dispatch("headers.after",e,n,a)}),t.subParser("horizontalRule",function(e,n,a){"use strict";e=a.converter._dispatch("horizontalRule.before",e,n,a);var i=t.subParser("hashBlock")("
",n,a);return e=(e=(e=e.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm,i)).replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm,i)).replace(/^ {0,2}( ?_){3,}[ \t]*$/gm,i),e=a.converter._dispatch("horizontalRule.after",e,n,a)}),t.subParser("images",function(e,n,a){"use strict";function i(e,n,i,r,o,s,l,u){var c=a.gUrls,d=a.gTitles,h=a.gDimensions;if(i=i.toLowerCase(),u||(u=""),e.search(/\(? ?(['"].*['"])?\)$/m)>-1)r="";else if(""===r||null===r){if(""!==i&&null!==i||(i=n.toLowerCase().replace(/ ?\n/g," ")),r="#"+i,t.helper.isUndefined(c[i]))return e;r=c[i],t.helper.isUndefined(d[i])||(u=d[i]),t.helper.isUndefined(h[i])||(o=h[i].width,s=h[i].height)}n=n.replace(/"/g,""").replace(t.helper.regexes.asteriskDashAndColon,t.helper.escapeCharactersCallback);var p=''+n+'"}return e=(e=(e=(e=(e=(e=a.converter._dispatch("images.before",e,n,a)).replace(/!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g,i)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,function(e,t,n,a,r,o,s,l){return i(e,t,n,a=a.replace(/\s/g,""),r,o,s,l)})).replace(/!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g,i)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,i)).replace(/!\[([^\[\]]+)]()()()()()/g,i),e=a.converter._dispatch("images.after",e,n,a)}),t.subParser("italicsAndBold",function(e,t,n){"use strict";function a(e,t,n){return t+e+n}return e=n.converter._dispatch("italicsAndBold.before",e,t,n),e=t.literalMidWordUnderscores?(e=(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,function(e,t){return a(t,"","")})).replace(/\b__(\S[\s\S]*?)__\b/g,function(e,t){return a(t,"","")})).replace(/\b_(\S[\s\S]*?)_\b/g,function(e,t){return a(t,"","")}):(e=(e=e.replace(/___(\S[\s\S]*?)___/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e})).replace(/__(\S[\s\S]*?)__/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e})).replace(/_([^\s_][\s\S]*?)_/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e}),e=t.literalMidWordAsterisks?(e=(e=e.replace(/([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g,function(e,t,n){return a(n,t+"","")})).replace(/([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g,function(e,t,n){return a(n,t+"","")})).replace(/([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g,function(e,t,n){return a(n,t+"","")}):(e=(e=e.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e})).replace(/\*\*(\S[\s\S]*?)\*\*/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e})).replace(/\*([^\s*][\s\S]*?)\*/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e}),e=n.converter._dispatch("italicsAndBold.after",e,t,n)}),t.subParser("lists",function(e,n,a){"use strict";function i(e,i){a.gListLevel++,e=e.replace(/\n{2,}$/,"\n");var r=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm,o=/\n[ \t]*\n(?!¨0)/.test(e+="¨0");return n.disableForced4SpacesIndentedSublists&&(r=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm),e=(e=e.replace(r,function(e,i,r,s,l,u,c){c=c&&""!==c.trim();var d=t.subParser("outdent")(l,n,a),h="";return u&&n.tasklists&&(h=' class="task-list-item" style="list-style-type: none;"',d=d.replace(/^[ \t]*\[(x|X| )?]/m,function(){var e='-1?(d=t.subParser("githubCodeBlocks")(d,n,a),d=t.subParser("blockGamut")(d,n,a)):(d=(d=t.subParser("lists")(d,n,a)).replace(/\n$/,""),d=(d=t.subParser("hashHTMLBlocks")(d,n,a)).replace(/\n\n+/g,"\n\n"),d=o?t.subParser("paragraphs")(d,n,a):t.subParser("spanGamut")(d,n,a)),d=""+(d=d.replace("¨A",""))+"\n"})).replace(/¨0/g,""),a.gListLevel--,i&&(e=e.replace(/\s+$/,"")),e}function r(e,t){if("ol"===t){var n=e.match(/^ *(\d+)\./);if(n&&"1"!==n[1])return' start="'+n[1]+'"'}return""}function o(e,t,a){var o=n.disableForced4SpacesIndentedSublists?/^ ?\d+\.[ \t]/gm:/^ {0,3}\d+\.[ \t]/gm,s=n.disableForced4SpacesIndentedSublists?/^ ?[*+-][ \t]/gm:/^ {0,3}[*+-][ \t]/gm,l="ul"===t?o:s,u="";if(-1!==e.search(l))!function n(c){var d=c.search(l),h=r(e,t);-1!==d?(u+="\n\n<"+t+h+">\n"+i(c.slice(0,d),!!a)+"\n",l="ul"===(t="ul"===t?"ol":"ul")?o:s,n(c.slice(d))):u+="\n\n<"+t+h+">\n"+i(c,!!a)+"\n"}(e);else{var c=r(e,t);u="\n\n<"+t+c+">\n"+i(e,!!a)+"\n"}return u}return e=a.converter._dispatch("lists.before",e,n,a),e+="¨0",e=(e=a.gListLevel?e.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,function(e,t,n){return o(t,n.search(/[*+-]/g)>-1?"ul":"ol",!0)}):e.replace(/(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,function(e,t,n,a){return o(n,a.search(/[*+-]/g)>-1?"ul":"ol",!1)})).replace(/¨0/,""),e=a.converter._dispatch("lists.after",e,n,a)}),t.subParser("metadata",function(e,t,n){"use strict";if(!t.metadata)return e;function a(e){n.metadata.raw=e,(e=(e=e.replace(/&/g,"&").replace(/"/g,""")).replace(/\n {4}/g," ")).replace(/^([\S ]+): +([\s\S]+?)$/gm,function(e,t,a){return n.metadata.parsed[t]=a,""})}return e=(e=(e=(e=n.converter._dispatch("metadata.before",e,t,n)).replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/,function(e,t,n){return a(n),"¨M"})).replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/,function(e,t,i){return t&&(n.metadata.format=t),a(i),"¨M"})).replace(/¨M/g,""),e=n.converter._dispatch("metadata.after",e,t,n)}),t.subParser("outdent",function(e,t,n){"use strict";return e=(e=(e=n.converter._dispatch("outdent.before",e,t,n)).replace(/^(\t|[ ]{1,4})/gm,"¨0")).replace(/¨0/g,""),e=n.converter._dispatch("outdent.after",e,t,n)}),t.subParser("paragraphs",function(e,n,a){"use strict";for(var i=(e=(e=(e=a.converter._dispatch("paragraphs.before",e,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,"")).split(/\n{2,}/g),r=[],o=i.length,s=0;s=0?r.push(l):l.search(/\S/)>=0&&(l=(l=t.subParser("spanGamut")(l,n,a)).replace(/^([ \t]*)/g,"

"),l+="

",r.push(l))}for(o=r.length,s=0;s]*>\s*]*>/.test(c)&&(d=!0)}r[s]=c}return e=(e=(e=r.join("\n")).replace(/^\n+/g,"")).replace(/\n+$/g,""),a.converter._dispatch("paragraphs.after",e,n,a)}),t.subParser("runExtension",function(e,t,n,a){"use strict";if(e.filter)t=e.filter(t,a.converter,n);else if(e.regex){var i=e.regex;i instanceof RegExp||(i=new RegExp(i,"g")),t=t.replace(i,e.replace)}return t}),t.subParser("spanGamut",function(e,n,a){"use strict";return e=a.converter._dispatch("spanGamut.before",e,n,a),e=t.subParser("codeSpans")(e,n,a),e=t.subParser("escapeSpecialCharsWithinTagAttributes")(e,n,a),e=t.subParser("encodeBackslashEscapes")(e,n,a),e=t.subParser("images")(e,n,a),e=t.subParser("anchors")(e,n,a),e=t.subParser("autoLinks")(e,n,a),e=t.subParser("simplifiedAutoLinks")(e,n,a),e=t.subParser("emoji")(e,n,a),e=t.subParser("underline")(e,n,a),e=t.subParser("italicsAndBold")(e,n,a),e=t.subParser("strikethrough")(e,n,a),e=t.subParser("ellipsis")(e,n,a),e=t.subParser("hashHTMLSpans")(e,n,a),e=t.subParser("encodeAmpsAndAngles")(e,n,a),n.simpleLineBreaks?/\n\n¨K/.test(e)||(e=e.replace(/\n+/g,"
\n")):e=e.replace(/ +\n/g,"
\n"),e=a.converter._dispatch("spanGamut.after",e,n,a)}),t.subParser("strikethrough",function(e,n,a){"use strict";return n.strikethrough&&(e=(e=a.converter._dispatch("strikethrough.before",e,n,a)).replace(/(?:~){2}([\s\S]+?)(?:~){2}/g,function(e,i){return function(e){return n.simplifiedAutoLink&&(e=t.subParser("simplifiedAutoLinks")(e,n,a)),""+e+""}(i)}),e=a.converter._dispatch("strikethrough.after",e,n,a)),e}),t.subParser("stripLinkDefinitions",function(e,n,a){"use strict";var i=function(i,r,o,s,l,u,c){return r=r.toLowerCase(),e.toLowerCase().split(r).length-1<2?i:(o.match(/^data:.+?\/.+?;base64,/)?a.gUrls[r]=o.replace(/\s/g,""):a.gUrls[r]=t.subParser("encodeAmpsAndAngles")(o,n,a),u?u+c:(c&&(a.gTitles[r]=c.replace(/"|'/g,""")),n.parseImgDimensions&&s&&l&&(a.gDimensions[r]={width:s,height:l}),""))};return e=(e=(e=(e+="¨0").replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm,i)).replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm,i)).replace(/¨0/,"")}),t.subParser("tables",function(e,n,a){"use strict";if(!n.tables)return e;function i(e){return/^:[ \t]*--*$/.test(e)?' style="text-align:left;"':/^--*[ \t]*:[ \t]*$/.test(e)?' style="text-align:right;"':/^:[ \t]*--*[ \t]*:$/.test(e)?' style="text-align:center;"':""}function r(e,i){var r="";return e=e.trim(),(n.tablesHeaderId||n.tableHeaderId)&&(r=' id="'+e.replace(/ /g,"_").toLowerCase()+'"'),""+(e=t.subParser("spanGamut")(e,n,a))+"\n"}function o(e,i){return""+t.subParser("spanGamut")(e,n,a)+"\n"}function s(e){var s,l=e.split("\n");for(s=0;s\n\n\n",i=0;i\n";for(var r=0;r\n"}return n+"\n\n"}(h,f)}return e=(e=(e=(e=a.converter._dispatch("tables.before",e,n,a)).replace(/\\(\|)/g,t.helper.escapeCharactersCallback)).replace(/^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm,s)).replace(/^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm,s),e=a.converter._dispatch("tables.after",e,n,a)}),t.subParser("underline",function(e,n,a){"use strict";return n.underline?(e=a.converter._dispatch("underline.before",e,n,a),e=(e=n.literalMidWordUnderscores?(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,function(e,t){return""+t+""})).replace(/\b__(\S[\s\S]*?)__\b/g,function(e,t){return""+t+""}):(e=e.replace(/___(\S[\s\S]*?)___/g,function(e,t){return/\S$/.test(t)?""+t+"":e})).replace(/__(\S[\s\S]*?)__/g,function(e,t){return/\S$/.test(t)?""+t+"":e})).replace(/(_)/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("underline.after",e,n,a)):e}),t.subParser("unescapeSpecialChars",function(e,t,n){"use strict";return e=(e=n.converter._dispatch("unescapeSpecialChars.before",e,t,n)).replace(/¨E(\d+)E/g,function(e,t){var n=parseInt(t);return String.fromCharCode(n)}),e=n.converter._dispatch("unescapeSpecialChars.after",e,t,n)}),t.subParser("makeMarkdown.blockquote",function(e,n){"use strict";var a="";if(e.hasChildNodes())for(var i=e.childNodes,r=i.length,o=0;o ")}),t.subParser("makeMarkdown.codeBlock",function(e,t){"use strict";var n=e.getAttribute("language"),a=e.getAttribute("precodenum");return"```"+n+"\n"+t.preList[a]+"\n```"}),t.subParser("makeMarkdown.codeSpan",function(e){"use strict";return"`"+e.innerHTML+"`"}),t.subParser("makeMarkdown.emphasis",function(e,n){"use strict";var a="";if(e.hasChildNodes()){a+="*";for(var i=e.childNodes,r=i.length,o=0;o",e.hasAttribute("width")&&e.hasAttribute("height")&&(t+=" ="+e.getAttribute("width")+"x"+e.getAttribute("height")),e.hasAttribute("title")&&(t+=' "'+e.getAttribute("title")+'"'),t+=")"),t}),t.subParser("makeMarkdown.links",function(e,n){"use strict";var a="";if(e.hasChildNodes()&&e.hasAttribute("href")){var i=e.childNodes,r=i.length;a="[";for(var o=0;o",e.hasAttribute("title")&&(a+=' "'+e.getAttribute("title")+'"'),a+=")"}return a}),t.subParser("makeMarkdown.list",function(e,n,a){"use strict";var i="";if(!e.hasChildNodes())return"";for(var r=e.childNodes,o=r.length,s=e.getAttribute("start")||1,l=0;l"+t.preList[n]+""}),t.subParser("makeMarkdown.strikethrough",function(e,n){"use strict";var a="";if(e.hasChildNodes()){a+="~~";for(var i=e.childNodes,r=i.length,o=0;otr>th"),l=e.querySelectorAll("tbody>tr");for(a=0;af&&(f=m)}for(a=0;a/g,"\\$1>")).replace(/^#/gm,"\\#")).replace(/^(\s*)([-=]{3,})(\s*)$/,"$1\\$2$3")).replace(/^( {0,3}\d+)\./gm,"$1\\.")).replace(/^( {0,3})([+-])/gm,"$1\\$2")).replace(/]([\s]*)\(/g,"\\]$1\\(")).replace(/^ {0,3}\[([\S \t]*?)]:/gm,"\\[$1]:")});"function"==typeof define&&define.amd?define(function(){"use strict";return t}):"undefined"!=typeof module&&module.exports?module.exports=t:this.showdown=t}.call(this);var NostrTools=(()=>{var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,i=(t,n)=>{for(var a in n)e(t,a,{get:n[a],enumerable:!0})},r={};function o(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&"Uint8Array"===e.constructor.name}function s(e,t=""){if(!Number.isSafeInteger(e)||e<0){throw new Error(`${t&&`"${t}" `}expected integer >= 0, got ${e}`)}}function l(e,t,n=""){const a=o(e),i=e?.length,r=void 0!==t;if(!a||r&&i!==t){throw new Error((n&&`"${n}" `)+"expected Uint8Array"+(r?` of length ${t}`:"")+", got "+(a?`length=${i}`:"type="+typeof e))}return e}function u(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash must wrapped by utils.createHasher");s(e.outputLen),s(e.blockLen)}function c(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function d(...e){for(let t=0;t>>t}i(r,{Relay:()=>Ya,SimplePool:()=>Ja,finalizeEvent:()=>jt,fj:()=>Na,generateSecretKey:()=>Nt,getEventHash:()=>zt,getFilterLimit:()=>Ia,getPublicKey:()=>Ot,kinds:()=>qt,matchFilter:()=>Ma,matchFilters:()=>Ra,mergeFilters:()=>za,nip04:()=>Ki,nip05:()=>Lr,nip10:()=>Dr,nip11:()=>Br,nip13:()=>Ur,nip17:()=>Gr,nip18:()=>Wo,nip19:()=>Xa,nip21:()=>Qo,nip25:()=>es,nip27:()=>as,nip28:()=>ls,nip30:()=>fs,nip39:()=>ys,nip42:()=>Va,nip44:()=>Yr,nip47:()=>xs,nip54:()=>Ts,nip57:()=>As,nip59:()=>Kr,nip77:()=>Os,nip98:()=>Zs,parseReferences:()=>Gi,serializeEvent:()=>Rt,sortEvents:()=>xt,utils:()=>St,validateEvent:()=>kt,verifiedSymbol:()=>yt,verifyEvent:()=>Dt});var f=(()=>"function"==typeof Uint8Array.from([]).toHex&&"function"==typeof Uint8Array.fromHex)(),m=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function _(e){if(l(e),f)return e.toHex();let t="";for(let n=0;n=g&&e<=v?e-g:e>=b&&e<=y?e-(b-10):e>=w&&e<=k?e-(w-10):void 0}function S(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);if(f)return Uint8Array.fromHex(e);const t=e.length,n=t/2;if(t%2)throw new Error("hex string expected, got unpadded hex of length "+t);const a=new Uint8Array(n);for(let t=0,i=0;te(n).update(t).digest(),a=e(void 0);return n.outputLen=a.outputLen,n.blockLen=a.blockLen,n.create=t=>e(t),Object.assign(n,t),Object.freeze(n)}function P(e=32){const t="object"==typeof globalThis?globalThis.crypto:null;if("function"!=typeof t?.getRandomValues)throw new Error("crypto.getRandomValues must be defined");return t.getRandomValues(new Uint8Array(e))}var E=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])});function A(e,t,n){return e&t^~e&n}function L(e,t,n){return e&t^e&n^t&n}var M=class{blockLen;outputLen;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(e,t,n,a){this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=a,this.buffer=new Uint8Array(e),this.view=h(this.buffer)}update(e){c(this),l(e);const{view:t,buffer:n,blockLen:a}=this,i=e.length;for(let r=0;r='+n)}(e,this),this.finished=!0;const{buffer:t,view:n,blockLen:a,isLE:i}=this;let{pos:r}=this;t[r++]=128,d(this.buffer.subarray(r)),this.padOffset>a-r&&(this.process(n,0),r=0);for(let e=r;ep.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;e>>3,i=p(n,17)^p(n,19)^n>>>10;I[e]=i+I[e-7]+a+I[e-16]|0}let{A:n,B:a,C:i,D:r,E:o,F:s,G:l,H:u}=this;for(let e=0;e<64;e++){const t=u+(p(o,6)^p(o,11)^p(o,25))+A(o,s,l)+z[e]+I[e]|0,c=(p(n,2)^p(n,13)^p(n,22))+L(n,a,i)|0;u=l,l=s,s=o,o=r+t|0,r=i,i=a,a=n,n=t+c|0}n=n+this.A|0,a=a+this.B|0,i=i+this.C|0,r=r+this.D|0,o=o+this.E|0,s=s+this.F|0,l=l+this.G|0,u=u+this.H|0,this.set(n,a,i,r,o,s,l,u)}roundClean(){d(I)}destroy(){this.set(0,0,0,0,0,0,0,0),d(this.buffer)}},O=class extends N{A=0|R[0];B=0|R[1];C=0|R[2];D=0|R[3];E=0|R[4];F=0|R[5];G=0|R[6];H=0|R[7];constructor(){super(32)}},j=T(()=>new O,E(1)),D=BigInt(0),q=BigInt(1);function B(e,t=""){if("boolean"!=typeof e){throw new Error((t&&`"${t}" `)+"expected boolean, got type="+typeof e)}return e}function F(e){if("bigint"==typeof e){if(!K(e))throw new Error("positive bigint expected, got "+e)}else s(e);return e}function V(e){const t=F(e).toString(16);return 1&t.length?"0"+t:t}function U(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);return""===e?D:BigInt("0x"+e)}function $(e){return U(_(e))}function H(e){return U(_(function(e){return Uint8Array.from(e)}(l(e)).reverse()))}function W(e,t){s(t);const n=S((e=F(e)).toString(16).padStart(2*t,"0"));if(n.length!==t)throw new Error("number too large");return n}function G(e,t){return W(e,t).reverse()}var K=e=>"bigint"==typeof e&&D<=e;function Y(e,t,n,a){if(!function(e,t,n){return K(e)&&K(t)&&K(n)&&t<=e&&e(q<Object.entries(t).forEach(([t,a])=>function(t,n,a){const i=e[t];if(a&&void 0===i)return;const r=typeof i;if(r!==n||null===i)throw new Error(`param "${t}" is invalid: expected ${n}, got ${r}`)}(t,a,n));a(t,!1),a(n,!0)}function J(e){const t=new WeakMap;return(n,...a)=>{const i=t.get(n);if(void 0!==i)return i;const r=e(n,...a);return t.set(n,r),r}}var X=BigInt(0),ee=BigInt(1),te=BigInt(2),ne=BigInt(3),ae=BigInt(4),ie=BigInt(5),re=BigInt(7),oe=BigInt(8),se=BigInt(9),le=BigInt(16);function ue(e,t){const n=e%t;return n>=X?n:t+n}function ce(e,t,n){let a=e;for(;t-- >X;)a*=a,a%=n;return a}function de(e,t){if(e===X)throw new Error("invert: expected non-zero number");if(t<=X)throw new Error("invert: expected positive modulus, got "+t);let n=ue(e,t),a=t,i=X,r=ee,o=ee,s=X;for(;n!==X;){const e=a/n,t=a%n,l=i-o*e,u=r-s*e;a=n,n=t,i=o,r=s,o=l,s=u}if(a!==ee)throw new Error("invert: does not exist");return ue(i,t)}function he(e,t,n){if(!e.eql(e.sqr(t),n))throw new Error("Cannot find square root")}function pe(e,t){const n=(e.ORDER+ee)/ae,a=e.pow(t,n);return he(e,a,t),a}function fe(e,t){const n=(e.ORDER-ie)/oe,a=e.mul(t,te),i=e.pow(a,n),r=e.mul(t,i),o=e.mul(e.mul(r,te),i),s=e.mul(r,e.sub(o,e.ONE));return he(e,s,t),s}function me(e){if(e1e3)throw new Error("Cannot find square root: probably non-prime P");if(1===n)return pe;let r=i.pow(a,t);const o=(t+ee)/te;return function(e,a){if(e.is0(a))return a;if(1!==be(e,a))throw new Error("Cannot find square root");let i=n,s=e.mul(e.ONE,r),l=e.pow(a,t),u=e.pow(a,o);for(;!e.eql(l,e.ONE);){if(e.is0(l))return e.ZERO;let t=1,n=e.sqr(l);for(;!e.eql(n,e.ONE);)if(t++,n=e.sqr(n),t===i)throw new Error("Cannot find square root");const a=ee<{let n=e.pow(t,o),s=e.mul(n,a);const l=e.mul(n,i),u=e.mul(n,r),c=e.eql(e.sqr(s),t),d=e.eql(e.sqr(l),t);n=e.cmov(n,s,c),s=e.cmov(u,l,d);const h=e.eql(e.sqr(s),t),p=e.cmov(n,s,h);return he(e,p,t),p}}(e):me(e)}var ge=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function ve(e,t,n=!1){const a=new Array(t.length).fill(n?e.ZERO:void 0),i=t.reduce((t,n,i)=>e.is0(n)?t:(a[i]=t,e.mul(t,n)),e.ONE),r=e.inv(i);return t.reduceRight((t,n,i)=>e.is0(n)?t:(a[i]=e.mul(t,a[i]),e.mul(t,n)),r),a}function be(e,t){const n=(e.ORDER-ee)/te,a=e.pow(t,n),i=e.eql(a,e.ONE),r=e.eql(a,e.ZERO),o=e.eql(a,e.neg(e.ONE));if(!i&&!r&&!o)throw new Error("invalid Legendre symbol result");return i?1:r?0:-1}var ye=class{ORDER;BITS;BYTES;isLE;ZERO=X;ONE=ee;_lengths;_sqrt;_mod;constructor(e,t={}){if(e<=X)throw new Error("invalid field: expected ORDER > 0, got "+e);let n;this.isLE=!1,null!=t&&"object"==typeof t&&("number"==typeof t.BITS&&(n=t.BITS),"function"==typeof t.sqrt&&(this.sqrt=t.sqrt),"boolean"==typeof t.isLE&&(this.isLE=t.isLE),t.allowedLengths&&(this._lengths=t.allowedLengths?.slice()),"boolean"==typeof t.modFromBytes&&(this._mod=t.modFromBytes));const{nBitLength:a,nByteLength:i}=function(e,t){void 0!==t&&s(t);const n=void 0!==t?t:e.toString(2).length;return{nBitLength:n,nByteLength:Math.ceil(n/8)}}(e,n);if(i>2048)throw new Error("invalid field: expected ORDER of <= 2048 bytes");this.ORDER=e,this.BITS=a,this.BYTES=i,this._sqrt=void 0,Object.preventExtensions(this)}create(e){return ue(e,this.ORDER)}isValid(e){if("bigint"!=typeof e)throw new Error("invalid field element: expected bigint, got "+typeof e);return X<=e&&eX;)n&ee&&(a=e.mul(a,i)),i=e.sqr(i),n>>=ee;return a}(this,e,t)}div(e,t){return ue(e*de(t,this.ORDER),this.ORDER)}sqrN(e){return e*e}addN(e,t){return e+t}subN(e,t){return e-t}mulN(e,t){return e*t}inv(e){return de(e,this.ORDER)}sqrt(e){return this._sqrt||(this._sqrt=_e(this.ORDER)),this._sqrt(this,e)}toBytes(e){return this.isLE?G(e,this.BYTES):W(e,this.BYTES)}fromBytes(e,t=!1){l(e);const{_lengths:n,BYTES:a,isLE:i,ORDER:r,_mod:o}=this;if(n){if(!n.includes(e.length)||e.length>a)throw new Error("Field.fromBytes: expected "+n+" bytes, got "+e.length);const t=new Uint8Array(a);t.set(e,i?0:t.length-e.length),e=t}if(e.length!==a)throw new Error("Field.fromBytes: expected "+a+" bytes, got "+e.length);let s=i?H(e):$(e);if(o&&(s=ue(s,r)),!t&&!this.isValid(s))throw new Error("invalid field element: outside of range 0..ORDER");return s}invertBatch(e){return ve(this,e)}cmov(e,t,n){return n?t:e}};function we(e,t={}){return new ye(e,t)}function ke(e){if("bigint"!=typeof e)throw new Error("field order must be bigint");const t=e.toString(2).length;return Math.ceil(t/8)}function xe(e){const t=ke(e);return t+Math.ceil(t/2)}function Se(e,t,n=!1){l(e);const a=e.length,i=ke(t),r=xe(t);if(a<16||a1024)throw new Error("expected "+r+"-1024 bytes of input, got "+a);const o=ue(n?H(e):$(e),t-ee)+ee;return n?G(o,i):W(o,i)}var Ce=BigInt(0),Te=BigInt(1);function Pe(e,t){const n=t.negate();return e?n:t}function Ee(e,t){const n=ve(e.Fp,t.map(e=>e.Z));return t.map((t,a)=>e.fromAffine(t.toAffine(n[a])))}function Ae(e,t){if(!Number.isSafeInteger(e)||e<=0||e>t)throw new Error("invalid window size, expected [1.."+t+"], got W="+e)}function Le(e,t){Ae(e,t);const n=2**e;return{windows:Math.ceil(t/e)+1,windowSize:2**(e-1),mask:Q(e),maxNumber:n,shiftBy:BigInt(e)}}function Me(e,t,n){const{windowSize:a,mask:i,maxNumber:r,shiftBy:o}=n;let s=Number(e&i),l=e>>o;s>a&&(s-=r,l+=Te);const u=t*a;return{nextN:l,offset:u+Math.abs(s)-1,isZero:0===s,isNeg:s<0,isNegF:t%2!=0,offsetF:u}}var Re=new WeakMap,ze=new WeakMap;function Ie(e){return ze.get(e)||1}function Ne(e){if(e!==Ce)throw new Error("invalid wNAF")}var Oe=class{BASE;ZERO;Fn;bits;constructor(e,t){this.BASE=e.BASE,this.ZERO=e.ZERO,this.Fn=e.Fn,this.bits=t}_unsafeLadder(e,t,n=this.ZERO){let a=e;for(;t>Ce;)t&Te&&(n=n.add(a)),a=a.double(),t>>=Te;return n}precomputeWindow(e,t){const{windows:n,windowSize:a}=Le(t,this.bits),i=[];let r=e,o=r;for(let e=0;e(e[t]="function",e),{ORDER:"bigint",BYTES:"number",BITS:"number"}))}(t),t}return we(e,{isLE:n})}function De(e,t){return function(n){const a=e(n);return{secretKey:a,publicKey:t(a)}}}var qe=class{oHash;iHash;blockLen;outputLen;finished=!1;destroyed=!1;constructor(e,t){if(u(e),l(t,void 0,"key"),this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const n=this.blockLen,a=new Uint8Array(n);a.set(t.length>n?e.create().update(t).digest():t);for(let e=0;enew qe(e,t).update(n).digest();Be.create=(e,t)=>new qe(e,t);var Fe=(e,t)=>(e+(e>=0?t:-t)/Ke)/t;function Ve(e,t,n){const[[a,i],[r,o]]=t,s=Fe(o*e,n),l=Fe(-i*e,n);let u=e-s*a-l*r,c=-s*i-l*o;const d=uD;e>>=q,t+=1);return t}(n)/2))+Ge;if(u=p||c=p)throw new Error("splitScalar (endomorphism): failed, k="+e);return{k1neg:d,k1:u,k2neg:h,k2:c}}function Ue(e){if(!["compact","recovered","der"].includes(e))throw new Error('Signature format must be "compact", "recovered", or "der"');return e}function $e(e,t){const n={};for(let a of Object.keys(t))n[a]=void 0===e[a]?t[a]:e[a];return B(n.lowS,"lowS"),B(n.prehash,"prehash"),void 0!==n.format&&Ue(n.format),n}var He={Err:class extends Error{constructor(e=""){super(e)}},_tlv:{encode:(e,t)=>{const{Err:n}=He;if(e<0||e>256)throw new n("tlv.encode: wrong tag");if(1&t.length)throw new n("tlv.encode: unpadded data");const a=t.length/2,i=V(a);if(i.length/2&128)throw new n("tlv.encode: long form length too big");const r=a>127?V(i.length/2|128):"";return V(e)+r+i+t},decode(e,t){const{Err:n}=He;let a=0;if(e<0||e>256)throw new n("tlv.encode: wrong tag");if(t.length<2||t[a++]!==e)throw new n("tlv.decode: wrong tlv");const i=t[a++];let r=0;if(!!(128&i)){const e=127&i;if(!e)throw new n("tlv.decode(long): indefinite length not supported");if(e>4)throw new n("tlv.decode(long): byte length is too big");const o=t.subarray(a,a+e);if(o.length!==e)throw new n("tlv.decode: length bytes not complete");if(0===o[0])throw new n("tlv.decode(long): zero leftmost byte");for(const e of o)r=r<<8|e;if(a+=e,r<128)throw new n("tlv.decode(long): not minimal encoding")}else r=i;const o=t.subarray(a,a+r);if(o.length!==r)throw new n("tlv.decode: wrong value length");return{v:o,l:t.subarray(a+r)}}},_int:{encode(e){const{Err:t}=He;if(eCe))throw new Error(`CURVE.${e} must be positive bigint`)}const i=je(t.p,n.Fp,a),r=je(t.n,n.Fn,a),o=["Gx","Gy","a","weierstrass"===e?"b":"d"];for(const e of o)if(!i.isValid(t[e]))throw new Error(`CURVE.${e} must be valid field element of CURVE.Fp`);return{CURVE:t=Object.freeze(Object.assign({},t)),Fp:i,Fn:r}}("weierstrass",e,t),{Fp:a,Fn:i}=n;let r=n.CURVE;const{h:o,n:s}=r;Z(t,{},{allowInfinityPoint:"boolean",clearCofactor:"function",isTorsionFree:"function",fromBytes:"function",toBytes:"function",endo:"object"});const{endo:u}=t;if(u&&(!a.is0(r.a)||"bigint"!=typeof u.beta||!Array.isArray(u.basises)))throw new Error('invalid endo: expected "beta": bigint and "basises": array');const c=Xe(a,i);function d(){if(!a.isOdd)throw new Error("compression is not supported: Field does not have .isOdd()")}const h=t.toBytes||function(e,t,n){const{x:i,y:r}=t.toAffine(),o=a.toBytes(i);if(B(n,"isCompressed"),n){d();return C(Je(!a.isOdd(r)),o)}return C(Uint8Array.of(4),o,a.toBytes(r))},p=t.fromBytes||function(e){l(e,void 0,"Point");const{publicKey:t,publicKeyUncompressed:n}=c,i=e.length,r=e[0],o=e.subarray(1);if(i!==t||2!==r&&3!==r){if(i===n&&4===r){const e=a.BYTES,t=a.fromBytes(o.subarray(0,e)),n=a.fromBytes(o.subarray(e,2*e));if(!m(t,n))throw new Error("bad point: is not on curve");return{x:t,y:n}}throw new Error(`bad point: got length ${i}, expected compressed=${t} or uncompressed=${n}`)}{const e=a.fromBytes(o);if(!a.isValid(e))throw new Error("bad point: is not on curve, wrong x");const t=f(e);let n;try{n=a.sqrt(t)}catch(e){const t=e instanceof Error?": "+e.message:"";throw new Error("bad point: is not on curve, sqrt error"+t)}d();return!(1&~r)!==a.isOdd(n)&&(n=a.neg(n)),{x:e,y:n}}};function f(e){const t=a.sqr(e),n=a.mul(t,e);return a.add(a.add(n,a.mul(e,r.a)),r.b)}function m(e,t){const n=a.sqr(t),i=f(e);return a.eql(n,i)}if(!m(r.Gx,r.Gy))throw new Error("bad curve params: generator point");const g=a.mul(a.pow(r.a,Ye),Qe),v=a.mul(a.sqr(r.b),BigInt(27));if(a.is0(a.add(g,v)))throw new Error("bad curve params: a or b");function b(e,t,n=!1){if(!a.isValid(t)||n&&a.is0(t))throw new Error(`bad point coordinate ${e}`);return t}function y(e){if(!(e instanceof P))throw new Error("Weierstrass Point expected")}function w(e){if(!u||!u.basises)throw new Error("no endo");return Ve(e,u.basises,i.ORDER)}const k=J((e,t)=>{const{X:n,Y:i,Z:r}=e;if(a.eql(r,a.ONE))return{x:n,y:i};const o=e.is0();null==t&&(t=o?a.ONE:a.inv(r));const s=a.mul(n,t),l=a.mul(i,t),u=a.mul(r,t);if(o)return{x:a.ZERO,y:a.ZERO};if(!a.eql(u,a.ONE))throw new Error("invZ was invalid");return{x:s,y:l}}),x=J(e=>{if(e.is0()){if(t.allowInfinityPoint&&!a.is0(e.Y))return;throw new Error("bad point: ZERO")}const{x:n,y:i}=e.toAffine();if(!a.isValid(n)||!a.isValid(i))throw new Error("bad point: x or y not field elements");if(!m(n,i))throw new Error("bad point: equation left != right");if(!e.isTorsionFree())throw new Error("bad point: not in prime-order subgroup");return!0});function T(e,t,n,i,r){return n=new P(a.mul(n.X,e),n.Y,n.Z),t=Pe(i,t),n=Pe(r,n),t.add(n)}class P{static BASE=new P(r.Gx,r.Gy,a.ONE);static ZERO=new P(a.ZERO,a.ONE,a.ZERO);static Fp=a;static Fn=i;X;Y;Z;constructor(e,t,n){this.X=b("x",e),this.Y=b("y",t,!0),this.Z=b("z",n),Object.freeze(this)}static CURVE(){return r}static fromAffine(e){const{x:t,y:n}=e||{};if(!e||!a.isValid(t)||!a.isValid(n))throw new Error("invalid affine point");if(e instanceof P)throw new Error("projective point not allowed");return a.is0(t)&&a.is0(n)?P.ZERO:new P(t,n,a.ONE)}static fromBytes(e){const t=P.fromAffine(p(l(e,void 0,"point")));return t.assertValidity(),t}static fromHex(e){return P.fromBytes(S(e))}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(e=8,t=!0){return A.createCache(this,e),t||this.multiply(Ye),this}assertValidity(){x(this)}hasEvenY(){const{y:e}=this.toAffine();if(!a.isOdd)throw new Error("Field doesn't support isOdd");return!a.isOdd(e)}equals(e){y(e);const{X:t,Y:n,Z:i}=this,{X:r,Y:o,Z:s}=e,l=a.eql(a.mul(t,s),a.mul(r,i)),u=a.eql(a.mul(n,s),a.mul(o,i));return l&&u}negate(){return new P(this.X,a.neg(this.Y),this.Z)}double(){const{a:e,b:t}=r,n=a.mul(t,Ye),{X:i,Y:o,Z:s}=this;let l=a.ZERO,u=a.ZERO,c=a.ZERO,d=a.mul(i,i),h=a.mul(o,o),p=a.mul(s,s),f=a.mul(i,o);return f=a.add(f,f),c=a.mul(i,s),c=a.add(c,c),l=a.mul(e,c),u=a.mul(n,p),u=a.add(l,u),l=a.sub(h,u),u=a.add(h,u),u=a.mul(l,u),l=a.mul(f,l),c=a.mul(n,c),p=a.mul(e,p),f=a.sub(d,p),f=a.mul(e,f),f=a.add(f,c),c=a.add(d,d),d=a.add(c,d),d=a.add(d,p),d=a.mul(d,f),u=a.add(u,d),p=a.mul(o,s),p=a.add(p,p),d=a.mul(p,f),l=a.sub(l,d),c=a.mul(p,h),c=a.add(c,c),c=a.add(c,c),new P(l,u,c)}add(e){y(e);const{X:t,Y:n,Z:i}=this,{X:o,Y:s,Z:l}=e;let u=a.ZERO,c=a.ZERO,d=a.ZERO;const h=r.a,p=a.mul(r.b,Ye);let f=a.mul(t,o),m=a.mul(n,s),_=a.mul(i,l),g=a.add(t,n),v=a.add(o,s);g=a.mul(g,v),v=a.add(f,m),g=a.sub(g,v),v=a.add(t,i);let b=a.add(o,l);return v=a.mul(v,b),b=a.add(f,_),v=a.sub(v,b),b=a.add(n,i),u=a.add(s,l),b=a.mul(b,u),u=a.add(m,_),b=a.sub(b,u),d=a.mul(h,v),u=a.mul(p,_),d=a.add(u,d),u=a.sub(m,d),d=a.add(m,d),c=a.mul(u,d),m=a.add(f,f),m=a.add(m,f),_=a.mul(h,_),v=a.mul(p,v),m=a.add(m,_),_=a.sub(f,_),_=a.mul(h,_),v=a.add(v,_),f=a.mul(m,v),c=a.add(c,f),f=a.mul(b,v),u=a.mul(g,u),u=a.sub(u,f),f=a.mul(g,m),d=a.mul(b,d),d=a.add(d,f),new P(u,c,d)}subtract(e){return this.add(e.negate())}is0(){return this.equals(P.ZERO)}multiply(e){const{endo:n}=t;if(!i.isValidNot0(e))throw new Error("invalid scalar: out of range");let a,r;const o=e=>A.cached(this,e,e=>Ee(P,e));if(n){const{k1neg:t,k1:i,k2neg:s,k2:l}=w(e),{p:u,f:c}=o(i),{p:d,f:h}=o(l);r=c.add(h),a=T(n.beta,u,d,t,s)}else{const{p:t,f:n}=o(e);a=t,r=n}return Ee(P,[a,r])[0]}multiplyUnsafe(e){const{endo:n}=t,a=this;if(!i.isValid(e))throw new Error("invalid scalar: out of range");if(e===We||a.is0())return P.ZERO;if(e===Ge)return a;if(A.hasCache(this))return this.multiply(e);if(n){const{k1neg:t,k1:i,k2neg:r,k2:o}=w(e),{p1:s,p2:l}=function(e,t,n,a){let i=t,r=e.ZERO,o=e.ZERO;for(;n>Ce||a>Ce;)n&Te&&(r=r.add(i)),a&Te&&(o=o.add(i)),i=i.double(),n>>=Te,a>>=Te;return{p1:r,p2:o}}(P,a,i,o);return T(n.beta,s,l,t,r)}return A.unsafe(a,e)}toAffine(e){return k(this,e)}isTorsionFree(){const{isTorsionFree:e}=t;return o===Ge||(e?e(P,this):A.unsafe(this,s).is0())}clearCofactor(){const{clearCofactor:e}=t;return o===Ge?this:e?e(P,this):this.multiplyUnsafe(o)}isSmallOrder(){return this.multiplyUnsafe(o).is0()}toBytes(e=!0){return B(e,"isCompressed"),this.assertValidity(),h(P,this,e)}toHex(e=!0){return _(this.toBytes(e))}toString(){return``}}const E=i.BITS,A=new Oe(P,t.endo?Math.ceil(E/2):E);return P.BASE.precompute(8),P}function Je(e){return Uint8Array.of(e?2:3)}function Xe(e,t){return{secretKey:t.BYTES,publicKey:1+e.BYTES,publicKeyUncompressed:1+2*e.BYTES,publicKeyHasPrefix:!0,signature:2*t.BYTES}}function et(e,t,n={}){u(t),Z(n,{},{hmac:"function",lowS:"boolean",randomBytes:"function",bits2int:"function",bits2int_modN:"function"});const a=(n=Object.assign({},n)).randomBytes||P,i=n.hmac||((e,n)=>Be(t,e,n)),{Fp:r,Fn:c}=e,{ORDER:d,BITS:h}=c,{keygen:p,getPublicKey:f,getSharedSecret:m,utils:g,lengths:v}=function(e,t={}){const{Fn:n}=e,a=t.randomBytes||P,i=Object.assign(Xe(e.Fp,n),{seed:xe(n.ORDER)});function r(e=a(i.seed)){return Se(l(e,i.seed,"seed"),n.ORDER)}function s(t,a=!0){return e.BASE.multiply(n.fromBytes(t)).toBytes(a)}function u(e){const{secretKey:t,publicKey:a,publicKeyUncompressed:r}=i;if(!o(e))return;if("_lengths"in n&&n._lengths||t===a)return;const s=l(e,void 0,"key").length;return s===a||s===r}const c={isValidSecretKey:function(e){try{const t=n.fromBytes(e);return n.isValidNot0(t)}catch(e){return!1}},isValidPublicKey:function(t,n){const{publicKey:a,publicKeyUncompressed:r}=i;try{const i=t.length;return!(!0===n&&i!==a||!1===n&&i!==r||!e.fromBytes(t))}catch(e){return!1}},randomSecretKey:r},d=De(r,s);return Object.freeze({getPublicKey:s,getSharedSecret:function(t,a,i=!0){if(!0===u(t))throw new Error("first arg must be private key");if(!1===u(a))throw new Error("second arg must be public key");const r=n.fromBytes(t);return e.fromBytes(a).multiply(r).toBytes(i)},keygen:d,Point:e,utils:c,lengths:i})}(e,n),b={prehash:!0,lowS:"boolean"!=typeof n.lowS||n.lowS,format:"compact",extraEntropy:!1},y=d*Ked>>Ge}function k(e,t){if(!c.isValidNot0(t))throw new Error(`invalid signature ${e}: out of range 1..Point.Fn.ORDER`);return t}function x(){if(y)throw new Error('"recovered" sig type is not supported for cofactor >2 curves')}function T(e,t){Ue(t);const n=v.signature;return l(e,"compact"===t?n:"recovered"===t?n+1:void 0)}class E{r;s;recovery;constructor(e,t,n){if(this.r=k("r",e),this.s=k("s",t),null!=n){if(x(),![0,1,2,3].includes(n))throw new Error("invalid recovery id");this.recovery=n}Object.freeze(this)}static fromBytes(e,t=b.format){let n;if(T(e,t),"der"===t){const{r:t,s:n}=He.toSig(l(e));return new E(t,n)}"recovered"===t&&(n=e[0],t="compact",e=e.subarray(1));const a=v.signature/2,i=e.subarray(0,a),r=e.subarray(a,2*a);return new E(c.fromBytes(i),c.fromBytes(r),n)}static fromHex(e,t){return this.fromBytes(S(e),t)}assertRecovery(){const{recovery:e}=this;if(null==e)throw new Error("invalid recovery id: must be present");return e}addRecoveryBit(e){return new E(this.r,this.s,e)}recoverPublicKey(t){const{r:n,s:a}=this,i=this.assertRecovery(),o=2===i||3===i?n+d:n;if(!r.isValid(o))throw new Error("invalid recovery id: sig.r+curve.n != R.x");const s=r.toBytes(o),u=e.fromBytes(C(Je(!(1&i)),s)),h=c.inv(o),p=L(l(t,void 0,"msgHash")),f=c.create(-p*h),m=c.create(a*h),_=e.BASE.multiplyUnsafe(f).add(u.multiplyUnsafe(m));if(_.is0())throw new Error("invalid recovery: point at infinify");return _.assertValidity(),_}hasHighS(){return w(this.s)}toBytes(e=b.format){if(Ue(e),"der"===e)return S(He.hexFromSig(this));const{r:t,s:n}=this,a=c.toBytes(t),i=c.toBytes(n);return"recovered"===e?(x(),C(Uint8Array.of(this.assertRecovery()),a,i)):C(a,i)}toHex(e){return _(this.toBytes(e))}}const A=n.bits2int||function(e){if(e.length>8192)throw new Error("input is too large");const t=$(e),n=8*e.length-h;return n>0?t>>BigInt(n):t},L=n.bits2int_modN||function(e){return c.create(A(e))},M=Q(h);function R(e){return Y("num < 2^"+h,e,We,M),c.toBytes(e)}function z(e,n){return l(e,void 0,"message"),n?l(t(e),void 0,"prehashed message"):e}return Object.freeze({keygen:p,getPublicKey:f,getSharedSecret:m,utils:g,lengths:v,Point:e,sign:function(n,r,o={}){const{seed:u,k2sig:d}=function(t,n,i){const{lowS:r,prehash:o,extraEntropy:s}=$e(i,b);t=z(t,o);const u=L(t),d=c.fromBytes(n);if(!c.isValidNot0(d))throw new Error("invalid private key");const h=[R(d),R(u)];if(null!=s&&!1!==s){const e=!0===s?a(v.secretKey):s;h.push(l(e,void 0,"extraEntropy"))}const p=C(...h),f=u;return{seed:p,k2sig:function(t){const n=A(t);if(!c.isValidNot0(n))return;const a=c.inv(n),i=e.BASE.multiply(n).toAffine(),o=c.create(i.x);if(o===We)return;const s=c.create(a*c.create(f+o*d));if(s===We)return;let l=(i.x===o?0:2)|Number(i.y&Ge),u=s;return r&&w(s)&&(u=c.neg(s),l^=1),new E(o,u,y?void 0:l)}}}(n,r,o);return function(e,t,n){if(s(e,"hashLen"),s(t,"qByteLen"),"function"!=typeof n)throw new Error("hmacFn must be a function");const a=e=>new Uint8Array(e),i=Uint8Array.of(),r=Uint8Array.of(0),o=Uint8Array.of(1);let l=a(e),u=a(e),c=0;const d=()=>{l.fill(1),u.fill(0),c=0},h=(...e)=>n(u,C(l,...e)),p=(e=i)=>{u=h(r,e),l=h(),0!==e.length&&(u=h(o,e),l=h())},f=()=>{if(c++>=1e3)throw new Error("drbg: tried max amount of iterations");let e=0;const n=[];for(;e{let n;for(d(),p(e);!(n=t(f()));)p();return d(),n}}(t.outputLen,c.BYTES,i)(u,d).toBytes(o.format)},verify:function(t,n,a,i={}){const{lowS:r,prehash:s,format:u}=$e(i,b);if(a=l(a,void 0,"publicKey"),n=z(n,s),!o(t)){throw new Error("verify expects Uint8Array signature"+(t instanceof E?", use sig.toBytes()":""))}T(t,u);try{const i=E.fromBytes(t,u),o=e.fromBytes(a);if(r&&i.hasHighS())return!1;const{r:s,s:l}=i,d=L(n),h=c.inv(l),p=c.create(d*h),f=c.create(s*h),m=e.BASE.multiplyUnsafe(p).add(o.multiplyUnsafe(f));if(m.is0())return!1;return c.create(m.x)===s}catch(e){return!1}},recoverPublicKey:function(e,t,n={}){const{prehash:a}=$e(n,b);return t=z(t,a),E.fromBytes(e,"recovered").recoverPublicKey(t).toBytes()},Signature:E,hash:t})}var tt={p:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:BigInt(1),a:BigInt(0),b:BigInt(7),Gx:BigInt("0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"),Gy:BigInt("0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8")},nt={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),basises:[[BigInt("0x3086d221a7d46bcde86c90e49284eb15"),-BigInt("0xe4437ed6010e88286f547fa90abfe4c3")],[BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),BigInt("0x3086d221a7d46bcde86c90e49284eb15")]]},at=BigInt(0),it=BigInt(2);var rt=we(tt.p,{sqrt:function(e){const t=tt.p,n=BigInt(3),a=BigInt(6),i=BigInt(11),r=BigInt(22),o=BigInt(23),s=BigInt(44),l=BigInt(88),u=e*e*e%t,c=u*u*e%t,d=ce(c,n,t)*c%t,h=ce(d,n,t)*c%t,p=ce(h,it,t)*u%t,f=ce(p,i,t)*p%t,m=ce(f,r,t)*f%t,_=ce(m,s,t)*m%t,g=ce(_,l,t)*_%t,v=ce(g,s,t)*m%t,b=ce(v,n,t)*c%t,y=ce(b,o,t)*f%t,w=ce(y,a,t)*u%t,k=ce(w,it,t);if(!rt.eql(rt.sqr(k),e))throw new Error("Cannot find square root");return k}}),ot=Ze(tt,{Fp:rt,endo:nt}),st=et(ot,j),lt={};function ut(e,...t){let n=lt[e];if(void 0===n){const t=j((a=e,Uint8Array.from(a,(e,t)=>{const n=e.charCodeAt(0);if(1!==e.length||n>127)throw new Error(`string contains non-ASCII character "${a[t]}" with code ${n} at position ${t}`);return n})));n=C(t,t),lt[e]=n}var a;return j(C(n,...t))}var ct=e=>e.toBytes(!0).slice(1),dt=e=>e%it===at;function ht(e){const{Fn:t,BASE:n}=ot,a=t.fromBytes(e),i=n.multiply(a);return{scalar:dt(i.y)?a:t.neg(a),bytes:ct(i)}}function pt(e){const t=rt;if(!t.isValidNot0(e))throw new Error("invalid x: Fail if x ≥ p");const n=t.create(e*e),a=t.create(n*e+BigInt(7));let i=t.sqrt(a);dt(i)||(i=t.neg(i));const r=ot.fromAffine({x:e,y:i});return r.assertValidity(),r}var ft=$;function mt(...e){return ot.Fn.create(ft(ut("BIP0340/challenge",...e)))}function _t(e){return ht(e).bytes}function gt(e,t,n=P(32)){const{Fn:a}=ot,i=l(e,void 0,"message"),{bytes:r,scalar:o}=ht(t),s=l(n,32,"auxRand"),u=a.toBytes(o^ft(ut("BIP0340/aux",s))),c=ut("BIP0340/nonce",u,r,i),{bytes:d,scalar:h}=ht(c),p=mt(d,r,i),f=new Uint8Array(64);if(f.set(d,0),f.set(a.toBytes(a.create(h+p*o)),32),!vt(f,i,r))throw new Error("sign: Invalid signature produced");return f}function vt(e,t,n){const{Fp:a,Fn:i,BASE:r}=ot,o=l(e,64,"signature"),s=l(t,void 0,"message"),u=l(n,32,"publicKey");try{const e=pt(ft(u)),t=ft(o.subarray(0,32));if(!a.isValidNot0(t))return!1;const n=ft(o.subarray(32,64));if(!i.isValidNot0(n))return!1;const l=mt(i.toBytes(t),ct(e),s),c=r.multiplyUnsafe(n).add(e.multiplyUnsafe(i.neg(l))),{x:d,y:h}=c.toAffine();return!(c.is0()||!dt(h)||d!==t)}catch(e){return!1}}var bt=(()=>{const e=(e=P(48))=>Se(e,tt.n);return{keygen:De(e,_t),getPublicKey:_t,sign:gt,verify:vt,Point:ot,utils:{randomSecretKey:e,taggedHash:ut,lift_x:pt,pointToBytes:ct},lengths:{secretKey:32,publicKey:32,publicKeyHasPrefix:!1,signature:64,seed:48}}})(),yt=Symbol("verified"),wt=e=>e instanceof Object;function kt(e){if(!wt(e))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;te.created_at!==t.created_at?t.created_at-e.created_at:e.id.localeCompare(t.id))}var St={};i(St,{binarySearch:()=>Lt,bytesToHex:()=>_,hexToBytes:()=>S,insertEventIntoAscendingList:()=>At,insertEventIntoDescendingList:()=>Et,mergeReverseSortedLists:()=>Mt,normalizeURL:()=>Pt,utf8Decoder:()=>Ct,utf8Encoder:()=>Tt});var Ct=new TextDecoder("utf-8"),Tt=new TextEncoder;function Pt(e){try{-1===e.indexOf("://")&&(e="wss://"+e);let t=new URL(e);return"http:"===t.protocol?t.protocol="ws:":"https:"===t.protocol&&(t.protocol="wss:"),t.pathname=t.pathname.replace(/\/+/g,"/"),t.pathname.endsWith("/")&&(t.pathname=t.pathname.slice(0,-1)),("80"===t.port&&"ws:"===t.protocol||"443"===t.port&&"wss:"===t.protocol)&&(t.port=""),t.searchParams.sort(),t.hash="",t.toString()}catch(t){throw new Error(`Invalid URL: ${e}`)}}function Et(e,t){const[n,a]=Lt(e,e=>t.id===e.id?0:t.created_at===e.created_at?-1:e.created_at-t.created_at);return a||e.splice(n,0,t),e}function At(e,t){const[n,a]=Lt(e,e=>t.id===e.id?0:t.created_at===e.created_at?-1:t.created_at-e.created_at);return a||e.splice(n,0,t),e}function Lt(e,t){let n=0,a=e.length-1;for(;n<=a;){const i=Math.floor((n+a)/2),r=t(e[i]);if(0===r)return[i,!0];r<0?a=i-1:n=i+1}return[n,!1]}function Mt(e,t){const n=new Array(e.length+t.length);n.length=0;let a=0,i=0,r=[];for(;at[i]?.created_at?(o=e[a],a++):(o=t[i],i++),n.length>0&&n[n.length-1].created_at===o.created_at){if(r.includes(o.id))continue}else r.length=0;n.push(o),r.push(o.id)}for(;a0&&n[n.length-1].created_at===t.created_at){if(r.includes(t.id))continue}else r.length=0;n.push(t),r.push(t.id)}for(;i0&&n[n.length-1].created_at===e.created_at){if(r.includes(e.id))continue}else r.length=0;n.push(e),r.push(e.id)}return n}function Rt(e){if(!kt(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function zt(e){return _(j(Tt.encode(Rt(e))))}var It=new class{generateSecretKey(){return bt.utils.randomSecretKey()}getPublicKey(e){return _(bt.getPublicKey(e))}finalizeEvent(e,t){const n=e;return n.pubkey=_(bt.getPublicKey(t)),n.id=zt(n),n.sig=_(bt.sign(S(zt(n)),t)),n[yt]=!0,n}verifyEvent(e){if("boolean"==typeof e[yt])return e[yt];try{const t=zt(e);if(t!==e.id)return e[yt]=!1,!1;const n=bt.verify(S(e.sig),S(t),S(e.pubkey));return e[yt]=n,n}catch(t){return e[yt]=!1,!1}}},Nt=It.generateSecretKey,Ot=It.getPublicKey,jt=It.finalizeEvent,Dt=It.verifyEvent,qt={};function Bt(e){return e<1e4&&0!==e&&3!==e}function Ft(e){return 0===e||3===e||1e4<=e&&e<2e4}function Vt(e){return 2e4<=e&&e<3e4}function Ut(e){return 3e4<=e&&e<4e4}function $t(e){return Bt(e)?"regular":Ft(e)?"replaceable":Vt(e)?"ephemeral":Ut(e)?"parameterized":"unknown"}function Ht(e,t){const n=t instanceof Array?t:[t];return kt(e)&&n.includes(e.kind)||!1}i(qt,{Application:()=>ga,BadgeAward:()=>en,BadgeDefinition:()=>ca,BlockedRelaysList:()=>Un,BlossomServerList:()=>Qn,BookmarkList:()=>Bn,Bookmarksets:()=>sa,Calendar:()=>Sa,CalendarEventRSVP:()=>Ca,ChannelCreation:()=>dn,ChannelHideMessage:()=>fn,ChannelMessage:()=>pn,ChannelMetadata:()=>hn,ChannelMuteUser:()=>mn,ChatMessage:()=>tn,ClassifiedListing:()=>ya,ClientAuth:()=>Xn,Comment:()=>yn,CommunitiesList:()=>Fn,CommunityDefinition:()=>Aa,CommunityPostApproval:()=>En,Contacts:()=>Yt,CreateOrUpdateProduct:()=>pa,CreateOrUpdateStall:()=>ha,Curationsets:()=>la,Date:()=>ka,DirectMessageRelaysList:()=>Kn,DraftClassifiedListing:()=>wa,DraftLong:()=>ma,Emojisets:()=>_a,EncryptedDirectMessage:()=>Qt,EventDeletion:()=>Zt,FavoriteRelays:()=>Hn,FileMessage:()=>on,FileMetadata:()=>bn,FileServerPreference:()=>Yn,Followsets:()=>ia,ForumThread:()=>nn,GenericRepost:()=>sn,Genericlists:()=>ra,GiftWrap:()=>gn,GroupMetadata:()=>La,HTTPAuth:()=>aa,Handlerinformation:()=>Ea,Handlerrecommendation:()=>Pa,Highlights:()=>Nn,InterestsList:()=>Wn,Interestsets:()=>da,JobFeedback:()=>Mn,JobRequest:()=>An,JobResult:()=>Ln,Label:()=>Pn,LightningPubRPC:()=>Jn,LiveChatMessage:()=>wn,LiveEvent:()=>va,LongFormArticle:()=>fa,Metadata:()=>Wt,Mutelist:()=>jn,NWCWalletInfo:()=>Zn,NWCWalletRequest:()=>ea,NWCWalletResponse:()=>ta,NormalVideo:()=>un,NostrConnect:()=>na,OpenTimestamps:()=>_n,Photo:()=>ln,Pinlist:()=>Dn,Poll:()=>vn,PollResponse:()=>On,PrivateDirectMessage:()=>rn,ProblemTracker:()=>Sn,ProfileBadges:()=>ua,PublicChatsList:()=>Vn,Reaction:()=>Xt,RecommendRelay:()=>Kt,RelayList:()=>qn,RelayReview:()=>Ta,Relaysets:()=>oa,Report:()=>Cn,Reporting:()=>Tn,Repost:()=>Jt,Seal:()=>an,SearchRelaysList:()=>$n,ShortTextNote:()=>Gt,ShortVideo:()=>cn,Time:()=>xa,UserEmojiList:()=>Gn,UserStatuses:()=>ba,Voice:()=>kn,VoiceComment:()=>xn,Zap:()=>In,ZapGoal:()=>Rn,ZapRequest:()=>zn,classifyKind:()=>$t,isAddressableKind:()=>Ut,isEphemeralKind:()=>Vt,isKind:()=>Ht,isRegularKind:()=>Bt,isReplaceableKind:()=>Ft});var Wt=0,Gt=1,Kt=2,Yt=3,Qt=4,Zt=5,Jt=6,Xt=7,en=8,tn=9,nn=11,an=13,rn=14,on=15,sn=16,ln=20,un=21,cn=22,dn=40,hn=41,pn=42,fn=43,mn=44,_n=1040,gn=1059,vn=1068,bn=1063,yn=1111,wn=1311,kn=1222,xn=1244,Sn=1971,Cn=1984,Tn=1984,Pn=1985,En=4550,An=5999,Ln=6999,Mn=7e3,Rn=9041,zn=9734,In=9735,Nn=9802,On=1018,jn=1e4,Dn=10001,qn=10002,Bn=10003,Fn=10004,Vn=10005,Un=10006,$n=10007,Hn=10012,Wn=10015,Gn=10030,Kn=10050,Yn=10096,Qn=10063,Zn=13194,Jn=21e3,Xn=22242,ea=23194,ta=23195,na=24133,aa=27235,ia=3e4,ra=30001,oa=30002,sa=30003,la=30004,ua=30008,ca=30009,da=30015,ha=30017,pa=30018,fa=30023,ma=30024,_a=30030,ga=30078,va=30311,ba=30315,ya=30402,wa=30403,ka=31922,xa=31923,Sa=31924,Ca=31925,Ta=31987,Pa=31989,Ea=31990,Aa=34550,La=39e3;function Ma(e,t){if(e.ids&&-1===e.ids.indexOf(t.id))return!1;if(e.kinds&&-1===e.kinds.indexOf(t.kind))return!1;if(e.authors&&-1===e.authors.indexOf(t.pubkey))return!1;for(let n in e)if("#"===n[0]){let a=e[`#${n.slice(1)}`];if(a&&!t.tags.find(([e,t])=>e===n.slice(1)&&-1!==a.indexOf(t)))return!1}return!(e.since&&t.created_ate.until)}function Ra(e,t){for(let n=0;n{if("kinds"===e||"ids"===e||"authors"===e||"#"===e[0]){t[e]=t[e]||[];for(let a=0;at.limit)&&(t.limit=a.limit),a.until&&(!t.until||a.until>t.until)&&(t.until=a.until),a.since&&(!t.since||a.sinceFt(e))?e.authors.length*e.kinds.length:1/0,e.authors?.length&&e.kinds?.every(e=>Ut(e))&&e["#d"]?.length?e.authors.length*e.kinds.length*e["#d"].length:1/0)}var Na={};function Oa(e,t){let n=t.length+3,a=e.indexOf(`"${t}":`)+n,i=e.slice(a).indexOf('"')+a+1;return e.slice(i,i+64)}function ja(e,t){let n=t.length,a=e.indexOf(`"${t}":`)+n+3,i=e.slice(a),r=Math.min(i.indexOf(","),i.indexOf("}"));return parseInt(i.slice(0,r),10)}function Da(e){let t=e.slice(0,22).indexOf('"EVENT"');if(-1===t)return null;let n=e.slice(t+7+1).indexOf('"');if(-1===n)return null;let a=t+7+1+n,i=e.slice(a+1,80).indexOf('"');if(-1===i)return null;let r=a+1+i;return e.slice(a+1,r)}function qa(e,t){return t===Oa(e,"id")}function Ba(e,t){return t===Oa(e,"pubkey")}function Fa(e,t){return t===ja(e,"kind")}i(Na,{getHex64:()=>Oa,getInt:()=>ja,getSubscriptionId:()=>Da,matchEventId:()=>qa,matchEventKind:()=>Fa,matchEventPubkey:()=>Ba});var Va={};function Ua(e,t){return{kind:Xn,created_at:Math.floor(Date.now()/1e3),tags:[["relay",e],["challenge",t]],content:""}}i(Va,{makeAuthEvent:()=>Ua});var $a,Ha=class extends Error{constructor(e,t){super(`Tried to send message '${e} on a closed connection to ${t}.`),this.name="SendingOnClosedConnection"}},Wa=class{url;_connected=!1;onclose=null;onnotice=e=>console.debug(`NOTICE from ${this.url}: ${e}`);onauth;baseEoseTimeout=4400;publishTimeout=4400;pingFrequency=29e3;pingTimeout=2e4;resubscribeBackoff=[1e4,1e4,1e4,2e4,2e4,3e4,6e4];openSubs=new Map;enablePing;enableReconnect;idleSince=Date.now();ongoingOperations=0;reconnectTimeoutHandle;pingIntervalHandle;reconnectAttempts=0;skipReconnection=!1;connectionPromise;openCountRequests=new Map;openEventPublishes=new Map;ws;challenge;authPromise;serial=0;verifyEvent;_WebSocket;constructor(e,t){this.url=Pt(e),this.verifyEvent=t.verifyEvent,this._WebSocket=t.websocketImplementation||WebSocket,this.enablePing=t.enablePing,this.enableReconnect=t.enableReconnect||!1}static async connect(e,t){const n=new Wa(e,t);return await n.connect(t),n}closeAllSubscriptions(e){for(let[t,n]of this.openSubs)n.close(e);this.openSubs.clear();for(let[t,n]of this.openEventPublishes)n.reject(new Error(e));this.openEventPublishes.clear();for(let[t,n]of this.openCountRequests)n.reject(new Error(e));this.openCountRequests.clear()}get connected(){return this._connected}async reconnect(){const e=this.resubscribeBackoff[Math.min(this.reconnectAttempts,this.resubscribeBackoff.length-1)];this.reconnectAttempts++,this.reconnectTimeoutHandle=setTimeout(async()=>{try{await this.connect()}catch(e){}},e)}handleHardClose(e){this.pingIntervalHandle&&(clearInterval(this.pingIntervalHandle),this.pingIntervalHandle=void 0),this._connected=!1,this.connectionPromise=void 0,this.idleSince=void 0,this.enableReconnect&&!this.skipReconnection?this.reconnect():(this.onclose?.(),this.closeAllSubscriptions(e))}async connect(e){let t;return this.connectionPromise||(this.challenge=void 0,this.authPromise=void 0,this.skipReconnection=!1,this.connectionPromise=new Promise((n,a)=>{e?.timeout&&(t=setTimeout(()=>{a("connection timed out"),this.connectionPromise=void 0,this.skipReconnection=!0,this.onclose?.(),this.handleHardClose("relay connection timed out")},e.timeout)),e?.abort&&(e.abort.onabort=a);try{this.ws=new this._WebSocket(this.url)}catch(e){return clearTimeout(t),void a(e)}this.ws.onopen=()=>{this.reconnectTimeoutHandle&&(clearTimeout(this.reconnectTimeoutHandle),this.reconnectTimeoutHandle=void 0),clearTimeout(t),this._connected=!0;const e=this.reconnectAttempts>0;this.reconnectAttempts=0;for(const t of this.openSubs.values()){if(t.eosed=!1,e)for(let e=0;ethis.pingpong(),this.pingFrequency)),n()},this.ws.onerror=()=>{clearTimeout(t),a("connection failed"),this.connectionPromise=void 0,this.skipReconnection=!0,this.onclose?.(),this.handleHardClose("relay connection failed")},this.ws.onclose=e=>{clearTimeout(t),a(e.message||"websocket closed"),this.handleHardClose("relay connection closed")},this.ws.onmessage=this._onmessage.bind(this)})),this.connectionPromise}waitForPingPong(){return new Promise(e=>{this.ws.once("pong",()=>e(!0)),this.ws.ping()})}waitForDummyReq(){return new Promise((e,t)=>{if(!this.connectionPromise)return t(new Error(`no connection to ${this.url}, can't ping`));try{const t=this.subscribe([{ids:["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],limit:0}],{label:"",oneose:()=>{e(!0),t.close()},onclose(){e(!0)},eoseTimeout:this.pingTimeout+1e3})}catch(e){t(e)}})}async pingpong(){if(1===this.ws?.readyState){await Promise.any([this.ws&&this.ws.ping&&this.ws.once?this.waitForPingPong():this.waitForDummyReq(),new Promise(e=>setTimeout(()=>e(!1),this.pingTimeout))])||this.ws?.readyState===this._WebSocket.OPEN&&this.ws?.close()}}async send(e){if(!this.connectionPromise)throw new Ha(e,this.url);this.connectionPromise.then(()=>{this.ws?.send(e)})}async auth(e){const t=this.challenge;if(!t)throw new Error("can't perform auth, no challenge was received");return this.authPromise||(this.authPromise=new Promise(async(n,a)=>{try{let i=await e(Ua(this.url,t)),r=setTimeout(()=>{let e=this.openEventPublishes.get(i.id);e&&(e.reject(new Error("auth timed out")),this.openEventPublishes.delete(i.id))},this.publishTimeout);this.openEventPublishes.set(i.id,{resolve:n,reject:a,timeout:r}),this.send('["AUTH",'+JSON.stringify(i)+"]")}catch(e){console.warn("subscribe auth function failed:",e)}})),this.authPromise}async publish(e){this.idleSince=void 0,this.ongoingOperations++;const t=new Promise((t,n)=>{const a=setTimeout(()=>{const t=this.openEventPublishes.get(e.id);t&&(t.reject(new Error("publish timed out")),this.openEventPublishes.delete(e.id))},this.publishTimeout);this.openEventPublishes.set(e.id,{resolve:t,reject:n,timeout:a})});return this.send('["EVENT",'+JSON.stringify(e)+"]"),this.ongoingOperations--,0===this.ongoingOperations&&(this.idleSince=Date.now()),t}async count(e,t){this.serial++;const n=t?.id||"count:"+this.serial,a=new Promise((e,t)=>{this.openCountRequests.set(n,{resolve:e,reject:t})});return this.send('["COUNT","'+n+'",'+JSON.stringify(e).substring(1)),a}subscribe(e,t){""!==t.label&&(this.idleSince=void 0,this.ongoingOperations++);const n=this.prepareSubscription(e,t);return n.fire(),t.abort&&(t.abort.onabort=()=>n.close(String(t.abort.reason||""))),n}prepareSubscription(e,t){this.serial++;const n=t.id||(t.label?t.label+":":"sub:")+this.serial,a=new Ga(this,n,e,t);return this.openSubs.set(n,a),a}close(){this.skipReconnection=!0,this.reconnectTimeoutHandle&&(clearTimeout(this.reconnectTimeoutHandle),this.reconnectTimeoutHandle=void 0),this.pingIntervalHandle&&(clearInterval(this.pingIntervalHandle),this.pingIntervalHandle=void 0),this.closeAllSubscriptions("relay connection closed by us"),this._connected=!1,this.idleSince=void 0,this.onclose?.(),this.ws?.readyState===this._WebSocket.OPEN&&this.ws?.close()}_onmessage(e){const t=e.data;if(!t)return;const n=Da(t);if(n){const e=this.openSubs.get(n);if(!e)return;const a=Oa(t,"id"),i=e.alreadyHaveEvent?.(a);if(e.receivedEvent?.(this,a),i)return}try{let e=JSON.parse(t);switch(e[0]){case"EVENT":{const t=this.openSubs.get(e[1]),n=e[2];return this.verifyEvent(n)&&Ra(t.filters,n)?t.onevent(n):t.oninvalidevent?.(n),void((!t.lastEmitted||t.lastEmitted{console.warn(`onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`,e)})}fire(){this.relay.send('["REQ","'+this.id+'",'+JSON.stringify(this.filters).substring(1)),this.eoseTimeoutHandle=setTimeout(this.receivedEose.bind(this),this.eoseTimeout)}receivedEose(){this.eosed||(clearTimeout(this.eoseTimeoutHandle),this.eosed=!0,this.oneose?.())}close(e="closed by caller"){if(!this.closed&&this.relay.connected){try{this.relay.send('["CLOSE",'+JSON.stringify(this.id)+"]")}catch(e){if(!(e instanceof Ha))throw e}this.closed=!0}this.relay.openSubs.delete(this.id),this.relay.ongoingOperations--,0===this.relay.ongoingOperations&&(this.relay.idleSince=Date.now()),this.onclose?.(e)}};try{$a=WebSocket}catch{}var Ka,Ya=class extends Wa{constructor(e,t){super(e,{verifyEvent:Dt,websocketImplementation:$a,...t})}static async connect(e,t){const n=new Ya(e,t);return await n.connect(),n}},Qa=e=>(e[yt]=!0,!0),Za=class{relays=new Map;seenOn=new Map;trackRelays=!1;verifyEvent;enablePing;enableReconnect;automaticallyAuth;trustedRelayURLs=new Set;onRelayConnectionFailure;onRelayConnectionSuccess;allowConnectingToRelay;maxWaitForConnection;_WebSocket;constructor(e){this.verifyEvent=e.verifyEvent,this._WebSocket=e.websocketImplementation,this.enablePing=e.enablePing,this.enableReconnect=e.enableReconnect||!1,this.automaticallyAuth=e.automaticallyAuth,this.onRelayConnectionFailure=e.onRelayConnectionFailure,this.onRelayConnectionSuccess=e.onRelayConnectionSuccess,this.allowConnectingToRelay=e.allowConnectingToRelay,this.maxWaitForConnection=e.maxWaitForConnection||3e3}async ensureRelay(e,t){e=Pt(e);let n=this.relays.get(e);if(n||(n=new Wa(e,{verifyEvent:this.trustedRelayURLs.has(e)?Qa:this.verifyEvent,websocketImplementation:this._WebSocket,enablePing:this.enablePing,enableReconnect:this.enableReconnect}),n.onclose=()=>{this.relays.delete(e)},this.relays.set(e,n)),this.automaticallyAuth){const t=this.automaticallyAuth(e);t&&(n.onauth=t)}try{await n.connect({timeout:t?.connectionTimeout,abort:t?.abort})}catch(t){throw this.relays.delete(e),t}return n}close(e){e.map(Pt).forEach(e=>{this.relays.get(e)?.close(),this.relays.delete(e)})}subscribe(e,t,n){const a=[],i=[];for(let n=0;ne.url===r)||-1===i.indexOf(r)&&(i.push(r),a.push({url:r,filter:t}))}return this.subscribeMap(a,n)}subscribeMany(e,t,n){return this.subscribe(e,t,n)}subscribeMap(e,t){const n=new Map;for(const t of e){const{url:e,filter:a}=t;n.has(e)||n.set(e,[]),n.get(e).push(a)}const a=Array.from(n.entries()).map(([e,t])=>({url:e,filters:t}));this.trackRelays&&(t.receivedEvent=(e,t)=>{let n=this.seenOn.get(t);n||(n=new Set,this.seenOn.set(t,n)),n.add(e)});const i=new Set,r=[],o=[];let s=e=>{o[e]||(o[e]=!0,o.filter(e=>e).length===a.length&&(t.oneose?.(),s=()=>{}))};const l=[];let u=(e,n)=>{l[e]||(s(e),l[e]=n,l.filter(e=>e).length===a.length&&(t.onclose?.(l),u=()=>{}))};const c=e=>{if(t.alreadyHaveEvent?.(e))return!0;const n=i.has(e);return i.add(e),n},d=Promise.all(a.map(async({url:e,filters:n},a)=>{if(!1===this.allowConnectingToRelay?.(e,["read",n]))return void u(a,"connection skipped by allowConnectingToRelay");let i;try{i=await this.ensureRelay(e,{connectionTimeout:this.maxWaitForConnection<(t.maxWait||0)?Math.max(.8*t.maxWait,t.maxWait-1e3):this.maxWaitForConnection,abort:t.abort})}catch(t){return this.onRelayConnectionFailure?.(e),void u(a,t?.message||String(t))}this.onRelayConnectionSuccess?.(e);let o=i.subscribe(n,{...t,oneose:()=>s(a),onclose:e=>{e.startsWith("auth-required: ")&&t.onauth?i.auth(t.onauth).then(()=>{i.subscribe(n,{...t,oneose:()=>s(a),onclose:e=>{u(a,e)},alreadyHaveEvent:c,eoseTimeout:t.maxWait,abort:t.abort})}).catch(e=>{u(a,`auth was required and attempted, but failed with: ${e}`)}):u(a,e)},alreadyHaveEvent:c,eoseTimeout:t.maxWait,abort:t.abort});r.push(o)}));return{async close(e){await d,r.forEach(t=>{t.close(e)})}}}subscribeEose(e,t,n){let a;return a=this.subscribe(e,t,{...n,oneose(){const t="closed automatically on eose";a?a.close(t):n.onclose?.(e.map(e=>t))}}),a}subscribeManyEose(e,t,n){return this.subscribeEose(e,t,n)}async querySync(e,t,n){return new Promise(async a=>{const i=[];this.subscribeEose(e,t,{...n,onevent(e){i.push(e)},onclose(e){a(i)}})})}async get(e,t,n){t.limit=1;const a=await this.querySync(e,t,n);return a.sort((e,t)=>t.created_at-e.created_at),a[0]||null}publish(e,t,n){return e.map(Pt).map(async(e,a,i)=>{if(i.indexOf(e)!==a)return Promise.reject("duplicate url");if(!1===this.allowConnectingToRelay?.(e,["write",t]))return Promise.reject("connection skipped by allowConnectingToRelay");let r;try{r=await this.ensureRelay(e,{connectionTimeout:this.maxWaitForConnection<(n?.maxWait||0)?Math.max(.8*n.maxWait,n.maxWait-1e3):this.maxWaitForConnection,abort:n?.abort})}catch(t){return this.onRelayConnectionFailure?.(e),String("connection failure: "+String(t))}return r.publish(t).catch(async e=>{if(e instanceof Error&&e.message.startsWith("auth-required: ")&&n?.onauth)return await r.auth(n.onauth),r.publish(t);throw e}).then(e=>{if(this.trackRelays){let e=this.seenOn.get(t.id);e||(e=new Set,this.seenOn.set(t.id,e)),e.add(r)}return e})})}listConnectionStatus(){const e=new Map;return this.relays.forEach((t,n)=>e.set(n,t.connected)),e}destroy(){this.relays.forEach(e=>e.close()),this.relays=new Map}pruneIdleRelays(e=1e4){const t=[];for(const[n,a]of this.relays)a.idleSince&&Date.now()-a.idleSince>=e&&(this.relays.delete(n),t.push(n),a.close());return t}};try{Ka=WebSocket}catch{}var Ja=class extends Za{constructor(e){super({verifyEvent:Dt,websocketImplementation:Ka,maxWaitForConnection:3e3,...e})}},Xa={};function ei(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&"Uint8Array"===e.constructor.name}function ti(e){if(!ei(e))throw new Error("Uint8Array expected")}function ni(e,t){return!!Array.isArray(t)&&(0===t.length||(e?t.every(e=>"string"==typeof e):t.every(e=>Number.isSafeInteger(e))))}function ai(e){if("function"!=typeof e)throw new Error("function expected");return!0}function ii(e,t){if("string"!=typeof t)throw new Error(`${e}: string expected`);return!0}function ri(e){if(!Number.isSafeInteger(e))throw new Error(`invalid integer: ${e}`)}function oi(e){if(!Array.isArray(e))throw new Error("array expected")}function si(e,t){if(!ni(!0,t))throw new Error(`${e}: array of strings expected`)}function li(e,t){if(!ni(!1,t))throw new Error(`${e}: array of numbers expected`)}function ui(...e){const t=e=>e,n=(e,t)=>n=>e(t(n));return{encode:e.map(e=>e.encode).reduceRight(n,t),decode:e.map(e=>e.decode).reduce(n,t)}}function ci(e){const t="string"==typeof e?e.split(""):e,n=t.length;si("alphabet",t);const a=new Map(t.map((e,t)=>[e,t]));return{encode:a=>(oi(a),a.map(a=>{if(!Number.isSafeInteger(a)||a<0||a>=n)throw new Error(`alphabet.encode: digit index outside alphabet "${a}". Allowed: ${e}`);return t[a]})),decode:t=>(oi(t),t.map(t=>{ii("alphabet.decode",t);const n=a.get(t);if(void 0===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n}))}}function di(e=""){return ii("join",e),{encode:t=>(si("join.decode",t),t.join(e)),decode:t=>(ii("join.decode",t),t.split(e))}}function hi(e,t="="){return ri(e),ii("padding",t),{encode(n){for(si("padding.encode",n);n.length*e%8;)n.push(t);return n},decode(n){si("padding.decode",n);let a=n.length;if(a*e%8)throw new Error("padding: invalid, string should have whole number of bytes");for(;a>0&&n[a-1]===t;a--){if((a-1)*e%8==0)throw new Error("padding: invalid, string has too much padding")}return n.slice(0,a)}}}function pi(e){return ai(e),{encode:e=>e,decode:t=>e(t)}}function fi(e,t,n){if(t<2)throw new Error(`convertRadix: invalid from=${t}, base cannot be less than 2`);if(n<2)throw new Error(`convertRadix: invalid to=${n}, base cannot be less than 2`);if(oi(e),!e.length)return[];let a=0;const i=[],r=Array.from(e,e=>{if(ri(e),e<0||e>=t)throw new Error(`invalid integer: ${e}`);return e}),o=r.length;for(;;){let e=0,s=!0;for(let i=a;izi,Bech32MaxSize:()=>Ri,NostrTypeGuard:()=>Mi,decode:()=>Ni,decodeNostrURI:()=>Ii,encodeBytes:()=>Fi,naddrEncode:()=>$i,neventEncode:()=>Ui,noteEncode:()=>qi,nprofileEncode:()=>Vi,npubEncode:()=>Di,nsecEncode:()=>ji});var mi=(e,t)=>0===t?e:mi(t,e%t),_i=(e,t)=>e+(t-mi(e,t)),gi=(()=>{let e=[];for(let t=0;t<40;t++)e.push(2**t);return e})();function vi(e,t,n,a){if(oi(e),t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw new Error(`convertRadix2: wrong to=${n}`);if(_i(t,n)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${_i(t,n)}`);let i=0,r=0;const o=gi[t],s=gi[n]-1,l=[];for(const a of e){if(ri(a),a>=o)throw new Error(`convertRadix2: invalid data word=${a} from=${t}`);if(i=i<32)throw new Error(`convertRadix2: carry overflow pos=${r} from=${t}`);for(r+=t;r>=n;r-=n)l.push((i>>r-n&s)>>>0);const e=gi[r];if(void 0===e)throw new Error("invalid carry");i&=e-1}if(i=i<=t)throw new Error("Excess padding");if(!a&&i>0)throw new Error(`Non-zero padding: ${i}`);return a&&r>0&&l.push(i>>>0),l}function bi(e,t=!1){if(ri(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(_i(8,e)>32||_i(e,8)>32)throw new Error("radix2: carry overflow");return{encode:n=>{if(!ei(n))throw new Error("radix2.encode input should be Uint8Array");return vi(Array.from(n),8,e,!t)},decode:n=>(li("radix2.decode",n),Uint8Array.from(vi(n,e,8,t)))}}function yi(e){return ai(e),function(...t){try{return e.apply(null,t)}catch(e){}}}ui(bi(4),ci("0123456789ABCDEF"),di("")),ui(bi(5),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"),hi(5),di("")),ui(bi(5),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"),di("")),ui(bi(5),ci("0123456789ABCDEFGHIJKLMNOPQRSTUV"),hi(5),di("")),ui(bi(5),ci("0123456789ABCDEFGHIJKLMNOPQRSTUV"),di("")),ui(bi(5),ci("0123456789ABCDEFGHJKMNPQRSTVWXYZ"),di(""),pi(e=>e.toUpperCase().replace(/O/g,"0").replace(/[IL]/g,"1")));var wi=(()=>"function"==typeof Uint8Array.from([]).toBase64&&"function"==typeof Uint8Array.fromBase64)(),ki=(e,t)=>{ii("base64",e);const n=t?/^[A-Za-z0-9=_-]+$/:/^[A-Za-z0-9=+/]+$/,a=t?"base64url":"base64";if(e.length>0&&!n.test(e))throw new Error("invalid base64");return Uint8Array.fromBase64(e,{alphabet:a,lastChunkHandling:"strict"})},xi=wi?{encode:e=>(ti(e),e.toBase64()),decode:e=>ki(e,!1)}:ui(bi(6),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),hi(6),di("")),Si=(ui(bi(6),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),di("")),wi||ui(bi(6),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),hi(6),di("")),ui(bi(6),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),di("")),e=>{return ui((ri(t=58),{encode:e=>{if(!ei(e))throw new Error("radix.encode input should be Uint8Array");return fi(Array.from(e),256,t)},decode:e=>(li("radix.decode",e),Uint8Array.from(fi(e,t,256)))}),ci(e),di(""));var t}),Ci=(Si("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"),Si("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"),Si("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"),ui(ci("qpzry9x8gf2tvdw0s3jn54khce6mua7l"),di(""))),Ti=[996825010,642813549,513874426,1027748829,705979059];function Pi(e){const t=e>>25;let n=(33554431&e)<<5;for(let e=0;e>e&1)&&(n^=Ti[e]);return n}function Ei(e,t,n=1){const a=e.length;let i=1;for(let t=0;t126)throw new Error(`Invalid prefix (${e})`);i=Pi(i)^n>>5}i=Pi(i);for(let t=0;ta)throw new TypeError(`Length ${r} exceeds limit ${a}`);const o=e.toLowerCase(),s=Ei(o,n,t);return`${o}1${Ci.encode(n)}${s}`}function s(e,n=90){ii("bech32.decode input",e);const a=e.length;if(a<8||!1!==n&&a>n)throw new TypeError(`invalid string length: ${a} (${e}). Expected (8..${n})`);const i=e.toLowerCase();if(e!==i&&e!==e.toUpperCase())throw new Error("String must be lowercase or uppercase");const r=i.lastIndexOf("1");if(0===r||-1===r)throw new Error('Letter "1" must be present between prefix and data only');const o=i.slice(0,r),s=i.slice(r+1);if(s.length<6)throw new Error("Data must be at least 6 characters long");const l=Ci.decode(s).slice(0,-6),u=Ei(o,l,t);if(!s.endsWith(u))throw new Error(`Invalid checksum in ${e}: expected "${u}"`);return{prefix:o,words:l}}return{encode:o,decode:s,encodeFromBytes:function(e,t){return o(e,i(t))},decodeToBytes:function(e){const{prefix:t,words:n}=s(e,!1);return{prefix:t,words:n,bytes:a(n)}},decodeUnsafe:yi(s),fromWords:a,fromWordsUnsafe:r,toWords:i}}var Li=Ai("bech32"),Mi=(Ai("bech32m"),(()=>"function"==typeof Uint8Array.from([]).toHex&&"function"==typeof Uint8Array.fromHex)()||ui(bi(4),ci("0123456789abcdef"),di(""),pi(e=>{if("string"!=typeof e||e.length%2!=0)throw new TypeError(`hex.decode: expected string, got ${typeof e} with length ${e.length}`);return e.toLowerCase()})),{isNProfile:e=>/^nprofile1[a-z\d]+$/.test(e||""),isNEvent:e=>/^nevent1[a-z\d]+$/.test(e||""),isNAddr:e=>/^naddr1[a-z\d]+$/.test(e||""),isNSec:e=>/^nsec1[a-z\d]{58}$/.test(e||""),isNPub:e=>/^npub1[a-z\d]{58}$/.test(e||""),isNote:e=>/^note1[a-z\d]+$/.test(e||""),isNcryptsec:e=>/^ncryptsec1[a-z\d]+$/.test(e||"")}),Ri=5e3,zi=/[\x21-\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;function Ii(e){try{return e.startsWith("nostr:")&&(e=e.substring(6)),Ni(e)}catch(e){return{type:"invalid",data:null}}}function Ni(e){let{prefix:t,words:n}=Li.decode(e,Ri),a=new Uint8Array(Li.fromWords(n));switch(t){case"nprofile":{let e=Oi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:_(e[0][0]),relays:e[1]?e[1].map(e=>Ct.decode(e)):[]}}}case"nevent":{let e=Oi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for nevent");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");if(e[2]&&32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(e[3]&&4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:_(e[0][0]),relays:e[1]?e[1].map(e=>Ct.decode(e)):[],author:e[2]?.[0]?_(e[2][0]):void 0,kind:e[3]?.[0]?parseInt(_(e[3][0]),16):void 0}}}case"naddr":{let e=Oi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!e[2]?.[0])throw new Error("missing TLV 2 for naddr");if(32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(!e[3]?.[0])throw new Error("missing TLV 3 for naddr");if(4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:Ct.decode(e[0][0]),pubkey:_(e[2][0]),kind:parseInt(_(e[3][0]),16),relays:e[1]?e[1].map(e=>Ct.decode(e)):[]}}}case"nsec":return{type:t,data:a};case"npub":case"note":return{type:t,data:_(a)};default:throw new Error(`unknown prefix ${t}`)}}function Oi(e){let t={},n=e;for(;n.length>0;){let e=n[0],a=n[1],i=n.slice(2,2+a);if(n=n.slice(2+a),i.lengthTt.encode(e))}))}function Ui(e){let t;return void 0!==e.kind&&(t=function(e){const t=new Uint8Array(4);return t[0]=e>>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t}(e.kind)),Bi("nevent",Hi({0:[S(e.id)],1:(e.relays||[]).map(e=>Tt.encode(e)),2:e.author?[S(e.author)]:[],3:t?[new Uint8Array(t)]:[]}))}function $i(e){let t=new ArrayBuffer(4);return new DataView(t).setUint32(0,e.kind,!1),Bi("naddr",Hi({0:[Tt.encode(e.identifier)],1:(e.relays||[]).map(e=>Tt.encode(e)),2:[S(e.pubkey)],3:[new Uint8Array(t)]}))}function Hi(e){let t=[];return Object.entries(e).reverse().forEach(([e,n])=>{n.forEach(n=>{let a=new Uint8Array(n.length+2);a.set([parseInt(e)],0),a.set([n.length],1),a.set(n,2),t.push(a)})}),C(...t)}var Wi=/\bnostr:((note|npub|naddr|nevent|nprofile)1\w+)\b|#\[(\d+)\]/g;function Gi(e){let t=[];for(let n of e.content.matchAll(Wi))if(n[2])try{let{type:e,data:a}=Ni(n[1]);switch(e){case"npub":t.push({text:n[0],profile:{pubkey:a,relays:[]}});break;case"nprofile":t.push({text:n[0],profile:a});break;case"note":t.push({text:n[0],event:{id:a,relays:[]}});break;case"nevent":t.push({text:n[0],event:a});break;case"naddr":t.push({text:n[0],address:a})}}catch(e){}else if(n[3]){let a=parseInt(n[3],10),i=e.tags[a];if(!i)continue;switch(i[0]){case"p":t.push({text:n[0],profile:{pubkey:i[1],relays:i[2]?[i[2]]:[]}});break;case"e":t.push({text:n[0],event:{id:i[1],relays:i[2]?[i[2]]:[]}});break;case"a":try{let[e,a,r]=i[1].split(":");t.push({text:n[0],address:{identifier:r,pubkey:a,kind:parseInt(e,10),relays:i[2]?[i[2]]:[]}})}catch(e){}}}return t}var Ki={};function Yi(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Qi(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("positive integer expected, got "+e)}function Zi(e,t,n=""){const a=(i=e)instanceof Uint8Array||ArrayBuffer.isView(i)&&"Uint8Array"===i.constructor.name;var i;const r=e?.length,o=void 0!==t;if(!a||o&&r!==t){throw new Error((n&&`"${n}" `)+"expected Uint8Array"+(o?` of length ${t}`:"")+", got "+(a?`length=${r}`:"type="+typeof e))}return e}function Ji(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function Xi(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function er(...e){for(let t=0;tEr,encrypt:()=>Pr});var tr=(()=>68===new Uint8Array(new Uint32Array([287454020]).buffer)[0])();function nr(e,t){if(a=t,(n=e).buffer===a.buffer&&n.byteOffset{function n(n,...a){if(Zi(n,void 0,"key"),!tr)throw new Error("Non little-endian hardware is not yet supported");if(void 0!==e.nonceLength){Zi(a[0],e.varSizeNonce?void 0:e.nonceLength,"nonce")}const i=e.tagLength;i&&void 0!==a[1]&&Zi(a[1],void 0,"AAD");const r=t(n,...a),o=(e,t)=>{if(void 0!==t){if(2!==e)throw new Error("cipher output not supported");Zi(t,void 0,"output")}};let s=!1;return{encrypt(e,t){if(s)throw new Error("cannot encrypt() twice with same key + nonce");return s=!0,Zi(e),o(r.encrypt.length,t),r.encrypt(e,t)},decrypt(e,t){if(Zi(e),i&&e.length"e"===e&&t);return a&&!a[1].match(/^[a-f0-9]{64}$/)?"Zap request 'e' tag is not valid hex.":t.tags.find(([e,t])=>"relays"===e&&t)?null:"Zap request doesn't have a 'relays' tag."}function Is({zapRequest:e,preimage:t,bolt11:n,paidAt:a}){let i=JSON.parse(e),r=i.tags.filter(([e])=>"e"===e||"p"===e||"a"===e),o={kind:9735,created_at:Math.round(a.getTime()/1e3),content:"",tags:[...r,["P",i.pubkey],["bolt11",n],["description",e]]};return t&&o.tags.push(["preimage",t]),o}function Ns(e){if(e.length<50)return 0;const t=(e=e.substring(0,50)).lastIndexOf("1");if(-1===t)return 0;const n=e.substring(0,t);if(!n.startsWith("lnbc"))return 0;const a=n.substring(4);if(a.length<1)return 0;const i=a[a.length-1],r=i.charCodeAt(0)-"0".charCodeAt(0),o=r>=0&&r<=9;let s=a.length-1;if(o&&s++,s<1)return 0;const l=parseInt(a.substring(0,s));switch(i){case"m":return 1e5*l;case"u":return 100*l;case"n":return l/10;case"p":return l/1e4;default:return 1e8*l}}var Os={};i(Os,{Negentropy:()=>Gs,NegentropyStorageVector:()=>Ws,NegentropySync:()=>Qs});var js=32,Ds=0,qs=1,Bs=2,Fs=class{_raw;length;constructor(e){"number"==typeof e?(this._raw=new Uint8Array(e),this.length=0):e instanceof Uint8Array?(this._raw=new Uint8Array(e),this.length=e.length):(this._raw=new Uint8Array(512),this.length=0)}unwrap(){return this._raw.subarray(0,this.length)}get capacity(){return this._raw.byteLength}extend(e){if(e instanceof Fs&&(e=e.unwrap()),"number"!=typeof e.length)throw Error("bad length");const t=e.length+this.length;if(this.capacity>>=7;t.reverse();for(let e=0;e4294967295&&(n=1),a.setUint32(r,4294967295&o,!0),t=n,n=0}}negate(){let e=new DataView(this.buf.buffer);for(let t=0;t<8;t++){let n=4*t;e.setUint32(n,~e.getUint32(n,!0))}let t=new Uint8Array(js);t[0]=1,this.add(t)}getFingerprint(e){let t=new Fs;return t.extend(this.buf),t.extend(Us(e)),j(t.unwrap()).subarray(0,16)}},Ws=class{items;sealed;constructor(){this.items=[],this.sealed=!1}insert(e,t){if(this.sealed)throw Error("already sealed");const n=S(t);if(n.byteLength!==js)throw Error("bad id size for added item");this.items.push({timestamp:e,id:n})}seal(){if(this.sealed)throw Error("already sealed");this.sealed=!0,this.items.sort(Ys);for(let e=1;e=this.items.length)throw Error("out of range");return this.items[e]}iterate(e,t,n){this._checkSealed(),this._checkBounds(e,t);for(let a=e;aYs(e,n)<0)}fingerprint(e,t){let n=new Hs;return n.setToZero(),this.iterate(e,t,e=>(n.add(e.id),!0)),n.getFingerprint(t-e)}_checkSealed(){if(!this.sealed)throw Error("not sealed")}_checkBounds(e,t){if(e>t||t>this.items.length)throw Error("bad range")}_binarySearch(e,t,n,a){let i=n-t;for(;i>0;){let n=t,r=Math.floor(i/2);n+=r,a(e[n])?(t=++n,i-=r+1):i=r}return t}},Gs=class{storage;frameSizeLimit;lastTimestampIn;lastTimestampOut;constructor(e,t=6e4){if(t<4096)throw Error("frameSizeLimit too small");this.storage=e,this.frameSizeLimit=t,this.lastTimestampIn=0,this.lastTimestampOut=0}_bound(e,t){return{timestamp:e,id:t||new Uint8Array(0)}}initiate(){let e=new Fs;return e.extend(new Uint8Array([97])),this.splitRange(0,this.storage.size(),this._bound(Number.MAX_VALUE),e),_(e.unwrap())}reconcile(e,t,n){const a=new Fs(S(e));this.lastTimestampIn=this.lastTimestampOut=0;let i=new Fs;i.extend(new Uint8Array([97]));let r=$s(a,1)[0];if(r<96||r>111)throw Error("invalid negentropy protocol version byte");if(97!==r)throw Error("unsupported negentropy protocol version requested: "+(r-96));let o=this.storage.size(),s=this._bound(0),l=0,u=!1;for(;0!==a.length;){let e=new Fs,r=()=>{u&&(u=!1,e.extend(this.encodeBound(s)),e.extend(Us(Ds)))},c=this.decodeBound(a),d=Vs(a),h=l,p=this.storage.findLowerBound(l,o,c);if(d===Ds)u=!0;else if(d===qs){0!==Ks($s(a,16),this.storage.fingerprint(h,p))?(r(),this.splitRange(h,p,c,e)):u=!0}else{if(d!==Bs)throw Error("unexpected mode");{let e=Vs(a),i={};for(let t=0;t{let n=e.id;const a=_(n);return i[a]?delete i[_(n)]:t?.(a),!0}),n)for(let e of Object.values(i))n(_(e))}}if(this.exceededFrameSizeLimit(i.length+e.length)){let e=this.storage.fingerprint(p,o);i.extend(this.encodeBound(this._bound(Number.MAX_VALUE))),i.extend(Us(qs)),i.extend(e);break}i.extend(e),l=p,s=c}return 1===i.length?null:_(i.unwrap())}splitRange(e,t,n,a){let i=t-e;if(i<32)a.extend(this.encodeBound(n)),a.extend(Us(Bs)),a.extend(Us(i)),this.storage.iterate(e,t,e=>(a.extend(e.id),!0));else{let r=Math.floor(i/16),o=i%16,s=e;for(let e=0;e<16;e++){let i,l=r+(e(a===s-1?e=n:t=n,!0)),i=this.getMinimalBound(e,t)}a.extend(this.encodeBound(i)),a.extend(Us(qs)),a.extend(u)}}}exceededFrameSizeLimit(e){return e>this.frameSizeLimit-200}decodeTimestampIn(e){let t=Vs(e);return t=0===t?Number.MAX_VALUE:t-1,this.lastTimestampIn===Number.MAX_VALUE||t===Number.MAX_VALUE?(this.lastTimestampIn=Number.MAX_VALUE,Number.MAX_VALUE):(t+=this.lastTimestampIn,this.lastTimestampIn=t,t)}decodeBound(e){let t=this.decodeTimestampIn(e),n=Vs(e);if(n>js)throw Error("bound key too long");return{timestamp:t,id:$s(e,n)}}encodeTimestampOut(e){if(e===Number.MAX_VALUE)return this.lastTimestampOut=Number.MAX_VALUE,Us(0);let t=e;return e-=this.lastTimestampOut,this.lastTimestampOut=t,Us(e+1)}encodeBound(e){let t=new Fs;return t.extend(this.encodeTimestampOut(e.timestamp)),t.extend(Us(e.id.length)),t.extend(e.id),t}getMinimalBound(e,t){if(t.timestamp!==e.timestamp)return this._bound(t.timestamp);{let n=0,a=t.id,i=e.id;for(let e=0;et[n])return 1}return e.byteLength>t.byteLength?1:e.byteLength{switch(e[0]){case"NEG-MSG":e.length<3&&console.warn(`got invalid NEG-MSG from ${this.relay.url}: ${e}`);try{const t=this.neg.reconcile(e[2],this.onhave,this.onneed);t?this.relay.send(`["NEG-MSG", "${this.subscription.id}", "${t}"]`):(this.close(),a.onclose?.())}catch(e){console.error("negentropy reconcile error:",e),a?.onclose?.(`reconcile error: ${e}`)}break;case"NEG-CLOSE":{const t=e[2];console.warn("negentropy error:",t),a.onclose?.(t);break}case"NEG-ERR":a.onclose?.()}}}async start(){const e=this.neg.initiate();this.relay.send(`["NEG-OPEN","${this.subscription.id}",${JSON.stringify(this.filter)},"${e}"]`)}close(){this.relay.send(`["NEG-CLOSE","${this.subscription.id}"]`),this.subscription.close()}},Zs={};i(Zs,{getToken:()=>el,hashPayload:()=>sl,unpackEventFromToken:()=>nl,validateEvent:()=>ul,validateEventKind:()=>il,validateEventMethodTag:()=>ol,validateEventPayloadTag:()=>ll,validateEventTimestamp:()=>al,validateEventUrlTag:()=>rl,validateToken:()=>tl});var Js,Xs="Nostr ";async function el(e,t,n,a=!1,i){const r={kind:aa,tags:[["u",e],["method",t]],created_at:Math.round((new Date).getTime()/1e3),content:""};i&&r.tags.push(["payload",sl(i)]);const o=await n(r);return(a?Xs:"")+xi.encode(Tt.encode(JSON.stringify(o)))}async function tl(e,t,n){const a=await nl(e).catch(e=>{throw e});return await ul(a,t,n).catch(e=>{throw e})}async function nl(e){if(!e)throw new Error("Missing token");e=e.replace(Xs,"");const t=Ct.decode(xi.decode(e));if(!t||0===t.length||!t.startsWith("{"))throw new Error("Invalid token");return JSON.parse(t)}function al(e){return!!e.created_at&&Math.round((new Date).getTime()/1e3)-e.created_at<60}function il(e){return e.kind===aa}function rl(e,t){const n=e.tags.find(e=>"u"===e[0]);return!!n&&(n.length>0&&n[1]===t)}function ol(e,t){const n=e.tags.find(e=>"method"===e[0]);return!!n&&(n.length>0&&n[1].toLowerCase()===t.toLowerCase())}function sl(e){return _(j(Tt.encode(JSON.stringify(e))))}function ll(e,t){const n=e.tags.find(e=>"payload"===e[0]);if(!n)return!1;const a=sl(t);return n.length>0&&n[1]===a}async function ul(e,t,n,a){if(!Dt(e))throw new Error("Invalid nostr event, signature invalid");if(!il(e))throw new Error("Invalid nostr event, kind invalid");if(!al(e))throw new Error("Invalid nostr event, created_at timestamp invalid");if(!rl(e,t))throw new Error("Invalid nostr event, url tag invalid");if(!ol(e,n))throw new Error("Invalid nostr event, method tag invalid");if(Boolean(a)&&"object"==typeof a&&Object.keys(a).length>0&&!ll(e,a))throw new Error("Invalid nostr event, payload tag does not match request body hash");return!0}return Js=r,((i,r,o,s)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let l of n(r))a.call(i,l)||l===o||e(i,l,{get:()=>r[l],enumerable:!(s=t(r,l))||s.enumerable});return i})(e({},"__esModule",{value:!0}),Js)})();window.localisation={},window.localisation.de={confirm:"Ja",server:"Server",theme:"Theme",site_customisation:"Website-Anpassung",funding:"Funding",users:"Benutzer",audit:"Prüfung",apps:"Apps",channels:"Kanäle",transactions:"Transaktionen",dashboard:"Armaturenbrett",node:"Knoten",export_users:"Benutzer exportieren",no_users:"Keine Benutzer gefunden",total_capacity:"Gesamtkapazität",avg_channel_size:"Durchschn. Kanalgröße",biggest_channel_size:"Größte Kanalgröße",smallest_channel_size:"Kleinste Kanalgröße",number_of_channels:"Anzahl der Kanäle",active_channels:"Aktive Kanäle",connect_peer:"Peer verbinden",connect:"Verbinden",open_channel:"Offener Kanal",open:"Öffnen",close_channel:"Kanal schließen",close:"Schließen",restart:"Server neu starten",save:"Speichern",save_tooltip:"Änderungen speichern",credit_debit:"Kredit / Debit",credit_hint:"Klicke Enter, um das Konto zu belasten",credit_label:"{denomination} zu belasten",credit_ok:"Erfolgreiches Gutschreiben/Abziehen von virtuellen Geldern ({amount} Sats). Zahlungen hängen von den tatsächlichen Mitteln der Finanzierungsquelle ab.",restart_tooltip:"Starte den Server neu, um die Änderungen zu übernehmen",add_funds_tooltip:"Füge Geld zu einer Wallet hinzu.",reset_defaults:"Zurücksetzen",reset_defaults_tooltip:"Alle Einstellungen auf die Standardeinstellungen zurücksetzen.",download_backup:"Datenbank-Backup herunterladen",name_your_wallet:"Vergib deiner {name} Wallet einen Namen",paste_invoice_label:"Füge eine Rechnung, Zahlungsanforderung oder LNURL ein *",lnbits_description:"Einfach zu installieren und kompakt, LNbits kann auf jeder Funding-Quelle im Lightning Netzwerk aufsetzen und sogar LNbits selbst! Du kannst LNbits für dich selbst betreiben oder anderen die Verwaltung durch dich anbieten. Jede Wallet hat ihre eigenen API-Schlüssel und die Anzahl der Wallets ist unbegrenzt. Die Möglichkeit, Gelder auf verschiedene Accounts mit unterschiedlicher Logik aufteilen zu können macht LNbits zu einem nützlichen Werkzeug für deine Buchhaltung - aber auch als Entwicklungswerkzeug. Erweiterungen bereichern LNbits Accounts um zusätzliche Funktionalität, so dass du mit einer Reihe von neuartigen Technologien auf dem Lightning-Netzwerk experimentieren kannst. Wir haben es so einfach wie möglich gemacht, Erweiterungen zu entwickeln, und als freies und Open-Source-Projekt möchten wir Menschen ermutigen, sich selbst hieran zu versuchen und gemeinsam mit uns neue Funktionalitäten zu entwickeln.",export_to_phone:"Auf dem Telefon öffnen",export_to_phone_desc:"Dieser QR-Code beinhaltet vollständige Rechte auf deine Wallet. Du kannst den QR-Code mit Deinem Telefon scannen, um deine Wallet dort zu öffnen.",wallet:"Brieftasche:",wallets:"Wallets",add_wallet:"Wallet hinzufügen",delete_wallet:"Wallet löschen",delete_wallet_desc:"Die Wallet wird gelöscht, die hierin beinhalteten Daten hierin oder innerhalb einer Erweiterung sind UNWIEDERBRINGLICH.",rename_wallet:"Wallet umbenennen",update_name:"Namen aktualisieren",fiat_tracking:"Fiat-Tracking",currency:"Währung",update_currency:"Währung aktualisieren",press_to_claim:"Klicken, um Bitcoin einzufordern.",donate:"Spenden",view_github:"Auf GitHub anzeigen",voidwallet_active:"VoidWallet ist aktiv! Zahlungen deaktiviert",use_with_caution:"BITTE MIT VORSICHT BENUTZEN - {name} Wallet ist noch BETA",service_fee:"Dienstleistungsgebühr: {amount} % pro Transaktion",service_fee_max:"Servicegebühr: {amount} % pro Transaktion (max {max} Sats)",service_fee_tooltip:"Bearbeitungsgebühr, die vom LNbits Server-Administrator pro ausgehender Transaktion berechnet wird",toggle_darkmode:"Auf Dark Mode umschalten",payment_reactions:"Zahlungsreaktionen",view_swagger_docs:"LNbits Swagger API-Dokumentation",api_docs:"API-Dokumentation",api_keys_api_docs:"Knoten-URL, API-Schlüssel und API-Dokumentation",api_keys_warning:"Diese Schlüssel sollten sicher aufbewahrt werden; ihre Weitergabe kann zum Verlust von Guthaben führen.",admin_key_warning:"Dein Admin-Schlüssel gewährt vollen Zugriff auf deine Wallet, einschließlich der Möglichkeit, Zahlungen zu senden. Teile ihn niemals, es sei denn, du vertraust dem Empfänger vollständig.",lnbits_version:"LNbits-Version",runs_on:"Läuft auf",paste:"Einfügen",paste_from_clipboard:"Einfügen aus der Zwischenablage",paste_request:"Anfrage einfügen",create_invoice:"Rechnung erstellen",camera_tooltip:"Verwende die Kamera, um eine Rechnung oder einen QR-Code zu scannen",export_csv:"Exportieren als CSV",chart_tooltip:"Diagramm anzeigen",pending:"Ausstehend",copy_invoice:"Rechnung kopieren",withdraw_from:"Abheben von",cancel:"Stornieren",scan:"Scannen",read:"Lesen",pay:"Zahlen",memo:"Memo",date:"Datum",payment_processing:"Zahlung wird verarbeitet ...",not_enough_funds:"Geldmittel sind erschöpft!",search_by_tag_memo_amount:"Suche nach Tag, Memo, Betrag",invoice_waiting:"Rechnung wartend auf Zahlung",payment_received:"Zahlung erhalten",payment_sent:"Zahlung gesendet",receive:"erhalten",send:"schicken",outgoing_payment_pending:"Ausgehende Zahlung wartend",drain_funds:"Sats abziehen",drain_funds_desc:"LNURL-withdraw QR-Code, der das Abziehen aller Geldmittel aus dieser Wallet erlaubt. Teile ihn mit niemandem! Kompatibel mit balanceCheck und balanceNotify, so dass dein Wallet die Sats nach dem ersten Abzug kontinuierlich von hier abziehen kann.",i_understand:"Ich verstehe",copy_wallet_url:"Wallet-URL kopieren",disclaimer_dialog_title:"Wichtig!",disclaimer_dialog:"Login-Funktionalität wird in einem zukünftigen Update veröffentlicht. Bis dahin ist die Speicherung der Wallet-URL als Lesezeichen absolut notwendig, um Zugriff auf die Wallet zu erhalten! Dieser Service ist in BETA und wir übernehmen keine Verantwortung für Verluste durch verlorene Zugriffe.",no_transactions:"Keine Transaktionen",manage:"Verwalten",exchanges:"Börsenplätze",extensions:"Erweiterungen",no_extensions:"Du hast noch keine Erweiterungen installiert :(",created:"Erstellt",search_extensions:"Sucherweiterungen",extension_sources:"Erweiterungsquellen",ext_sources_hint:"Repositorys, von denen die Erweiterungen heruntergeladen werden können.",ext_sources_label:"Quell-URL (verwenden Sie nur die offizielle LNbits-Erweiterungsquelle und vertrauenswürdige Quellen)",warning:"Warnung",repository:"Repository",confirm_continue:"Bist du sicher, dass du fortfahren möchtest?",manage_extension_details:"Erweiterung installieren/deinstallieren",install:"Installieren",uninstall:"Deinstallieren",drop_db:"Daten löschen",enable:"Aktivieren",pay_to_enable:"Zahlen Sie zum Aktivieren",enable_extension_details:"Erweiterung für aktuellen Benutzer aktivieren",disable:"Deaktivieren",delete:"Löschen",installed:"Installiert",activated:"Aktiviert",deactivated:"Deaktiviert",release_notes:"Versionshinweise",activate_extension_details:"Erweiterung für Benutzer verfügbar/nicht verfügbar machen",featured:"Vorgestellt",all:"Alle",only_admins_can_install:"(Nur Administratorkonten können Erweiterungen installieren)",admin_only:"Nur für Admins",new_version:"Neue Version",extension_depends_on:"Hängt ab von:",extension_rating_soon:"Bewertungen sind bald verfügbar",extension_installed_version:"Installierte Version",extension_uninstall_warning:"Sie sind dabei, die Erweiterung für alle Benutzer zu entfernen.",uninstall_confirm:"Ja, deinstallieren",extension_db_drop_info:"Alle Daten für die Erweiterung werden dauerhaft gelöscht. Es gibt keine Möglichkeit, diesen Vorgang rückgängig zu machen!",extension_db_drop_warning:"Sie sind dabei, alle Daten für die Erweiterung zu entfernen. Bitte geben Sie den Namen der Erweiterung ein, um fortzufahren:",extension_required_lnbits_version:"Diese Version erfordert mindestens die LNbits-Version",min_version:"Mindestwert (inklusive)",max_version:"Maximalwert (ausgeschlossen)",payment_hash:"Zahlungs-Hash",fee:"Gebühr",amount:"Menge",amount_sats:"Betrag (sats)",tag:"Tag",unit:"Einheit",description:"Beschreibung",expiry:"Ablauf",webhook:"Webhook",payment_proof:"Beleg",update:"Aktualisieren",update_available:"Aktualisierung {version} verfügbar!",latest_update:"Sie sind auf der neuesten Version {version}.",notifications:"Benachrichtigungen",no_notifications:"Keine Benachrichtigungen",notifications_disabled:"LNbits Statusbenachrichtigungen sind deaktiviert.",enable_notifications:"Aktiviere Benachrichtigungen",enable_notifications_desc:"Wenn aktiviert, werden die neuesten LNbits-Statusaktualisierungen, wie Sicherheitsvorfälle und Updates, abgerufen.",enable_watchdog:"Aktiviere Watchdog",enable_watchdog_desc:"Wenn aktiviert, wird Ihre Zahlungsquelle automatisch auf VoidWallet umgestellt, wenn Ihr Guthaben niedriger als das LNbits-Guthaben ist. Nach einem Update müssen Sie dies manuell aktivieren.",watchdog_interval:"Überwachungszeitintervall",watchdog_interval_desc:"Wie oft die Hintergrundaufgabe nach einem Abschaltsignal im Wachhund-Delta [node_balance - lnbits_balance] suchen soll (in Minuten).",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Limit, bevor der Notausschalter die Finanzierungsquelle auf VoidWallet ändert [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Benachrichtigungsquelle",notification_source_label:"Quell-URL (verwenden Sie nur die offizielle LNbits-Statusquelle und Quellen, denen Sie vertrauen können)",more:"mehr",less:"weniger",releases:"Veröffentlichungen",watchdog:"Wachhund",server_logs:"Serverprotokolle",ip_blocker:"IP-Sperre",security:"Sicherheit",security_tools:"Sicherheitstools",block_access_hint:"Zugriff per IP sperren",allow_access_hint:"Zugriff durch IP erlauben (überschreibt blockierte IPs)",enter_ip:"Geben Sie die IP ein und drücken Sie die Eingabetaste",rate_limiter:"Ratenbegrenzer",wallet_limiter:"Geldbeutel-Limiter",wallet_limit_max_withdraw_per_day:"Maximales tägliches Wallet-Auszahlungslimit in Sats (0 zum Deaktivieren)",wallet_max_ballance:"Maximales Guthaben der Wallet in Sats (0 zum Deaktivieren)",wallet_limit_secs_between_trans:"Mindestsekunden zwischen Transaktionen pro Wallet (0 zum Deaktivieren)",number_of_requests:"Anzahl der Anfragen",time_unit:"Zeiteinheit",minute:"Minute",second:"Sekunde",hour:"Stunde",disable_server_log:"Server-Log deaktivieren",enable_server_log:"Serverprotokollierung aktivieren",coming_soon:"Funktion demnächst verfügbar",session_has_expired:"Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",instant_access_question:"Möchten Sie sofortigen Zugang?",login_with_user_id:"Mit Benutzer-ID anmelden",or:"oder",create_new_wallet:"Neue Geldbörse erstellen",login_to_account:"Melden Sie sich bei Ihrem Konto an",create_account:"Konto erstellen",account_settings:"Kontoeinstellungen",signin_with_nostr:"Mit Nostr fortfahren",signin_with_google:"Mit Google anmelden",signin_with_github:"Anmelden mit GitHub",signin_with_keycloak:"Mit Keycloak anmelden",username_or_email:"Benutzername oder E-Mail",password:"Passwort",password_config:"Passwortkonfiguration",password_repeat:"Passwortwiederholung",change_password:"Passwort ändern",update_credentials:"Anmeldeinformationen aktualisieren",update_pubkey:"Öffentlichen Schlüssel aktualisieren",set_password:"Passwort festlegen",invalid_password:"Das Passwort muss mindestens 8 Zeichen haben.",login:"Anmelden",register:"Registrieren",username:"Benutzername",pubkey:"Öffentlicher Schlüssel",user_id:"Benutzer-ID",email:"E-Mail",first_name:"Vorname",last_name:"Nachname",picture:"Bild",verify_email:"E-Mail verifizieren mit",account:"Konto",update_account:"Konto aktualisieren",invalid_username:"Ungültiger Benutzername",auth_provider:"Anbieter für Authentifizierung",my_account:"Mein Konto",back:"Zurück",logout:"Abmelden",look_and_feel:"Aussehen und Verhalten",toggle_gradient:"Verlauf umschalten",gradient_background:"Verlaufs-Hintergrund",language:"Sprache",color_scheme:"Farbschema",admin_settings:"Admin-Einstellungen",extension_cost:"Diese Version erfordert eine Zahlung von mindestens {cost} Sats.",extension_paid_sats:"Sie haben bereits {paid_sats} Sats bezahlt.",release_details_error:"Kann die Details zur Veröffentlichung nicht abrufen.",pay_from_wallet:"Zahlen aus dem Geldbeutel",wallet_required:"Wallet *",show_qr:"QR anzeigen",retry_install:"Installieren erneut versuchen",new_payment:"Neue Zahlung vornehmen",update_payment:"Zahlung aktualisieren",already_paid_question:"Haben Sie schon bezahlt?",sell:"Verkaufen",sell_require:"Zahlung anfordern, um die Erweiterung zu aktivieren",sell_info:"Die {name}-Erweiterung erfordert eine Zahlung von mindestens {amount} Satoshis, um aktiviert zu werden.",hide_empty_wallets:"Leere Geldbörsen verbergen",recheck:"Erneut überprüfen",contributors:"Mitwirkende",license:"Lizenz",reset_key:"Zurücksetzen-Schlüssel",reset_password:"Passwort zurücksetzen",border_choices:"Randoptionen",select_all:"Alles auswählen",nfc_supported:"NFC unterstützt",nfc_not_supported:"NFC wird nicht unterstützt",expire_date:"Ablaufdatum:",hash:"Hash:",welcome_lnbits:"Willkommen bei LNbits",setup_su_account:"Richten Sie das Superuser-Konto unten ein.",create_ticker_converter:"Währungsticker-Konverter erstellen",enable_audit:"Audit aktivieren",recommended:"Empfohlen",audit_desc:"HTTP-Anfragen entsprechend den angegebenen Filtern aufzeichnen",audit_record_req:"Anfragekörper aufzeichnen",audit_record_warning:"Warnung:",audit_record_req_warning_1:"Vertrauliche Daten (wie Passwörter) werden protokolliert.",audit_record_req_warning_2:"Der Anfragetext kann groß sein.",audit_record_use:"Verwenden Sie es mit Vorsicht.",audit_ip:"IP-Adresse aufzeichnen",audit_ip_desc:"Speichern Sie die IP-Adresse des Clients",audit_path_params:"Pfadparameter aufzeichnen",audit_query_params:"Abfrageparameter aufzeichnen",audit_http_methods:"HTTP-Methoden einschließen",audit_http_methods_hint:"Liste der HTTP-Methoden, die einbezogen werden sollen. Leere Listen bedeuten alle.",audit_http_methods_label:"HTTP-Methoden",audit_resp_codes:"HTTP-Antwortcodes einbeziehen",audit_resp_codes_hint:"Liste der einzuschließenden HTTP-Codes (regex-Match). Leere Liste bedeutet alle. Z.B.: 4.*, 5.*",audit_resp_codes_label:"HTTP-Antwortcode (Regex)",audit_paths:"Einfügepfade",audit_paths_hint:"Liste der aufzunehmenden Pfade (Regex-Übereinstimmung). Leere Liste bedeutet alle.",audit_paths_label:"HTTP-Pfad (Regex)",audit_paths_exclude:"Pfade ausschließen",audit_paths_exclude_hint:"Liste der auszuschließenden Pfade (regex-Match). Leere Liste bedeutet keine.",audit_paths_exclude_label:"HTTP-Pfad (Regex)",exchange_providers:"Austauschdienste",admin_extensions:"Admin-Erweiterungen",admin_extensions_label:"Admin-Erweiterungen",admin_extensions_hint:"Nur Benutzer mit Admin-Rechten können Erweiterungen verwenden.",user_default_extensions:"Standarderweiterungen des Benutzers",user_default_extensions_label:"Benutzererweiterungen",user_default_extensions_hint:"Erweiterungen, die standardmäßig für die Benutzer aktiviert werden.",miscellanous:"Verschiedenes",misc_disable_extensions:"Erweiterungen deaktivieren",misc_disable_extensions_label:"Alle Erweiterungen deaktivieren",misc_hide_api:"API ausblenden",misc_hide_api_label:"Verbirgt Wallet-API, Erweiterungen können es ehren",wallets_management:"Verwaltung von Geldbörsen",funding_source_info:"Finanzierungsquelleninformationen",funding_source:"Finanzierungsquelle: {wallet_class}",node_balance:"Kontostand: {balance} Sats",lnbits_balance:"LNbits-Guthaben: {balance} Sats",funding_reserve_percent:"Reservieren Prozent: {percent} %",node_management:"Knotenverwaltung",node_management_not_supported:"Knotenverwaltung wird von der aktiven Finanzierungsquelle nicht unterstützt",toggle_node_ui:"Node-Benutzeroberfläche",toggle_public_node_ui:"Öffentliche Knoten-Benutzeroberfläche",toggle_transactions_node_ui:"Transaktionen-Tab (Bei großen CLN-Knoten deaktivieren)",invoice_expiry:"Rechnungsablauf",invoice_expiry_label:"Rechnungsablauf (Sekunden)",fee_reserve:"Gebührenreserve",fee_reserve_msats:"Reservierungsgebühr in msats",fee_reserve_percent:"Reservierungsgebühr in Prozent",server_management:"Serververwaltung",base_url:"Basis-URL",base_url_label:"Statische/Basis-URL für den Server",authentication:"Authentifizierung",auth_token_expiry_label:"Token-Ablaufminuten",auth_token_expiry_hint:"Zeit in Minuten bis der Token abläuft",auth_allowed_methods_label:"Erlaubte Autorisierungsmethoden",auth_allowed_methods_hint:"Wählen Sie Autorisierungsmethoden aus",auth_nostr_label:"Nostr-Anforderungs-URL",auth_nostr_hint:"Absolute URL, die die Clients für die Anmeldung verwenden.",auth_google_ci_label:"Google-Client-ID",auth_google_ci_hint:"Stellen Sie sicher, dass die autorisierten Umleitungs-URIs https://{domain}/api/v1/auth/google/token enthalten",auth_google_cs_label:"Google-Client-Geheimnis",auth_gh_client_id_label:"GitHub-Client-ID",auth_gh_client_id_hint:"Stellen Sie sicher, dass die URL für den Autorisierungsrückruf auf https://{domain}/api/v1/auth/github/token gesetzt ist.",auth_gh_client_secret_label:"GitHub-Client-Geheimnis",auth_keycloak_label:"Keycloak Discovery-URL",auth_keycloak_ci_label:"Keycloak-Client-ID",auth_keycloak_ci_hint:"Stellen Sie sicher, dass die Autorisierungs-Callback-URL auf https://{domain}/api/v1/auth/keycloak/token eingestellt ist.",auth_keycloak_cs_label:"Keycloak-Client-Geheimnis",auth_keycloak_custom_org_label:"Keycloak Benutzerdefinierte Organisation",auth_keycloak_custom_icon_label:"Keycloak Benutzerdefiniertes Symbol (URL)",auth_oidc_label:"OIDC Discovery-URL",auth_oidc_ci_label:"OIDC-Client-ID",auth_oidc_ci_hint:"Stellen Sie sicher, dass die Autorisierungs-Callback-URL auf https://{domain}/api/v1/auth/oidc/token eingestellt ist.",auth_oidc_cs_label:"OIDC-Client-Geheimnis",auth_oidc_custom_org_label:"OIDC Benutzerdefinierter Organisationsname (z.B. Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC Benutzerdefiniertes Symbol (URL)",currency_settings:"Währungseinstellungen",allowed_currencies:"Erlaubte Währungen",allowed_currencies_hint:"Begrenzen Sie die Anzahl der verfügbaren Fiat-Währungen",default_account_currency:"Standardkontowährung",default_account_currency_hint:"Standardwährung für Buchhaltung",service_fee_label:"Servicegebühr (%)",service_fee_hint:"Gebühr pro Transaktion (%)",service_fee_max_label:"Servicegebühr max. (sats)",service_fee_max_hint:"Maximale Servicegebühr in (sats) berechnen.",fee_wallet:"Gebühren-Wallet",fee_wallet_label:"Gebühren-Wallet (Wallet-ID)",fee_wallet_hint:"Wallet-ID, an die Gelder gesendet werden sollen",disable_fee:"Gebühr deaktivieren",disable_fee_internal:"Dienstleistungsgebühr für interne Zahlungen deaktivieren",disable_fee_internal_desc:"Dienstleistungsgebühr für interne Lightning-Zahlungen deaktivieren",ui_management:"UI-Verwaltung",ui_site_title:"Seitentitel",ui_site_tagline:"Seitenslogan",ui_elements_enable:"Elemente auf der Startseite aktivieren",ui_elements_disable:"Elemente auf der Startseite deaktivieren",ui_toggle_elements_tip:"Entfernen Sie Homepage-Elemente wie 'läuft auf' usw.",ui_site_description:"Seitenbeschreibung",ui_site_description_hint:"Verwenden Sie einfachen Text, Markdown oder rohes HTML",ui_default_wallet_name:"Standard-Walletname",lnbits_wallet:"LNbits-Wallet",denomination:"Nomination",denomination_hint:"Der Name für das FakeWallet-Token",ui_qr_code_logo:"QR-Code-Logo",ui_qr_code_logo_hint:"URL zum Logo-Bild im QR-Code",ui_custom_badge:"Benutzerdefiniertes Abzeichen",ui_custom_badge_label:"Benutzerdefiniertes Abzeichen 'MIT VORSICHT VERWENDEN - LNbits-Wallet ist noch in der BETA-Phase'",ui_custom_badge_color_label:"Benutzerdefinierte Abzeichenfarbe",themes:"Themen",themes_hint:"Wählen Sie Themen, die für Benutzer verfügbar sind",custom_logo:"Benutzerdefiniertes Logo",custom_logo_hint:"URL zum Logobild",ad_space_title:"Anzeigentitel",ad_space_title_label:"Unterstützt von",ad_slots:"Werbeplätze",ad_slots_hint:"URL-Adressen und Bilddateipfade im CSV-Format, Erweiterungen können darauf achten",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Anzeigen aktiviert",ads_disabled:"Anzeigen deaktiviert",user_management:"Benutzerverwaltung",admin_users:"Admin-Benutzer",admin_users_hint:"Benutzer mit Administratorrechten",admin_users_label:"Benutzer-ID",allowed_users:"Zugelassene Benutzer",allowed_users_hint:"Nur diese Benutzer können LNbits verwenden.",allowed_users_label:"Benutzer-ID",allow_creation_user:"Erlauben Sie die Erstellung neuer Benutzer",allow_creation_user_desc:"Erlauben Sie das Erstellen neuer Benutzer auf der Indexseite",components:"Komponenten",long_running_endpoints:"Top 5 lang laufende Endpunkte",http_request_methods:"HTTP-Anfragemethoden",http_response_codes:"HTTP-Antwortcodes",request_details:"Anfragedetails",http_request_details:"HTTP-Anfragedetails",block_explorer:"Block Explorer",enable_block_explorer:"Block Explorer aktivieren",block_explorer_desc:"Ermöglicht Nutzern das Durchsuchen von Bitcoin-Transaktionen und -Adressen über Electrum.",blockexplorer_public_api:"Öffentlicher API-Zugang",blockexplorer_public_api_desc:"Nicht-authentifizierten Zugriff auf die Block-Explorer-API-Endpunkte erlauben.",electrum_server_url:"Electrum-Server-URL",electrum_server_url_hint:"z.B. ssl://electrum.blockstream.info:50002 oder tcp://localhost:50001",blockexplorer_search_label:"Nach TXID oder Adresse suchen",blockexplorer_search_hint:"64-Zeichen-Hex = Transaktion · Alles andere = Bitcoin-Adresse",recent_blocks:"Aktuelle Blöcke",chain_tip:"Kettenspitze",block_height:"Blockhöhe",block_fee:"Blockgebühr",fee_estimates:"Gebührenschätzungen",confirmed_balance:"Bestätigtes Guthaben",unconfirmed_balance:"Unbestätigtes Guthaben",transaction_history:"Transaktionsverlauf",coinbase:"Coinbase",inputs:"Eingaben",outputs:"Ausgaben",confirmations:"Bestätigungen",confirmed:"Bestätigt",unconfirmed:"Unbestätigt",history_unavailable:"Transaktionsverlauf nicht verfügbar (Adresse hat zu viele Transaktionen)",address:"Adresse",block_number:"Block #{height}",block_diff:"Schw. {value}",block_hash:"Hash",previous_block:"Vorheriger Block",merkle_root:"Merkle-Wurzel",version:"Version",bits:"Bits",difficulty:"Schwierigkeit",nonce:"Nonce",txid:"TXID",vsize:"Virtuelle Größe",weight:"Gewicht",n_block_fee:"{n}-Block-Gebühr"},window.localisation.en={confirm:"Yes",server:"Server",theme:"Theme",site_customisation:"Site Customisation",funding:"Funding",users:"Users",audit:"Audit",api_watch:"API Watch",apps:"Apps",channels:"Channels",transactions:"Transactions",dashboard:"Dashboard",node:"Node",export_users:"Export Users",no_users:"No users found",total_capacity:"Total Capacity",avg_channel_size:"Avg. Channel Size",biggest_channel_size:"Biggest Channel Size",smallest_channel_size:"Smallest Channel Size",number_of_channels:"Number of Channels",active_channels:"Active Channels",connect_peer:"Connect Peer",connect:"Connect",reconnect:"Reconnect",open_channel:"Open Channel",open:"Open",clear:"Clear",close_channel:"Close Channel",close:"Close",restart:"Restart server",image_library:"Image Library",save:"Save",save_tooltip:"Save your changes",must_save:"You have unsaved changes",credit_debit:"Credit / Debit",credit_hint:"Press Enter to credit/debit wallet (negative values allowed)",credit_label:"{denomination} to credit/debit",credit_ok:"Success crediting/debiting virtual funds ({amount} sats). Payments depend on actual funds on funding source.",restart_tooltip:"Restart the server for changes to take effect",add_funds_tooltip:"Add funds to a wallet.",reset_defaults:"Reset to defaults",reset_defaults_tooltip:"Delete all settings and reset to defaults.",download_backup:"Download database backup",name_your_wallet:"Name your {name} wallet",paste_invoice_label:"Paste an invoice, payment request, Lightning Address or LNURL*",lnbits_description:"Easy to set up and lightweight, LNbits can run on any Lightning Network funding source and even LNbits itself! You can run LNbits for yourself, or easily offer a custodian solution for others. Each wallet has its own API keys and there is no limit to the number of wallets you can make. Being able to partition funds makes LNbits a useful tool for money management and as a development tool. Extensions add extra functionality to LNbits so you can experiment with a range of cutting-edge technologies on the lightning network. We have made developing extensions as easy as possible, and as a free and open-source project, we encourage people to develop and submit their own.",export_to_phone:"Export to Phone with QR Code",export_to_phone_desc:"This QR code contains your wallet URL with full access. You can scan it from your phone to open your wallet from there.",access_wallet_on_mobile:"Mobile Access",stored_paylinks:"Stored LNURL pay links",wallet:"Wallet: ",wallet_name:"Wallet name",wallet_type:"Wallet type",shared_wallet:"Shared Wallet",share_wallet:"Share Wallet",update_permissions:"Update Permissions",shared_wallet_id:"Shared Wallet ID",shared_wallet_desc:"You have been invited to have access to someone else's wallet.",wallets:"Wallets",exclude_wallets:"Exclude Wallets",add_wallet:"Add wallet",add_field:"Add field",reject_wallet:"Reject wallet",add_new_wallet:"Add a new wallet",pin_wallet:"Pin wallet",delete_wallet:"Delete wallet",delete_wallet_desc:"This whole wallet will be deleted, the funds will be UNRECOVERABLE.",rename_wallet:"Rename wallet",update_name:"Update name",fiat_tracking:"Fiat tracking",fiat_providers:"Fiat providers",fiat_warning_bitcoin:'Fiat providers can get twitchy about anything bitcoin, so avoid using word "bitcoin" in your memos!',currency:"Currency",update_currency:"Update currency",press_to_claim:"Press to claim bitcoin",claim_desc:"It seems you have a claimable amount of bitcoin but you don’t have a wallet yet. Press the button below to claim it. This will create a new wallet for you.",donate:"Donate",view_github:"View on GitHub",voidwallet_active:"VoidWallet is active! Payments disabled",voidwallet_active_user:"Funding source unavailable. Please contact your admin to configure.",voidwallet_active_admin:"Funding source unavailable. Click here to configure.",service_fee_badge:"Service fee: {amount} % per transaction",service_fee_max_badge:"Service fee: {amount} % per transaction (max {max} {denom})",service_fee_tooltip:"Service fee charged by the LNbits server admin per outgoing transaction",toggle_darkmode:"Toggle Dark Mode",payment_reactions:"Payment Reactions",view_swagger_docs:"View LNbits Swagger API docs",api_docs:"API docs",api_keys_api_docs:"Node URL, API keys and API docs",api_keys_warning:"These keys should be kept safe, sharing them could risk losing funds.",admin_key_warning:"Your admin key grants full access to your wallet, including the ability to send payments. Never share it unless you fully trust the recipient.",lnbits_version:"LNbits version",runs_on:"Runs on",paste:"Paste",paste_from_clipboard:"Paste from clipboard",paste_request:"Paste Request",create_invoice:"Create Invoice",camera_tooltip:"Use camera to scan an invoice/QR",export_csv:"Export to CSV",export_csv_details:"Export to CSV with details",chart_tooltip:"Show chart",pending:"Pending",copy_invoice:"Copy invoice",withdraw_from:"Withdraw from",cancel:"Cancel",scan:"Scan",read:"Read",write:"Write",pay:"Pay",sending:"Sending",memo:"Memo",date:"Date",path:"Path",internal_memo:"Internal memo (optional)",internal_memo_hint_receive:"This memo is not shown to the payer but it's stored in the invoice for your reference.",internal_memo_hint_pay:"This memo is not shown to the payee but it's stored in the payment for your reference.",payment_processing:"Processing payment...",payment_processing:"Processing payment...",payment_successful:"Payment successful!",payment_pending:"Payment pending...",payment_check:"Check payment",not_enough_funds:"Not enough funds!",search_by_tag_memo_amount:"Search by tag, memo, amount",search:"Search",invoice_waiting:"Invoice waiting to be paid",payment_received:"Payment Received",payment_sent:"Payment Sent",payment_failed:"Payment Failed",receive:"receive",send:"send",outgoing_payment_pending:"Outgoing payment pending",drain_funds:"Drain Funds",drain_funds_desc:"This is an LNURL-withdraw QR code for slurping everything from this wallet. Do not share with anyone. It is compatible with balanceCheck and balanceNotify so your wallet may keep pulling the funds continuously from here after the first withdraw.",i_understand:"I understand",copy_wallet_url:"Copy wallet URL",disclaimer_dialog_title:"Important!",disclaimer_dialog:"You *must* save your login credentials to be able to access your wallet again. If you lose them, you will lose access to your wallet and funds.\n\nFind your login credentials on your account settings page.\n\nLNbits holds no responsibility for loss of access to funds.",no_transactions:"No transactions made yet",manage:"Manage",exchanges:"Exchanges",extensions:"Extensions",no_extensions:"You don't have any extensions installed :(",created:"Created",created_at:"Created At",updated_at:"Updated At",search_extensions:"Search extensions",search_wallets:"Search wallets",extension_sources:"Extension Sources",ext_sources_hint:"Repositories from where the extensions can be downloaded",ext_sources_label:"Source URL (only use the official LNbits extension source, and sources you can trust)",wasm_sources_hint:"Repositories from where WASM extensions can be downloaded",wasm_sources_label:"WASM source URL (only use WASM extension sources you can trust)",warning:"Warning",repository:"Repository",confirm_continue:"Are you sure you want to continue?",manage_extension_details:"Install/uninstall extension",upload:"Upload",install:"Install",uninstall:"Uninstall",drop_db:"Remove Data",enable:"Enable",enabled:"Enabled",disabled:"Disabled",pay_to_enable:"Pay To Enable",enable_extension_details:"Enable extension for current user",disable:"Disable",delete:"Delete",installed:"Installed",activated:"Activated",deactivated:"Deactivated",activate:"Activate",deactivate:"Deactivate",release_notes:"Release Notes",activate_extension_details:"Make extension available/unavailable for users",featured:"Featured",categories:"Categories",all:"All",only_admins_can_install:"(Only admin accounts can install extensions)",only_admins_can_create_extensions:"Only admin accounts can create extensions",admin_only:"Admin Only",make_user_admin:"Make User Admin",revoke_admin:"Revoke Admin",new_version:"New Version",reviews_url:"Reviews URL",reviews_url_label:"Reviews server URL",reviews_url_hint:"Full PaidReviews URL including the settings id (e.g. https://example.com/paidreviews/SETTINGS_ID)",reviews_open:"View reviews",reviews_leave:"Leave a review",reviews_name:"Your name",reviews_comment:"Your review",reviews_rating:"Rating",reviews_submit:"Submit review",reviews_loading:"Loading reviews...",reviews_refresh:"Refresh reviews",reviews_error_load:"Could not load reviews",reviews_url_not_configured:"Reviews URL not configured",reviews_pay_invoice:"Pay invoice",reviews_invoice_paid:"Invoice paid",reviews_invoice_title:"Pay this invoice to submit your review",reviews_count:"Reviews",no_reviews:"No reviews yet",extension_has_free_release:"Has free releases",extension_has_paid_release:"Has paid releases",extension_depends_on:"Depends on:",extension_rating_soon:"Ratings coming soon",extension_installed_version:"Installed version",extension_uninstall_warning:"You are about to remove the extension for all users.",uninstall_confirm:"Yes, Uninstall",extension_db_drop_info:"All data for the extension will be permanently deleted. There is no way to undo this operation!",extension_db_drop_warning:"You are about to remove all data for the extension. Please type the extension name to continue:",extension_required_lnbits_version:"This release requires LNbits version",min_version:"Minimum (included)",max_version:"Maximum (excluded)",preimage:"Preimage",preimage_hint:"Preimage to settle the hold invoice",hold_invoice:"Hold Invoice",hold_invoice_description:"This invoice is on hold and requires a preimage to settle.",payment_hash:"Payment Hash",invoice_cancelled:"Invoice Cancelled",invoice_settled:"Invoice Settled",hold_invoice_payment_hash:"Payment hash for hold invoice (optional)",settle_invoice:"Settle Invoice",cancel_invoice:"Cancel Invoice",fee:"Fee",amount:"Amount",amount_limits:"Amount Limits",amount_sats:"Amount (sats)",faucest_wallet:"Faucet Wallet",faucest_wallet_desc_1:"Each time a payment is confirmed by the {provider} provider funds will be subtracted from this wallet.",faucest_wallet_desc_2:"This helps monitor all {provider} payments and their status.",faucest_wallet_desc_3:"This wallet must be topped up with the amount of sats that the admin is willing to offer in exchange for the fiat currency.",faucest_wallet_desc_4:"If this wallet is configured, but is empty, the {provider} payments will not be processed.",faucest_wallet_desc_5:"This wallet can eventually get to a negative balance if parallel fiat payments are made.",faucest_wallet_id:"Faucet Wallet ID (optional)",faucest_wallet_id_hint:"Wallet ID to use for the faucet. It will be used to send the funds to the user.",tag:"Tag",unit:"Unit",description:"Description",expiry:"Expiry",webhook:"Webhook",webhook_url:"Webhook URL",webhook_url_hint:"Webhook URL to send the payment details to. It will be called when the payment is completed.",copy_webhook_url:"Copy webhook URL",webhook_events_list:"The following events must be supported by the webhook:",webhook_stripe_description:"One the stripe side you must configure a webhook with a URL that points to your LNbits server.",webhook_square_description:"On the Square side configure a webhook pointing to this exact LNbits URL.",square_webhook_url_hint:"Must exactly match the Square notification URL. LNbits requires the /api/v1/callback/square path.",access_token:"Access Token",location_id:"Location ID",square_location_id_hint:"Square location ID to create payment links for. Use the endpoint to select sandbox or production.",api_version:"API Version",payment_proof:"Payment Proof",update:"Update",update_available:"Update {version} available!",funding_sources:"Funding Sources",funding_source:"Funding Source",requires_server_restart:"Changing these settings requires a server restart to take effect.",funding_source_info:"Select the active funding wallet",phoenixd_warning:"Phoenixd mnemonic is only available if phoenixd data-dir is specified and is readable by LNbits. It's not indicative of phoenixd not running. It just means LNbits cannot access the mnemonic to display it here.",latest_update:"You are on the latest version {version}.",notifications:"Notifications",notifications_configure:"Configure Notifications",notifications_nostr_config:"Nostr Configuration",notifications_enable_nostr:"Enable Nostr",notifications_enable_nostr_desc:"Send notifications over Nostr",notifications_nostr_private_key:"Nostr Private Key",notifications_nostr_private_key_desc:"Private key (hex or nsec) to sign the messages sent to Nostr",notifications_nostr_identifier:"Nostr Identifier",notifications_nostr_identifier_desc:"Nip5 identifier to send notifications to",notifications_nostr_identifiers:"Nostr Identifiers",notifications_nostr_identifiers_desc:"List of identifiers to send notifications to.",notifications_telegram_config:"Telegram Configuration",notifications_enable_telegram:"Enable Telegram",notifications_enable_telegram_desc:"Send notifications over Telegram",notifications_telegram_access_token:"Access Token",notifications_telegram_access_token_desc:"Access token for the bot",notifications_chat_id:"Telegram Chat ID",notifications_chat_id_desc:"Telegram Chat ID to send the notifications to",notifications_excluded_wallets_desc:"Do not send notifications for these wallets",notifications_email_config:"Email Configuration",notifications_enable_email:"Enable Email",notifications_enable_email_desc:"Send notifications over email",notifications_send_test_email:"Send test email",notifications_send_email:"Send email",notifications_send_email_desc:"Email you will send from",notifications_send_email_username:"Username",notifications_send_email_username_desc:"Username, will use the email if not set",notifications_send_email_password:"Send email password",notifications_send_email_password_desc:"Password for the email you will send from",notifications_send_email_server_port:"Send email SMTP port",notifications_send_email_server_port_desc:"Port for the SMTP server",notifications_send_email_server:"Send email SMTP server",notifications_send_email_server_desc:"SMTP server for the email you will send from",notifications_send_to_emails:"Emails to send to",notifications_send_to_emails_desc:"Emails notifications will be sent to",notification_settings_update:"Settings updated",notification_settings_update_desc:"Send a notification when server settings have been updated",notification_server_start_stop:"Server Start/Stop",notification_server_start_stop_desc:"Send a notification when the server has been started/stopped",notification_watchdog_limit:"Watchdog Limit Notification",notification_watchdog_limit_desc:"Send a notification when the watchdog limit has been reached (does not affect the funding source)",notification_server_status:"Server Status",notification_server_status_desc:"Send regular notifications about the server status (interval value in hours)",notification_incoming_payment:"Incoming Payments",notification_incoming_payment_desc:"Send a notification when a wallet has received a payment above the specified amount (sats)",notification_outgoing_payment:"Outgoing Payments",notification_outgoing_payment_desc:"Send a notification when a wallet has sent a payment above the specified amount (sats)",notification_credit_debit:"Credit / Debit",notification_credit_debit_desc:"Send a notification when a wallet has been credited/debited by the superuser",notification_balance_delta_changed:"Balance Delta Changed",notification_balance_delta_changed_desc:"Send a notification when the difference between the node balance and the LNbits balance has changed by more than the specified amount (in sats). Set to 0 to disable. This runs every minute.",watchdog_introduction:"Watchdog is a feature that allows you to automatically switch the LNbits funding source to VoidWallet if your node balance is lower than the LNbits balance by a certain threshold. This can help prevent overspending and keep your node's funds safe.",enable_watchdog:"Enable Watchdog",enable_watchdog_desc:"You will need to re-enable this manually after an update.",watchdog_interval:"Watchdog Check Interval",watchdog_interval_desc:"How often LNbits should check for a killswitch signal in the watchdog threshold delta value [node_balance - lnbits_balance] (in minutes).",watchdog_delta:"Watchdog Threshold Delta",watchdog_delta_desc:"The LNbit's > Node balance delta threshold. If this threshold is exceeded, the funding source is changed to VoidWallet.",status:"Status",notification_source:"Notification Source",notification_source_label:"Source URL (only use the official LNbits status source, and sources you can trust)",more:"more",more_count:"{count} more",less:"less",releases:"Releases",watchdog:"Watchdog",server_logs:"Server Logs",ip_blocker:"IP Blacklist/Whitelist",security:"Security",security_tools:"Security Tools",block_access_hint:"Block access by IP",allow_access_hint:"Allow access by IP (will override blocked IPs)",enter_ip:"Enter an IP address and press enter",rate_limiter:"Rate Limiter",callback_url_rules:"Callback URL Rules",enter_callback_url_rule:"Enter URL rule as regex and hit enter",callback_url_rule_hint:"Callback URLs (like LNURL one) will be validated against these rules. At leat one rule must match. No rule means all URLs are allowed.",wallet_limiter:"Wallet Limiter",wallet_config:"Wallet Config",wallet_charts:"Wallet Charts",wallet_limit_max_withdraw_per_day:"Max daily wallet withdrawal in sats (0 for no limit, -1 to block withdrawal)",wallet_max_ballance:"Wallet max balance in sats (0 to disable)",wallet_limit_secs_between_trans:"Min secs between transactions per wallet (0 to disable)",only_incoming_payments_allowed:"Allow incoming payments only",disable_outgoing_payments:"Disable outgoing payments",number_of_requests:"Number of requests to allow",number_of_requests_hint:'Number of requests to allow per "time unit" for the rate limiter. Set to 0 to disable.',time_unit:"Time unit",minute:"Minute",settings:"Settings",second:"Second",hour:"Hour",disable_server_log:"Disable Server Log",enable_server_log:"Enable Server Log",coming_soon:"Feature coming soon",session_has_expired:"Your session has expired. Please login again.",instant_access_question:"or instant access",login_with_user_id:"Login with user ID",or:"or",create_new_wallet:"Create New Wallet",delete_all_wallets:"Delete All Wallets",confirm_delete_all_wallets:"Are you sure you want to delete ALL wallets for this user?",login_to_account:"Login to your account",create_account:"Create account",account_settings:"Account Settings",signin_with_oauth:"Login with",signin_with_oauth_or:"or Login with",signin_with_nostr:"Continue with Nostr",signin_with_google:"Sign in with Google",signin_with_github:"Sign in with GitHub",signin_with_custom_org:"Sign in with {custom_org}",username_or_email:"Username or Email",password:"Password",password_config:"Password Config",password_repeat:"Password repeat",update_password:"Update Password",change_password:"Change Password",update_credentials:"Update Credentials",update_pubkey:"Update Public Key",nostr_pubkey_tooltip:"Enter this user's Nostr public key (hex value)",set_password:"Set Password",set_password_tooltip:"Set a password for this user",invalid_password:"Password must have at least 8 characters",invalid_password_repeat:"Passwords do not match",reset_key_generated:"A reset key has been generated.",reset_key_copy:"Click OK to copy the reset URL to your clipboard.",login:"Login",register:"Register",username:"Username",pubkey:"Public Key",user_id:"User ID",id:"ID",email:"Email",first_name:"First Name",last_name:"Last Name",picture:"Picture",user_picture_desc:"URL to an image to use as profile picture. You can upload it as an asset.",verify_email:"Verify email with",account:"Account",update_account:"Update Account",invalid_username:"Invalid Username",auth_provider:"Auth Provider",external_id:"External ID",my_account:"My Account",existing_account_question:"Already have an account?",background_image:"Background Image",back:"Back",logout:"Logout",look_and_feel:"Look and Feel",endpoint:"Endpoint",api:"API",api_stripe:"API",api_token:"API Token",api_tokens:"API Tokens",access_control_list:"Access Control List",access_control_list_admin_warning:"This is an admin account. The generated tokens will have admin privileges.",new_api_acl:"New Access Control List",acl_token_active:"Active",acl_token_expired:"Expired",api_token_id:"Token Id",toggle_gradient:"Toggle Gradient",gradient_background:"Gradient Background",rounded_ui:"Rounded Cards & Buttons",toggle_rounded_ui:"Toggle rounded corners for cards and buttons",card_gradient:"Card Gradient",toggle_card_gradient:"Toggle gradient on cards",card_shadow:"Card Shadow",toggle_card_shadow:"Toggle shadow on cards",burger_menu_background:"Burger Menu Background",toggle_burger_menu_background:"Toggle burger menu background",language:"Language",assets:"Assets",max_asset_size_mb:"Max Asset Size (MB)",max_asset_size_mb_desc:"The maximum allowed size for asset uploads in megabytes (can use decimal values).",assets_allowed_mime_types:"Allowed MIME Types",assets_allowed_mime_types_desc:"The MIME types that are allowed for asset uploads. No value means all uploads are allowed.",thumbnail_width:"Thumbnail Width",thumbnail_width_desc:"Width of the generated thumbnail in pixels.",thumbnail_height:"Thumbnail Height",thumbnail_height_desc:"Height of the generated thumbnail in pixels.",thumbnail_format:"Thumbnail Format",thumbnail_format_desc:"Image format of the generated thumbnail (PNG, JPEG, etc.).",max_assets_per_user:"Max Assets Per User",max_assets_per_user_desc:"The maximum number of assets a user can upload. Zero means upload forbidden.",assets_no_limit_users:"Users Without Asset Limits",assets_no_limit_users_desc:"These users can upload an unlimited number of assets (user id based).",color_scheme:"Color Scheme",visible_wallet_count:"Visible Wallet Count",admin_settings:"Admin Settings",extension_cost:"This release requires a payment of minimum {cost} sats.",extension_paid_sats:"You have already paid {paid_sats} sats.",extension_permissions_title:"Grant extension permissions",extension_permissions_tab:"Extension Permissions",user_permissions_tab:"My Grants",extension_permissions_none:"This extension has no install-time permissions.",user_permissions_none:"You have not granted any permissions for this extension.",user_permissions_max_amount:"Max payment amount",user_permissions_destination_policy:"Allowed destinations",user_permissions_no_editable_settings:"This grant has no editable settings.",extension_permissions_grant_install:"Grant and install",extension_permissions_high_risk_warning:"This extension requests permissions that can move funds.",extension_permission_risk_low:"Low risk",extension_permission_risk_medium:"Medium risk",extension_permission_risk_high:"High risk",extension_permission_warning_wallet_pay_invoice:"Can spend funds from wallets available to your account.",extension_permission_warning_wallet_pay_invoice_background:"Can spend funds later from approved wallets without an active click.",extension_permission_warning_wallet_payments_watch:"Can read payment metadata for approved wallets.",extension_permission_warning_extension_api_request_write:"Can write data or trigger actions in approved extensions.",extension_permission_ext_storage_read:"Read extension storage",extension_permission_ext_storage_append_public:"Append public extension storage",extension_permission_ext_storage_append_public_sources:"Allowed append targets",extension_permission_ext_storage_append_public_max_rows_per_source:"Max rows per source",extension_permission_ext_storage_read_public:"Read public extension storage",extension_permission_ext_storage_read_public_source_required:"required to read",extension_permission_ext_storage_write:"Write extension storage",extension_permission_ext_storage_read_write:"Read & Write extension storage",extension_permission_extension_api_request:"Use other extensions",extension_permission_extension_api_request_extensions:"Allowed extensions",extension_permission_access_read:"Read",extension_permission_access_write:"Write",extension_permission_http_request:"Connect to external websites",extension_permission_http_request_hosts:"Allowed hosts",extension_permission_utils_basic:"Use basic LNbits utilities",extension_permission_ui_camera_scan_qr:"Scan QR codes",extension_permission_websocket:"Use extension websockets",extension_permission_websocket_publish_limits:"Publish limits",extension_permission_websocket_publish_max_messages_per_second:"Max messages per second",extension_permission_websocket_publish:"Publish websocket messages",extension_permission_websocket_subscribe:"Subscribe to websocket messages",extension_permission_wallet_payments_watch:"Watch wallet payments",extension_permission_wallet_create_invoice:"Create invoices",extension_permission_wallet_create_invoice_public:"Create Lightning invoices from public pages",extension_permission_wallet_balance_read:"View wallet balances",extension_permission_wallet_list:"List wallets",extension_permission_wallet_pay_invoice:"Pay invoices",extension_permission_wallet_pay_invoice_background:"Make background payments",create_extension:"Create Extension",release_details_error:"Cannot get the release details.",pay_from_wallet:"Pay from Wallet",pay_with:"Pay with {provider}",select_payment_provider:"Select payment provider",wallet_required:"Wallet *",show_qr:"Show QR",retry_install:"Retry Install",new_payment:"Make New Payment",update_payment:"Update Payment",already_paid_question:"Have you already paid?",sell:"Sell",sell_require:"Ask payment to enable extension",sell_info:"The {name} extension requires a payment of minimum {amount} sats to enable.",hide_empty_wallets:"Hide empty wallets",recheck:"Recheck",check:"Check",check_connection:"Check Connection",check_webhook:"Check Webhook",contributors:"Contributors",license:"License",reset_key:"Reset Key",reset_password:"Reset Password",border_choices:"Border Choices",select_all:"Select All",nfc_supported:"NFC Supported",nfc_not_supported:"NFC not Supported",expire_date:"Expire Date: ",hash:"Hash: ",welcome_lnbits:"Welcome to LNbits",setup_su_account:"Set up the Superuser account below.",first_install_token:"First Install Token",create_ticker_converter:"Create Currency Ticker Converter",enable_audit:"Enable Audit",recommended:"Recommended",audit_desc:"Log HTTP requests according to the filters specified below.",audit_record_req:"Log Request Body",audit_record_warning:"Warning!",audit_record_req_warning_1:"Sensitive data (like passwords) will be logged.",audit_record_req_warning_2:"The request body can be large. This can fill up your logs quickly.",audit_record_use:"Use this with caution!",audit_ip:"Log IP Address",audit_ip_desc:"Log the IP address of users making requests to LNbits.",audit_path_params:"Log Path Parameters",audit_query_params:"Log Query Parameters",audit_http_methods:"Include HTTP Methods",audit_http_methods_hint:"List of HTTP methods to be logged. No value means all methods will be logged.",audit_http_methods_label:"HTTP Methods to Log",audit_resp_codes_hint:"List of HTTP codes to be included (regex match). Empty lists means all. Eg: 4.*, 5.*",audit_resp_codes_label:"HTTP Response Codes to Log (regex)",audit_paths_hint:"List of paths to be included (regex match). Empty list means all.",audit_paths_label:"HTTP Paths to Log (regex)",audit_paths_exclude_hint:"List of paths to be excluded (regex match). Empty list means none.",audit_paths_exclude_label:"HTTP Paths to Exclude from Logging (regex)",exchange_providers:"Exchange Providers",admin_extensions:"Admin Extensions",admin_extensions_label:"Admin extensions",admin_extensions_hint:"Extensions only user with admin privileges can use",user_default_extensions:"User Default Extensions",user_default_extensions_label:"User extensions",user_default_extensions_hint:"Extensions that will be enabled by default for the users.",extension_builder:"Extension Builder",extension_builder_manifest_url:"Extension Builder Manifest URL",extension_builder_manifest_url_hint:"URL to a JSON manifest file with extension builder details",miscellanous:"Miscellanous",misc_disable_extensions:"Disable Extensions",misc_disable_extensions_label:"Disable all extensions",misc_disable_extensions_builder:"Enable Extensions Builder",misc_disable_extensions_builder_label:"Enable Extensions Builder for non admin users.",misc_hide_api:"Hide API",misc_hide_api_label:"Hides wallet API, extensions can choose to honor",wallets_management:"Wallets Management",funding_source_info:"Funding Source Information",funding_source:"Funding source: {wallet_class}",node_balance:"Node balance: {balance} sats",lnbits_balance:"LNbits balance: {balance} sats",funding_reserve_percent:"Funding reserve percentage: {percent} %",node_management:"Node Management",node_management_not_supported:"Node management is not supported by the active funding source",toggle_node_ui:"Node UI",toggle_public_node_ui:"Public Node UI",toggle_transactions_node_ui:"Transactions Tab (Disable on large CLN nodes)",invoice_expiry:"Invoice Expiry",routing_fee_reserve_calculations:"Routing Fee Reserve Calculations",routing_fee_reserve_calculations_desc:"LNbits sets aside a “reserve amount” for each payment to cover routing fees. The maximum routing fee passed to the funding source is whichever is higher: the minimum routing fee reserve or the routing fee reserve percentage.",millisats:"millisats",fee_reserve:"Minimum Routing Fee Reserve",fee_reserve_percent:"Routing Fee Reserve Percentage",fee_reserve_min_hint:"The minimum fee reserved per payment.
This acts as a floor - the maximum allowed routing fee will never be lower than this value regardless of payment size.",fee_reserve_percent_hint:"The percentage of the payment amount to reserve for routing fees.",payment_timeouts:"Payment Timeouts",payment_wait_time:"Payment Wait Time",seconds:"seconds",payment_pending_interval:"Check payment interval (sec)",payment_pending_interval_desc:"Interval to check pending payments",payment_pending_interval_tooltip:"Controls how often LNbits checks for pending payments to update their status. Higher values can reduce the load on the node and speed up the payment process, but it will take longer for pending payments to be updated.",payment_wait_time_desc:"Wait time before marking an outgoing payment as pending. Default: 5s; raise for slow-settling invoices.",payment_wait_time_tooltip:"Controls how long LNbits waits for an outgoing payment attempt to confirm before marking it as pending. Higher values help when paying slow-settling invoices (e.g., HODL invoices, Boltz). The payment will be rechecked later and updated automatically or manually.",server_management:"Server Management",base_url_label:"Base URL of the server",authentication:"Authentication",auth_token_expiry_label:"Token expiry (minutes)",auth_token_expiry_hint:"Time in minutes until the token expires",auth_authentication_cache_label:"Cache time (minutes)",auth_authentication_cache_hint:"Time in minutes to cache successful authentication (0 to disable)",auth_allowed_methods_label:"Allowed authorization methods",auth_allowed_methods_hint:"Select allowed authorization methods",auth_nostr_label:"Nostr Request URL",auth_nostr_hint:"Absolute URL that the clients will use to login.",auth_google_ci_label:"Google Client ID",auth_google_ci_hint:"Make sure that the authorized redirect URIs contain https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"GitHub Client ID",auth_gh_client_id_hint:"Make sure that the authorization callback URL is set to https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Client Secret",auth_keycloak_label:"Keycloak Discovery URL",auth_keycloak_ci_label:"Keycloak Client ID",auth_keycloak_ci_hint:"Make sure thant the authorization callback URL is set to https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak Client Secret",auth_keycloak_custom_org_label:"Keycloak Custom Organization",auth_keycloak_custom_icon_label:"Keycloak Custom Icon (URL)",auth_oidc_label:"OIDC Discovery URL",auth_oidc_ci_label:"OIDC Client ID",auth_oidc_ci_hint:"Make sure that the authorization callback URL is set to https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC Client Secret",auth_oidc_custom_org_label:"OIDC Custom Organization Name (e.g., Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC Custom Icon (URL)",currency_settings:"Currency Settings",allowed_currencies:"Allowed Currencies",allowed_currencies_hint:"Set the allowed fiat currencies for the exchange features",default_account_currency:"Default Accounting Currency",default_account_currency_hint:"The default currency to use for accounting features.",min_incoming_payment_amount:"Min Incoming Payment Amount",min_incoming_payment_amount_desc:"Minimum amount allowed for generating an invoice",max_incoming_payment_amount:"Maximum Incoming Payment Amount",max_incoming_payment_amount_desc:"Maximum amount allowed when generating an invoice",max_outgoing_payment_amount:"Maximum Outgoing Payment Amount",max_outgoing_payment_amount_desc:"Maximum amount allowed when making a payment",service_fees:"Service Fees",service_fee:"Service Fee",service_fee_label:"Service Fee Charged Per Transaction",service_fee_hint:"Fee charged per transaction (%)",service_fee_max:"Maximum Service Fee (sats)",service_fee_max_label:"Maximum Service Fee Limit",service_fee_max_hint:"Maximum service fee to charge in (sats)",fee_wallet_label:"Service Fee Wallet ID",fee_wallet_hint:"The ID of the wallet to which to send service funds",disable_fee:"Disable Service Fees for Internal Payments",ui_management:"UI Management",ui_site_title:"Site Title",ui_changing_remove_lnbits_elements:" (changing will remove LNbits elements on the homepage and footer)",ui_site_tagline:"Site Tagline",ui_elements_enable:"Enable elements on homepage/footer",ui_elements_disable:"Disable elements on homepage/footer",ui_toggle_elements_tip:"Remove homepage elements like 'runs on' etc",ui_site_description:"Site Description",ui_site_description_hint:"Use plain text, Markdown, or raw HTML",ui_default_wallet_name:"Default Wallet Name",ui_default_theme:"Default Theme",wallet_featured_button_title:"Wallet - Featured Button",wallet_featured_button_label:"Wallet Featured Button Label",wallet_featured_button_label_hint:"Show featured button on the wallet homepage",wallet_featured_button_url:"Featured Button URL",wallet_featured_button_url_hint:"On click the button will open this URL. Leave empty to hide the button.",wallet_featured_button_icon:"Featured Button Icon",wallet_featured_button_icon_hint:'Icon shown on the featured button (Quasar icon name e.g. "bolt")',lnbits_wallet:"LNbits wallet",denomination:"Denomination",denomination_hint:"The name for the FakeWallet token",denomination_error:"Denomination must be 3 characters, or `sats`",ui_qr_code_logo:"QR Code/Favicon Logo",ui_qr_code_logo_hint:"QR code icon and favicon logo URL",ui_apple_touch_icon:"Apple Touch Icon",ui_apple_touch_icon_hint:"Apple touch icon URL",ui_custom_image:"Custom Image",ui_custom_image_label:"URL to custom image",ui_custom_image_hint:"This image is shown on the LNbits homepage and login screen.",ui_custom_badge_title:"Custom Badge Settings",ui_custom_badge_desc:"Show a custom badge in the header of LNbits",ui_custom_badge:"Custom Badge Text",ui_custom_badge_label:"Custom Badge 'USE WITH CAUTION'",ui_custom_badge_color_label:"Custom Badge Color",themes:"Themes",themes_hint:"Choose themes available for users",custom_logo:"Custom Logo",custom_logo_hint:"URL to logo image",ad_space_section_title:"Advertisement Space",ad_space_section_desc:"Configure the advertisement space on the wallet sidebar.",ad_space_title:"Advertisement Space Title",ad_space_title_hint:"Title shown above the advertisement space",ad_slots:"Advertisement Slots",ad_slots_hint:"Advertisement image filepaths in CSV format, extensions can choose to honor. Format: url;img_light_url;img_dark_url, url..",ads_enabled:"Enable Advertisement",ads_disabled:"Disabled Advertisement",user_management:"User Management",admin_users:"Admin Users",admin_users_hint:"Users with admin privileges",admin_users_label:"User ID",allowed_users:"Allowed Users",allowed_users_hint:"Only these users can use LNbits",allowed_users_hint_feature:"Only these users can use {feature}",allowed_users_label:"User ID",allow_creation_user:"Allow creation of new users",allow_creation_user_desc:"Allow creation of new users on the index page",require_user_activation:"Require user activation",require_user_activation_desc:"New users will be activated only after they pass one of the confirmation methods. Admins can activate users manually from the admin panel.",reusable_activation_code:"Reusable activation code",reusable_activation_code_label:"Reusable activation code",reusable_activation_code_hint:"This activation code can be used multiple times by different users.",one_time_activation_code:"One-time activation codes",one_time_activation_code_label:"Add activation code",one_time_activation_code_hint:"List of one-time activation codes. Each code can be used only once, then will be reomved from the list.",invitation_code:"Invitation Code",invitation_code_hint:"The invitation code that you have received.",email:"Email",email_confirmation_hint:"Email address to send the confirmation code to.",nostr_identifier:"Nostr Identifier",nostr_identifier_hint:"Nostr nip5 identifier or to send the confirmation code to.",new_user_not_allowed:"Registration is disabled.",start_user_impersonation:"Impersonate this user",stop_user_impersonation:"Stop User Impersonation",components:"Components",long_running_endpoints:"Top 5 Long Running Endpoints",http_request_methods:"HTTP Request Methods",http_response_codes:"HTTP Response Codes",request_details:"Request Details",http_request_details:"HTTP Request Details",payment_details:"Payment Details",payment_details_desc:"Detailed information about the payment",payments:"Payments",payment_show_internal:"Show Internal Payments",payment_chart_flow:"Monthly Payment Flow",payment_chart_status:"Payment Status",payment_chart_tx_per_wallet:"Transactions per Wallet (balance/count)",payment_details_back:"Back to Payments",payment_chart_tags:"Payments by Tags",payments_balance_in_out:"Balance In/Out",payments_count_in_out:"Count In/Out",payments_status_chart:"Status Chart",payments_tag_chart:"Tag Chart",payments_balance_chart:"Balance Chart",payments_wallets_chart:"Wallets Chart",payments_balance_in_out_chart:"Balance In/Out Chart",payments_count_in_out_chart:"Count In/Out Chart",reset_wallet_keys:"Reset Keys",reset_wallet_keys_desc:"Reset the API keys for this wallet. This will invalidate the current keys and generate new ones.",view_list:"View wallets as list",view_column:"View wallets as rows",filter_payments:"Filter payments",filter_labels:"Filter labels",filter_date:"Filter by date",websocket_example:"Websocket example",client_id:"Client ID",secret_key:"Secret Key",signing_secret:"Signing Secret",signing_secret_hint:"Signing secret for the webhook. Messages will be signed with this secret.",webhook_id:"Webhook ID",webhook_id_hint:"PayPal webhook ID used to verify incoming events.",webhook_paypal_description:"On the PayPal side configure a webhook pointing to your LNbits server.",square_webhook_signature_key_hint:"Square webhook signature key used to verify incoming events.",callback_success_url:"Callback Success URL",callback_success_url_hint:"The user will be redirected to this URL after the payment is successful",connected:"Connected",not_connected:"Not Connected",free:"Free",paid:"Paid",funding_source_retries:"Max Retries",funding_source_retries_desc:"Maximum number of retries for funding sources, before it falls back to VoidWallet.",add_label:"Add Label",label:"Label",labels:"Labels",label_filter:"Label Filter",no_labels_defined:"No labels defined yet",manage_labels:"Manage Labels",update_label:"Update Label",delete_label:"Delete Label",add_remove_labels:"Add or Remove Labels",payment_labels_updated:"Payment labels updated",color:"Color",sort:"Sort",sort_by:"Sort by",lightning_address:"Lightning Address",lightning_addresses:"Lightning Addresses",lightning_address_price:"Lightning Address price",enable_lightning_address:"Enable Lightning Addresses",ln_address_mode:"Lightning Address Resolution Mode",ln_address_core_first:"Resolve from LNbits Core first",ln_address_extension_first:"Resolve from Pay Links extension first",ln_address_extension_only:"Resolve from Pay Links extension only",ln_address_mode_hint:"Choose how LNbits should resolve Lightning Addresses. Using both LNbits Core and the Pay Links extension will have a small impact on performance.",enable_lightning_address_for_all_wallets:"Enable Lightning Addresses for all LNbits wallets",allow_users_specify_lightning_addresses:"Allow users to specify Lightning Addresses",allow_wallet_owners_set_custom_lightning_addresses:"Allow wallet owners to set custom Lightning Addresses",charge_for_lightning_addresses:"Charge for Lightning Addresses",charge_users_set_change_lightning_address:"Charge users when they set or change a Lightning Address.",service_fee_wallet_id_must_be_set:"Service Fee Wallet ID must be set in the Service Fees section below for this to work.",lightning_address_blacklist:"Lightning Address blacklist",lightning_address_blacklist_instructions:"Newline separated reserved words. Users cannot choose a Lightning Address that matches any of these words.",set_lightning_address:"Set Lightning Address",block_explorer:"Block Explorer",enable_block_explorer:"Enable Block Explorer",block_explorer_desc:"Allow users to explore Bitcoin transactions and addresses via Electrum.",blockexplorer_public_api:"Public API Access",blockexplorer_public_api_desc:"Allow unauthenticated access to the block explorer API endpoints.",electrum_compatible_server:"Electrum compatible server",electrum_server_url:"Electrum Server URL",electrum_server_url_hint:"Choose a public Electrum server or enter your own.",electrum_server_url_custom:"Custom Electrum Server URL",view_public_electrum_servers:"View public Electrum servers",blockexplorer_network:"Bitcoin Network",blockexplorer_network_hint:"The network the Electrum server is connected to, used to render addresses correctly.",blockexplorer_search_label:"Search by TXID or Address",blockexplorer_search_hint:"64-char hex = transaction · anything else = Bitcoin address",recent_blocks:"Recent Blocks",chain_tip:"Chain Tip",block_height:"Block Height",block_fee:"block fee",fee_estimates:"Fee Estimates",confirmed_balance:"Confirmed Balance",unconfirmed_balance:"Unconfirmed Balance",transaction_history:"Transaction History",coinbase:"Coinbase",inputs:"Inputs",outputs:"Outputs",confirmations:"Confirmations",confirmed:"Confirmed",unconfirmed:"Unconfirmed",no_transactions:"No transactions found",history_unavailable:"Transaction history unavailable (address has too many transactions)",address:"Address",block_number:"Block #{height}",block_diff:"diff {value}",block_hash:"Hash",previous_block:"Previous Block",merkle_root:"Merkle Root",version:"Version",bits:"Bits",difficulty:"Difficulty",nonce:"Nonce",txid:"TXID",vsize:"Virtual Size",weight:"Weight",n_block_fee:"{n}-block fee"},window.localisation.es={confirm:"Sí",server:"Servidor",theme:"Tema",site_customisation:"Personalización del sitio",funding:"Financiación",users:"Usuarios",audit:"Auditoría",apps:"Aplicaciones",channels:"Canales",transactions:"Transacciones",dashboard:"Tablero de instrumentos",node:"Nodo",export_users:"Exportar Usuarios",no_users:"No se encontraron usuarios",total_capacity:"Capacidad Total",avg_channel_size:"Tamaño Medio del Canal",biggest_channel_size:"Tamaño del Canal Más Grande",smallest_channel_size:"Tamaño de canal más pequeño",number_of_channels:"Número de canales",active_channels:"Canales activos",connect_peer:"Conectar Par",connect:"Conectar",open_channel:"Canal Abierto",open:"Abrir",close_channel:"Cerrar canal",close:"Cerrar",restart:"Reiniciar el servidor",save:"Guardar",save_tooltip:"Guardar cambios",credit_debit:"Crédito / Débito",credit_hint:"Presione Enter para cargar la cuenta",credit_label:"Cargar {denomination}",credit_ok:"Éxito al acreditar/debitar fondos virtuales ({amount} sats). Los pagos dependen de los fondos reales en la fuente de financiación.",restart_tooltip:"Reinicie el servidor para aplicar los cambios",add_funds_tooltip:"Agregue fondos a una billetera.",reset_defaults:"Restablecer",reset_defaults_tooltip:"Borrar todas las configuraciones y restablecer a los valores predeterminados.",download_backup:"Descargar copia de seguridad de la base de datos",name_your_wallet:"Nombre de su billetera {name}",paste_invoice_label:"Pegue la factura aquí",lnbits_description:"Fácil de instalar y liviano, LNbits puede ejecutarse en cualquier fuente de financiación de la red Lightning y hasta LNbits mismo! Puede ejecutar LNbits para usted mismo o ofrecer una solución competente a otros. Cada billetera tiene su propia clave API y no hay límite para la cantidad de billeteras que puede crear. La capacidad de particionar fondos hace de LNbits una herramienta útil para la administración de fondos y como herramienta de desarrollo. Las extensiones agregan funcionalidad adicional a LNbits, por lo que puede experimentar con una variedad de tecnologías de vanguardia en la red Lightning. Lo hemos hecho lo más simple posible para desarrollar extensiones y, como un proyecto gratuito y de código abierto, animamos a las personas a que se desarrollen a sí mismas y envíen sus propios contribuciones.",export_to_phone:"Exportar a teléfono con código QR",export_to_phone_desc:"Este código QR contiene su URL de billetera con acceso completo. Puede escanearlo desde su teléfono para abrir su billetera allí.",wallet:"Billetera:",wallets:"Billeteras",add_wallet:"Agregar nueva billetera",delete_wallet:"Eliminar billetera",delete_wallet_desc:"Esta billetera completa se eliminará, los fondos son IRREVERSIBLES.",rename_wallet:"Cambiar el nombre de la billetera",update_name:"Actualizar nombre",fiat_tracking:"Seguimiento Fiat",currency:"Moneda",update_currency:"Actualizar moneda",press_to_claim:"Presione para reclamar Bitcoin",donate:"Donar",view_github:"Ver en GitHub",voidwallet_active:"¡VoidWallet está activo! Pagos desactivados",use_with_caution:"USAR CON CUIDADO - {name} Wallet aún está en BETA",service_fee:"Tarifa de servicio: {amount} % por transacción",service_fee_max:"Tarifa de servicio: {amount} % por transacción (máx {max} sats)",service_fee_tooltip:"Comisión de servicio cobrada por el administrador del servidor LNbits por cada transacción saliente",toggle_darkmode:"Cambiar modo oscuro",payment_reactions:"Reacciones de Pago",view_swagger_docs:"Ver documentación de API de LNbits Swagger",api_docs:"Documentación de API",api_keys_api_docs:"URL del nodo, claves de API y documentación de API",api_keys_warning:"Estas claves deben mantenerse seguras; compartirlas podría provocar la pérdida de fondos.",admin_key_warning:"Tu clave de administrador otorga acceso total a tu billetera, incluida la posibilidad de enviar pagos. Nunca la compartas a menos que confíes plenamente en el destinatario.",lnbits_version:"Versión de LNbits",runs_on:"Corre en",paste:"Pegar",paste_from_clipboard:"Pegar desde el portapapeles",paste_request:"Pegar solicitud",create_invoice:"Crear factura",camera_tooltip:"Utilice la cámara para escanear una factura / código QR",export_csv:"Exportar a CSV",chart_tooltip:"Mostrar gráfico",pending:"Pendiente",copy_invoice:"Copiar factura",withdraw_from:"Retirar de",cancel:"Cancelar",scan:"Escanear",read:"Leer",pay:"Pagar",memo:"Memo",date:"Fecha",payment_processing:"Procesando pago ...",not_enough_funds:"¡No hay suficientes fondos!",search_by_tag_memo_amount:"Buscar por etiqueta, memo, cantidad",invoice_waiting:"Factura esperando pago",payment_received:"Pago recibido",payment_sent:"Pago enviado",receive:"recibir",send:"enviar",outgoing_payment_pending:"Pago saliente pendiente",drain_funds:"Drenar fondos",drain_funds_desc:"Este es un código QR LNURL-withdraw para drenar todos los fondos de esta billetera. No lo comparta con nadie. Es compatible con balanceCheck y balanceNotify, por lo que su billetera puede continuar drenando los fondos de aquí después del primer drenaje.",i_understand:"Lo entiendo",copy_wallet_url:"Copiar URL de billetera",disclaimer_dialog_title:"¡Importante!",disclaimer_dialog:"La funcionalidad de inicio de sesión se lanzará en una actualización futura, por ahora, asegúrese de guardar esta página como marcador para acceder a su billetera en el futuro. Este servicio está en BETA y no asumimos ninguna responsabilidad por personas que pierdan el acceso a sus fondos.",no_transactions:"No hay transacciones todavía",manage:"Administrar",exchanges:"Intercambios",extensions:"Extensiones",no_extensions:"No tienes extensiones instaladas :(",created:"Creado",search_extensions:"Extensiones de búsqueda",extension_sources:"Fuentes de extensión",ext_sources_hint:"Repositorios desde donde se pueden descargar las extensiones",ext_sources_label:"URL de origen (utilice solo la fuente oficial de la extensión LNbits y fuentes en las que pueda confiar)",warning:"Advertencia",repository:"Repositorio",confirm_continue:"¿Está seguro de que desea continuar?",manage_extension_details:"Instalar/desinstalar extensión",install:"Instalar",uninstall:"Desinstalar",drop_db:"Eliminar datos",enable:"Habilitar",pay_to_enable:"Pagar para habilitar",enable_extension_details:"Habilitar extensión para el usuario actual",disable:"Deshabilitar",delete:"Eliminar",installed:"Instalado",activated:"Activado",deactivated:"Desactivado",release_notes:"Notas de la versión",activate_extension_details:"Hacer que la extensión esté disponible/no disponible para los usuarios",featured:"Destacado",all:"Todos",only_admins_can_install:"(Solo las cuentas de administrador pueden instalar extensiones)",admin_only:"Solo administradores",new_version:"Nueva Versión",extension_depends_on:"Depende de:",extension_rating_soon:"Calificaciones próximamente",extension_installed_version:"Versión instalada",extension_uninstall_warning:"Está a punto de eliminar la extensión para todos los usuarios.",uninstall_confirm:"Sí, desinstalar",extension_db_drop_info:"Todos los datos para la extensión se eliminarán permanentemente. ¡No hay manera de deshacer esta operación!",extension_db_drop_warning:"Está a punto de eliminar todos los datos para la extensión. Por favor, escriba el nombre de la extensión para continuar:",extension_required_lnbits_version:"Esta versión requiere al menos una versión de LNbits",min_version:"Mínimo (incluido)",max_version:"Máximo (excluido)",payment_hash:"Hash de pago",fee:"Cuota",amount:"Cantidad",amount_sats:"Cantidad (sats)",tag:"Etiqueta",unit:"Unidad",description:"Descripción",expiry:"Expiración",webhook:"Webhook",payment_proof:"Prueba de pago",update:"Actualizar",update_available:"¡Actualización {version} disponible!",latest_update:"Usted está en la última versión {version}.",notifications:"Notificaciones",no_notifications:"No hay notificaciones",notifications_disabled:"Las notificaciones de estado de LNbits están desactivadas.",enable_notifications:"Activar notificaciones",enable_notifications_desc:"Si está activado, buscará las últimas actualizaciones del estado de LNbits, como incidentes de seguridad y actualizaciones.",enable_watchdog_desc:"Si está activado, cambiará automáticamente su fuente de financiamiento a VoidWallet si su saldo es inferior al saldo de LNbits. Tendrá que activarlo manualmente después de una actualización.",watchdog_interval:"Intervalo de vigilancia",watchdog_interval_desc:"Con qué frecuencia la tarea de fondo debe verificar la señal de killswitch en el delta del watchdog [node_balance - lnbits_balance] (en minutos).",watchdog_delta:"Vigilante Delta",watchdog_delta_desc:"Límite antes de que el interruptor de apagado cambie la fuente de financiamiento a VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fuente de notificación",notification_source_label:"URL de origen (solo use la fuente oficial de estado de LNbits y fuentes en las que confíe)",more:"más",less:"menos",releases:"Lanzamientos",watchdog:"Perro guardián",server_logs:"Registros del Servidor",ip_blocker:"Bloqueador de IP",security:"Seguridad",security_tools:"Herramientas de seguridad",block_access_hint:"Bloquear acceso por IP",allow_access_hint:"Permitir acceso por IP (anulará las IPs bloqueadas)",enter_ip:"Ingrese la IP y presione enter",rate_limiter:"Limitador de tasa",wallet_limiter:"Limitador de Cartera",wallet_limit_max_withdraw_per_day:"Límite diario de retiro de la cartera en sats (0 para deshabilitar)",wallet_max_ballance:"Saldo máximo de la billetera en sats (0 para desactivar)",wallet_limit_secs_between_trans:"Mín. segs entre transacciones por cartera (0 para desactivar)",number_of_requests:"Número de solicitudes",time_unit:"Unidad de tiempo",minute:"minuto",second:"segundo",hour:"hora",disable_server_log:"Desactivar registro del servidor",enable_server_log:"Activar registro del servidor",coming_soon:"Función próximamente disponible",session_has_expired:"Tu sesión ha expirado. Por favor, inicia sesión de nuevo.",instant_access_question:"¿Quieres acceso instantáneo?",login_with_user_id:"Iniciar sesión con ID de usuario",or:"o",create_new_wallet:"Crear Nueva Cartera",login_to_account:"Inicie sesión en su cuenta",create_account:"Crear cuenta",account_settings:"Configuración de la cuenta",signin_with_nostr:"Continuar con Nostr",signin_with_google:"Inicia sesión con Google",signin_with_github:"Inicia sesión con GitHub",signin_with_keycloak:"Iniciar sesión con Keycloak",username_or_email:"Nombre de usuario o correo electrónico",password:"Contraseña",password_config:"Configuración de Contraseña",password_repeat:"Repetición de contraseña",change_password:"Cambiar contraseña",update_credentials:"Actualizar credenciales",update_pubkey:"Actualizar clave pública",set_password:"Establecer contraseña",invalid_password:"La contraseña debe tener al menos 8 caracteres.",login:"Iniciar sesión",register:"Registrarse",username:"Nombre de usuario",pubkey:"Clave pública",user_id:"Identificación de usuario",email:"Correo electrónico",first_name:"Nombre de pila",last_name:"Apellido",picture:"Imagen",verify_email:"Verifique el correo electrónico con",account:"Cuenta",update_account:"Actualizar cuenta",invalid_username:"Nombre de usuario inválido",auth_provider:"Proveedor de Autenticación",my_account:"Mi cuenta",back:"Atrás",logout:"Cerrar sesión",look_and_feel:"Apariencia",toggle_gradient:"Alternar degradado",gradient_background:"Fondo de gradiente",language:"Idioma",color_scheme:"Esquema de colores",admin_settings:"Configuración del administrador",extension_cost:"Esta versión requiere un pago mínimo de {cost} sats.",extension_paid_sats:"Ya has pagado {paid_sats} sats.",release_details_error:"No se pueden obtener los detalles de la versión.",pay_from_wallet:"Pagar desde la billetera",wallet_required:"Billetera *",show_qr:"Mostrar QR",retry_install:"Reintentar Instalación",new_payment:"Realizar nuevo pago",update_payment:"Actualizar Pago",already_paid_question:"¿Ya has pagado?",sell:"Vender",sell_require:"Solicitar pago para habilitar la extensión",sell_info:"La extensión {name} requiere un pago mínimo de {amount} sats para habilitar.",hide_empty_wallets:"Ocultar billeteras vacías",recheck:"Revisar de nuevo",contributors:"Colaboradores",license:"Licencia",reset_key:"Restablecer clave",reset_password:"Restablecer contraseña",border_choices:"Opciones de Borde",select_all:"Seleccionar todo",nfc_supported:"Compatible con NFC",nfc_not_supported:"NFC no compatible",expire_date:"Fecha de vencimiento:",hash:"Hash:",welcome_lnbits:"Bienvenido a LNbits",setup_su_account:"Configura la cuenta de Superusuario a continuación.",create_ticker_converter:"Crear Convertidor de Ticker de Moneda",enable_audit:"Habilitar auditoría",recommended:"Recomendado",audit_desc:"Registrar solicitudes HTTP de acuerdo con los filtros especificados",audit_record_req:"Registrar cuerpo de solicitud",audit_record_warning:"Advertencia:",audit_record_req_warning_1:"los datos confidenciales (como las contraseñas) serán registrados.",audit_record_req_warning_2:"el cuerpo de la solicitud puede tener un tamaño grande.",audit_record_use:"Úsalo con precaución.",audit_ip:"Registrar Dirección IP",audit_ip_desc:"Registra la dirección IP del cliente",audit_path_params:"Registrar parámetros de ruta",audit_query_params:"Registrar parámetros de consulta",audit_http_methods:"Incluye métodos HTTP",audit_http_methods_hint:"Lista de métodos HTTP a incluir. Las listas vacías significan todos.",audit_http_methods_label:"Métodos HTTP",audit_resp_codes:"Incluir Códigos de Respuesta HTTP",audit_resp_codes_hint:"Lista de códigos HTTP a incluir (coincidencia regex). Listas vacías significan todos. Ej: 4.*, 5.*",audit_resp_codes_label:"Código de respuesta HTTP (regex)",audit_paths:"Incluir rutas",audit_paths_hint:"Lista de rutas a incluir (coincidencia de expresión regular). Lista vacía significa todas.",audit_paths_label:"Ruta HTTP (regex)",audit_paths_exclude:"Excluir rutas",audit_paths_exclude_hint:"Lista de rutas a excluir (coincidencia de expresiones regulares). Lista vacía significa ninguna.",audit_paths_exclude_label:"Ruta HTTP (regex)",exchange_providers:"Proveedores de intercambio",admin_extensions:"Extensiones de Administración",admin_extensions_label:"Extensiones de administración",admin_extensions_hint:"Solo los usuarios con privilegios de administrador pueden usar extensiones.",user_default_extensions:"Extensiones predeterminadas del usuario",user_default_extensions_label:"Extensiones de usuario",user_default_extensions_hint:"Extensiones que estarán habilitadas de forma predeterminada para los usuarios.",miscellanous:"Misceláneo",misc_disable_extensions:"Desactivar extensiones",misc_disable_extensions_label:"Desactivar todas las extensiones",misc_hide_api:"Ocultar API",misc_hide_api_label:"Oculta la API de la billetera, las extensiones pueden optar por respetar",wallets_management:"Gestión de Carteras",funding_source_info:"Información sobre la Fuente de Financiamiento",funding_source:"Fuente de financiamiento: {wallet_class}",node_balance:"Balance de Nodo: {balance} sats",lnbits_balance:"Saldo de LNbits: {balance} sats",funding_reserve_percent:"Reserve Porcentaje: {percent} %",node_management:"Gestión de nodos",node_management_not_supported:"La gestión de nodos no es compatible con la fuente de financiación activa",toggle_node_ui:"Interfaz de usuario de nodo",toggle_public_node_ui:"Interfaz Pública de Nodo",toggle_transactions_node_ui:"Pestaña de transacciones (desactivar en nodos CLN grandes)",invoice_expiry:"Vencimiento de la Factura",invoice_expiry_label:"Expiración de la factura (segundos)",fee_reserve:"Reserva de tarifa",fee_reserve_msats:"Cuota de reserva en msats",fee_reserve_percent:"Tasa de reserva en porcentaje",server_management:"Gestión del Servidor",base_url:"URL base",base_url_label:"URL base estática para el servidor",authentication:"Autenticación",auth_token_expiry_label:"Minutos de vencimiento del token",auth_token_expiry_hint:"Tiempo en minutos hasta que el token expire",auth_allowed_methods_label:"Métodos de autorización permitidos",auth_allowed_methods_hint:"Seleccione métodos de autorización",auth_nostr_label:"URL de solicitud Nostr",auth_nostr_hint:"URL absoluto que los clientes utilizarán para iniciar sesión.",auth_google_ci_label:"ID de cliente de Google",auth_google_ci_hint:"Asegúrate de que los URIs de redirección autorizados contengan https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Secreto del Cliente de Google",auth_gh_client_id_label:"ID de cliente de GitHub",auth_gh_client_id_hint:"Asegúrate de que la URL de devolución de llamada de autorización esté configurada en https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Secreto del cliente de GitHub",auth_keycloak_label:"URL de descubrimiento de Keycloak",auth_keycloak_ci_label:"ID de cliente de Keycloak",auth_keycloak_ci_hint:"Asegúrate de que la URL de devolución de llamada de autorización esté configurada en https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Secreto del Cliente de Keycloak",auth_keycloak_custom_org_label:"Organización personalizada de Keycloak",auth_keycloak_custom_icon_label:"Icono personalizado de Keycloak (URL)",auth_oidc_label:"URL de descubrimiento de OIDC",auth_oidc_ci_label:"ID de cliente de OIDC",auth_oidc_ci_hint:"Asegúrate de que la URL de devolución de llamada de autorización esté configurada en https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Secreto del Cliente de OIDC",auth_oidc_custom_org_label:"Nombre de organización personalizada OIDC (ej. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Icono personalizado de OIDC (URL)",currency_settings:"Configuración de moneda",allowed_currencies:"Monedas permitidas",allowed_currencies_hint:"Limite el número de monedas fiduciarias disponibles",default_account_currency:"Moneda predeterminada de la cuenta",default_account_currency_hint:"Moneda predeterminada para contabilidad",service_fee_label:"Tarifa de servicio (%)",service_fee_hint:"Tarifa cobrada por tx (%)",service_fee_max_label:"Tarifa de servicio máx (sats)",service_fee_max_hint:"Tarifa máxima por servicio a cobrar en (sats)",fee_wallet:"Billetera de Tarifas",fee_wallet_label:"Billetera de tarifas (ID de billetera)",fee_wallet_hint:"ID de la billetera a la que enviar fondos",disable_fee:"Desactivar tarifa",disable_fee_internal:"Desactivar tarifa de servicio para pagos internos",disable_fee_internal_desc:"Desactivar tarifa de servicio para pagos internos Lightning",ui_management:"Gestión de la interfaz de usuario",ui_site_title:"Título del Sitio",ui_site_tagline:"Lema del sitio",ui_elements_enable:"Habilitar elementos en la página de inicio",ui_elements_disable:"Desactivar elementos en la página de inicio",ui_toggle_elements_tip:"Eliminar elementos de la página de inicio como 'funciona en', etc.",ui_site_description:"Descripción del sitio",ui_site_description_hint:"Usa texto sin formato, Markdown o HTML sin procesar",ui_default_wallet_name:"Nombre predeterminado de la billetera",lnbits_wallet:"Cartera LNbits",denomination:"Denominación",denomination_hint:"El nombre para el token FakeWallet",ui_qr_code_logo:"Logo de código QR",ui_qr_code_logo_hint:"URL a la imagen del logo en el código QR",ui_custom_badge:"Insignia personalizada",ui_custom_badge_label:"Insignia personalizada 'USAR CON PRECAUCIÓN - La billetera LNbits aún está en BETA'",ui_custom_badge_color_label:"Color personalizado de insignia",themes:"Temas",themes_hint:"Elige los temas disponibles para los usuarios",custom_logo:"Logotipo personalizado",custom_logo_hint:"URL a la imagen del logo",ad_space_title:"Título del Espacio Publicitario",ad_space_title_label:"Respaldado por",ad_slots:"Espacios publicitarios",ad_slots_hint:"URL de anuncio y rutas de archivo de imagen en formato CSV, las extensiones pueden optar por respetar",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Anuncios habilitados",ads_disabled:"Anuncios desactivados",user_management:"Gestión de Usuarios",admin_users:"Usuarios Administradores",admin_users_hint:"Usuarios con privilegios de administrador",admin_users_label:"ID de usuario",allowed_users:"Usuarios Permitidos",allowed_users_hint:"Solo estos usuarios pueden usar LNbits",allowed_users_label:"ID de usuario",allow_creation_user:"Permitir la creación de nuevos usuarios",allow_creation_user_desc:"Permitir la creación de nuevos usuarios en la página de índice",components:"Componentes",long_running_endpoints:"Principales 5 puntos de conexión de larga duración",http_request_methods:"Métodos de solicitud HTTP",http_response_codes:"Códigos de Respuesta HTTP",request_details:"Detalles de la solicitud",http_request_details:"Detalles de la Solicitud HTTP",block_explorer:"Block Explorer",enable_block_explorer:"Activar Block Explorer",block_explorer_desc:"Permite a los usuarios explorar transacciones y direcciones de Bitcoin a través de Electrum.",blockexplorer_public_api:"Acceso a la API pública",blockexplorer_public_api_desc:"Permitir acceso no autenticado a los endpoints de la API del explorador de bloques.",electrum_server_url:"URL del servidor Electrum",electrum_server_url_hint:"p.ej. ssl://electrum.blockstream.info:50002 o tcp://localhost:50001",blockexplorer_search_label:"Buscar por TXID o dirección",blockexplorer_search_hint:"Hex de 64 caracteres = transacción · cualquier otra cosa = dirección Bitcoin",recent_blocks:"Bloques recientes",chain_tip:"Punta de cadena",block_height:"Altura de bloque",block_fee:"tarifa de bloque",fee_estimates:"Estimaciones de tarifa",confirmed_balance:"Saldo confirmado",unconfirmed_balance:"Saldo no confirmado",transaction_history:"Historial de transacciones",coinbase:"Coinbase",inputs:"Entradas",outputs:"Salidas",confirmations:"Confirmaciones",confirmed:"Confirmado",unconfirmed:"No confirmado",history_unavailable:"Historial de transacciones no disponible (la dirección tiene demasiadas transacciones)",address:"Dirección",block_number:"Bloque #{height}",block_diff:"dif {value}",block_hash:"Hash",previous_block:"Bloque anterior",merkle_root:"Raíz de Merkle",version:"Versión",bits:"Bits",difficulty:"Dificultad",nonce:"Nonce",txid:"TXID",vsize:"Tamaño virtual",weight:"Peso",n_block_fee:"tarifa {n} bloques"},window.localisation.fr={confirm:"Oui",server:"Serveur",theme:"Thème",site_customisation:"Personnalisation du site",funding:"Financement",users:"Utilisateurs",audit:"Audit",apps:"Applications",channels:"Canaux",transactions:"Transactions",dashboard:"Tableau de bord",node:"Noeud",export_users:"Exporter les utilisateurs",no_users:"Aucun utilisateur trouvé",total_capacity:"Capacité totale",avg_channel_size:"Taille moyenne du canal",biggest_channel_size:"Taille de canal maximale",smallest_channel_size:"Taille de canal la plus petite",number_of_channels:"Nombre de canaux",active_channels:"Canaux actifs",connect_peer:"Connecter un pair",connect:"Connecter",open_channel:"Ouvrir le canal",open:"Ouvrir",close_channel:"Fermer le canal",close:"Fermer",restart:"Redémarrer le serveur",save:"Enregistrer",save_tooltip:"Enregistrer vos modifications",credit_debit:"Crédit / Débit",credit_hint:"Appuyez sur Entrée pour créditer le compte",credit_label:"{denomination} à créditer",credit_ok:"Succès du crédit/débit des fonds virtuels ({amount} sats). Les paiements dépendent des fonds réels sur la source de financement.",restart_tooltip:"Redémarrez le serveur pour que les changements prennent effet",add_funds_tooltip:"Ajouter des fonds à un portefeuille.",reset_defaults:"Réinitialiser aux valeurs par défaut",reset_defaults_tooltip:"Supprimer tous les paramètres et les réinitialiser aux valeurs par défaut.",download_backup:"Télécharger la sauvegarde de la base de données",name_your_wallet:"Nommez votre portefeuille {name}",paste_invoice_label:"Coller une facture, une demande de paiement ou un code lnurl *",lnbits_description:"Facile à installer et léger, LNbits peut fonctionner sur n'importe quelle source de financement du réseau Lightning et même LNbits lui-même! Vous pouvez exécuter LNbits pour vous-même ou offrir facilement une solution de gardien pour les autres. Chaque portefeuille a ses propres clés API et il n'y a pas de limite au nombre de portefeuilles que vous pouvez créer. La capacité de partitionner les fonds rend LNbits un outil utile pour la gestion de l'argent et comme outil de développement. Les extensions ajoutent une fonctionnalité supplémentaire à LNbits afin que vous puissiez expérimenter une gamme de technologies de pointe sur le réseau Lightning. Nous avons rendu le développement d'extensions aussi simple que possible et, en tant que projet gratuit et open source, nous encourageons les gens à développer et à soumettre les leurs.",export_to_phone:"Exporter vers le téléphone avec un code QR",export_to_phone_desc:"Ce code QR contient l'URL de votre portefeuille avec un accès complet. Vous pouvez le scanner depuis votre téléphone pour ouvrir votre portefeuille depuis là-bas.",wallet:"Portefeuille :",wallets:"Portefeuilles",add_wallet:"Ajouter un nouveau portefeuille",delete_wallet:"Supprimer le portefeuille",delete_wallet_desc:"Ce portefeuille entier sera supprimé et les fonds seront IRRECUPERABLES.",rename_wallet:"Renommer le portefeuille",update_name:"Mettre à jour le nom",fiat_tracking:"Suivi Fiat",currency:"Devise",update_currency:"Mettre à jour la devise",press_to_claim:"Appuyez pour demander du Bitcoin",donate:"Donner",view_github:"Voir sur GitHub",voidwallet_active:"VoidWallet est actif! Paiements désactivés",use_with_caution:"UTILISER AVEC PRUDENCE - Le portefeuille {name} est toujours en version BETA",service_fee:"Frais de service : {amount} % par transaction",service_fee_max:"Frais de service : {amount} % par transaction (max {max} sats)",service_fee_tooltip:"Frais de service facturés par l'administrateur du serveur LNbits pour chaque transaction sortante",toggle_darkmode:"Basculer le mode sombre",payment_reactions:"Réactions de paiement",view_swagger_docs:"Voir les documentation de l'API Swagger de LNbits",api_docs:"Documentation de l'API",api_keys_api_docs:"URL du nœud, clés API et documentation API",api_keys_warning:"Ces clés doivent être conservées en lieu sûr ; les partager pourrait entraîner la perte de fonds.",admin_key_warning:"Votre clé d'administrateur donne un accès complet à votre portefeuille, y compris la possibilité d'envoyer des paiements. Ne la partagez jamais, sauf si vous faites entièrement confiance au destinataire.",lnbits_version:"Version de LNbits",runs_on:"Fonctionne sur",paste:"Coller",paste_from_clipboard:"Coller depuis le presse-papiers",paste_request:"Coller la requête",create_invoice:"Créer une facture",camera_tooltip:"Utiliser la caméra pour scanner une facture / un code QR",export_csv:"Exporter vers CSV",chart_tooltip:"Afficher le graphique",pending:"En attente",copy_invoice:"Copier la facture",withdraw_from:"Retirer de",cancel:"Annuler",scan:"Scanner",read:"Lire",pay:"Payer",memo:"Mémo",date:"Date",payment_processing:"Traitement du paiement...",not_enough_funds:"Fonds insuffisants !",search_by_tag_memo_amount:"Rechercher par tag, mémo, montant",invoice_waiting:"Facture en attente de paiement",payment_received:"Paiement reçu",payment_sent:"Paiement envoyé",receive:"recevoir",send:"envoyer",outgoing_payment_pending:"Paiement sortant en attente",drain_funds:"Vider les fonds",drain_funds_desc:"Il s'agit d'un code QR LNURL-withdraw pour tout aspirer de ce portefeuille. Ne le partagez avec personne. Il est compatible avec balanceCheck et balanceNotify, de sorte que votre portefeuille peut continuer à retirer les fonds continuellement à partir d'ici après le premier retrait.",i_understand:"J'ai compris",copy_wallet_url:"Copier l'URL du portefeuille",disclaimer_dialog_title:"Important !",disclaimer_dialog:"La fonctionnalité de connexion sera publiée dans une future mise à jour, pour l'instant, assurez-vous de mettre cette page en favori pour accéder à votre portefeuille ultérieurement ! Ce service est en BETA, et nous ne sommes pas responsables des personnes qui perdent l'accès à leurs fonds.",no_transactions:"Aucune transaction effectuée pour le moment",manage:"Gérer",exchanges:"Échanges",extensions:"Extensions",no_extensions:"Vous n'avez installé aucune extension :(",created:"Créé",search_extensions:"Rechercher des extensions",extension_sources:"Sources d'extension",ext_sources_hint:"Dépôts à partir desquels les extensions peuvent être téléchargées",ext_sources_label:"URL source (utilisez uniquement la source officielle de l'extension LNbits et des sources fiables)",warning:"Avertissement",repository:"Référentiel",confirm_continue:"Êtes-vous sûr de vouloir continuer ?",manage_extension_details:"Installer/désinstaller l'extension",install:"Installer",uninstall:"Désinstaller",drop_db:"Supprimer les données",enable:"Activer",pay_to_enable:"Payer pour activer",enable_extension_details:"Activer l'extension pour l'utilisateur actuel",disable:"Désactiver",delete:"Supprimer",installed:"Installé",activated:"Activé",deactivated:"Désactivé",release_notes:"Notes de version",activate_extension_details:"Rendre l'extension disponible/indisponible pour les utilisateurs",featured:"Mis en avant",all:"Tout",only_admins_can_install:"Seuls les comptes administrateurs peuvent installer des extensions",admin_only:"Réservé aux administrateurs",new_version:"Nouvelle version",extension_depends_on:"Dépend de :",extension_rating_soon:"Notes des utilisateurs à venir bientôt",extension_installed_version:"Version installée",extension_uninstall_warning:"Vous êtes sur le point de supprimer l'extension pour tous les utilisateurs.",uninstall_confirm:"Oui, Désinstaller",extension_db_drop_info:"Toutes les données pour l'extension seront supprimées de manière permanente. Il n'est pas possible d'annuler cette opération !",extension_db_drop_warning:"Vous êtes sur le point de supprimer toutes les données de l'extension. Veuillez taper le nom de l'extension pour continuer :",extension_required_lnbits_version:"Cette version nécessite au moins LNbits version",min_version:"Minimum (inclus)",max_version:"Maximum (exclu)",payment_hash:"Hash de paiement",fee:"Frais",amount:"Montant",amount_sats:"Montant (sats)",tag:"Étiqueter",unit:"Unité",description:"Description",expiry:"Expiration",webhook:"Webhook",payment_proof:"Preuve de paiement",update:"Mettre à jour",update_available:"Mise à jour {version} disponible !",latest_update:"Vous êtes sur la dernière version {version}.",notifications:"Notifications",no_notifications:"Aucune notification",notifications_disabled:"Les notifications de statut LNbits sont désactivées.",enable_notifications:"Activer les notifications",enable_notifications_desc:"Si activé, il récupérera les dernières mises à jour du statut LNbits, telles que les incidents de sécurité et les mises à jour.",enable_watchdog:"Activer le Watchdog",enable_watchdog_desc:"Si elle est activée, elle changera automatiquement votre source de financement en VoidWallet si votre solde est inférieur au solde LNbits. Vous devrez activer manuellement après une mise à jour.",watchdog_interval:"Intervalle du gardien",watchdog_interval_desc:"À quelle fréquence la tâche en arrière-plan doit-elle vérifier la présence d'un signal d'arrêt d'urgence dans le delta du gardien [node_balance - lnbits_balance] (en minutes).",watchdog_delta:"Chien de garde Delta",watchdog_delta_desc:"Limite avant que l'interrupteur d'arrêt ne change la source de financement pour VoidWallet [lnbits_balance - node_balance > delta]",status:"Statut",notification_source:"Source de notification",notification_source_label:"URL source (utilisez uniquement la source officielle de statut LNbits et des sources de confiance)",more:"plus",less:"moins",releases:"Versions",watchdog:"Chien de garde",server_logs:"Journaux du serveur",ip_blocker:"Bloqueur d'IP",security:"Sécurité",security_tools:"Outils de sécurité",block_access_hint:"Bloquer l'accès par IP",allow_access_hint:"Autoriser l'accès par IP (cela passera outre les IP bloquées)",enter_ip:"Entrez l'adresse IP et appuyez sur Entrée",rate_limiter:"Limiteur de débit",wallet_limiter:"Limiteur de portefeuille",wallet_limit_max_withdraw_per_day:"Retrait quotidien maximum du portefeuille en sats (0 pour désactiver)",wallet_max_ballance:"Solde maximum du portefeuille en sats (0 pour désactiver)",wallet_limit_secs_between_trans:"Minutes et secondes entre les transactions par portefeuille (0 pour désactiver)",number_of_requests:"Nombre de requêtes",time_unit:"Unité de temps",minute:"minute",second:"seconde",hour:"heure",disable_server_log:"Désactiver le journal du serveur",enable_server_log:"Activer le journal du serveur",coming_soon:"Fonctionnalité à venir bientôt",session_has_expired:"Votre session a expiré. Veuillez vous reconnecter.",instant_access_question:"Voulez-vous un accès instantané ?",login_with_user_id:"Connexion avec l'identifiant utilisateur",or:"ou",create_new_wallet:"Créer un nouveau portefeuille",login_to_account:"Connectez-vous à votre compte",create_account:"Créer un compte",account_settings:"Paramètres du compte",signin_with_nostr:"Continuer avec Nostr",signin_with_google:"Connectez-vous avec Google",signin_with_github:"Connectez-vous avec GitHub",signin_with_keycloak:"Connectez-vous avec Keycloak",username_or_email:"Nom d'utilisateur ou e-mail",password:"Mot de passe",password_config:"Configuration du mot de passe",password_repeat:"Répétition du mot de passe",change_password:"Changer le mot de passe",update_credentials:"Mettre à jour les informations d'identification",update_pubkey:"Mettre à jour la clé publique",set_password:"Définir le mot de passe",invalid_password:"Le mot de passe doit comporter au moins 8 caractères",login:"Connexion",register:"Inscrire",username:"Nom d'utilisateur",pubkey:"Clé publique",user_id:"Identifiant utilisateur",email:"E-mail",first_name:"Prénom",last_name:"Nom de famille",picture:"Image",verify_email:"Vérifiez l'e-mail avec",account:"Compte",update_account:"Mettre à jour le compte",invalid_username:"Nom d'utilisateur invalide",auth_provider:"Fournisseur d'authentification",my_account:"Mon compte",back:"Retour",logout:"Déconnexion",look_and_feel:"Apparence",toggle_gradient:"Basculer le dégradé",gradient_background:"Fond en dégradé",language:"Langue",color_scheme:"Schéma de couleurs",admin_settings:"Paramètres administrateur",extension_cost:"Cette version nécessite un paiement minimum de {cost} sats.",extension_paid_sats:"Vous avez déjà payé {paid_sats} sats.",release_details_error:"Impossible d'obtenir les détails de la version.",pay_from_wallet:"Payer depuis le portefeuille",wallet_required:"Portefeuille *",show_qr:"Afficher le QR",retry_install:"Réessayer l'installation",new_payment:"Effectuer un nouveau paiement",update_payment:"Mettre à jour le paiement",already_paid_question:"Avez-vous déjà payé ?",sell:"Vendre",sell_require:"Demander un paiement pour activer l'extension",sell_info:"L'extension {name} nécessite un paiement minimum de {amount} sats pour être activée.",hide_empty_wallets:"Masquer les portefeuilles vides",recheck:"Revérifier",contributors:"Contributeurs",license:"Licence",reset_key:"Réinitialiser la clé",reset_password:"Réinitialiser le mot de passe",border_choices:"Choix de bordure",select_all:"Sélectionner tout",nfc_supported:"NFC pris en charge",nfc_not_supported:"NFC non pris en charge",expire_date:"Date d'expiration :",hash:"Hash :",welcome_lnbits:"Bienvenue à LNbits",setup_su_account:"Configurez le compte Superuser ci-dessous.",create_ticker_converter:"Créer un convertisseur de code de devise",enable_audit:"Activer l'audit",recommended:"Recommandé",audit_desc:"Enregistrer les requêtes HTTP selon les filtres spécifiés",audit_record_req:"Enregistrer le corps de la demande",audit_record_warning:"Avertissement :",audit_record_req_warning_1:"les données confidentielles (comme les mots de passe) seront enregistrées.",audit_record_req_warning_2:"le corps de la requête peut être de grande taille.",audit_record_use:"Utilisez-le avec précaution.",audit_ip:"Enregistrer l'adresse IP",audit_ip_desc:"Enregistrer l'adresse IP du client",audit_path_params:"Enregistrer les paramètres de chemin",audit_query_params:"Enregistrer les paramètres de la requête",audit_http_methods:"Inclure les méthodes HTTP",audit_http_methods_hint:"Liste des méthodes HTTP à inclure. Listes vides signifie toutes.",audit_http_methods_label:"Méthodes HTTP",audit_resp_codes:"Inclure les codes de réponse HTTP",audit_resp_codes_hint:"Liste des codes HTTP à inclure (correspondance regex). Les listes vides signifient tout. Ex : 4.*, 5.*",audit_resp_codes_label:"Code de réponse HTTP (regex)",audit_paths:"Inclure des chemins",audit_paths_hint:"Liste des chemins à inclure (correspondance regex). Liste vide signifie tout.",audit_paths_label:"Chemin HTTP (regex)",audit_paths_exclude:"Exclure les chemins",audit_paths_exclude_hint:"Liste des chemins à exclure (correspondance regex). Liste vide signifie aucun.",audit_paths_exclude_label:"Chemin HTTP (regex)",exchange_providers:"Fournisseurs d'échange",admin_extensions:"Extensions d'administration",admin_extensions_label:"Extensions d'administration",admin_extensions_hint:"Seuls les utilisateurs avec des privilèges d'administrateur peuvent utiliser les extensions.",user_default_extensions:"Extensions par défaut de l'utilisateur",user_default_extensions_label:"Extensions utilisateur",user_default_extensions_hint:"Extensions qui seront activées par défaut pour les utilisateurs.",miscellanous:"Divers",misc_disable_extensions:"Désactiver les extensions",misc_disable_extensions_label:"Désactiver toutes les extensions",misc_hide_api:"Masquer l'API",misc_hide_api_label:"Masque l'API du portefeuille, les extensions peuvent choisir de respecter",wallets_management:"Gestion des portefeuilles",funding_source_info:"Informations sur la source de financement",funding_source:"Source de financement : {wallet_class}",node_balance:"Solde du nœud : {balance} sats",lnbits_balance:"Solde LNbits : {balance} sats",funding_reserve_percent:"Pourcentage de Réserve : {percent} %",node_management:"Gestion des nœuds",node_management_not_supported:"La gestion des nœuds n'est pas prise en charge par la source de financement active",toggle_node_ui:"Interface utilisateur de nœud",toggle_public_node_ui:"Interface utilisateur du nœud public",toggle_transactions_node_ui:"Onglet des transactions (Désactiver sur les grands nœuds CLN)",invoice_expiry:"Expiration de la facture",invoice_expiry_label:"Expiration de la facture (secondes)",fee_reserve:"Réserve de frais",fee_reserve_msats:"Frais de réservation en msats",fee_reserve_percent:"Frais de réservation en pourcentage",server_management:"Gestion de serveur",base_url:"URL de base",base_url_label:"URL statique/de base pour le serveur",authentication:"Authentification",auth_token_expiry_label:"Durée d'expiration du jeton (en minutes)",auth_token_expiry_hint:"Durée en minutes avant l'expiration du jeton",auth_allowed_methods_label:"Méthodes d'autorisation autorisées",auth_allowed_methods_hint:"Sélectionnez les méthodes d'autorisation",auth_nostr_label:"URL de requête Nostr",auth_nostr_hint:"URL absolue que les clients utiliseront pour se connecter.",auth_google_ci_label:"ID Client Google",auth_google_ci_hint:"Assurez-vous que les URIs de redirection autorisées contiennent https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Secret client Google",auth_gh_client_id_label:"Identifiant client GitHub",auth_gh_client_id_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Secret Client GitHub",auth_keycloak_label:"URL de découverte Keycloak",auth_keycloak_ci_label:"ID Client Keycloak",auth_keycloak_ci_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Secret client Keycloak",auth_keycloak_custom_org_label:"Organisation personnalisée Keycloak",auth_keycloak_custom_icon_label:"Icône personnalisée Keycloak (URL)",auth_oidc_label:"URL de découverte OIDC",auth_oidc_ci_label:"ID Client OIDC",auth_oidc_ci_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Secret client OIDC",auth_oidc_custom_org_label:"Nom de l'organisation personnalisée OIDC (par ex. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Icône personnalisée OIDC (URL)",currency_settings:"Paramètres de devise",allowed_currencies:"Devises autorisées",allowed_currencies_hint:"Limiter le nombre de devises fiduciaires disponibles",default_account_currency:"Devise par défaut du compte",default_account_currency_hint:"Devise par défaut pour la comptabilité",service_fee_label:"Frais de service (%)",service_fee_hint:"Frais facturés par tx (%)",service_fee_max_label:"Frais de service max (sats)",service_fee_max_hint:"Frais de service maximum à facturer en (sats)",fee_wallet:"Portefeuille de frais",fee_wallet_label:"Portefeuille de frais (ID de portefeuille)",fee_wallet_hint:"Identifiant de portefeuille pour envoyer des fonds à",disable_fee:"Désactiver les frais",disable_fee_internal:"Désactiver les frais de service pour les paiements internes",disable_fee_internal_desc:"Désactiver les frais de service pour les paiements Lightning internes",ui_management:"Gestion de l'interface utilisateur",ui_site_title:"Titre du site",ui_site_tagline:"Slogan du site",ui_elements_enable:"Activer les éléments sur la page d'accueil",ui_elements_disable:"Désactiver les éléments sur la page d'accueil",ui_toggle_elements_tip:"Supprimer les éléments de la page d'accueil comme 'fonctionne avec', etc.",ui_site_description:"Description du site",ui_site_description_hint:"Utilisez du texte brut, du Markdown ou du HTML brut",ui_default_wallet_name:"Nom par Défaut du Portefeuille",lnbits_wallet:"Portefeuille LNbits",denomination:"Dénomination",denomination_hint:"Le nom du jeton FakeWallet",ui_qr_code_logo:"Logo de code QR",ui_qr_code_logo_hint:"URL de l'image du logo dans le code QR",ui_custom_badge:"Badge personnalisé",ui_custom_badge_label:"Badge personnalisé 'À UTILISER AVEC PRÉCAUTION - Le portefeuille LNbits est encore en BÊTA'",ui_custom_badge_color_label:"Couleur de badge personnalisée",themes:"Thèmes",themes_hint:"Choisissez des thèmes disponibles pour les utilisateurs",custom_logo:"Logo personnalisé",custom_logo_hint:"URL de l'image du logo",ad_space_title:"Titre de l'espace publicitaire",ad_space_title_label:"Soutenu par",ad_slots:"Emplacements publicitaires",ad_slots_hint:"URL de l'annonce et chemins des fichiers image au format CSV, les extensions peuvent choisir de respecter",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Annonces activées",ads_disabled:"Publicités désactivées",user_management:"Gestion des utilisateurs",admin_users:"Utilisateurs administrateurs",admin_users_hint:"Utilisateurs avec des privilèges d'administration",admin_users_label:"Identifiant utilisateur",allowed_users:"Utilisateurs autorisés",allowed_users_hint:"Seuls ces utilisateurs peuvent utiliser LNbits",allowed_users_label:"ID utilisateur",allow_creation_user:"Autoriser la création de nouveaux utilisateurs",allow_creation_user_desc:"Permettre la création de nouveaux utilisateurs sur la page d’index",components:"Composants",long_running_endpoints:"Top 5 points de terminaison longue durée",http_request_methods:"Méthodes de requête HTTP",http_response_codes:"Codes de réponse HTTP",request_details:"Détails de la demande",http_request_details:"Détails de la requête HTTP",block_explorer:"Block Explorer",enable_block_explorer:"Activer le Block Explorer",block_explorer_desc:"Permet aux utilisateurs d'explorer les transactions et adresses Bitcoin via Electrum.",blockexplorer_public_api:"Accès API public",blockexplorer_public_api_desc:"Autoriser l'accès non authentifié aux endpoints de l'API de l'explorateur de blocs.",electrum_server_url:"URL du serveur Electrum",electrum_server_url_hint:"p.ex. ssl://electrum.blockstream.info:50002 ou tcp://localhost:50001",blockexplorer_search_label:"Rechercher par TXID ou adresse",blockexplorer_search_hint:"Hex 64 caractères = transaction · autre chose = adresse Bitcoin",recent_blocks:"Blocs récents",chain_tip:"Sommet de chaîne",block_height:"Hauteur de bloc",block_fee:"frais de bloc",fee_estimates:"Estimations de frais",confirmed_balance:"Solde confirmé",unconfirmed_balance:"Solde non confirmé",transaction_history:"Historique des transactions",coinbase:"Coinbase",inputs:"Entrées",outputs:"Sorties",confirmations:"Confirmations",confirmed:"Confirmé",unconfirmed:"Non confirmé",history_unavailable:"Historique des transactions indisponible (adresse avec trop de transactions)",address:"Adresse",block_number:"Bloc #{height}",block_diff:"diff {value}",block_hash:"Hash",previous_block:"Bloc précédent",merkle_root:"Racine de Merkle",version:"Version",bits:"Bits",difficulty:"Difficulté",nonce:"Nonce",txid:"TXID",vsize:"Taille virtuelle",weight:"Poids",n_block_fee:"frais {n} blocs"},window.localisation.it={confirm:"Sì",server:"Server",theme:"Tema",site_customisation:"Personalizzazione del sito",funding:"Funding",users:"Utenti",audit:"Verifica",apps:"Applicazioni",channels:"Canali",transactions:"Transazioni",dashboard:"Pannello di controllo",node:"Interruttore",export_users:"Esporta utenti",no_users:"Nessun utente trovato",total_capacity:"Capacità Totale",avg_channel_size:"Dimensione media del canale",biggest_channel_size:"Dimensione del canale più grande",smallest_channel_size:"Dimensione Più Piccola del Canale",number_of_channels:"Numero di Canali",active_channels:"Canali Attivi",connect_peer:"Connetti Peer",connect:"Connetti",open_channel:"Canale aperto",open:"Apri",close_channel:"Chiudi Canale",close:"Chiudi",restart:"Riavvia il server",save:"Salva",save_tooltip:"Salva le modifiche",credit_debit:"Credito / Debito",credit_hint:"Premere Invio per accreditare i fondi",credit_label:"{denomination} da accreditare",credit_ok:"Credito/addebito riuscito di fondi virtuali ({amount} sats). I pagamenti dipendono dai fondi effettivi sulla fonte di finanziamento.",restart_tooltip:"Riavvia il server affinché le modifiche abbiano effetto",add_funds_tooltip:"Aggiungere fondi a un portafoglio",reset_defaults:"Ripristina le impostazioni predefinite",reset_defaults_tooltip:"Cancella tutte le impostazioni e ripristina i valori predefiniti",download_backup:"Scarica il backup del database",name_your_wallet:"Dai un nome al tuo portafoglio {name}",paste_invoice_label:"Incolla una fattura, una richiesta di pagamento o un codice lnurl *",lnbits_description:"Leggero e facile da configurare, LNbits può funzionare su qualsiasi fonte di finanziamento Lightning Network e persino LNbits stesso! Potete gestire LNbits per conto vostro o offrire facilmente una soluzione di custodia per altri. Ogni portafoglio ha le proprie chiavi API e non c'è limite al numero di portafogli che si possono creare. La possibilità di suddividere i fondi rende LNbits uno strumento utile per la gestione del denaro e come strumento di sviluppo. Le estensioni aggiungono ulteriori funzionalità a LNbits, consentendo di sperimentare una serie di tecnologie all'avanguardia sulla rete Lightning. Abbiamo reso lo sviluppo delle estensioni il più semplice possibile e, in quanto progetto libero e open-source, incoraggiamo le persone a sviluppare e inviare le proprie",export_to_phone:"Esportazione su telefono con codice QR",export_to_phone_desc:"Questo codice QR contiene l'URL del portafoglio con accesso da amministratore. È possibile scansionarlo dal telefono per aprire il portafoglio da lì.",wallet:"Portafoglio:",wallets:"Portafogli",add_wallet:"Aggiungi un nuovo portafoglio",delete_wallet:"Elimina il portafoglio",delete_wallet_desc:"L'intero portafoglio sarà cancellato, i fondi saranno irrecuperabili",rename_wallet:"Rinomina il portafoglio",update_name:"Aggiorna il nome",fiat_tracking:"Tracciamento Fiat",currency:"Valuta",update_currency:"Aggiorna valuta",press_to_claim:"Premi per richiedere bitcoin",donate:"Donazioni",view_github:"Visualizza su GitHub",voidwallet_active:"VoidWallet è attivo! Pagamenti disabilitati",use_with_caution:"USARE CON CAUTELA - {name} portafoglio è ancora in BETA",service_fee:"Commissione di servizio: {amount} % per transazione",service_fee_max:"Commissione di servizio: {amount} % per transazione (max {max} sats)",service_fee_tooltip:"Commissione di servizio addebitata dall'amministratore del server LNbits per ogni transazione in uscita",toggle_darkmode:"Attiva la modalità notturna",payment_reactions:"Reazioni al Pagamento",view_swagger_docs:"Visualizza i documentazione dell'API Swagger di LNbits",api_docs:"Documentazione dell'API",api_keys_api_docs:"URL del nodo, chiavi API e documentazione API",api_keys_warning:"Queste chiavi devono essere conservate al sicuro; condividerle potrebbe causare la perdita di fondi.",admin_key_warning:"La tua chiave di amministratore concede accesso completo al tuo portafoglio, inclusa la possibilità di inviare pagamenti. Non condividerla mai, a meno che tu non ti fidi completamente del destinatario.",lnbits_version:"Versione di LNbits",runs_on:"Esegue su",paste:"Incolla",paste_from_clipboard:"Incolla dagli appunti",paste_request:"Richiesta di pagamento",create_invoice:"Crea fattura",camera_tooltip:"Usa la fotocamera per scansionare la fattura/QR",export_csv:"Esporta CSV",chart_tooltip:"Mostra grafico",pending:"In attesa",copy_invoice:"Copia fattura",withdraw_from:"Prelevare da",cancel:"Annulla",scan:"Scansiona",read:"Leggi",pay:"Paga",memo:"Memo",date:"Dati",payment_processing:"Elaborazione pagamento...",not_enough_funds:"Non ci sono abbastanza fondi!",search_by_tag_memo_amount:"Cerca per tag, memo, importo...",invoice_waiting:"Fattura in attesa di pagamento",payment_received:"Pagamento ricevuto",payment_sent:"Pagamento inviato",receive:"ricevere",send:"inviare",outgoing_payment_pending:"Pagamento in uscita in attesa",drain_funds:"Fondi di drenaggio",drain_funds_desc:"Questo è un codice QR LNURL-withdraw per prelevare tutti i fondi da questo portafoglio. Non condividerlo con nessuno. È compatibile con balanceCheck e balanceNotify, di conseguenza il vostro portafoglio può continuare a prelevare continuamente i fondi da qui dopo il primo prelievo",i_understand:"Ho capito",copy_wallet_url:"Copia URL portafoglio",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"La funzionalità di login sarà rilasciata in un futuro aggiornamento; per ora, assicuratevi di salvare tra i preferiti questa pagina per accedere nuovamente in futuro a questo portafoglio! Questo servizio è in fase BETA e non ci assumiamo alcuna responsabilità per la perdita all'accesso dei fondi",no_transactions:"Nessuna transazione effettuata",manage:"Gestisci",exchanges:"Scambi",extensions:"Estensioni",no_extensions:"Non ci sono estensioni installate :(",created:"Creato",search_extensions:"Estensioni di ricerca",extension_sources:"Fonti di estensione",ext_sources_hint:"Repository da cui è possibile scaricare le estensioni",ext_sources_label:"URL di origine (utilizzare solo la fonte ufficiale dell'estensione LNbits e fonti affidabili)",warning:"Attenzione",repository:"Deposito",confirm_continue:"Sei sicuro di voler continuare?",manage_extension_details:"Installa/disinstalla estensione",install:"Installare",uninstall:"Disinstalla",drop_db:"Rimuovi Dati",enable:"Abilita",pay_to_enable:"Paga per abilitare",enable_extension_details:"Attiva l'estensione per l'utente corrente",disable:"Disabilita",delete:"Elimina",installed:"Installato",activated:"Attivato",deactivated:"Disattivato",release_notes:"Note di Rilascio",activate_extension_details:"Rendi l'estensione disponibile/non disponibile per gli utenti",featured:"In primo piano",all:"Tutto",only_admins_can_install:"Solo gli account amministratore possono installare estensioni.",admin_only:"Solo amministratore",new_version:"Nuova Versione",extension_depends_on:"Dipende da:",extension_rating_soon:"Valutazioni in arrivo",extension_installed_version:"Versione installata",extension_uninstall_warning:"Stai per rimuovere l'estensione per tutti gli utenti.",uninstall_confirm:"Sì, Disinstalla",extension_db_drop_info:"Tutti i dati relativi all'estensione saranno cancellati permanentemente. Non c'è modo di annullare questa operazione!",extension_db_drop_warning:"Stai per rimuovere tutti i dati per l'estensione. Digita il nome dell'estensione per continuare:",extension_required_lnbits_version:"Questa versione richiede almeno la versione LNbits",min_version:"Minimo (incluso)",max_version:"Massimo (escluso)",payment_hash:"Hash del pagamento",fee:"Tariffa",amount:"Importo",amount_sats:"Importo (sats)",tag:"Etichetta",unit:"Unità",description:"Descrizione",expiry:"Scadenza",webhook:"Webhook",payment_proof:"Prova di pagamento",update:"Aggiorna",update_available:"Aggiornamento {version} disponibile!",latest_update:"Sei sulla versione più recente {version}.",notifications:"Notifiche",no_notifications:"Nessuna notifica",notifications_disabled:"Le notifiche di stato di LNbits sono disattivate.",enable_notifications:"Attiva le notifiche",enable_notifications_desc:"Se attivato, recupererà gli ultimi aggiornamenti sullo stato di LNbits, come incidenti di sicurezza e aggiornamenti.",enable_watchdog:"Attiva Watchdog",enable_watchdog_desc:"Se abilitato, cambierà automaticamente la tua fonte di finanziamento in VoidWallet se il tuo saldo è inferiore al saldo LNbits. Dovrai abilitarlo manualmente dopo un aggiornamento.",watchdog_interval:"Intervallo Watchdog",watchdog_interval_desc:"Quanto spesso il task in background dovrebbe controllare un segnale di killswitch nel delta del watchdog [node_balance - lnbits_balance] (in minuti).",watchdog_delta:"Guardiano Delta",watchdog_delta_desc:"Limite prima che l'interruttore di sicurezza modifichi la fonte di finanziamento in VoidWallet [lnbits_balance - node_balance > delta]",status:"Stato",notification_source:"Sorgente di notifica",notification_source_label:"URL sorgente (utilizzare solo la fonte ufficiale di stato LNbits e fonti di cui ti puoi fidare)",more:"più",less:"meno",releases:"Pubblicazioni",watchdog:"Cane da guardia",server_logs:"Registri del server",ip_blocker:"Blocco IP",security:"Sicurezza",security_tools:"Strumenti di sicurezza",block_access_hint:"Blocca l'accesso per IP",allow_access_hint:"Consenti l'accesso per IP (sovrascriverà gli IP bloccati)",enter_ip:"Inserisci l'IP e premi invio",rate_limiter:"Limitatore di frequenza",wallet_limiter:"Limitatore del Portafoglio",wallet_limit_max_withdraw_per_day:"Prelievo massimo giornaliero dal portafoglio in sats (0 per disabilitare)",wallet_max_ballance:"Saldo massimo del portafoglio in sats (0 per disabilitare)",wallet_limit_secs_between_trans:"Minuti e secondi tra transazioni per portafoglio (0 per disabilitare)",number_of_requests:"Numero di richieste",time_unit:"Unità di tempo",minute:"minuto",second:"secondo",hour:"ora",disable_server_log:"Disabilita Registro Server",enable_server_log:"Attiva Registro Server",coming_soon:"Caratteristica in arrivo prossimamente",session_has_expired:"La tua sessione è scaduta. Per favore, effettua nuovamente il login.",instant_access_question:"Vuoi accesso immediato?",login_with_user_id:"Accedi con ID utente",or:"oppure",create_new_wallet:"Crea nuovo portafoglio",login_to_account:"Accedi al tuo account",create_account:"Crea un account",account_settings:"Impostazioni dell'account",signin_with_nostr:"Continua con Nostr",signin_with_google:"Accedi con Google",signin_with_github:"Accedi con GitHub",signin_with_keycloak:"Accedi con Keycloak",username_or_email:"Nome utente o Email",password:"Password",password_config:"Configurazione della password",password_repeat:"Ripeti la password",change_password:"Cambia Password",update_credentials:"Aggiorna credenziali",update_pubkey:"Aggiorna chiave pubblica",set_password:"Imposta password",invalid_password:"La password deve contenere almeno 8 caratteri",login:"Accesso",register:"Registrati",username:"Nome utente",pubkey:"Chiave pubblica",user_id:"ID utente",email:"Email",first_name:"Nome",last_name:"Cognome",picture:"Immagine",verify_email:"Verifica email con",account:"Conto",update_account:"Aggiorna Account",invalid_username:"Nome utente non valido",auth_provider:"Provider di Autenticazione",my_account:"Il mio account",back:"Indietro",logout:"Esci",look_and_feel:"Aspetto e Comportamento",toggle_gradient:"Attiva/disattiva gradiente",gradient_background:"Sfondo sfumato",language:"Lingua",color_scheme:"Schema dei colori",admin_settings:"Impostazioni di amministrazione",extension_cost:"Questa versione richiede un pagamento minimo di {cost} satoshi.",extension_paid_sats:"Hai già pagato {paid_sats} sats.",release_details_error:"Impossibile ottenere i dettagli della versione.",pay_from_wallet:"Paga dal Portafoglio",wallet_required:"Portafoglio *",show_qr:"Mostra QR",retry_install:"Riprova Installazione",new_payment:"Effettua Nuovo Pagamento",update_payment:"Aggiorna Pagamento",already_paid_question:"Hai già pagato?",sell:"Vendi",sell_require:"Chiedi il pagamento per abilitare l'estensione",sell_info:"L'estensione {name} richiede un pagamento minimo di {amount} sats per essere abilitata.",hide_empty_wallets:"Nascondi portafogli vuoti",recheck:"Ricontrolla",contributors:"Contributori",license:"Licenza",reset_key:"Reimposta Chiave",reset_password:"Reimposta password",border_choices:"Scelte del bordo",select_all:"Seleziona tutto",nfc_supported:"Supportato NFC",nfc_not_supported:"NFC non supportato",expire_date:"Data di scadenza:",hash:"Hash:",welcome_lnbits:"Benvenuto in LNbits",setup_su_account:"Configura l'account Superuser qui sotto.",create_ticker_converter:"Crea Convertitore di Simboli di Valuta",enable_audit:"Abilita controllo",recommended:"Consigliato",audit_desc:"Registrare le richieste HTTP secondo i filtri specificati",audit_record_req:"Registra il corpo della richiesta",audit_record_warning:"Avvertimento:",audit_record_req_warning_1:"I dati riservati (come le password) verranno registrati.",audit_record_req_warning_2:"il corpo della richiesta può avere grandi dimensioni.",audit_record_use:"Usalo con cautela.",audit_ip:"Registrare l'indirizzo IP",audit_ip_desc:"Registra l'indirizzo IP del cliente",audit_path_params:"Registra i parametri del percorso",audit_query_params:"Registrare i parametri di query",audit_http_methods:"Includi i metodi HTTP",audit_http_methods_hint:"Elenco di metodi HTTP da includere. Liste vuote significano tutti.",audit_http_methods_label:"Metodi HTTP",audit_resp_codes:"Includere codici di risposta HTTP",audit_resp_codes_hint:"Elenco dei codici HTTP da includere (corrispondenza regex). Liste vuote significano tutto. Ad esempio: 4.*, 5.*",audit_resp_codes_label:"Codice di risposta HTTP (regex)",audit_paths:"Includi percorsi",audit_paths_hint:"Elenco dei percorsi da includere (corrispondenza regex). Elenco vuoto significa tutto.",audit_paths_label:"Percorso HTTP (regex)",audit_paths_exclude:"Escludi percorsi",audit_paths_exclude_hint:"Elenco dei percorsi da escludere (corrispondenza regex). Un elenco vuoto significa nessuno.",audit_paths_exclude_label:"Percorso HTTP (regex)",exchange_providers:"Fornitori di scambio",admin_extensions:"Estensioni Admin",admin_extensions_label:"Estensioni amministrative",admin_extensions_hint:"Solo un utente con privilegi di amministratore può utilizzare le estensioni.",user_default_extensions:"Estensioni predefinite dell'utente",user_default_extensions_label:"Estensioni utente",user_default_extensions_hint:"Estensioni che saranno abilitate di default per gli utenti.",miscellanous:"Varie",misc_disable_extensions:"Disabilita estensioni",misc_disable_extensions_label:"Disabilita tutte le estensioni",misc_hide_api:"Nascondi API",misc_hide_api_label:"Nasconde l'api del portafoglio, le estensioni possono scegliere di onorare",wallets_management:"Gestione dei portafogli",funding_source_info:"Informazioni sulla fonte di finanziamento",funding_source:"Fonte di finanziamento: {wallet_class}",node_balance:"Saldo Nodo: {balance} sats",lnbits_balance:"Saldo LNbits: {balance} sats",funding_reserve_percent:"Riserva Percentuale: {percent} %",node_management:"Gestione dei nodi",node_management_not_supported:"La gestione dei nodi non è supportata dalla fonte di finanziamento attiva.",toggle_node_ui:"Interfaccia utente del nodo",toggle_public_node_ui:"Interfaccia Utente Nodo Pubblico",toggle_transactions_node_ui:"Scheda Transazioni (Disabilita su nodi CLN grandi)",invoice_expiry:"Scadenza fattura",invoice_expiry_label:"Scadenza fattura (secondi)",fee_reserve:"Riserva delle commissioni",fee_reserve_msats:"Tariffa di prenotazione in msats",fee_reserve_percent:"Commissione di riserva in percentuale",server_management:"Gestione server",base_url:"URL di base",base_url_label:"URL statica/base per il server",authentication:"Autenticazione",auth_token_expiry_label:"Minuti di scadenza del token",auth_token_expiry_hint:"Tempo in minuti fino alla scadenza del token",auth_allowed_methods_label:"Metodi di autorizzazione consentiti",auth_allowed_methods_hint:"Seleziona i metodi di autorizzazione",auth_nostr_label:"URL richiesta Nostr",auth_nostr_hint:"URL assoluto che i clienti utilizzeranno per accedere.",auth_google_ci_label:"ID client di Google",auth_google_ci_hint:"Assicurati che gli URI di reindirizzamento autorizzati contengano https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"ID client di GitHub",auth_gh_client_id_hint:"Assicurati che l'URL di callback dell'autorizzazione sia impostato su https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Segreto Client GitHub",auth_keycloak_label:"URL di individuazione di Keycloak",auth_keycloak_ci_label:"ID client di Keycloak",auth_keycloak_ci_hint:"Assicurati che l'URL di callback dell'autorizzazione sia impostato su https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak Client Secret",auth_keycloak_custom_org_label:"Organizzazione personalizzata di Keycloak",auth_keycloak_custom_icon_label:"Icona personalizzata di Keycloak (URL)",auth_oidc_label:"URL di individuazione di OIDC",auth_oidc_ci_label:"ID client di OIDC",auth_oidc_ci_hint:"Assicurati che l'URL di callback dell'autorizzazione sia impostato su https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC Client Secret",auth_oidc_custom_org_label:"Nome organizzazione personalizzata OIDC (es. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Icona personalizzata di OIDC (URL)",currency_settings:"Impostazioni valuta",allowed_currencies:"Valute consentite",allowed_currencies_hint:"Limita il numero di valute fiat disponibili",default_account_currency:"Valuta predefinita del conto",default_account_currency_hint:"Valuta predefinita per la contabilità",service_fee_label:"Tassa di servizio (%)",service_fee_hint:"Tariffa addebitata per transazione (%)",service_fee_max_label:"Commissione di servizio max (sats)",service_fee_max_hint:"Commissione massima da addebitare in (sats)",fee_wallet:"Portafoglio delle commissioni",fee_wallet_label:"Portafoglio delle commissioni (ID portafoglio)",fee_wallet_hint:"ID portafoglio a cui inviare fondi",disable_fee:"Disabilita Commissione",disable_fee_internal:"Disabilita la commissione di servizio per i pagamenti interni",disable_fee_internal_desc:"Disabilita la commissione di servizio per i pagamenti Lightning interni",ui_management:"Gestione dell'interfaccia utente",ui_site_title:"Titolo del sito",ui_site_tagline:"Slogan del sito",ui_elements_enable:"Abilita elementi sulla homepage",ui_elements_disable:"Disabilita elementi sulla homepage",ui_toggle_elements_tip:"Rimuovi elementi della homepage come 'runs on' ecc.",ui_site_description:"Descrizione del sito",ui_site_description_hint:"Usa testo normale, Markdown o HTML grezzo",ui_default_wallet_name:"Nome predefinito del portafoglio",lnbits_wallet:"Portafoglio LNbits",denomination:"Denominazione",denomination_hint:"Il nome per il token FakeWallet",ui_qr_code_logo:"Logo del codice QR",ui_qr_code_logo_hint:"URL all'immagine del logo nel codice QR",ui_custom_badge:"Badge personalizzato",ui_custom_badge_label:"Badge personalizzato 'USARE CON CAUTELA - Il portafoglio LNbits è ancora in BETA'",ui_custom_badge_color_label:"Colore distintivo personalizzato",themes:"Temi",themes_hint:"Scegli i temi disponibili per gli utenti",custom_logo:"Logo personalizzato",custom_logo_hint:"URL all'immagine del logo",ad_space_title:"Titolo Spazio Pubblicitario",ad_space_title_label:"Supportato da",ad_slots:"Spazi pubblicitari",ad_slots_hint:"Percorso dell'URL e dell'immagine in formato CSV, le estensioni possono scegliere di rispettare",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Annunci abilitati",ads_disabled:"Annunci disabilitati",user_management:"Gestione utenti",admin_users:"Utenti amministratori",admin_users_hint:"Utenti con privilegi di amministratore",admin_users_label:"ID utente",allowed_users:"Utenti consentiti",allowed_users_hint:"Solo questi utenti possono usare LNbits",allowed_users_label:"ID utente",allow_creation_user:"Consenti la creazione di nuovi utenti",allow_creation_user_desc:"Consenti la creazione di nuovi utenti nella pagina indice",components:"Componenti",long_running_endpoints:"I primi 5 endpoint a lunga esecuzione",http_request_methods:"Metodi di richiesta HTTP",http_response_codes:"Codici di risposta HTTP",request_details:"Dettagli della richiesta",http_request_details:"Dettagli della richiesta HTTP",block_explorer:"Block Explorer",enable_block_explorer:"Abilita Block Explorer",block_explorer_desc:"Consenti agli utenti di esplorare transazioni e indirizzi Bitcoin tramite Electrum.",blockexplorer_public_api:"Accesso API pubblico",blockexplorer_public_api_desc:"Consenti accesso non autenticato agli endpoint API dell'esploratore di blocchi.",electrum_server_url:"URL server Electrum",electrum_server_url_hint:"es. ssl://electrum.blockstream.info:50002 o tcp://localhost:50001",blockexplorer_search_label:"Cerca per TXID o indirizzo",blockexplorer_search_hint:"Hex 64 caratteri = transazione · altro = indirizzo Bitcoin",recent_blocks:"Blocchi recenti",chain_tip:"Punta della catena",block_height:"Altezza blocco",block_fee:"commissione blocco",fee_estimates:"Stime delle commissioni",confirmed_balance:"Saldo confermato",unconfirmed_balance:"Saldo non confermato",transaction_history:"Storico transazioni",coinbase:"Coinbase",inputs:"Input",outputs:"Output",confirmations:"Conferme",confirmed:"Confermato",unconfirmed:"Non confermato",history_unavailable:"Storico transazioni non disponibile (l'indirizzo ha troppe transazioni)",address:"Indirizzo",block_number:"Blocco #{height}",block_diff:"diff {value}",block_hash:"Hash",previous_block:"Blocco precedente",merkle_root:"Radice di Merkle",version:"Versione",bits:"Bit",difficulty:"Difficoltà",nonce:"Nonce",txid:"TXID",vsize:"Dimensione virtuale",weight:"Peso",n_block_fee:"commissione {n} blocchi"},window.localisation.jp={confirm:"はい",server:"サーバー",theme:"テーマ",site_customisation:"サイトカスタマイズ",funding:"資金調達",users:"ユーザー",audit:"監査",apps:"アプリ",channels:"チャンネル",transactions:"トランザクション",dashboard:"ダッシュボード",node:"ノード",export_users:"ユーザーのエクスポート",no_users:"ユーザーが見つかりません",total_capacity:"合計容量",avg_channel_size:"平均チャンネルサイズ",biggest_channel_size:"最大チャネルサイズ",smallest_channel_size:"最小チャンネルサイズ",number_of_channels:"チャンネル数",active_channels:"アクティブチャンネル",connect_peer:"ピアを接続",connect:"接続",open_channel:"オープンチャンネル",open:"開く",close_channel:"チャンネルを閉じる",close:"閉じる",restart:"サーバーを再起動する",save:"保存",save_tooltip:"変更を保存する",credit_debit:"クレジット / デビット",credit_hint:"クレジットカードを使用して資金を追加するには、LNbitsを使用してください。",credit_label:"{denomination} をクレジットに",restart_tooltip:"サーバーを再起動して変更を適用します",add_funds_tooltip:"ウォレットに資金を追加します。",reset_defaults:"リセット",reset_defaults_tooltip:"すべての設定を削除してデフォルトに戻します。",download_backup:"データベースのバックアップをダウンロードする",name_your_wallet:"あなたのウォレットの名前 {name}",paste_invoice_label:"請求書を貼り付けてください",lnbits_description:"簡単にインストールでき、軽量なLNbitsは、あらゆるライトニングネットワークの資金源と、LNbits自身でさえも実行できます!LNbitsを個人で実行することも、他人に対してカストディアンソリューションをで実行できます! LNbitsを自分で実行することも、他の人に優れたソリューションを提供することもできます。各ウォレットには独自のAPIキーがあり、作成できるウォレットの数に制限はありません。資金を分割する機能は、LNbitsを資金管理ツールとして使用したり、開発ツールとして使用したりするための便利なツールです。拡張機能は、LNbitsに追加の機能を追加します。そのため、LNbitsは最先端の技術をネットワークLightningで試すことができます。拡張機能を開発するのは簡単で、無料でオープンソースのプロジェクトであるため、人々が自分で開発し、自分の貢献を送信することを奨励しています。",export_to_phone:"電話にエクスポート",export_to_phone_desc:"ウォレットを電話にエクスポートすると、ウォレットを削除する前にウォレットを復元できます。ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。",wallet:"ウォレット:",wallets:"ウォレット",add_wallet:"ウォレットを追加",delete_wallet:"ウォレットを削除",delete_wallet_desc:"ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。",rename_wallet:"ウォレットの名前を変更",update_name:"名前を更新",fiat_tracking:"フィアット追跡",currency:"通貨",update_currency:"通貨を更新する",press_to_claim:"クレームするには押してください",donate:"寄付",view_github:"GitHubで表示",voidwallet_active:"Voidwalletアクティブ",use_with_caution:"注意して使用してください - {name} ウォレットはまだベータ版です",service_fee:"取引ごとのサービス手数料: {amount} %",service_fee_max:"取引手数料:{amount}%(最大{max}サトシ)",service_fee_tooltip:"LNbitsサーバー管理者が発生する送金ごとの手数料",toggle_darkmode:"ダークモードを切り替える",payment_reactions:"支払いの反応",view_swagger_docs:"Swaggerドキュメントを表示",api_docs:"APIドキュメント",api_keys_api_docs:"ノードURL、APIキー、APIドキュメント",api_keys_warning:"これらのキーは安全に保管してください。共有すると資金を失うおそれがあります。",admin_key_warning:"管理者キーは、支払いの送信を含むウォレットへの完全なアクセスを許可します。受取人を完全に信頼している場合を除き、決して共有しないでください。",lnbits_version:"LNbits バージョン",runs_on:"で実行",paste:"貼り付け",paste_from_clipboard:"クリップボードから貼り付け",paste_request:"リクエストを貼り付ける",create_invoice:"請求書を作成する",camera_tooltip:"QRコードを読み取る",export_csv:"CSVでエクスポート",chart_tooltip:"チャートを表示するには、グラフの上にカーソルを合わせます",pending:"保留中",copy_invoice:"請求書をコピー",withdraw_from:"出金",cancel:"キャンセル",scan:"スキャン",read:"読む",pay:"支払う",memo:"メモ",date:"日付",payment_processing:"支払い処理中",not_enough_funds:"資金が不足しています",search_by_tag_memo_amount:"タグ、メモ、金額で検索",invoice_waiting:"請求書を待っています",payment_received:"お支払いありがとうございます",payment_sent:"支払いが完了しました",receive:"受け取る",send:"送信",outgoing_payment_pending:"支払い保留中",drain_funds:"資金を排出する",drain_funds_desc:"ウォレットの残高をすべて他のウォレットに送金します",i_understand:"理解した",copy_wallet_url:"ウォレットURLをコピー",disclaimer_dialog_title:"重要!",disclaimer_dialog:"ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。ウォレットを削除する前に、ウォレットをエクスポートしてください。",no_transactions:"トランザクションはありません",manage:"管理",exchanges:"取引所",extensions:"拡張機能",no_extensions:"拡張機能はありません",created:"作成済み",search_extensions:"検索拡張機能",extension_sources:"拡張ソース",ext_sources_hint:"拡張機能をダウンロードできるリポジトリ",ext_sources_label:"ソースURL(公式のLNbits拡張ソースおよび信頼できるソースのみを使用してください)",warning:"警告",repository:"リポジトリ",confirm_continue:"続行してもよろしいですか?",manage_extension_details:"拡張機能のインストール/アンインストール",install:"インストール",uninstall:"アンインストール",drop_db:"データを削除",enable:"有効",pay_to_enable:"有効にするために支払う",enable_extension_details:"現在のユーザーの拡張機能を有効にする",disable:"無効",delete:"削除",installed:"インストール済み",activated:"有効化",deactivated:"無効化",release_notes:"リリースノート",activate_extension_details:"拡張機能をユーザーが利用できるようにする/利用できないようにする",featured:"特集",all:"すべて",only_admins_can_install:"(管理者アカウントのみが拡張機能をインストールできます)",admin_only:"管理者のみ",new_version:"新しいバージョン",extension_depends_on:"依存先:",extension_rating_soon:"評価は近日公開",extension_installed_version:"インストール済みバージョン",extension_uninstall_warning:"すべてのユーザーの拡張機能を削除しようとしています.",uninstall_confirm:"はい、アンインストールします",extension_db_drop_info:"エクステンションのすべてのデータが完全に削除されます。この操作を元に戻す方法はありません!",extension_db_drop_warning:"エクステンションのすべてのデータを削除しようとしています。続行するには、エクステンションの名前を入力してください:",extension_required_lnbits_version:"このリリースには少なくとも LNbits バージョンが必要です",min_version:"最小値(含む)",max_version:"最大(除外)",payment_hash:"支払いハッシュ",fee:"料金",amount:"量",amount_sats:"金額 (サッツ)",tag:"タグ",unit:"単位",description:"説明",expiry:"有効期限",webhook:"ウェブフック",payment_proof:"支払い証明",update:"更新",update_available:"アップデート{version}が利用可能です!",latest_update:"あなたは最新バージョン{version}を使用しています。",notifications:"通知",no_notifications:"通知はありません",notifications_disabled:"LNbitsステータス通知は無効です。",enable_notifications:"通知を有効にする",enable_notifications_desc:"有効にすると、セキュリティインシデントやアップデートのような最新のLNbitsステータス更新を取得します。",enable_watchdog:"ウォッチドッグを有効にする",enable_watchdog_desc:"有効にすると、残高がLNbitsの残高より少ない場合に、資金源を自動的にVoidWalletに変更します。アップデート後は手動で有効にする必要があります。",watchdog_interval:"ウォッチドッグ・インターバル",watchdog_interval_desc:"バックグラウンドタスクがウォッチドッグデルタ[node_balance - lnbits_balance]でキルスイッチシグナルを確認する頻度(分単位)。",watchdog_delta:"ウォッチドッグデルタ",watchdog_delta_desc:"キルスイッチが資金源をVoidWalletに変更する前の限界 [lnbits_balance - node_balance > delta]",status:"ステータス",notification_source:"通知ソース",notification_source_label:"ソースURL(公式のLNbitsステータスソースのみを使用し、信頼できるソースのみを利用してください)",more:"より多くの",less:"少ない",releases:"リリース",watchdog:"ウォッチドッグ",server_logs:"サーバーログ",ip_blocker:"IPブロッカー",security:"セキュリティ",security_tools:"セキュリティツール",block_access_hint:"IPによるアクセスをブロック",allow_access_hint:"IPによるアクセスを許可する(ブロックされたIPを上書きします)",enter_ip:"IPを入力してエンターキーを押してください",rate_limiter:"レートリミッター",wallet_limiter:"ウォレットリミッター",wallet_limit_max_withdraw_per_day:"1日あたりの最大ウォレット出金額をsatsで入力してください(0 で無効)。",wallet_max_ballance:"ウォレットの最大残高(sats)(0は無効)",wallet_limit_secs_between_trans:"トランザクション間の最小秒数(ウォレットごと)(0は無効)",number_of_requests:"リクエストの数",time_unit:"時間単位",minute:"分",second:"秒",hour:"時間",disable_server_log:"サーバーログを無効にする",enable_server_log:"サーバーログを有効にする",coming_soon:"機能は間もなく登場します",session_has_expired:"あなたのセッションは期限切れです。もう一度ログインしてください。",instant_access_question:"即時アクセスをご希望ですか?",login_with_user_id:"ユーザーIDでログイン",or:"または",create_new_wallet:"新しいウォレットを作成",login_to_account:"アカウントにログインしてください",create_account:"アカウントを作成",account_settings:"アカウント設定",signin_with_nostr:"Nostrで続行",signin_with_google:"Googleでサインイン",signin_with_github:"GitHubでサインイン",signin_with_keycloak:"Keycloakでサインイン",username_or_email:"ユーザー名またはメールアドレス",password:"パスワード",password_config:"パスワード設定",password_repeat:"パスワードの再入力",change_password:"パスワードを変更",update_credentials:"資格情報を更新する",update_pubkey:"公開鍵を更新",set_password:"パスワードを設定",invalid_password:"パスワードは少なくとも8文字必要です",login:"ログイン",register:"登録",username:"ユーザー名",pubkey:"公開鍵",user_id:"ユーザーID",email:"メール",first_name:"名",last_name:"姓",picture:"写真",verify_email:"メールアドレスの確認を行ってください",account:"アカウント",update_account:"アカウントを更新",invalid_username:"無効なユーザー名",auth_provider:"認証プロバイダ",my_account:"マイアカウント",back:"戻る",logout:"ログアウト",look_and_feel:"ルック・アンド・フィール",toggle_gradient:"グラデーションを切り替える",gradient_background:"グラデーション背景",language:"言語",color_scheme:"カラースキーム",admin_settings:"管理設定",extension_cost:"このリリースには最低 {cost} サトシの支払いが必要です。",extension_paid_sats:"すでに{paid_sats} satsを支払いました。",release_details_error:"リリースの詳細を取得できません。",pay_from_wallet:"ウォレットから支払う",wallet_required:"ウォレット *",show_qr:"QRを表示",retry_install:"再試行インストール",new_payment:"新しい支払いを作成する",update_payment:"支払いを更新する",already_paid_question:"すでに支払いましたか?",sell:"販売する",sell_require:"拡張を有効にするために支払いを求める",sell_info:"{name}拡張機能を有効にするには、最小{amount}サツの支払いが必要です。",hide_empty_wallets:"空のウォレットを非表示にする",recheck:"再確認",contributors:"貢献者",license:"ライセンス",reset_key:"リセットキー",reset_password:"パスワードをリセットする",border_choices:"境界の選択肢",select_all:"すべて選択",nfc_supported:"NFC対応",nfc_not_supported:"NFCがサポートされていません",expire_date:"有効期限日:",hash:"ハッシュ:",welcome_lnbits:"LNbitsへようこそ",setup_su_account:"スーパーアカウントを以下に設定してください。",create_ticker_converter:"通貨ティッカーコンバーターを作成",enable_audit:"監査を有効にする",recommended:"推奨",audit_desc:"指定されたフィルターに従ってHTTPリクエストを記録する",audit_record_req:"リクエストボディの記録",audit_record_warning:"警告:",audit_record_req_warning_1:"パスワードなどの機密データが記録されます。",audit_record_req_warning_2:"リクエストボディは大きなサイズになる可能性があります。",audit_record_use:"注意して使用してください。",audit_ip:"IPアドレスを記録する",audit_ip_desc:"クライアントのIPアドレスを記録する",audit_path_params:"パスパラメータを記録",audit_query_params:"クエリパラメータを記録する",audit_http_methods:"HTTPメソッドを含める",audit_http_methods_hint:"含めるHTTPメソッドのリスト。空のリストはすべてを意味します。",audit_http_methods_label:"HTTPメソッド",audit_resp_codes:"HTTPレスポンスコードを含める",audit_resp_codes_hint:"含めるHTTPコードの一覧(正規表現で一致)。空のリストはすべてを意味します。例: 4.*, 5.*",audit_resp_codes_label:"HTTPレスポンスコード(正規表現)",audit_paths:"パスを含める",audit_paths_hint:"含めるパスのリスト(正規表現マッチ)。空のリストはすべてを意味します。",audit_paths_label:"HTTP パス (正規表現)",audit_paths_exclude:"パスを除外",audit_paths_exclude_hint:"除外するパスの一覧(正規表現の一致)。空のリストは対象がないことを意味します。",audit_paths_exclude_label:"HTTP パス (正規表現)",exchange_providers:"取引所プロバイダー",admin_extensions:"管理拡張機能",admin_extensions_label:"管理者拡張機能",admin_extensions_hint:"拡張機能は管理者権限を持つユーザーのみが使用できます",user_default_extensions:"ユーザーデフォルト拡張機能",user_default_extensions_label:"ユーザー拡張機能",user_default_extensions_hint:"ユーザーに対してデフォルトで有効化される拡張機能。",miscellanous:"その他",misc_disable_extensions:"拡張機能を無効にする",misc_disable_extensions_label:"すべての拡張機能を無効にする",misc_hide_api:"APIを非表示",misc_hide_api_label:"ウォレットAPIを隠すことができ、拡張機能は尊重することを選ぶことができます。",wallets_management:"ウォレット管理",funding_source_info:"資金源情報",funding_source:"資金源: {wallet_class}",node_balance:"ノード残高: {balance} サッツ",lnbits_balance:"LNbits残高: {balance} sats",funding_reserve_percent:"予約パーセント: {percent} %",node_management:"ノード管理",node_management_not_supported:"アクティブな資金源ではノード管理がサポートされていません",toggle_node_ui:"ノードUI",toggle_public_node_ui:"パブリックノードUI",toggle_transactions_node_ui:"トランザクションタブ(大規模なCLNノードで無効化)",invoice_expiry:"インボイスの有効期限",invoice_expiry_label:"インボイスの有効期限(秒)",fee_reserve:"料金予約",fee_reserve_msats:"ミリサトシでの予約手数料",fee_reserve_percent:"パーセンテージの予約料",server_management:"サーバー管理",base_url:"ベースURL",base_url_label:"サーバーの静的/基本URL",authentication:"認証",auth_token_expiry_label:"トークン有効期限(分)",auth_token_expiry_hint:"トークンが失効するまでの時間(分)",auth_allowed_methods_label:"許可された認証方法",auth_allowed_methods_hint:"認証方法を選択",auth_nostr_label:"Nostr リクエスト URL",auth_nostr_hint:"クライアントがログインするために使用する絶対URL。",auth_google_ci_label:"Google クライアントID",auth_google_ci_hint:"認可されたリダイレクトURIにhttps://{domain}/api/v1/auth/google/tokenが含まれていることを確認してください",auth_google_cs_label:"Google クライアントシークレット",auth_gh_client_id_label:"GitHub クライアントID",auth_gh_client_id_hint:"認証コールバックURLがhttps://{domain}/api/v1/auth/github/tokenに設定されていることを確認してください。",auth_gh_client_secret_label:"GitHub クライアントシークレット",auth_keycloak_label:"キーコーク ディスカバリー URL",auth_keycloak_ci_label:"Keycloak クライアント ID",auth_keycloak_ci_hint:"認証コールバックURLが https://{domain}/api/v1/auth/keycloak/token に設定されていることを確認してください。",auth_keycloak_cs_label:"キークローククライアントシークレット",auth_keycloak_custom_org_label:"Keycloak カスタム組織",auth_keycloak_custom_icon_label:"Keycloak カスタムアイコン (URL)",auth_oidc_label:"OIDC ディスカバリー URL",auth_oidc_ci_label:"OIDC クライアント ID",auth_oidc_ci_hint:"認証コールバックURLが https://{domain}/api/v1/auth/oidc/token に設定されていることを確認してください。",auth_oidc_cs_label:"OIDC クライアントシークレット",auth_oidc_custom_org_label:"OIDC カスタム組織名(例:Zitadel、Authentik)",auth_oidc_custom_icon_label:"OIDC カスタムアイコン (URL)",currency_settings:"通貨設定",allowed_currencies:"許可されている通貨",allowed_currencies_hint:"利用可能な法定通貨の数を制限する",default_account_currency:"デフォルト口座通貨",default_account_currency_hint:"会計のデフォルト通貨",service_fee_label:"サービス料 (%)",service_fee_hint:"1 取引あたりの手数料 (%)",service_fee_max_label:"サービス料最大 (sats)",service_fee_max_hint:"(サット)での最大サービス料金",fee_wallet:"手数料ウォレット",fee_wallet_label:"手数料ウォレット (ウォレットID)",fee_wallet_hint:"送金先のウォレットID",disable_fee:"手数料を無効にする",disable_fee_internal:"内部支払に対するサービス手数料を無効にする",disable_fee_internal_desc:"内部のライトニングペイメントのサービス料金を無効にする",ui_management:"UI管理",ui_site_title:"サイトのタイトル",ui_site_tagline:"サイトのタグライン",ui_elements_enable:"ホームページの要素を有効にする",ui_elements_disable:"ホームページの要素を無効にする",ui_toggle_elements_tip:"「runs on」などのホームページ要素を削除します。",ui_site_description:"サイトの説明",ui_site_description_hint:"プレーンテキスト、Markdown、または生のHTMLを使用してください。",ui_default_wallet_name:"デフォルトウォレット名",lnbits_wallet:"LNbitsウォレット",denomination:"額面",denomination_hint:"FakeWalletトークンの名前",ui_qr_code_logo:"QRコードロゴ",ui_qr_code_logo_hint:"QRコードのロゴ画像のURL",ui_custom_badge:"カスタムバッジ",ui_custom_badge_label:"カスタムバッジ「使用に注意 - LNbitsウォレットはまだベータ版です」",ui_custom_badge_color_label:"カスタムバッジカラー",themes:"テーマ",themes_hint:"ユーザーが利用可能なテーマを選択してください",custom_logo:"カスタムロゴ",custom_logo_hint:"ロゴ画像へのURL",ad_space_title:"広告スペースのタイトル",ad_space_title_label:"サポートされています",ad_slots:"広告スロット",ad_slots_hint:"CSV形式の広告URLと画像ファイルパス、拡張機能は遵守することを選択できます",ad_slots_label:"URL;img_light_url;img_dark_url、URL...",ads_enabled:"広告が有効になっています",ads_disabled:"広告が無効になっています",user_management:"ユーザー管理",admin_users:"管理者ユーザー",admin_users_hint:"管理者権限を持つユーザー",admin_users_label:"ユーザーID",allowed_users:"許可されたユーザー",allowed_users_hint:"これらのユーザーのみがLNbitsを使用できます。",allowed_users_label:"ユーザーID",allow_creation_user:"新しいユーザーの作成を許可",allow_creation_user_desc:"インデックスページで新しいユーザーの作成を許可する",components:"コンポーネント",long_running_endpoints:"トップ5の長時間実行エンドポイント",http_request_methods:"HTTPリクエストメソッド",http_response_codes:"HTTPレスポンスコード",request_details:"リクエストの詳細",http_request_details:"HTTPリクエストの詳細",block_explorer:"ブロックエクスプローラー",enable_block_explorer:"ブロックエクスプローラーを有効化",block_explorer_desc:"Electrumを介してビットコインのトランザクションとアドレスを探索できます。",blockexplorer_public_api:"パブリックAPIアクセス",blockexplorer_public_api_desc:"ブロックエクスプローラーAPIエンドポイントへの非認証アクセスを許可します。",electrum_server_url:"ElectrumサーバーURL",electrum_server_url_hint:"例: ssl://electrum.blockstream.info:50002 または tcp://localhost:50001",blockexplorer_search_label:"TXIDまたはアドレスで検索",blockexplorer_search_hint:"64文字の16進数 = トランザクション · それ以外 = ビットコインアドレス",recent_blocks:"最新ブロック",chain_tip:"チェーン先端",block_height:"ブロック高さ",block_fee:"ブロック手数料",fee_estimates:"手数料見積もり",confirmed_balance:"確認済み残高",unconfirmed_balance:"未確認残高",transaction_history:"トランザクション履歴",coinbase:"コインベース",inputs:"インプット",outputs:"アウトプット",confirmations:"確認数",confirmed:"確認済み",unconfirmed:"未確認",history_unavailable:"トランザクション履歴が取得できません(アドレスのトランザクションが多すぎます)",address:"アドレス",block_number:"ブロック #{height}",block_diff:"diff {value}",block_hash:"ハッシュ",previous_block:"前のブロック",merkle_root:"マークルルート",version:"バージョン",bits:"Bits",difficulty:"難易度",nonce:"Nonce",txid:"TXID",vsize:"仮想サイズ",weight:"重量",n_block_fee:"{n}ブロック手数料"},window.localisation.cn={confirm:"确定",server:"服务器",theme:"主题",site_customisation:"网站定制",funding:"资金",users:"用户",audit:"审计",apps:"应用程序",channels:"频道",transactions:"交易记录",dashboard:"控制面板",node:"节点",export_users:"导出用户",no_users:"未找到用户",total_capacity:"总容量",avg_channel_size:"平均频道大小",biggest_channel_size:"最大通道大小",smallest_channel_size:"最小频道尺寸",number_of_channels:"频道数量",active_channels:"活跃频道",connect_peer:"连接对等",connect:"连接",open_channel:"打开频道",open:"打开",close_channel:"关闭频道",close:"关闭",restart:"重新启动服务器",save:"保存",save_tooltip:"保存更改",credit_debit:"信用卡 / 借记卡",credit_hint:"按 Enter 键充值账户",credit_label:"{denomination} 充值",credit_ok:"成功记入/扣除虚拟资金 ({amount} sats)。付款取决于资金来源的实际资金。",restart_tooltip:"重新启动服务器以使更改生效",add_funds_tooltip:"为钱包添加资金",reset_defaults:"重置为默认设置",reset_defaults_tooltip:"删除所有设置并重置为默认设置",download_backup:"下载数据库备份",name_your_wallet:"给你的 {name}钱包起个名字",paste_invoice_label:"粘贴发票,付款请求或lnurl*",lnbits_description:"LNbits 设置简单、轻量级,可以在任何闪电网络的资金来源上运行,甚至可以在LNbits自身上运行!您可以为自己运行LNbits,或者轻松为他人提供托管解决方案。每个钱包都有自己的 API 密钥,你可以创建的钱包数量没有限制。能够把资金分开管理使 LNbits 成为一款有用的资金管理和开发工具。扩展程序增加了 LNbits 的额外功能,所以你可以在闪电网络上尝试各种尖端技术。我们已经尽可能简化了开发扩展程序的过程,作为一个免费和开源的项目,我们鼓励人们开发并提交自己的扩展程序。",export_to_phone:"通过二维码导出到手机",export_to_phone_desc:"这个二维码包含您钱包的URL。您可以使用手机扫描的方式打开您的钱包。",wallet:"钱包:",wallets:"钱包",add_wallet:"添加新钱包",delete_wallet:"删除钱包",delete_wallet_desc:"整个钱包将被删除,资金将无法恢复",rename_wallet:"重命名钱包",update_name:"更新名称",fiat_tracking:"菲亚特追踪",currency:"货币",update_currency:"更新货币",press_to_claim:"点击领取比特币",donate:"捐献",view_github:"在GitHub上查看",voidwallet_active:"VoidWallet 已激活!付款功能已禁用。",use_with_caution:"请谨慎使用 - {name}钱包还处于测试版阶段",service_fee:"服务费:{amount}% 每笔交易",service_fee_max:"服务费:{amount}% 每笔交易(最高 {max} sats)",service_fee_tooltip:"LNbits服务器管理员每笔外发交易收取的服务费",toggle_darkmode:"切换暗黑模式",payment_reactions:"支付反应",view_swagger_docs:"查看 LNbits Swagger API 文档",api_docs:"API文档",api_keys_api_docs:"节点URL、API密钥和API文档",api_keys_warning:"请妥善保管这些密钥,分享它们可能导致资金损失。",admin_key_warning:"您的管理员密钥可完全访问您的钱包,包括发送付款的权限。除非您完全信任接收者,否则切勿分享。",lnbits_version:"LNbits版本",runs_on:"可运行在",paste:"粘贴",paste_from_clipboard:"从剪贴板粘贴",paste_request:"粘贴请求",create_invoice:"创建发票",camera_tooltip:"用相机扫描发票/二维码",export_csv:"导出为CSV",chart_tooltip:"显示图表",pending:"待处理",copy_invoice:"复制发票",withdraw_from:"从",cancel:"取消",scan:"扫描",read:"读取",pay:"付款",memo:"备注",date:"日期",payment_processing:"正在处理支付...",not_enough_funds:"资金不足!",search_by_tag_memo_amount:"按标签、备注、金额搜索",invoice_waiting:"待支付的发票",payment_received:"收到付款",payment_sent:"付款已发送",receive:"收款",send:"付款",outgoing_payment_pending:"付款正在等待处理",drain_funds:"清空资金",drain_funds_desc:"这是一个 LNURL-取款的二维码,用于从该钱包中提取全部资金。请不要与他人分享。它与 balanceCheck 和 balanceNotify 兼容,因此在第一次取款后,您的钱包还可能会持续从这里提取资金",i_understand:"我明白",copy_wallet_url:"复制钱包URL",disclaimer_dialog_title:"重要!",disclaimer_dialog:"登录功能将在以后的更新中发布,请将此页面加为书签,以便将来访问您的钱包!此服务处于测试阶段,我们不对资金的丢失承担任何责任。",no_transactions:"尚未进行任何交易",manage:"管理",exchanges:"交易所",extensions:"扩展程序",no_extensions:"你没有安装任何扩展程序 :(",created:"已创建",search_extensions:"搜索扩展程序",extension_sources:"扩展源",ext_sources_hint:"可以下载扩展的存储库",ext_sources_label:"来源网址(仅使用官方LNbits扩展程序来源和您可以信任的来源)",warning:"警告",repository:"代码库",confirm_continue:"你确定要继续吗?",manage_extension_details:"安装/卸载扩展程序",install:"安装",uninstall:"卸载",drop_db:"删除数据",enable:"启用",pay_to_enable:"支付以启用",enable_extension_details:"为当前用户启用扩展程序",disable:"禁用",delete:"删除",installed:"已安装",activated:"已激活",deactivated:"已停用",release_notes:"发布说明",activate_extension_details:"对用户开放或禁用扩展程序",featured:"精选",all:"全部",only_admins_can_install:"(只有管理员账户可以安装扩展)",admin_only:"仅限管理员",new_version:"新版本",extension_depends_on:"依赖于:",extension_rating_soon:"即将推出评分",extension_installed_version:"已安装的版本",extension_uninstall_warning:"您即将对所有用户删除该扩展程序。",uninstall_confirm:"是的,卸载",extension_db_drop_info:"该扩展程序的所有数据将被永久删除。此操作无法撤销!",extension_db_drop_warning:"您即将删除该扩展的所有数据。请继续输入扩展程序名称以确认操作:",extension_required_lnbits_version:"此版本要求最低的 LNbits 版本为",min_version:"最小值(包含)",max_version:"最大值(不含)",payment_hash:"付款哈希",fee:"费",amount:"金额",amount_sats:"金额(聪)",tag:"标签",unit:"单位",description:"详情",expiry:"过期时间",webhook:"Webhook",payment_proof:"付款证明",update:"更新",update_available:"更新{version}可用!",latest_update:"您当前使用的是最新版本{version}。",notifications:"通知",no_notifications:"没有通知",notifications_disabled:"LNbits状态通知已禁用。",enable_notifications:"启用通知",enable_notifications_desc:"如果启用,它将获取最新的LNbits状态更新,如安全事件和更新。",enable_watchdog:"启用看门狗",enable_watchdog_desc:"如果启用,当您的余额低于LNbits余额时,系统将自动将您的资金来源更改为VoidWallet。更新后您将需要手动启用。",watchdog_interval:"看门狗间隔",watchdog_interval_desc:"后台任务应该多久检查一次看门狗增量中的 killswitch 信号 [node_balance - lnbits_balance](以分钟计)。",watchdog_delta:"看门狗德尔塔",watchdog_delta_desc:"在触发紧急停止前切换资金来源至VoidWallet的限制 [lnbits_balance - node_balance > delta]",status:"状态",notification_source:"通知来源",notification_source_label:"来源 URL(仅使用官方LNbits状态源和您信任的源)",more:"更多",less:"少",releases:"版本",watchdog:"监控程序",server_logs:"服务器日志",ip_blocker:"IP 阻止器",security:"安全",security_tools:"安全工具",block_access_hint:"屏蔽IP访问",allow_access_hint:"允许通过IP访问(将覆盖被屏蔽的IP)",enter_ip:"输入IP地址并按回车键",rate_limiter:"速率限制器",wallet_limiter:"钱包限制器",wallet_limit_max_withdraw_per_day:"每日钱包最大提现额度(单位:sats)(设为0则禁用)",wallet_max_ballance:"钱包最大余额(以sats计)(设为0则禁用)",wallet_limit_secs_between_trans:"每个钱包交易间最少秒数(设为0则禁用)",number_of_requests:"请求次数",time_unit:"时间单位",minute:"分钟",second:"秒",hour:"小时",disable_server_log:"禁用服务器日志",enable_server_log:"启用服务器日志",coming_soon:"功能即将推出",session_has_expired:"您的会话已过期。请重新登录。",instant_access_question:"想要即时访问吗?",login_with_user_id:"使用用户ID登录",or:"或",create_new_wallet:"创建新钱包",login_to_account:"登录您的账户",create_account:"创建账户",account_settings:"账户设置",signin_with_nostr:"继续使用 Nostr",signin_with_google:"使用谷歌账号登录",signin_with_github:"使用GitHub登录",signin_with_keycloak:"使用Keycloak登录",username_or_email:"用户名或电子邮箱",password:"密码",password_config:"密码配置",password_repeat:"密码重复",change_password:"修改密码",update_credentials:"更新凭证",update_pubkey:"更新公钥",set_password:"设置密码",invalid_password:"密码至少需要有8个字符",login:"登录",register:"注册",username:"用户名",pubkey:"公钥",user_id:"用户ID",email:"电子邮件",first_name:"名字",last_name:"姓氏",picture:"图片",verify_email:"验证电子邮件与",account:"账户",update_account:"更新帐户",invalid_username:"无效用户名",auth_provider:"认证提供者",my_account:"我的账户",back:"返回",logout:"注销",look_and_feel:"外观和感觉",toggle_gradient:"切换渐变",gradient_background:"渐变背景",language:"语言",color_scheme:"配色方案",admin_settings:"管理员设置",extension_cost:"此版本需要支付最低 {cost} sats。",extension_paid_sats:"您已经支付了{paid_sats} sats。",release_details_error:"无法获取发布详情。",pay_from_wallet:"从钱包支付",wallet_required:"钱包 *",show_qr:"显示QR码",retry_install:"重试安装",new_payment:"创建新支付",update_payment:"更新付款",already_paid_question:"你已经付款了吗?",sell:"出售",sell_require:"请求付款以启用扩展",sell_info:"{name} 扩展需要支付至少 {amount} sat 才能启用。",hide_empty_wallets:"隐藏空钱包",recheck:"重新检查",contributors:"贡献者们",license:"许可证",reset_key:"重置密钥",reset_password:"重置密码",border_choices:"边框选项",select_all:"全选",nfc_supported:"支持NFC",nfc_not_supported:"不支持NFC",expire_date:"有效期:",hash:"哈希:",welcome_lnbits:"欢迎来到LNbits",setup_su_account:"设置超级用户账户如下。",create_ticker_converter:"创建货币代码转换器",enable_audit:"启用审核",recommended:"推荐",audit_desc:"根据指定的过滤器记录HTTP请求",audit_record_req:"记录请求主体",audit_record_warning:"警告:",audit_record_req_warning_1:"机密数据(如密码)将被记录。",audit_record_req_warning_2:"请求主体可能会有较大尺寸。",audit_record_use:"请谨慎使用。",audit_ip:"记录 IP 地址",audit_ip_desc:"记录客户端的IP地址",audit_path_params:"记录路径参数",audit_query_params:"记录查询参数",audit_http_methods:"包括 HTTP 方法",audit_http_methods_hint:"要包含的 HTTP 方法列表。空列表表示全部。",audit_http_methods_label:"HTTP 方法",audit_resp_codes:"包括 HTTP 响应代码",audit_resp_codes_hint:"要包含的 HTTP 代码列表(正则表达式匹配)。空列表表示全部。例如:4.*,5.*",audit_resp_codes_label:"HTTP响应代码(正则表达式)",audit_paths:"包含路径",audit_paths_hint:"要包含的路径列表(正则表达式匹配)。空列表意味着全部。",audit_paths_label:"HTTP 路径(正则表达式)",audit_paths_exclude:"排除路径",audit_paths_exclude_hint:"要排除的路径列表(正则表达式匹配)。空列表表示没有。",audit_paths_exclude_label:"HTTP 路径(正则表达式)",exchange_providers:"兑换提供商",admin_extensions:"管理员扩展",admin_extensions_label:"管理员扩展件",admin_extensions_hint:"只有具有管理员权限的用户才能使用扩展程序",user_default_extensions:"用户默认扩展",user_default_extensions_label:"用户扩展",user_default_extensions_hint:"对用户默认启用的扩展。",miscellanous:"杂项",misc_disable_extensions:"禁用扩展程序",misc_disable_extensions_label:"禁用所有扩展程序",misc_hide_api:"隐藏 API",misc_hide_api_label:"隐藏钱包 api,扩展程序可以选择遵守",wallets_management:"钱包管理",funding_source_info:"资金来源信息",funding_source:"资金来源:{wallet_class}",node_balance:"节点余额:{balance} sats",lnbits_balance:"LNbits 余额:{balance} sats",funding_reserve_percent:"保留百分比: {percent} %",node_management:"节点管理",node_management_not_supported:"活动资金来源不支持节点管理",toggle_node_ui:"节点用户界面",toggle_public_node_ui:"公共节点用户界面",toggle_transactions_node_ui:"交易选项卡(在大型 CLN 节点上禁用)",invoice_expiry:"发票到期",invoice_expiry_label:"发票到期(秒)",fee_reserve:"费用储备",fee_reserve_msats:"以msats计的保留费",fee_reserve_percent:"以百分比计的保留费用",server_management:"服务器管理",base_url:"基本URL",base_url_label:"服务器的静态/基本网址",authentication:"认证",auth_token_expiry_label:"令牌过期分钟数",auth_token_expiry_hint:"令牌过期的剩余时间(分钟)",auth_allowed_methods_label:"允许的授权方法",auth_allowed_methods_hint:"选择授权方法",auth_nostr_label:"Nostr请求URL",auth_nostr_hint:"客户端将用于登录的绝对URL。",auth_google_ci_label:"谷歌客户ID",auth_google_ci_hint:"确保授权重定向URI包含https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google客户端密钥",auth_gh_client_id_label:"GitHub 客户端 ID",auth_gh_client_id_hint:"确保授权回调 URL 设置为 https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub客户端密码",auth_keycloak_label:"Keycloak 发现 URL",auth_keycloak_ci_label:"Keycloak 客户端 ID",auth_keycloak_ci_hint:"确保授权回调URL设置为https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak客户端密钥",auth_keycloak_custom_org_label:"Keycloak 自定义组织",auth_keycloak_custom_icon_label:"Keycloak 自定义图标 (URL)",auth_oidc_label:"OIDC 发现 URL",auth_oidc_ci_label:"OIDC 客户端 ID",auth_oidc_ci_hint:"确保授权回调URL设置为https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC客户端密钥",auth_oidc_custom_org_label:"OIDC 自定义组织名称(例如 Zitadel、Authentik)",auth_oidc_custom_icon_label:"OIDC 自定义图标 (URL)",currency_settings:"货币设置",allowed_currencies:"允许的货币",allowed_currencies_hint:"限制可用法定货币的数量",default_account_currency:"默认账户货币",default_account_currency_hint:"默认的会计货币",service_fee_label:"服务费 (%)",service_fee_hint:"每笔交易收取的费用 (%)",service_fee_max_label:"服务费最大值(聪)",service_fee_max_hint:"最大服务费以 (sats) 收取",fee_wallet:"费用钱包",fee_wallet_label:"费用钱包(钱包 ID)",fee_wallet_hint:"用于接收资金的钱包 ID",disable_fee:"禁用费用",disable_fee_internal:"禁用内部付款服务费",disable_fee_internal_desc:"禁用内部闪电支付的服务费",ui_management:"用户界面管理",ui_site_title:"网站标题",ui_site_tagline:"网站标语",ui_elements_enable:"在主页上启用元素",ui_elements_disable:"禁用主页上的元素",ui_toggle_elements_tip:"移除主页元素,例如“运行于”等。",ui_site_description:"网站描述",ui_site_description_hint:"使用纯文本、Markdown或原始HTML",ui_default_wallet_name:"默认钱包名称",lnbits_wallet:"LNbits 钱包",denomination:"面额",denomination_hint:"FakeWallet 代币的名称",ui_qr_code_logo:"二维码标志",ui_qr_code_logo_hint:"二维码中标志图像的 URL",ui_custom_badge:"自定义徽章",ui_custom_badge_label:"自定义徽章“慎用 - LNbits 钱包仍在测试阶段”",ui_custom_badge_color_label:"自定义徽章颜色",themes:"主题",themes_hint:"选择可供用户使用的主题",custom_logo:"自定义徽标",custom_logo_hint:"徽标图像的URL",ad_space_title:"广告位标题",ad_space_title_label:"由...支持",ad_slots:"广告位",ad_slots_hint:"广告网址和图像文件路径以CSV格式存储,扩展可以选择遵循。",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"启用广告",ads_disabled:"广告已禁用",user_management:"用户管理",admin_users:"管理员用户",admin_users_hint:"具有管理员权限的用户",admin_users_label:"用户ID",allowed_users:"允许的用户",allowed_users_hint:"仅这些用户可以使用LNbits",allowed_users_label:"用户 ID",allow_creation_user:"允许创建新用户",allow_creation_user_desc:"允许在索引页面上创建新用户",components:"组件",long_running_endpoints:"前五个长时间运行的端点",http_request_methods:"HTTP请求方法",http_response_codes:"HTTP响应代码",request_details:"请求详情",http_request_details:"HTTP请求详细信息",block_explorer:"区块浏览器",enable_block_explorer:"启用区块浏览器",block_explorer_desc:"允许用户通过 Electrum 浏览比特币交易和地址。",blockexplorer_public_api:"公开 API 访问",blockexplorer_public_api_desc:"允许对区块浏览器 API 端点的未认证访问。",electrum_server_url:"Electrum 服务器 URL",electrum_server_url_hint:"例如 ssl://electrum.blockstream.info:50002 或 tcp://localhost:50001",blockexplorer_search_label:"按 TXID 或地址搜索",blockexplorer_search_hint:"64位十六进制 = 交易 · 其他 = 比特币地址",recent_blocks:"最新区块",chain_tip:"链尖",block_height:"区块高度",block_fee:"区块手续费",fee_estimates:"手续费估算",confirmed_balance:"已确认余额",unconfirmed_balance:"未确认余额",transaction_history:"交易历史",coinbase:"Coinbase",inputs:"输入",outputs:"输出",confirmations:"确认数",confirmed:"已确认",unconfirmed:"未确认",history_unavailable:"交易历史不可用(地址交易过多)",address:"地址",block_number:"区块 #{height}",block_diff:"难度 {value}",block_hash:"哈希",previous_block:"上一区块",merkle_root:"Merkle 根",version:"版本",bits:"Bits",difficulty:"难度",nonce:"Nonce",txid:"TXID",vsize:"虚拟大小",weight:"权重",n_block_fee:"{n} 区块手续费"},window.localisation.nl={confirm:"Ja",server:"Server",theme:"Thema",site_customisation:"Site-aanpassing",funding:"Financiering",users:"Gebruikers",audit:"Controle",apps:"Apps",channels:"Kanalen",transactions:"Transacties",dashboard:"Dashboard",node:"Knooppunt",export_users:"Gebruikers exporteren",no_users:"Geen gebruikers gevonden",total_capacity:"Totale capaciteit",avg_channel_size:"Gem. Kanaalgrootte",biggest_channel_size:"Grootste Kanaalgrootte",smallest_channel_size:"Kleinste Kanaalgrootte",number_of_channels:"Aantal kanalen",active_channels:"Actieve Kanalen",connect_peer:"Peer verbinden",connect:"Verbinden",open_channel:"Open Kanaal",open:"Open",close_channel:"Kanaal Sluiten",close:"Sluiten",restart:"Server opnieuw opstarten",save:"Opslaan",save_tooltip:"Sla uw wijzigingen op",credit_debit:"Credit / Debet",credit_hint:"Druk op Enter om de rekening te crediteren",credit_label:"{denomination} te crediteren",credit_ok:"Succesvol crediteren/debiteren van virtuele gelden ({amount} sats). Betalingen zijn afhankelijk van de werkelijke fondsen op de financieringsbron.",restart_tooltip:"Start de server opnieuw op zodat wijzigingen van kracht worden",add_funds_tooltip:"Voeg geld toe aan een portemonnee.",reset_defaults:"Standaardinstellingen herstellen",reset_defaults_tooltip:"Wis alle instellingen en herstel de standaardinstellingen.",download_backup:"Databaseback-up downloaden",name_your_wallet:"Geef je {name} portemonnee een naam",paste_invoice_label:"Plak een factuur, betalingsverzoek of lnurl-code*",lnbits_description:"Gemakkelijk in te stellen en lichtgewicht, LNbits kan op elke lightning-netwerkfinancieringsbron draaien en zelfs LNbits zelf! U kunt LNbits voor uzelf laten draaien of gemakkelijk een bewaardersoplossing voor anderen bieden. Elke portemonnee heeft zijn eigen API-sleutels en er is geen limiet aan het aantal portemonnees dat u kunt maken. Het kunnen partitioneren van fondsen maakt LNbits een nuttige tool voor geldbeheer en als ontwikkelingstool. Extensies voegen extra functionaliteit toe aan LNbits, zodat u kunt experimenteren met een reeks toonaangevende technologieën op het bliksemschichtnetwerk. We hebben het ontwikkelen van extensies zo eenvoudig mogelijk gemaakt en als een gratis en opensource-project moedigen we mensen aan om hun eigen ontwikkelingen in te dienen.",export_to_phone:"Exporteren naar telefoon met QR-code",export_to_phone_desc:"Deze QR-code bevat uw portemonnee-URL met volledige toegang. U kunt het vanaf uw telefoon scannen om uw portemonnee van daaruit te openen.",wallet:"Wallet:",wallets:"Portemonnees",add_wallet:"Een nieuwe portemonnee toevoegen",delete_wallet:"Portemonnee verwijderen",delete_wallet_desc:"Deze hele portemonnee wordt verwijderd, de fondsen worden NIET TERUGGEVONDEN.",rename_wallet:"Portemonnee hernoemen",update_name:"Naam bijwerken",fiat_tracking:"Volgfunctie voor fiat-valuata",currency:"Valuta",update_currency:"Valuta bijwerken",press_to_claim:"Druk om bitcoin te claimen",donate:"Doneren",view_github:"Bekijken op GitHub",voidwallet_active:"VoidWallet is actief! Betalingen uitgeschakeld",use_with_caution:"GEBRUIK MET VOORZICHTIGHEID - {name} portemonnee is nog in BETA",service_fee:"Servicekosten: {amount} % per transactie",service_fee_max:"Servicekosten: {amount} % per transactie (max {max} sats)",service_fee_tooltip:"Transactiekosten in rekening gebracht door de LNbits serverbeheerder per uitgaande transactie",toggle_darkmode:"Donkere modus aan/uit",payment_reactions:"Betalingsreacties",view_swagger_docs:"Bekijk LNbits Swagger API-documentatie",api_docs:"API-documentatie",api_keys_api_docs:"Node URL, API-sleutels en API-documentatie",api_keys_warning:"Bewaar deze sleutels veilig; het delen ervan kan leiden tot verlies van tegoeden.",admin_key_warning:"Je beheerderssleutel geeft volledige toegang tot je wallet, inclusief de mogelijkheid om betalingen te versturen. Deel deze nooit, tenzij je de ontvanger volledig vertrouwt.",lnbits_version:"LNbits-versie",runs_on:"Draait op",paste:"Plakken",paste_from_clipboard:"Plakken van klembord",paste_request:"Verzoek plakken",create_invoice:"Factuur aanmaken",camera_tooltip:"Gebruik de camera om een factuur/QR-code te scannen",export_csv:"Exporteer naar CSV",chart_tooltip:"Toon grafiek",pending:"In behandeling",copy_invoice:"Kopieer factuur",withdraw_from:"Opnemen van",cancel:"Annuleren",scan:"Scannen",read:"Lezen",pay:"Betalen",memo:"Memo",date:"Datum",payment_processing:"Verwerking betaling...",not_enough_funds:"Onvoldoende saldo!",search_by_tag_memo_amount:"Zoeken op tag, memo, bedrag",invoice_waiting:"Factuur wachtend op betaling",payment_received:"Betaling ontvangen",payment_sent:"Betaling verzonden",receive:"ontvangen",send:"versturen",outgoing_payment_pending:"Uitgaande betaling in behandeling",drain_funds:"Geld opnemen",drain_funds_desc:"Dit is een LNURL-withdraw QR-code om alles uit deze portemonnee te halen. Deel deze code niet met anderen. Het is compatibel met balanceCheck en balanceNotify zodat jouw portemonnee continu geld kan blijven opnemen vanaf hier na de eerste opname.",i_understand:"Ik begrijp het",copy_wallet_url:"Kopieer portemonnee-URL",disclaimer_dialog_title:"Belangrijk!",disclaimer_dialog:"Inlogfunctionaliteit wordt uitgebracht in een toekomstige update. Zorg er nu voor dat je deze pagina als favoriet markeert om in de toekomst toegang te krijgen tot je portemonnee! Deze service is in BETA en we zijn niet verantwoordelijk voor mensen die de toegang tot hun fondsen verliezen.",no_transactions:"Er zijn nog geen transacties gedaan",manage:"Beheer",exchanges:"Beurzen",extensions:"Extensies",no_extensions:"Je hebt geen extensies geïnstalleerd :(",created:"Aangemaakt",search_extensions:"Zoekextensies",extension_sources:"Extensiebronnen",ext_sources_hint:"Repositories van waar de extensies kunnen worden gedownload",ext_sources_label:"Bron-URL (gebruik alleen de officiële LNbits-extensiebron en bronnen die je kunt vertrouwen)",warning:"Waarschuwing",repository:"Repository",confirm_continue:"Weet je zeker dat je wilt doorgaan?",manage_extension_details:"Installeren/verwijderen van extensie",install:"Installeren",uninstall:"Deïnstalleren",drop_db:"Gegevens verwijderen",enable:"Inschakelen",pay_to_enable:"Betalen om te activeren",enable_extension_details:"Schakel extensie in voor huidige gebruiker",disable:"Uitschakelen",delete:"Verwijderen",installed:"Geïnstalleerd",activated:"Geactiveerd",deactivated:"Gedeactiveerd",release_notes:"Release-opmerkingen",activate_extension_details:"Maak extensie beschikbaar/niet beschikbaar voor gebruikers",featured:"Uitgelicht",all:"Alles",only_admins_can_install:"Alleen beheerdersaccounts kunnen extensies installeren",admin_only:"Alleen beheerder",new_version:"Nieuwe Versie",extension_depends_on:"Afhankelijk van:",extension_rating_soon:"Beoordelingen binnenkort beschikbaar",extension_installed_version:"Geïnstalleerde versie",extension_uninstall_warning:"U staat op het punt de extensie voor alle gebruikers te verwijderen.",uninstall_confirm:"Ja, de-installeren",extension_db_drop_info:"Alle gegevens voor de extensie zullen permanent worden verwijderd. Er is geen manier om deze bewerking ongedaan te maken!",extension_db_drop_warning:"U staat op het punt alle gegevens voor de extensie te verwijderen. Typ de naam van de extensie om door te gaan:",extension_required_lnbits_version:"Deze release vereist ten minste LNbits-versie",min_version:"Minimum (inbegrepen)",max_version:"Maximum (uitgesloten)",payment_hash:"Betalings-hash",fee:"Kosten",amount:"Bedrag",amount_sats:"Bedrag (sats)",tag:"Label",unit:"Eenheid",description:"Beschrijving",expiry:"Vervaldatum",webhook:"Webhook",payment_proof:"Betalingsbewijs",update:"Bijwerken",update_available:"Update {version} beschikbaar!",latest_update:"U bent op de nieuwste versie {version}.",notifications:"Meldingen",no_notifications:"Geen meldingen",notifications_disabled:"LNbits-statusmeldingen zijn uitgeschakeld.",enable_notifications:"Schakel meldingen in",enable_notifications_desc:"Indien ingeschakeld zal het de laatste LNbits Status updates ophalen, zoals veiligheidsincidenten en updates.",enable_watchdog:"Inschakelen Watchdog",enable_watchdog_desc:"Indien ingeschakeld, wordt uw betaalbron automatisch gewijzigd naar VoidWallet als uw saldo lager is dan het saldo van LNbits. U zult dit na een update handmatig moeten inschakelen.",watchdog_interval:"Watchdog-interval",watchdog_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op een killswitch signaal in het watchdog verschil [node_balance - lnbits_balance] (in minuten).",watchdog_delta:"Waakhond Delta",watchdog_delta_desc:"Limiet voordat de killswitch de financieringsbron verandert naar VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notificatiebron",notification_source_label:"Bron-URL (gebruik alleen de officiële LNbits-statusbron en bronnen die u vertrouwt)",more:"meer",less:"minder",releases:"Uitgaven",watchdog:"Waakhond",server_logs:"Serverlogboeken",ip_blocker:"IP-blokkering",security:"Beveiliging",security_tools:"Beveiligingstools",block_access_hint:"Toegang blokkeren per IP",allow_access_hint:"Toegang verlenen op basis van IP (zal geblokkeerde IP's overschrijven)",enter_ip:"Voer IP in en druk op enter",rate_limiter:"Snelheidsbegrenzer",wallet_limiter:"Portemonnee Limietsteller",wallet_limit_max_withdraw_per_day:"Maximale dagelijkse opname van wallet in sats (0 om uit te schakelen)",wallet_max_ballance:"Maximale portefeuillesaldo in sats (0 om uit te schakelen)",wallet_limit_secs_between_trans:"Min seconden tussen transacties per portemonnee (0 om uit te schakelen)",number_of_requests:"Aantal verzoeken",time_unit:"Tijdeenheid",minute:"minuut",second:"seconde",hour:"uur",disable_server_log:"Serverlog uitschakelen",enable_server_log:"Activeer Serverlog",coming_soon:"Functie binnenkort beschikbaar",session_has_expired:"Uw sessie is verlopen. Log alstublieft opnieuw in.",instant_access_question:"Wil je directe toegang?",login_with_user_id:"Inloggen met gebruikers-ID",or:"of",create_new_wallet:"Nieuwe portemonnee aanmaken",login_to_account:"Log in op je account",create_account:"Account aanmaken",account_settings:"Accountinstellingen",signin_with_nostr:"Doorgaan met Nostr",signin_with_google:"Inloggen met Google",signin_with_github:"Inloggen met GitHub",signin_with_keycloak:"Inloggen met Keycloak",username_or_email:"Gebruikersnaam of e-mail",password:"Wachtwoord",password_config:"Wachtwoordconfiguratie",password_repeat:"Wachtwoord herhalen",change_password:"Wachtwoord wijzigen",update_credentials:"Referenties bijwerken",update_pubkey:"Openbare Sleutel Bijwerken",set_password:"Wachtwoord instellen",invalid_password:"Wachtwoord moet ten minste 8 tekens bevatten",login:"Inloggen",register:"Registreren",username:"Gebruikersnaam",pubkey:"Publieke Sleutel",user_id:"Gebruikers-ID",email:"E-mail",first_name:"Voornaam",last_name:"Achternaam",picture:"Foto",verify_email:"E-mail verifiëren met",account:"Account",update_account:"Account bijwerken",invalid_username:"Ongeldige gebruikersnaam",auth_provider:"Auth Provider",my_account:"Mijn Account",back:"Terug",logout:"Afmelden",look_and_feel:"Uiterlijk en gedrag",toggle_gradient:"Gradiënt Schakelen",gradient_background:"Verloopachtergrond",language:"Taal",color_scheme:"Kleurenschema",admin_settings:"Beheerdersinstellingen",extension_cost:"Deze release vereist een betaling van minimaal {cost} sats.",extension_paid_sats:"U heeft al {paid_sats} sats betaald.",release_details_error:"Kan de gegevens van de release niet ophalen.",pay_from_wallet:"Betalen vanuit Portemonnee",wallet_required:"Wallet *",show_qr:"Toon QR",retry_install:"Opnieuw installeren",new_payment:"Nieuwe betaling maken",update_payment:"Betaling bijwerken",already_paid_question:"Heb je al betaald?",sell:"Verkopen",sell_require:"Vraag betaling om de extensie te activeren.",sell_info:"De {name} extensie vereist een betaling van minimaal {amount} sats om in te schakelen.",hide_empty_wallets:"Verberg lege portemonnees",recheck:"Opnieuw controleren",contributors:"Bijdragers",license:"Licentie",reset_key:"Hersteltoets",reset_password:"Wachtwoord Resetten",border_choices:"Randkeuzes",select_all:"Alles selecteren",nfc_supported:"NFC Ondersteund",nfc_not_supported:"NFC niet ondersteund",expire_date:"Vervaldatum:",hash:"Hash:",welcome_lnbits:"Welkom bij LNbits",setup_su_account:"Stel het Superuser-account hieronder in.",create_ticker_converter:"Maak Valuta Ticker Converter",enable_audit:"Audit inschakelen",recommended:"Aanbevolen",audit_desc:"HTTP-verzoeken vastleggen volgens de opgegeven filters",audit_record_req:"Verzoeklichaam registreren",audit_record_warning:"Waarschuwing:",audit_record_req_warning_1:"vertrouwelijke gegevens (zoals wachtwoorden) worden gelogd.",audit_record_req_warning_2:"de aanvraagbody kan een grote omvang hebben.",audit_record_use:"Gebruik het met voorzichtigheid.",audit_ip:"IP-adres vastleggen",audit_ip_desc:"Leg het IP-adres van de klant vast",audit_path_params:"Parameters van het pad opnemen",audit_query_params:"Queryparameters vastleggen",audit_http_methods:"Inclusief HTTP-methoden",audit_http_methods_hint:"Lijst van HTTP-methoden die moeten worden opgenomen. Lege lijsten betekenen alles.",audit_http_methods_label:"HTTP-methoden",audit_resp_codes:"Inclusief HTTP-responscodes",audit_resp_codes_hint:"Lijst van op te nemen HTTP-codes (regex-overeenkomst). Lege lijst betekent alles. Bijvoorbeeld: 4.*, 5.*",audit_resp_codes_label:"HTTP-responscode (regex)",audit_paths:"Inclusiepad",audit_paths_hint:"Lijst met paden die moeten worden opgenomen (regex match). Lege lijst betekent alles.",audit_paths_label:"HTTP-pad (regex)",audit_paths_exclude:"Paden uitsluiten",audit_paths_exclude_hint:"Lijst met paden die moeten worden uitgesloten (regex-overeenkomst). Een lege lijst betekent geen.",audit_paths_exclude_label:"HTTP-pad (regex)",exchange_providers:"Wisselaanbieders",admin_extensions:"Beheeruitbreidingen",admin_extensions_label:"Beheerdersuitbreidingen",admin_extensions_hint:"Alleen gebruikers met beheerdersrechten kunnen extensies gebruiken.",user_default_extensions:"Standaardextensies voor gebruikers",user_default_extensions_label:"Gebruikersuitbreidingen",user_default_extensions_hint:"Extensies die standaard voor de gebruikers worden ingeschakeld.",miscellanous:"Diversen",misc_disable_extensions:"Extensies uitschakelen",misc_disable_extensions_label:"Alle extensies uitschakelen",misc_hide_api:"API verbergen",misc_hide_api_label:"Verbergt de wallet-API, extensies kunnen ervoor kiezen dit te respecteren",wallets_management:"Beheer van portemonnees",funding_source_info:"Financieringsbroninfo",funding_source:"Financieringsbron: {wallet_class}",node_balance:"Node Balans: {balance} sats",lnbits_balance:"LNbits Saldo: {balance} sats",funding_reserve_percent:"Reservepercentage: {percent} %",node_management:"Nodebeheer",node_management_not_supported:"Nodebeheer wordt niet ondersteund door de actieve financieringsbron",toggle_node_ui:"Node UI",toggle_public_node_ui:"Openbare Node UI",toggle_transactions_node_ui:"Transacties Tabblad (Uitschakelen op grote CLN-nodes)",invoice_expiry:"Factuurvervaldatum",invoice_expiry_label:"Factuurverloop (seconden)",fee_reserve:"Toegangsvergoeding Reserve",fee_reserve_msats:"Reserveringskosten in msats",fee_reserve_percent:"Reserveringskosten in procent",server_management:"Serverbeheer",base_url:"Basis-URL",base_url_label:"Statisch/Basis-URL voor de server",authentication:"Authenticatie",auth_token_expiry_label:"Token vervalt over minuten",auth_token_expiry_hint:"Tijd in minuten totdat de token verloopt",auth_allowed_methods_label:"Toegestane autorisatiemethoden",auth_allowed_methods_hint:"Selecteer autorisatiemethoden",auth_nostr_label:"Nostr Aanvraag-URL",auth_nostr_hint:"Absolute URL die de klanten zullen gebruiken om in te loggen.",auth_google_ci_label:"Google Client-ID",auth_google_ci_hint:"Zorg ervoor dat de geautoriseerde omleidings-URL's https://{domain}/api/v1/auth/google/token bevatten.",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"GitHub client-ID",auth_gh_client_id_hint:"Zorg ervoor dat de autorisatie-callback-URL is ingesteld op https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Clientgeheim",auth_keycloak_label:"Keycloak Ontdekking URL",auth_keycloak_ci_label:"Keycloak-client-ID",auth_keycloak_ci_hint:"Zorg ervoor dat de autorisatie callback-URL is ingesteld op https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak Clientgeheim",auth_keycloak_custom_org_label:"Keycloak Aangepaste Organisatie",auth_keycloak_custom_icon_label:"Keycloak Aangepast Pictogram (URL)",auth_oidc_label:"OIDC Ontdekking URL",auth_oidc_ci_label:"OIDC-client-ID",auth_oidc_ci_hint:"Zorg ervoor dat de autorisatie callback-URL is ingesteld op https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC Clientgeheim",auth_oidc_custom_org_label:"OIDC Aangepaste Organisatienaam (bijv. Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC Aangepast Pictogram (URL)",currency_settings:"Valuta-instellingen",allowed_currencies:"Toegestane valuta's",allowed_currencies_hint:"Beperk het aantal beschikbare fiatvaluta's",default_account_currency:"Standaardrekeningvaluta",default_account_currency_hint:"Standaardvaluta voor boekhouding",service_fee_label:"Servicekosten (%)",service_fee_hint:"Toeslag per transactie (%)",service_fee_max_label:"Servicekosten max (sats)",service_fee_max_hint:"Maximale servicekosten om in rekening te brengen in (sats)",fee_wallet:"Kosten Portemonnee",fee_wallet_label:"Kosten portemonnee (wallet ID)",fee_wallet_hint:"Wallet-ID om geld naar over te maken",disable_fee:"Kosten uitschakelen",disable_fee_internal:"Servicekosten uitschakelen voor interne betalingen",disable_fee_internal_desc:"Dienstenkosten uitschakelen voor interne Lightning-betalingen",ui_management:"UI-beheer",ui_site_title:"Site titel",ui_site_tagline:"Site-slogan",ui_elements_enable:"Elementen op de homepage inschakelen",ui_elements_disable:"Elementen op de homepage uitschakelen",ui_toggle_elements_tip:"Verwijder startpagina-elementen zoals 'werkt op' enz.",ui_site_description:"Sitebeschrijving",ui_site_description_hint:"Gebruik platte tekst, Markdown, of ruwe HTML",ui_default_wallet_name:"Standaard Wallet Naam",lnbits_wallet:"LNbits-portemonnee",denomination:"Denominatie",denomination_hint:"De naam voor de FakeWallet token",ui_qr_code_logo:"QR-code-logo",ui_qr_code_logo_hint:"URL naar logo-afbeelding in QR-code",ui_custom_badge:"Aangepaste badge",ui_custom_badge_label:"Aangepaste Badge 'GEBRUIK MET VOORZICHTIGHEID - LNbits-portemonnee is nog in BÈTA'",ui_custom_badge_color_label:"Aangepaste Badge Kleur",themes:"Thema's",themes_hint:"Kies thema's beschikbaar voor gebruikers",custom_logo:"Aangepast logo",custom_logo_hint:"URL naar logo-afbeelding",ad_space_title:"Advertentieruimte Titel",ad_space_title_label:"Ondersteund door",ad_slots:"Advertentieblokken",ad_slots_hint:"Ad URL en afbeeldingspad in CSV-formaat, extensies kunnen ervoor kiezen te honoreren",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Advertenties ingeschakeld",ads_disabled:"Advertenties uitgeschakeld",user_management:"Gebruikersbeheer",admin_users:"Beheerdersgebruikers",admin_users_hint:"Gebruikers met beheerdersrechten",admin_users_label:"Gebruikers-ID",allowed_users:"Toegestane gebruikers",allowed_users_hint:"Alleen deze gebruikers kunnen LNbits gebruiken",allowed_users_label:"Gebruikers-ID",allow_creation_user:"Sta het aanmaken van nieuwe gebruikers toe",allow_creation_user_desc:"Sta de aanmaak van nieuwe gebruikers op de indexpagina toe",components:"Componenten",long_running_endpoints:"Top 5 langlopende eindpunten",http_request_methods:"HTTP-aanvraagmethoden",http_response_codes:"HTTP-responscodes",request_details:"Aanvraagdetails",http_request_details:"HTTP-verzoekdetails",block_explorer:"Block Explorer",enable_block_explorer:"Block Explorer inschakelen",block_explorer_desc:"Laat gebruikers Bitcoin-transacties en -adressen verkennen via Electrum.",blockexplorer_public_api:"Publieke API-toegang",blockexplorer_public_api_desc:"Niet-geauthenticeerde toegang tot de block explorer API-eindpunten toestaan.",electrum_server_url:"Electrum-server-URL",electrum_server_url_hint:"bijv. ssl://electrum.blockstream.info:50002 of tcp://localhost:50001",blockexplorer_search_label:"Zoeken op TXID of adres",blockexplorer_search_hint:"64-karakter hex = transactie · alles anders = Bitcoin-adres",recent_blocks:"Recente blokken",chain_tip:"Kettingtop",block_height:"Blokhoogte",block_fee:"blokvergoeding",fee_estimates:"Vergoedingsschattingen",confirmed_balance:"Bevestigd saldo",unconfirmed_balance:"Onbevestigd saldo",transaction_history:"Transactiegeschiedenis",coinbase:"Coinbase",inputs:"Invoer",outputs:"Uitvoer",confirmations:"Bevestigingen",confirmed:"Bevestigd",unconfirmed:"Onbevestigd",history_unavailable:"Transactiegeschiedenis niet beschikbaar (adres heeft te veel transacties)",address:"Adres",block_number:"Blok #{height}",block_diff:"moeil. {value}",block_hash:"Hash",previous_block:"Vorig blok",merkle_root:"Merkle-wortel",version:"Versie",bits:"Bits",difficulty:"Moeilijkheid",nonce:"Nonce",txid:"TXID",vsize:"Virtuele grootte",weight:"Gewicht",n_block_fee:"{n}-blok vergoeding"},window.localisation.pi={confirm:"Aye",server:"Cap`n",theme:"Theme",site_customisation:"Site Customisation",funding:"Funding",users:"Buccaneers",audit:"Arrr-dit",apps:"Arrrrplications",channels:"Channels",transactions:"Pirate Transactions and loot",dashboard:"Arrr-board",node:"Node",export_users:"Export Mateys",no_users:"No swabbies found",total_capacity:"Total Capacity",avg_channel_size:"Avg. Channel Size",biggest_channel_size:"Largest Bilge Size",smallest_channel_size:"Smallest Channel Size",number_of_channels:"Nummer o' Channels",active_channels:"Active Channels",connect_peer:"Connect Peer",connect:"Connect",open_channel:"Open Channel",open:"Open yer hatches",close_channel:"Shut Yer Gob Channel",close:"Batten down the hatches, we be closin",restart:"Arr, restart Cap`n",save:"Bury Treasure",save_tooltip:"Bury yer changes, matey",credit_debit:"Credit / Debit",credit_hint:"Press Enter to credit account and make it richer",credit_label:"{denomination} to credit, arr!",credit_ok:"Success creditin'/debitin' virtual funds ({amount} sats). Payments depend on actual funds on fundin' source.",restart_tooltip:"Restart the Cap`n for changes to take effect, arr!",add_funds_tooltip:"Add doubloons to a chest and make it heavier",reset_defaults:"Reset to Davy Jones Locker",reset_defaults_tooltip:"Scuttle all settings and reset to Davy Jones Locker. Aye, start anew!",download_backup:"Download database booty",name_your_wallet:"Name yer {name} treasure chest",paste_invoice_label:"Paste a booty, payment request or lnurl code, matey!",lnbits_description:"Arr, easy to set up and lightweight, LNbits can run on any Lightning Network funding source and even LNbits itself! Ye can run LNbits for yourself, or easily offer a custodian solution for others. Each chest has its own API keys and there be no limit to the number of chests ye can make. Being able to partition booty makes LNbits a useful tool for money management and as a development tool. Arr, extensions add extra functionality to LNbits so ye can experiment with a range of cutting-edge technologies on the lightning network. We have made developing extensions as easy as possible, and as a free and open-source project, we encourage scallywags to develop and submit their own.",export_to_phone:"Export to Phone with QR Code, me hearties",export_to_phone_desc:"This QR code contains yer chest URL with full access. Ye can scan it from yer phone to open yer chest from there, arr!",wallet:"Booty Chest:",wallets:"Treasure Chests",add_wallet:"Add a new chest and fill it with doubloons!",delete_wallet:"Scuttle the Chest",delete_wallet_desc:"This whole chest will be scuttled, the booty will be UNRECOVERABLE. Aye, be warned!",rename_wallet:"Rename the Chest, me hearty",update_name:"Update name like a captain",fiat_tracking:"Trackin' o' the treasure",currency:"Curr'nsey",update_currency:"Update doubloons",press_to_claim:"Press to claim gold doubloons, matey!",donate:"Donate like a true pirate!",view_github:"View on GitHub and find treasures",voidwallet_active:"VoidWallet be active! Payments disabled",use_with_caution:"USE WITH CAUTION - {name} chest be still in BETA. Aye, be careful!",service_fee:"Service fee: {amount} % per transaction",service_fee_max:"Service fee: {amount} % per transaction (max {max} sats)",service_fee_tooltip:"Service fee charged by the LNbits server admin per goin' transaction",toggle_darkmode:"Toggle Dark Mode, arr!",payment_reactions:"Payment Reactions",view_swagger_docs:"View LNbits Swagger API docs and learn the secrets",api_docs:"API docs for the scallywags",api_keys_api_docs:"Node URL, API keys and API docs",api_keys_warning:"Keep these keys safe, matey; sharing them could lose ye yer doubloons.",admin_key_warning:"Yer admin key gives full access to yer wallet, including sending payments. Never share it unless ye trust the recipient completely.",lnbits_version:"LNbits version, arr!",runs_on:"Runs on, matey",paste:"Stow",paste_from_clipboard:"Paste from clipboard",paste_request:"Paste Request and find treasures",create_invoice:"Create Booty Request and get rich, me hearties!",camera_tooltip:"Use spyglass to scan a booty/QR, arr!",export_csv:"Export to CSV and keep track of the booty",chart_tooltip:"Show ye chart, me hearty",pending:"Pendin like a ship at anchor",copy_invoice:"Copy booty request, arrr",withdraw_from:"Withdraw from",cancel:"Abandon ship! We be retreatin",scan:"Avast! Scan me beauty, arrr",read:"Read it, if ye dare",pay:"Pay up or walk the plank, ye scallywag",memo:"Message in a bottle, argh",date:"Date of the map, me matey",payment_processing:"Processing yer payment... don´t make me say it again",not_enough_funds:"Arrr, ye don´t have enough doubloons! Walk the plank!",search_by_tag_memo_amount:"Search by tag, message, or booty amount, savvy",invoice_waiting:"Invoice waiting to be plundered, arrr",payment_received:"Payment Received like a treasure, argh",payment_sent:"Payment Sent, hoist the colors! We´ve got some doubloons!",receive:"booty",send:"hoist",outgoing_payment_pending:"Outgoing payment pending in the port, ye scurvy dog",drain_funds:"Plunder all the doubloons, ye buccaneer",drain_funds_desc:"This be an LNURL-withdraw QR code for slurpin everything from this wallet. Don`t share with anyone. It be compatible with balanceCheck and balanceNotify so yer wallet may keep pullin` the funds continuously from here after the first withdraw.",i_understand:"I understand, yo ho ho and a bottle of rum!",copy_wallet_url:"Copy wallet URL like a map, savvy",disclaimer_dialog_title:"Avast!",disclaimer_dialog:"Login functionality to be released in a future update, for now, make sure ye bookmark this page for future access to your booty! This service be in BETA, and we hold no responsibility for people losing access to doubloons.",no_transactions:"No transactions made yet, me hearties. Belay that!",manage:"Manage, me hearty",exchanges:"Exchanges",extensions:"Yer Extensions, ye scurvy dog",no_extensions:"Ye don't have any extensions installed, ye scallywag :(. Where be yer loot?",created:"Created like a legend, savvy",search_extensions:"Search fer extensions",extension_sources:"Extension Sources",ext_sources_hint:"Repositories from wharrr the extensions can be downloaded",ext_sources_label:"Source URL (only use th' official LNbits extension source, and sources ye can trust)",warning:"Avast",repository:"Repository",confirm_continue:"Be ye sure ye want t' proceed?",manage_extension_details:"Install/uninstall extension",install:"Set sail",uninstall:"Avaast",drop_db:"Scuttle Data",enable:"Enable",pay_to_enable:"Pay To Hoist",enable_extension_details:"Enable extension fer th' current user",disable:"Disablin'",delete:"Blow down",installed:"Installed",activated:"Activated",deactivated:"Deactivated",release_notes:"Release Notes",activate_extension_details:"Make extension available/unavailable fer users",featured:"Featured",all:"Arr",only_admins_can_install:"(Only admin accounts can install extensions)",admin_only:"Cap'n Only",new_version:"New Version",extension_depends_on:"Depends on:",extension_rating_soon:"Ratings a'comin' soon",extension_installed_version:"Installed version",extension_uninstall_warning:"Ye be about t' remove th' extension fer all hands.",uninstall_confirm:"Aye, Uninstall",extension_db_drop_info:"All data fer th' extension will be permanently deleted. There be no way to undo this operation!",extension_db_drop_warning:"Ye be about to scuttle all data fer th' extension. Please scribble th' extension name to continue:",extension_required_lnbits_version:"This release be needin' at least LNbits version",min_version:"Minimum (inclooded)",max_version:"Maximum (excluded)",payment_hash:"Payment Hash like a treasure map, arrr",fee:"Fee like a toll to cross a strait, matey",amount:"Amount of doubloons, arrr",amount_sats:"Amount (sats)",tag:"Tag",unit:"Unit of measurement like a fathom, ye buccaneer",description:"Description like a tale of adventure, arrr",expiry:"Expiry like the food on a ship, ye landlubber",webhook:"Webhook like a fishing line, arrr",payment_proof:"Payment Proof like a seal of authenticity, argh",update:"Updatin'",update_available:"Update {version} available, me matey!",latest_update:"Ye be on th' latest version {version}.",notifications:"Notificashuns",no_notifications:"No noticin's",notifications_disabled:"LNbits status notifications be disabled, arr!",enable_notifications:"Enable Notifications",enable_notifications_desc:"If ye be allowin' it, it'll be fetchin' the latest LNbits Status updates, like security incidents and updates.",enable_watchdog:"Enable Seadog",enable_watchdog_desc:"If enabled, it will swap yer treasure source t' VoidWallet on its own if yer balance be lower than th' LNbits balance. Ye'll need t' enable by hand after an update.",watchdog_interval:"Seadog Interval",watchdog_interval_desc:"How oft th' background task should be checkin' fer a killswitch signal in th' seadog delta [node_balance - lnbits_balance] (in minutes), arr.",watchdog_delta:"Seadog Delta",watchdog_delta_desc:"Limit afore killswitch changes fundin' source to VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notification Source",notification_source_label:"Source URL (only use th' official LNbits status source, and sources ye can trust)",more:"Arr, 'tis more.",less:"Arr, 'tis more fewer.",releases:"Releases",watchdog:"Seadog",server_logs:"Server Logs",ip_blocker:"IP Blockar",security:"Securrrity",security_tools:"Securrrity tools",block_access_hint:"Block access by IP",allow_access_hint:"Grant permission by IP (will override barred IPs)",enter_ip:"Enter IP and hit enter",rate_limiter:"Rate Limiter",wallet_limiter:"Pouch Limitar",wallet_limit_max_withdraw_per_day:"Max daily wallet withdrawal in sats (0 for no limit, -1 to block withdrawal)",wallet_max_ballance:"Purse max heaviness in sats (0 fer scuttle)",wallet_limit_secs_between_trans:"Min secs 'tween transactions per wallet (0 to disable)",number_of_requests:"Number o' requests",time_unit:"time bein'",minute:"minnit",second:"second",hour:"hour",disable_server_log:"Disabl' {Server} Log",enable_server_log:"Enable Server Log",coming_soon:"Feature comin' soon",session_has_expired:"Yer session has expired. Please login again.",instant_access_question:"Be wantin' quick entry, aye?",login_with_user_id:"Login with user ID",or:"arr",create_new_wallet:"Create New Wallet",login_to_account:"Log in to yer account",create_account:"Create account",account_settings:"Account Settin's",signin_with_nostr:"Continue with Nostr",signin_with_google:"Sign in wit' Google",signin_with_github:"Sign in wit' GitHub",signin_with_keycloak:"Sign in wit' Keycloak",username_or_email:"Usarrrname or Email",password:"Passwarrd",password_config:"Passwarrd Config",password_repeat:"Passwarrd repeat",change_password:"Change Passwarrd",update_credentials:"Hoist New Credentials",update_pubkey:"Swab Public Key",set_password:"Set yer Secret Code",invalid_password:"Passwarrd must be havin' at leest 8 charrracters",login:"Log in",register:"Sign on",username:"Username",pubkey:"Public Key",user_id:"User ID",email:"Email",first_name:"Firrrst Name",last_name:"Surname",picture:"pictur'",verify_email:"Verify email with",account:"Arrrccount",update_account:"Updatin' Arrrccount",invalid_username:"Username be not valid, matey!",auth_provider:"Auth Provider becometh Auth Provider, ye see?",my_account:"Me Arrrccount",back:"Return",logout:"Log out yer session",look_and_feel:"Look and Feel",toggle_gradient:"Toggle Gradient",gradient_background:"Gradient Background",language:"Langwidge",color_scheme:"Colour Scheme",admin_settings:"Admin Settin's",extension_cost:"This release be needin' a payment o' minimum {cost} sats, arr.",extension_paid_sats:"Ye have already paid {paid_sats} sats.",release_details_error:"Cannot get th' release details.",pay_from_wallet:"Pay from ye Wallet",wallet_required:"Doubloon Locker *",show_qr:"Show QR",retry_install:"Try 'nstallin' Again",new_payment:"Make New Payment",update_payment:"Be Updatin' Payment",already_paid_question:"Have ye already paid?",sell:"Sell",sell_require:"Ask fer payment to enable extension",sell_info:"The {name} extension requires a payment of minimum {amount} sats to enable.",hide_empty_wallets:"Stow empty wallets",recheck:"Recheck",contributors:"Contributors",license:"License",reset_key:"Reset Key",reset_password:"Reset Password",border_choices:"Border Choices",select_all:"Select All",nfc_supported:"NFC Supported",nfc_not_supported:"NFC not Supported",expire_date:"Expire Date:",hash:"Mizzenmast:",welcome_lnbits:"Welcome t' LNbits",setup_su_account:"Set up the Superuser account below.",create_ticker_converter:"Create Currency Ticker Converter",enable_audit:"Set Sail Fer Auditin'",recommended:"Recommended",audit_desc:"Record HTTP requests accordin' with the specified filters",audit_record_req:"Record Request Body",audit_record_warning:"Arrrning:",audit_record_req_warning_1:"confidential data (like passwords) will be logged.",audit_record_req_warning_2:"th' request body can have large size.",audit_record_use:"Use it with caution.",audit_ip:"Log IP Address",audit_ip_desc:"Record the IP address o' the client",audit_path_params:"Record Path Parameters",audit_query_params:"Rransack th' Query Parameters",audit_http_methods:"Include HTTP Methods",audit_http_methods_hint:"List o' HTTP methods to be included. Empty lists means all.",audit_http_methods_label:"HTTP Methods",audit_resp_codes:"Include HTTP Response Codes",audit_resp_codes_hint:"List o' HTTP codes t' be included (regex match). Empty lists means all. Eg: 4.*, 5.*",audit_resp_codes_label:"HTTP Response code (regex)",audit_paths:"Include Paths",audit_paths_hint:"List o' paths t' be included (regex match). Empty list means all.",audit_paths_label:"HTTP Path (regex)",audit_paths_exclude:"Exclude Paths",audit_paths_exclude_hint:"List o' paths t' be excluded (regex match). Empty list means none.",audit_paths_exclude_label:"HTTP Path (regex)",exchange_providers:"Trade Buccaneers",admin_extensions:"Admin Extensions",admin_extensions_label:"Admin extensions",admin_extensions_hint:"Extensions only user with admin privileges can use",user_default_extensions:"Crew Mate Default Extensions",user_default_extensions_label:"User extensions",user_default_extensions_hint:"Extensions that will be enabled by default fer the users.",miscellanous:"Miscelaneous",misc_disable_extensions:"Belay Extensions",misc_disable_extensions_label:"Disable all extensions",misc_hide_api:"Stow API",misc_hide_api_label:"Burieds wallet api, extensions be able t' choose t' honor",wallets_management:"Wallets Management",funding_source_info:"Loot Source Info",funding_source:"Loot Source: {wallet_class}",node_balance:"Node Balance: {balance} doubloons",lnbits_balance:"LNbits Balance: {balance} pieces o' eight",funding_reserve_percent:"Reserve Percent: {percent} %",node_management:"Node Management",node_management_not_supported:"Node Management not be supported by active funding source",toggle_node_ui:"Node Main Deck",toggle_public_node_ui:"Public Node UI",toggle_transactions_node_ui:"Transactions Tab (Disable on large CLN nodes)",invoice_expiry:"Invoice Expiry",invoice_expiry_label:"Invoice expiry (seconds)",fee_reserve:"Plunder Reserve",fee_reserve_msats:"Reserve fee in msats",fee_reserve_percent:"Reserve fee in percent",server_management:"Server Management",base_url:"Base URL",base_url_label:"Static/Base url fer the server",authentication:"Authent Mateys!",auth_token_expiry_label:"Token expire minutes",auth_token_expiry_hint:"Time in minutes until th' token expires",auth_allowed_methods_label:"Allowed authorizashun methods",auth_allowed_methods_hint:"Select arrrrthorization methods",auth_nostr_label:"Nostr Request URL",auth_nostr_hint:"Absolute URL that th' clients will use t' login.",auth_google_ci_label:"Google Client ID",auth_google_ci_hint:"Make sure that the authorized redirect URIs contain https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"GitHub Client ID",auth_gh_client_id_hint:"Make sure that the authorization callback URL is set to https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Client Secret",auth_keycloak_label:"Keycloak Discovery URL",auth_keycloak_ci_label:"Keycloak Client ID",auth_keycloak_ci_hint:"Make sure thant th' authorization callback URL be set t' https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak Client Secret",auth_keycloak_custom_org_label:"Keycloak Custom Organization",auth_keycloak_custom_icon_label:"Keycloak Custom Icon (URL)",auth_oidc_label:"OIDC Discovery URL",auth_oidc_ci_label:"OIDC Client ID",auth_oidc_ci_hint:"Make sure thant th' authorization callback URL be set t' https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC Client Secret",auth_oidc_custom_org_label:"OIDC Custom Organization Name (e.g., Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC Custom Icon (URL)",currency_settings:"Doubloon Settin's",allowed_currencies:"Allo'ed Doubloons",allowed_currencies_hint:"Limit the number of available fiat doubloons",default_account_currency:"Default Account Currency",default_account_currency_hint:"Default dubloon fer accountin'",service_fee_label:"Service fee (%).",service_fee_hint:"Fee charged per tx (%)",service_fee_max_label:"Service fee max (sats)",service_fee_max_hint:"Max service fee to charge in (sats)",fee_wallet:"Fee Wallet",fee_wallet_label:"Tariff wallet (wallet ID)",fee_wallet_hint:"Wallett ID t' send funds t'",disable_fee:"Disable Fee",disable_fee_internal:"Disable Service Fee for Internal Payments",disable_fee_internal_desc:"Disable Service Fee fer Internal Lightning Payments",ui_management:"UI Management",ui_site_title:"Site Title",ui_site_tagline:"Site Tagline",ui_elements_enable:"Set course for the homepage elements!",ui_elements_disable:"Disarm elements on homepage",ui_toggle_elements_tip:"Be rid of homepage elements like 'runs on' etc",ui_site_description:"Site Description",ui_site_description_hint:"Use plain text, Markdown, or raw HTML",ui_default_wallet_name:"Default Wallet Name",lnbits_wallet:"LNbits wallet",denomination:"Denomination",denomination_hint:"The name fer the FakeWallet doubloon",ui_qr_code_logo:"QR Code Logo",ui_qr_code_logo_hint:"URL t' logo image in QR code",ui_custom_badge:"Custom Badge",ui_custom_badge_label:"Custom Badge 'USE WITH CAUTION - LNbits wallet be still in BETA'",ui_custom_badge_color_label:"Custom Bauble Color",themes:"Themes",themes_hint:"Choose themes available for users",custom_logo:"Custom Logo",custom_logo_hint:"URL to logo image",ad_space_title:"Ad Space Title",ad_space_title_label:"Supported by",ad_slots:"Adversment Sprogs",ad_slots_hint:"Ad url an' image filepaths in CSV format, extensions can choose t' honor",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Ads Enabled",ads_disabled:"Ads Keelhauled",user_management:"User Matey-handlin'",admin_users:"Admin Scurvy Dogs",admin_users_hint:"Scallywags with cap'n privileges",admin_users_label:"User ID",allowed_users:"Allowed Users",allowed_users_hint:"Only these scallywags can use LNbits",allowed_users_label:"User ID",allow_creation_user:"Permit creation of new scallywags",allow_creation_user_desc:"Allow creation o' new users on th' index page",components:"Components",long_running_endpoints:"Top 5 Long Runnin' Endpoints",http_request_methods:"HTTP Request Methods",http_response_codes:"HTTP Response Codes",request_details:"Request Details",http_request_details:"HTTP Request Details",block_explorer:"Treasure Map",enable_block_explorer:"Hoist the Treasure Map",block_explorer_desc:"Let scallywags spy on Bitcoin doubloons an' addresses via Electrum.",blockexplorer_public_api:"Open Seas API",blockexplorer_public_api_desc:"Allow any landlubber access to the block explorer API ports.",electrum_server_url:"Electrum Port URL",electrum_server_url_hint:"e.g. ssl://electrum.blockstream.info:50002 or tcp://localhost:50001",blockexplorer_search_label:"Search by TXID or Port",blockexplorer_search_hint:"64-char hex = plunder · anything else = Bitcoin port",recent_blocks:"Recent Plunder",chain_tip:"Tip o' the Anchor Chain",block_height:"Plunder Height",block_fee:"plunder fee",fee_estimates:"Booty Estimates",confirmed_balance:"Confirmed Booty",unconfirmed_balance:"Unconfirmed Booty",transaction_history:"Plunder History",coinbase:"Coinbase",inputs:"Inbound Plunder",outputs:"Outbound Plunder",confirmations:"Confirmations, arr",confirmed:"Confirmed, arr",unconfirmed:"Unconfirmed, arr",history_unavailable:"Plunder history lost at sea (too many transactions, matey!)",address:"Port",block_number:"Block #{height}",block_diff:"diff {value}",block_hash:"Hash",previous_block:"Previous Plunder Block",merkle_root:"Merkle Root",version:"Version",bits:"Bits",difficulty:"Difficulty",nonce:"Nonce",txid:"TXID",vsize:"Virtual Size",weight:"Weight",n_block_fee:"{n}-block booty"},window.localisation.pl={confirm:"Tak",server:"Serwer",theme:"Motyw",site_customisation:"Dostosowanie witryny",funding:"Finansowanie",users:"Użytkownicy",audit:"Audyt",apps:"Aplikacje",channels:"Kanały",transactions:"Transakcje",dashboard:"Panel kontrolny",node:"Węzeł",export_users:"Eksportuj użytkowników",no_users:"Nie znaleziono użytkowników",total_capacity:"Całkowita Pojemność",avg_channel_size:"Średni rozmiar kanału",biggest_channel_size:"Największy Rozmiar Kanału",smallest_channel_size:"Najmniejszy Rozmiar Kanału",number_of_channels:"Ilość kanałów",active_channels:"Aktywne kanały",connect_peer:"Połącz z węzłem równorzędnym",connect:"Połącz",open_channel:"Otwarty Kanał",open:"Otwórz",close_channel:"Zamknij kanał",close:"Zamknij",restart:"Restart serwera",save:"Zapisz",save_tooltip:"Zapisz zmiany",credit_debit:"Kredyt / Debet",credit_hint:"Naciśnij Enter aby doładować konto",credit_label:"{denomination} doładowanie",credit_ok:"Pomyślne zaksięgowanie/obciążenie wirtualnych środków ({amount} sats). Płatności zależą od rzeczywistych środków na źródle finansowania.",restart_tooltip:"Zrestartuj serwer aby aktywować zmiany",add_funds_tooltip:"Dodaj środki do portfela.",reset_defaults:"Powrót do ustawień domyślnych",reset_defaults_tooltip:"Wymaż wszystkie ustawienia i ustaw domyślne.",download_backup:"Pobierz kopię zapasową bazy danych",name_your_wallet:"Nazwij swój portfel {name}",paste_invoice_label:"Wklej fakturę, żądanie zapłaty lub kod lnurl *",lnbits_description:"Łatwy i lekki w konfiguracji, LNbits może działać w oparciu o dowolne źródło finansowania w sieci lightning czy nawet inną instancję LNbits! Możesz uruchomić instancję LNbits dla siebie lub dla innych. Każdy portfel ma swoje klucze API i nie ma ograniczeń jeśli chodzi o ilość portfeli. LNbits umożliwia dzielenie środków w celu zarządzania nimi, jest również dobrym narzędziem deweloperskim. Rozszerzenia zwiększają funkcjonalność LNbits co umożliwia eksperymentowanie z nowym technologiami w sieci lightning. Tworzenie rozszerzeń jest proste dlatego zachęcamy innych deweloperów do tworzenia dodatkowych funkcjonalności i wysyłanie do nas PR",export_to_phone:"Eksport kodu QR na telefon",export_to_phone_desc:"Ten kod QR zawiera adres URL Twojego portfela z pełnym dostępem do niego. Możesz go zeskanować na swoim telefonie aby otworzyć na nim ten portfel.",wallet:"Portfel:",wallets:"Portfele",add_wallet:"Dodaj portfel",delete_wallet:"Usuń portfel",delete_wallet_desc:"Ten portfel zostanie usunięty, środków na nim zgromadzonych NIE BĘDZIE MOŻNA ODZYSKAĆ.",rename_wallet:"Zmień nazwę portfela",update_name:"Zaktualizuj nazwę",fiat_tracking:"Śledzenie Fiata",currency:"Waluta",update_currency:"Aktualizuj walutę",press_to_claim:"Naciśnij aby odebrać Bitcoiny",donate:"Podaruj",view_github:"Otwórz GitHub",voidwallet_active:"VoidWallet jest aktywny! Płatności są niemożliwe",use_with_caution:"KORZYSTAJ Z ROZWAGĄ - portfel {name} jest w wersji BETA",service_fee:"Opłata serwisowa: {amount} % za transakcję",service_fee_max:"Opłata serwisowa: {amount} % za transakcję (maks {max} sat)",service_fee_tooltip:"Opłata serwisowa pobierana przez administratora serwera LNbits za każdą wychodzącą transakcję",toggle_darkmode:"Tryb nocny",payment_reactions:"Reakcje na płatność",view_swagger_docs:"Dokumentacja Swagger API",api_docs:"Dokumentacja API",api_keys_api_docs:"Adres URL węzła, klucze API i dokumentacja API",api_keys_warning:"Te klucze należy przechowywać bezpiecznie; ich udostępnienie może grozić utratą środków.",admin_key_warning:"Twój klucz administratora zapewnia pełny dostęp do portfela, w tym możliwość wysyłania płatności. Nigdy go nie udostępniaj, chyba że całkowicie ufasz odbiorcy.",lnbits_version:"Wersja LNbits",runs_on:"Działa na",paste:"Wklej",paste_from_clipboard:"Wklej ze schowka",paste_request:"Wklej żądanie",create_invoice:"Utwórz fakturę",camera_tooltip:"Użyj kamery aby zeskanować fakturę lub kod QR",export_csv:"Eksport do CSV",chart_tooltip:"Wykres",pending:"W toku",copy_invoice:"Skopiuj fakturę",withdraw_from:"Wypłać z",cancel:"Anuluj",scan:"Skanuj",read:"Odczytaj",pay:"Zapłać",memo:"Memo",date:"Data",payment_processing:"Przetwarzam płatność...",not_enough_funds:"Brak wystarczających środków!",search_by_tag_memo_amount:"Szukaj po tagu, memo czy wartości",invoice_waiting:"Faktura oczekuje na zapłatę",payment_received:"Otrzymano płatność",payment_sent:"Wysłano płatność",receive:"odbierać",send:"wysłać",outgoing_payment_pending:"Płatność wychodząca w toku",drain_funds:"Opróżnij środki",drain_funds_desc:"To jest kod QR służący do opróżnienia portfela (LNURL-withdraw). Nie udostępniaj go nikomu. Ten kod jest kompatybilny z funkcjami, które umożliwiają wielokrotne żądania aż do zupełnego opróżnienia portfela.",i_understand:"Rozumiem",copy_wallet_url:"Skopiuj URL portfela",disclaimer_dialog_title:"Ważne!",disclaimer_dialog:"Funkcja logowania zostanie uruchomiona w przyszłości. Póki co upewnij się, że zapisałeś adres URL tej strony aby mieć dostęp do tego portfela. Nie udostępniaj adresu tej strony nikomu, kto nie ma mieć do tego portfela dostępu! Ta usługa działa w wersji BETA, nie odpowiadamy za utratę dostępu do środków przez osoby używające LNbits.",no_transactions:"Brak transakcji",manage:"Zarządzaj",exchanges:"Giełdy",extensions:"Rozszerzenia",no_extensions:"Nie masz zainstalowanych żadnych rozszerzeń :(",created:"Utworzono",search_extensions:"Szukaj rozszerzeń",extension_sources:"Źródła rozszerzeń",ext_sources_hint:"Repozytoria, z których można pobrać rozszerzenia",ext_sources_label:"URL źródłowy (używaj tylko oficjalnego źródła rozszerzenia LNbits oraz źródeł, którym możesz zaufać)",warning:"Ostrzeżenie",repository:"Repozytorium",confirm_continue:"Czy na pewno chcesz kontynuować?",manage_extension_details:"Instaluj/odinstaluj rozszerzenie",install:"Zainstaluj",uninstall:"Odinstaluj",drop_db:"Usuń dane",enable:"Włącz",pay_to_enable:"Zapłać, aby włączyć",enable_extension_details:"Włącz rozszerzenie dla aktualnego użytkownika",disable:"Wyłącz",delete:"Usuń",installed:"Zainstalowano",activated:"Aktywowany",deactivated:"Dezaktywowany",release_notes:"Informacje o wydaniu",activate_extension_details:"Udostępnij/nie udostępniaj rozszerzenia użytkownikom",featured:"Polecane",all:"Wszystko",only_admins_can_install:"Tylko konta administratorów mogą instalować rozszerzenia",admin_only:"Tylko dla administratora",new_version:"Nowa wersja",extension_depends_on:"Zależy od:",extension_rating_soon:"Oceny będą dostępne wkrótce",extension_installed_version:"Zainstalowana wersja",extension_uninstall_warning:"Za chwilę usuniesz rozszerzenie dla wszystkich użytkowników.",uninstall_confirm:"Tak, Odinstaluj",extension_db_drop_info:"Wszystkie dane dla rozszerzenia zostaną trwale usunięte. Nie ma sposobu, aby cofnąć tę operację!",extension_db_drop_warning:"Za chwilę usuniesz wszystkie dane dla rozszerzenia. Proszę wpisz nazwę rozszerzenia, aby kontynuować:",extension_required_lnbits_version:"To wymaga przynajmniej wersji LNbits",min_version:"Minimum (włącznie)",max_version:"Maksymalna (wyłączona)",payment_hash:"Hash Płatności",fee:"Opłata",amount:"Wartość",amount_sats:"Kwota (sats)",tag:"Etykieta",unit:"Jednostka",description:"Opis",expiry:"Wygasa",webhook:"Webhook",payment_proof:"Potwierdzenie płatności",update:"Aktualizuj",update_available:"Aktualizacja {version} dostępna!",latest_update:"Korzystasz z najnowszej wersji {version}.",notifications:"Powiadomienia",no_notifications:"Brak powiadomień",notifications_disabled:"Powiadomienia o statusie LNbits są wyłączone.",enable_notifications:"Włącz powiadomienia",enable_notifications_desc:"Jeśli ta opcja zostanie włączona, będzie pobierać najnowsze informacje o statusie LNbits, takie jak incydenty bezpieczeństwa i aktualizacje.",enable_watchdog:"Włącz Watchdog",enable_watchdog_desc:"Jeśli zostanie włączone, automatycznie zmieni źródło finansowania na VoidWallet, jeśli saldo jest niższe niż saldo LNbits. Po aktualizacji trzeba będzie włączyć ręcznie.",watchdog_interval:"Interwał Watchdog",watchdog_interval_desc:"Jak często zadanie w tle powinno sprawdzać sygnał wyłącznika awaryjnego w delcie strażnika [node_balance - lnbits_balance] (w minutach).",watchdog_delta:"Strażnik Delta",watchdog_delta_desc:"Limit przed aktywacją wyłącznika zmienia źródło finansowania na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stan",notification_source:"Źródło powiadomień",notification_source_label:"Adres URL źródła (używaj tylko oficjalnego źródła statusu LNbits oraz źródeł, którym możesz zaufać)",more:"więcej",less:"mniej",releases:"Wydania",watchdog:"Pies gończy",server_logs:"Dzienniki serwera",ip_blocker:"Blokada IP",security:"Bezpieczeństwo",security_tools:"Narzędzia bezpieczeństwa",block_access_hint:"Zablokuj dostęp przez IP",allow_access_hint:"Zezwól na dostęp przez IP (zignoruje zablokowane adresy IP)",enter_ip:"Wpisz adres IP i naciśnij enter",rate_limiter:"Ogranicznik Częstotliwości",wallet_limiter:"Ogranicznik Portfela",wallet_limit_max_withdraw_per_day:"Maksymalna dzienna wypłata z portfela w satoshi (0 aby wyłączyć)",wallet_max_ballance:"Maksymalny stan portfela w satoshi (0 aby wyłączyć)",wallet_limit_secs_between_trans:"Min sekund pomiędzy transakcjami na portfel (0 aby wyłączyć)",number_of_requests:"Liczba żądań",time_unit:"Jednostka czasu",minute:"minuta",second:"sekunda",hour:"godzina",disable_server_log:"Wyłącz log serwera",enable_server_log:"Włącz dziennik serwera",coming_soon:"Funkcja wkrótce będzie dostępna",session_has_expired:"Twoja sesja wygasła. Proszę zaloguj się ponownie.",instant_access_question:"Chcesz mieć natychmiastowy dostęp?",login_with_user_id:"Zaloguj się za pomocą identyfikatora użytkownika",or:"lub",create_new_wallet:"Utwórz nowy portfel",login_to_account:"Zaloguj się do swojego konta",create_account:"Załóż konto",account_settings:"Ustawienia konta",signin_with_nostr:"Kontynuuj z Nostr",signin_with_google:"Zaloguj się przez Google",signin_with_github:"Zaloguj się przez GitHub",signin_with_keycloak:"Zaloguj się przez Keycloak",username_or_email:"Nazwa użytkownika lub Email",password:"Hasło",password_config:"Konfiguracja Hasła",password_repeat:"Powtórz hasło",change_password:"Zmień hasło",update_credentials:"Aktualizuj dane logowania",update_pubkey:"Zaktualizuj klucz publiczny",set_password:"Ustaw hasło",invalid_password:"Hasło musi zawierać co najmniej 8 znaków",login:"Logowanie",register:"Zarejestruj",username:"Nazwa użytkownika",pubkey:"Klucz publiczny",user_id:"Identyfikator użytkownika",email:"Email",first_name:"Imię",last_name:"Nazwisko",picture:"Zdjęcie",verify_email:"Zweryfikuj email za pomocą",account:"Konto",update_account:"Aktualizuj konto",invalid_username:"Nieprawidłowa nazwa użytkownika",auth_provider:"Dostawca uwierzytelniania",my_account:"Moje Konto",back:"Wstecz",logout:"Wyloguj",look_and_feel:"Wygląd i zachowanie",toggle_gradient:"Przełącz gradient",gradient_background:"Tło gradientowe",language:"Język",color_scheme:"Schemat kolorów",admin_settings:"Ustawienia administratora",extension_cost:"To niniejsze wydanie wymaga zapłaty minimalnej {cost} satów.",extension_paid_sats:"Już zapłaciłeś {paid_sats} satów.",release_details_error:"Nie można uzyskać szczegółów wydania.",pay_from_wallet:"Zapłać z portfela",wallet_required:"Portfel *",show_qr:"Pokaż kod QR",retry_install:"Ponów instalację",new_payment:"Dokonaj nowej płatności",update_payment:"Zaktualizuj płatność",already_paid_question:"Czy już zapłaciłeś?",sell:"Sprzedaj",sell_require:"Poproś o płatność, aby włączyć rozszerzenie",sell_info:"Rozszerzenie {name} wymaga płatności w wysokości minimum {amount} sats, aby je włączyć.",hide_empty_wallets:"Ukryj puste portfele",recheck:"Sprawdź ponownie",contributors:"Współpracownicy",license:"Licencja",reset_key:"Resetuj klucz",reset_password:"Zresetuj hasło",border_choices:"Wybory granicy",select_all:"Zaznacz wszystko",nfc_supported:"Obsługa NFC",nfc_not_supported:"NFC nieobsługiwane",expire_date:"Data wygaśnięcia:",hash:"Hash:",welcome_lnbits:"Witamy w LNbits",setup_su_account:"Skonfiguruj konto Superuser poniżej.",create_ticker_converter:"Stwórz Konwerter Kursu Walutowego",enable_audit:"Włącz Audyt",recommended:"Zalecane",audit_desc:"Rejestruj żądania HTTP zgodnie z określonymi filtrami",audit_record_req:"Zarejestruj treść żądania",audit_record_warning:"Ostrzeżenie:",audit_record_req_warning_1:"dane poufne (takie jak hasła) będą rejestrowane.",audit_record_req_warning_2:"treść żądania może mieć duży rozmiar.",audit_record_use:"Używaj tego ostrożnie.",audit_ip:"Zapisz adres IP",audit_ip_desc:"Zarejestruj adres IP klienta",audit_path_params:"Zarejestruj parametry ścieżki",audit_query_params:"Zarejestruj parametry zapytania",audit_http_methods:"Uwzględnij metody HTTP",audit_http_methods_hint:"Lista metod HTTP do uwzględnienia. Pusta lista oznacza wszystkie.",audit_http_methods_label:"Metody HTTP",audit_resp_codes:"Uwzględnij kody odpowiedzi HTTP",audit_resp_codes_hint:"Lista kodów HTTP do uwzględnienia (dopasowanie do wyrażenia regularnego). Puste listy oznaczają wszystkie. Np: 4.*, 5.*",audit_resp_codes_label:"Kod odpowiedzi HTTP (wyrażenie regularne)",audit_paths:"Ścieżki dołączania",audit_paths_hint:"Lista ścieżek do uwzględnienia (dopasowanie regex). Pusta lista oznacza wszystkie.",audit_paths_label:"Ścieżka HTTP (regex)",audit_paths_exclude:"Wyklucz ścieżki",audit_paths_exclude_hint:"Lista ścieżek do wykluczenia (dopasowanie do wyrażenia regularnego). Pusta lista oznacza brak.",audit_paths_exclude_label:"Ścieżka HTTP (wyrażenie regularne)",exchange_providers:"Dostawcy wymiany",admin_extensions:"Rozszerzenia administracyjne",admin_extensions_label:"Rozszerzenia administracyjne",admin_extensions_hint:"Tylko użytkownik rozszerzeń z uprawnieniami administratora może używać",user_default_extensions:"Domyślne Rozszerzenia Użytkownika",user_default_extensions_label:"Rozszerzenia użytkownika",user_default_extensions_hint:"Rozszerzenia, które będą domyślnie włączone dla użytkowników.",miscellanous:"Różne",misc_disable_extensions:"Wyłącz rozszerzenia",misc_disable_extensions_label:"Wyłącz wszystkie rozszerzenia",misc_hide_api:"Ukryj API",misc_hide_api_label:"Ukrywa interfejs API portfela, rozszerzenia mogą zdecydować się na honorowanie",wallets_management:"Zarządzanie portfelami",funding_source_info:"Informacje o źródle finansowania",funding_source:"Źródło finansowania: {wallet_class}",node_balance:"Saldo węzła: {balance} sats",lnbits_balance:"Saldo LNbits: {balance} sats",funding_reserve_percent:"Rezerwa procentowa: {percent} %",node_management:"Zarządzanie węzłami",node_management_not_supported:"Zarządzanie węzłami nie jest obsługiwane przez aktywne źródło finansowania.",toggle_node_ui:"Interfejs użytkownika węzła",toggle_public_node_ui:"Interfejs węzła publicznego",toggle_transactions_node_ui:"Karta transakcji (wyłącz na dużych węzłach CLN)",invoice_expiry:"Wygaśnięcie faktury",invoice_expiry_label:"Termin wygaśnięcia faktury (sekundy)",fee_reserve:"Rezerwa Opłat",fee_reserve_msats:"Opłata rezerwowa w msats",fee_reserve_percent:"Opłata rezerwacyjna w procentach",server_management:"Zarządzanie serwerem",base_url:"Podstawowy adres URL",base_url_label:"Adres URL statyczny/bazowy dla serwera",authentication:"Uwierzytelnianie",auth_token_expiry_label:"Minuty wygaśnięcia tokenu",auth_token_expiry_hint:"Czas w minutach do wygaśnięcia tokenu",auth_allowed_methods_label:"Dopuszczalne metody autoryzacji",auth_allowed_methods_hint:"Wybierz metody autoryzacji",auth_nostr_label:"Żądanie URL Nostr",auth_nostr_hint:"Absolutny URL, którego klienci będą używać do logowania.",auth_google_ci_label:"Identyfikator klienta Google",auth_google_ci_hint:"Upewnij się, że autoryzowane URI przekierowania zawierają https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Hasło tajne klienta Google",auth_gh_client_id_label:"Identyfikator klienta GitHub",auth_gh_client_id_hint:"Upewnij się, że adres URL wywołania zwrotnego autoryzacji jest ustawiony na https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Client Secret",auth_keycloak_label:"Adres URL Discovery Keycloak",auth_keycloak_ci_label:"Identyfikator klienta Keycloak",auth_keycloak_ci_hint:"Upewnij się, że URL zwrotu autoryzacji jest ustawiony na https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Hasło klienta Keycloak",auth_keycloak_custom_org_label:"Własna organizacja Keycloak",auth_keycloak_custom_icon_label:"Własna ikona Keycloak (URL)",auth_oidc_label:"Adres URL Discovery OIDC",auth_oidc_ci_label:"Identyfikator klienta OIDC",auth_oidc_ci_hint:"Upewnij się, że URL zwrotu autoryzacji jest ustawiony na https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Hasło klienta OIDC",auth_oidc_custom_org_label:"Nazwa własnej organizacji OIDC (np. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Własna ikona OIDC (URL)",currency_settings:"Ustawienia waluty",allowed_currencies:"Dozwolone waluty",allowed_currencies_hint:"Ogranicz liczbę dostępnych walut fiducjarnych",default_account_currency:"Domyślna waluta konta",default_account_currency_hint:"Domyślna waluta dla księgowości",service_fee_label:"Opłata serwisowa (%)",service_fee_hint:"Opłata pobierana za transakcję (%)",service_fee_max_label:"Opłata za usługę max (sats)",service_fee_max_hint:"Maksymalna opłata serwisowa do pobrania w (sats)",fee_wallet:"Portfel opłat",fee_wallet_label:"Portfel opłat (ID portfela)",fee_wallet_hint:"Identyfikator portfela, do którego wysłać środki",disable_fee:"Wyłącz opłatę",disable_fee_internal:"Wyłącz opłatę za usługę dla płatności wewnętrznych",disable_fee_internal_desc:"Wyłącz opłatę serwisową dla wewnętrznych płatności Lightning",ui_management:"Zarządzanie interfejsem użytkownika",ui_site_title:"Tytuł strony",ui_site_tagline:"Podpis strony",ui_elements_enable:"Włącz elementy na stronie głównej",ui_elements_disable:"Wyłącz elementy na stronie głównej",ui_toggle_elements_tip:"Usuń elementy strony głównej takie jak 'runs on' itp.",ui_site_description:"Opis strony",ui_site_description_hint:"Użyj zwykłego tekstu, Markdown lub surowego HTML",ui_default_wallet_name:"Domyślna nazwa portfela",lnbits_wallet:"Portfel LNbits",denomination:"Nominacja",denomination_hint:"Nazwa dla tokena FakeWallet",ui_qr_code_logo:"Logo kodu QR",ui_qr_code_logo_hint:"Adres URL do obrazu logo w kodzie QR",ui_custom_badge:"Niestandardowa odznaka",ui_custom_badge_label:"Znak niestandardowy 'UŻYWAJ OSTROŻNIE - portfel LNbits wciąż jest w WERSJI BETA'",ui_custom_badge_color_label:"Niestandardowy kolor odznaki",themes:"Motywy",themes_hint:"Wybierz motywy dostępne dla użytkowników",custom_logo:"Logo niestandardowe",custom_logo_hint:"URL do obrazu logo",ad_space_title:"Tytuł reklamy",ad_space_title_label:"Wspierane przez",ad_slots:"Sloty reklamowe",ad_slots_hint:"Adres URL i ścieżki plików obrazów w formacie CSV, rozszerzenia mogą zdecydować się na honorowanie",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Reklamy włączone",ads_disabled:"Reklamy wyłączone",user_management:"Zarządzanie użytkownikami",admin_users:"Użytkownicy administratorzy",admin_users_hint:"Użytkownicy z uprawnieniami administratora",admin_users_label:"Identyfikator użytkownika",allowed_users:"Dozwoleni użytkownicy",allowed_users_hint:"Tylko ci użytkownicy mogą używać LNbits",allowed_users_label:"Identyfikator użytkownika",allow_creation_user:"Zezwól na tworzenie nowych użytkowników",allow_creation_user_desc:"Zezwól na tworzenie nowych użytkowników na stronie głównej indeksu",components:"Komponenty",long_running_endpoints:"5 najdłużej działających punktów końcowych",http_request_methods:"Metody żądań HTTP",http_response_codes:"Kody Odpowiedzi HTTP",request_details:"Szczegóły żądania",http_request_details:"Szczegóły żądania HTTP",block_explorer:"Przeglądarka bloków",enable_block_explorer:"Włącz przeglądarkę bloków",block_explorer_desc:"Umożliwia użytkownikom przeglądanie transakcji i adresów Bitcoin przez Electrum.",blockexplorer_public_api:"Publiczny dostęp do API",blockexplorer_public_api_desc:"Zezwól na nieuwierzytelniony dostęp do punktów końcowych API przeglądarki bloków.",electrum_server_url:"URL serwera Electrum",electrum_server_url_hint:"np. ssl://electrum.blockstream.info:50002 lub tcp://localhost:50001",blockexplorer_search_label:"Szukaj po TXID lub adresie",blockexplorer_search_hint:"64-znakowy hex = transakcja · cokolwiek innego = adres Bitcoin",recent_blocks:"Ostatnie bloki",chain_tip:"Wierzchołek łańcucha",block_height:"Wysokość bloku",block_fee:"opłata bloku",fee_estimates:"Szacunki opłat",confirmed_balance:"Potwierdzony saldo",unconfirmed_balance:"Niepotwierdzony saldo",transaction_history:"Historia transakcji",coinbase:"Coinbase",inputs:"Wejścia",outputs:"Wyjścia",confirmations:"Potwierdzenia",confirmed:"Potwierdzone",unconfirmed:"Niepotwierdzone",history_unavailable:"Historia transakcji niedostępna (adres ma zbyt wiele transakcji)",address:"Adres",block_number:"Blok #{height}",block_diff:"trud. {value}",block_hash:"Hash",previous_block:"Poprzedni blok",merkle_root:"Korzeń Merkle",version:"Wersja",bits:"Bity",difficulty:"Trudność",nonce:"Nonce",txid:"TXID",vsize:"Rozmiar wirtualny",weight:"Waga",n_block_fee:"opłata {n} bloków"},window.localisation.fr={confirm:"Oui",server:"Serveur",theme:"Thème",site_customisation:"Personnalisation du site",funding:"Financement",users:"Utilisateurs",audit:"Audit",apps:"Applications",channels:"Canaux",transactions:"Transactions",dashboard:"Tableau de bord",node:"Noeud",export_users:"Exporter les utilisateurs",no_users:"Aucun utilisateur trouvé",total_capacity:"Capacité totale",avg_channel_size:"Taille moyenne du canal",biggest_channel_size:"Taille de canal maximale",smallest_channel_size:"Taille de canal la plus petite",number_of_channels:"Nombre de canaux",active_channels:"Canaux actifs",connect_peer:"Connecter un pair",connect:"Connecter",open_channel:"Ouvrir le canal",open:"Ouvrir",close_channel:"Fermer le canal",close:"Fermer",restart:"Redémarrer le serveur",save:"Enregistrer",save_tooltip:"Enregistrer vos modifications",credit_debit:"Crédit / Débit",credit_hint:"Appuyez sur Entrée pour créditer le compte",credit_label:"{denomination} à créditer",credit_ok:"Succès du crédit/débit des fonds virtuels ({amount} sats). Les paiements dépendent des fonds réels sur la source de financement.",restart_tooltip:"Redémarrez le serveur pour que les changements prennent effet",add_funds_tooltip:"Ajouter des fonds à un portefeuille.",reset_defaults:"Réinitialiser aux valeurs par défaut",reset_defaults_tooltip:"Supprimer tous les paramètres et les réinitialiser aux valeurs par défaut.",download_backup:"Télécharger la sauvegarde de la base de données",name_your_wallet:"Nommez votre portefeuille {name}",paste_invoice_label:"Coller une facture, une demande de paiement ou un code lnurl *",lnbits_description:"Facile à installer et léger, LNbits peut fonctionner sur n'importe quelle source de financement du réseau Lightning et même LNbits lui-même! Vous pouvez exécuter LNbits pour vous-même ou offrir facilement une solution de gardien pour les autres. Chaque portefeuille a ses propres clés API et il n'y a pas de limite au nombre de portefeuilles que vous pouvez créer. La capacité de partitionner les fonds rend LNbits un outil utile pour la gestion de l'argent et comme outil de développement. Les extensions ajoutent une fonctionnalité supplémentaire à LNbits afin que vous puissiez expérimenter une gamme de technologies de pointe sur le réseau Lightning. Nous avons rendu le développement d'extensions aussi simple que possible et, en tant que projet gratuit et open source, nous encourageons les gens à développer et à soumettre les leurs.",export_to_phone:"Exporter vers le téléphone avec un code QR",export_to_phone_desc:"Ce code QR contient l'URL de votre portefeuille avec un accès complet. Vous pouvez le scanner depuis votre téléphone pour ouvrir votre portefeuille depuis là-bas.",wallet:"Portefeuille :",wallets:"Portefeuilles",add_wallet:"Ajouter un nouveau portefeuille",delete_wallet:"Supprimer le portefeuille",delete_wallet_desc:"Ce portefeuille entier sera supprimé et les fonds seront IRRECUPERABLES.",rename_wallet:"Renommer le portefeuille",update_name:"Mettre à jour le nom",fiat_tracking:"Suivi Fiat",currency:"Devise",update_currency:"Mettre à jour la devise",press_to_claim:"Appuyez pour demander du Bitcoin",donate:"Donner",view_github:"Voir sur GitHub",voidwallet_active:"VoidWallet est actif! Paiements désactivés",use_with_caution:"UTILISER AVEC PRUDENCE - Le portefeuille {name} est toujours en version BETA",service_fee:"Frais de service : {amount} % par transaction",service_fee_max:"Frais de service : {amount} % par transaction (max {max} sats)",service_fee_tooltip:"Frais de service facturés par l'administrateur du serveur LNbits pour chaque transaction sortante",toggle_darkmode:"Basculer le mode sombre",payment_reactions:"Réactions de paiement",view_swagger_docs:"Voir les documentation de l'API Swagger de LNbits",api_docs:"Documentation de l'API",api_keys_api_docs:"URL du nœud, clés API et documentation API",api_keys_warning:"Ces clés doivent être conservées en lieu sûr ; les partager pourrait entraîner la perte de fonds.",admin_key_warning:"Votre clé d'administrateur donne un accès complet à votre portefeuille, y compris la possibilité d'envoyer des paiements. Ne la partagez jamais, sauf si vous faites entièrement confiance au destinataire.",lnbits_version:"Version de LNbits",runs_on:"Fonctionne sur",paste:"Coller",paste_from_clipboard:"Coller depuis le presse-papiers",paste_request:"Coller la requête",create_invoice:"Créer une facture",camera_tooltip:"Utiliser la caméra pour scanner une facture / un code QR",export_csv:"Exporter vers CSV",chart_tooltip:"Afficher le graphique",pending:"En attente",copy_invoice:"Copier la facture",withdraw_from:"Retirer de",cancel:"Annuler",scan:"Scanner",read:"Lire",pay:"Payer",memo:"Mémo",date:"Date",payment_processing:"Traitement du paiement...",not_enough_funds:"Fonds insuffisants !",search_by_tag_memo_amount:"Rechercher par tag, mémo, montant",invoice_waiting:"Facture en attente de paiement",payment_received:"Paiement reçu",payment_sent:"Paiement envoyé",receive:"recevoir",send:"envoyer",outgoing_payment_pending:"Paiement sortant en attente",drain_funds:"Vider les fonds",drain_funds_desc:"Il s'agit d'un code QR LNURL-withdraw pour tout aspirer de ce portefeuille. Ne le partagez avec personne. Il est compatible avec balanceCheck et balanceNotify, de sorte que votre portefeuille peut continuer à retirer les fonds continuellement à partir d'ici après le premier retrait.",i_understand:"J'ai compris",copy_wallet_url:"Copier l'URL du portefeuille",disclaimer_dialog_title:"Important !",disclaimer_dialog:"La fonctionnalité de connexion sera publiée dans une future mise à jour, pour l'instant, assurez-vous de mettre cette page en favori pour accéder à votre portefeuille ultérieurement ! Ce service est en BETA, et nous ne sommes pas responsables des personnes qui perdent l'accès à leurs fonds.",no_transactions:"Aucune transaction effectuée pour le moment",manage:"Gérer",exchanges:"Échanges",extensions:"Extensions",no_extensions:"Vous n'avez installé aucune extension :(",created:"Créé",search_extensions:"Rechercher des extensions",extension_sources:"Sources d'extension",ext_sources_hint:"Dépôts à partir desquels les extensions peuvent être téléchargées",ext_sources_label:"URL source (utilisez uniquement la source officielle de l'extension LNbits et des sources fiables)",warning:"Avertissement",repository:"Référentiel",confirm_continue:"Êtes-vous sûr de vouloir continuer ?",manage_extension_details:"Installer/désinstaller l'extension",install:"Installer",uninstall:"Désinstaller",drop_db:"Supprimer les données",enable:"Activer",pay_to_enable:"Payer pour activer",enable_extension_details:"Activer l'extension pour l'utilisateur actuel",disable:"Désactiver",delete:"Supprimer",installed:"Installé",activated:"Activé",deactivated:"Désactivé",release_notes:"Notes de version",activate_extension_details:"Rendre l'extension disponible/indisponible pour les utilisateurs",featured:"Mis en avant",all:"Tout",only_admins_can_install:"Seuls les comptes administrateurs peuvent installer des extensions",admin_only:"Réservé aux administrateurs",new_version:"Nouvelle version",extension_depends_on:"Dépend de :",extension_rating_soon:"Notes des utilisateurs à venir bientôt",extension_installed_version:"Version installée",extension_uninstall_warning:"Vous êtes sur le point de supprimer l'extension pour tous les utilisateurs.",uninstall_confirm:"Oui, Désinstaller",extension_db_drop_info:"Toutes les données pour l'extension seront supprimées de manière permanente. Il n'est pas possible d'annuler cette opération !",extension_db_drop_warning:"Vous êtes sur le point de supprimer toutes les données de l'extension. Veuillez taper le nom de l'extension pour continuer :",extension_required_lnbits_version:"Cette version nécessite au moins LNbits version",min_version:"Minimum (inclus)",max_version:"Maximum (exclu)",payment_hash:"Hash de paiement",fee:"Frais",amount:"Montant",amount_sats:"Montant (sats)",tag:"Étiqueter",unit:"Unité",description:"Description",expiry:"Expiration",webhook:"Webhook",payment_proof:"Preuve de paiement",update:"Mettre à jour",update_available:"Mise à jour {version} disponible !",latest_update:"Vous êtes sur la dernière version {version}.",notifications:"Notifications",no_notifications:"Aucune notification",notifications_disabled:"Les notifications de statut LNbits sont désactivées.",enable_notifications:"Activer les notifications",enable_notifications_desc:"Si activé, il récupérera les dernières mises à jour du statut LNbits, telles que les incidents de sécurité et les mises à jour.",enable_watchdog:"Activer le Watchdog",enable_watchdog_desc:"Si elle est activée, elle changera automatiquement votre source de financement en VoidWallet si votre solde est inférieur au solde LNbits. Vous devrez activer manuellement après une mise à jour.",watchdog_interval:"Intervalle du gardien",watchdog_interval_desc:"À quelle fréquence la tâche en arrière-plan doit-elle vérifier la présence d'un signal d'arrêt d'urgence dans le delta du gardien [node_balance - lnbits_balance] (en minutes).",watchdog_delta:"Chien de garde Delta",watchdog_delta_desc:"Limite avant que l'interrupteur d'arrêt ne change la source de financement pour VoidWallet [lnbits_balance - node_balance > delta]",status:"Statut",notification_source:"Source de notification",notification_source_label:"URL source (utilisez uniquement la source officielle de statut LNbits et des sources de confiance)",more:"plus",less:"moins",releases:"Versions",watchdog:"Chien de garde",server_logs:"Journaux du serveur",ip_blocker:"Bloqueur d'IP",security:"Sécurité",security_tools:"Outils de sécurité",block_access_hint:"Bloquer l'accès par IP",allow_access_hint:"Autoriser l'accès par IP (cela passera outre les IP bloquées)",enter_ip:"Entrez l'adresse IP et appuyez sur Entrée",rate_limiter:"Limiteur de débit",wallet_limiter:"Limiteur de portefeuille",wallet_limit_max_withdraw_per_day:"Retrait quotidien maximum du portefeuille en sats (0 pour désactiver)",wallet_max_ballance:"Solde maximum du portefeuille en sats (0 pour désactiver)",wallet_limit_secs_between_trans:"Minutes et secondes entre les transactions par portefeuille (0 pour désactiver)",number_of_requests:"Nombre de requêtes",time_unit:"Unité de temps",minute:"minute",second:"seconde",hour:"heure",disable_server_log:"Désactiver le journal du serveur",enable_server_log:"Activer le journal du serveur",coming_soon:"Fonctionnalité à venir bientôt",session_has_expired:"Votre session a expiré. Veuillez vous reconnecter.",instant_access_question:"Voulez-vous un accès instantané ?",login_with_user_id:"Connexion avec l'identifiant utilisateur",or:"ou",create_new_wallet:"Créer un nouveau portefeuille",login_to_account:"Connectez-vous à votre compte",create_account:"Créer un compte",account_settings:"Paramètres du compte",signin_with_nostr:"Continuer avec Nostr",signin_with_google:"Connectez-vous avec Google",signin_with_github:"Connectez-vous avec GitHub",signin_with_keycloak:"Connectez-vous avec Keycloak",username_or_email:"Nom d'utilisateur ou e-mail",password:"Mot de passe",password_config:"Configuration du mot de passe",password_repeat:"Répétition du mot de passe",change_password:"Changer le mot de passe",update_credentials:"Mettre à jour les informations d'identification",update_pubkey:"Mettre à jour la clé publique",set_password:"Définir le mot de passe",invalid_password:"Le mot de passe doit comporter au moins 8 caractères",login:"Connexion",register:"Inscrire",username:"Nom d'utilisateur",pubkey:"Clé publique",user_id:"Identifiant utilisateur",email:"E-mail",first_name:"Prénom",last_name:"Nom de famille",picture:"Image",verify_email:"Vérifiez l'e-mail avec",account:"Compte",update_account:"Mettre à jour le compte",invalid_username:"Nom d'utilisateur invalide",auth_provider:"Fournisseur d'authentification",my_account:"Mon compte",back:"Retour",logout:"Déconnexion",look_and_feel:"Apparence",toggle_gradient:"Basculer le dégradé",gradient_background:"Fond en dégradé",language:"Langue",color_scheme:"Schéma de couleurs",admin_settings:"Paramètres administrateur",extension_cost:"Cette version nécessite un paiement minimum de {cost} sats.",extension_paid_sats:"Vous avez déjà payé {paid_sats} sats.",release_details_error:"Impossible d'obtenir les détails de la version.",pay_from_wallet:"Payer depuis le portefeuille",wallet_required:"Portefeuille *",show_qr:"Afficher le QR",retry_install:"Réessayer l'installation",new_payment:"Effectuer un nouveau paiement",update_payment:"Mettre à jour le paiement",already_paid_question:"Avez-vous déjà payé ?",sell:"Vendre",sell_require:"Demander un paiement pour activer l'extension",sell_info:"L'extension {name} nécessite un paiement minimum de {amount} sats pour être activée.",hide_empty_wallets:"Masquer les portefeuilles vides",recheck:"Revérifier",contributors:"Contributeurs",license:"Licence",reset_key:"Réinitialiser la clé",reset_password:"Réinitialiser le mot de passe",border_choices:"Choix de bordure",select_all:"Sélectionner tout",nfc_supported:"NFC pris en charge",nfc_not_supported:"NFC non pris en charge",expire_date:"Date d'expiration :",hash:"Hash :",welcome_lnbits:"Bienvenue à LNbits",setup_su_account:"Configurez le compte Superuser ci-dessous.",create_ticker_converter:"Créer un convertisseur de code de devise",enable_audit:"Activer l'audit",recommended:"Recommandé",audit_desc:"Enregistrer les requêtes HTTP selon les filtres spécifiés",audit_record_req:"Enregistrer le corps de la demande",audit_record_warning:"Avertissement :",audit_record_req_warning_1:"les données confidentielles (comme les mots de passe) seront enregistrées.",audit_record_req_warning_2:"le corps de la requête peut être de grande taille.",audit_record_use:"Utilisez-le avec précaution.",audit_ip:"Enregistrer l'adresse IP",audit_ip_desc:"Enregistrer l'adresse IP du client",audit_path_params:"Enregistrer les paramètres de chemin",audit_query_params:"Enregistrer les paramètres de la requête",audit_http_methods:"Inclure les méthodes HTTP",audit_http_methods_hint:"Liste des méthodes HTTP à inclure. Listes vides signifie toutes.",audit_http_methods_label:"Méthodes HTTP",audit_resp_codes:"Inclure les codes de réponse HTTP",audit_resp_codes_hint:"Liste des codes HTTP à inclure (correspondance regex). Les listes vides signifient tout. Ex : 4.*, 5.*",audit_resp_codes_label:"Code de réponse HTTP (regex)",audit_paths:"Inclure des chemins",audit_paths_hint:"Liste des chemins à inclure (correspondance regex). Liste vide signifie tout.",audit_paths_label:"Chemin HTTP (regex)",audit_paths_exclude:"Exclure les chemins",audit_paths_exclude_hint:"Liste des chemins à exclure (correspondance regex). Liste vide signifie aucun.",audit_paths_exclude_label:"Chemin HTTP (regex)",exchange_providers:"Fournisseurs d'échange",admin_extensions:"Extensions d'administration",admin_extensions_label:"Extensions d'administration",admin_extensions_hint:"Seuls les utilisateurs avec des privilèges d'administrateur peuvent utiliser les extensions.",user_default_extensions:"Extensions par défaut de l'utilisateur",user_default_extensions_label:"Extensions utilisateur",user_default_extensions_hint:"Extensions qui seront activées par défaut pour les utilisateurs.",miscellanous:"Divers",misc_disable_extensions:"Désactiver les extensions",misc_disable_extensions_label:"Désactiver toutes les extensions",misc_hide_api:"Masquer l'API",misc_hide_api_label:"Masque l'API du portefeuille, les extensions peuvent choisir de respecter",wallets_management:"Gestion des portefeuilles",funding_source_info:"Informations sur la source de financement",funding_source:"Source de financement : {wallet_class}",node_balance:"Solde du nœud : {balance} sats",lnbits_balance:"Solde LNbits : {balance} sats",funding_reserve_percent:"Pourcentage de Réserve : {percent} %",node_management:"Gestion des nœuds",node_management_not_supported:"La gestion des nœuds n'est pas prise en charge par la source de financement active",toggle_node_ui:"Interface utilisateur de nœud",toggle_public_node_ui:"Interface utilisateur du nœud public",toggle_transactions_node_ui:"Onglet des transactions (Désactiver sur les grands nœuds CLN)",invoice_expiry:"Expiration de la facture",invoice_expiry_label:"Expiration de la facture (secondes)",fee_reserve:"Réserve de frais",fee_reserve_msats:"Frais de réservation en msats",fee_reserve_percent:"Frais de réservation en pourcentage",server_management:"Gestion de serveur",base_url:"URL de base",base_url_label:"URL statique/de base pour le serveur",authentication:"Authentification",auth_token_expiry_label:"Durée d'expiration du jeton (en minutes)",auth_token_expiry_hint:"Durée en minutes avant l'expiration du jeton",auth_allowed_methods_label:"Méthodes d'autorisation autorisées",auth_allowed_methods_hint:"Sélectionnez les méthodes d'autorisation",auth_nostr_label:"URL de requête Nostr",auth_nostr_hint:"URL absolue que les clients utiliseront pour se connecter.",auth_google_ci_label:"ID Client Google",auth_google_ci_hint:"Assurez-vous que les URIs de redirection autorisées contiennent https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Secret client Google",auth_gh_client_id_label:"Identifiant client GitHub",auth_gh_client_id_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Secret Client GitHub",auth_keycloak_label:"URL de découverte Keycloak",auth_keycloak_ci_label:"ID Client Keycloak",auth_keycloak_ci_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Secret client Keycloak",auth_keycloak_custom_org_label:"Organisation personnalisée Keycloak",auth_keycloak_custom_icon_label:"Icône personnalisée Keycloak (URL)",auth_oidc_label:"URL de découverte OIDC",auth_oidc_ci_label:"ID Client OIDC",auth_oidc_ci_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Secret client OIDC",auth_oidc_custom_org_label:"Nom de l'organisation personnalisée OIDC (par ex. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Icône personnalisée OIDC (URL)",currency_settings:"Paramètres de devise",allowed_currencies:"Devises autorisées",allowed_currencies_hint:"Limiter le nombre de devises fiduciaires disponibles",default_account_currency:"Devise par défaut du compte",default_account_currency_hint:"Devise par défaut pour la comptabilité",service_fee_label:"Frais de service (%)",service_fee_hint:"Frais facturés par tx (%)",service_fee_max_label:"Frais de service max (sats)",service_fee_max_hint:"Frais de service maximum à facturer en (sats)",fee_wallet:"Portefeuille de frais",fee_wallet_label:"Portefeuille de frais (ID de portefeuille)",fee_wallet_hint:"Identifiant de portefeuille pour envoyer des fonds à",disable_fee:"Désactiver les frais",disable_fee_internal:"Désactiver les frais de service pour les paiements internes",disable_fee_internal_desc:"Désactiver les frais de service pour les paiements Lightning internes",ui_management:"Gestion de l'interface utilisateur",ui_site_title:"Titre du site",ui_site_tagline:"Slogan du site",ui_elements_enable:"Activer les éléments sur la page d'accueil",ui_elements_disable:"Désactiver les éléments sur la page d'accueil",ui_toggle_elements_tip:"Supprimer les éléments de la page d'accueil comme 'fonctionne avec', etc.",ui_site_description:"Description du site",ui_site_description_hint:"Utilisez du texte brut, du Markdown ou du HTML brut",ui_default_wallet_name:"Nom par Défaut du Portefeuille",lnbits_wallet:"Portefeuille LNbits",denomination:"Dénomination",denomination_hint:"Le nom du jeton FakeWallet",ui_qr_code_logo:"Logo de code QR",ui_qr_code_logo_hint:"URL de l'image du logo dans le code QR",ui_custom_badge:"Badge personnalisé",ui_custom_badge_label:"Badge personnalisé 'À UTILISER AVEC PRÉCAUTION - Le portefeuille LNbits est encore en BÊTA'",ui_custom_badge_color_label:"Couleur de badge personnalisée",themes:"Thèmes",themes_hint:"Choisissez des thèmes disponibles pour les utilisateurs",custom_logo:"Logo personnalisé",custom_logo_hint:"URL de l'image du logo",ad_space_title:"Titre de l'espace publicitaire",ad_space_title_label:"Soutenu par",ad_slots:"Emplacements publicitaires",ad_slots_hint:"URL de l'annonce et chemins des fichiers image au format CSV, les extensions peuvent choisir de respecter",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Annonces activées",ads_disabled:"Publicités désactivées",user_management:"Gestion des utilisateurs",admin_users:"Utilisateurs administrateurs",admin_users_hint:"Utilisateurs avec des privilèges d'administration",admin_users_label:"Identifiant utilisateur",allowed_users:"Utilisateurs autorisés",allowed_users_hint:"Seuls ces utilisateurs peuvent utiliser LNbits",allowed_users_label:"ID utilisateur",allow_creation_user:"Autoriser la création de nouveaux utilisateurs",allow_creation_user_desc:"Permettre la création de nouveaux utilisateurs sur la page d’index",components:"Composants",long_running_endpoints:"Top 5 points de terminaison longue durée",http_request_methods:"Méthodes de requête HTTP",http_response_codes:"Codes de réponse HTTP",request_details:"Détails de la demande",http_request_details:"Détails de la requête HTTP",block_explorer:"Block Explorer",enable_block_explorer:"Activer le Block Explorer",block_explorer_desc:"Permet aux utilisateurs d'explorer les transactions et adresses Bitcoin via Electrum.",blockexplorer_public_api:"Accès API public",blockexplorer_public_api_desc:"Autoriser l'accès non authentifié aux endpoints de l'API de l'explorateur de blocs.",electrum_server_url:"URL du serveur Electrum",electrum_server_url_hint:"p.ex. ssl://electrum.blockstream.info:50002 ou tcp://localhost:50001",blockexplorer_search_label:"Rechercher par TXID ou adresse",blockexplorer_search_hint:"Hex 64 caractères = transaction · autre chose = adresse Bitcoin",recent_blocks:"Blocs récents",chain_tip:"Sommet de chaîne",block_height:"Hauteur de bloc",block_fee:"frais de bloc",fee_estimates:"Estimations de frais",confirmed_balance:"Solde confirmé",unconfirmed_balance:"Solde non confirmé",transaction_history:"Historique des transactions",coinbase:"Coinbase",inputs:"Entrées",outputs:"Sorties",confirmations:"Confirmations",confirmed:"Confirmé",unconfirmed:"Non confirmé",history_unavailable:"Historique des transactions indisponible (adresse avec trop de transactions)",address:"Adresse",block_number:"Bloc #{height}",block_diff:"diff {value}",block_hash:"Hash",previous_block:"Bloc précédent",merkle_root:"Racine de Merkle",version:"Version",bits:"Bits",difficulty:"Difficulté",nonce:"Nonce",txid:"TXID",vsize:"Taille virtuelle",weight:"Poids",n_block_fee:"frais {n} blocs"},window.localisation.nl={confirm:"Ja",server:"Server",theme:"Thema",site_customisation:"Site-aanpassing",funding:"Financiering",users:"Gebruikers",audit:"Controle",apps:"Apps",channels:"Kanalen",transactions:"Transacties",dashboard:"Dashboard",node:"Knooppunt",export_users:"Gebruikers exporteren",no_users:"Geen gebruikers gevonden",total_capacity:"Totale capaciteit",avg_channel_size:"Gem. Kanaalgrootte",biggest_channel_size:"Grootste Kanaalgrootte",smallest_channel_size:"Kleinste Kanaalgrootte",number_of_channels:"Aantal kanalen",active_channels:"Actieve Kanalen",connect_peer:"Peer verbinden",connect:"Verbinden",open_channel:"Open Kanaal",open:"Open",close_channel:"Kanaal Sluiten",close:"Sluiten",restart:"Server opnieuw opstarten",save:"Opslaan",save_tooltip:"Sla uw wijzigingen op",credit_debit:"Credit / Debet",credit_hint:"Druk op Enter om de rekening te crediteren",credit_label:"{denomination} te crediteren",credit_ok:"Succesvol crediteren/debiteren van virtuele gelden ({amount} sats). Betalingen zijn afhankelijk van de werkelijke fondsen op de financieringsbron.",restart_tooltip:"Start de server opnieuw op zodat wijzigingen van kracht worden",add_funds_tooltip:"Voeg geld toe aan een portemonnee.",reset_defaults:"Standaardinstellingen herstellen",reset_defaults_tooltip:"Wis alle instellingen en herstel de standaardinstellingen.",download_backup:"Databaseback-up downloaden",name_your_wallet:"Geef je {name} portemonnee een naam",paste_invoice_label:"Plak een factuur, betalingsverzoek of lnurl-code*",lnbits_description:"Gemakkelijk in te stellen en lichtgewicht, LNbits kan op elke lightning-netwerkfinancieringsbron draaien en zelfs LNbits zelf! U kunt LNbits voor uzelf laten draaien of gemakkelijk een bewaardersoplossing voor anderen bieden. Elke portemonnee heeft zijn eigen API-sleutels en er is geen limiet aan het aantal portemonnees dat u kunt maken. Het kunnen partitioneren van fondsen maakt LNbits een nuttige tool voor geldbeheer en als ontwikkelingstool. Extensies voegen extra functionaliteit toe aan LNbits, zodat u kunt experimenteren met een reeks toonaangevende technologieën op het bliksemschichtnetwerk. We hebben het ontwikkelen van extensies zo eenvoudig mogelijk gemaakt en als een gratis en opensource-project moedigen we mensen aan om hun eigen ontwikkelingen in te dienen.",export_to_phone:"Exporteren naar telefoon met QR-code",export_to_phone_desc:"Deze QR-code bevat uw portemonnee-URL met volledige toegang. U kunt het vanaf uw telefoon scannen om uw portemonnee van daaruit te openen.",wallet:"Wallet:",wallets:"Portemonnees",add_wallet:"Een nieuwe portemonnee toevoegen",delete_wallet:"Portemonnee verwijderen",delete_wallet_desc:"Deze hele portemonnee wordt verwijderd, de fondsen worden NIET TERUGGEVONDEN.",rename_wallet:"Portemonnee hernoemen",update_name:"Naam bijwerken",fiat_tracking:"Volgfunctie voor fiat-valuata",currency:"Valuta",update_currency:"Valuta bijwerken",press_to_claim:"Druk om bitcoin te claimen",donate:"Doneren",view_github:"Bekijken op GitHub",voidwallet_active:"VoidWallet is actief! Betalingen uitgeschakeld",use_with_caution:"GEBRUIK MET VOORZICHTIGHEID - {name} portemonnee is nog in BETA",service_fee:"Servicekosten: {amount} % per transactie",service_fee_max:"Servicekosten: {amount} % per transactie (max {max} sats)",service_fee_tooltip:"Transactiekosten in rekening gebracht door de LNbits serverbeheerder per uitgaande transactie",toggle_darkmode:"Donkere modus aan/uit",payment_reactions:"Betalingsreacties",view_swagger_docs:"Bekijk LNbits Swagger API-documentatie",api_docs:"API-documentatie",api_keys_api_docs:"Node URL, API-sleutels en API-documentatie",api_keys_warning:"Bewaar deze sleutels veilig; het delen ervan kan leiden tot verlies van tegoeden.",admin_key_warning:"Je beheerderssleutel geeft volledige toegang tot je wallet, inclusief de mogelijkheid om betalingen te versturen. Deel deze nooit, tenzij je de ontvanger volledig vertrouwt.",lnbits_version:"LNbits-versie",runs_on:"Draait op",paste:"Plakken",paste_from_clipboard:"Plakken van klembord",paste_request:"Verzoek plakken",create_invoice:"Factuur aanmaken",camera_tooltip:"Gebruik de camera om een factuur/QR-code te scannen",export_csv:"Exporteer naar CSV",chart_tooltip:"Toon grafiek",pending:"In behandeling",copy_invoice:"Kopieer factuur",withdraw_from:"Opnemen van",cancel:"Annuleren",scan:"Scannen",read:"Lezen",pay:"Betalen",memo:"Memo",date:"Datum",payment_processing:"Verwerking betaling...",not_enough_funds:"Onvoldoende saldo!",search_by_tag_memo_amount:"Zoeken op tag, memo, bedrag",invoice_waiting:"Factuur wachtend op betaling",payment_received:"Betaling ontvangen",payment_sent:"Betaling verzonden",receive:"ontvangen",send:"versturen",outgoing_payment_pending:"Uitgaande betaling in behandeling",drain_funds:"Geld opnemen",drain_funds_desc:"Dit is een LNURL-withdraw QR-code om alles uit deze portemonnee te halen. Deel deze code niet met anderen. Het is compatibel met balanceCheck en balanceNotify zodat jouw portemonnee continu geld kan blijven opnemen vanaf hier na de eerste opname.",i_understand:"Ik begrijp het",copy_wallet_url:"Kopieer portemonnee-URL",disclaimer_dialog_title:"Belangrijk!",disclaimer_dialog:"Inlogfunctionaliteit wordt uitgebracht in een toekomstige update. Zorg er nu voor dat je deze pagina als favoriet markeert om in de toekomst toegang te krijgen tot je portemonnee! Deze service is in BETA en we zijn niet verantwoordelijk voor mensen die de toegang tot hun fondsen verliezen.",no_transactions:"Er zijn nog geen transacties gedaan",manage:"Beheer",exchanges:"Beurzen",extensions:"Extensies",no_extensions:"Je hebt geen extensies geïnstalleerd :(",created:"Aangemaakt",search_extensions:"Zoekextensies",extension_sources:"Extensiebronnen",ext_sources_hint:"Repositories van waar de extensies kunnen worden gedownload",ext_sources_label:"Bron-URL (gebruik alleen de officiële LNbits-extensiebron en bronnen die je kunt vertrouwen)",warning:"Waarschuwing",repository:"Repository",confirm_continue:"Weet je zeker dat je wilt doorgaan?",manage_extension_details:"Installeren/verwijderen van extensie",install:"Installeren",uninstall:"Deïnstalleren",drop_db:"Gegevens verwijderen",enable:"Inschakelen",pay_to_enable:"Betalen om te activeren",enable_extension_details:"Schakel extensie in voor huidige gebruiker",disable:"Uitschakelen",delete:"Verwijderen",installed:"Geïnstalleerd",activated:"Geactiveerd",deactivated:"Gedeactiveerd",release_notes:"Release-opmerkingen",activate_extension_details:"Maak extensie beschikbaar/niet beschikbaar voor gebruikers",featured:"Uitgelicht",all:"Alles",only_admins_can_install:"Alleen beheerdersaccounts kunnen extensies installeren",admin_only:"Alleen beheerder",new_version:"Nieuwe Versie",extension_depends_on:"Afhankelijk van:",extension_rating_soon:"Beoordelingen binnenkort beschikbaar",extension_installed_version:"Geïnstalleerde versie",extension_uninstall_warning:"U staat op het punt de extensie voor alle gebruikers te verwijderen.",uninstall_confirm:"Ja, de-installeren",extension_db_drop_info:"Alle gegevens voor de extensie zullen permanent worden verwijderd. Er is geen manier om deze bewerking ongedaan te maken!",extension_db_drop_warning:"U staat op het punt alle gegevens voor de extensie te verwijderen. Typ de naam van de extensie om door te gaan:",extension_required_lnbits_version:"Deze release vereist ten minste LNbits-versie",min_version:"Minimum (inbegrepen)",max_version:"Maximum (uitgesloten)",payment_hash:"Betalings-hash",fee:"Kosten",amount:"Bedrag",amount_sats:"Bedrag (sats)",tag:"Label",unit:"Eenheid",description:"Beschrijving",expiry:"Vervaldatum",webhook:"Webhook",payment_proof:"Betalingsbewijs",update:"Bijwerken",update_available:"Update {version} beschikbaar!",latest_update:"U bent op de nieuwste versie {version}.",notifications:"Meldingen",no_notifications:"Geen meldingen",notifications_disabled:"LNbits-statusmeldingen zijn uitgeschakeld.",enable_notifications:"Schakel meldingen in",enable_notifications_desc:"Indien ingeschakeld zal het de laatste LNbits Status updates ophalen, zoals veiligheidsincidenten en updates.",enable_watchdog:"Inschakelen Watchdog",enable_watchdog_desc:"Indien ingeschakeld, wordt uw betaalbron automatisch gewijzigd naar VoidWallet als uw saldo lager is dan het saldo van LNbits. U zult dit na een update handmatig moeten inschakelen.",watchdog_interval:"Watchdog-interval",watchdog_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op een killswitch signaal in het watchdog verschil [node_balance - lnbits_balance] (in minuten).",watchdog_delta:"Waakhond Delta",watchdog_delta_desc:"Limiet voordat de killswitch de financieringsbron verandert naar VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notificatiebron",notification_source_label:"Bron-URL (gebruik alleen de officiële LNbits-statusbron en bronnen die u vertrouwt)",more:"meer",less:"minder",releases:"Uitgaven",watchdog:"Waakhond",server_logs:"Serverlogboeken",ip_blocker:"IP-blokkering",security:"Beveiliging",security_tools:"Beveiligingstools",block_access_hint:"Toegang blokkeren per IP",allow_access_hint:"Toegang verlenen op basis van IP (zal geblokkeerde IP's overschrijven)",enter_ip:"Voer IP in en druk op enter",rate_limiter:"Snelheidsbegrenzer",wallet_limiter:"Portemonnee Limietsteller",wallet_limit_max_withdraw_per_day:"Maximale dagelijkse opname van wallet in sats (0 om uit te schakelen)",wallet_max_ballance:"Maximale portefeuillesaldo in sats (0 om uit te schakelen)",wallet_limit_secs_between_trans:"Min seconden tussen transacties per portemonnee (0 om uit te schakelen)",number_of_requests:"Aantal verzoeken",time_unit:"Tijdeenheid",minute:"minuut",second:"seconde",hour:"uur",disable_server_log:"Serverlog uitschakelen",enable_server_log:"Activeer Serverlog",coming_soon:"Functie binnenkort beschikbaar",session_has_expired:"Uw sessie is verlopen. Log alstublieft opnieuw in.",instant_access_question:"Wil je directe toegang?",login_with_user_id:"Inloggen met gebruikers-ID",or:"of",create_new_wallet:"Nieuwe portemonnee aanmaken",login_to_account:"Log in op je account",create_account:"Account aanmaken",account_settings:"Accountinstellingen",signin_with_nostr:"Doorgaan met Nostr",signin_with_google:"Inloggen met Google",signin_with_github:"Inloggen met GitHub",signin_with_keycloak:"Inloggen met Keycloak",username_or_email:"Gebruikersnaam of e-mail",password:"Wachtwoord",password_config:"Wachtwoordconfiguratie",password_repeat:"Wachtwoord herhalen",change_password:"Wachtwoord wijzigen",update_credentials:"Referenties bijwerken",update_pubkey:"Openbare Sleutel Bijwerken",set_password:"Wachtwoord instellen",invalid_password:"Wachtwoord moet ten minste 8 tekens bevatten",login:"Inloggen",register:"Registreren",username:"Gebruikersnaam",pubkey:"Publieke Sleutel",user_id:"Gebruikers-ID",email:"E-mail",first_name:"Voornaam",last_name:"Achternaam",picture:"Foto",verify_email:"E-mail verifiëren met",account:"Account",update_account:"Account bijwerken",invalid_username:"Ongeldige gebruikersnaam",auth_provider:"Auth Provider",my_account:"Mijn Account",back:"Terug",logout:"Afmelden",look_and_feel:"Uiterlijk en gedrag",toggle_gradient:"Gradiënt Schakelen",gradient_background:"Verloopachtergrond",language:"Taal",color_scheme:"Kleurenschema",admin_settings:"Beheerdersinstellingen",extension_cost:"Deze release vereist een betaling van minimaal {cost} sats.",extension_paid_sats:"U heeft al {paid_sats} sats betaald.",release_details_error:"Kan de gegevens van de release niet ophalen.",pay_from_wallet:"Betalen vanuit Portemonnee",wallet_required:"Wallet *",show_qr:"Toon QR",retry_install:"Opnieuw installeren",new_payment:"Nieuwe betaling maken",update_payment:"Betaling bijwerken",already_paid_question:"Heb je al betaald?",sell:"Verkopen",sell_require:"Vraag betaling om de extensie te activeren.",sell_info:"De {name} extensie vereist een betaling van minimaal {amount} sats om in te schakelen.",hide_empty_wallets:"Verberg lege portemonnees",recheck:"Opnieuw controleren",contributors:"Bijdragers",license:"Licentie",reset_key:"Hersteltoets",reset_password:"Wachtwoord Resetten",border_choices:"Randkeuzes",select_all:"Alles selecteren",nfc_supported:"NFC Ondersteund",nfc_not_supported:"NFC niet ondersteund",expire_date:"Vervaldatum:",hash:"Hash:",welcome_lnbits:"Welkom bij LNbits",setup_su_account:"Stel het Superuser-account hieronder in.",create_ticker_converter:"Maak Valuta Ticker Converter",enable_audit:"Audit inschakelen",recommended:"Aanbevolen",audit_desc:"HTTP-verzoeken vastleggen volgens de opgegeven filters",audit_record_req:"Verzoeklichaam registreren",audit_record_warning:"Waarschuwing:",audit_record_req_warning_1:"vertrouwelijke gegevens (zoals wachtwoorden) worden gelogd.",audit_record_req_warning_2:"de aanvraagbody kan een grote omvang hebben.",audit_record_use:"Gebruik het met voorzichtigheid.",audit_ip:"IP-adres vastleggen",audit_ip_desc:"Leg het IP-adres van de klant vast",audit_path_params:"Parameters van het pad opnemen",audit_query_params:"Queryparameters vastleggen",audit_http_methods:"Inclusief HTTP-methoden",audit_http_methods_hint:"Lijst van HTTP-methoden die moeten worden opgenomen. Lege lijsten betekenen alles.",audit_http_methods_label:"HTTP-methoden",audit_resp_codes:"Inclusief HTTP-responscodes",audit_resp_codes_hint:"Lijst van op te nemen HTTP-codes (regex-overeenkomst). Lege lijst betekent alles. Bijvoorbeeld: 4.*, 5.*",audit_resp_codes_label:"HTTP-responscode (regex)",audit_paths:"Inclusiepad",audit_paths_hint:"Lijst met paden die moeten worden opgenomen (regex match). Lege lijst betekent alles.",audit_paths_label:"HTTP-pad (regex)",audit_paths_exclude:"Paden uitsluiten",audit_paths_exclude_hint:"Lijst met paden die moeten worden uitgesloten (regex-overeenkomst). Een lege lijst betekent geen.",audit_paths_exclude_label:"HTTP-pad (regex)",exchange_providers:"Wisselaanbieders",admin_extensions:"Beheeruitbreidingen",admin_extensions_label:"Beheerdersuitbreidingen",admin_extensions_hint:"Alleen gebruikers met beheerdersrechten kunnen extensies gebruiken.",user_default_extensions:"Standaardextensies voor gebruikers",user_default_extensions_label:"Gebruikersuitbreidingen",user_default_extensions_hint:"Extensies die standaard voor de gebruikers worden ingeschakeld.",miscellanous:"Diversen",misc_disable_extensions:"Extensies uitschakelen",misc_disable_extensions_label:"Alle extensies uitschakelen",misc_hide_api:"API verbergen",misc_hide_api_label:"Verbergt de wallet-API, extensies kunnen ervoor kiezen dit te respecteren",wallets_management:"Beheer van portemonnees",funding_source_info:"Financieringsbroninfo",funding_source:"Financieringsbron: {wallet_class}",node_balance:"Node Balans: {balance} sats",lnbits_balance:"LNbits Saldo: {balance} sats",funding_reserve_percent:"Reservepercentage: {percent} %",node_management:"Nodebeheer",node_management_not_supported:"Nodebeheer wordt niet ondersteund door de actieve financieringsbron",toggle_node_ui:"Node UI",toggle_public_node_ui:"Openbare Node UI",toggle_transactions_node_ui:"Transacties Tabblad (Uitschakelen op grote CLN-nodes)",invoice_expiry:"Factuurvervaldatum",invoice_expiry_label:"Factuurverloop (seconden)",fee_reserve:"Toegangsvergoeding Reserve",fee_reserve_msats:"Reserveringskosten in msats",fee_reserve_percent:"Reserveringskosten in procent",server_management:"Serverbeheer",base_url:"Basis-URL",base_url_label:"Statisch/Basis-URL voor de server",authentication:"Authenticatie",auth_token_expiry_label:"Token vervalt over minuten",auth_token_expiry_hint:"Tijd in minuten totdat de token verloopt",auth_allowed_methods_label:"Toegestane autorisatiemethoden",auth_allowed_methods_hint:"Selecteer autorisatiemethoden",auth_nostr_label:"Nostr Aanvraag-URL",auth_nostr_hint:"Absolute URL die de klanten zullen gebruiken om in te loggen.",auth_google_ci_label:"Google Client-ID",auth_google_ci_hint:"Zorg ervoor dat de geautoriseerde omleidings-URL's https://{domain}/api/v1/auth/google/token bevatten.",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"GitHub client-ID",auth_gh_client_id_hint:"Zorg ervoor dat de autorisatie-callback-URL is ingesteld op https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Clientgeheim",auth_keycloak_label:"Keycloak Ontdekking URL",auth_keycloak_ci_label:"Keycloak-client-ID",auth_keycloak_ci_hint:"Zorg ervoor dat de autorisatie callback-URL is ingesteld op https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak Clientgeheim",auth_keycloak_custom_org_label:"Keycloak Aangepaste Organisatie",auth_keycloak_custom_icon_label:"Keycloak Aangepast Pictogram (URL)",auth_oidc_label:"OIDC Ontdekking URL",auth_oidc_ci_label:"OIDC-client-ID",auth_oidc_ci_hint:"Zorg ervoor dat de autorisatie callback-URL is ingesteld op https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC Clientgeheim",auth_oidc_custom_org_label:"OIDC Aangepaste Organisatienaam (bijv. Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC Aangepast Pictogram (URL)",currency_settings:"Valuta-instellingen",allowed_currencies:"Toegestane valuta's",allowed_currencies_hint:"Beperk het aantal beschikbare fiatvaluta's",default_account_currency:"Standaardrekeningvaluta",default_account_currency_hint:"Standaardvaluta voor boekhouding",service_fee_label:"Servicekosten (%)",service_fee_hint:"Toeslag per transactie (%)",service_fee_max_label:"Servicekosten max (sats)",service_fee_max_hint:"Maximale servicekosten om in rekening te brengen in (sats)",fee_wallet:"Kosten Portemonnee",fee_wallet_label:"Kosten portemonnee (wallet ID)",fee_wallet_hint:"Wallet-ID om geld naar over te maken",disable_fee:"Kosten uitschakelen",disable_fee_internal:"Servicekosten uitschakelen voor interne betalingen",disable_fee_internal_desc:"Dienstenkosten uitschakelen voor interne Lightning-betalingen",ui_management:"UI-beheer",ui_site_title:"Site titel",ui_site_tagline:"Site-slogan",ui_elements_enable:"Elementen op de homepage inschakelen",ui_elements_disable:"Elementen op de homepage uitschakelen",ui_toggle_elements_tip:"Verwijder startpagina-elementen zoals 'werkt op' enz.",ui_site_description:"Sitebeschrijving",ui_site_description_hint:"Gebruik platte tekst, Markdown, of ruwe HTML",ui_default_wallet_name:"Standaard Wallet Naam",lnbits_wallet:"LNbits-portemonnee",denomination:"Denominatie",denomination_hint:"De naam voor de FakeWallet token",ui_qr_code_logo:"QR-code-logo",ui_qr_code_logo_hint:"URL naar logo-afbeelding in QR-code",ui_custom_badge:"Aangepaste badge",ui_custom_badge_label:"Aangepaste Badge 'GEBRUIK MET VOORZICHTIGHEID - LNbits-portemonnee is nog in BÈTA'",ui_custom_badge_color_label:"Aangepaste Badge Kleur",themes:"Thema's",themes_hint:"Kies thema's beschikbaar voor gebruikers",custom_logo:"Aangepast logo",custom_logo_hint:"URL naar logo-afbeelding",ad_space_title:"Advertentieruimte Titel",ad_space_title_label:"Ondersteund door",ad_slots:"Advertentieblokken",ad_slots_hint:"Ad URL en afbeeldingspad in CSV-formaat, extensies kunnen ervoor kiezen te honoreren",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Advertenties ingeschakeld",ads_disabled:"Advertenties uitgeschakeld",user_management:"Gebruikersbeheer",admin_users:"Beheerdersgebruikers",admin_users_hint:"Gebruikers met beheerdersrechten",admin_users_label:"Gebruikers-ID",allowed_users:"Toegestane gebruikers",allowed_users_hint:"Alleen deze gebruikers kunnen LNbits gebruiken",allowed_users_label:"Gebruikers-ID",allow_creation_user:"Sta het aanmaken van nieuwe gebruikers toe",allow_creation_user_desc:"Sta de aanmaak van nieuwe gebruikers op de indexpagina toe",components:"Componenten",long_running_endpoints:"Top 5 langlopende eindpunten",http_request_methods:"HTTP-aanvraagmethoden",http_response_codes:"HTTP-responscodes",request_details:"Aanvraagdetails",http_request_details:"HTTP-verzoekdetails",block_explorer:"Block Explorer",enable_block_explorer:"Block Explorer inschakelen",block_explorer_desc:"Laat gebruikers Bitcoin-transacties en -adressen verkennen via Electrum.",blockexplorer_public_api:"Publieke API-toegang",blockexplorer_public_api_desc:"Niet-geauthenticeerde toegang tot de block explorer API-eindpunten toestaan.",electrum_server_url:"Electrum-server-URL",electrum_server_url_hint:"bijv. ssl://electrum.blockstream.info:50002 of tcp://localhost:50001",blockexplorer_search_label:"Zoeken op TXID of adres",blockexplorer_search_hint:"64-karakter hex = transactie · alles anders = Bitcoin-adres",recent_blocks:"Recente blokken",chain_tip:"Kettingtop",block_height:"Blokhoogte",block_fee:"blokvergoeding",fee_estimates:"Vergoedingsschattingen",confirmed_balance:"Bevestigd saldo",unconfirmed_balance:"Onbevestigd saldo",transaction_history:"Transactiegeschiedenis",coinbase:"Coinbase",inputs:"Invoer",outputs:"Uitvoer",confirmations:"Bevestigingen",confirmed:"Bevestigd",unconfirmed:"Onbevestigd",history_unavailable:"Transactiegeschiedenis niet beschikbaar (adres heeft te veel transacties)",address:"Adres",block_number:"Blok #{height}",block_diff:"moeil. {value}",block_hash:"Hash",previous_block:"Vorig blok",merkle_root:"Merkle-wortel",version:"Versie",bits:"Bits",difficulty:"Moeilijkheid",nonce:"Nonce",txid:"TXID",vsize:"Virtuele grootte",weight:"Gewicht",n_block_fee:"{n}-blok vergoeding"},window.localisation.we={confirm:"Ydw",server:"Gweinydd",theme:"Thema",site_customisation:"Addasu Safle",funding:"Arian fyndio",users:"Defnyddwyr",audit:"Archwilio",apps:"Apiau",channels:"Sianelau",transactions:"Trafodion",dashboard:"Panel Gweinyddol",node:"Nod",export_users:"Allfor Defnyddwyr",no_users:"Heb ganfod defnyddwyr",total_capacity:"Capasiti Cyfanswm",avg_channel_size:"Maint Sianel Cyf.",biggest_channel_size:"Maint Sianel Fwyaf",smallest_channel_size:"Maint Sianel Lleiaf",number_of_channels:"Nifer y Sianeli",active_channels:"Sianeli Gweithredol",connect_peer:"Cysylltu â Chymar",connect:"Cysylltu",open_channel:"Sianel Agored",open:"Agor",close_channel:"Cau Sianel",close:"cau",restart:"Ailgychwyn gweinydd",save:"Save",save_tooltip:"cadw eich newidiadau",credit_debit:"Credyd / Debyd",credit_hint:"Pwyswch Enter i gyfrif credyd",credit_label:"{denomination} i gredyd",credit_ok:"Credydu/dad-debydu llwyddiannus o gronfeydd rhithwir ({amount} sats). Mae taliadau yn dibynnu ar y cronfeydd gwirioneddol sydd ar y ffynhonnell ariannu.",restart_tooltip:"Ailgychwyn y gweinydd er mwyn i newidiadau ddod i rym",add_funds_tooltip:"Ychwanegu arian at waled.",reset_defaults:"Ailosod i`r rhagosodiadau",reset_defaults_tooltip:"Dileu pob gosodiad ac ailosod i`r rhagosodiadau.",download_backup:"Lawrlwytho copi wrth gefn cronfa ddata",name_your_wallet:"Enwch eich waled {name}",paste_invoice_label:"Gludwch anfoneb, cais am daliad neu god lnurl *",lnbits_description:"Yn hawdd iw sefydlu ac yn ysgafn, gall LNbits redeg ar unrhyw ffynhonnell ariannu rhwydwaith mellt a hyd yn oed LNbits ei hun! Gallwch redeg LNbits i chi`ch hun, neu gynnig datrysiad ceidwad i eraill yn hawdd. Mae gan bob waled ei allweddi API ei hun ac nid oes cyfyngiad ar nifer y waledi y gallwch eu gwneud. Mae gallu rhannu cronfeydd yn gwneud LNbits yn arf defnyddiol ar gyfer rheoli arian ac fel offeryn datblygu. Mae estyniadau yn ychwanegu ymarferoldeb ychwanegol at LNbits fel y gallwch arbrofi gydag ystod o dechnolegau blaengar ar y rhwydwaith mellt. Rydym wedi gwneud datblygu estyniadau mor hawdd â phosibl, ac fel prosiect ffynhonnell agored am ddim, rydym yn annog pobl i ddatblygu a chyflwyno eu rhai eu hunain.",export_to_phone:"Allforio i Ffôn gyda chod QR",export_to_phone_desc:"Mae`r cod QR hwn yn cynnwys URL eich waled gyda mynediad llawn. Gallwch ei sganio o`ch ffôn i agor eich waled oddi yno.",wallet:"Waled:",wallets:"Waledi",add_wallet:"Ychwanegu waled newydd",delete_wallet:"Dileu waled",delete_wallet_desc:"Bydd y waled gyfan hon yn cael ei dileu, ni fydd modd adennill yr arian.",rename_wallet:"Ailenwi waled",update_name:"Diweddaru enw",fiat_tracking:"Olrhain Fiat",currency:"Arian Cyfred",update_currency:"Diweddaru arian cyfred",press_to_claim:"Pwyswch i hawlio bitcoin",donate:"Rhoi",view_github:"Gweld ar GitHub",voidwallet_active:" Mae VoidWallet yn weithredol! Taliadau wedi`u hanalluogi",use_with_caution:"DEFNYDDIO GYDA GOFAL - mae waled {name} yn dal yn BETA",service_fee:"Ffi gwasanaeth: {amount} % y trafodiad",service_fee_max:"Ffi gwasanaeth: {amount} % y trafodiad (uchafswm {max} sats)",service_fee_tooltip:"Ffi gwasanaeth a godir gan weinyddwr gweinydd LNbits ym mhob trafodiad sy'n mynd allan",toggle_darkmode:"Toglo Modd Tywyll",payment_reactions:"Adweithiau Talu",view_swagger_docs:"Gweld dogfennau API LNbits Swagger",api_docs:"Dogfennau API",api_keys_api_docs:"URL y nod, allweddi API a dogfennau API",api_keys_warning:"Dylid cadw'r allweddi hyn yn ddiogel; gall eu rhannu arwain at golli arian.",admin_key_warning:"Mae eich allwedd weinyddol yn rhoi mynediad llawn i'ch waled, gan gynnwys y gallu i anfon taliadau. Peidiwch byth â'i rhannu oni bai eich bod yn ymddiried yn llwyr yn y derbynnydd.",lnbits_version:"Fersiwn LNbits",runs_on:"Yn rhedeg ymlaen",paste:"Gludo",paste_from_clipboard:"Gludo o'r clipfwrdd",paste_request:"Gludo Cais",create_invoice:"Creu Anfoneb",camera_tooltip:"Defnyddio camera i sganio anfoneb/QR",export_csv:"Allforio i CSV",chart_tooltip:"Dangos siart",pending:"yn yr arfaeth",copy_invoice:"Copi anfoneb",withdraw_from:"Tynnu oddi ar",cancel:"Canslo",scan:"Sgan",read:"Darllen",pay:"Talu",memo:"Memo",date:"Dyddiad",payment_processing:"Prosesu taliad...",not_enough_funds:"Dim digon o arian!",search_by_tag_memo_amount:"Chwilio yn ôl tag, memo, swm",invoice_waiting:"Anfoneb yn aros i gael ei thalu",payment_received:"Taliad a Dderbyniwyd",payment_sent:"Taliad a Anfonwyd",receive:"derbyn",send:"anfon",outgoing_payment_pending:"Taliad sy`n aros yn yr arfaeth",drain_funds:"Cronfeydd Draenio",drain_funds_desc:"Cod QR Tynnu`n ôl LNURL yw hwn ar gyfer slurpio popeth o`r waled hon. Peidiwch â rhannu gyda neb. Mae`n gydnaws â balanceCheck a balanceNotify felly efallai y bydd eich waled yn tynnu`r arian yn barhaus o`r fan hon ar ôl y codiad cyntaf.",i_understand:"Rwy`n deall",copy_wallet_url:"Copi URL waled",disclaimer_dialog_title:"Pwysig!",disclaimer_dialog:"Swyddogaeth mewngofnodi i`w ryddhau mewn diweddariad yn y dyfodol, am y tro, gwnewch yn siŵr eich bod yn rhoi nod tudalen ar y dudalen hon ar gyfer mynediad i`ch waled yn y dyfodol! Mae`r gwasanaeth hwn yn BETA, ac nid ydym yn gyfrifol am bobl sy`n colli mynediad at arian.",no_transactions:"Dim trafodion wedi`u gwneud eto",manage:"Rheoli",exchanges:"Cyfnewidfeydd",extensions:"Estyniadau",no_extensions:"Nid oes gennych unrhyw estyniadau wedi'u gosod :(",created:"Crëwyd",search_extensions:"Chwilio estyniadau",extension_sources:"Ffynonellau Estyniad",ext_sources_hint:"Repoau o ble gellir lawrlwytho'r estyniadau",ext_sources_label:"URL Ffynhonnell (defnyddiwch ffynhonnell estyniad swyddogol LNbits yn unig, a ffynonellau y gallwch ymddiried ynddynt)",warning:"Rhybudd",repository:"Ystorfa",confirm_continue:"Ydych chi'n siŵr eich bod chi eisiau parhau?",manage_extension_details:"Gosod/dadosod estyniad",install:"Gosod",uninstall:"Dadgymhwyso",drop_db:"Dileu Data",enable:"Galluogi",pay_to_enable:"Talu I Alluogi",enable_extension_details:"Galluogi estyniad ar gyfer y defnyddiwr presennol",disable:"Analluogi",delete:"Dileu",installed:"Gosodwyd",activated:"Wedi'i actifadu",deactivated:"Anweithredol",release_notes:"Nodiadau Rhyddhau",activate_extension_details:"Gwneud estyniad ar gael/anar gael i ddefnyddwyr",featured:"Nodweddwyd",all:"Pob",only_admins_can_install:"Dim ond cyfrifon gweinyddwr all osod estyniadau",admin_only:"Dim ond Gweinyddwr",new_version:"Fersiwn Newydd",extension_depends_on:"Dibynnu ar:",extension_rating_soon:"Sgôr yn dod yn fuan",extension_installed_version:"Fersiwn wedi'i gosod",extension_uninstall_warning:"Rydych chi ar fin dileu'r estyniad ar gyfer pob defnyddiwr.",uninstall_confirm:"Ie, Dad-osod",extension_db_drop_info:"Bydd yr holl ddata ar gyfer yr estyniad yn cael ei ddileu'n barhaol. Does dim ffordd o dadwneud y weithrediad hwn!",extension_db_drop_warning:"Rydych chi ar fin dileu'r holl ddata ar gyfer yr estyniad. Teipiwch enw'r estyniad i barhau:",extension_required_lnbits_version:"Mae'r rhyddhau hwn yn gofyn o leiaf am fersiwn LNbits",min_version:"Isafswm (cynnwys)",max_version:"Uchafswm (wedi'i eithrio)",payment_hash:"Hais Taliad",fee:"Fee",amount:"swm",amount_sats:"Swm (sats)",tag:"Tag",unit:"Uned",description:"Disgrifiad",expiry:"dod i ben",webhook:"bachyn we",payment_proof:"prawf taliad",update:"Diweddariad",update_available:"Diweddariad {version} ar gael!",latest_update:"Rydych chi ar y fersiwn diweddaraf {version}.",notifications:"Hysbysiadau",no_notifications:"Dim hysbysiadau",notifications_disabled:"Hysbysiadau statws LNbits wedi'u analluogi.",enable_notifications:"Galluogi Hysbysiadau",enable_notifications_desc:"Os bydd wedi'i alluogi bydd yn nôl y diweddariadau Statws LNbits diweddaraf, fel digwyddiadau diogelwch a diweddariadau.",enable_watchdog:"Galluogi Watchdog",enable_watchdog_desc:"Os bydd yn cael ei alluogi bydd yn newid eich ffynhonnell ariannu i VoidWallet yn awtomatig os bydd eich balans yn is na balans LNbits. Bydd angen i chi alluogi â llaw ar ôl diweddariad.",watchdog_interval:"Amserlennu Gwylio",watchdog_interval_desc:"Pa mor aml y dylai'r dasg gefndir wirio am signal torri yn y gwarchodfa delta [node_balance - lnbits_balance] (mewn munudau).",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Terfyn cyn i'r switshladd newid ffynhonnell ariannu i VoidWallet [lnbits_balance - node_balance > delta]",status:"Statws",notification_source:"Ffynhonnell Hysbysiad",notification_source_label:"URL Ffynhonnell (defnyddiwch yn unig ffynhonnell statws swyddogol LNbits, a ffynonellau y gallwch ymddiried ynddynt)",more:"mwy",less:"llai",releases:"Rhyddhau",watchdog:"Gwyliwr",server_logs:"Logiau Gweinydd",ip_blocker:"Rheolydd IP",security:"Diogelwch",security_tools:"Offer teclynnau diogelwch",block_access_hint:"Atal mynediad gan IP",allow_access_hint:"Caniatáu mynediad gan IP (bydd yn diystyru IPs sydd wedi'u blocio)",enter_ip:"Rhowch IP a gwasgwch enter",rate_limiter:"Cyfyngydd Cyfradd",wallet_limiter:"Cyfyngwr Waled",wallet_limit_max_withdraw_per_day:"Uchafswm tynnu’n ôl waled dyddiol mewn sats (0 i analluogi)",wallet_max_ballance:"Uchafswm balans y waled mewn sats (0 i analluogi)",wallet_limit_secs_between_trans:"Eiliadau lleiaf rhwng trafodion fesul waled (0 i analluogi)",number_of_requests:"Nifer y ceisiadau",time_unit:"Uned amser",minute:"munud",second:"ail",hour:"awr",disable_server_log:"Analluogi Log Gweinydd",enable_server_log:"Galluogi Log Gweinydd",coming_soon:"Nodwedd yn dod yn fuan",session_has_expired:"Mae eich sesiwn wedi dod i ben. Mewngofnodwch eto.",instant_access_question:"Eisiau mynediad ar unwaith?",login_with_user_id:"Mewngofnodi gyda ID y defnyddiwr",or:"neu",create_new_wallet:"Creu Waled Newydd",login_to_account:"Mewngofnodwch i'ch cyfrif",create_account:"Creu cyfrif",account_settings:"Gosodiadau Cyfrif",signin_with_nostr:"Parhewch gyda Nostr",signin_with_google:"Mewngofnodi gyda Google",signin_with_github:"Mewngofnodi gyda GitHub",signin_with_keycloak:"Mewngofnodi gyda Keycloak",username_or_email:"Defnyddiwr neu E-bost",password:"Cyfrinair",password_config:"Ffurfweddiad Cyfrinair",password_repeat:"Ailadrodd cyfrinair",change_password:"Newid Cyfrinair",update_credentials:"Diweddaru Cyfrifoldebau",update_pubkey:"Diweddaru Allwedd Gyhoeddus",set_password:"Gosod Cyfrinair",invalid_password:"Rhaid i'r cyfrinair gynnwys o leiaf 8 nod.",login:"Mewngofnodi",register:"Cofrestru",username:"Enw defnyddiwr",pubkey:"Allwedd Gyhoeddus",user_id:"ID Defnyddiwr",email:"E-bost",first_name:"Enw Cyntaf",last_name:"Cyfenw",picture:"Llun",verify_email:"Gwirio e-bost gyda",account:"Cyfrif",update_account:"Diweddaru Cyfrif",invalid_username:"Enw Defnyddiwr Annilys",auth_provider:"Darparwr Dilysiad",my_account:"Fy Nghyfrif",back:"Yn ôl",logout:"Allgofnodi",look_and_feel:"Edrych a Theimlo",toggle_gradient:"Toglo Graddiênt",gradient_background:"Cefndir Graddiant",language:"Iaith",color_scheme:"Cynllun Lliw",admin_settings:"Gosodiadau Gweinyddol",extension_cost:"Mae'r rhyddhad hwn yn gofyn am daliad o leiaf {cost} sats.",extension_paid_sats:"Rydych chi eisoes wedi talu {paid_sats} sats.",release_details_error:"Methu cael manylion y rhyddhau.",pay_from_wallet:"Talu o'r Waled",wallet_required:"Waled *",show_qr:"Dangos QR",retry_install:"Ailgeisio Gosod",new_payment:"Gwneud Taliad Newydd",update_payment:"Diweddarwch Dalu",already_paid_question:"Ydych chi eisoes wedi talu?",sell:"Gwerthu",sell_require:"Gofynnwch am daliad i alluogi estyniad",sell_info:"Mae angen taliad o leiaf {amount} sats ar yr estyniad {name} i'w alluogi.",hide_empty_wallets:"Cuddio waledau gwag",recheck:"Ailwirio",contributors:"Cyfranwyr",license:"Trwydded",reset_key:"Ailosod Allwedd",reset_password:"Ailosod Cyfrinair",border_choices:"Dewisiadau Ffin",select_all:"Dewis Pob Un",nfc_supported:"Cefnogir NFC",nfc_not_supported:"NFC heb ei Gefnogi",expire_date:"Dyddiad Dod i Ben:",hash:"Hash:",welcome_lnbits:"Croeso i LNbits",setup_su_account:"Sefydlu'r cyfrif Superuser isod.",create_ticker_converter:"Creu Trosi Ticiwr Arian",enable_audit:"Galluogi Archwilio",recommended:"Argymhellir",audit_desc:"Cofnodi ceisiadau HTTP yn ôl y hidlwyr penodedig",audit_record_req:"Cofnodi Corff y Cais",audit_record_warning:"Rhybudd:",audit_record_req_warning_1:"data cyfrinachol (fel cyfrineiriau) yn cael eu logio.",audit_record_req_warning_2:"mae gan y corff cais faint mawr.",audit_record_use:"Defnyddiwch ef gyda gofal.",audit_ip:"Cofnodi Cyfeiriad IP",audit_ip_desc:"Cofnodwch gyfeiriad IP y cleient",audit_path_params:"Cofnod Paramedrau Llwybr",audit_query_params:"Cofnod Paramedrau Holiannau",audit_http_methods:"Cynnwys Dulliau HTTP",audit_http_methods_hint:"Rhestr o ddulliau HTTP i'w cynnwys. Yn golygu pob un yw rhestrau gwag.",audit_http_methods_label:"Dulliau HTTP",audit_resp_codes:"Cynnwys Codau Ymateb HTTP",audit_resp_codes_hint:"Rhestr o godau HTTP i'w cynnwys (cydweddu regex). Mae rhestrau gwag yn golygu popeth. Ee: 4.*, 5.*",audit_resp_codes_label:"Cod Ymateb HTTP (regex)",audit_paths:"Cynnwys Llwybrau",audit_paths_hint:"Rhestr o lwybrau i'w cynnwys (cydweddiad rhegiwlar). Mae rhestr wag yn golygu pob un.",audit_paths_label:"Llwybr HTTP (regex)",audit_paths_exclude:"Eithrio Llwybrau",audit_paths_exclude_hint:"Rhestr o lwybrau i'w heithrio (cydweddu regex). Mae rhestr wag yn golygu dim.",audit_paths_exclude_label:"Llwybr HTTP (regex)",exchange_providers:"Darparwyr Cyfnewid",admin_extensions:"Estyniadau Gweinyddol",admin_extensions_label:"Estyniadau gweinyddu",admin_extensions_hint:"Dim ond defnyddiwr Estyniadau gyda braint gweinyddwr sy'n gallu defnyddio",user_default_extensions:"Rhyngwyneb Diofyn Defnyddiwr",user_default_extensions_label:"Estyniadau defnyddiwr",user_default_extensions_hint:"Estyniadau a fydd yn cael eu galluogi yn ddiofyn ar gyfer y defnyddwyr.",miscellanous:"Amrywiol",misc_disable_extensions:"Analluogi Estyniadau",misc_disable_extensions_label:"Analluogi'r holl estynniadau",misc_hide_api:"Cuddio API",misc_hide_api_label:"Yn cuddio api waled, gall estyniadau ddewis anrhydeddu",wallets_management:"Rheoli Waledau",funding_source_info:"Gwybodaeth am Ffynhonnell Ariannu",funding_source:"Ffynhonnell Ariannu: {wallet_class}",node_balance:"Cydbwysedd Nôd: {balance} sats",lnbits_balance:"Cydbwysedd LNbits: {balance} sats",funding_reserve_percent:"Cadw Canran: {percent} %",node_management:"Rheoli Nodau",node_management_not_supported:"Nid yw Rheoli Nodau yn cael ei gefnogi gan ffynhonnell ariannu weithredol",toggle_node_ui:"Node UI",toggle_public_node_ui:"UI Nod Cyhoeddus",toggle_transactions_node_ui:"Tab Trafodion (Analluoga ar nodau CLN mawr)",invoice_expiry:"Dyddiad Dod i Ben yr Anfoneb",invoice_expiry_label:"Darfod anfoneb (eiliadau)",fee_reserve:"Cadw Ffi",fee_reserve_msats:"Ffi cadw yn msats",fee_reserve_percent:"Ffioedd cadw mewn canran",server_management:"Rheoli Gweinyddwr",base_url:"Prif URL",base_url_label:"Url statig/sylfaen ar gyfer y gweinydd",authentication:"Dilysiad",auth_token_expiry_label:"Cofnodi munudau dod i ben",auth_token_expiry_hint:"Amser mewn munudau tan fod y tocyn yn dod i ben",auth_allowed_methods_label:"Dulliau awdurdodi a ganiateir",auth_allowed_methods_hint:"Dewiswch ddulliau awdurdodi",auth_nostr_label:"URL Cais Nostr",auth_nostr_hint:"URL absoliwt y bydd y cleientiaid yn ei ddefnyddio i fewngofnodi.",auth_google_ci_label:"ID Cleient Google",auth_google_ci_hint:"Sicrhewch fod yr URIs adnewyddu awdurdodedig yn cynnwys https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Cwsmer Google Dirgel",auth_gh_client_id_label:"ID Cleient GitHub",auth_gh_client_id_hint:"Gwnewch yn siŵr bod y URL galwad yn ôl awdurdodi wedi'i osod i https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Cudd-wybodaeth Cleient GitHub",auth_keycloak_label:"URL Darganfod Keycloak",auth_keycloak_ci_label:"ID Cleient Keycloak",auth_keycloak_ci_hint:"Gwnewch yn siŵr bod URL adalw awdurdodiad wedi'i osod i https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Cyfrinach Cleient Keycloak",auth_keycloak_custom_org_label:"Sefydliad Wedi'i Addasu Keycloak",auth_keycloak_custom_icon_label:"Eicon Wedi'i Addasu Keycloak (URL)",auth_oidc_label:"URL Darganfod OIDC",auth_oidc_ci_label:"ID Cleient OIDC",auth_oidc_ci_hint:"Gwnewch yn siŵr bod URL adalw awdurdodiad wedi'i osod i https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Cyfrinach Cleient OIDC",auth_oidc_custom_org_label:"Enw Sefydliad Wedi'i Addasu OIDC (e.e. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Eicon Wedi'i Addasu OIDC (URL)",currency_settings:"Gosodiadau Arian Cyfred",allowed_currencies:"Ariannau a Ganiateir",allowed_currencies_hint:"Cyfyngu nifer yr arian cyfred fiat sydd ar gael",default_account_currency:"Arian Cyfred Diofyn y Cyfrif",default_account_currency_hint:"Arian cyfred diofyn ar gyfer cyfrifyddu",service_fee_label:"Ffioedd gwasanaeth (%)",service_fee_hint:"Ffi a godir fesul trx (%)",service_fee_max_label:"Ffioedd gwasanaeth uchaf (sats)",service_fee_max_hint:"Uchafswm ffi gwasanaeth i godi mewn (sats)",fee_wallet:"Waled Ffioedd",fee_wallet_label:"Ffi waled (ID waled)",fee_wallet_hint:"ID Cwlt hon i anfon cronfeydd i",disable_fee:"Analluogi Ffi",disable_fee_internal:"Analluogi Ffi Gwasanaeth ar gyfer Taliadau Mewnol",disable_fee_internal_desc:"Analluogi Ffi Gwasanaeth ar gyfer Taliadau Mellt Mewnol",ui_management:"Rheoli UI",ui_site_title:"Teitl y Safle",ui_site_tagline:"Tagline'r Safle",ui_elements_enable:"Galluogi elfennau ar hafan",ui_elements_disable:"Analluoga elfennau ar y dudalen gartref",ui_toggle_elements_tip:"Tynn elfennau tudalen gartref fel 'yn rhedeg ar' ayyb.",ui_site_description:"Disgrifiad Safle",ui_site_description_hint:"Defnyddiwch destun plaen, Markdown, neu HTML crai",ui_default_wallet_name:"Enw Diofyn y Waled",lnbits_wallet:"Cwdyn LNbits",denomination:"Enwad",denomination_hint:"Enw'r token FakeWallet",ui_qr_code_logo:"Logo Cod QR",ui_qr_code_logo_hint:"URL i ddelwedd logo yn y cod QR",ui_custom_badge:"Bathodyn Personol",ui_custom_badge_label:"Bathodyn Custom 'DEFNYDDIO GYDA RHYBUDD - mae waled LNbits dal mewn BETA'",ui_custom_badge_color_label:"Lliw Bathodyn Personol",themes:"Themâu",themes_hint:"Dewiswch themâu sydd ar gael i ddefnyddwyr",custom_logo:"Logo Personol",custom_logo_hint:"URL i ddelwedd logo",ad_space_title:"Teitl Gofod Hysbysebu",ad_space_title_label:"Cefnogir gan",ad_slots:"Slotiau Hysbysebu",ad_slots_hint:"Ychwanegu url a llwybrau ffeil delwedd yn y fformat CSV, gall estyniadau ddewis i barchu",ad_slots_label:"url;url_delwedd_ysgafn;url_delwedd_tywyll, url...",ads_enabled:"Hysbysebion wedi'u Galluogi",ads_disabled:"Hysbysebion Wedi'u Analluogi",user_management:"Rheoli Defnyddwyr",admin_users:"Defnyddwyr Gweinyddol",admin_users_hint:"Defnyddwyr â breintiau gweinyddol",admin_users_label:"ID Defnyddiwr",allowed_users:"Defnyddwyr a Ganiateir",allowed_users_hint:"Dim ond y defnyddwyr hyn all ddefnyddio LNbits",allowed_users_label:"ID defnyddiwr",allow_creation_user:"Caniatáu creu defnyddwyr newydd",allow_creation_user_desc:"Caniatáu creu defnyddwyr newydd ar y dudalen fynegai",components:"Cydrannau",long_running_endpoints:"5 Pwynt Terfyn Hir-rhediad Uchaf",http_request_methods:"Dulliau Cais HTTP",http_response_codes:"Codau Ymateb HTTP",request_details:"Manylion y Cais",http_request_details:"Manylion Cais HTTP",block_explorer:"Archwiliwr Bloc",enable_block_explorer:"Galluogi'r Archwiliwr Bloc",block_explorer_desc:"Caniatáu i ddefnyddwyr archwilio trafodion a chyfeiriadau Bitcoin drwy Electrum.",blockexplorer_public_api:"Mynediad API Cyhoeddus",blockexplorer_public_api_desc:"Caniatáu mynediad heb ddilysu i bwyntiau terfyn API yr archwiliwr bloc.",electrum_server_url:"URL Gweinydd Electrum",electrum_server_url_hint:"e.e. ssl://electrum.blockstream.info:50002 neu tcp://localhost:50001",blockexplorer_search_label:"Chwilio yn ôl TXID neu Gyfeiriad",blockexplorer_search_hint:"Hex 64 nod = trafodiad · unrhyw beth arall = cyfeiriad Bitcoin",recent_blocks:"Blociau Diweddar",chain_tip:"Blaen y Gadwyn",block_height:"Uchder Bloc",block_fee:"ffi bloc",fee_estimates:"Amcangyfrifon Ffi",confirmed_balance:"Balans Cadarnhawyd",unconfirmed_balance:"Balans Heb ei Gadarnhau",transaction_history:"Hanes Trafodion",coinbase:"Coinbase",inputs:"Mewnbynnau",outputs:"Allbynnau",confirmations:"Cadarnhadau",confirmed:"Cadarnhawyd",unconfirmed:"Heb ei Gadarnhau",history_unavailable:"Hanes trafodion ar goll (mae cyfeiriad â gormod o drafodion)",address:"Cyfeiriad",block_number:"Bloc #{height}",block_diff:"anhawster {value}",block_hash:"Hash",previous_block:"Bloc Blaenorol",merkle_root:"Gwreiddyn Merkle",version:"Fersiwn",bits:"Bits",difficulty:"Anhawster",nonce:"Nonce",txid:"TXID",vsize:"Maint Rhithwir",weight:"Pwysau",n_block_fee:"ffi {n} bloc"},window.localisation.pt={confirm:"Sim",server:"Servidor",theme:"Tema",site_customisation:"Customização do Site",funding:"Financiamento",users:"Usuários",audit:"Auditoria",apps:"Aplicativos",channels:"Canais",transactions:"Transações",dashboard:"Painel de Controle",node:"Nó",export_users:"Exportar Usuários",no_users:"Nenhum usuário encontrado",total_capacity:"Capacidade Total",avg_channel_size:"Tamanho Médio do Canal",biggest_channel_size:"Maior Tamanho do Canal",smallest_channel_size:"Menor Tamanho de Canal",number_of_channels:"Número de Canais",active_channels:"Canais Ativos",connect_peer:"Conectar Par",connect:"Conectar",open_channel:"Canal Aberto",open:"Abrir",close_channel:"Fechar Canal",close:"Fechar",restart:"Reiniciar servidor",save:"Gravar",save_tooltip:"Gravar as alterações",credit_debit:"Crédito / Débito",credit_hint:"Pressione Enter para creditar a conta",credit_label:"{denomination} para creditar",credit_ok:"Sucesso ao creditar/debitar fundos virtuais ({amount} sats). Os pagamentos dependem dos fundos reais na fonte de financiamento.",restart_tooltip:"Reinicie o servidor para que as alterações tenham efeito",add_funds_tooltip:"Adicionar fundos a uma carteira.",reset_defaults:"Redefinir para padrões",reset_defaults_tooltip:"Apagar todas as configurações e redefinir para os padrões.",download_backup:"Fazer backup da base de dados",name_your_wallet:"Nomeie sua carteira {name}",paste_invoice_label:"Cole uma fatura, pedido de pagamento ou código lnurl *",lnbits_description:"Fácil de configurar e leve, o LNbits pode ser executado em qualquer fonte de financiamento da Lightning Network e até mesmo o LNbits em si! Você pode executar o LNbits para si mesmo ou oferecer facilmente uma solução de custódia para outros. Cada carteira tem suas próprias chaves de API e não há limite para o número de carteiras que você pode criar. Ser capaz de particionar fundos torna o LNbits uma ferramenta útil para gerenciamento de dinheiro e como uma ferramenta de desenvolvimento. As extensões adicionam funcionalidades extras ao LNbits para que você possa experimentar uma série de tecnologias de ponta na rede lightning. Nós tornamos o desenvolvimento de extensões o mais fácil possível e, como um projeto gratuito e de código aberto, incentivamos as pessoas a desenvolver e enviar as suas próprias.",export_to_phone:"Exportar para o telefone com código QR",export_to_phone_desc:"Este código QR contém a URL da sua carteira com acesso total. Você pode escaneá-lo do seu telefone para abrir sua carteira a partir dele.",wallet:"Carteira:",wallets:"Carteiras",add_wallet:"Adicionar nova carteira",delete_wallet:"Excluir carteira",delete_wallet_desc:"Toda a carteira será excluída, os fundos serão IRRECUPERÁVEIS.",rename_wallet:"Renomear carteira",update_name:"Atualizar nome",fiat_tracking:"Rastreamento Fiat",currency:"Moeda",update_currency:"Atualizar moeda",press_to_claim:"Pressione para solicitar bitcoin",donate:"Doar",view_github:"Ver no GitHub",voidwallet_active:"VoidWallet está ativo! Pagamentos desabilitados",use_with_caution:"USE COM CAUTELA - a carteira {name} ainda está em BETA",service_fee:"Taxa de serviço: {amount} % por transação",service_fee_max:"Taxa de serviço: {amount} % por transação (máximo de {max} sats)",service_fee_tooltip:"Taxa de serviço cobrada pelo administrador do servidor LNbits por transação de saída",toggle_darkmode:"Alternar modo escuro",payment_reactions:"Reações de Pagamento",view_swagger_docs:"Ver a documentação da API do LNbits Swagger",api_docs:"Documentação da API",api_keys_api_docs:"URL do Nó, chaves de API e documentação de API",api_keys_warning:"Estas chaves devem ser mantidas em segurança; partilhá-las pode resultar na perda de fundos.",admin_key_warning:"A sua chave de administrador concede acesso total à sua carteira, incluindo a capacidade de enviar pagamentos. Nunca a partilhe, a menos que confie plenamente no destinatário.",lnbits_version:"Versão do LNbits",runs_on:"Executa em",paste:"Colar",paste_from_clipboard:"Colar da área de transferência",paste_request:"Colar Pedido",create_invoice:"Criar Fatura",camera_tooltip:"Usar a câmara para escanear uma fatura / QR",export_csv:"Exportar para CSV",chart_tooltip:"Mostrar gráfico",pending:"Pendente",copy_invoice:"Copiar fatura",withdraw_from:"Retirar de",cancel:"Cancelar",scan:"Escanear",read:"Ler",pay:"Pagar",memo:"Memo",date:"Data",payment_processing:"Processando pagamento...",not_enough_funds:"Fundos insuficientes!",search_by_tag_memo_amount:"Pesquisar por tag, memo, quantidade",invoice_waiting:"Fatura aguardando pagamento",payment_received:"Pagamento Recebido",payment_sent:"Pagamento Enviado",receive:"receber",send:"enviar",outgoing_payment_pending:"Pagamento de saída pendente",drain_funds:"Esvasiar carteira",drain_funds_desc:"Este é um código QR de saque LNURL para sacar tudo desta carteira. Não o partilhe com ninguém. É compatível com balanceCheck e balanceNotify para que a sua carteira possa continuar levantando os fundos continuamente daqui após o primeiro saque.",i_understand:"Eu entendo",copy_wallet_url:"Copiar URL da carteira",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"Funcionalidade de login a ser lançada numa atualização futura, por enquanto, certifique-se que marca esta página para acesso futuro à sua carteira! Este serviço está em BETA, e não nos responsabilizamos por pessoas que perderem o acesso aos fundos.",no_transactions:"Ainda não foram feitas transações",manage:"Gerir",exchanges:"Trocas",extensions:"Extensões",no_extensions:"Não há nenhuma extensão instalada :(",created:"Criado",search_extensions:"Pesquisar extensões",extension_sources:"Fontes de Extensão",ext_sources_hint:"Repositórios de onde as extensões podem ser baixadas",ext_sources_label:"URL de origem (use apenas a fonte oficial da extensão LNbits e fontes em que você confia)",warning:"Aviso",repository:"Repositório",confirm_continue:"Tem certeza de que deseja continuar?",manage_extension_details:"Instalar/desinstalar extensão",install:"Instalar",uninstall:"Desinstalar",drop_db:"Remover Dados",enable:"Ativar",pay_to_enable:"Pagar para Ativar",enable_extension_details:"Ativar extensão para o usuário atual",disable:"Desativar",delete:"Excluir",installed:"Instalado",activated:"Ativado",deactivated:"Desativado",release_notes:"Notas de Lançamento",activate_extension_details:"Torne a extensão disponível/indisponível para usuários",featured:"Destacado",all:"Todos",only_admins_can_install:"Apenas contas de administrador podem instalar extensões.",admin_only:"Apenas para administradores",new_version:"Nova Versão",extension_depends_on:"Depende de:",extension_rating_soon:"Avaliações em breve",extension_installed_version:"Versão instalada",extension_uninstall_warning:"Você está prestes a remover a extensão para todos os usuários.",uninstall_confirm:"Sim, Desinstalar",extension_db_drop_info:"Todos os dados da extensão serão permanentemente excluídos. Não há como desfazer essa operação!",extension_db_drop_warning:"Você está prestes a remover todos os dados para a extensão. Por favor, digite o nome da extensão para continuar:",extension_required_lnbits_version:"Esta versão requer pelo menos a versão LNbits",min_version:"Mínimo (incluído)",max_version:"Máximo (excluído)",payment_hash:"Hash de pagamento",fee:"Taxa",amount:"Quantidade",amount_sats:"Quantidade (sats)",tag:"Etiqueta",unit:"Unidade",description:"Descrição",expiry:"Validade",webhook:"Webhook",payment_proof:"Comprovativo de pagamento",update:"Atualizar",update_available:"Atualização {version} disponível!",latest_update:"Você está na última versão {version}.",notifications:"Notificações",no_notifications:"Sem notificações",notifications_disabled:"As notificações de status do LNbits estão desativadas.",enable_notifications:"Ativar Notificações",enable_notifications_desc:"Se ativado, ele buscará as últimas atualizações de status do LNbits, como incidentes de segurança e atualizações.",enable_watchdog:"Ativar Watchdog",enable_watchdog_desc:"Se ativado, mudará automaticamente a sua fonte de financiamento para VoidWallet caso o seu saldo seja inferior ao saldo LNbits. Você precisará ativar manualmente após uma atualização.",watchdog_interval:"Intervalo do Watchdog",watchdog_interval_desc:"Com que frequência a tarefa de fundo deve verificar um sinal de desligamento no delta do watchdog [node_balance - lnbits_balance] (em minutos).",watchdog_delta:"Observador Delta",watchdog_delta_desc:"Limite antes que o killswitch altere a fonte de financiamento para VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fonte de Notificação",notification_source_label:"URL de Origem (use apenas a fonte oficial de status do LNbits e fontes em que confia)",more:"mais",less:"menos",releases:"Lançamentos",watchdog:"Cão de guarda",server_logs:"Registros do Servidor",ip_blocker:"Bloqueador de IP",security:"Segurança",security_tools:"Ferramentas de segurança",block_access_hint:"Bloquear acesso por IP",allow_access_hint:"Permitir acesso por IP (substituirá IPs bloqueados)",enter_ip:"Digite o IP e pressione enter.",rate_limiter:"Limitador de Taxa",wallet_limiter:"Limitador de Carteira",wallet_limit_max_withdraw_per_day:"Limite diário máximo de saque da carteira em sats (0 para desativar)",wallet_max_ballance:"Saldo máximo da carteira em sats (0 para desativar)",wallet_limit_secs_between_trans:"Minutos seg. entre transações por carteira (0 para desativar)",number_of_requests:"Número de solicitações",time_unit:"Unidade de tempo",minute:"minuto",second:"segundo",hour:"hora",disable_server_log:"Desativar Log do Servidor",enable_server_log:"Ativar Log do Servidor",coming_soon:"Funcionalidade em breve",session_has_expired:"Sua sessão expirou. Por favor, faça login novamente.",instant_access_question:"Quer acesso imediato?",login_with_user_id:"Entrar com ID do usuário",or:"ou",create_new_wallet:"Criar Nova Carteira",login_to_account:"Faça login na sua conta",create_account:"Criar conta",account_settings:"Configurações da Conta",signin_with_nostr:"Continue com Nostr",signin_with_google:"Entrar com o Google",signin_with_github:"Entrar com o GitHub",signin_with_keycloak:"Entrar com o Keycloak",username_or_email:"Nome de usuário ou Email",password:"Senha",password_config:"Configuração de Senha",password_repeat:"Repetição de senha",change_password:"Alterar Senha",update_credentials:"Atualizar Credenciais",update_pubkey:"Atualizar Chave Pública",set_password:"Definir Senha",invalid_password:"A senha deve ter pelo menos 8 caracteres",login:"Entrar",register:"Registrar",username:"Nome de usuário",pubkey:"Chave Pública",user_id:"ID do Usuário",email:"E-mail",first_name:"Nome próprio",last_name:"Sobrenome",picture:"Foto",verify_email:"Verifique o e-mail com",account:"Conta",update_account:"Atualizar Conta",invalid_username:"Nome de usuário inválido",auth_provider:"Provedor de Autenticação",my_account:"Minha Conta",back:"Voltar",logout:"Sair",look_and_feel:"Aparência e Sensação",toggle_gradient:"Alternar Gradiente",gradient_background:"Fundo Gradiente",language:"Idioma",color_scheme:"Esquema de Cores",admin_settings:"Configurações de Administração",extension_cost:"Este lançamento requer um pagamento mínimo de {cost} sats.",extension_paid_sats:"Você já pagou {paid_sats} sats.",release_details_error:"Não é possível obter os detalhes da versão.",pay_from_wallet:"Pague da Carteira",wallet_required:"Carteira *",show_qr:"Exibir QR",retry_install:"Reinstalar Tente Novamente",new_payment:"Realizar Novo Pagamento",update_payment:"Atualizar Pagamento",already_paid_question:"Já pagou?",sell:"Vender",sell_require:"Peça pagamento para habilitar a extensão",sell_info:"A extensão {name} requer um pagamento mínimo de {amount} sats para habilitar.",hide_empty_wallets:"Ocultar carteiras vazias",recheck:"Rever",contributors:"Colaboradores",license:"Licença",reset_key:"Redefinir Chave",reset_password:"Redefinir Senha",border_choices:"Opções de Borda",select_all:"Selecionar tudo",nfc_supported:"NFC Suportado",nfc_not_supported:"NFC não suportado",expire_date:"Data de Expiração:",hash:"Hash:",welcome_lnbits:"Bem-vindo ao LNbits",setup_su_account:"Configure a conta Superusuário abaixo.",create_ticker_converter:"Criar Conversor de Moeda Ticker",enable_audit:"Ativar Auditoria",recommended:"Recomendado",audit_desc:"Registre solicitações HTTP de acordo com os filtros especificados",audit_record_req:"Registrar Corpo da Solicitação",audit_record_warning:"Aviso:",audit_record_req_warning_1:"dados confidenciais (como senhas) serão registrados.",audit_record_req_warning_2:"o corpo da solicitação pode ter um tamanho grande.",audit_record_use:"Use com cautela.",audit_ip:"Registrar Endereço IP",audit_ip_desc:"Registre o endereço IP do cliente",audit_path_params:"Registrar parâmetros de caminho",audit_query_params:"Registrar Parâmetros de Consulta",audit_http_methods:"Incluir métodos HTTP",audit_http_methods_hint:"Lista de métodos HTTP a serem incluídos. Listas vazias significam todos.",audit_http_methods_label:"Métodos HTTP",audit_resp_codes:"Incluir Códigos de Resposta HTTP",audit_resp_codes_hint:"Lista de códigos HTTP a serem incluídos (correspondência com expressões regulares). Listas vazias significam todos. Ex: 4.*, 5.*",audit_resp_codes_label:"Código de resposta HTTP (regex)",audit_paths:"Incluir Caminhos",audit_paths_hint:"Lista de caminhos a serem incluídos (correspondência regex). Lista vazia significa todos.",audit_paths_label:"Caminho HTTP (regex)",audit_paths_exclude:"Excluir Caminhos",audit_paths_exclude_hint:"Lista de caminhos a serem excluídos (correspondência com regex). Lista vazia significa nenhum.",audit_paths_exclude_label:"Caminho HTTP (regex)",exchange_providers:"Provedores de Câmbio",admin_extensions:"Extensões do Administrador",admin_extensions_label:"Extensões administrativas",admin_extensions_hint:"Somente usuários com privilégios de administrador podem usar extensões.",user_default_extensions:"Extensões Padrão do Usuário",user_default_extensions_label:"Extensões do usuário",user_default_extensions_hint:"Extensões que serão ativadas por padrão para os usuários.",miscellanous:"Diversos",misc_disable_extensions:"Desativar Extensões",misc_disable_extensions_label:"Desativar todas as extensões",misc_hide_api:"Ocultar API",misc_hide_api_label:"Oculta a API da carteira, extensões podem optar por honrar",wallets_management:"Gestão de Carteiras",funding_source_info:"Informações da Fonte de Financiamento",funding_source:"Fonte de Financiamento: {wallet_class}",node_balance:"Saldo do Nó: {balance} sats",lnbits_balance:"Saldo do LNbits: {balance} sats",funding_reserve_percent:"Reserve Percentagem: {percent} %",node_management:"Gerenciamento de Nós",node_management_not_supported:"Gerenciamento de nós não suportado pela fonte de financiamento ativa",toggle_node_ui:"Interface do Usuário de Nó",toggle_public_node_ui:"Interface Pública do Nó",toggle_transactions_node_ui:"Aba de Transações (Desativar em nós grandes do CLN)",invoice_expiry:"Validade da Fatura",invoice_expiry_label:"Expiração da fatura (segundos)",fee_reserve:"Reserva de Taxa",fee_reserve_msats:"Taxa de reserva em msats",fee_reserve_percent:"Taxa de reserva em porcentagem",server_management:"Gerenciamento de Servidor",base_url:"URL base",base_url_label:"URL estático/base para o servidor",authentication:"Autenticação",auth_token_expiry_label:"Minutos de expiração do token",auth_token_expiry_hint:"Tempo em minutos até que o token expire",auth_allowed_methods_label:"Métodos de autorização permitidos",auth_allowed_methods_hint:"Selecione os métodos de autorização",auth_nostr_label:"URL de Solicitação Nostr",auth_nostr_hint:"URL absoluta que os clientes usarão para fazer login.",auth_google_ci_label:"ID do Cliente do Google",auth_google_ci_hint:"Certifique-se de que os URIs de redirecionamento autorizados contenham https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Segredo do Cliente do Google",auth_gh_client_id_label:"ID do Cliente do GitHub",auth_gh_client_id_hint:"Certifique-se de que a URL de retorno de chamada de autorização esteja definida como https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Cliente Secreto do GitHub",auth_keycloak_label:"URL de Descoberta do Keycloak",auth_keycloak_ci_label:"ID do Cliente do Keycloak",auth_keycloak_ci_hint:"Certifique-se de que o URL de retorno de chamada de autorização esteja definido como https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Segredo do Cliente do Keycloak",auth_keycloak_custom_org_label:"Organização Personalizada do Keycloak",auth_keycloak_custom_icon_label:"Ícone Personalizado do Keycloak (URL)",auth_oidc_label:"URL de Descoberta do OIDC",auth_oidc_ci_label:"ID do Cliente do OIDC",auth_oidc_ci_hint:"Certifique-se de que o URL de retorno de chamada de autorização esteja definido como https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Segredo do Cliente do OIDC",auth_oidc_custom_org_label:"Nome da Organização Personalizada OIDC (ex. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Ícone Personalizado do OIDC (URL)",currency_settings:"Configurações de Moeda",allowed_currencies:"Moedas Permitidas",allowed_currencies_hint:"Limite o número de moedas fiduciárias disponíveis",default_account_currency:"Moeda Padrão da Conta",default_account_currency_hint:"Moeda padrão para contabilidade",service_fee_label:"Taxa de serviço (%)",service_fee_hint:"Taxa cobrada por transação (%)",service_fee_max_label:"Taxa de serviço máx (sats)",service_fee_max_hint:"Taxa máxima de serviço a cobrar em (sats)",fee_wallet:"Carteira de Taxas",fee_wallet_label:"Carteira de taxa (ID da carteira)",fee_wallet_hint:"ID da carteira para enviar fundos para",disable_fee:"Desativar taxa",disable_fee_internal:"Desativar Taxa de Serviço para Pagamentos Internos",disable_fee_internal_desc:"Desativar Taxa de Serviço para Pagamentos Internos Lightning",ui_management:"Gestão de UI",ui_site_title:"Título do Site",ui_site_tagline:"Tagline do site",ui_elements_enable:"Ativar elementos na página inicial",ui_elements_disable:"Desativar elementos na página inicial",ui_toggle_elements_tip:"Remova elementos da homepage como 'executa em' etc.",ui_site_description:"Descrição do Site",ui_site_description_hint:"Use texto simples, Markdown ou HTML bruto",ui_default_wallet_name:"Nome Padrão da Carteira",lnbits_wallet:"Carteira LNbits",denomination:"Denominação",denomination_hint:"O nome para o token FakeWallet",ui_qr_code_logo:"Logo do Código QR",ui_qr_code_logo_hint:"URL para imagem do logotipo no código QR",ui_custom_badge:"Distintivo Personalizado",ui_custom_badge_label:"Emblema Personalizado 'USE COM CAUTELA - A carteira LNbits ainda está em BETA'",ui_custom_badge_color_label:"Cor Personalizada do Distintivo",themes:"Temas",themes_hint:"Escolha os temas disponíveis para os usuários",custom_logo:"Logotipo Personalizado",custom_logo_hint:"URL para imagem do logotipo",ad_space_title:"Título do Espaço Publicitário",ad_space_title_label:"Suportado por",ad_slots:"Espaços Publicitários",ad_slots_hint:"Adicionar URL e caminhos de arquivo de imagem no formato CSV, extensões podem optar por respeitar",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Anúncios Ativados",ads_disabled:"Anúncios Desativados",user_management:"Gestão de Usuários",admin_users:"Usuários Administrativos",admin_users_hint:"Usuários com privilégios de administrador",admin_users_label:"ID do Usuário",allowed_users:"Usuários Permitidos",allowed_users_hint:"Somente estes usuários podem usar LNbits",allowed_users_label:"ID do usuário",allow_creation_user:"Permitir a criação de novos usuários",allow_creation_user_desc:"Permitir a criação de novos usuários na página inicial",components:"Componentes",long_running_endpoints:"Principais 5 Endpoints de Longa Execução",http_request_methods:"Métodos de Requisição HTTP",http_response_codes:"Códigos de Resposta HTTP",request_details:"Detalhes da solicitação",http_request_details:"Detalhes da Solicitação HTTP",block_explorer:"Block Explorer",enable_block_explorer:"Ativar Block Explorer",block_explorer_desc:"Permite aos utilizadores explorar transações e endereços Bitcoin via Electrum.",blockexplorer_public_api:"Acesso à API pública",blockexplorer_public_api_desc:"Permitir acesso não autenticado aos endpoints da API do explorador de blocos.",electrum_server_url:"URL do servidor Electrum",electrum_server_url_hint:"ex. ssl://electrum.blockstream.info:50002 ou tcp://localhost:50001",blockexplorer_search_label:"Pesquisar por TXID ou endereço",blockexplorer_search_hint:"Hex de 64 caracteres = transação · qualquer outra coisa = endereço Bitcoin",recent_blocks:"Blocos recentes",chain_tip:"Ponta da cadeia",block_height:"Altura do bloco",block_fee:"taxa de bloco",fee_estimates:"Estimativas de taxa",confirmed_balance:"Saldo confirmado",unconfirmed_balance:"Saldo não confirmado",transaction_history:"Histórico de transações",coinbase:"Coinbase",inputs:"Entradas",outputs:"Saídas",confirmations:"Confirmações",confirmed:"Confirmado",unconfirmed:"Não confirmado",history_unavailable:"Histórico de transações indisponível (endereço tem demasiadas transações)",address:"Endereço",block_number:"Bloco #{height}",block_diff:"diff {value}",block_hash:"Hash",previous_block:"Bloco anterior",merkle_root:"Raiz de Merkle",version:"Versão",bits:"Bits",difficulty:"Dificuldade",nonce:"Nonce",txid:"TXID",vsize:"Tamanho virtual",weight:"Peso",n_block_fee:"taxa {n} blocos"},window.localisation.br={confirm:"Sim",server:"Servidor",theme:"Tema",site_customisation:"Customização do Site",funding:"Financiamento",users:"Usuários",audit:"Auditoria",api_watch:"Relógio da API",apps:"Aplicativos",channels:"Canais",transactions:"Transações",dashboard:"Painel de Controle",node:"Nó",export_users:"Exportar Usuários",no_users:"Nenhum usuário encontrado",total_capacity:"Capacidade Total",avg_channel_size:"Tamanho médio do canal",biggest_channel_size:"Maior Tamanho de Canal",smallest_channel_size:"Tamanho Mínimo do Canal",number_of_channels:"Número de Canais",active_channels:"Canais Ativos",connect_peer:"Conectar Par",connect:"Conectar",reconnect:"Reconectar",open_channel:"Canal Aberto",open:"Abrir",clear:"Limpar",close_channel:"Fechar Canal",close:"Fechar",restart:"Reiniciar servidor",image_library:"Biblioteca de Imagens",save:"Salvar",save_tooltip:"Salvar suas alterações",must_save:"Você tem alterações não salvas",credit_debit:"Crédito / Débito",credit_hint:"Pressione Enter para creditar a conta",credit_label:"{denomination} para creditar",credit_ok:"Sucesso ao creditar/debitar fundos virtuais ({amount} sats). Os pagamentos dependem dos fundos reais na fonte de financiamento.",restart_tooltip:"Reinicie o servidor para que as alterações tenham efeito",add_funds_tooltip:"Adicionar fundos a uma carteira.",reset_defaults:"Redefinir para padrões",reset_defaults_tooltip:"Apagar todas as configurações e redefinir para os padrões.",download_backup:"Fazer backup do banco de dados",name_your_wallet:"Nomeie sua carteira {name}",paste_invoice_label:"Cole uma fatura, pedido de pagamento ou código lnurl *",lnbits_description:"Fácil de configurar e leve, o LNbits pode ser executado em qualquer fonte de financiamento da Lightning Network e até mesmo o LNbits em si! Você pode executar o LNbits para si mesmo ou oferecer facilmente uma solução de custódia para outros. Cada carteira tem suas próprias chaves de API e não há limite para o número de carteiras que você pode criar. Ser capaz de particionar fundos torna o LNbits uma ferramenta útil para gerenciamento de dinheiro e como uma ferramenta de desenvolvimento. As extensões adicionam funcionalidades extras ao LNbits para que você possa experimentar uma série de tecnologias de ponta na rede lightning. Nós tornamos o desenvolvimento de extensões o mais fácil possível e, como um projeto gratuito e de código aberto, incentivamos as pessoas a desenvolver e enviar as suas próprias.",export_to_phone:"Exportar para o telefone com código QR",export_to_phone_desc:"Este código QR contém a URL da sua carteira com acesso total. Você pode escaneá-lo do seu telefone para abrir sua carteira a partir dele.",access_wallet_on_mobile:"Acesso Móvel",stored_paylinks:"Links LNURL de pagamento armazenados",wallet:"Carteira:",wallet_name:"Nome da carteira",wallet_type:"Tipo de carteira",shared_wallet:"Carteira Compartilhada",share_wallet:"Compartilhar Carteira",update_permissions:"Atualizar Permissões",shared_wallet_id:"ID da Carteira Compartilhada",shared_wallet_desc:"Você foi convidado(a) para ter acesso à carteira de outra pessoa.",wallets:"Carteiras",exclude_wallets:"Excluir Carteiras",add_wallet:"Adicionar nova carteira",reject_wallet:"Rejeitar carteira",add_new_wallet:"Adicionar uma nova carteira",pin_wallet:"Fixar carteira",delete_wallet:"Excluir carteira",delete_wallet_desc:"Toda a carteira será excluída, os fundos serão IRRECUPERÁVEIS.",rename_wallet:"Renomear carteira",update_name:"Atualizar nome",fiat_tracking:"Rastreamento Fiat",fiat_providers:"Provedores fiat",fiat_warning_bitcoin:'Provedores Fiat podem ficar nervosos com qualquer coisa relacionada ao bitcoin, portanto, evite usar a palavra "bitcoin" nos seus memorandos!',currency:"Moeda",update_currency:"Atualizar moeda",press_to_claim:"Pressione para solicitar bitcoin",claim_desc:"Parece que você tem um valor resgatável de bitcoin, mas ainda não tem uma carteira. Pressione o botão abaixo para reivindicá-lo. Isso criará uma nova carteira para você.",donate:"Doar",view_github:"Ver no GitHub",voidwallet_active:"VoidWallet está ativo! Pagamentos desabilitados",voidwallet_active_user:"Fonte de financiamento indisponível. Por favor, entre em contato com seu administrador para configurar.",voidwallet_active_admin:"Fonte de financiamento indisponível. Clique aqui para configurar.",service_fee_badge:"Taxa de serviço: {amount} % por transação",service_fee_max_badge:"Taxa de serviço: {amount} % por transação (máximo {max} {denom})",service_fee_tooltip:"Taxa de serviço cobrada pelo administrador do servidor LNbits por transação de saída",toggle_darkmode:"Alternar modo escuro",payment_reactions:"Reações de Pagamento",view_swagger_docs:"Ver a documentação da API do LNbits Swagger",api_docs:"Documentação da API",api_keys_api_docs:"URL do Node, chaves da API e documentação da API",api_keys_warning:"Essas chaves devem ser mantidas em segurança; compartilhá-las pode resultar na perda de fundos.",admin_key_warning:"Sua chave de administrador concede acesso total à sua carteira, incluindo a capacidade de enviar pagamentos. Nunca a compartilhe, a menos que confie plenamente no destinatário.",lnbits_version:"Versão do LNbits",runs_on:"Executa em",paste:"Colar",paste_from_clipboard:"Cole do clipboard",paste_request:"Colar Pedido",create_invoice:"Criar Fatura",camera_tooltip:"Usar a câmara para escanear uma fatura / QR",export_csv:"Exportar para CSV",export_csv_details:"Exportar para CSV com detalhes",chart_tooltip:"Mostrar gráfico",pending:"Pendente",copy_invoice:"Copiar fatura",withdraw_from:"Sacar de",cancel:"Cancelar",scan:"Escanear",read:"Ler",write:"Escrever",pay:"Pagar",memo:"Memo",date:"Data",path:"Caminho",internal_memo:"Memorando interno (opcional)",internal_memo_hint_receive:"Este memorando não é mostrado ao pagador, mas é armazenado na fatura para sua referência.",internal_memo_hint_pay:"Este memorando não é exibido ao beneficiário, mas é armazenado no pagamento para sua referência.",payment_processing:"Processando pagamento...",payment_successful:"Pagamento bem-sucedido!",payment_pending:"Pagamento pendente...",payment_check:"Cheque pagamento",not_enough_funds:"Fundos insuficientes!",search_by_tag_memo_amount:"Pesquisar por tag, memo, quantidade",search:"Buscar",invoice_waiting:"Fatura aguardando pagamento",payment_received:"Pagamento Recebido",payment_sent:"Pagamento Enviado",payment_failed:"Pagamento Falhou",receive:"receber",send:"enviar",outgoing_payment_pending:"Pagamento pendente de saída",drain_funds:"Drenar Fundos",drain_funds_desc:"Este é um código QR de retirada do LNURL para sugar tudo desta carteira. Não compartilhe com ninguém. É compatível com balanceCheck e balanceNotify para que sua carteira possa continuar retirando os fundos continuamente daqui após a primeira retirada.",i_understand:"Eu entendo",copy_wallet_url:"Copiar URL da carteira",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"Funcionalidade de login a ser lançada em uma atualização futura, por enquanto, certifique-se de marcar esta página para acesso futuro à sua carteira! Este serviço está em BETA, e não nos responsabilizamos por pessoas que perderem o acesso aos fundos.",no_transactions:"Ainda não foram feitas transações",manage:"Gerenciar",exchanges:"Bolsas de valores",extensions:"Extensões",no_extensions:"Você não possui nenhuma extensão instalada :(",created:"Criado",created_at:"Criado em",updated_at:"Atualizado em",search_extensions:"Extensões de pesquisa",search_wallets:"Pesquisar carteiras",extension_sources:"Fontes de Extensão",ext_sources_hint:"Repositórios de onde as extensões podem ser baixadas",ext_sources_label:"URL de origem (use apenas a fonte oficial da extensão LNbits e fontes confiáveis)",warning:"Aviso",repository:"Repositório",confirm_continue:"Você tem certeza de que deseja continuar?",manage_extension_details:"Instalar/desinstalar extensão",upload:"Enviar",install:"Instalar",uninstall:"Desinstalar",drop_db:"Remover Dados",enable:"Ativar",enabled:"Habilitado",disabled:"Desativado",pay_to_enable:"Pague para Habilitar",enable_extension_details:"Ativar extensão para o usuário atual",disable:"Desativar",delete:"Excluir",installed:"Instalado",activated:"Ativado",deactivated:"Desativado",activate:"Ativar",deactivate:"Desativar",release_notes:"Notas de Lançamento",activate_extension_details:"Tornar a extensão disponível/indisponível para usuários",featured:"Destacado",all:"Tudo",only_admins_can_install:"Apenas contas de administrador podem instalar extensões.",only_admins_can_create_extensions:"Apenas contas de administrador podem criar extensões",admin_only:"Apenas para Administração",make_user_admin:"Tornar usuário administrador",revoke_admin:"Revogar Admin",new_version:"Nova Versão",reviews_url:"URL de Avaliações",reviews_url_label:"URL do servidor de avaliações",reviews_url_hint:"URL completa do PaidReviews incluindo o id das configurações (por exemplo, https://example.com/paidreviews/SETTINGS_ID)",reviews_open:"Ver avaliações",reviews_leave:"Deixe uma avaliação",reviews_name:"Seu nome",reviews_comment:"Sua avaliação",reviews_rating:"Avaliação",reviews_submit:"Enviar avaliação",reviews_loading:"Carregando avaliações...",reviews_refresh:"Atualizar avaliações",reviews_error_load:"Não foi possível carregar as avaliações",reviews_url_not_configured:"URL de avaliações não configurada",reviews_pay_invoice:"Pagar fatura",reviews_invoice_paid:"Fatura paga",reviews_invoice_title:"Pague esta fatura para enviar sua avaliação",reviews_count:"Avaliações",no_reviews:"Ainda não há avaliações",extension_has_free_release:"Tem lançamentos gratuitos",extension_has_paid_release:"Tem lançamentos pagos",extension_depends_on:"Depende de:",extension_rating_soon:"Avaliações estarão disponíveis em breve",extension_installed_version:"Versão instalada",extension_uninstall_warning:"Você está prestes a remover a extensão para todos os usuários.",uninstall_confirm:"Sim, Desinstalar",extension_db_drop_info:"Todos os dados da extensão serão permanentemente excluídos. Não há como desfazer essa operação!",extension_db_drop_warning:"Você está prestes a remover todos os dados para a extensão. Por favor, digite o nome da extensão para continuar:",extension_required_lnbits_version:"Esta versão requer no mínimo a versão do LNbits",min_version:"Mínimo (incluído)",max_version:"Máximo (excluído)",preimage:"Pré-imagem",preimage_hint:"Pré-imagem para liquidar a fatura de retenção",hold_invoice:"Reter Fatura",hold_invoice_description:"Esta fatura está em espera e requer uma pré-imagem para ser liquidada.",payment_hash:"Hash de pagamento",invoice_cancelled:"Fatura Cancelada",invoice_settled:"Fatura Liquidada",hold_invoice_payment_hash:"Hash de pagamento para fatura em espera (opcional)",settle_invoice:"Liquidar Fatura",cancel_invoice:"Cancelar Fatura",fee:"Taxa",amount:"Quantidade",amount_limits:"Limites de Quantia",amount_sats:"Quantidade (sats)",faucest_wallet:"Carteira de Torneira",faucest_wallet_desc_1:"Toda vez que um pagamento for confirmado pelo provedor {provider}, os fundos serão subtraídos desta carteira.",faucest_wallet_desc_2:"Isso ajuda a monitorar todos os pagamentos do {provider} e seu status.",faucest_wallet_desc_3:"Esta carteira deve ser recarregada com a quantia de sats que o administrador está disposto a oferecer em troca da moeda fiduciária.",faucest_wallet_desc_4:"Se esta carteira estiver configurada, mas estiver vazia, os pagamentos de {provider} não serão processados.",faucest_wallet_desc_5:"Esta carteira pode eventualmente ficar com saldo negativo se pagamentos fiduciários paralelos forem feitos.",faucest_wallet_id:"ID da Carteira de Torneira (opcional)",faucest_wallet_id_hint:"ID da carteira a ser usado para a torneira. Será usado para enviar os fundos ao usuário.",tag:"Etiqueta",unit:"Unidade",description:"Descrição",expiry:"Validade",webhook:"Webhook",webhook_url:"URL do Webhook",webhook_url_hint:"URL de Webhook para enviar os detalhes do pagamento. Será chamada quando o pagamento for concluído.",copy_webhook_url:"Copiar URL do webhook",webhook_events_list:"Os seguintes eventos devem ser suportados pelo webhook:",webhook_stripe_description:"No lado do Stripe, você deve configurar um webhook com um URL que aponta para o seu servidor LNbits.",payment_proof:"Comprovante de pagamento",update:"Atualizar",update_available:"Atualização {version} disponível!",funding_sources:"Fontes de Financiamento",latest_update:"Você está na versão mais recente {version}.",notifications:"Notificações",notifications_configure:"Configurar Notificações",notifications_nostr_config:"Configuração do Nostr",notifications_enable_nostr:"Ativar Nostr",notifications_enable_nostr_desc:"Enviar notificações pelo Nostr",notifications_nostr_private_key:"Chave Privada Nostr",notifications_nostr_private_key_desc:"Chave privada (hex ou nsec) para assinar as mensagens enviadas para Nostr",notifications_nostr_identifier:"Identificador Nostr",notifications_nostr_identifier_desc:"Identificador Nip5 para enviar notificações para",notifications_nostr_identifiers:"Identificadores Nostr",notifications_nostr_identifiers_desc:"Lista de identificadores para enviar notificações.",notifications_telegram_config:"Configuração do Telegram",notifications_enable_telegram:"Ativar Telegram",notifications_enable_telegram_desc:"Enviar notificações pelo Telegram",notifications_telegram_access_token:"Token de Acesso",notifications_telegram_access_token_desc:"Token de acesso para o bot",notifications_chat_id:"ID de bate-papo do Telegram",notifications_chat_id_desc:"ID do chat do Telegram para enviar as notificações para",notifications_excluded_wallets_desc:"Não envie notificações para essas carteiras",notifications_email_config:"Configuração de Email",notifications_enable_email:"Habilitar Email",notifications_enable_email_desc:"Enviar notificações por e-mail",notifications_send_test_email:"Enviar e-mail de teste",notifications_send_email:"Enviar e-mail",notifications_send_email_desc:"Email que você enviará de",notifications_send_email_username:"Nome de usuário",notifications_send_email_username_desc:"Nome de usuário, usará o e-mail se não estiver definido",notifications_send_email_password:"Enviar senha de e-mail",notifications_send_email_password_desc:"Senha para o e-mail que você enviará de",notifications_send_email_server_port:"Enviar e-mail porta SMTP",notifications_send_email_server_port_desc:"Porta para o servidor SMTP",notifications_send_email_server:"Enviar e-mail servidor SMTP",notifications_send_email_server_desc:"Servidor SMTP para o e-mail de que você enviará",notifications_send_to_emails:"Emails para enviar para",notifications_send_to_emails_desc:"Notificações de e-mails serão enviadas para",notification_settings_update:"Configurações atualizadas",notification_settings_update_desc:"Notificar quando as configurações do servidor forem atualizadas",notification_server_start_stop:"Iniciar/Parar Servidor",notification_server_start_stop_desc:"Notificar quando o servidor tiver sido iniciado/parado",notification_watchdog_limit:"Notificação de Limite do Watchdog",notification_watchdog_limit_desc:"Notifique quando o limite do watchdog for alcançado (não afeta a fonte de financiamento)",notification_server_status:"Status do Servidor",notification_server_status_desc:"Enviar notificações regulares sobre o status do servidor (valor do intervalo em horas)",notification_incoming_payment:"Pagamentos Recebidos",notification_incoming_payment_desc:"Notificar quando uma carteira tiver recebido um pagamento acima do valor especificado (sats)",notification_outgoing_payment:"Pagamentos Saída",notification_outgoing_payment_desc:"Notificar quando uma carteira tiver enviado um pagamento acima do valor especificado (sats)",notification_credit_debit:"Crédito / Débito",notification_credit_debit_desc:"Notificar quando uma carteira tiver sido creditada/debitada pelo superusuário",notification_balance_delta_changed:"Mudança no Delta de Saldo",notification_balance_delta_changed_desc:"Notifique quando a diferença entre o saldo do nó e o saldo do LNbits tiver mudado mais do que a quantidade especificada (em sats). Defina como 0 para desativar. Isso é executado a cada minuto.",enable_watchdog:"Ativar Watchdog",enable_watchdog_desc:"Se ativado, ele mudará automaticamente sua fonte de financiamento para VoidWallet se o seu saldo for inferior ao saldo do LNbits. Você precisará ativar manualmente após uma atualização.",watchdog_interval:"Intervalo do Watchdog",watchdog_interval_desc:"Com que frequência a tarefa de fundo deve verificar um sinal de interrupção no delta do monitor [node_balance - lnbits_balance] (em minutos).",watchdog_delta:"Observador Delta",watchdog_delta_desc:"Limite antes da mudança do mecanismo de segurança alterar a fonte de financiamento para VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fonte de Notificação",notification_source_label:"URL de origem (use apenas a fonte de status oficial do LNbits e fontes de confiança)",more:"mais",more_count:"Mais {count}",less:"menos",releases:"Lançamentos",watchdog:"Cão de guarda",server_logs:"Registros do Servidor",ip_blocker:"Bloqueador de IP",security:"Segurança",security_tools:"Ferramentas de segurança",block_access_hint:"Bloquear acesso por IP",allow_access_hint:"Permitir acesso por IP (substituirá os IPs bloqueados)",enter_ip:"Digite o IP e pressione enter",rate_limiter:"Limitador de Taxa",callback_url_rules:"Regras de URL de Retorno",enter_callback_url_rule:"Digite a regra de URL como regex e pressione enter",callback_url_rule_hint:"URLs de retorno de chamada (como a de LNURL) serão validados conforme estas regras. Pelo menos uma regra deve corresponder. Nenhuma regra significa que todas as URLs são permitidas.",wallet_limiter:"Limitador de Carteira",wallet_config:"Configuração da Carteira",wallet_charts:"Gráficos da Carteira",wallet_limit_max_withdraw_per_day:"Retirada máxima diária da carteira em sats (0 para desativar)",wallet_max_ballance:"Saldo máximo da carteira em sats (0 para desativar)",wallet_limit_secs_between_trans:"Minutos e segundos entre transações por carteira (0 para desativar)",only_incoming_payments_allowed:"Apenas pagamentos recebidos são permitidos",disable_outgoing_payments:"Desativar pagamentos de saída",number_of_requests:"Número de solicitações",time_unit:"Unidade de tempo",minute:"minuto",settings:"Configurações",second:"segundo",hour:"hora",disable_server_log:"Desativar Log do Servidor",enable_server_log:"Ativar Registro do Servidor",coming_soon:"Funcionalidade em breve",session_has_expired:"Sua sessão expirou. Por favor, faça login novamente.",instant_access_question:"Quer acesso imediato?",login_with_user_id:"Faça login com ID do usuário",or:"ou",create_new_wallet:"Criar Nova Carteira",delete_all_wallets:"Excluir Todas as Carteiras",confirm_delete_all_wallets:"Tem certeza de que deseja excluir TODAS as carteiras deste usuário?",login_to_account:"Faça login na sua conta",create_account:"Criar conta",account_settings:"Configurações da Conta",signin_with_oauth:"Entrar com",signin_with_oauth_or:"ou entre com",signin_with_nostr:"Continuar com Nostr",signin_with_google:"Entrar com o Google",signin_with_github:"Entrar com GitHub",signin_with_custom_org:"Entrar com {custom_org}",username_or_email:"Nome de usuário ou E-mail",password:"Senha",password_config:"Configuração de Senha",password_repeat:"Repetição de senha",update_password:"Atualizar Senha",change_password:"Alterar Senha",update_credentials:"Atualizar credenciais",update_pubkey:"Atualizar Chave Pública",nostr_pubkey_tooltip:"Insira a chave pública Nostr deste usuário (valor hexadecimal)",set_password:"Definir Senha",set_password_tooltip:"Defina uma senha para este usuário",invalid_password:"A senha deve ter pelo menos 8 caracteres",invalid_password_repeat:"As senhas não coincidem",reset_key_generated:"Uma chave de reinicialização foi gerada.",reset_key_copy:"Clique em OK para copiar o URL de redefinição para sua área de transferência.",login:"Entrar",register:"Registrar",username:"Nome de usuário",pubkey:"Chave Pública",user_id:"ID do Usuário",id:"ID",email:"E-mail",first_name:"Primeiro Nome",last_name:"Sobrenome",picture:"Foto",user_picture_desc:"URL para uma imagem a ser usada como foto de perfil. Você pode carregá-la como um ativo.",verify_email:"Verifique o e-mail com",account:"Conta",update_account:"Atualizar Conta",invalid_username:"Nome de usuário inválido",auth_provider:"Provedor de Autenticação",external_id:"ID Externo",my_account:"Minha Conta",existing_account_question:"Já tem uma conta?",background_image:"Imagem de Fundo",back:"Voltar",logout:"Sair",look_and_feel:"Aparência",endpoint:"Ponto de extremidade",api:"API",api_stripe:"API",api_token:"Token de API",api_tokens:"Tokens da API",access_control_list:"Lista de Controle de Acesso",access_control_list_admin_warning:"Esta é uma conta de administrador. Os tokens gerados terão privilégios de administrador.",new_api_acl:"Nova Lista de Controle de Acesso",api_token_id:"Id do Token",toggle_gradient:"Alternar Gradiente",gradient_background:"Fundo em Degradê",rounded_ui:"Cartões e Botões Arredondados",toggle_rounded_ui:"Alternar cantos arredondados para cartões e botões",card_gradient:"Gradiente do Cartão",toggle_card_gradient:"Alternar gradiente nos cartões",card_shadow:"Sombra do Cartão",toggle_card_shadow:"Alternar sombra nas cartas",language:"Idioma",assets:"Ativos",max_asset_size_mb:"Tamanho Máximo do Ativo (MB)",max_asset_size_mb_desc:"O tamanho máximo permitido para uploads de ativos em megabytes (pode usar valores decimais).",assets_allowed_mime_types:"Tipos MIME permitidos",assets_allowed_mime_types_desc:"Os tipos MIME permitidos para uploads de ativos. Nenhum valor significa que todos os uploads são permitidos.",thumbnail_width:"Largura da Miniatura",thumbnail_width_desc:"Largura da miniatura gerada em pixels.",thumbnail_height:"Altura da miniatura",thumbnail_height_desc:"Altura da miniatura gerada em pixels.",thumbnail_format:"Formato da Miniatura",thumbnail_format_desc:"Formato de imagem da miniatura gerada (PNG, JPEG, etc.).",max_assets_per_user:"Máximo de ativos por usuário",max_assets_per_user_desc:"O número máximo de ativos que um usuário pode fazer upload. Zero significa que o upload está proibido.",assets_no_limit_users:"Usuários sem Limites de Ativos",assets_no_limit_users_desc:"Esses usuários podem enviar um número ilimitado de ativos (com base no ID do usuário).",color_scheme:"Esquema de Cores",visible_wallet_count:"Contagem de Carteiras Visíveis",admin_settings:"Configurações do Administrador",extension_cost:"Este lançamento requer um pagamento mínimo de {cost} sats.",extension_paid_sats:"Você já pagou {paid_sats} sats.",create_extension:"Criar Extensão",release_details_error:"Não é possível obter os detalhes da versão.",pay_from_wallet:"Pagar com a Carteira",pay_with:"Pague com {provider}",select_payment_provider:"Selecione o provedor de pagamento",wallet_required:"Carteira *",show_qr:"Exibir QR",retry_install:"Repetir Instalação",new_payment:"Efetuar Novo Pagamento",update_payment:"Atualizar Pagamento",already_paid_question:"Você já pagou?",sell:"Vender",sell_require:"Peça pagamento para habilitar a extensão",sell_info:"A extensão {name} requer um pagamento mínimo de {amount} sats para habilitar.",hide_empty_wallets:"Ocultar carteiras vazias",recheck:"Verificar novamente",check:"Verificar",check_connection:"Verificar Conexão",check_webhook:"Verificar Webhook",contributors:"Contribuidores",license:"Licença",reset_key:"Redefinir Chave",reset_password:"Redefinir senha",border_choices:"Opções de Borda",select_all:"Selecionar tudo",nfc_supported:"Compatível com NFC",nfc_not_supported:"NFC não suportado",expire_date:"Data de Expiração:",hash:"Hash:",welcome_lnbits:"Bem-vindo ao LNbits",setup_su_account:"Configure a conta Superuser abaixo.",first_install_token:"Primeiro Token de Instalação",create_ticker_converter:"Criar Conversor de Ticker de Moeda",enable_audit:"Habilitar Auditoria",recommended:"Recomendado",audit_desc:"Gravar solicitações HTTP de acordo com os filtros especificados",audit_record_req:"Gravar Corpo da Requisição",audit_record_warning:"Aviso:",audit_record_req_warning_1:"dados confidenciais (como senhas) serão registrados.",audit_record_req_warning_2:"o corpo da solicitação pode ter um tamanho grande.",audit_record_use:"Use com cuidado.",audit_ip:"Registrar endereço IP",audit_ip_desc:"Registre o endereço IP do cliente",audit_path_params:"Registrar Parâmetros de Caminho",audit_query_params:"Registrar Parâmetros de Consulta",audit_http_methods:"Incluir métodos HTTP",audit_http_methods_hint:"Lista de métodos HTTP a serem incluídos. Listas vazias significam todos.",audit_http_methods_label:"Métodos HTTP",audit_resp_codes:"Incluir Códigos de Resposta HTTP",audit_resp_codes_hint:"Lista de códigos HTTP a serem incluídos (correspondência regex). Listas vazias significam todos. Ex: 4.*, 5.*",audit_resp_codes_label:"Código de resposta HTTP (regex)",audit_paths:"Incluir Caminhos",audit_paths_hint:"Lista de caminhos a serem incluídos (correspondência de regex). Lista vazia significa todos.",audit_paths_label:"Caminho HTTP (regex)",audit_paths_exclude:"Excluir Caminhos",audit_paths_exclude_hint:"Lista de caminhos a serem excluídos (correspondência regex). Lista vazia significa nenhum.",audit_paths_exclude_label:"Caminho HTTP (regex)",exchange_providers:"Provedores de Câmbio",admin_extensions:"Extensões de Administração",admin_extensions_label:"Extensões de administração",admin_extensions_hint:"Somente usuários com privilégios de administrador podem usar extensões.",user_default_extensions:"Extensões Padrão do Usuário",user_default_extensions_label:"Extensões do usuário",user_default_extensions_hint:"Extensões que serão ativadas por padrão para os usuários.",extension_builder:"Construtor de Extensão",extension_builder_manifest_url:"URL do Manifesto do Criador de Extensões",extension_builder_manifest_url_hint:"URL para um arquivo JSON manifest com detalhes do extension builder",miscellanous:"Diversos",misc_disable_extensions:"Desativar extensões",misc_disable_extensions_label:"Desativar todas as extensões",misc_disable_extensions_builder:"Habilitar Extensions Builder",misc_disable_extensions_builder_label:"Habilitar Extensions Builder para usuários não administradores.",misc_hide_api:"Ocultar API",misc_hide_api_label:"Oculta a API de carteira, extensões podem optar por honrar",wallets_management:"Gerenciamento de Carteiras",funding_source_info:"Informações da Fonte de Financiamento",funding_source:"Fonte de Financiamento: {wallet_class}",node_balance:"Saldo do Nó: {balance} sats",lnbits_balance:"Saldo do LNbits: {balance} sats",funding_reserve_percent:"Reserve Percentual: {percent} %",node_management:"Gerenciamento de Nós",node_management_not_supported:"Gerenciamento de nó não suportado pela fonte de financiamento ativa",toggle_node_ui:"Interface do Nó",toggle_public_node_ui:"Interface Pública do Nó",toggle_transactions_node_ui:"Guia de Transações (Desativar em nós grandes CLN)",invoice_expiry:"Expiração da Fatura",invoice_expiry_label:"Validade da fatura",routing_fee_reserve_calculations:"Cálculos de Reserva de Taxa de Roteamento",routing_fee_reserve_calculations_desc:'LNbits reserva um "valor de reserva" para cada pagamento para cobrir as taxas de roteamento. A taxa de roteamento máxima passada para a fonte de financiamento é a que for maior: a reserva mínima de taxa de roteamento ou a percentagem de reserva de taxa de roteamento.',millisats:"milissats",fee_reserve:"Reserva Mínima de Taxa de Encaminhamento",fee_reserve_percent:"Porcentagem da Reserva de Taxa de Roteamento",fee_reserve_min_hint:"A taxa mínima reservada por pagamento.
Isso atua como um piso - a taxa de roteamento máxima nunca será inferior a este valor, independentemente do tamanho do pagamento.",fee_reserve_percent_hint:"A porcentagem do valor do pagamento a reservar para taxas de roteamento.",payment_timeouts:"Tempos de Espera de Pagamento",payment_wait_time:"Tempo de Espera do Pagamento",seconds:"segundos",payment_wait_time_desc:"Tempo de espera antes de marcar um pagamento de saída como pendente. Padrão: 5s; aumentar para faturas de liquidação lenta.",payment_wait_time_tooltip:"Controla quanto tempo o LNbits espera para uma tentativa de pagamento de saída ser confirmada antes de marcá-la como pendente. Valores mais altos ajudam ao pagar faturas de liquidação lenta (por exemplo, faturas HODL, Boltz). O pagamento será verificado novamente mais tarde e atualizado automaticamente ou manualmente.",server_management:"Gerenciamento de Servidor",base_url:"URL base",base_url_label:"URL estática/base para o servidor",authentication:"Autenticação",auth_token_expiry_label:"Minutos para expiração do token",auth_token_expiry_hint:"Tempo em minutos até o token expirar",auth_authentication_cache_label:"Tempo de cache (minutos)",auth_authentication_cache_hint:"Tempo em minutos para armazenar em cache a autenticação bem-sucedida (0 para desativar)",auth_allowed_methods_label:"Métodos de autorização permitidos",auth_allowed_methods_hint:"Selecione métodos de autorização",auth_nostr_label:"URL de Solicitação Nostr",auth_nostr_hint:"URL absoluta que os clientes usarão para fazer login.",auth_google_ci_label:"ID do Cliente do Google",auth_google_ci_hint:"Certifique-se de que os URIs de redirecionamento autorizados contenham https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Segredo do Cliente do Google",auth_gh_client_id_label:"ID do Cliente do GitHub",auth_gh_client_id_hint:"Certifique-se de que a URL de callback de autorização esteja definida como https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Segredo do Cliente do GitHub",auth_keycloak_label:"URL de Descoberta do Keycloak",auth_keycloak_ci_label:"ID do Cliente Keycloak",auth_keycloak_ci_hint:"Certifique-se de que a URL de retorno de chamada de autorização esteja definida para https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Segredo do Cliente Keycloak",auth_keycloak_custom_org_label:"Organização Personalizada do Keycloak",auth_keycloak_custom_icon_label:"Ícone Personalizado do Keycloak (URL)",auth_oidc_label:"URL de Descoberta do OIDC",auth_oidc_ci_label:"ID do Cliente OIDC",auth_oidc_ci_hint:"Certifique-se de que a URL de retorno de chamada de autorização esteja definida para https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Segredo do Cliente OIDC",auth_oidc_custom_org_label:"Nome da Organização Personalizada OIDC (ex. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Ícone Personalizado do OIDC (URL)",auth_keycloak_custom_org_label:"Keycloak Custom Organization",auth_keycloak_custom_icon_label:"Ícone Personalizado do Keycloak (URL)",currency_settings:"Configurações de Moeda",allowed_currencies:"Moedas Permitidas",allowed_currencies_hint:"Limite o número de moedas fiduciárias disponíveis",default_account_currency:"Moeda Padrão da Conta",default_account_currency_hint:"Moeda padrão para contabilidade",min_incoming_payment_amount:"Quantia Mínima de Pagamento de Entrada",min_incoming_payment_amount_desc:"Quantidade mínima permitida para gerar uma fatura",max_incoming_payment_amount:"Valor Máximo do Pagamento Recebido",max_incoming_payment_amount_desc:"Quantidade máxima permitida para gerar uma fatura",max_outgoing_payment_amount:"Valor Máximo de Pagamento de Saída",max_outgoing_payment_amount_desc:"Valor máximo permitido para efetuar um pagamento",service_fee:"Taxa de serviço: {amount} % por transação",service_fee_label:"Taxa de serviço (%)",service_fee_hint:"Taxa cobrada por tx (%)",service_fee_max:"Taxa de serviço: {amount} % por transação (máx {max} sats)",service_fee_max_label:"Taxa de serviço máx (sats)",service_fee_max_hint:"Taxa máxima de serviço a cobrar em (sats)",fee_wallet:"Carteira de Taxas",fee_wallet_label:"Carteira de tarifas (ID da carteira)",fee_wallet_hint:"ID da carteira para enviar fundos para",disable_fee:"Desativar Taxa",disable_fee_internal:"Desativar taxa de serviço para pagamentos internos",disable_fee_internal_desc:"Desativar Taxa de Serviço para Pagamentos Internos Lightning",ui_management:"Gerenciamento de UI",ui_site_title:"Título do Site",ui_changing_remove_lnbits_elements:"(alterar removerá os elementos LNbits na página inicial e rodapé)",ui_site_tagline:"Tagline do site",ui_elements_enable:"Habilitar elementos na página inicial",ui_elements_disable:"Desativar elementos na página inicial",ui_toggle_elements_tip:"Remover elementos da página inicial, como 'funciona com', etc.",ui_site_description:"Descrição do Site",ui_site_description_hint:"Use texto simples, Markdown ou HTML bruto",ui_default_wallet_name:"Nome Padrão da Carteira",ui_default_theme:"Tema Padrão",wallet_featured_button_label:"Carteira Rótulo do Botão em Destaque",wallet_featured_button_label_hint:"Mostrar botão em destaque na página inicial da carteira",wallet_featured_button_url:"URL do Botão em Destaque",wallet_featured_button_url_hint:"Ao clicar, o botão abrirá este URL. Deixe em branco para ocultar o botão.",wallet_featured_button_icon:"Ícone do Botão em Destaque",wallet_featured_button_icon_hint:"Ícone mostrado no botão de destaque (verifique os ícones quasar)",lnbits_wallet:"Carteira LNbits",denomination:"Denominação",denomination_hint:"O nome para o token FakeWallet",denomination_error:"A denominação deve ter 3 caracteres ou `sats`.",ui_qr_code_logo:"Logo do QR Code",ui_qr_code_logo_hint:"URL para imagem de logo no código QR",ui_apple_touch_icon:"Ícone de Toque da Apple",ui_apple_touch_icon_hint:"URL do ícone de toque da Apple",ui_custom_image:"Imagem Personalizada",ui_custom_image_label:"URL para imagem personalizada",ui_custom_image_hint:"Imagem exibida na página inicial/login",ui_custom_badge:"Distintivo Personalizado",ui_custom_badge_label:"Distintivo Personalizado 'USE COM CUIDADO - a carteira LNbits ainda está em BETA'",ui_custom_badge_color_label:"Cor Personalizada do Distintivo",themes:"Temas",themes_hint:"Escolha temas disponíveis para usuários",custom_logo:"Logotipo personalizado",custom_logo_hint:"URL para a imagem do logotipo",ad_space_title:"Título do Espaço Publicitário",ad_space_title_label:"Suportado por",ad_slots:"Slots de Anúncio",ad_slots_hint:"Adicionar URL e caminhos de arquivo de imagem no formato CSV, as extensões podem optar por honrar",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Anúncios Ativados",ads_disabled:"Anúncios Desativados",user_management:"Gerenciamento de Usuários",admin_users:"Usuários Administradores",admin_users_hint:"Usuários com privilégios de administrador",admin_users_label:"ID do Usuário",allowed_users:"Usuários Permitidos",allowed_users_hint:"Somente esses usuários podem usar o LNbits",allowed_users_hint_feature:"Somente estes usuários podem usar {feature}",allowed_users_label:"ID do Usuário",allow_creation_user:"Permitir a criação de novos usuários",allow_creation_user_desc:"Permitir a criação de novos usuários na página de índice",require_user_activation:"Requer ativação do usuário",require_user_activation_desc:"Novos usuários serão ativados somente após passarem por um dos métodos de confirmação. Administradores podem ativar usuários manualmente a partir do painel de administração.",reusable_activation_code:"Código de ativação reutilizável",reusable_activation_code_label:"Código de ativação reutilizável",reusable_activation_code_hint:"Este código de ativação pode ser usado várias vezes por diferentes usuários.",one_time_activation_code:"Códigos de ativação única",one_time_activation_code_label:"Adicionar código de ativação",one_time_activation_code_hint:"Lista de códigos de ativação únicos. Cada código pode ser usado apenas uma vez, depois será removido da lista.",invitation_code:"Código de Convite",invitation_code_hint:"O código de convite que você recebeu.",email_confirmation_hint:"Endereço de e-mail para enviar o código de confirmação.",nostr_identifier:"Identificador Nostr",nostr_identifier_hint:"Identificador nostr nip5 ou para enviar o código de confirmação.",new_user_not_allowed:"O registro está desativado.",start_user_impersonation:"Personificar este usuário",stop_user_impersonation:"Parar a Personificação do Usuário",components:"Componentes",long_running_endpoints:"Top 5 Endpoints de Longa Execução",http_request_methods:"Métodos de Requisição HTTP",http_response_codes:"Códigos de Resposta HTTP",request_details:"Detalhes do Pedido",http_request_details:"Detalhes da Requisição HTTP",payment_details:"Detalhes do Pagamento",payment_details_desc:"Informações detalhadas sobre o pagamento",payments:"Pagamentos",payment_show_internal:"Mostrar Pagamentos Internos",payment_chart_flow:"Fluxo de Pagamento Mensal",payment_chart_status:"Status do Pagamento",payment_chart_tx_per_wallet:"Transações por Carteira (saldo/contagem)",payment_details_back:"Voltar para Pagamentos",payment_chart_tags:"Pagamentos por Tags",payments_balance_in_out:"Entradas/Saídas de Saldo",payments_count_in_out:"Contar Entrada/Saída",payments_status_chart:"Gráfico de Status",payments_tag_chart:"Gráfico de Marcadores",payments_balance_chart:"Gráfico de Saldo",payments_wallets_chart:"Gráfico de Carteiras",payments_balance_in_out_chart:"Gráfico de Entrada/Saída de Saldo",payments_count_in_out_chart:"Gráfico de Entrada/Saída",reset_wallet_keys:"Redefinir Chaves",reset_wallet_keys_desc:"Redefina as chaves de API para esta carteira. Isso invalidará as chaves atuais e gerará novas.",view_list:"Visualizar carteiras como lista",view_column:"Visualizar carteiras como linhas",filter_payments:"Filtrar pagamentos",filter_labels:"Rótulos de filtro",filter_date:"Filtrar por data",websocket_example:"Exemplo de Websocket",client_id:"ID do Cliente",secret_key:"Chave Secreta",signing_secret:"Segredo de Assinatura",signing_secret_hint:"Segredo de assinatura para o webhook. As mensagens serão assinadas com este segredo.",webhook_id:"ID do Webhook",webhook_id_hint:"ID do webhook do PayPal usado para verificar eventos recebidos.",webhook_paypal_description:"No lado do PayPal, configure um webhook apontando para o seu servidor LNbits.",callback_success_url:"URL de Sucesso de Callback",callback_success_url_hint:"O usuário será redirecionado para este URL após o pagamento ser bem-sucedido.",connected:"Conectado",not_connected:"Não Conectado",free:"Grátis",paid:"Pago",funding_source_retries:"Máximo de tentativas",funding_source_retries_desc:"Número máximo de tentativas para fontes de financiamento, antes de voltar para VoidWallet.",add_label:"Adicionar Rótulo",label:"Etiqueta",labels:"Rótulos",label_filter:"Filtro de Rótulo",no_labels_defined:"Ainda não há rótulos definidos",manage_labels:"Gerenciar Etiquetas",update_label:"Atualizar Rótulo",delete_label:"Excluir Rótulo",add_remove_labels:"Adicionar ou Remover Rótulos",payment_labels_updated:"Rótulos de pagamento atualizados",color:"Cor",sort:"Ordenar",sort_by:"Ordenar por",block_explorer:"Block Explorer",enable_block_explorer:"Ativar Block Explorer",block_explorer_desc:"Permite aos usuários explorar transações e endereços Bitcoin via Electrum.",blockexplorer_public_api:"Acesso à API pública",blockexplorer_public_api_desc:"Permitir acesso não autenticado aos endpoints da API do explorador de blocos.",electrum_server_url:"URL do servidor Electrum",electrum_server_url_hint:"ex. ssl://electrum.blockstream.info:50002 ou tcp://localhost:50001",blockexplorer_search_label:"Pesquisar por TXID ou endereço",blockexplorer_search_hint:"Hex de 64 caracteres = transação · qualquer outra coisa = endereço Bitcoin",recent_blocks:"Blocos recentes",chain_tip:"Ponta da cadeia",block_height:"Altura do bloco",block_fee:"taxa de bloco",fee_estimates:"Estimativas de taxa",confirmed_balance:"Saldo confirmado",unconfirmed_balance:"Saldo não confirmado",transaction_history:"Histórico de transações",coinbase:"Coinbase",inputs:"Entradas",outputs:"Saídas",confirmations:"Confirmações",confirmed:"Confirmado",unconfirmed:"Não confirmado",history_unavailable:"Histórico de transações indisponível (endereço tem transações demais)",address:"Endereço",block_number:"Bloco #{height}",block_diff:"diff {value}",block_hash:"Hash",previous_block:"Bloco anterior",merkle_root:"Raiz de Merkle",version:"Versão",bits:"Bits",difficulty:"Dificuldade",nonce:"Nonce",txid:"TXID",vsize:"Tamanho virtual",weight:"Peso",n_block_fee:"taxa {n} blocos"},window.localisation.cs={confirm:"Ano",server:"Server",theme:"Téma",site_customisation:"Přizpůsobení stránek",funding:"Financování",users:"Uživatelé",audit:"Audit",apps:"Aplikace",channels:"Kanály",transactions:"Transakce",dashboard:"Přehled",node:"Uzel",export_users:"Exportovat uživatele",no_users:"Nebyli nalezeni žádní uživatelé",total_capacity:"Celková kapacita",avg_channel_size:"Průmerná velikost kanálu",biggest_channel_size:"Největší velikost kanálu",smallest_channel_size:"Nejmenší velikost kanálu",number_of_channels:"Počet kanálů",active_channels:"Aktivní kanály",connect_peer:"Připojit peer",connect:"Připojit",open_channel:"Otevřít kanál",open:"Otevřít",close_channel:"Zavřít kanál",close:"Zavřít",restart:"Restartovat server",save:"Uložit",save_tooltip:"Uložit změny",credit_debit:"Kreditní / Debetní",credit_hint:"Stiskněte Enter pro připsání na účet",credit_label:"{denomination} k připsání",credit_ok:"Úspěšné připsání/odepsání virtuálních prostředků ({amount} satů). Platby závisí na skutečných prostředcích z financujícího zdroje.",restart_tooltip:"Restartujte server pro aplikaci změn",add_funds_tooltip:"Přidat prostředky do peněženky.",reset_defaults:"Obnovit výchozí",reset_defaults_tooltip:"Smazat všechna nastavení a obnovit výchozí.",download_backup:"Stáhnout zálohu databáze",name_your_wallet:"Pojmenujte svou {name} peněženku",paste_invoice_label:"Vložte fakturu, platební požadavek nebo lnurl kód *",lnbits_description:"Snadno nastavitelný a lehkotonážní, LNbits může běžet na jakémkoliv zdroji financování Lightning Network a dokonce LNbits samotné! LNbits můžete provozovat pro sebe, nebo snadno nabízet správu peněženek pro ostatní. Každá peněženka má své vlastní API klíče a není omezen počet peněženek, které můžete vytvořit. Možnost rozdělení prostředků dělá z LNbits užitečný nástroj pro správu peněz a jako vývojový nástroj. Rozšíření přidávají extra funkčnost k LNbits, takže můžete experimentovat s řadou špičkových technologií na lightning network. Vývoj rozšíření jsme učinili co nejjednodušší a jako svobodný a open-source projekt podporujeme lidi ve vývoji a zasílání vlastních rozšíření.",export_to_phone:"Exportovat do telefonu pomocí QR kódu",export_to_phone_desc:"Tento QR kód obsahuje URL vaší peněženky s plným přístupem. Můžete jej naskenovat z telefonu a otevřít peněženku odtamtud.",wallet:"Peněženka:",wallets:"Peněženky",add_wallet:"Přidat novou peněženku",delete_wallet:"Smazat peněženku",delete_wallet_desc:"Celá peněženka bude smazána, prostředky budou NEOBNOVITELNÉ.",rename_wallet:"Přejmenovat peněženku",update_name:"Aktualizovat název",fiat_tracking:"Sledování fiatu",currency:"Měna",update_currency:"Aktualizovat měnu",press_to_claim:"Stiskněte pro nárokování bitcoinu",donate:"Darovat",view_github:"Zobrazit na GitHubu",voidwallet_active:"VoidWallet je aktivní! Platby zakázány",use_with_caution:"POUŽÍVEJTE S OBEZŘETNOSTÍ - {name} peněženka je stále v BETĚ",service_fee:"Servisný poplatek: {amount} % za transakci",service_fee_max:"Servisný poplatek: {amount} % za transakci (max {max} satoshi)",service_fee_tooltip:"Servisní poplatek účtovaný správcem LNbits serveru za odchozí transakci",toggle_darkmode:"Přepnout tmavý režim",payment_reactions:"Reakce na platby",view_swagger_docs:"Zobrazit LNbits Swagger API dokumentaci",api_docs:"API dokumentace",api_keys_api_docs:"Adresa uzlu, API klíče a API dokumentace",api_keys_warning:"Tyto klíče uchovávejte v bezpečí, jejich sdílení může vést ke ztrátě prostředků.",admin_key_warning:"Váš administrátorský klíč poskytuje plný přístup k peněžence včetně možnosti odesílat platby. Nikdy jej nesdílejte, pokud příjemci plně nedůvěřujete.",lnbits_version:"Verze LNbits",runs_on:"Běží na",paste:"Vložit",paste_from_clipboard:"Vložit ze schránky",paste_request:"Vložit požadavek",create_invoice:"Vytvořit fakturu",camera_tooltip:"Použijte kameru pro skenování faktury/QR",export_csv:"Exportovat do CSV",chart_tooltip:"Zobrazit graf",pending:"Čeká na vyřízení",copy_invoice:"Kopírovat fakturu",withdraw_from:"Vybrat z",cancel:"Zrušit",scan:"Skenovat",read:"Číst",pay:"Platit",memo:"Poznámka",date:"Datum",payment_processing:"Zpracování platby...",not_enough_funds:"Nedostatek prostředků!",search_by_tag_memo_amount:"Hledat podle tagu, poznámky, částky",invoice_waiting:"Faktura čeká na platbu",payment_received:"Platba přijata",payment_sent:"Platba odeslána",receive:"přijmout",send:"odeslat",outgoing_payment_pending:"Odchozí platba čeká na vyřízení",drain_funds:"Vyčerpat prostředky",drain_funds_desc:"Toto je LNURL-withdraw QR kód pro vyčerpání všeho z této peněženky. Nesdílejte s nikým. Je kompatibilní s balanceCheck a balanceNotify, takže vaše peněženka může kontinuálně čerpat prostředky odsud po prvním výběru.",i_understand:"Rozumím",copy_wallet_url:"Kopírovat URL peněženky",disclaimer_dialog_title:"Důležité!",disclaimer_dialog:"Funkcionalita přihlášení bude vydána v budoucí aktualizaci, zatím si ujistěte, že jste si tuto stránku uložili do záložek pro budoucí přístup k vaší peněžence! Tato služba je v BETA verzi a nepřebíráme žádnou zodpovědnost za ztrátu přístupu k prostředkům.",no_transactions:"Zatím žádné transakce",manage:"Spravovat",exchanges:"Burzy",extensions:"Rozšíření",no_extensions:"Nemáte nainstalováno žádné rozšíření :(",created:"Vytvořeno",search_extensions:"Hledat rozšíření",extension_sources:"Zdroje rozšíření",ext_sources_hint:"Úložiště, odkud lze rozšíření stáhnout.",ext_sources_label:"Zdrojová URL (používejte pouze oficiální zdroj rozšíření LNbits a zdroje, kterým můžete důvěřovat)",warning:"Varování",repository:"Repositář",confirm_continue:"Jste si jistí, že chcete pokračovat?",manage_extension_details:"Instalovat/odinstalovat rozšíření",install:"Instalovat",uninstall:"Odinstalovat",drop_db:"Odstranit data",enable:"Povolit",pay_to_enable:"Zaplatit pro aktivaci",enable_extension_details:"Povolit rozšíření pro aktuálního uživatele",disable:"Zakázat",delete:"Smazat",installed:"Nainstalováno",activated:"Aktivováno",deactivated:"Deaktivováno",release_notes:"Poznámky k vydání",activate_extension_details:"Zpřístupnit/zakázat rozšíření pro uživatele",featured:"Doporučené",all:"Vše",only_admins_can_install:"(Pouze administrátorské účty mohou instalovat rozšíření)",admin_only:"Pouze pro adminy",new_version:"Nová verze",extension_depends_on:"Závisí na:",extension_rating_soon:"Hodnocení brzy dostupné",extension_installed_version:"Nainstalovaná verze",extension_uninstall_warning:"Chystáte se odstranit rozšíření pro všechny uživatele.",uninstall_confirm:"Ano, odinstalovat",extension_db_drop_info:"Všechna data pro rozšíření budou trvale odstraněna. Tuto operaci nelze vrátit zpět!",extension_db_drop_warning:"Chystáte se odstranit všechna data pro rozšíření. Prosím, pokračujte zadáním názvu rozšíření:",extension_required_lnbits_version:"Toto vydání vyžaduje alespoň verzi LNbits",min_version:"Minimum (včetně)",max_version:"Maximální (vyloučeno)",payment_hash:"Hash platby",fee:"Poplatek",amount:"Částka",amount_sats:"Částka (sats)",tag:"Tag",unit:"Jednotka",description:"Popis",expiry:"Expirace",webhook:"Webhook",payment_proof:"Důkaz platby",update:"Aktualizovat",update_available:"Dostupná aktualizace {version}!",latest_update:"Máte nejnovější verzi {version}.",notifications:"Notifikace",no_notifications:"Žádné notifikace",notifications_disabled:"Notifikace stavu LNbits jsou zakázány.",enable_notifications:"Povolit notifikace",enable_notifications_desc:"Pokud je povoleno, bude stahovat nejnovější aktualizace stavu LNbits, jako jsou bezpečnostní incidenty a aktualizace.",watchdog_interval:"Interval Watchdog",watchdog_interval_desc:"Jak často by měl úkol na pozadí kontrolovat signál killswitch v watchdog delta [node_balance - lnbits_balance] (v minutách).",watchdog_delta:"Delta Watchdog",watchdog_delta_desc:"Limit předtím, než killswitch změní zdroj financování na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stav",notification_source:"Zdroj notifikací",notification_source_label:"URL zdroje (používejte pouze oficiální zdroj stavu LNbits a zdroje, kterým můžete věřit)",more:"více",less:"méně",releases:"Vydání",watchdog:"Watchdog",server_logs:"Logy serveru",ip_blocker:"Blokování IP",security:"Bezpečnost",security_tools:"Nástroje bezpečnosti",block_access_hint:"Blokovat přístup podle IP",allow_access_hint:"Povolit přístup podle IP (přepíše blokované IP)",enter_ip:"Zadejte IP a stiskněte enter",rate_limiter:"Omezovač počtu požadavků",wallet_limiter:"Omezení peněženky",wallet_limit_max_withdraw_per_day:"Maximální denní limit pro výběr z peněženky v sats (0 pro deaktivaci)",wallet_max_ballance:"Maximální zůstatek v peněžence v sats (0 pro zakázání)",wallet_limit_secs_between_trans:"Minimální počet sekund mezi transakcemi na peněženku (0 pro vypnutí)",number_of_requests:"Počet požadavků",time_unit:"Časová jednotka",minute:"minuta",second:"sekunda",hour:"hodina",disable_server_log:"Zakázat log serveru",enable_server_log:"Povolit log serveru",coming_soon:"Funkce brzy dostupná",session_has_expired:"Vaše relace vypršela. Prosím, přihlašte se znovu.",instant_access_question:"Chcete okamžitý přístup?",login_with_user_id:"Přihlásit se s uživatelským ID",or:"nebo",create_new_wallet:"Vytvořit novou peněženku",login_to_account:"Přihlaste se ke svému účtu",create_account:"Vytvořit účet",account_settings:"Nastavení účtu",signin_with_nostr:"Pokračovat s Nostr",signin_with_google:"Přihlásit se přes Google",signin_with_github:"Přihlásit se přes GitHub",signin_with_keycloak:"Přihlásit se přes Keycloak",username_or_email:"Uživatelské jméno nebo Email",password:"Heslo",password_config:"Konfigurace hesla",password_repeat:"Opakujte heslo",change_password:"Změnit heslo",update_credentials:"Aktualizovat přihlašovací údaje",update_pubkey:"Aktualizovat veřejný klíč",set_password:"Nastavit heslo",invalid_password:"Heslo musí mít alespoň 8 znaků",login:"Přihlášení",register:"Registrovat",username:"Uživatelské jméno",pubkey:"Veřejný klíč",user_id:"ID uživatele",email:"Email",first_name:"Křestní jméno",last_name:"Příjmení",picture:"Obrázek",verify_email:"Ověřte e-mail s",account:"Účet",update_account:"Aktualizovat účet",invalid_username:"Neplatné uživatelské jméno",auth_provider:"Poskytovatel ověření",my_account:"Můj účet",back:"Zpět",logout:"Odhlásit se",look_and_feel:"Vzhled a chování",toggle_gradient:"Přepnout gradient",gradient_background:"Barevný přechod pozadí",language:"Jazyk",color_scheme:"Barevné schéma",admin_settings:"Nastavení administrátora",extension_cost:"Toto vydání vyžaduje minimální platbu {cost} satoshi.",extension_paid_sats:"Již jste zaplatili {paid_sats} sats.",release_details_error:"Nelze získat podrobnosti o vydání.",pay_from_wallet:"Platit z peněženky",wallet_required:"Peněženka *",show_qr:"Zobrazit QR",retry_install:"Zkusit znovu nainstalovat",new_payment:"Vytvořit novou platbu",update_payment:"Aktualizovat platbu",already_paid_question:"Už jste zaplatili?",sell:"Prodat",sell_require:"Požádejte o platbu, abyste povolili rozšíření",sell_info:"Rozšíření {name} vyžaduje platbu minimálně {amount} sats pro aktivaci.",hide_empty_wallets:"Skrýt prázdné peněženky",recheck:"Znovu zkontrolovat",contributors:"Přispěvatelé",license:"Licence",reset_key:"Obnovit klíč",reset_password:"Obnovit heslo",border_choices:"Možnosti ohraničení",select_all:"Vybrat vše",nfc_supported:"Podpora NFC",nfc_not_supported:"NFC není podporováno",expire_date:"Datum expirace:",hash:"Hash:",welcome_lnbits:"Vítejte v LNbits",setup_su_account:"Nastavte účet Superuser níže.",create_ticker_converter:"Vytvořit převodník měnových tickerů",enable_audit:"Povolit audit",recommended:"Doporučeno",audit_desc:"Zaznamenávejte HTTP požadavky podle zadaných filtrů",audit_record_req:"Záznam Tělo Požadavku",audit_record_warning:"Varování:",audit_record_req_warning_1:"důvěrná data (jako hesla) budou zaznamenána.",audit_record_req_warning_2:"tělo žádosti může mít velkou velikost.",audit_record_use:"Používejte to opatrně.",audit_ip:"Zaznamenat IP adresu",audit_ip_desc:"Zaznamenejte IP adresu klienta",audit_path_params:"Zaznamenat parametry cesty",audit_query_params:"Zaznamenat parametry dotazu",audit_http_methods:"Zahrnout metody HTTP",audit_http_methods_hint:"Seznam metod HTTP, které mají být zahrnuty. Prázdné seznamy znamenají všechny.",audit_http_methods_label:"Metody HTTP",audit_resp_codes:"Zahrnout kódy odpovědí HTTP",audit_resp_codes_hint:"Seznam kódů HTTP, které mají být zahrnuty (regex match). Prázdné seznamy znamenají všechny. Např.: 4.*, 5.*",audit_resp_codes_label:"Kód odpovědi HTTP (regex)",audit_paths:"Zahrnout cesty",audit_paths_hint:"Seznam cest, které mají být zahrnuty (regex shoda). Prázdný seznam znamená vše.",audit_paths_label:"HTTP cesta (regex)",audit_paths_exclude:"Vyloučit cesty",audit_paths_exclude_hint:"Seznam cest, které mají být vyloučeny (regex shoda). Prázdný seznam znamená žádné.",audit_paths_exclude_label:"HTTP cesta (regex)",exchange_providers:"Poskytovatelé směny",admin_extensions:"Rozšíření pro správce",admin_extensions_label:"Administrátorské rozšíření",admin_extensions_hint:"Rozšíření může používat pouze uživatel s administrátorskými oprávněními.",user_default_extensions:"Výchozí rozšíření uživatele",user_default_extensions_label:"Uživatelská rozšíření",user_default_extensions_hint:"Rozšíření, která budou u uživatelů ve výchozím nastavení povolena.",miscellanous:"Různé",misc_disable_extensions:"Zakázat rozšíření",misc_disable_extensions_label:"Zakázat všechna rozšíření",misc_hide_api:"Skrýt API",misc_hide_api_label:"Skrývá API peněženky, rozšíření se mohou rozhodnout ctít",wallets_management:"Správa peněženek",funding_source_info:"Informace o zdroji financování",funding_source:"Zdroj financování: {wallet_class}",node_balance:"Stav uzlu: {balance} sats",lnbits_balance:"Zůstatek LNbits: {balance} sats",funding_reserve_percent:"Rezervovat procento: {percent} %",node_management:"Správa uzlů",node_management_not_supported:"Správa uzlů není podporována aktivním zdrojem financování",toggle_node_ui:"Uživatelské rozhraní uzlu",toggle_public_node_ui:"Veřejné rozhraní uzlu",toggle_transactions_node_ui:"Karta Transakce (Zakázat na velkých uzlech CLN)",invoice_expiry:"Datum vypršení faktury",invoice_expiry_label:"Vypršení faktury (sekundy)",fee_reserve:"Rezerva poplatku",fee_reserve_msats:"Rezervační poplatek v msats",fee_reserve_percent:"Rezervační poplatek v procentech",server_management:"Správa serveru",base_url:"Základní URL",base_url_label:"Statická/Základní URL pro server",authentication:"Ověření",auth_token_expiry_label:"Minuty vypršení platnosti tokenu",auth_token_expiry_hint:"Čas v minutách do vypršení tokenu",auth_allowed_methods_label:"Povolené metody autorizace",auth_allowed_methods_hint:"Vyberte metody autorizace",auth_nostr_label:"URL žádosti Nostr",auth_nostr_hint:"Absolutní URL, které klienti použijí pro přihlášení.",auth_google_ci_label:"ID klienta Google",auth_google_ci_hint:"Ujistěte se, že autorizované přesměrovací URI obsahují https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Heslo klienta Google",auth_gh_client_id_label:"ID klienta GitHub",auth_gh_client_id_hint:"Ujistěte se, že je nastavena zpětná adresa URL pro autorizaci na https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Klientský tajný klíč",auth_keycloak_label:"URL pro zjištění Keycloak",auth_keycloak_ci_label:"ID klienta Keycloak",auth_keycloak_ci_hint:"Ujistěte se, že je autorizace callback URL nastavena na https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Klíč k aplikaci Keycloak tajemství",auth_keycloak_custom_org_label:"Vlastní organizace Keycloak",auth_keycloak_custom_icon_label:"Vlastní ikona Keycloak (URL)",auth_oidc_label:"URL pro zjištění OIDC",auth_oidc_ci_label:"ID klienta OIDC",auth_oidc_ci_hint:"Ujistěte se, že je autorizace callback URL nastavena na https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Klíč k aplikaci OIDC tajemství",auth_oidc_custom_org_label:"Název vlastní organizace OIDC (např. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Vlastní ikona OIDC (URL)",currency_settings:"Nastavení měny",allowed_currencies:"Povolené měny",allowed_currencies_hint:"Omezte počet dostupných fiat měn",default_account_currency:"Výchozí měna účtu",default_account_currency_hint:"Výchozí měna pro účetnictví",service_fee_label:"Poplatek za službu (%)",service_fee_hint:"Poplatek účtovaný za transakci (%)",service_fee_max_label:"Poplatek za službu max (sats)",service_fee_max_hint:"Maximální poplatek za službu k účtování v (sats)",fee_wallet:"Poplatková peněženka",fee_wallet_label:"Poplatková peněženka (ID peněženky)",fee_wallet_hint:"ID peněženky, na kterou se mají odeslat prostředky",disable_fee:"Zakázat poplatek",disable_fee_internal:"Zakázat poplatek za službu pro interní platby",disable_fee_internal_desc:"Zakázat servisní poplatek za interní lightning platby",ui_management:"Správa uživatelského rozhraní",ui_site_title:"Název stránky",ui_site_tagline:"Stránkový slogan",ui_elements_enable:"Povolit prvky na domovské stránce",ui_elements_disable:"Zakázat prvky na úvodní stránce",ui_toggle_elements_tip:"Odebrat prvky z domovské stránky, jako je 'běží na' atd.",ui_site_description:"Popis webu",ui_site_description_hint:"Použijte prostý text, Markdown nebo surové HTML.",ui_default_wallet_name:"Výchozí název peněženky",lnbits_wallet:"Peněženka LNbits",denomination:"Nominální hodnota",denomination_hint:"Název pro token FakeWallet",ui_qr_code_logo:"Logo QR kódu",ui_qr_code_logo_hint:"URL k obrázku loga v QR kódu",ui_custom_badge:"Vlastní odznak",ui_custom_badge_label:"Vlastní odznak 'POUŽÍVEJTE S OPATRNOSTÍ - Peněženka LNbits je stále v BETA verzi'",ui_custom_badge_color_label:"Barva vlastního odznaku",themes:"Motivy",themes_hint:"Vyberte motivy dostupné pro uživatele",custom_logo:"Vlastní logo",custom_logo_hint:"URL k obrázku loga",ad_space_title:"Název reklamního prostoru",ad_space_title_label:"Podporováno",ad_slots:"Reklamní sloty",ad_slots_hint:"Adresa URL reklamy a cesty k souborům obrázků ve formátu CSV, rozšíření se mohou rozhodnout respektovat",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Reklamy povoleny",ads_disabled:"Reklamy deaktivovány",user_management:"Správa uživatelů",admin_users:"Administrátorští uživatelé",admin_users_hint:"Uživatelé s administrátorskými oprávněními",admin_users_label:"ID uživatele",allowed_users:"Povolení uživatelé",allowed_users_hint:"Pouze tito uživatelé mohou používat LNbits.",allowed_users_label:"Uživatelské ID",allow_creation_user:"Povolit vytvoření nových uživatelů",allow_creation_user_desc:"Povolit vytváření nových uživatelů na úvodní stránce",components:"Soubory",long_running_endpoints:"Top 5 dlouho běžících koncových bodů",http_request_methods:"Metody HTTP požadavků",http_response_codes:"Kódy HTTP odpovědí",request_details:"Podrobnosti žádosti",http_request_details:"Podrobnosti HTTP žádosti",block_explorer:"Průzkumník bloků",enable_block_explorer:"Povolit průzkumník bloků",block_explorer_desc:"Umožňuje uživatelům procházet bitcoinové transakce a adresy přes Electrum.",blockexplorer_public_api:"Veřejný přístup k API",blockexplorer_public_api_desc:"Povolit neověřený přístup k API koncovým bodům průzkumníku bloků.",electrum_server_url:"URL Electrum serveru",electrum_server_url_hint:"např. ssl://electrum.blockstream.info:50002 nebo tcp://localhost:50001",blockexplorer_search_label:"Hledat podle TXID nebo adresy",blockexplorer_search_hint:"64-znakový hex = transakce · cokoli jiného = bitcoinová adresa",recent_blocks:"Nedávné bloky",chain_tip:"Vrchol řetězu",block_height:"Výška bloku",block_fee:"poplatek bloku",fee_estimates:"Odhady poplatků",confirmed_balance:"Potvrzený zůstatek",unconfirmed_balance:"Nepotvrzený zůstatek",transaction_history:"Historie transakcí",coinbase:"Coinbase",inputs:"Vstupy",outputs:"Výstupy",confirmations:"Potvrzení",confirmed:"Potvrzeno",unconfirmed:"Nepotvrzeno",history_unavailable:"Historie transakcí nedostupná (adresa má příliš mnoho transakcí)",address:"Adresa",block_number:"Blok #{height}",block_diff:"obth. {value}",block_hash:"Hash",previous_block:"Předchozí blok",merkle_root:"Merkle kořen",version:"Verze",bits:"Bity",difficulty:"Obtížnost",nonce:"Nonce",txid:"TXID",vsize:"Virtuální velikost",weight:"Váha",n_block_fee:"poplatek {n} bloků"},window.localisation.sk={confirm:"Áno",server:"Server",theme:"Téma",site_customisation:"Prispôsobenie lokality",funding:"Financovanie",users:"Používatelia",audit:"Audit",apps:"Aplikácie",channels:"Kanály",transactions:"Transakcie",dashboard:"Prehľad",node:"Uzol",export_users:"Exportovať používateľov",no_users:"Nenašli sa žiadni používatelia",total_capacity:"Celková kapacita",avg_channel_size:"Priemerná veľkosť kanálu",biggest_channel_size:"Najväčší kanál",smallest_channel_size:"Najmenší kanál",number_of_channels:"Počet kanálov",active_channels:"Aktívne kanály",connect_peer:"Pripojiť peer",connect:"Pripojiť",open_channel:"Otvoriť kanál",open:"Otvoriť",close_channel:"Zatvoriť kanál",close:"Zatvoriť",restart:"Reštartovať server",save:"Uložiť",save_tooltip:"Uložiť vaše zmeny",credit_debit:"Kreditná / Debetná",credit_hint:"Stlačte Enter pre pripísanie na účet",credit_label:"{denomination} na pripísanie",restart_tooltip:"Pre prejavenie zmien reštartujte server",add_funds_tooltip:"Pridať prostriedky do peňaženky.",reset_defaults:"Obnoviť predvolené",reset_defaults_tooltip:"Odstrániť všetky nastavenia a obnoviť predvolené.",download_backup:"Stiahnuť zálohu databázy",name_your_wallet:"Pomenujte vašu {name} peňaženku",paste_invoice_label:"Vložte faktúru, platobnú požiadavku alebo lnurl kód *",lnbits_description:"Ľahko nastaviteľný a ľahkotonážny, LNbits môže bežať na akomkoľvek zdroji financovania Lightning Network a dokonca LNbits samotný! LNbits môžete používať pre seba, alebo ľahko ponúknuť správcovské riešenie pre iných. Každá peňaženka má svoje vlastné API kľúče a nie je limit na počet peňaženiek, ktoré môžete vytvoriť. Schopnosť rozdeľovať finančné prostriedky robí z LNbits užitočný nástroj pre správu peňazí a ako vývojový nástroj. Rozšírenia pridávajú extra funkčnosť do LNbits, takže môžete experimentovať s radou najnovších technológií na lightning sieti. Vývoj rozšírení sme urobili čo najjednoduchší a ako voľný a open-source projekt, podporujeme ľudí vývoj a odovzdávanie vlastných rozšírení.",export_to_phone:"Exportovať do telefónu s QR kódom",export_to_phone_desc:"Tento QR kód obsahuje URL vašej peňaženky s plným prístupom. Môžete ho naskenovať z vášho telefónu a otvoriť vašu peňaženku odtiaľ.",wallet:"Peňaženka:",wallets:"Peňaženky",add_wallet:"Pridať novú peňaženku",delete_wallet:"Zmazať peňaženku",delete_wallet_desc:"Celá peňaženka bude zmazaná, prostriedky budú NEOBNOVITEĽNÉ.",rename_wallet:"Premenovať peňaženku",update_name:"Aktualizovať meno",fiat_tracking:"Sledovanie fiat",currency:"Mena",update_currency:"Aktualizovať menu",press_to_claim:"Stlačte pre nárok na bitcoin",donate:"Prispieť",view_github:"Zobraziť na GitHube",voidwallet_active:"VoidWallet je aktívny! Platby zakázané",use_with_caution:"POUŽÍVAJTE OPATRNE - {name} peňaženka je stále v BETE",service_fee:"Servisný poplatok: {amount} % za transakciu",service_fee_max:"Servisný poplatok: {amount} % za transakciu (max {max} satoshi)",service_fee_tooltip:"Servisný poplatok účtovaný správcom LNbits servera za odchádzajúcu transakciu",toggle_darkmode:"Prepnúť Tmavý režim",payment_reactions:"Reakcie na platbu",view_swagger_docs:"Zobraziť LNbits Swagger API dokumentáciu",api_docs:"API dokumentácia",api_keys_api_docs:"Adresa uzla, API kľúče a API dokumentácia",api_keys_warning:"Tieto kľúče uchovávajte v bezpečí, ich zdieľanie môže viesť k strate prostriedkov.",admin_key_warning:"Váš administrátorský kľúč poskytuje úplný prístup k peňaženke vrátane možnosti odosielať platby. Nikdy ho nezdieľajte, pokiaľ príjemcovi úplne nedôverujete.",lnbits_version:"Verzia LNbits",runs_on:"Beží na",paste:"Vložiť",paste_from_clipboard:"Vložiť zo schránky",paste_request:"Vložiť požiadavku",create_invoice:"Vytvoriť faktúru",camera_tooltip:"Použite kameru na naskenovanie faktúry/QR",export_csv:"Exportovať do CSV",chart_tooltip:"Zobraziť graf",pending:"Čakajúce",copy_invoice:"Kopírovať faktúru",withdraw_from:"Vybrať z",cancel:"Zrušiť",scan:"Skenovať",read:"Čítať",pay:"Platiť",memo:"Poznámka",date:"Dátum",payment_processing:"Spracovávanie platby...",not_enough_funds:"Nedostatok prostriedkov!",search_by_tag_memo_amount:"Vyhľadať podľa značky, poznámky, sumy",invoice_waiting:"Faktúra čakajúca na zaplatenie",payment_received:"Platba prijatá",payment_sent:"Platba odoslaná",receive:"prijímať",send:"posielať",outgoing_payment_pending:"Odchádzajúca platba čaká",drain_funds:"Vyprázdniť prostriedky",drain_funds_desc:"Toto je LNURL-withdraw QR kód pre vyprázdnienie všetkého z tejto peňaženky. S nikým ho nezdieľajte. Je kompatibilný s balanceCheck a balanceNotify, takže vaša peňaženka môže naďalej kontinuálne vyťahovať prostriedky odtiaľto po prvom výbere.",i_understand:"Rozumiem",copy_wallet_url:"Kopírovať URL peňaženky",disclaimer_dialog_title:"Dôležité!",disclaimer_dialog:"Funkcionalita prihlásenia bude vydaná v budúcej aktualizácii, zatiaľ si uistite, že ste si túto stránku pridali medzi záložky pre budúci prístup k vašej peňaženke! Táto služba je v BETA verzii a nenesieme zodpovednosť za stratu prístupu k prostriedkom.",no_transactions:"Zatiaľ žiadne transakcie",manage:"Spravovať",exchanges:"Burzy",extensions:"Rozšírenia",no_extensions:"Nemáte nainštalované žiadne rozšírenia :(",created:"Vytvorené",search_extensions:"Hľadať rozšírenia",extension_sources:"Rozšírenie zdrojov",ext_sources_hint:"Úložiská, z ktorých sa môžu stiahnuť rozšírenia.",ext_sources_label:"Zdrojová URL (použite iba oficiálny zdroj rozšírenia LNbits a zdroje, ktorým môžete dôverovať)",warning:"Upozornenie",repository:"Repozitár",confirm_continue:"Ste si istí, že chcete pokračovať?",manage_extension_details:"Inštalovať/odinštalovať rozšírenie",install:"Inštalovať",uninstall:"Odinštalovať",drop_db:"Odstrániť údaje",enable:"Povoliť",pay_to_enable:"Zaplaťte na aktiváciu",enable_extension_details:"Povoliť rozšírenie pre aktuálneho používateľa",disable:"Zakázať",delete:"Odstrániť",installed:"Nainštalované",activated:"Aktivované",deactivated:"Deaktivované",release_notes:"Poznámky k vydaniu",activate_extension_details:"Sprístupniť/neprístupniť rozšírenie pre používateľov",featured:"Odporúčané",all:"Všetky",only_admins_can_install:"(Iba administrátorské účty môžu inštalovať rozšírenia)",admin_only:"Iba pre administrátorov",new_version:"Nová verzia",extension_depends_on:"Závisí na:",extension_rating_soon:"Hodnotenia budú čoskoro dostupné",extension_installed_version:"Nainštalovaná verzia",extension_uninstall_warning:"Chystáte sa odstrániť rozšírenie pre všetkých používateľov.",uninstall_confirm:"Áno, Odinštalovať",extension_db_drop_info:"Všetky údaje pre rozšírenie budú trvalo vymazané. Túto operáciu nie je možné vrátiť!",extension_db_drop_warning:"Chystáte sa odstrániť všetky údaje pre rozšírenie. Pre pokračovanie prosím napíšte názov rozšírenia:",extension_required_lnbits_version:"Toto vydanie vyžaduje aspoň verziu LNbits",min_version:"Minimum (vrátane)",max_version:"Maximálne (vylúčené)",payment_hash:"Hash platby",fee:"Poplatok",amount:"Suma",amount_sats:"Suma (sats)",tag:"Tag",unit:"Jednotka",description:"Popis",expiry:"Expirácia",webhook:"Webhook",payment_proof:"Dôkaz platby",update:"Aktualizovať",update_available:"Dostupná aktualizácia {version}!",latest_update:"Máte najnovšiu verziu {version}.",notifications:"Notifikácie",no_notifications:"Žiadne notifikácie",notifications_disabled:"Notifikácie stavu LNbits sú zakázané.",enable_notifications:"Povoliť Notifikácie",enable_notifications_desc:"Ak povolené, budú sa načítavať najnovšie aktualizácie stavu LNbits, ako sú bezpečnostné incidenty a aktualizácie.",enable_watchdog:"Povoliť Watchdog",enable_watchdog_desc:"Ak povolené, vaš zdroj financovania sa automaticky zmení na VoidWallet, ak je váš zostatok nižší ako zostatok LNbits. Po aktualizácii bude treba povoliť manuálne.",watchdog_interval:"Interval Watchdog",watchdog_interval_desc:"Ako často by malo pozadie kontrolovať signál killswitch v watchdog delta [node_balance - lnbits_balance] (v minútach).",watchdog_delta:"Delta Watchdog",watchdog_delta_desc:"Limit pred zmenou zdroja financovania na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stav",notification_source:"Zdroj notifikácií",notification_source_label:"URL zdroja (používajte len oficiálny LNbits zdroj stavu a zdroje, ktorým môžete dôverovať)",more:"viac",less:"menej",releases:"Vydania",watchdog:"Watchdog",server_logs:"Logy servera",ip_blocker:"Blokovanie IP",security:"Bezpečnosť",security_tools:"Nástroje bezpečnosti",block_access_hint:"Blokovať prístup podľa IP",allow_access_hint:"Povoliť prístup podľa IP (prebije blokované IP)",enter_ip:"Zadajte IP a stlačte enter",rate_limiter:"Obmedzovač počtu požiadaviek",wallet_limiter:"Obmedzovač peňaženky",wallet_limit_max_withdraw_per_day:"Maximálny denný výber z peňaženky v satošiach (0 pre zrušenie)",wallet_max_ballance:"Maximálny zostatok v peňaženke v satošiach (0 pre deaktiváciu)",wallet_limit_secs_between_trans:"Minimálny počet sekúnd medzi transakciami na peňaženku (0 na deaktiváciu)",number_of_requests:"Počet požiadaviek",time_unit:"Časová jednotka",minute:"minúta",second:"sekunda",hour:"hodina",disable_server_log:"Zakázať Log servera",enable_server_log:"Povoliť Log servera",coming_soon:"Funkcia bude čoskoro dostupná",session_has_expired:"Vaša relácia vypršala. Prosím, prihláste sa znova.",instant_access_question:"Chcete okamžitý prístup?",login_with_user_id:"Prihlásiť sa s používateľským ID",or:"alebo",create_new_wallet:"Vytvoriť novú peňaženku",login_to_account:"Prihláste sa do vášho účtu",create_account:"Vytvoriť účet",account_settings:"Nastavenia účtu",signin_with_nostr:"Pokračovať s Nostr",signin_with_google:"Prihlásiť sa pomocou Google",signin_with_github:"Prihlásiť sa pomocou GitHub",signin_with_keycloak:"Prihlásiť sa pomocou Keycloak",username_or_email:"Používateľské meno alebo email",password:"Heslo",password_config:"Konfigurácia hesla",password_repeat:"Opakovanie hesla",change_password:"Zmeniť heslo",update_credentials:"Aktualizovať poverenia",update_pubkey:"Aktualizovať verejný kľúč",set_password:"Nastaviť heslo",invalid_password:"Heslo musí mať aspoň 8 znakov",login:"Prihlásenie",register:"Registrovať",username:"Používateľské meno",pubkey:"Verejný kľúč",user_id:"ID používateľa",email:"Email",first_name:"Meno",last_name:"Priezvisko",picture:"Obrázok",verify_email:"Overiť e-mail s",account:"Účet",update_account:"Aktualizovať účet",invalid_username:"Neplatné užívateľské meno",auth_provider:"Poskytovateľ autentifikácie",my_account:"Môj účet",back:"Späť",logout:"Odhlásiť sa",look_and_feel:"Vzhľad a dojem",toggle_gradient:"Prepnúť prechodový režim",gradient_background:"Gradientné pozadie",language:"Jazyk",color_scheme:"Farebná schéma",admin_settings:"Nastavenia správcu",extension_cost:"Táto verzia vyžaduje minimálnu platbu {cost} satoshi.",extension_paid_sats:"Už ste zaplatili {paid_sats} sats.",release_details_error:"Nepodarilo sa získať podrobnosti o vydaní.",pay_from_wallet:"Zaplatiť z peňaženky",wallet_required:"Peňaženka *",show_qr:"Zobraziť QR",retry_install:"Skúste inštaláciu znova",new_payment:"Vytvoriť novú platbu",update_payment:"Aktualizovať platbu",already_paid_question:"Už ste zaplatili?",sell:"Predať",sell_require:"Požiadajte o platbu na povolenie rozšírenia",sell_info:"Rozšírenie {name} vyžaduje platbu minimálne {amount} sats na aktiváciu.",hide_empty_wallets:"Skryť prázdne peňaženky",recheck:"Prekontrolovať znova",contributors:"Prispievatelia",license:"Licencia",reset_key:"Resetovať kľúč",reset_password:"Obnoviť heslo",border_choices:"Výber obrysov",select_all:"Vybrať všetko",nfc_supported:"Podpora NFC",nfc_not_supported:"NFC nie je podporované",expire_date:"Dátum exspirácie:",hash:"Hash:",welcome_lnbits:"Vitajte v LNbits",setup_su_account:"Nastavte účet Superuser nižšie.",create_ticker_converter:"Vytvoriť prevodník mienových tickerov",enable_audit:"Povoliť audit",recommended:"Odporúčané",audit_desc:"Zaznamenávajte HTTP požiadavky podľa špecifikovaných filtrov.",audit_record_req:"Zaznamenať telo žiadosti",audit_record_warning:"Upozornenie:",audit_record_req_warning_1:"dôverné údaje (ako napríklad heslá) budú zaznamenané.",audit_record_req_warning_2:"telo žiadosti môže mať veľkú veľkosť.",audit_record_use:"Používajte to s opatrnosťou.",audit_ip:"Zaznamenať IP adresu",audit_ip_desc:"Zaznamenajte IP adresu klienta",audit_path_params:"Zaznamenať hodnoty cesty",audit_query_params:"Zaznamenať parametre dopytu",audit_http_methods:"Zahrnúť metódy HTTP",audit_http_methods_hint:"Zoznam zahrnutých metód HTTP. Prázdne zoznamy znamenajú všetky.",audit_http_methods_label:"HTTP metódy",audit_resp_codes:"Zahrnúť kódy odpovede HTTP",audit_resp_codes_hint:"Zoznam kódov HTTP, ktoré sa majú zahrnúť (zhoda s regexom). Prázdny zoznam znamená všetky. Napr: 4.*, 5.*",audit_resp_codes_label:"Kód odpovede HTTP (regex)",audit_paths:"Cesty zahrnúť",audit_paths_hint:"Zoznam ciest, ktoré sa majú zahrnúť (zhoda s regexom). Prázdny zoznam znamená všetky.",audit_paths_label:"HTTP cesta (regex)",audit_paths_exclude:"Vylúčiť cesty",audit_paths_exclude_hint:"Zoznam ciest, ktoré majú byť vylúčené (zhoda s regexom). Prázdny zoznam znamená žiadne.",audit_paths_exclude_label:"Cesta HTTP (regex)",exchange_providers:"Poskytovatelia výmeny",admin_extensions:"Rozšírenia administrátora",admin_extensions_label:"Rozšírenia správcu",admin_extensions_hint:"Rozšírenia môže používať iba používateľ s administrátorskými právami.",user_default_extensions:"Predvolené rozšírenia používateľa",user_default_extensions_label:"Používateľské rozšírenia",user_default_extensions_hint:"Rozšírenia, ktoré budú predvolene povolené pre používateľov.",miscellanous:"Rôzne",misc_disable_extensions:"Zakázať rozšírenia",misc_disable_extensions_label:"Zakázať všetky rozšírenia",misc_hide_api:"Skryť API",misc_hide_api_label:"Skryje API peňaženky, rozšírenia sa môžu rozhodnúť dodržiavať",wallets_management:"Správa peňaženiek",funding_source_info:"Informácie o zdroji financovania",funding_source:"Zdroj financovania: {wallet_class}",node_balance:"Stav uzla: {balance} sats",lnbits_balance:"Zostatok LNbits: {balance} sats",funding_reserve_percent:"Rezervovať percento: {percent} %",node_management:"Správa uzlov",node_management_not_supported:"Správa uzlov nie je podporovaná aktívnym zdrojom financovania",toggle_node_ui:"Používateľské rozhranie uzla",toggle_public_node_ui:"Verejné používateľské rozhranie uzla",toggle_transactions_node_ui:"Karta transakcií (Zakázať na veľkých CLN uzloch)",invoice_expiry:"Platnosť faktúry",invoice_expiry_label:"Doba platnosti faktúry (sekundy)",fee_reserve:"Rezerva poplatkov",fee_reserve_msats:"Rezervačný poplatok v msats",fee_reserve_percent:"Rezervačný poplatok v percentách",server_management:"Správa servera",base_url:"Základná URL adresa",base_url_label:"Statická/Základná URL adresa pre server",authentication:"Autentifikácia",auth_token_expiry_label:"Minúty do vypršania tokenu",auth_token_expiry_hint:"Čas v minútach do vypršania platnosti tokenu",auth_allowed_methods_label:"Povolené metódy autorizácie",auth_allowed_methods_hint:"Vyberte metódy autorizácie",auth_nostr_label:"Adresa URL žiadosti Nostr",auth_nostr_hint:"Absolútna URL adresa, ktorú klienti použijú na prihlásenie.",auth_google_ci_label:"ID klienta Google",auth_google_ci_hint:"Uistite sa, že autorizované presmerovacie URI obsahujú https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"Identifikátor klienta GitHub",auth_gh_client_id_hint:"Uistite sa, že URL adresa pre spätné volanie autorizácie je nastavená na https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Client Secret",auth_keycloak_label:"URL zistenia Keycloak",auth_keycloak_ci_label:"ID klienta Keycloak",auth_keycloak_ci_hint:"Uistite sa, že URL spätného volania autorizácie je nastavená na https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Tajný kľúč klienta Keycloak",auth_keycloak_custom_org_label:"Vlastná organizácia Keycloak",auth_keycloak_custom_icon_label:"Vlastná ikona Keycloak (URL)",auth_oidc_label:"URL zistenia OIDC",auth_oidc_ci_label:"ID klienta OIDC",auth_oidc_ci_hint:"Uistite sa, že URL spätného volania autorizácie je nastavená na https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Tajný kľúč klienta OIDC",auth_oidc_custom_org_label:"Názov vlastnej organizácie OIDC (napr. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Vlastná ikona OIDC (URL)",currency_settings:"Nastavenia meny",allowed_currencies:"Povolené meny",allowed_currencies_hint:"Obmedzte počet dostupných fiat mien",default_account_currency:"Predvolená mena účtu",default_account_currency_hint:"Predvolená mena pre účtovníctvo",service_fee_label:"Poplatok za službu (%)",service_fee_hint:"Poplatok účtovaný za transakciu (%)",service_fee_max_label:"Poplatok za službu max (sats)",service_fee_max_hint:"Maximálny servisný poplatok na účtovanie v (sats)",fee_wallet:"Peňaženka s poplatkami",fee_wallet_label:"Peňaženka poplatkov (ID peňaženky)",fee_wallet_hint:"ID peňaženky, do ktorej sa majú odoslať prostriedky",disable_fee:"Zakázať poplatok",disable_fee_internal:"Zakázať poplatok za službu pre interné platby",disable_fee_internal_desc:"Zakázať poplatok za službu pre interné platby Lightning",ui_management:"Správa používateľského rozhrania",ui_site_title:"Názov stránky",ui_site_tagline:"Slogan webovej stránky",ui_elements_enable:"Povoliť prvky na domovskej stránke",ui_elements_disable:"Zakázať prvky na domovskej stránke",ui_toggle_elements_tip:"Odstrániť prvky úvodnej stránky, ako napríklad 'používa' atď.",ui_site_description:"Popis lokality",ui_site_description_hint:"Použite obyčajný text, Markdown alebo surové HTML.",ui_default_wallet_name:"Predvolený názov peňaženky",lnbits_wallet:"LNbits peňaženka",denomination:"Nominálna hodnota",denomination_hint:"Názov pre token FakeWallet",ui_qr_code_logo:"Logo QR kódu",ui_qr_code_logo_hint:"URL k obrázku loga v QR kóde",ui_custom_badge:"Vlastná odznak",ui_custom_badge_label:"Vlastný odznak 'POUŽÍVAŤ S OPATRNOSŤOU - LNbits peňaženka je stále v BETA verzii'",ui_custom_badge_color_label:"Vlastná farba odznaku",themes:"Motívy",themes_hint:"Vyberte témy dostupné pre používateľov",custom_logo:"Vlastné logo",custom_logo_hint:"URL k obrázku loga",ad_space_title:"Názov reklamného priestoru",ad_space_title_label:"Podporované spoločnosťou",ad_slots:"Reklamné sloty",ad_slots_hint:"Pridajte URL adresu a cesty k obrazovým súborom vo formáte CSV, rozšírenia sa môžu rozhodnúť dodržať",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Reklamy povolené",ads_disabled:"Reklamy deaktivované",user_management:"Správa používateľov",admin_users:"Administrátorskí používatelia",admin_users_hint:"Používatelia s administrátorskými oprávneniami",admin_users_label:"ID používateľa",allowed_users:"Povolení používatelia",allowed_users_hint:"Iba títo používatelia môžu používať LNbits.",allowed_users_label:"ID používateľa",allow_creation_user:"Povoliť vytváranie nových používateľov",allow_creation_user_desc:"Povoliť vytváranie nových používateľov na indexovej stránke",components:"Súčasti",long_running_endpoints:"Top 5 dlho bežiacich koncových bodov",http_request_methods:"Metódy HTTP žiadostí",http_response_codes:"Kódy odpovedí HTTP",request_details:"Podrobnosti žiadosti",http_request_details:"Podrobnosti požiadavky HTTP",block_explorer:"Prehliadač blokov",enable_block_explorer:"Povoliť prehliadač blokov",block_explorer_desc:"Umožňuje používateľom prehliadať bitcoinové transakcie a adresy cez Electrum.",blockexplorer_public_api:"Verejný prístup k API",blockexplorer_public_api_desc:"Povoliť neoverený prístup k API koncovým bodom prieskumníka blokov.",electrum_server_url:"URL Electrum servera",electrum_server_url_hint:"napr. ssl://electrum.blockstream.info:50002 alebo tcp://localhost:50001",blockexplorer_search_label:"Hľadať podľa TXID alebo adresy",blockexplorer_search_hint:"64-znakový hex = transakcia · čokoľvek iné = bitcoinová adresa",recent_blocks:"Nedávne bloky",chain_tip:"Vrchol reťaze",block_height:"Výška bloku",block_fee:"poplatok bloku",fee_estimates:"Odhady poplatkov",confirmed_balance:"Potvrdený zostatok",unconfirmed_balance:"Nepotvrdený zostatok",transaction_history:"História transakcií",coinbase:"Coinbase",inputs:"Vstupy",outputs:"Výstupy",confirmations:"Potvrdenia",confirmed:"Potvrdené",unconfirmed:"Nepotvrdené",history_unavailable:"História transakcií nedostupná (adresa má príliš veľa transakcií)",address:"Adresa",block_number:"Blok #{height}",block_diff:"obth. {value}",block_hash:"Hash",previous_block:"Predchádzajúci blok",merkle_root:"Merkle koreň",version:"Verzia",bits:"Bity",difficulty:"Obťažnosť",nonce:"Nonce",txid:"TXID",vsize:"Virtuálna veľkosť",weight:"Váha",n_block_fee:"poplatok {n} blokov"},window.localisation.kr={confirm:"확인",server:"서버",theme:"테마",site_customisation:"사이트 사용자 정의",funding:"자금",users:"사용자",audit:"감사",apps:"앱",channels:"채널",transactions:"거래 내역",dashboard:"현황판",node:"노드",export_users:"사용자 내보내기",no_users:"사용자가 없습니다",total_capacity:"총 용량",avg_channel_size:"평균 채널 용량",biggest_channel_size:"가장 큰 채널 용량",smallest_channel_size:"가장 작은 채널 용량",number_of_channels:"채널 수",active_channels:"활성화된 채널",connect_peer:"피어 연결하기",connect:"연결하기",open_channel:"채널 개설하기",open:"개설",close_channel:"채널 폐쇄하기",close:"폐쇄",restart:"서버 재시작",save:"저장",save_tooltip:"변경 사항 저장",credit_debit:"크레딧 / 직불카드",credit_hint:"계정에 자금을 넣으려면 Enter를 눌러주세요",credit_label:"{denomination} 단위로 충전하기",credit_ok:"가상 자금({amount} sats) 입출금 성공. 지불은 자금 출처의 실제 자금에 따라 달라집니다.",restart_tooltip:"변경 사항을 적용하려면 서버를 재시작해야 합니다.",add_funds_tooltip:"지갑에 자금을 추가합니다.",reset_defaults:"기본 설정으로 돌아가기",reset_defaults_tooltip:"설정했던 내용들을 모두 지우고, 기본 설정으로 돌아갑니다.",download_backup:"데이터베이스 백업 다운로드",name_your_wallet:"사용할 {name}지갑의 이름을 정하세요",paste_invoice_label:"인보이스, 결제 요청, 혹은 lnurl 코드를 붙여넣으세요 *",lnbits_description:"설정이 쉽고 가벼운 LNbits는 어떤 라이트닝 네트워크의 예산 자원 위에서든 돌아갈 수 있습니다, 그리고 다른 LNbits 지갑들입니다. 스스로 사용하기 위해, 또는 다른 사람들에게 수탁형 솔루션을 제공하기 위해 LNbits를 운영할 수 있습니다. 각 지갑들은 자신만의 API key를 가지며, 생성 가능한 지갑의 수에는 제한이 없습니다. 자금을 분할할 수 있는 기능으로 인해, LNbits는 자금 운영 도구로써뿐만 아니라 개발 도구로써도 유용합니다. 확장 기능들은 LNbits에 여러분들이 라이트닝 네트워크의 다양한 최신 기술들을 수행해볼 수 있게 하는 추가 기능을 제공합니다. LNbits 개발진들은 확장 기능들의 개발 또한 가능한 쉽게 만들었으며, 무료 오픈 소스 프로젝트답게 사람들이 자신만의 확장 기능들을 개발하고 제출하기를 응원합니다.",export_to_phone:"QR 코드를 이용해 모바일 기기로 내보내기",export_to_phone_desc:"이 QR 코드는 선택된 지갑의 최대 접근 권한을 가진 전체 URL을 담고 있습니다. 스캔 후, 모바일 기기에서 지갑을 열 수 있습니다.",wallet:"지갑:",wallets:"지갑",add_wallet:"새로운 지갑을 추가합니다",delete_wallet:"지갑을 삭제합니다",delete_wallet_desc:"이 지갑은 삭제될 것이며, 삭제 시 지갑 내 자금은 복구가 불가능합니다.",rename_wallet:"지갑 이름 변경",update_name:"이름 변경하기",fiat_tracking:"법정통화 가격 표시",currency:"통화",update_currency:"통화 수정하기",press_to_claim:"비트코인을 수령하려면 눌러주세요",donate:"기부",view_github:"GitHub 페이지 보기",voidwallet_active:"VoidWallet이 활성화되었습니다! 결제가 불가능합니다.",use_with_caution:"주의하세요 - {name} 지갑은 아직 BETA 단계입니다.",service_fee:"서비스 수수료: 거래액의 {amount} %",service_fee_max:"서비스 수수료: 거래액의 {amount} % (최대 {max} sats)",service_fee_tooltip:"지불 결제 시마다 LNbits 서버 관리자에게 납부되는 서비스 수수료",toggle_darkmode:"다크 모드 전환",payment_reactions:"결제 반응",view_swagger_docs:"LNbits Swagger API 문서를 봅니다",api_docs:"API 문서",api_keys_api_docs:"노드 URL, API 키와 API 문서",api_keys_warning:"이 키는 안전하게 보관해야 하며, 공유하면 자금을 잃을 위험이 있습니다.",admin_key_warning:"관리자 키는 결제 전송을 포함하여 지갑에 대한 모든 권한을 부여합니다. 수신자를 완전히 신뢰하는 경우가 아니라면 절대 공유하지 마세요.",lnbits_version:"LNbits 버전",runs_on:"Runs on",paste:"붙여넣기",paste_from_clipboard:"클립보드에서 붙여넣기",paste_request:"지불 요청 붙여넣기",create_invoice:"인보이스 생성하기",camera_tooltip:"카메라를 이용해서 인보이스/QR을 스캔하세요",export_csv:"CSV 형태로 내보내기",chart_tooltip:"그래프로 보여주기",pending:"대기 중",copy_invoice:"인보이스 복사하기",withdraw_from:"출금",cancel:"취소",scan:"스캔",read:"분석하기",pay:"지불하기",memo:"Memo",date:"일시",payment_processing:"결제 처리 중...",not_enough_funds:"자금이 부족합니다!",search_by_tag_memo_amount:"태그, memo, 수량으로 검색하기",invoice_waiting:"결제를 기다리는 인보이스",payment_received:"받은 결제액",payment_sent:"보낸 결제액",receive:"받기",send:"보내기",outgoing_payment_pending:"지불 대기 중",drain_funds:"자금 비우기",drain_funds_desc:"이는 선택된 지갑으로부터 모든 자금을 인출하는 LNURL-withdraw QR 코드입니다. 그 누구와도 공유하지 마세요. balanceCheck 및 balanceNotify 기능과 호환되며, 당신의 지갑은 첫 출금 이후로도 계속 자금을 끌어당기고 있을 수 있습니다.",i_understand:"이해하였습니다",copy_wallet_url:"지갑 URL 복사하기",disclaimer_dialog_title:"중요!",disclaimer_dialog:"로그인 기능은 향후 업데이트를 통해 지원될 계획이지만, 현재로써는 이 페이지에 향후 다시 접속하기 위해 북마크 설정하는 것을 잊지 마세요! 이 서비스는 아직 BETA 과정에 있고, LNbits 개발자들은 자금 손실에 대해 전혀 책임을 지지 않습니다.",no_transactions:"아직 아무런 거래도 이루어지지 않았습니다",manage:"관리",exchanges:"거래소",extensions:"확장 기능",no_extensions:"아직 설치된 확장 기능들이 없네요 :(",created:"생성됨",search_extensions:"확장 기능 검색하기",extension_sources:"확장 소스",ext_sources_hint:"확장 프로그램을 다운로드할 수 있는 저장소",ext_sources_label:"출처 URL (공식 LNbits 확장 소스만 사용하고, 신뢰할 수 있는 출처를 사용하세요)",warning:"주의",repository:"저장소",confirm_continue:"정말로 계속할까요?",manage_extension_details:"확장 기능 설치/삭제하기",install:"설치",uninstall:"삭제",drop_db:"데이터 삭제",enable:"활성화",pay_to_enable:"지불하여 활성화",enable_extension_details:"현재 사용자 계정에 해당 확장 기능을 활성화합니다",disable:"비활성화",delete:"삭제",installed:"설치됨",activated:"작동됨",deactivated:"작동 중지",release_notes:"배포 노트",activate_extension_details:"사용자들의 확장 기능 사용 가능 여부를 결정합니다",featured:"추천",all:"전체",only_admins_can_install:"(관리자 계정만이 확장 기능을 설치할 수 있습니다)",admin_only:"관리자 전용",new_version:"새로운 버전",extension_depends_on:"의존성 존재:",extension_rating_soon:"평점 기능도 곧 구현됩니다",extension_installed_version:"설치된 버전",extension_uninstall_warning:"모든 사용자들로부터 이 확장 기능을 제거한다는 점에 유의하세요.",uninstall_confirm:"네, 삭제합니다",extension_db_drop_info:"해당 확장 기능의 모든 데이터가 영구적으로 삭제됩니다. 작업 수행 후에는 되돌릴 수 없습니다!",extension_db_drop_warning:"해당 확장 기능의 모든 데이터가 영구적으로 삭제될 겁니다. 계속하려면 확장 기능의 이름을 입력해주세요:",extension_required_lnbits_version:"이 배포 버전은 더 높은 버전의 lnbits가 설치되어 있어야 합니다.",min_version:"최소값 (포함됨)",max_version:"최대값 (제외됨)",payment_hash:"결제 해쉬값",fee:"수수료",amount:"액수",amount_sats:"금액 (사토시)",tag:"태그",unit:"단위",description:"상세",expiry:"만료",webhook:"Webhook",payment_proof:"Payment 증거",update:"업데이트",update_available:"{version}으로 업데이트가 가능합니다.",latest_update:"이미 {version} 버전으로 업데이트되었습니다.",notifications:"알림",no_notifications:"알림 없음",notifications_disabled:"LNbits 상태 알림이 비활성화되었습니다.",enable_notifications:"알림 활성화",enable_notifications_desc:"활성화 시, 가장 최신의 보안 사고나 소프트웨어 업데이트 등의 LNbits 상황 업데이트를 불러옵니다.",enable_watchdog:"와치독 활성화",enable_watchdog_desc:"활성화 시, LNbits 잔금보다 당신의 잔금이 지정한 수준보다 더 낮아질 경우 자동으로 자금의 원천을 VoidWallet으로 변경합니다. 업데이트 이후 수동으로 활성화해 주어야 합니다.",watchdog_interval:"와치독 시간 간격",watchdog_interval_desc:"와치독 델타 값을 기반으로 하여 당신의 LNbits 서버에서 나오는 비상 정지 신호를 백그라운드 작업으로 얼마나 자주 확인할 것인지를 결정합니다. (분 단위)",watchdog_delta:"와치독 델타",watchdog_delta_desc:"당신의 자금 원천을 VoidWallet으로 변경하기까지의 기준 값 [LNbits 잔액 - 노드 잔액 > 델타 값]",status:"상황",notification_source:"알림 메세지 출처",notification_source_label:"알림 메세지를 가져올 URL (공식 LNbits 상황판 출처나, 당신이 신뢰할 수 있는 출처만을 사용하세요)",more:"더 알아보기",less:"적게",releases:"배포 버전들",watchdog:"와치독",server_logs:"서버 로그",ip_blocker:"IP 기반 차단기",security:"보안",security_tools:"보안 도구들",block_access_hint:"IP 기준으로 접속 차단하기",allow_access_hint:"IP 기준으로 접속 허용하기 (차단한 IP들을 무시합니다)",enter_ip:"IP 주소를 입력하고 Enter를 눌러주세요",rate_limiter:"횟수로 제한하기",wallet_limiter:"지갑 제한기",wallet_limit_max_withdraw_per_day:"일일 최대 지갑 출금액(sats) (0은 비활성화)",wallet_max_ballance:"지갑 최대 잔액(sats) (0은 비활성화)",wallet_limit_secs_between_trans:"지갑 당 거래 사이 최소 초 (0은 비활성화)",number_of_requests:"요청 횟수",time_unit:"시간 단위",minute:"분",second:"초",hour:"시간",disable_server_log:"서버 로깅 중단하기",enable_server_log:"서버 로깅 활성화하기",coming_soon:"곧 구현될 기능들입니다",session_has_expired:"세션 유효 기간이 만료되었습니다. 다시 로그인해 주세요.",instant_access_question:"즉시 액세스하시겠습니까?",login_with_user_id:"사용자 ID로 로그인",or:"또는",create_new_wallet:"새 지갑 만들기",login_to_account:"계정에 로그인하세요.",create_account:"계정 생성",account_settings:"계정 설정",signin_with_nostr:"Nostr로 계속하기",signin_with_google:"Google으로 로그인",signin_with_github:"GitHub으로 로그인",signin_with_keycloak:"Keycloak으로 로그인",username_or_email:"사용자 이름 또는 이메일",password:"비밀번호",password_config:"비밀번호 설정",password_repeat:"비밀번호 재입력",change_password:"비밀번호 변경",update_credentials:"자격 증명 업데이트",update_pubkey:"공개 키 업데이트",set_password:"비밀번호 설정",invalid_password:"비밀번호는 최소 8자 이상이어야 합니다",login:"로그인",register:"등록",username:"사용자 이름",pubkey:"공개 키",user_id:"사용자 ID",email:"이메일",first_name:"성명",last_name:"성",picture:"사진",verify_email:"이메일을 인증하려면",account:"계정",update_account:"계정 업데이트",invalid_username:"잘못된 사용자 이름",auth_provider:"인증 제공자",my_account:"내 계정",back:"뒤로",logout:"로그아웃",look_and_feel:"외관과 느낌",toggle_gradient:"그라디언트 전환",gradient_background:"그라디언트 배경",language:"언어",color_scheme:"색상 구성",admin_settings:"관리자 설정",extension_cost:"이 버전은 최소 {cost} sats의 지불이 필요합니다.",extension_paid_sats:"당신은 이미 {paid_sats} sats를 지불했습니다.",release_details_error:"릴리스 세부 정보를 가져올 수 없습니다.",pay_from_wallet:"지갑에서 결제하다",wallet_required:"지갑 *",show_qr:"QR 보기",retry_install:"다시 설치하세요",new_payment:"새로운 결제하기",update_payment:"결제 업데이트",already_paid_question:"이미 지불하셨나요?",sell:"판매",sell_require:"확장을 활성화하려면 결제를 요청하십시오.",sell_info:"{name} 확장 기능을 활성화하려면 최소 {amount} 사토시의 결제가 필요합니다.",hide_empty_wallets:"빈 지갑 숨기기",recheck:"재확인",contributors:"기여자",license:"라이선스",reset_key:"재설정 키",reset_password:"비밀번호 재설정",border_choices:"테두리 선택사항",select_all:"모두 선택",nfc_supported:"NFC 지원됨",nfc_not_supported:"NFC 지원되지 않음",expire_date:"만료 날짜:",hash:"해시:",welcome_lnbits:"LNbits에 오신 것을 환영합니다.",setup_su_account:"슈퍼유저 계정을 아래에 설정하십시오.",create_ticker_converter:"통화 티커 변환기 생성",enable_audit:"감사 활성화",recommended:"추천됨",audit_desc:"지정된 필터에 따라 HTTP 요청 기록",audit_record_req:"레코드 요청 본문",audit_record_warning:"경고:",audit_record_req_warning_1:"암호와 같은 기밀 데이터가 기록됩니다.",audit_record_req_warning_2:"요청 본문은 큰 크기를 가질 수 있습니다.",audit_record_use:"주의해서 사용하십시오.",audit_ip:"IP 주소 기록",audit_ip_desc:"클라이언트의 IP 주소를 기록하십시오.",audit_path_params:"경로 매개변수 기록",audit_query_params:"쿼리 매개변수 기록",audit_http_methods:"HTTP 메서드 포함",audit_http_methods_hint:"포함할 HTTP 메서드 목록. 목록이 비어 있으면 모두 포함됩니다.",audit_http_methods_label:"HTTP 방법",audit_resp_codes:"HTTP 응답 코드 포함",audit_resp_codes_hint:"포함할 HTTP 코드 목록(정규 표현식 일치). 빈 목록은 모두를 의미합니다. 예: 4.*, 5.*",audit_resp_codes_label:"HTTP 응답 코드 (정규식)",audit_paths:"포함 경로",audit_paths_hint:"포함할 경로 목록 (정규 표현식 일치). 빈 목록은 모두를 의미합니다.",audit_paths_label:"HTTP 경로 (정규식)",audit_paths_exclude:"제외 경로",audit_paths_exclude_hint:"제외할 경로 목록 (정규 표현식 일치). 빈 목록은 없음을 의미합니다.",audit_paths_exclude_label:"HTTP 경로 (정규식)",exchange_providers:"거래소 공급자",admin_extensions:"관리자 확장 프로그램",admin_extensions_label:"관리자 확장 기능",admin_extensions_hint:"확장 기능은 관리자 권한이 있는 사용자만 사용할 수 있습니다.",user_default_extensions:"사용자 기본 확장자",user_default_extensions_label:"사용자 확장 기능",user_default_extensions_hint:"사용자에게 기본적으로 활성화될 확장 기능.",miscellanous:"기타",misc_disable_extensions:"확장 프로그램 사용 안 함",misc_disable_extensions_label:"모든 확장 프로그램 비활성화",misc_hide_api:"API 숨기기",misc_hide_api_label:"지갑 API 숨기기, 확장 기능은 준수할 수 있음",wallets_management:"지갑 관리",funding_source_info:"자금 출처 정보",funding_source:"자금 출처: {wallet_class}",node_balance:"노드 잔액: {balance} 사토시",lnbits_balance:"LNbits 잔액: {balance} sats",funding_reserve_percent:"예약 비율: {percent} %",node_management:"노드 관리",node_management_not_supported:"활성화된 자금 출처에 의해 노드 관리는 지원되지 않습니다.",toggle_node_ui:"노드 UI",toggle_public_node_ui:"공개 노드 UI",toggle_transactions_node_ui:"트랜잭션 탭 (대형 CLN 노드에서는 비활성화)",invoice_expiry:"송장 만료",invoice_expiry_label:"송장 만료 (초)",fee_reserve:"수수료 예약",fee_reserve_msats:"msats의 예약 수수료",fee_reserve_percent:"예약 수수료(%)",server_management:"서버 관리",base_url:"기본 URL",base_url_label:"서버의 정적/기본 URL",authentication:"인증",auth_token_expiry_label:"토큰 만료 시간(분)",auth_token_expiry_hint:"토큰이 만료되기까지 남은 시간(분)",auth_allowed_methods_label:"허용된 인증 방법",auth_allowed_methods_hint:"인증 방법 선택",auth_nostr_label:"Nostr 요청 URL",auth_nostr_hint:"클라이언트가 로그인하는 데 사용할 절대 URL.",auth_google_ci_label:"Google 클라이언트 ID",auth_google_ci_hint:"허가된 리디렉션 URI에 https://{domain}/api/v1/auth/google/token이 포함되어 있는지 확인하세요.",auth_google_cs_label:"Google 클라이언트 시크릿",auth_gh_client_id_label:"GitHub 클라이언트 ID",auth_gh_client_id_hint:"인가 콜백 URL이 https://{domain}/api/v1/auth/github/token으로 설정되어 있는지 확인하십시오.",auth_gh_client_secret_label:"GitHub 클라이언트 비밀키",auth_keycloak_label:"Keycloak 디스커버리 URL",auth_keycloak_ci_label:"키클록 클라이언트 ID",auth_keycloak_ci_hint:"승인 콜백 URL이 https://{domain}/api/v1/auth/keycloak/token으로 설정되어 있는지 확인하십시오.",auth_keycloak_cs_label:"Keycloak 클라이언트 시크릿",auth_keycloak_custom_org_label:"Keycloak 사용자 정의 조직",auth_keycloak_custom_icon_label:"Keycloak 사용자 정의 아이콘 (URL)",auth_oidc_label:"OIDC 디스커버리 URL",auth_oidc_ci_label:"OIDC 클라이언트 ID",auth_oidc_ci_hint:"승인 콜백 URL이 https://{domain}/api/v1/auth/oidc/token으로 설정되어 있는지 확인하십시오.",auth_oidc_cs_label:"OIDC 클라이언트 시크릿",auth_oidc_custom_org_label:"OIDC 사용자 정의 조직 이름 (예: Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC 사용자 정의 아이콘 (URL)",currency_settings:"통화 설정",allowed_currencies:"허용되는 통화",allowed_currencies_hint:"사용 가능한 법정 화폐의 수를 제한하십시오.",default_account_currency:"기본 계좌 통화",default_account_currency_hint:"회계 기본 통화",service_fee_label:"서비스 수수료 (%)",service_fee_hint:"트랜잭션당 수수료 (%)",service_fee_max_label:"서비스 수수료 최대 (sats)",service_fee_max_hint:"(사토시)로 부과할 최대 서비스 요금",fee_wallet:"수수료 지갑",fee_wallet_label:"수수료 지갑 (지갑 ID)",fee_wallet_hint:"자금을 보낼 지갑 ID",disable_fee:"수수료 비활성화",disable_fee_internal:"내부 결제에 대한 서비스 요금 비활성화",disable_fee_internal_desc:"내부 라이트닝 결제에 대한 서비스 요금 비활성화",ui_management:"UI 관리",ui_site_title:"사이트 제목",ui_site_tagline:"사이트 태그라인",ui_elements_enable:"홈페이지의 요소 활성화",ui_elements_disable:"홈페이지의 요소 비활성화",ui_toggle_elements_tip:"'에 의해 구동됨' 등의 홈페이지 요소 제거",ui_site_description:"사이트 설명",ui_site_description_hint:"일반 텍스트, Markdown, 또는 원시 HTML을 사용하십시오.",ui_default_wallet_name:"기본 지갑 이름",lnbits_wallet:"LNbits 지갑",denomination:"액면가",denomination_hint:"FakeWallet 토큰의 이름",ui_qr_code_logo:"QR 코드 로고",ui_qr_code_logo_hint:"QR 코드의 로고 이미지 URL",ui_custom_badge:"맞춤 배지",ui_custom_badge_label:"사용자 지정 배지 '주의하여 사용 - LNbits 지갑은 여전히 BETA 상태입니다'",ui_custom_badge_color_label:"사용자 정의 배지 색상",themes:"테마",themes_hint:"사용자가 사용할 수 있는 테마 선택",custom_logo:"맞춤 로고",custom_logo_hint:"로고 이미지의 URL",ad_space_title:"광고 공간 제목",ad_space_title_label:"지원:",ad_slots:"광고 슬롯",ad_slots_hint:"광고 URL 및 이미지 파일 경로를 CSV 형식으로, 확장자는 준수할 수 있습니다.",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"광고 활성화됨",ads_disabled:"광고 비활성화됨",user_management:"사용자 관리",admin_users:"관리자 사용자",admin_users_hint:"관리자 권한이 있는 사용자",admin_users_label:"사용자 ID",allowed_users:"허용된 사용자",allowed_users_hint:"LNbits는 이 사용자들만 사용할 수 있습니다.",allowed_users_label:"사용자 ID",allow_creation_user:"새 사용자 생성 허용",allow_creation_user_desc:"색인 페이지에서 새 사용자 생성 허용",components:"구성 요소",long_running_endpoints:"최상위 5개의 장시간 실행 엔드포인트",http_request_methods:"HTTP 요청 메서드",http_response_codes:"HTTP 응답 코드",request_details:"요청 세부사항",http_request_details:"HTTP 요청 세부사항",block_explorer:"블록 탐색기",enable_block_explorer:"블록 탐색기 활성화",block_explorer_desc:"Electrum을 통해 비트코인 거래 및 주소를 탐색할 수 있습니다.",blockexplorer_public_api:"공개 API 접근",blockexplorer_public_api_desc:"블록 탐색기 API 엔드포인트에 대한 비인증 접근을 허용합니다.",electrum_server_url:"Electrum 서버 URL",electrum_server_url_hint:"예: ssl://electrum.blockstream.info:50002 또는 tcp://localhost:50001",blockexplorer_search_label:"TXID 또는 주소로 검색",blockexplorer_search_hint:"64자 16진수 = 거래 · 그 외 = 비트코인 주소",recent_blocks:"최근 블록",chain_tip:"체인 끝",block_height:"블록 높이",block_fee:"블록 수수료",fee_estimates:"수수료 추정",confirmed_balance:"확인된 잔액",unconfirmed_balance:"미확인 잔액",transaction_history:"거래 내역",coinbase:"Coinbase",inputs:"입력",outputs:"출력",confirmations:"확인 수",confirmed:"확인됨",unconfirmed:"미확인",history_unavailable:"거래 내역을 불러올 수 없습니다 (주소의 거래가 너무 많음)",address:"주소",block_number:"블록 #{height}",block_diff:"diff {value}",block_hash:"해시",previous_block:"이전 블록",merkle_root:"머클 루트",version:"버전",bits:"Bits",difficulty:"난이도",nonce:"Nonce",txid:"TXID",vsize:"가상 크기",weight:"무게",n_block_fee:"{n}블록 수수료"},window.localisation.fi={confirm:"Kyllä",server:"Palvelin",theme:"Teema",site_customisation:"Sivuston kustomointi",funding:"Rahoitus",users:"Käyttäjät",audit:"Seuranta",api_watch:"API-seuranta",apps:"Sovellukset",channels:"Kanavat",transactions:"Tapahtumat",dashboard:"Ohjauspaneeli",node:"Solmu",export_users:"Vie käyttäjät",no_users:"Käyttäjiä ei löytynyt",total_capacity:"Kokonaiskapasiteetti",avg_channel_size:"Keskimääräisen kanavan kapasiteetti",biggest_channel_size:"Suurimman kanavan kapasiteetti",smallest_channel_size:"Pienimmän kanavan kapasiteetti",number_of_channels:"Kanavien lukumäärä",active_channels:"Aktiivisia kanavia",connect_peer:"Yhdistä naapuriin",connect:"Yhdistä",reconnect:"Uudista yhteys",open_channel:"Avaa kanava",open:"Avaa",close_channel:"Sulje kanava",close:"Sulje",restart:"Palvelimen uudelleen käynnistys",image_library:"Kuvakirjasto",save:"Tallenna",save_tooltip:"Tallenna muutokset",credit_debit:"Hyvitä / Veloita",credit_hint:"Hyväksy painamalla Enter (negatiivisetkin arvot ovat sallittuja)",credit_label:"Hyvitä / Veloita tilille {denomination}-varoja",credit_ok:"Virtuaalivarojen ({amount} sat) hyvitys-/veloitustapahtuma onnistui. Maksukyky riippuuu rahoituslähteen todellisista varoista.",restart_tooltip:"Uudelleenkäynnistä palvelu muutosten käyttöönottamiseksi",add_funds_tooltip:"Lisää varoja lompakkoon",reset_defaults:"Palauta oletusasetukset",reset_defaults_tooltip:"Poista kaikki asetusten muutokset ja palauta järjestelmän oletusasetukset.",download_backup:"Lataa tietokannan varmuuskopio",name_your_wallet:"Nimeä lompakkosi {name}",paste_invoice_label:"Liita lasku, maksupyyntö tai LNURL-koodi*",lnbits_description:"Kevyt ja helppokäyttöinen LNbits voi käyttää rahoituslähteinään mitä vain Lightning-palveluita ja jopa LNbits-palvelua! Voit käyttää sitä itsenäisesti ja helposti tarjota erilaisia Lightning-palveluita. Pystyt luomaan sillä salamaverkkolompakoita eikä niiden määrää ole rajoitettu. Jokaiselle lompakolle saat yksilölliset API-avaimet. Varojen osittaminen tekee siitä erittäin kätevän varojen hallinnassa sekä myös ohjelmistokehityksen työkalun. Laajennukset lisäävät LNbits:in toiminnallisuuksia. Näinpä voit helposti testailla useita erilaisia ja viimeisimpiä salamaverkon teknologioita. Laajennuksien kehittämisen olemme pyrkineet tekemään mahdollisimman helpoksi pitämällä LNbits:in ilmaisena OpenSource-projektina. Kannustamme kaikkia kehittämään ja jakelemaan omia laajennuksia!",export_to_phone:"Käytä puhelimessa lukemalla QR-koodi",export_to_phone_desc:"Tämä QR-koodi sisältää URL-osoitteen, jolla saa lompakkoosi täydet valtuudet. Voit lukea sen puhelimellasi ja avata sillä lompakkosi. Voit myös lisätä lompakkosi selaimella käytettäväksi PWA-sovellukseksi puhelimen aloitusruudulle. ",access_wallet_on_mobile:"Mobiili käyttö",wallet:"Lompakko:",wallet_name:"Lompakon nimi",wallets:"Lompakot",add_wallet:"Lisää lompakko",add_new_wallet:"Lisää uusi lompakko",pin_wallet:"Kiinnitä lompakko",delete_wallet:"Poista lompakko",delete_wallet_desc:"Lompakko poistetaan pysyvästi. Siirrä lompakosta varat ennalta muualle, sillä tämä toiminto on PERUUTTAMATON!",rename_wallet:"Nimeä lompakko uudelleen",update_name:"Tallenna",fiat_tracking:"Käytettävä valuutta",fiat_providers:"Valuutan välittäjät",currency:"Valuutta",update_currency:"Tallenna",press_to_claim:"Lunasta varat painamalla tästä",claim_desc:"Näyttää että sinulla on lunastamattomia bitcoin varoja, mutta sinulla ei vielä ole lompakkoa. Lunasta varat allaolevaa nappia painamalla, ja sinulle luodaan lompakko.",donate:"Lahjoita",view_github:"Näytä GitHub:ssa",voidwallet_active:"VoidWallet on aktiivinen. Se ei tue maksutapahtumia!",use_with_caution:"KÄYTÄ VAROEN - BETA-ohjelmisto on käytössä palvelussa: {name}",service_fee_tooltip:"LNbits palvelimen ylläpitäjä veloittaa lähtevästä maksusta palvelumaksun.",toggle_darkmode:"Tumma näkymä",payment_reactions:"Maksureaktiot",view_swagger_docs:"Näytä LNbits Swagger API-dokumentit",api_docs:"API-dokumentaatio",api_keys_api_docs:"Solmun URL, API-avaimet ja -dokumentaatio",api_keys_warning:"Pidä nämä avaimet turvassa, sillä niiden jakaminen voi johtaa varojen menetykseen.",admin_key_warning:"Ylläpitäjäavaimesi antaa täyden pääsyn lompakkoosi, myös maksujen lähettämiseen. Älä koskaan jaa sitä, ellet täysin luota vastaanottajaan.",lnbits_version:"LNbits versio",runs_on:"Mukana menossa",paste:"Liitä",paste_from_clipboard:"Liitä leikepöydältä",paste_request:"Liitä pyyntö",create_invoice:"Laskuta",camera_tooltip:"Kuvaa lasku tai QR-koodi",export_csv:"Vie CSV-tiedostoon",export_csv_details:"Vie CSV-tiedostoon lisätietoineen",chart_tooltip:"Näytä kaaviokuva",pending:"Odottaa",copy_invoice:"Kopioi lasku",withdraw_from:"Nosta kohteesta",cancel:"Peruuta",scan:"Scannaa",read:"Lue",write:"Kirjoita",pay:"Maksa",memo:"Kuvaus",date:"Päiväys",path:"Path",payment_processing:"Maksua käsitellään...",not_enough_funds:"Varat eivät riitä!",search_by_tag_memo_amount:"Etsi tunnisteella, muistiolla tai määrällä",invoice_waiting:"Lasku odottaa maksua",payment_received:"Maksu vastaanotettu",payment_sent:"Maksu lähetetty",payment_failed:"Maksu epäonnistui",receive:"vastaanota",send:"lähetä",outgoing_payment_pending:"Lähtevä maksu odottaa",drain_funds:"Tyhjennä varat",drain_funds_desc:"Tämä LNURL-withdraw -tyyppinen QR-koodi on tarkoitettu kaikkien varojen imurointiin lompakosta. ÄLÄ JAA SITÄ KENELLEKÄÄN! Se on balanceCheck- ja balanceNotify-toimintojen kanssa yhteensopiva, joten sitä voi käyttää lompakon tyhjentämiseen ensimmäisen käytön jälleen jatkuvasti.",i_understand:"Vakuutan ymmärtäväni",copy_wallet_url:"Kopioi lompakon URL",disclaimer_dialog_title:"Tärkeää!",disclaimer_dialog:"Sinun *PITÄÄ TALLETTAA* kirjautumistietosi turvallisesta ja helposti saataville, jotta pääset jatkossa kirjautumaan lompakkoosi! Löydät kirjautumistiedot Tilin asetukset -sivulta. Kukaan ei ota mitään vastuuta varojen säilymisestä tai niiden käytettävyyden takaamisesta.",no_transactions:"Lompakossa ei ole yhtään tapahtumaa",manage:"Hallinnointi",exchanges:"Vaihtokurssit",extensions:"Laajennukset",no_extensions:"Laajennuksia ei ole asennettu :(",created:"Luotu",search_extensions:"Etsi laajennuksia",search_wallets:"Etsi lompakkoa",extension_sources:"Laajennuslähteet",ext_sources_hint:"Lähteet joista laajennuksia voi ladata",ext_sources_label:"Lähde-URL (käytä vain virallista LNbits tai muuta luotettaa laajennuslähdettä)",warning:"Varoitus",repository:"Laajennuksien lähde",confirm_continue:"Haluatko varmasti jatkaa?",manage_extension_details:"Asenna/Poista laajennus",install:"Asenna",uninstall:"Poista",drop_db:"Poista tiedot",enable:"Ota käyttöön",enabled:"Käytössä",pay_to_enable:"Maksa ottaaksesi käyttöön",enable_extension_details:"Ota laajennus käyttöön tälle käyttäjälle",disable:"Poista käytöstä",delete:"Poista",installed:"Asennettu",activated:"Käytössä",deactivated:"Poissa käytöstä",release_notes:"Julkaisutiedot",activate_extension_details:"Aseta/Poista laajennus käyttäjien saatavilta",featured:"Esittelyssä",all:"Kaikki",only_admins_can_install:"(Vain pääkäyttäjät voivat asentaa laajennuksia)",admin_only:"Pääkäyttäjille",new_version:"Uusi versio",extension_depends_on:"Edellyttää:",extension_rating_soon:"Arvostelut on tulossa pian",extension_installed_version:"Nykyinen versio",extension_uninstall_warning:"Olet poistamassa laajennuksen kaikilta käyttäjiltä.",uninstall_confirm:"Kyllä, poista asennus",extension_db_drop_info:"Kaikki laajennuksen tallettama tieto poistetaan pysyvästi. Poistoa ei voi jälkikäteen peruuttaa!",extension_db_drop_warning:"Olet tuhoamassa laajennuksen tallettamat tiedot. Vahvista poisto kirjoittamalla viivalle seuraavassa näkyvä laajennuksen nimi:",extension_required_lnbits_version:"Tämä laajennus vaatii vähintään LNbits-version",min_version:"Minimi (sisältyy)",max_version:"Enimmäismäärä (ei sisälly)",payment_hash:"Maksun tiiviste",fee:"Kulu",amount:"Määrä",amount_limits:"Määrien rajat",amount_sats:"Määrä (sat)",faucest_wallet:"Faucet Wallet",faucest_wallet_desc_1:"Each time a payment is confirmed by the {provider} provider funds will be subtracted from this wallet.",faucest_wallet_desc_2:"This helps monitor all {provider} payments and their status.",faucest_wallet_desc_3:"This wallet must be topped up with the amount of sats that the admin is willing to offer in exchange for the fiat currency.",faucest_wallet_desc_4:"If this wallet is configured, but is empty, the {provider} payments will not be processed.",faucest_wallet_desc_5:"This wallet can eventually get to a negative balance if parallel fiat payments are made.",faucest_wallet_id:"Faucet Wallet ID (optional)",faucest_wallet_id_hint:"Wallet ID to use for the faucet. It will be used to send the funds to the user.",tag:"Tunniste",unit:"Yksikkö",description:"Kuvaus",expiry:"Vanhenee",webhook:"Webhook",webhook_url:"Webhook URL",webhook_url_hint:"Webhook URL to send the payment details to. It will be called when the payment is completed.",webhook_events_list:"The following events must be supported by the webhook:",webhook_stripe_description:"One the stripe side you must configure a webhook with a URL that points to your LNbits server.",payment_proof:"Maksun varmenne",update:"Päivitä",update_available:"Saatavilla on päivitys {version}-versioon!",update_available:"Rahoituslähteet",latest_update:"Käytössä oleva versio {version}, on viimeisin saatavilla oleva.",notifications:"Tiedotteet",notifications_configure:"Määritä tiedotukset",notifications_nostr_config:"Nostr-määritykset",notifications_enable_nostr:"Kaytä Nostr:ia",notifications_enable_nostr_desc:"Lähetä tietodukset Nostr:in kautta",notifications_nostr_private_key:"Nostr-yksityisavain",notifications_nostr_private_key_desc:"Yksityinen avain (hex tai nsec) Nostr-viestien lähettämisen allekirjoitukseen",notifications_nostr_identifiers:"Nostr-tunnisteet",notifications_nostr_identifiers_desc:"Lista tunnisteista kenelle tiedotukset lähetetään",notifications_telegram_config:"Telegram-määritykset",notifications_enable_telegram:"Käytä Telegram:ia",notifications_enable_telegram_desc:"Lähetä tietodukset Telegram:in kautta",notifications_telegram_access_token:"Access Token",notifications_telegram_access_token_desc:"Telegram botin Access token",notifications_chat_id:"Keskustelun tunnus",notifications_chat_id_desc:"Keskustelun tunnus minne tiedotukset lähetetään",notifications_email_config:"Sähköposti määritykset",notifications_enable_email:"Käytä sähköpostia",notifications_enable_email_desc:"Lähetä tiedotteet sähköpostilla",notifications_send_test_email:"Lähetä testiposti",notifications_send_email:"Lähetä sähköpostiosoitteella",notifications_send_email_desc:"Lähettäjänä näkyvä sähköpostiosoite",notifications_send_email_username:"Käyttäjätunnus",notifications_send_email_username_desc:"Käyttäjätunnus, mikäli tyhjä, käytetään sähköpostiosoitetta",notifications_send_email_password:"Lähtevän sähköpostin salasana",notifications_send_email_password_desc:"Salasana lähettävälle sähköpostille",notifications_send_email_server_port:"Lähtevän sähköpostin SMTP-portti",notifications_send_email_server_port_desc:"SMTP-palvelimen portti",notifications_send_email_server:"Lähtevän sähköpostin SMTP-palvelin",notifications_send_email_server_desc:"SMTP-palvelin jonka kautta sähköpostit lähetetään",notifications_send_to_emails:"Sähköpostien vastaanottaja",notifications_send_to_emails_desc:"Kenelle sähköpostit lähetetään",notification_settings_update:"Asetuksia päivitetty",notification_settings_update_desc:"Tiedota kun palvelimen asetuksia on päivitetty",notification_server_start_stop:"Palvelimen Käynnystys/Sammutus",notification_server_start_stop_desc:"Tiedota kun palvelin on käynnistetty tai sammutettu",notification_watchdog_limit:"Watchdog-raja -tiedote",notification_watchdog_limit_desc:"Tiedota kun watchdog-raja on saavutettu (ei vaikuta rahoituslähteeseen)",notification_server_status:"Palvelimen tila",notification_server_status_desc:"Lähetä säännölliset tiedotteet palvelimen tilasta (anna tiedotusväli tunteina)",notification_incoming_payment:"Saapuvat maksut",notification_incoming_payment_desc:"Tiedota kun lompakon vastaanottaman ja saapuvan maksun määrä ylittää rajan (sat)",notification_outgoing_payment:"Lähtevät maksut",notification_outgoing_payment_desc:"Tiedota kun lompakon lähettävän ja maksettavan maksun määrä ylittää rajan (sat)",notification_credit_debit:"Hyvitys / Veloitus",notification_credit_debit_desc:"Tiedota kun Superuser tekee lompakon hyvitys- tai veloitustapahtumia",notification_balance_delta_changed:"Saldon määrän muutos",notification_balance_delta_changed_desc:"Tiedota kun solmun ja LNbits saldojen eri poikkeaa edes yhden satoshin. Tämä tarkastus tehdään joka minuuttu.",enable_watchdog:"Watchdog-kytkin",enable_watchdog_desc:"Tämän ollessa käytössä, ja solmun varojen laskiessa alle LNbits-varojen määrän, otetaan automaattisesti käyttöön VoidWallet. Päivityksen jälkeen tämä asetus pitää tarkastaa uudelleen.",watchdog_interval:"Watchdog-aikaväli",watchdog_interval_desc:"Tällä määritetään kuinka usein taustatoiminto tarkistaa varojen Delta-muutokset [node_balance - lnbits_balance] killswitch-signaalille. Hakujen väli ilmoitetaan minuutteina.",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Mikäli rahoituslähteen saldo laskee alle LNbits kokonaissaldon, muutetaan rahoituslähteeksi heti VoidWallet. Päivittämisen jälkeen asetus pitää päivittää manuaalisestsi.",status:"Tilanne",notification_source:"Tiedotteiden lähde",notification_source_label:"Lähde-URL (käytä ainoastaan LNbits:iä tai muuta luotettavaa lähdettä)",more:"näytä lisää",more_count:"näytä {count} lisää",less:"supista",releases:"Julkaisut",watchdog:"Watchdog",server_logs:"Palvelimen lokit",ip_blocker:"Palvelimen suojaus IP-osoitesuodattimella",security:"Turvallisuus",security_tools:"Turvallisuus työkalut",block_access_hint:"Estä pääsy IP-osoitteen perusteella",allow_access_hint:"Salli pääsy IP-osoitteen perusteella (ohittaa estot)",enter_ip:"Anna IP ja paina +",rate_limiter:"Toiston rajoitin",callback_url_rules:"Callback URL -säännöt",enter_callback_url_rule:"Anna URL-sääntö regex-muodossa ja paina enter",callback_url_rule_hint:"Callback URL:it (kuten LNURL) tarkistetaan kaikkien näiden sääntöjen mukaisesti. Jos sääntöjä ei ole määritetty, kaikki URL:it ovat sallittuja.",wallet_limiter:"Lompakon käyttörajoitin",wallet_config:"Wallet Config",wallet_charts:"Wallet Charts",wallet_limit_max_withdraw_per_day:"Päivittäin nostettavissa sat maksimi (0 poistaa käytöstä)",wallet_max_ballance:"Maksimisaldo (sat) (0 poistaa käytöstä)",wallet_limit_secs_between_trans:"Tapahtumien välinen minimi (sec) (0 poistaa käytöstä)",only_incoming_payments_allowed:"Vain saapuvat maksut sallittuna",disable_outgoing_payments:"Poista lähtevät maksut käytöstä",number_of_requests:"Pyyntöjen lukumäärä",time_unit:"aikayksikkö",minute:"minuutti",settings:"Asetukset",second:"sekunti",hour:"tunti",disable_server_log:"Piilota palvelimen loki",enable_server_log:"Näytä palvelimen loki",coming_soon:"Ominaisuus on tulossa pian",session_has_expired:"Käyttämätön sessio on vanhentunut. Kirjaudu uudelleen.",instant_access_question:"perinteinen kirjautuminen",login_with_user_id:"Kirjaudu käyttäjä-ID:llä",or:"tai",create_new_wallet:"Avaa uusi lompakko",delete_all_wallets:"Poista kaikki lompakot",confirm_delete_all_wallets:"Oletko todellakin varma, että haluat poistaa käyttäjältä KAIKKI lompakot?",login_to_account:"Kirjaudu käyttäjänimellä",create_account:"Luo tili",account_settings:"Tilin asetukset",signin_with_oauth:"Login with",signin_with_oauth_or:"or Login with",signin_with_nostr:"Kirjaudu Nostr:lla",signin_with_google:"Kirjaudu Google-tunnuksella",signin_with_github:"Kirjaudu GitHub-tunnuksella",signin_with_custom_org:"Kirjaudu {custom_org}-palvelulla",username_or_email:"Käyttäjänimi tai sähköposti",password:"Anna uusi salasana",password_config:"Salasanan määritys",password_repeat:"Toista uusi salasana",update_password:"Päivitä salasana",change_password:"Vaihda salasana",update_credentials:"Päivitä käyttöoikeustiedot",update_pubkey:"Päivitä julkinen avain",nostr_pubkey_tooltip:"Syötä tämän käyttäjän julkinen Nostr avain (hex arvona)",set_password:"Aseta salasana",set_password_tooltip:"Aseta käyttäjätunnukselle salasana",invalid_password:"Salasanassa tulee olla vähintään kahdeksan merkkiä",invalid_password_repeat:"Salasanat eivät täsmää",reset_key_generated:"Salasanan vaihtoavain on luotu.",reset_key_copy:"Kopioi vaihto-URL leikepöydälle painamalla OK.",login:"Kirjaudu",register:"Rekisteröidy",username:"Käyttäjänimi",pubkey:"Julkinen avain",user_id:"Käyttäjä tunnus",id:"tunnus",email:"Sähköposti",first_name:"Etunimi",last_name:"Sukunimi",picture:"Kuva",verify_email:"Vahvista sähköposti",account:"Tili",update_account:"Päivitä tiliä",invalid_username:"Virheellinen käyttäjänimi",auth_provider:"Tunnistamisen toimittaja",my_account:"Tilini",existing_account_question:"Onkohan sinulla jo tili?",background_image:"Taustakuva",back:"Takaisin",logout:"Poistu",look_and_feel:"Kieli ja värit",endpoint:"Endpoint",api:"API",api_token:"API Token",api_tokens:"API Tokens",access_control_list:"Access Control List",access_control_list_admin_warning:"This is an admin account. The generated tokens will have admin privileges.",new_api_acl:"New Access Control List",api_token_id:"Token Id",toggle_gradient:"Toggle Gradient",gradient_background:"Gradient Background",language:"Kieli",color_scheme:"Väriteema",visible_wallet_count:"Näytettävien lompakkojen määrä",admin_settings:"Pääkäyttäjän asetukset",extension_cost:"Tämä laajennus edellyttää vähintään {cost} sat maksua.",extension_paid_sats:"Olet jo maksanut {paid_sats} satsia.",release_details_error:"Ei voi hakea julkaisun tietoja.",pay_from_wallet:"Maksa lompakosta",pay_with:"Maksa {provider}:lla",select_payment_provider:"Valitse maksun välittäjä",wallet_required:"Lompakko *",show_qr:"Näytä QR",retry_install:"Yritä asennusta uudelleen",new_payment:"Luo uusi maksu",update_payment:"Päivitä maksu",already_paid_question:"Kenties maksoit jo?",sell:"Myy",sell_require:"Pyydä maksua laajennuksen käytöstä",sell_info:"{name} -laajennuksen aktivointi edellyttää vähintään {amount} sat maksua.",hide_empty_wallets:"Piilota tyhjät lompakot",recheck:"Tarkista uudelleen",check:"Tarkista",check_connection:"Tarkista yhteys",check_webhook:"Tarkista Webhook",contributors:"Avustajat",license:"Lisenssi",reset_key:"Vaihda avain",reset_password:"Vaihda salasana",border_choices:"Reunuksen vaihtoehdot",select_all:"Valitse kaikki",nfc_supported:"NFC on tuettu",nfc_not_supported:"NFC:tä ei tueta",expire_date:"Vanhenemispäivämäärä:",hash:"Tiiviste:",welcome_lnbits:"Tervetuloa LNbits-palveluun",setup_su_account:"Määritä Superuser-tili alta.",create_ticker_converter:"Luo valuuttamuuntimen Ticker",enable_audit:"Ota seuranta käyttöön",recommended:"Suositeltu",audit_desc:"Tallenna HTTP-pyyntöjä seuraavien suodattimien mukaisesti",audit_record_req:"Tallenna pyynnön Body",audit_record_warning:"Varoitus:",audit_record_req_warning_1:"Luottamukselliset tiedot (kuten salasanat) tallennetaan.",audit_record_req_warning_2:"Body-datamäätä voi olla iso.",audit_record_use:"Käytä varoen!",audit_ip:"Tallenna IP-osoite",audit_ip_desc:"Tallenna asiakkaan IP-osoite",audit_path_params:"Tallenna Path-parametrit",audit_query_params:"Tallenna Query-parametrit",audit_http_methods:"Tallenna HTTP-menetelmät",audit_http_methods_hint:"Luettelo mukaan otettavista HTTP-menetelmistä. Tyhjä luettelo tallettaa kaikki.",audit_http_methods_label:"HTTP-metodit",audit_resp_codes:"Tallenna HTTP-vastauskoodit",audit_resp_codes_hint:"HTTP-koodien lista, jotka sisällytetään (regex-match). Tyhjä luettelo tallettaa kaikki. Esim: 4.*, 5.*",audit_resp_codes_label:"HTTP-vastauskoodi (säännöllinen lauseke)",audit_paths:"Sisällytä polut",audit_paths_hint:"Luettelo poluista, jotka sisällytetään (regex-vastaavuus). Tyhjä luettelo tarkoittaa kaikkia.",audit_paths_label:"HTTP-polku (regex)",audit_paths_exclude:"Ohita polut",audit_paths_exclude_hint:"Lista poluista, jotka jätetään pois (regex-vastaavuus). Tyhjällä listalla mitään ei jätetä pois.",audit_paths_exclude_label:"HTTP-polku (regex)",exchange_providers:"Vaihtokurssin tarjoajat",admin_extensions:"Pääkäyttäjän laajennukset",admin_extensions_label:"Pääkäyttäjän laajennukset",admin_extensions_hint:"Laajennuksia voi käyttää vain käyttäjä, jolla on pääkäyttäjäoikeudet",user_default_extensions:"Käyttäjän oletuslaajennukset",user_default_extensions_label:"Käyttäjän laajennukset",user_default_extensions_hint:"Laajennukset, jotka otetaan oletusarvoisesti käyttöön kaikille käyttäjille.",miscellanous:"Sekalaiset",misc_disable_extensions:"Poista laajennukset käytöstä",misc_disable_extensions_label:"Poista kaikki laajennukset käytöstä",misc_hide_api:"Piilota API",misc_hide_api_label:"Piilottaa lompakon rajapinnan, laajennukset voivat valita välittävätkö tästä asetuksesta",wallets_management:"Lompakoiden hallinta",funding_source_info:"Rahoituslähteen tiedot",funding_source:"Rahoituslähde: {wallet_class}",node_balance:"Solmun saldo: {balance} sats",lnbits_balance:"LNbits-saldo: {balance} sat",funding_reserve_percent:"Omavaraisuusaste: {percent} %",node_management:"Solmun hallinta",node_management_not_supported:"Solmun hallinta ei ole mahdollista valitun rahoituslähteen kanssa.",toggle_node_ui:"Solmun käyttöliittymä",toggle_public_node_ui:"Julkinen näkymä solmun tietoihin",toggle_transactions_node_ui:"Tapahtumat-välilehti (Poista käytöstä suurilla CLN-solmuilla)",invoice_expiry:"Laskun vanhenemisaika",invoice_expiry_label:"Laskun vanhentuminen (sekunteina)",fee_reserve:"Kuluvaraus",fee_reserve_percent:"Kuluvaraus prosentteina",fee_reserve_msats:"Kuluvaraus milli-sat",reserve_fee_in_percent:"Kuluvaraus prosentteina",payment_wait_time:"Maksun odotusaika (sekuntia)",payment_wait_time_desc:"Kuinka pitkään maksua odotetaan saapuvaksi, ennen kuin se merkitään Odotetaan-tilaan. Aseta pidemmäksi käytettäessä HODL-laskuja, Boltz-palvelua, tms",server_management:"Palvelimen hallinta",base_url:"Palvelimen URL-osoite",base_url_label:"Palvelun staattinen pohja-URL",authentication:"Käyttäjän todennus",auth_token_expiry_label:"Kirjautumisen vanhentumisaika minuutteina",auth_token_expiry_hint:"Aika minuuteissa, jossa kirjautuminen vanhenee",auth_allowed_methods_label:"Sallitut kirjautumismenetelmät",auth_allowed_methods_hint:"Valitse kirjautumismenetelmät",auth_nostr_label:"Nostr kutsujen URL",auth_nostr_hint:"Asiakkaiden kirjautumiseen käyttämä absoluuttinen URL-osoite.",auth_google_ci_label:"Google-asiakastunnus",auth_google_ci_hint:"Varmista, että valtuutetut uudelleenohjaus-URI:t sisältävät https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google-asiakassalasana",auth_gh_client_id_label:"GitHub-asiakastunnus",auth_gh_client_id_hint:"Varmista, että valtuutuksen paluuosoite-URL on asetettu osoitteeseen https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub-asiakassalaisuusavain",auth_keycloak_label:"Keycloak-discovery-URL",auth_keycloak_ci_label:"Keycloak-asiakastunnus",auth_keycloak_ci_hint:"Varmista, että valtuutuksen palautus-URL on asetettu muotoon https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak-asiakassalasana",auth_keycloak_custom_org_label:"Valinnainen Keycloak-organisaatio",auth_keycloak_custom_icon_label:"Valinnainen Keycloak-kuvake (URL)",auth_oidc_label:"OIDC-discovery-URL",auth_oidc_ci_label:"OIDC-asiakastunnus",auth_oidc_ci_hint:"Varmista, että valtuutuksen palautus-URL on asetettu muotoon https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC-asiakassalasana",auth_oidc_custom_org_label:"OIDC mukautetun organisaation nimi (esim. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Valinnainen OIDC-kuvake (URL)",currency_settings:"Valuutta-asetukset",allowed_currencies:"Käytettävät valuutat",allowed_currencies_hint:"Valitse käytettävissä olevat fiat-valuutat",default_account_currency:"Tilin oletusvaluutta",default_account_currency_hint:"Kirjanpidon oletusvaluutta",min_incoming_payment_amount:"Pienin vastaanotettava maksun määrä",min_incoming_payment_amount_desc:"Pienin maksun määrä jolle voi luoda laskun",max_incoming_payment_amount:"Saapuvan maksun enimmäismäärä",max_incoming_payment_amount_desc:"Enimmäismäärä jonka voi laskuttaa",max_outgoing_payment_amount:"Lähtevän maksun enimmäismäärä",max_outgoing_payment_amount_desc:"Enimmäismäärä jonka voi maksaa",service_fee:"Palvelumaksut",service_fee_label:"Palvelumaksu (%)",service_fee_hint:"Tapahtumastakohtainen palvelumaksu (%)",service_fee_max:"Palvelumaksun enimmäismäärä",service_fee_max_label:"Palvelumaksu max (sat)",service_fee_max_hint:"Suurin veloitettava palvelumaksu (sat)",fee_wallet:"Palvelumaksujen lompakko",fee_wallet_label:"Palvelumaksujen tilityslompakko (lompakon tunnus)",fee_wallet_hint:"Lompakon tunnus, johon palvelumaksut tilitetään",disable_fee:"Poista maksu käytöstä",disable_fee_internal:"Poista palvelumaksu sisäisiltä maksuilta",disable_fee_internal_desc:"Poista palvelumaksu sisäisiltä salamaksuilta",ui_management:"Käyttöliittymän hallinta",ui_site_title:"Sivuston nimi",ui_changing_remove_lnbits_elements:" (tämän muuttamalla LNbits elementit poistuvat kotisivulla ja alareunasta)",ui_site_tagline:"Sivuston iskulause",ui_elements_enable:"Ota käyttöön elementit etusivulla/alareunassa",ui_elements_disable:"Poista elementit käytöstä etusivulla/alareunassa",ui_toggle_elements_tip:"Poista kotisivuelementit kuten 'toimii' jne.",ui_site_description:"Sivuston kuvaus",ui_site_description_hint:"Käytä tavallista tekstiä, Markdownia tai puhdasta HTML:ää",ui_default_wallet_name:"Oletuslompakon nimi",ui_default_theme:"Oletusteema",lnbits_wallet:"LNbits-lompakko",denomination:"Valuutan nimi",denomination_hint:"FakeWallet-lompakon valuutan nimi",denomination_error:"Valuutta tunnisssa on oltava 3 merkkiä, tai `sat`",ui_qr_code_logo:"QR- ja Favicon-logo",ui_qr_code_logo_hint:"Anna QR-koodissa ja Faviconissa käytettävän logo-kuvan URL",ui_custom_image:"Yksilöity kuva",ui_custom_image_label:"Anna yksilöidyn kuvan URL-osoite",ui_custom_image_hint:"Yksilöity kuva näytetään aloitus- ja kirjautumissivuilla",ui_custom_badge:"Yksilöity tunnus",ui_custom_badge_label:"Yksilöity tunnus 'KÄYTÄ VAROVAISUUTTA - LNbits-lompakko on edelleen BETA-versiossa'",ui_custom_badge_color_label:"Kustomoidun tunnuksen väri",themes:"Teemat",themes_hint:"Valitse käyttäjille saatavilla olevat teemat",custom_logo:"Mukautettu logo",custom_logo_hint:"Logokuvan sisältävä URL-osoite",ad_space_title:"Mainospaikan otsikko",ad_space_title_label:"Palvelua tukevat ",ad_slots:"Mainospaikat",ad_slots_hint:"Mainoslinkit ja kuvatiedostopolut CSV-muodossa, lisäosat voivat valita välittävätkö asetuksesta",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Mainokset käytössä",ads_disabled:"Mainokset poistettu käytöstä",user_management:"Käyttäjänhallinta",admin_users:"Pääkäyttäjät",admin_users_hint:"Käyttäjät, joilla on pääkäyttäjän oikeudet",admin_users_label:"Käyttäjätunnus",allowed_users:"Sallitut käyttäjät",allowed_users_hint:"Vain nämä käyttäjät voivat käyttää LNbitsiä",allowed_users_hint_feature:"Ainoastaan nämä käyttäjät voivat käyttää ominaisuutta {feature}",allowed_users_label:"Käyttäjätunnus",allow_creation_user:"Salli uusien käyttäjien luominen",allow_creation_user_desc:"Etusivulta on mahdollisuus luoda uusia käyttäjiä",new_user_not_allowed:"Tunnusten luonti on estetty.",components:"Komponentit",long_running_endpoints:"Top 5 pisimpään yhteydessä ollutta päätepistettä",http_request_methods:"HTTP-pyynnön menetelmät",http_response_codes:"HTTP-vastaukset koodit",request_details:"Pyynnön tiedot",http_request_details:"HTTP-pyynnön tiedot",payment_details:"Maksun yksityiskohdat",payment_details_desc:"Yksityiskohtaisen maksun sisältö",payments:"Maksut",payment_show_internal:"Näytä sisäiset maksut",payment_chart_flow:"Kuukausittainen maksuvirta",payment_chart_status:"Maksun Tila",payment_chart_tx_per_wallet:"Lompakkokohtaiset tapahtumat (saldo/kappaletta)",payment_details_back:"Takaisin Maksuihin",payment_chart_tags:"Maksut Tag:eittäin",payments_balance_in_out:"Saldo Sisään/Ulos",payments_count_in_out:"Tapahtumia Sisään/Ulos",payments_status_chart:"Tilakaavio",payments_tag_chart:"Tag-kaavio",payments_balance_chart:"Saldo-kaavio",payments_wallets_chart:"Lompakko-kaavio",payments_balance_in_out_chart:"Saldo Sisään/Ulos -kaavio",payments_count_in_out_chart:"Lukumäärä Sisään/Ulos -kaavio",reset_wallet_keys:"Uusi API-avaimet",reset_wallet_keys_desc:"Tämän lompakon API-avaimet uusitaan. Edelliset API-avaimet lakkaavat toimimasta ja uudet luodaan niiden tilalle..",view_list:"Näytä lompakot allekain",view_column:"Näytä lompakot rinnakkain",filter_payments:"Suodata maksuja",filter_date:"Suodata päiväyksellä",websocket_example:"Websocket example",client_id:"Client ID",secret_key:"Secret Key",signing_secret:"Signing Secret",signing_secret_hint:"Signing secret for the webhook. Messages will be signed with this secret.",webhook_id:"Webhook ID",webhook_id_hint:"PayPal webhook ID used to verify incoming events.",webhook_paypal_description:"On the PayPal side configure a webhook pointing to your LNbits server.",callback_success_url:"Callback Success URL",callback_success_url_hint:"The user will be redirected to this URL after the payment is successful",block_explorer:"Lohkoselain",enable_block_explorer:"Ota lohkoselain käyttöön",block_explorer_desc:"Salli käyttäjien tutkia Bitcoin-transaktioita ja -osoitteita Electrumin kautta.",blockexplorer_public_api:"Julkinen API-pääsy",blockexplorer_public_api_desc:"Salli todentamaton pääsy lohkoselain API-päätteisiin.",electrum_server_url:"Electrum-palvelimen URL",electrum_server_url_hint:"esim. ssl://electrum.blockstream.info:50002 tai tcp://localhost:50001",blockexplorer_search_label:"Hae TXID:llä tai osoitteella",blockexplorer_search_hint:"64 merkin heksa = transaktio · muu = Bitcoin-osoite",recent_blocks:"Viimeisimmät lohkot",chain_tip:"Ketjun kärki",block_height:"Lohkokorkeus",block_fee:"lohkomaksu",fee_estimates:"Maksuarviot",confirmed_balance:"Vahvistettu saldo",unconfirmed_balance:"Vahvistamaton saldo",transaction_history:"Tapahtumahistoria",coinbase:"Coinbase",inputs:"Syötteet",outputs:"Tulosteet",confirmations:"Vahvistukset",confirmed:"Vahvistettu",unconfirmed:"Vahvistamaton",history_unavailable:"Tapahtumahistoria ei saatavilla (osoitteella on liikaa tapahtumia)",address:"Osoite",block_number:"Lohko #{height}",block_diff:"vaikeus {value}",block_hash:"Hash",previous_block:"Edellinen lohko",merkle_root:"Merkle-juuri",version:"Versio",bits:"Bitit",difficulty:"Vaikeus",nonce:"Nonce",txid:"TXID",vsize:"Virtuaalikoko",weight:"Paino",n_block_fee:"{n} lohkon maksu"},window.localisation.fo={confirm:"Ja",server:"Ambætari",theme:"Snið",site_customisation:"Vevsíðu tillagingar",funding:"Fígging",users:"Brúkarar",audit:"Slóðfesti",api_watch:"API nýtsluyvirlit",apps:"Appir",channels:"Rásir",transactions:"Flytingar",dashboard:"Yvirlitssýni",node:"Knútur",export_users:"Tak brúkarar út",no_users:"Eingin brúkari finst",total_capacity:"Samlað rásarupphædd",avg_channel_size:"Miðal rásarupphædd",biggest_channel_size:"Størsta rásarupphædd",smallest_channel_size:"Minsta rásarupphædd",number_of_channels:"Tal av rásum",active_channels:"Virknar rásir",connect_peer:"Sambind við javninga",connect:"Sambind",reconnect:"Sambind aftur",open_channel:"Ger rás",open:"Lat upp",clear:"Tómstilla",close_channel:"Loka rás",close:"Loka",restart:"Endurbyrja ambætara",image_library:"Myndasavn",save:"Goym",save_tooltip:"Goym broytingarnar",must_save:"Tú hevur framt broytingar ið enn ikki eru goymdar.",credit_debit:"Góðskriva / Skuldskriva",credit_hint:"Trýst á Enter til tess at góðskriva/skuldskriva mappu (negativ viðri eru loyvd)",credit_label:"{denomination} at góðskriva/skuldskriva",credit_ok:"Tað eydnaðist at góðskriva/skuldskriva tykisligan pening ({amount} sats). Gjøld eru treytaði av veruligum peningi á fíggingarkelduni.",restart_tooltip:"Endurbyrja ambætaran fyri at broytingarnar fáa virknað",add_funds_tooltip:"Set pening á eina mappu.",reset_defaults:"Endurset til forsettar stillingar",reset_defaults_tooltip:"Strika allar stillingar og endurset tær til forsettar.",download_backup:"Tak niður dátugrunstrygdaravrit",name_your_wallet:"Navngev tína {name} mappu",paste_invoice_label:"Innset ein faktura, gjaldsumbøn ella LNURL-kotu *",lnbits_description:"LNbits er kravlítil skipan, ið er løtt at innleggja og uppseta, og kann brúka einhvørja fíggingarkeldu á Lightning netinum. Tú kanst koyra LNbits til egna nýtslu og lættliga veita øðrum eina varðveitsluloysn. Tú fært gjørt eitt óavmarkað tal av mappum har hvør mappa hevur sínar egnu API-lyklar. Við møgulleikanum at býta pening gerst LNbits eitt hent amboð til peningaumsiting og eitt menningaramboð. Ískoytisforrit leggja virkisføri afturat LNbits so at tú kanst royna teg við eini røð av framkomnum tøknum á Lightning netinum. Vit hava gjørt tað so lætt sum møguligt, at menna ískoytisforrit, og sum ein fræls og gjøgnumskygd verkætlan eggja vit fólki, at menna og leggja fram teirra egnu ískoytisforrit.",export_to_phone:"Tak út til snildfon við QR-kotu",export_to_phone_desc:"QR-kotan inniheldur eina leinkju ið vísir til og gevur full rættindi til tína mappu. Skannar tú hana, t.d. við tíni snildfon, kanst tú lata upp mappu nýtaramótið har.",access_wallet_on_mobile:"Faratgongd",stored_paylinks:"Goymdar LNURL-gjaldleinkjur",wallet:"Mappa: ",wallet_name:"Mappunavn",wallet_type:"Slag av mappu",shared_wallet:"Deild mappa",share_wallet:"Deil mappu",update_permissions:"Broyt loyvir",shared_wallet_id:"Eyðmerki á deildari mappu",shared_wallet_desc:"Tú ert boðin atgongd til aðra mappu.",wallets:"Mappur",exclude_wallets:"Útiloka mappur",add_wallet:"Ger mappu",reject_wallet:"Vraka mappuatgongd",add_new_wallet:"Legg nýggja mappu afturat",pin_wallet:"Fest á mappulista",delete_wallet:"Strika mappu",delete_wallet_desc:"Mappan verður strikað og peningurin í henni fæst IKKI AFTUR.",rename_wallet:"Nýnevn mappu",update_name:"Nýnevn",fiat_tracking:"Fiat rekjan",fiat_providers:"Fiat meklarir",fiat_warning_bitcoin:'Ber teg undan at brúka orðið "bitcoin" tínum samskifti við fiat meklarar, tí teir hava lyndi at gerast fjálturstungnir um tað ið hevur við Bitcoin at gera!',currency:"Gjaldoyra",update_currency:"Broyt gjaldoyra",press_to_claim:"Trýst til tess at taka ímóti bitcoin",claim_desc:"Tú tykist hava krav á einari bitcoin upphædd men hevur ikki eina mappu enn. Trýst á knøttin niðanfyri fyri at taka ímóti henni. Ein nýggj mappa verður gjørd tær.",donate:"Veit fíggjarligan stuðul",view_github:"Lat upp LNbits verkætlanina á GitHub",voidwallet_active:"VoidWallet er virkin! Gjøld eru óvirkt",voidwallet_active_user:"Fíggingarkelda er ikki tøk. Vinaliga bið skipanarumsitaran um at fáa fíggingarkelduna í rættlag.",voidwallet_active_admin:"Fíggingarkelda er ikki tøk. Trýst á her fyri at uppseta.",service_fee_badge:"Tænastuavgjald: {amount} % fyri hvørja flyting",service_fee_max_badge:"Tænastuavgjald: {amount} % fyri hvørja flyting (í mesta lagi {max} {denom})",service_fee_tooltip:"Tænastuavgjald ið LNbits-ambætaraumsitarin krevur fyri hvørt útgjald",toggle_darkmode:"Myrkt snið",payment_reactions:"Gjaldsviðbrøgd",view_swagger_docs:"Lat upp LNbits Swagger API-skjalfestingina",api_docs:"API skjalfesting",api_keys_api_docs:"Knútaleinkja, API-lyklar og API-skjalfesting",lnbits_version:"LNbits útgáva",runs_on:"Koyrir á",paste:"Innset",paste_from_clipboard:"Innset frá setiborði",paste_request:"Innset umbøn",create_invoice:"Stovna gjaldsumbøn",camera_tooltip:"Brúka myntatólið at skanna eina gjaldsumbøn/QR-kotu",export_csv:"Tak út sum CSV",export_csv_details:"Tak út sum CSV, við smálutum",chart_tooltip:"Vís talvu",pending:"Ógoldin",copy_invoice:"Avrita gjaldsumbøn",withdraw_from:"Tak út úr",cancel:"Avlýs",scan:"Skanna",read:"Innles",write:"Skriva",pay:"Rinda",sending:"Sendur",memo:"Viðmerking",date:"Dagfesting",path:"Leið",internal_memo:"Egin viðmerking (valfríur)",internal_memo_hint_receive:"Viðmerkingin verður ikki víst rindaranum men verður knýtt at fakturanum, so tú kanst nýta hana sum tilvísing.",internal_memo_hint_pay:"Viðmerkingin verður ikki vist móttakaranum men verður knýtt at gjaldsumbønini, so tú kanst nýta hana sum tilvísing.",payment_processing:"Gjald verður avgreitt...",payment_successful:"Goldið!",payment_pending:"Gjald er ikki goldið enn...",payment_check:"Kanna greiðslu",not_enough_funds:"Ónøktandi salda!",search_by_tag_memo_amount:"Leita eftir spjaldri, viðmerking, upphædd",search:"Leita",invoice_waiting:"Gjaldsumbøn ið bíðar eftir at verða goldin",payment_received:"Inngjald",payment_sent:"Útgjald",payment_failed:"Gjald miseydnaðist",receive:"Móttak",send:"Send",outgoing_payment_pending:"Útgjald í bíðistøðu",drain_funds:"Tøm mappu",drain_funds_desc:"Hendan LNURL-úttøku QR-kotan kann brúkast at taka allan peningin úr mappuni. Ikki deila QR-kotuna við nakran. Hon ger nýtslu av balanceCheck og balanceNotify og kann tí brúkast fleiri ferðir at tøma mappuna.",i_understand:"Eg skilji",copy_wallet_url:"Avrita mappuleinkju",disclaimer_dialog_title:"Gev gætur!",disclaimer_dialog:'Tú *noyðist* at varðveita tínar innritanarupplýsingar til tess at fáa atgongd til mappuna aftur. Missir tú tær missir tú atgongd til mappuna og peningin.\n\nTú finnur tínar innritanarupplýsingar undir "Mín brúkari" > "Brúkara uppsetan".\n\nLNbits tekur ikki ábyrgd fyri mistari atgongd til pening.',no_transactions:"Enn eru ongar flytingar gjørdar",manage:"Umsit",exchanges:"Gjaldoyrakostnaðir",extensions:"Ískoytisforrit",no_extensions:"Einki ískoytisforrit er innlagt :(",created:"Stovnað",created_at:"Stovnað",updated_at:"Broytt",search_extensions:"Leita eftir ískoytisforritum",search_wallets:"Leita eftir mappum",extension_sources:"Ískoytisforritakeldur",ext_sources_hint:"Keldur hiðan ískoytisforrit verða tikin niður",ext_sources_label:"Kelduleinkja (brúka einans almennu LNbits-ískoytisforritakelduna og keldur tú hevur álit á)",warning:"Gev gætur",repository:"Kelda",confirm_continue:"Ynskir tú at halda áfram?",manage_extension_details:"Innlegg/Strika ískoytisforritið",upload:"Uppsend",install:"Innlegg",uninstall:"Strika",drop_db:"Strika dáturnar",enable:"Virkja",enabled:"Virktur",disabled:"Óvirkt(ur)",pay_to_enable:"Rinda til tess at virkja",enable_extension_details:"Virkja ískoytisforrit fyri verandi brúkara",disable:"Óvirkja",delete:"Strika",installed:"Innløgd",activated:"Virkt(ur)",deactivated:"Óvirkt",activate:"Virkja",deactivate:"Óvirkja",release_notes:"Sleppingarskriv",activate_extension_details:"Virkja ella óvirkja ískoytisforritið fyri brúkarum",featured:"Víðagitin",categories:"Flokkar",all:"Øll",only_admins_can_install:"(Einans umsitarar kunnu innleggja ískoytisforrit)",only_admins_can_create_extensions:"Einans umsitarar kunnu gera ískoytisforrit",admin_only:"Einans umsitarar",make_user_admin:"Játta umsitanarrættindi",revoke_admin:"Ógilda umsitanarrættindi",new_version:"Nýggj útgáva",reviews_url:"Ummælaleinkja",reviews_url_label:"Ummælaambætaraleinkja",reviews_url_hint:"Leinkja til PaidReviews/ummælir, íroknað stillingareymerki (t.d. https://example.com/paidreviews/SETTINGS_ID)",reviews_open:"Sí ummælir",reviews_leave:"Gev ummæli",reviews_name:"Títt navn",reviews_comment:"Títt ummæli",reviews_rating:"Meting",reviews_submit:"Send inn ummælið",reviews_loading:"Innlesur ummælir...",reviews_refresh:"Endurinnlesur ummælir",reviews_error_load:"Miseydnaðist at innlesa ummælir",reviews_url_not_configured:"Ummælaleinkja ikki ásett",reviews_pay_invoice:"Rinda gjaldsumbøn",reviews_invoice_paid:"Gjaldsumbøn goldin",reviews_invoice_title:"Rinda hesa gjaldsumbøn til tess at skráseta títt ummæli",reviews_count:"Ummælir",no_reviews:"Ongin ummælir enn",extension_has_free_release:"Hevur ókeypis útgávur",extension_has_paid_release:"Hevur útgávur til keyps",extension_depends_on:"Er treytað av:",extension_rating_soon:"Metingar koma skjótt",extension_installed_version:"Innløgd útgáva",extension_uninstall_warning:"Tú ert í ferð við at strika ískoytisforritið fyri allar brúkararnar.",uninstall_confirm:"Ja, strika",extension_db_drop_info:"Allar dátur tilhoyrandi ískoytisforritið verða strikaðar. Eftir hesa gerð vendst ikki aftur!",extension_db_drop_warning:"Tú ert í ferð við at strika allar dátur tilhoyrandi ískoytisforritið. Vinaliga skriva navnið á ískoytisforritinum til tess at halda á fram:",extension_required_lnbits_version:"Hendan útgávan tørvar LNbits útgávu",min_version:"Í minsta lagi",max_version:"Upp til (ikki íroknað)",preimage:"Frumvirði",preimage_hint:"Frumvirði til tess at avrokna varðveitslugjaldsumbøn",hold_invoice:"Varðveitslugjaldsumbøn",hold_invoice_description:"Hendan gjaldsumbønin er í varðveitslu og tørvur er á frumvirði til tess at gjalda hana.",payment_hash:"Gjalds-hash",invoice_cancelled:"Gjaldsumbøn ógilda",invoice_settled:"Gjaldsumbøn avroknað",hold_invoice_payment_hash:"Gjalds-hash fyri varðveitslugjaldsumbøn (valfríur)",settle_invoice:"Avrokna gjaldsumbøn",cancel_invoice:"Ógilda gjaldsumbøn",fee:"Avgjald",amount:"Upphædd",amount_limits:"Upphæddarmørk",amount_sats:"Upphædd (sats)",faucest_wallet:"Tiltaksmappa",faucest_wallet_desc_1:"Fyri hvørt gjald váttað av {provider} verður upphæddin drigin frá hesi mappuni.",faucest_wallet_desc_2:"Hetta hjálpir at halda skil á øllum {provider} gjøldum og støðum teirra.",faucest_wallet_desc_3:"Mappan skal hava upphædd av sats ið umsitarin bjóðar í býti fyri fiat gjaldoyrað.",faucest_wallet_desc_4:"Er ásetta mappan tóm verða gjøld umvegis {provider} ikki avgreidd.",faucest_wallet_desc_5:"Upphæddin á tiltaksmappuni kann umsíðir gerast negativ í fall fleiri fiat gjøld verða rindaði.",faucest_wallet_id:"Tiltaksmappueyðmerki (valfríur)",faucest_wallet_id_hint:"Eyðmerki á mappu við tøkari upphædd at senda til brúkaran.",tag:"Spjaldur",unit:"Eind",description:"Lýsing",expiry:"Fyrnar",webhook:"Vevongul",webhook_url:"Vevongulsleinkja",webhook_url_hint:"Vevongulsleinkja ið gjaldsupplýsingarnir verða sendir til. Tað verður koyrt fyri hvørt gjald.",copy_webhook_url:"Avrita vevongulsleinkju",webhook_events_list:"Vevongulin noyðist at koyra undir fylgjandi hendingum:",webhook_stripe_description:"Á Stripe síðuni noyðist tú at uppseta ein vevongul við einari leinkju ið peikar á tín LNbits-ambætara.",webhook_square_description:"Á Square síðuni noyðist tú at uppseta ein vevongul ið peikar á hesa LNbits-leinkjuna.",square_webhook_url_hint:"Skal samsvara við fráboðanarleinkjuna hjá Square. LNbits tørvar /api/v1/callback/square slóðina.",access_token:"Atgongdarmerki",location_id:"Staðsetingareyðmerki",square_location_id_hint:"Square-staðsetingareyðmerkið ið gjaldsumbønarleinkjur verða gjørdar fyri. Brúka endapunktið at velja royndar- ella framleiðsluumhvørvi.",api_version:"API útgáva",payment_proof:"Gjaldsprógv",update:"Dagfør",update_available:"Dagføring {version} tøk!",funding_sources:"Fíggingarkeldur",funding_source:"Fíggingarkelda",requires_server_restart:"Eftir broyting av hesum stillingunum er neyðugt at endurbyrja ambætaran, til tess at broytingarnar fáa virknað.",funding_source_info:"Fíggingarkelduupplýsingar",phoenixd_warning:"Phoenixd áminningarramsan kann einans ásetast um phoenixd dátuskjáttan er ásett og LNbits fær lisið hana. Tað er ikki eitt tekin um at phoenixd ikki koyrir. Tað merkir bara at LNbits ikki hevur atgongd at vísa áminningarramsuna her.",latest_update:"Tú ert á nýggjastu útgávuni {version}.",notifications:"Fráboðanir",notifications_configure:"Fráboðanaruppsetan",notifications_nostr_config:"Nostr uppsetan",notifications_enable_nostr:"Virkja Nostr fráboðanir",notifications_enable_nostr_desc:"Send fráboðanir umvegis Nostr",notifications_nostr_private_key:"Nostr privatur lykil",notifications_nostr_private_key_desc:"Privatur lykil, í sekstandatal ella nsec skapi, at undirrita boð send til Nostr",notifications_nostr_identifier:"Nostr-dátuheiti",notifications_nostr_identifier_desc:"Nip5-dátuheiti ið fráboðanir verða sendar til",notifications_nostr_identifiers:"Nostr-dátuheitir",notifications_nostr_identifiers_desc:"Listi av dátuheitum ið fráboðanir verða sendar til",notifications_telegram_config:"Telegram-uppsetan",notifications_enable_telegram:"Virkja Telegram-fráboðanir",notifications_enable_telegram_desc:"Send fráboðanir umvegis Telegram",notifications_telegram_access_token:"Atgongdarmerki",notifications_telegram_access_token_desc:"Atgongdarmerki til bottin",notifications_chat_id:"Telegram-kjatteyðmerki",notifications_chat_id_desc:"Eyðmerkið á Telegram-kjatti ið fráboðanir verða sendar til",notifications_excluded_wallets_desc:"Send ikki fráboðanir fyri hesar mappur",notifications_email_config:"Teldupost uppsetan",notifications_enable_email:"Virkja teldupost",notifications_enable_email_desc:"Send fráboðanir o.a. umvegis teldupost",notifications_send_test_email:"Send royndar teldubræv",notifications_send_email:"Send teldupost frá",notifications_send_email_desc:"Teldupostbústaður ið sent verður frá",notifications_send_email_username:"Brúkaranavn",notifications_send_email_username_desc:"Brúkaranavn. Verður brúkaranavn ikki tilskila verður teldupostbústaðurin brúktur",notifications_send_email_password:"Loyniorð fyri at senda teldupost",notifications_send_email_password_desc:"Loyniorð fyri teldupostbústaðin ið sent verður frá",notifications_send_email_server_port:"SMTP-portur",notifications_send_email_server_port_desc:"Portur á SMTP-ambætaranum",notifications_send_email_server:"SMTP-ambætari",notifications_send_email_server_desc:"SMTP-ambætari ið skal senda teldupostin",notifications_send_to_emails:"Send teldubrøv til",notifications_send_to_emails_desc:"Fráboðanir verða sendar, sum teldubrøv, til",notification_settings_update:"Broyttar stillingar",notification_settings_update_desc:"Fráboða um broyttar ambætarastillingar",notification_server_start_stop:"Startaðan/Steðgaðan ambætara",notification_server_start_stop_desc:"Fráboða um startaðan og steðgaðan ambætara",notification_watchdog_limit:"Varðhundsmarkfráboðan",notification_watchdog_limit_desc:"Boða frá tá mark varðhundsins er rokkið. Hetta broytir ikki fíggingarkelduna.",notification_server_status:"Ambætarastøðu",notification_server_status_desc:"Fráboða regluliga um ambætarastøðuna (tilskila tíðarbil í tímum)",notification_incoming_payment:"Inngjøld",notification_incoming_payment_desc:"Fráboða um inngjøld, á mappur, ið er hægri enn tilskillaða upphæddin (sats)",notification_outgoing_payment:"Útgjøld",notification_outgoing_payment_desc:"Fráboða um útgjøld, frá mappum, ið er størri enn tilskilaða upphæddin (sats)",notification_credit_debit:"Góð- og skuldskrivingar",notification_credit_debit_desc:"Fráboða um mappur góðskrivaðar ella skuldskrivaðar av úrvalsbrúkaranum",notification_balance_delta_changed:"Saldumunur broyttur",notification_balance_delta_changed_desc:"Boða frá tá munurin á knútasalduni og LNbits-salduni er broyttur meira enn tað ávístu upphæddina (í sats). Áset 0 fyri at óvirkja. Verður kannað hvønn minutt.",watchdog_introduction:"Varðhundurin er ein funka ið sjálvvirkandi kann skifta fíggingarkelduna til VoidWallet, í fall munurin á saldu fíggingarkeldunnar og saldu LNbits er størri enn eitt vist. Hetta kann hjálpa at fyribyrgja ovurnýtslu og tryggja saldu fíggingarkeldunnar.",enable_watchdog:"Varðhundaskifti",enable_watchdog_desc:"Um virkt, og LNbits-saldan gerst hægri enn knútasaldan, so verður fíggingarkeldan sjálvvirkandi broytt til VoidWallet. Eftir dagføringar er neyðugt at virkja hetta aftur.",watchdog_interval:"Títtleiki varðhundsins",watchdog_interval_desc:"Títtleikin — í minuttum — har varðhundurin kannar, um skifti, treytað av saldumuninum [knúta_salda - lnbits_salda], er neyðugt.",watchdog_delta:"Delta varðhundsins",watchdog_delta_desc:"Mark fyri skifti av fíggingarkeldu til VoidWallet [lnbits_salda - knúta_salda > delta]",status:"Støða",notification_source:"Fráboðanarkeldur",notification_source_label:"Kelduleinkja (brúka einans almennu LNbits fráboðanarkelduna og keldur tú hevur álit á)",more:"Frætt meira",more_count:"{count} afturat",less:"minni",releases:"Útgávur",watchdog:"Varðhundur",server_logs:"Gerðalisti ambætarans",ip_blocker:"IP-noktan",security:"Trygd",security_tools:"Trygdaramboð",block_access_hint:"Nokta atgongd frá IP-atsetri",allow_access_hint:"Loyv atgongd frá IP-atsetri (hevur hægri raðfesting enn noktaði IP-atsetur)",enter_ip:"Inntøppa IP-atsetur og trýst Enter",rate_limiter:"Umbønaravmarkan",callback_url_rules:"Afturtøkukallleinkjureglur",enter_callback_url_rule:"Inntøppa leinkjuregul í regex forsniði og trýst 'enter'",callback_url_rule_hint:"Afturtøkukallleinkjur, harímillum LNURL-leinkjur, verða kannaðar sambært hesum reglunum. Í minsta lagi ein regla skal lúkast. Eru ongar reglur skrásettir eru allar leinkjur loyvdar.",wallet_limiter:"Mappuavmarkingar",wallet_config:"Mappustillingar",wallet_charts:"Mapputalvur",wallet_limit_max_withdraw_per_day:"Hámark á dagligum útgjøldum í sats (0 merkir óavmarkað, -1 noktar fyri útgjøldum)",wallet_max_ballance:"Mappusalduhámark í sats (0 merkir óavmarkað)",wallet_limit_secs_between_trans:"Lágmark fyri sekund ímillum flytingar fyri hvørja mappu (0 merkir einki mark)",only_incoming_payments_allowed:"Loyv bert inngjøldum",disable_outgoing_payments:"Óvirkja útgjøld",number_of_requests:"Tal av umbønum",number_of_requests_hint:'Loyvdar umbønir fyri hvørt "tíðarbil" hjá umbønaravmarkaranum. Áset 0 fyri at óvirkja umbønaravmarkaran.',time_unit:"Tíðarbil",minute:"minutt",settings:"Stillingar",second:"sekund",hour:"tíma",disable_server_log:"Óvirkja gerðalista ambætarans",enable_server_log:"Virkja gerðalista ambætarans",coming_soon:"Hentleikin er undir menning",session_has_expired:"Tín seta er útgingin. Vinaliga rita innaftur.",instant_access_question:"ella stundisliga atgongd",login_with_user_id:"Rita inn við brúkaraeyðmerki",or:"ella",create_new_wallet:"Ger nýggja mappu",delete_all_wallets:"Strika allar mappur",confirm_delete_all_wallets:"Ynskir tú at strika ALLAR mappurnar hjá hesum brúkaranum?",login_to_account:"Rita inn á tín brúkara",create_account:"Stovna brúkara",account_settings:"Brúkara uppsetan",signin_with_oauth:"Rita inn við",signin_with_oauth_or:"ella rita inn við",signin_with_nostr:"Rita inn við Nostr",signin_with_google:"Rita inn við Google",signin_with_github:"Rita inn við GitHub",signin_with_custom_org:"Rita inn við {custom_org}",username_or_email:"Brúkaranavn ella teldupostbústaður",password:"Loyniorð",password_config:"Loyniorðsuppsetan",password_repeat:"Endurtak loyniorðið",update_password:"Broyt loyniorðið",change_password:"Broyt loyniorð",update_credentials:"Dagfør innritanarupplýsingar",update_pubkey:"Broyt almenna lykilin",nostr_pubkey_tooltip:"Inntøppa almenna Nostr-lykil brúkarans (sekstandatøl)",set_password:"Áset loyniorð",set_password_tooltip:"Áset hesum brúkaranum eitt loyniorð",invalid_password:"Loyniorð skulu hava í minsta lagi 8 tekn",invalid_password_repeat:"Loyniorðini eru ikki eins",reset_key_generated:"Ein endursetanarlykil er hervið gjørdur.",reset_key_copy:"Trýst á OK fyri at avrita endursetanarleinkjuna til setiborðið.",login:"Rita inn",register:"Skráset",username:"Brúkaranavn",pubkey:"Almennur lykil",user_id:"Brúkaraeyðmerki",id:"Eyðmerki",email:"Teldupostbústaður",email_confirmation_hint:"Teldupostbústaður ið váttanarkota skal sendast til.",nostr_identifier:"Nostr-dátuheiti",nostr_identifier_hint:"Nostr nip5-dátuheiti ella ið váttanarkota skal sendast til.",first_name:"Fornavn",last_name:"Eftirnavn",picture:"Mynd",user_picture_desc:"Leinkja ið vísur til vangamynd. Tú kanst leggja hana út undir Tilfar.",verify_email:"Vátta teldupost umvegis",account:"Brúkari",update_account:"Broyt brúkara",invalid_username:"Ógildigt brúkaranavn",auth_provider:"Samgildisveitari",external_id:"Ytri eyðmerki",my_account:"Mín brúkari",existing_account_question:"Hevur tú longu ein brúkara?",background_image:"Bakgrundsmynd",back:"Aftur",logout:"Rita út",look_and_feel:"Útsjónd",endpoint:"Endapunkt",api:"API",api_stripe:"API",api_token:"API-merki",api_tokens:"API-merkir",access_control_list:"Atgongdarstýringarlisti",access_control_list_admin_warning:"Hetta er ein umsitanarbrúkari. Framleidd merkir fáa tí umsitanarrættindir.",new_api_acl:"Nýggjan atgongdarstýringarlista",api_token_id:"API-merki",toggle_gradient:"Litskifti",gradient_background:"Litskifti á bakgrund",rounded_ui:"Avrundaði kort & knøttar",toggle_rounded_ui:"Virkja ella óvirkja avrundaði horn á kortum og knøttum",card_gradient:"Litskifti á kortum",toggle_card_gradient:"Virkja ella óvirkja litskifti á kortum",card_shadow:"Kortskuggar",toggle_card_shadow:"Virkja ella óvirkja skugga handan kort",burger_menu_background:"Bakgrund á síðuteigi",toggle_burger_menu_background:"Virkja ella óvirkja bakgrund síðuteigsins",language:"Mál",assets:"Tilfar",max_asset_size_mb:"Hámarksstødd á tilfari (MB)",max_asset_size_mb_desc:"Hámarksstøddin, í megabýtum, á tilfari ið verður uppsent. Møguligt er at nýta desimalar.",assets_allowed_mime_types:"Loyvt slag av tilfari",assets_allowed_mime_types_desc:"(MIME) Sløg av tilfari ið loyvt verður at uppsenda. Um einki slag er ásett eru øll sløg loyvd.",thumbnail_width:"Smámyndavídd",thumbnail_width_desc:"Víddin á framleiddu smámyndunum, í piksilum.",thumbnail_height:"Smámyndahædd",thumbnail_height_desc:"Hæddin á framleiddu smámyndunum, í piksilum.",thumbnail_format:"Smámyndaforsnið",thumbnail_format_desc:"Forsnið á framleiddu smámyndunum (PNG, JPEG, o.s.fr.).",max_assets_per_user:"Hámark av tilfari fyri hvønn brúkara",max_assets_per_user_desc:"Hámark av tilfari ið hvør brúkari sleppur at uppsenda. Null merkir at uppsending er noktað.",assets_no_limit_users:"Brúkarir undantiknir tilfarsmørkum",assets_no_limit_users_desc:"Hesir brúkarir eru undantiknir hámarkinum av uppsendum tilfari (grundað á brúkaraeyðkenni).",color_scheme:"Litaval",visible_wallet_count:"Nøgd av vístum mappum",admin_settings:"Umsit stillingar",extension_cost:"Útgávan krevur eitt gjald á í minsta lagi {cost} sats.",extension_paid_sats:"Tú hevur longu goldið {paid_sats} sats.",extension_permissions_title:"Játta ískoytisforriti rættindir",extension_permissions_tab:"Rættindir ískoytisforritsins",user_permissions_tab:"Mínar játtanir",extension_permissions_none:"Hetta ískoytisforritið krevur ongi rættindir undir innlegging.",user_permissions_none:"Tú hevur ikki játtað hesum ískoytisforriti nøkur rættindir.",user_permissions_max_amount:"Mark á gjaldsupphædd",user_permissions_destination_policy:"Loyvi at rinda til",user_permissions_no_editable_settings:"Hendan játtanin hevur einki at tillaga.",extension_permissions_grant_install:"Játta og innlegg",extension_permissions_high_risk_warning:"Hetta ískoytisforritið biður um rættindi at flyta pening.",extension_permission_risk_low:"Lítil váði",extension_permission_risk_medium:"Miðal váði",extension_permission_risk_high:"Stórur váði",extension_permission_warning_wallet_pay_invoice:"Kann brúka pening úr mappum ið eru tøkar á tínum brúkara.",extension_permission_warning_wallet_pay_invoice_background:"Kann brúka pening úr ásettum mappum seinni og uttan inntriv frá brúkara.",extension_permission_warning_wallet_payments_watch:"Kann lesa gjaldssmálutir viðvíkjandi ásettum mappum.",extension_permission_warning_extension_api_request_write:"Kann skriva dátur ella koyra tilgongdir í ásettum ískoytisforritum.",extension_permission_ext_storage_read:"Lesa ískoytisforritagoymslu",extension_permission_ext_storage_read_public:"Lesa almenna ískoytisforritagoymslu",extension_permission_ext_storage_write:"Skriva til ískoytisforritagoymslu",extension_permission_ext_storage_read_write:"Lesa og skriva til ískoytisforritagoymslu",extension_permission_extension_api_request:"Brúka onnur ískoytisforrit",extension_permission_extension_api_request_extensions:"Loyvd ískoytisforrit",extension_permission_access_read:"Lesa",extension_permission_access_write:"Skriva",extension_permission_http_request:"Sambinda til ytri vevsíður",extension_permission_http_request_hosts:"Loyvdir vertir",extension_permission_utils_basic:"Brúka grundleggjandi LNbits hentleikar",extension_permission_ui_camera_scan_qr:"Skanna QR-kotur",extension_permission_wallet_payments_watch:"Eygleiða gjøld á mappum",extension_permission_wallet_create_invoice:"Gera gjaldsumbønir",extension_permission_wallet_create_invoice_public:"Gera Lightning-gjaldsumbønir frá almennum síðum",extension_permission_wallet_balance_read:"Síggja mappusaldur",extension_permission_wallet_list:"Vísa mappur",extension_permission_wallet_pay_invoice:"Rinda gjaldsumbønir",extension_permission_wallet_pay_invoice_background:"Rinda í bakgrundini, uttan inntriv frá brúkara",create_extension:"Stovna ískoytisforrit",release_details_error:"Bar ikki til at útvega sleppingarstaklutir.",pay_from_wallet:"Rinda úr mappuni",pay_with:"Rinda við {provider}",select_payment_provider:"Vel gjaldsmeklara",wallet_required:"Mappa *",show_qr:"Vís QR-kotu",retry_install:"Royn at leggja inn aftur",new_payment:"Rinda av nýggjum",update_payment:"Goym gjaldsupplýsingar",already_paid_question:"Hevur tú longu goldið?",sell:"Sel",sell_require:"Virkja ískoytisforritið fyri eitt gjald",sell_info:"Eitt gjald á í minsta lagi {amount} sats er kravt fyri at virkja {name}-ískoytisforritið.",hide_empty_wallets:"Fjal tómar mappur",recheck:"Eftirkanna",check:"Kanna",check_connection:"Kanna sambinding",check_webhook:"Kanna vevongul",contributors:"Stigtakarir",license:"Loyvi",reset_key:"Endursetanarlykil",reset_password:"Endurset loyniorð",border_choices:"Rammusnið",select_all:"Vel øll",nfc_supported:"NFC-hentleiki er møguligur",nfc_not_supported:"NFC-hentleiki er ikki møguligur",expire_date:"Útgongudagfesting: ",hash:"Hash: ",welcome_lnbits:"Vælkomin til LNbits",setup_su_account:"Ger úrvalsbrúkaran niðanfyri.",first_install_token:"Merkið fyri fyrstu innlegging",create_ticker_converter:"Ger gjaldoyramerkilíka",enable_audit:"Virkja slóðfesti",recommended:"Viðmælt",audit_desc:"Skráset HTTP-umbønirnar sambært fylgjandi ásetingum",audit_record_req:"Skráset body-partin av umbønum",audit_record_warning:"Gev gætur: ",audit_record_req_warning_1:"trúnaðardátur, teirra millum loyniorð, verða skrásettar.",audit_record_req_warning_2:"body-parturin av umbønunum kann fylla nógv.",audit_record_use:"Skal brúkast við fyrivarni.",audit_ip:"Skráset IP-atsetur",audit_ip_desc:"Skráset IP-atsetur viðskiftarans",audit_path_params:"Skráset slóðávirkir (Path Parameters)",audit_query_params:"Skráset fyrispurningsávirkir (Query Parameters)",audit_http_methods:"Íroknaðir HTTP-háttir",audit_http_methods_hint:"Íroknaðir HTTP-háttir. Er listin tómur verða allir háttir íroknaðir.",audit_http_methods_label:"HTTP-háttir",audit_resp_codes:"Íroknaðar HTTP-svarkotur",audit_resp_codes_hint:"Íroknaðar HTTP-svarkotur (regex forsnið). Er listin tómur verða allar kotur íroknaðar. T.d.: 4.*, 5.*",audit_resp_codes_label:"HTTP-svarkotur (regex)",audit_paths:"Íroknaðar slóðir",audit_paths_hint:"Íroknaðar slóðir (regex forsnið). Er listin tómur verða allar slóðir íroknaðar.",audit_paths_label:"HTTP-slóð (regex)",audit_paths_exclude:"Útiloka slóðir",audit_paths_exclude_hint:"Listi av útilokaðum slóðum (regex forsnið). Er listin tómur verða ongar slóðir útilokaðar.",audit_paths_exclude_label:"HTTP-slóð (regex)",exchange_providers:"Gjaldoyrakursveitarir",admin_extensions:"Umsitingarískoytisforrit",admin_extensions_label:"Umsitingarískoytisforrit",admin_extensions_hint:"Ískoytisforrit ið einans er tøk fyri brúkarum við umsitingarligum rættindum",user_default_extensions:"Brúkaraforsett ískoytisforrit",user_default_extensions_label:"Brúkaraforsett ískoytisforrit",user_default_extensions_hint:"Ískoytisforrit ið forsett verða virkt fyri brúkarunum",extension_builder:"Ískoytisforritasavnari",extension_builder_manifest_url:"Leinkja til ískoytisforritasavnaraskrá",extension_builder_manifest_url_hint:"Leinkja til eina JSON-skrá við ískoytisforritasavnarastaklutum",miscellanous:"Ymiskt",misc_disable_extensions:"Óvirkja ískoytsiforrit",misc_disable_extensions_label:"Óvirkja øll ískoytisforrit",misc_disable_extensions_builder:"Virkja ískoytisforritasavnara",misc_disable_extensions_builder_label:"Lova brúkarum ið ikki hava umsitanarrættindi at brúka ískoytisforritasavnaran",misc_hide_api:"Fjal API-upplýsingar",misc_hide_api_label:"Fjalur mappu-API. Tað er upp til hvørt ískoytisforrit sær at halda við stillingini",wallets_management:"Fíggjaruppsetan",funding_source_info:"Fíggingarkeldu upplýsingar",funding_source:"Fíggingarkelda: {wallet_class}",node_balance:"Salda knútsins: {balance} sats",lnbits_balance:"LNbits-salda: {balance} sats",funding_reserve_percent:"Tiltakspeningur: {percent} %",node_management:"Knútaumsiting",node_management_not_supported:"Knútaumsiting er ikki møgulig við verandi fíggingarkeldu",toggle_node_ui:"Knútanýtslumót",toggle_public_node_ui:"Alment knútanýtslumót",toggle_transactions_node_ui:"Flytingarskiljiblað (frámælt á størri CLN-knútum vegna ovbyrjan)",invoice_expiry:"Loka gjaldsumbøn eftir",routing_fee_reserve_calculations:"Beiningaravgjaldstiltaksútrokningar",routing_fee_reserve_calculations_desc:'Fyri hvørt útgjald setur LNbits eina "tiltaksupphædd" til síðis at rinda beiningaravgjøld. Hámarkið á beiningaravgjaldinum ið verður handað fíggingarkelduni er tað hægra av fylgjandi: lágmarkið fyri beiningaravgjald ella beiningaravgjald í prosentum.',millisats:"millisats",fee_reserve:"Lágmark fyri beiningaravgjald",fee_reserve_percent:"Beiningaravgjald í prosentum",fee_reserve_min_hint:"Lágmark fyri beiningariavgjald fyri hvørt gjald.
Hetta riggar sum eitt minstamark - mest loyvda beiningaravgjald verður ongantíð lægri, uttan mun til gjaldsupphæddina.",fee_reserve_percent_hint:"Prosent av gjaldsupphæddini at seta av til beiningaravgjald.",payment_timeouts:"Gjaldsfreistir",payment_wait_time:"Greiðslubíðitíð (sek.)",seconds:"sekund",payment_pending_interval:"Greiðslukanningarmillumbil (sek.)",payment_pending_interval_desc:"Tíðin ímillum óavgreidd gjøld verða kannaði",payment_pending_interval_tooltip:"Ásetur títtleikan ið LNbits kannar og tillagar støðuna á óavgreiddum gjøldum. Longri millumbil kunnu lætta um byrðu knútsins og elva til skjótari greiðslur, ímeðan støðan á óavgreiddum gjøldum ikki verður dagførd líka títt.",payment_wait_time_desc:"Bíðitíð áðrenn útgjøld verða merkt at verða í bíðistøðu. Forsett: 5 sek.; hækka í fall gjaldsumbønirnar taka langa tíð at avroknað.",payment_wait_time_tooltip:"Ásetur tíðina ið LNbits bíðar eftir váttan fyri eitt útgjáld áðrenn útgjaldið verður sett í bíðistøðu. Longri bíðitíðir eru hóskandi tá ein skal rinda gjaldsumbønir ið taka longri tí at avroknað (t.d. HODL-gjaldsumbønir, Boltz). Møguligt er at kannað útgjaldið seinni og tað verður eisini kannað sjálvvirkandi við jøvnum millumbilum.",server_management:"Ambætaraumsiting",base_url_label:"Fastbundin rótleinkja til hendan ambætaran",authentication:"Samgilding",auth_token_expiry_label:"Merkigildistíð í minuttum",auth_token_expiry_hint:"Minuttir ið merkir eru gildið",auth_authentication_cache_label:"Kovatíð (minuttir)",auth_authentication_cache_hint:"Minuttir ið eydnaðar samgildingar verða goymdar í kovanum (áset 0 fyri at óvirkja)",auth_allowed_methods_label:"Loyvdir samgildisháttir",auth_allowed_methods_hint:"Vel samgildisháttir",auth_nostr_label:"Nostr-umbønarleinkja",auth_nostr_hint:"Fullfíggjaðar leinkjur ið viðskiftarar skulu brúka til innritanir.",auth_google_ci_label:"Google-viðskiftaraeyðmerki",auth_google_ci_hint:"Tryggja at góðkenda víðaribeiningin inniheldur https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google-viðskiftaraloyna",auth_gh_client_id_label:"GitHub-viðskiftaraeyðmerki",auth_gh_client_id_hint:"Tryggja at samgildisafturtøkukallsleinkjan er sett til https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub-viðskiftaraloyna",auth_keycloak_label:"Keycloak-viðrakanarleinkja",auth_keycloak_ci_label:"Keycloak-viðskiftaraeyðmerki",auth_keycloak_ci_hint:"Tryggja at samgildisafturtøkukallsleinkjan er sett til https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak-viðskiftaraloyna",auth_keycloak_custom_org_label:"Tillaga Keycloak-felag",auth_keycloak_custom_icon_label:"Tillaga Keycloak ímynd (leinkja)",auth_oidc_label:"OIDC-viðrakanarleinkja",auth_oidc_ci_label:"OIDC-viðskiftaraeyðmerki",auth_oidc_ci_hint:"Tryggja at samgildisafturtøkukallsleinkjan er sett til https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC-viðskiftaraloyna",auth_oidc_custom_org_label:"Tillaga OIDC navn á felagi (t.d. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Tillaga OIDC ímynd (leinkja)",currency_settings:"Gjaldoyrastillingar",allowed_currencies:"Loyvd gjaldoyru",allowed_currencies_hint:"Avmarka tøk fiat gjaldoyru",default_account_currency:"Forsett roknskapargjaldoyra",default_account_currency_hint:"Forsett gjaldoyra til roknskaparførslu",min_incoming_payment_amount:"Inngjaldslágmark",min_incoming_payment_amount_desc:"Minst loyvda upphædd tá gjaldsumbøn verður gjørd",max_incoming_payment_amount:"Inngjaldshámark",max_incoming_payment_amount_desc:"Hægst loyvda upphædd tá gjaldsumbøn verður gjørd",max_outgoing_payment_amount:"Útgjaldshámark",max_outgoing_payment_amount_desc:"Hægst loyvda upphædd á hvørjum útgjaldi sær",service_fees:"Tænastuavgjøld",service_fee:"Tænastuavgjald",service_fee_label:"Tænastuavgjald (%)",service_fee_hint:"Avgjald kravt fyri hvørja flyting (%)",service_fee_max:"Hámark fyri tænastuavgjald",service_fee_max_label:"Hámark fyri tænastuavgjald (sats)",service_fee_max_hint:"Hámark fyri kravt tænastugjald í satoshis",fee_wallet:"Avgjaldsmappa",fee_wallet_label:"Avgjaldsmappa (mappueyðmerki)",fee_wallet_hint:"Eyðmerki á mappu ið tænastuavgjøld verða góðskrivað á",disable_fee:"Óvirkja tænastuavgjald",disable_fee_internal:"Óvirkja tænastuavgjald fyri innanknútsins gjøld",disable_fee_internal_desc:"Óvirkja tænastuavgjald fyri innanknútsins Lightning gjøld",ui_management:"Nýtslumótumsiting",ui_site_title:"Síðuheiti",ui_changing_remove_lnbits_elements:" (tillaging elvir til at LNbits-lutir á forsíðuni og síðufótinum verða strikaðir)",ui_site_tagline:"Síðuslagorð",ui_elements_enable:"Vís lutir á forsíðufótinum",ui_elements_disable:"Fjal lutir á forsíðufótinum",ui_toggle_elements_tip:"Strikar lutir so sum LNbits-útgávu og 'Koyrir á' frá forsíðuni",ui_site_description:"Síðulýsing",ui_site_description_hint:"Nýt vanligan tekst, Markdown, ella rátt HTML",ui_default_wallet_name:"Forsett mappunavn",ui_default_theme:"Forsett snið",wallet_featured_button_title:"Tillagaður knøttur á mappusíðuni",wallet_featured_button_label:"Tekstur á tillagaum knøtti",wallet_featured_button_label_hint:"Vís sermerktan knøtt á mappusíðuni",wallet_featured_button_url:"Leinkja ið tillagi knøtturin peikar á",wallet_featured_button_url_hint:"Leinkjan verður latin upp tá trýst verður á knøttin. Lat teigin verða tóman fyri at fjala knøttin.",wallet_featured_button_icon:"Ímynd á tillagaða knøttinum",wallet_featured_button_icon_hint:'Quasar-ímyndarnavnið ið skal vísast á knøttinum (t.d. "bolt")',lnbits_wallet:"LNbits-mappa",denomination:"Heiti",denomination_hint:"Heitið á FakeWallet-myntlíkinum",denomination_error:"Heitið skal verða 3 stavir, ella `sats`",ui_qr_code_logo:"Ímynd á QR-kotum og snarvegum",ui_qr_code_logo_hint:"Leinkja til ímynd ið skal brúkast á QR-kotum og snarvegum",ui_apple_touch_icon:"Apple Touch ímynd",ui_apple_touch_icon_hint:"Leinkja til Apple touch ímynd",ui_custom_image:"Tillagað mynd",ui_custom_image_label:"Leinkja til tillagaða mynd",ui_custom_image_hint:"Mynd víst á forsíðu/innritanarsíðu",ui_custom_badge_title:"Tillaga spjaldur",ui_custom_badge_desc:"Vís tillagaðan spjaldratekst ovast á LNbits síðuni",ui_custom_badge:"Tillagaður spjaldratekstur",ui_custom_badge_label:"Tillagaður spjaldratekstur 'BRÚKA VIÐ FYRIVARNI'",ui_custom_badge_color_label:"Litur á spjaldrinum",themes:"Snið",themes_hint:"Tilskilaði snið ið verða tøk fyri brúkarum",custom_logo:"Umsitaravalt búmerki",custom_logo_hint:"Leinkja ið peikar til búmerkið",ad_space_section_title:"Lýsingarteigur",ad_space_section_desc:"Tillaga lýsingarteigin á mappusíðuni.",ad_space_title:"Tekstur á lýsingarteigi",ad_space_title_hint:"Tekstur vístur omanfyri lýsingarteigin",ad_slots:"Lýsingar",ad_slots_hint:"Leinkjur og myndaleinkjur í CSV-forsniði. Tað er upp til hvørt ískoytisforrit sær at halda við stillingini.",ads_enabled:"Vís lýsingar",ads_disabled:"Fjal lýsingar",user_management:"Brúkaraumsiting",admin_users:"Umsitarir",admin_users_hint:"Brúkarar við umsitingarrættindum",admin_users_label:"Brúkaraeyðmerki",allowed_users:"Loyvdir brúkarar",allowed_users_hint:"Einans fylgjandi brúkarar kunnu nýta LNbits",allowed_users_hint_feature:"{feature} er avmarkað til hesar brúkararnar",allowed_users_label:"Brúkaraeyðmerki",allow_creation_user:"Loyv skráseting av nýggjum brúkarum",allow_creation_user_desc:"Loyv stovnan av nýggjum brúkarum umvegis forsíðuna",require_user_activation:"Krev virkjan av nýggjum brúkarum",require_user_activation_desc:"Nýggir brúkarir verða virktir við at lúka eina av váttanartreytunum. Umsitarir kunnu virkja brúkarir frá umsitanarsíðuni og harvið skúgva váttanartreytirnar til viks fyri brúkarar.",reusable_activation_code:"Endurnýtsluvirkjanarkota",reusable_activation_code_label:"Endurnýtsluvirkjanarkota",reusable_activation_code_hint:"Hendan virkjanarkotan kann nýtast fleiri ferðir av ymiskum brúkarum.",one_time_activation_code:"Einnýtisvirkjanarkotur",one_time_activation_code_label:"Legg virkjanarkotu inn",one_time_activation_code_hint:"Einnýtisvirkjanarkotur. Hvør kota kann bert nýtast einaferð og verður strika úr listanum eftir at hon er brúkt.",invitation_code:"Innbjóðingarkota",invitation_code_hint:"Innbjóðingarkotan ið tú hevur fingið.",new_user_not_allowed:"Skráseting av nýggjum brúkarum er óvirkt.",start_user_impersonation:"Lát at vera hesin brúkarin",stop_user_impersonation:"Lát ikki longur at vera brúkari",components:"Forritsliðir",long_running_endpoints:"5 endapunktini ið hava koyrt longst",http_request_methods:"HTTP-umbønarháttir",http_response_codes:"HTTP-svarkotur",request_details:"Smálutir umbønarinnar",http_request_details:"HTTP-umbønarsmálutir",payment_details:"Gjaldssmálutir",payment_details_desc:"Nágreiniligir staklutir gjaldsins",payments:"Gjøld",payment_show_internal:"Vís innanhýsis gjøld",payment_chart_flow:"Mánaðarligur peningastreymur",payment_chart_status:"Gjaldstøður",payment_chart_tx_per_wallet:"Flytingar fyri hvørja mappu (upphædd/nøgd)",payment_details_back:"Aftur til gjøld",payment_chart_tags:"Gjøld eftir spjøldrum",payments_balance_in_out:"Inn- og útgjaldsupphæddir",payments_count_in_out:"Nøgd av inn- og útgjøldum",payments_status_chart:"Støðumynd",payments_tag_chart:"Spjaldrasirkulmynd",payments_balance_chart:"Saldulinjumynd",payments_wallets_chart:"Mappumynd",payments_balance_in_out_chart:"Inn- og útgjaldsupphæddir",payments_count_in_out_chart:"Nøgd av inn- og útgjøldum",reset_wallet_keys:"Endurset lyklar",reset_wallet_keys_desc:"Endurset API lyklarnar fyri mappuna. Hetta ógildar verandi lyklar og framleiður nýggjar lyklar.",view_list:"Vís mappur í lista",view_column:"Vís mappur í teigum",filter_payments:"Filtrera gjøld",filter_labels:"Filtrera spjøldur",filter_date:"Filtrera út frá tíðarskeiði",websocket_example:"Vevsokkul dømi",client_id:"Viðskiftaraeyðmerki",secret_key:"Loyniligur lykil",signing_secret:"Undirritanarlykil",signing_secret_hint:"Undirritanarlykil fyri vevongulin. Boð verða undirritaði við hesum lyklinum.",webhook_id:"Vevongulseyðmerki",webhook_id_hint:"PayPal-vevongulseyðmerki ið váttar inngangandi hendingar.",webhook_paypal_description:"Uppset ein vevongul ið peikar á tín LNbits-ambætara á PayPal-síðuni.",square_webhook_signature_key_hint:"Square-vevongulsundirritanarlykil ið váttar inngandi hendingar.",callback_success_url:"Afturtøkukallsleinkja",callback_success_url_hint:"Eftir avgreitt gjald verður brúkarin víðaribeindur til hesa leinkjuna",connected:"Sambundin",not_connected:"Ikki sambundin",free:"Ókeypis",paid:"Til keyps",funding_source_retries:"Hámark av endurroyndum",funding_source_retries_desc:"Hámark av endurroyndum av knýta í fíggingarkelduna áðrenn VoidWallet verður virkt.",add_label:"Nýtt spjaldur",label:"Spjaldur",labels:"Spjøldur",label_filter:"Spjaldrafiltur",no_labels_defined:"Enn eru eingi spjøldur gjørd",manage_labels:"Umsit spjøldur",update_label:"Broyt spjaldur",delete_label:"Strika spjaldur",add_remove_labels:"Áset ella strika spøldur",payment_labels_updated:"Spjøldur á gjaldi broytt",color:"Litur",sort:"Raða",sort_by:"Raða eftir"},window._lnbitsUtils={url_for(e){const t=new URL(e,window.location.origin);return t.searchParams.set("v",window.g.settings.cacheKey),t.toString()},loadScript(e){return new Promise((t,n)=>{const a=document.createElement("script");a.src=this.url_for(e),a.onload=()=>{t()},a.onerror=()=>{n(new Error(`Failed to load script ${e}`))},document.body.appendChild(a)})},async loadTemplate(e){return fetch(this.url_for(e)).then(t=>{if(!t.ok)throw new Error(`Failed to load template from ${e}`);return t.text()}).then(e=>{const t=document.createElement("div");t.innerHTML=e.trim(),document.body.appendChild(t)})},copyText(e,t,n){Quasar.copyToClipboard(e).then(()=>{Quasar.Notify.create({message:t||"Copied to clipboard!",position:n||"bottom"})})},confirmDialog:e=>Quasar.Dialog.create({message:e,ok:{flat:!0,color:"orange"},cancel:{flat:!0,color:"grey"}}),async logout(){LNbits.utils.confirmDialog('Do you really want to logout? Please visit "My Account" page to check your credentials!').onOk(async()=>{try{await LNbits.api.logout(),window.location="/"}catch(e){LNbits.utils.notifyApiError(e)}})},backupLocalStorage(e,t=!1){const n=Object.entries(Quasar.LocalStorage.getAll()).filter(([t,n])=>t.startsWith("lnbits.")&&t!==`lnbits.${e}`)||[];Quasar.LocalStorage.setItem(`lnbits.${e}`,n),t&&n.forEach(([e,t])=>Quasar.LocalStorage.remove(e))},restoreLocalStorage(e){Object.entries(Quasar.LocalStorage.getAll()).filter(([t,n])=>t.startsWith("lnbits.")&&t!==`lnbits.${e}`).forEach(([e,t])=>Quasar.LocalStorage.remove(e));(Quasar.LocalStorage.getItem(`lnbits.${e}`)||[]).forEach(([e,t])=>Quasar.LocalStorage.setItem(e,t)),Quasar.LocalStorage.remove(`lnbits.${e}`)},async digestMessage(e){const t=(new TextEncoder).encode(e),n=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,"0")).join("")},formatTimestamp:(e,t=null)=>(t=t||window.dateFormat,Quasar.date.formatDate(new Date(1e3*e),t)),formatDateString(e){this.formatDate(e)},formatDate:(e,t=null)=>(t=t||window.dateFormat,Quasar.date.formatDate(new Date(e),t)),formatTimestampFrom:e=>moment.utc(1e3*e).local().fromNow(),formatDateFrom(e){const t=new Date(e).getTime();return moment.utc(t).local().fromNow()},formatBalance:(e,t="sats")=>"sats"===t?LNbits.utils.formatSat(e)+" sats":LNbits.utils.formatCurrency(e/100,t),formatCurrency:(e,t)=>new Intl.NumberFormat(window.i18n.global.locale,{style:"currency",currency:t||"sat"}).format(e),getCurrencySymbol(e){const t=(e||"").toUpperCase();if("BTC"===t||"XBT"===t||"SAT"===t||"SATS"===t)return"₿";try{const e=new Intl.NumberFormat(window.i18n.global.locale,{style:"currency",currency:t}).formatToParts(0).find(e=>"currency"===e.type);return e?.value||t||"¤"}catch(e){return t||"¤"}},formatSat:e=>new Intl.NumberFormat(window.i18n.global.locale).format(e),formatMsat(e){return this.formatSat(e/1e3)},parseJSONSafe(e){try{return JSON.parse(e)}catch(e){return null}},isValidBech32(e){if("string"!=typeof e)return!1;const t=e.trim();if(!t||t!==t.toLowerCase()&&t!==t.toUpperCase())return!1;const n=t.toLowerCase(),a=n.lastIndexOf("1");if(a<=0)return!1;const i=n.substring(0,a),r=n.substring(a+1);if(r.length<6)return!1;if("function"!=typeof bech32ToFiveBitArray||"function"!=typeof verify_checksum)return!1;const o=bech32ToFiveBitArray(r);return!o.some(e=>e<0)&&verify_checksum(i,o)},async notifyApiError(e){if(!e.response)return console.error(e);const t={400:"warning",401:"warning",500:"negative"};let n=e.response.data.detail;if(!n){const t=await(e.response.data?.text());n=this.parseJSONSafe(t)?.detail}n=n?Array.isArray(n)?n.map(e=>e.msg+` (${e.loc?.join("/")})`):n=[n]:[e.response.data.message||e.response.data.detail],n.forEach(n=>Quasar.Notify.create({timeout:5e3,type:t[e.response.status]||"warning",message:n,caption:[e.response.status," ",e.response.statusText].join("").toUpperCase()||null,icon:null,closeBtn:!0}))},search(e,t,n,a){try{const i=t.toLowerCase().split(a||" ");return e.filter(e=>{let t=0;return _.each(i,a=>{-1!==e[n].indexOf(a)&&t++}),t===i.length})}catch(t){return e}},prepareFilterQuery(e,t,n){e.filter=n||e.filter||{},t&&(e.pagination=t.pagination,Object.assign(e.filter,t.filter));const a=e.pagination;e.loading=!0;const i={limit:a.rowsPerPage,offset:(a.page-1)*a.rowsPerPage,sortby:a.sortBy??"",direction:a.descending?"desc":"asc",...e.filter};return e.search&&(i.search=e.search),new URLSearchParams(i)},exportCSV(e,t,n){const a=(e,t)=>{let n=void 0!==t?t(e):e;return n=null==n?"":String(n),n=n.split('"').join('""'),`"${n}"`},i=[e.map(e=>a(e.label))].concat(t.map(t=>e.map(e=>a("function"==typeof e.field?e.field(t):t[void 0===e.field?e.name:e.field],e.format)).join(","))).join("\r\n");!0!==Quasar.exportFile(`${n||"table-export"}.csv`,i,"text/csv")&&Quasar.Notify.create({message:"Browser denied file download...",color:"negative",icon:null})},convertMarkdown(e){const t=new showdown.Converter;return t.setFlavor("github"),t.setOption("simpleLineBreaks",!0),t.makeHtml(e)},_extI18nDirs:new Set,_extI18nLoaded:{},loadExtI18n(e,t){this._extI18nDirs.add(e);const n=this._extI18nLoaded[e]??={};return n[t]||(n[t]=this.loadScript(`${e}/${t}.js`).catch(()=>{if("en"!==t)return n.en??=this.loadScript(`${e}/en.js`).catch(()=>{}),n.en})),n[t]},async decryptLnurlPayAES(e,t){let n=new Uint8Array(t.match(/[\da-f]{2}/gi).map(e=>parseInt(e,16)));return crypto.subtle.importKey("raw",n,{name:"AES-CBC",length:256},!1,["decrypt"]).then(t=>{let n=Uint8Array.from(window.atob(e.iv),e=>e.charCodeAt(0)),a=Uint8Array.from(window.atob(e.ciphertext),e=>e.charCodeAt(0));return crypto.subtle.decrypt({name:"AES-CBC",iv:n},t,a)}).then(e=>new TextDecoder("utf-8").decode(e))},validateBrowsableUrl(e,t=!1){const n=new URL(e);if("http:"!==n.protocol&&"https:"!==n.protocol)throw new Error("Invalid protocol");if(!t){const e=n.hostname;if("localhost"===e||"[::1]"===e||"::1"===e||e.startsWith("127.")||e.startsWith("::ffff:127."))throw new Error("Loopback addresses are not allowed")}},openUrlInNewTab(e,t=!1){this.validateBrowsableUrl(e,t),window.open(e,"_blank","noopener,noreferrer")}},window._lnbitsApi={request:(e,t,n,a,i={})=>axios({method:e,url:t,headers:{"X-Api-Key":n},data:a,...i}),getServerHealth(){return this.request("get","/api/v1/health")},async createInvoice(e,t,n,a="sat",i=null,r=null,o=null,s=null){const l={out:!1,amount:t,memo:n,unit:a,lnurl_withdraw:i,fiat_provider:r,payment_hash:s};return o&&(l.extra={internal_memo:String(o)}),this.request("post","/api/v1/payments",e.inkey,l)},payInvoice(e,t,n=null){const a={out:!0,bolt11:t};return n&&(a.extra={internal_memo:String(n)}),this.request("post","/api/v1/payments",e.adminkey,a)},cancelInvoice(e,t){return this.request("post","/api/v1/payments/cancel",e.adminkey,{payment_hash:t})},settleInvoice(e,t){return this.request("post","/api/v1/payments/settle",e.adminkey,{preimage:t})},createAccount(e){return this.request("post","/api/v1/account",null,{name:e})},register:(e,t,n,a,i)=>axios({method:"POST",url:"/api/v1/auth/register",data:{username:e,email:t,password:n,password_repeat:a,invitation_code:i}}),reset:(e,t,n)=>axios({method:"PUT",url:"/api/v1/auth/reset",data:{reset_key:e,password:t,password_repeat:n}}),getAuthUser:()=>axios({method:"GET",url:"/api/v1/auth"}),login:(e,t)=>axios({method:"POST",url:"/api/v1/auth",data:{username:e,password:t}}),loginByProvider:(e,t,n)=>axios({method:"POST",url:`/api/v1/auth/${e}`,headers:t,data:n}),loginUsr:e=>axios({method:"POST",url:"/api/v1/auth/usr",data:{usr:e}}),logout:()=>axios({method:"POST",url:"/api/v1/auth/logout"}),impersonateUser:e=>axios({method:"POST",url:"/api/v1/auth/impersonate",data:{usr:e}}),stopImpersonation:()=>axios({method:"DELETE",url:"/api/v1/auth/impersonate"}),getAuthenticatedUser(){return this.request("get","/api/v1/auth")},getWallet(e){return this.request("get","/api/v1/wallet",e.inkey)},createWallet(e,t,n={}){return this.request("post","/api/v1/wallet",null,{name:e,wallet_type:t,...n})},updateWallet(e,t){return this.request("patch","/api/v1/wallet",t.adminkey,{name:e})},updateUiCustomization(e={}){return this.request("patch","/api/v1/auth/ui",null,e)},resetWalletKeys(e){return this.request("put",`/api/v1/wallet/reset/${e.id}`).then(e=>e.data)},deleteWallet(e){return this.request("delete",`/api/v1/wallet/${e.id}`)},getPayments(e,t){return this.request("get","/api/v1/payments/paginated?"+t,e.inkey)},getPaymentTotalBreakdown(e){return this.request("get","/api/v1/payments/stats/breakdown",e.inkey)},getPayment(e,t){return this.request("get","/api/v1/payments/"+t,e.inkey)},updateBalance(e,t){return this.request("PUT","/users/api/v1/balance",null,{amount:e,id:t})},getCurrencies(){return this.request("GET","/api/v1/currencies").then(e=>["sats",...e.data])},getDefaultSetting:e=>LNbits.api.request("GET",`/admin/api/v1/settings/default?field_name=${e}`).catch(LNbits.utils.notifyApiError),getBlockexplorerAddress(e){return this.request("get",`/blockexplorer/api/v1/address/${e}`)},getBlockexplorerTransaction(e){return this.request("get",`/blockexplorer/api/v1/tx/${e}`)},getBlockexplorerUtxos(e){return this.request("get",`/blockexplorer/api/v1/utxos/${e}`)}};const localStore=(e,t)=>{const n=Quasar.LocalStorage.getItem(e);return null!==n&&"null"!==n&&void 0!==n&&"undefined"!==n?n:t};window.g=Vue.reactive({settings:SETTINGS,currencies:CURRENCIES,extensions:SETTINGS.extensions,allowedCurrencies:SETTINGS.allowedCurrencies,denomination:SETTINGS.denomination,isSatsDenomination:"sats"==SETTINGS.denomination,themeChoice:localStore("lnbits.theme",SETTINGS.defaultTheme),borderChoice:localStore("lnbits.border",SETTINGS.defaultBorder),gradientChoice:localStore("lnbits.gradientBg",SETTINGS.defaultGradient),cardRoundedChoice:localStore("lnbits.cardRounded",SETTINGS.defaultCardRounded),cardGradientChoice:localStore("lnbits.cardGradient",SETTINGS.defaultCardGradient),cardShadowChoice:localStore("lnbits.cardShadow",SETTINGS.defaultCardShadow),burgerMenuChoice:localStore("lnbits.burgerMenu",SETTINGS.defaultBurgerMenuBackground),reactionChoice:localStore("lnbits.reactions",SETTINGS.defaultReaction),bgimageChoice:localStore("lnbits.backgroundImage",SETTINGS.defaultBgimage||""),locale:localStore("lnbits.lang",navigator.languages[1]??"en"),disclaimerShown:localStore("lnbits.disclaimerShown",!1),isFiatPriority:localStore("lnbits.isFiatPriority",!1),mobileSimple:localStore("lnbits.mobileSimple",!0),walletFlip:localStore("lnbits.walletFlip",!1),lastActiveWallet:localStore("lnbits.lastActiveWallet",null),darkChoice:localStore("lnbits.darkMode",SETTINGS.defaultDark),isUserAuthorized:!!Quasar.Cookies.get("is_lnbits_user_authorized"),isUserImpersonated:!!Quasar.Cookies.get("is_lnbits_user_impersonated"),errorCode:null,errorMessage:null,user:null,wallet:null,isPublicPage:!0,offline:!navigator.onLine,hasCamera:!1,visibleDrawer:!1,fiatBalance:0,exchangeRate:0,fiatTracking:!1,payments:[],walletEventListeners:[],updatePayments:!1,updatePaymentsHash:!1,scanner:null,newWalletType:null}),window.dateFormat="YYYY-MM-DD HH:mm";const websocketPrefix="http:"===window.location.protocol?"ws://":"wss://",websocketUrl=`${websocketPrefix}${window.location.host}/api/v1/ws`,_access_cookies_for_safari_refresh_do_not_delete=document.cookie;function eventReaction(e){localUrl="";const t=Quasar.LocalStorage.getItem("lnbits.reactions")||SETTINGS.defaultReaction;if(t&&"none"!==t.toLowerCase())try{if(e<0)return;"function"==typeof window[t]&&window[t]()}catch(e){console.log(e)}}function confettiTop(){document.getElementById("vue").disabled=!0;var e=Date.now()+200,t=[localStorage.getItem("lnbits.primaryColor")||"#FFD700",localStorage.getItem("lnbits.secondaryColor")||"E89400","#ffffff"];!function n(){confetti({particleCount:3,angle:270,spread:1e3,origin:{y:0},colors:t,zIndex:999999}),Date.now().5?1:-1,i=3+Math.floor(4*Math.random());for(let e=1;e<=i;e++)n.push({x:t.x+a*e*(18+22*Math.random()),y:t.y+e*(14+18*Math.random())});s.push(n)}let l=0;function u(e,n,a){t.beginPath(),t.moveTo(e[0].x,e[0].y),e.slice(1).forEach(e=>t.lineTo(e.x,e.y)),t.strokeStyle=`rgba(170, 220, 255, ${a})`,t.lineWidth=n,t.lineJoin="round",t.lineCap="round",t.shadowBlur=18,t.shadowColor="#7dd3fc",t.stroke(),t.strokeStyle=`rgba(255, 255, 255, ${Math.min(1,a+.2)})`,t.lineWidth=Math.max(1,.35*n),t.shadowBlur=4,t.stroke()}!function n(){const a=1-l/48;t.clearRect(0,0,window.innerWidth,window.innerHeight),l<3&&(t.fillStyle=`rgba(255, 255, 255, ${.22-.06*l})`,t.fillRect(0,0,window.innerWidth,window.innerHeight)),u(o,5*a+1,a),s.forEach(e=>u(e,2.5*a+.5,.75*a)),l+=1,l<=48?requestAnimationFrame(n):e.remove()}()}function decode(e){let t=e.toLowerCase(),n=t.lastIndexOf("1"),a=t.substring(0,n),i=t.substring(n+1,t.length-6),r=t.substring(t.length-6,t.length);if(!verify_checksum(a,bech32ToFiveBitArray(i+r)))throw"Malformed request: checksum is incorrect";return{human_readable_part:decodeHumanReadablePart(a),data:decodeData(i,a),checksum:r}}function decodeHumanReadablePart(e){let t;if(["lnbc","lntb","lnbcrt","lnsb","lntbs"].forEach(n=>{e.substring(0,n.length)===n&&(t=n)}),null==t)throw"Malformed request: unknown prefix";let n=decodeAmount(e.substring(t.length,e.length));return{prefix:t,amount:n}}function decodeData(e,t){let n=e.substring(0,7),a=bech32ToInt(n),i=e.substring(e.length-104,e.length),r=e.substring(7,e.length-104),o=decodeTags(r),s=bech32ToFiveBitArray(n+r);return s=fiveBitArrayTo8BitArray(s,!0),s=textToHexString(t).concat(byteArrayToHexString(s)),{time_stamp:a,tags:o,signature:decodeSignature(i),signing_data:s}}function decodeSignature(e){let t=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(e)),n=t[t.length-1];return{r:byteArrayToHexString(t.slice(0,32)),s:byteArrayToHexString(t.slice(32,t.length-1)),recovery_flag:n}}function decodeAmount(e){let t=e.charAt(e.length-1),n=e.substring(0,e.length-1);if("0"===n.substring(0,1))throw"Malformed request: amount cannot contain leading zeros";if(n=Number(n),n<0||!Number.isInteger(n))throw"Malformed request: amount must be a positive decimal integer";switch(t){case"":return"Any amount";case"p":return n/10;case"n":return 100*n;case"u":return 1e5*n;case"m":return 1e8*n;default:throw"Malformed request: undefined amount multiplier"}}function decodeTags(e){let t=extractTags(e),n=[];return t.forEach(e=>n.push(decodeTag(e.type,e.length,e.data))),n}function extractTags(e){let t=[];for(;e.length>0;){let n=e.charAt(0),a=bech32ToInt(e.substring(1,3)),i=e.substring(3,a+3);t.push({type:n,length:a,data:i}),e=e.substring(3+a,e.length)}return t}function decodeTag(e,t,n){switch(e){case"p":if(52!==t)break;return{type:e,length:t,description:"payment_hash",value:byteArrayToHexString(fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n)))};case"d":return{type:e,length:t,description:"description",value:bech32ToUTF8String(n)};case"n":if(53!==t)break;return{type:e,length:t,description:"payee_public_key",value:byteArrayToHexString(fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n)))};case"h":if(52!==t)break;return{type:e,length:t,description:"description_hash",value:n};case"x":return{type:e,length:t,description:"expiry",value:bech32ToInt(n)};case"c":return{type:e,length:t,description:"min_final_cltv_expiry",value:bech32ToInt(n)};case"f":let a=bech32ToFiveBitArray(n.charAt(0))[0];if(a<0||a>18)break;return{type:e,length:t,description:"fallback_address",value:{version:a,fallback_address:n=n.substring(1,n.length)}};case"r":let i=(n=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n))).slice(0,33),r=n.slice(33,41),o=n.slice(41,45),s=n.slice(45,49),l=n.slice(49,51);return{type:e,length:t,description:"routing_information",value:{public_key:byteArrayToHexString(i),short_channel_id:byteArrayToHexString(r),fee_base_msat:byteArrayToInt(o),fee_proportional_millionths:byteArrayToInt(s),cltv_expiry_delta:byteArrayToInt(l)}}}}function polymod(e){let t=[996825010,642813549,513874426,1027748829,705979059],n=1;return e.forEach(e=>{let a=n>>25;n=(33554431&n)<<5^e;for(let e=0;e<5;e++)n^=1==(a>>e&1)?t[e]:0}),n}function expand(e){let t=[];for(let n=0;n>5);t.push(0);for(let n=0;n{console.log("offline",e),this.g.offline=!0}),addEventListener("online",e=>{console.log("back online",e),this.g.offline=!1}),null!=navigator.serviceWorker&&navigator.serviceWorker.register("/service-worker.js").then(e=>{console.log("Registered events at scope: ",e.scope)}),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices&&navigator.mediaDevices.enumerateDevices().then(e=>{window.g.hasCamera=e.some(e=>"videoinput"===e.kind)}),window.LNbits={g:window.g,utils:window._lnbitsUtils,api:window._lnbitsApi,map:{user(e){const t={id:e.id,username:e.username,admin:e.admin,email:e.email,extensions:e.extensions,wallets:e.wallets,fiat_providers:e.fiat_providers||[],super_user:e.super_user,extra:e.extra??{},hasPassword:e.has_password??!1,uiCustomization:e.ui_customization||{}},n=this.wallet;return t.wallets=t.wallets.map(n).sort((e,t)=>e.extra.pinned!==t.extra.pinned?e.extra.pinned?-1:1:e.name.localeCompare(t.name)),t.walletOptions=t.wallets.map(e=>({label:[e.name," - ",e.id.substring(0,5),"..."].join(""),value:e.id})),t.hiddenWalletsCount=Math.max(0,e.wallets.length-e.extra.visible_wallet_count),t.walletInvitesCount=e.extra.wallet_invite_requests?.length||0,t},wallet(e){if(newWallet={id:e.id,name:e.name,walletType:e.wallet_type,sharePermissions:e.share_permissions,sharedWalletId:e.shared_wallet_id,adminkey:e.adminkey,inkey:e.inkey,currency:e.currency,lightningAddress:e.lightning_address,extra:e.extra,canReceivePayments:!0,canSendPayments:!0},newWallet.msat=e.balance_msat,newWallet.sat=Math.floor(e.balance_msat/1e3),"lightning-shared"===newWallet.walletType){const e=newWallet.sharePermissions;newWallet.canReceivePayments=e.includes("receive-payments"),newWallet.canSendPayments=e.includes("send-payments")}return newWallet.url=`/wallet?&wal=${e.id}`,newWallet.lightningAddressFull=newWallet.lightningAddress?`${newWallet.lightningAddress}@${window.location.host}`:null,newWallet.storedPaylinks=e.stored_paylinks.links,newWallet}}},window.windowMixin={},function(e,t){!function e(t,n,a,i){var r=!!(t.Worker&&t.Blob&&t.Promise&&t.OffscreenCanvas&&t.OffscreenCanvasRenderingContext2D&&t.HTMLCanvasElement&&t.HTMLCanvasElement.prototype.transferControlToOffscreen&&t.URL&&t.URL.createObjectURL);function o(){}function s(e){var a=n.exports.Promise,i=void 0!==a?a:t.Promise;return"function"==typeof i?new i(e):(e(o,o),null)}var l,u,c,d,h,p,f,m,_=(c=Math.floor(1e3/60),d={},h=0,"function"==typeof requestAnimationFrame&&"function"==typeof cancelAnimationFrame?(l=function(e){var t=Math.random();return d[t]=requestAnimationFrame(function n(a){h===a||h+c-1{a=(a<<5)+e,n+=5,n>=8&&(i.push(a>>n-8&255),n-=8)}),t&&n>0&&i.push(a<<8-n&255),i}function bech32ToUTF8String(e){let t=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(e)),n="";for(let e=0;e20&&(t-=20,e/=Math.pow(10,t),e+=new Array(t+1).join("0"));return e} \ No newline at end of file + */function ve(e){return e+.5|0}const be=(e,t,n)=>Math.max(Math.min(e,n),t);function ye(e){return be(ve(2.55*e),0,255)}function we(e){return be(ve(255*e),0,255)}function ke(e){return be(ve(e/2.55)/100,0,1)}function xe(e){return be(ve(100*e),0,100)}const Se={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Ce=[..."0123456789ABCDEF"],Te=e=>Ce[15&e],Pe=e=>Ce[(240&e)>>4]+Ce[15&e],Ee=e=>(240&e)>>4==(15&e);const Ae=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Le(e,t,n){const a=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-a*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function Me(e,t,n){const a=(a,i=(a+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[a(5),a(3),a(1)]}function Re(e,t,n){const a=Le(e,1,.5);let i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)a[i]*=1-t-n,a[i]+=t;return a}function ze(e){const t=e.r/255,n=e.g/255,a=e.b/255,i=Math.max(t,n,a),o=Math.min(t,n,a),r=(i+o)/2;let s,l,u;return i!==o&&(u=i-o,l=r>.5?u/(2-i-o):u/(i+o),s=function(e,t,n,a,i){return e===i?(t-n)/a+(te<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055,$e=e=>e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4);function Ve(e,t,n){if(e){let a=ze(e);a[t]=Math.max(0,Math.min(a[t]+a[t]*n,0===t?360:1)),a=Ie(a),e.r=a[0],e.g=a[1],e.b=a[2]}}function Ue(e,t){return e?Object.assign(t||{},e):e}function He(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=we(e[3]))):(t=Ue(e,{r:0,g:0,b:0,a:1})).a=we(t.a),t}function We(e){return"r"===e.charAt(0)?function(e){const t=Be.exec(e);let n,a,i,o=255;if(t){if(t[7]!==n){const e=+t[7];o=t[8]?ye(e):be(255*e,0,255)}return n=+t[1],a=+t[3],i=+t[5],n=255&(t[2]?ye(n):be(n,0,255)),a=255&(t[4]?ye(a):be(a,0,255)),i=255&(t[6]?ye(i):be(i,0,255)),{r:n,g:a,b:i,a:o}}}(e):function(e){const t=Ae.exec(e);let n,a=255;if(!t)return;t[5]!==n&&(a=t[6]?ye(+t[5]):we(+t[5]));const i=Ne(+t[2]),o=+t[3]/100,r=+t[4]/100;return n="hwb"===t[1]?function(e,t,n){return Oe(Re,e,t,n)}(i,o,r):"hsv"===t[1]?function(e,t,n){return Oe(Me,e,t,n)}(i,o,r):Ie(i,o,r),{r:n[0],g:n[1],b:n[2],a:a}}(e)}class Ge{constructor(e){if(e instanceof Ge)return e;const t=typeof e;let n;var a,i,o;"object"===t?n=He(e):"string"===t&&(o=(a=e).length,"#"===a[0]&&(4===o||5===o?i={r:255&17*Se[a[1]],g:255&17*Se[a[2]],b:255&17*Se[a[3]],a:5===o?17*Se[a[4]]:255}:7!==o&&9!==o||(i={r:Se[a[1]]<<4|Se[a[2]],g:Se[a[3]]<<4|Se[a[4]],b:Se[a[5]]<<4|Se[a[6]],a:9===o?Se[a[7]]<<4|Se[a[8]]:255})),n=i||function(e){je||(je=function(){const e={},t=Object.keys(qe),n=Object.keys(De);let a,i,o,r,s;for(a=0;a>16&255,o>>8&255,255&o]}return e}(),je.transparent=[0,0,0,0]);const t=je[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:4===t.length?t[3]:255}}(e)||We(e)),this._rgb=n,this._valid=!!n}get valid(){return this._valid}get rgb(){var e=Ue(this._rgb);return e&&(e.a=ke(e.a)),e}set rgb(e){this._rgb=He(e)}rgbString(){return this._valid?(e=this._rgb)&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${ke(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`):void 0;var e}hexString(){return this._valid?function(e){var t=(e=>Ee(e.r)&&Ee(e.g)&&Ee(e.b)&&Ee(e.a))(e)?Te:Pe;return e?"#"+t(e.r)+t(e.g)+t(e.b)+((e,t)=>e<255?t(e):"")(e.a,t):void 0}(this._rgb):void 0}hslString(){return this._valid?function(e){if(!e)return;const t=ze(e),n=t[0],a=xe(t[1]),i=xe(t[2]);return e.a<255?`hsla(${n}, ${a}%, ${i}%, ${ke(e.a)})`:`hsl(${n}, ${a}%, ${i}%)`}(this._rgb):void 0}mix(e,t){if(e){const n=this.rgb,a=e.rgb;let i;const o=t===i?.5:t,r=2*o-1,s=n.a-a.a,l=((r*s==-1?r:(r+s)/(1+r*s))+1)/2;i=1-l,n.r=255&l*n.r+i*a.r+.5,n.g=255&l*n.g+i*a.g+.5,n.b=255&l*n.b+i*a.b+.5,n.a=o*n.a+(1-o)*a.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=function(e,t,n){const a=$e(ke(e.r)),i=$e(ke(e.g)),o=$e(ke(e.b));return{r:we(Fe(a+n*($e(ke(t.r))-a))),g:we(Fe(i+n*($e(ke(t.g))-i))),b:we(Fe(o+n*($e(ke(t.b))-o))),a:e.a+n*(t.a-e.a)}}(this._rgb,e._rgb,t)),this}clone(){return new Ge(this.rgb)}alpha(e){return this._rgb.a=we(e),this}clearer(e){return this._rgb.a*=1-e,this}greyscale(){const e=this._rgb,t=ve(.3*e.r+.59*e.g+.11*e.b);return e.r=e.g=e.b=t,this}opaquer(e){return this._rgb.a*=1+e,this}negate(){const e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return Ve(this._rgb,2,e),this}darken(e){return Ve(this._rgb,2,-e),this}saturate(e){return Ve(this._rgb,1,e),this}desaturate(e){return Ve(this._rgb,1,-e),this}rotate(e){return function(e,t){var n=ze(e);n[0]=Ne(n[0]+t),n=Ie(n),e.r=n[0],e.g=n[1],e.b=n[2]}(this._rgb,e),this}}function Ke(e){if(e&&"object"==typeof e){const t=e.toString();return"[object CanvasPattern]"===t||"[object CanvasGradient]"===t}return!1}function Ye(e){return Ke(e)?e:new Ge(e)}function Qe(e){return Ke(e)?e:new Ge(e).saturate(.5).darken(.1).hexString()}const Ze=["x","y","borderWidth","radius","tension"],Je=["color","borderColor","backgroundColor"],Xe=new Map;function et(e,t,n){return function(e,t){t=t||{};const n=e+JSON.stringify(t);let a=Xe.get(n);return a||(a=new Intl.NumberFormat(e,t),Xe.set(n,a)),a}(t,n).format(e)}const tt={values:e=>i(e)?e:""+e,numeric(e,t,n){if(0===e)return"0";const a=this.chart.options.locale;let i,o=e;if(n.length>1){const t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>1e15)&&(i="scientific"),o=function(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}(e,n)}const r=N(Math.abs(o)),s=isNaN(r)?1:Math.max(Math.min(-1*Math.floor(r),20),0),l={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(l,this.options.ticks.format),et(e,a,l)},logarithmic(e,t,n){if(0===e)return"0";const a=n[t].significand||e/Math.pow(10,Math.floor(N(e)));return[1,2,3,5,10,15].includes(a)||t>.8*n.length?tt.numeric.call(this,e,t,n):""}};var nt={formatters:tt};const at=Object.create(null),it=Object.create(null);function ot(e,t){if(!t)return e;const n=t.split(".");for(let t=0,a=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>Qe(t.backgroundColor),this.hoverBorderColor=(e,t)=>Qe(t.borderColor),this.hoverColor=(e,t)=>Qe(t.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return rt(this,e,t)}get(e){return ot(this,e)}describe(e,t){return rt(it,e,t)}override(e,t){return rt(at,e,t)}route(e,t,n,a){const i=ot(this,e),r=ot(this,n),s="_"+t;Object.defineProperties(i,{[s]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){const e=this[s],t=r[a];return o(e)?Object.assign({},t,e):l(e,t)},set(e){this[s]=e}}})}apply(e){e.forEach(e=>e(this))}}({_scriptable:e=>!e.startsWith("on"),_indexable:e=>"events"!==e,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(e){e.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:e=>"onProgress"!==e&&"onComplete"!==e&&"fn"!==e}),e.set("animations",{colors:{type:"color",properties:Je},numbers:{type:"number",properties:Ze}}),e.describe("animations",{_fallback:"animation"}),e.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:e=>0|e}}}})},function(e){e.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(e){e.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:nt.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),e.route("scale.ticks","color","","color"),e.route("scale.grid","color","","borderColor"),e.route("scale.border","color","","borderColor"),e.route("scale.title","color","","color"),e.describe("scale",{_fallback:!1,_scriptable:e=>!e.startsWith("before")&&!e.startsWith("after")&&"callback"!==e&&"parser"!==e,_indexable:e=>"borderDash"!==e&&"tickBorderDash"!==e&&"dash"!==e}),e.describe("scales",{_fallback:"scale"}),e.describe("scale.ticks",{_scriptable:e=>"backdropPadding"!==e&&"callback"!==e,_indexable:e=>"backdropPadding"!==e})}]);function lt(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ut(e){let t=e.parentNode;return t&&"[object ShadowRoot]"===t.toString()&&(t=t.host),t}function ct(e,t,n){let a;return"string"==typeof e?(a=parseInt(e,10),-1!==e.indexOf("%")&&(a=a/100*t.parentNode[n])):a=e,a}const dt=e=>e.ownerDocument.defaultView.getComputedStyle(e,null);function ht(e,t){return dt(e).getPropertyValue(t)}const pt=["top","right","bottom","left"];function ft(e,t,n){const a={};n=n?"-"+n:"";for(let i=0;i<4;i++){const o=pt[i];a[o]=parseFloat(e[t+"-"+o+n])||0}return a.width=a.left+a.right,a.height=a.top+a.bottom,a}function mt(e,t){if("native"in e)return e;const{canvas:n,currentDevicePixelRatio:a}=t,i=dt(n),o="border-box"===i.boxSizing,r=ft(i,"padding"),s=ft(i,"border","width"),{x:l,y:u,box:c}=function(e,t){const n=e.touches,a=n&&n.length?n[0]:e,{offsetX:i,offsetY:o}=a;let r,s,l=!1;if(((e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot))(i,o,e.target))r=i,s=o;else{const e=t.getBoundingClientRect();r=a.clientX-e.left,s=a.clientY-e.top,l=!0}return{x:r,y:s,box:l}}(e,n),d=r.left+(c&&s.left),h=r.top+(c&&s.top);let{width:p,height:f}=t;return o&&(p-=r.width+s.width,f-=r.height+s.height),{x:Math.round((l-d)/p*n.width/a),y:Math.round((u-h)/f*n.height/a)}}const _t=e=>Math.round(10*e)/10;function gt(e,t,n,a){const i=dt(e),o=ft(i,"margin"),r=ct(i.maxWidth,e,"clientWidth")||M,s=ct(i.maxHeight,e,"clientHeight")||M,l=function(e,t,n){let a,i;if(void 0===t||void 0===n){const o=e&&ut(e);if(o){const e=o.getBoundingClientRect(),r=dt(o),s=ft(r,"border","width"),l=ft(r,"padding");t=e.width-l.width-s.width,n=e.height-l.height-s.height,a=ct(r.maxWidth,o,"clientWidth"),i=ct(r.maxHeight,o,"clientHeight")}else t=e.clientWidth,n=e.clientHeight}return{width:t,height:n,maxWidth:a||M,maxHeight:i||M}}(e,t,n);let{width:u,height:c}=l;if("content-box"===i.boxSizing){const e=ft(i,"border","width"),t=ft(i,"padding");u-=t.width+e.width,c-=t.height+e.height}return u=Math.max(0,u-o.width),c=Math.max(0,a?u/a:c-o.height),u=_t(Math.min(u,r,l.maxWidth)),c=_t(Math.min(c,s,l.maxHeight)),u&&!c&&(c=_t(u/2)),(void 0!==t||void 0!==n)&&a&&l.height&&c>l.height&&(c=l.height,u=_t(Math.floor(c*a))),{width:u,height:c}}function vt(e,t,n){const a=t||1,i=_t(e.height*a),o=_t(e.width*a);e.height=_t(e.height),e.width=_t(e.width);const r=e.canvas;return r.style&&(n||!r.style.height&&!r.style.width)&&(r.style.height=`${e.height}px`,r.style.width=`${e.width}px`),(e.currentDevicePixelRatio!==a||r.height!==i||r.width!==o)&&(e.currentDevicePixelRatio=a,r.height=i,r.width=o,e.ctx.setTransform(a,0,0,a,0,0),!0)}const bt=function(){let e=!1;try{const t={get passive(){return e=!0,!1}};lt()&&(window.addEventListener("test",null,t),window.removeEventListener("test",null,t))}catch(e){}return e}();function yt(e,t){const n=ht(e,t),a=n&&n.match(/^(\d+)(\.\d+)?px$/);return a?+a[1]:void 0}function wt(e){return!e||a(e.size)||a(e.family)?null:(e.style?e.style+" ":"")+(e.weight?e.weight+" ":"")+e.size+"px "+e.family}function kt(e,t,n,a,i){let o=t[i];return o||(o=t[i]=e.measureText(i).width,n.push(i)),o>a&&(a=o),a}function xt(e,t,n,a){let o=(a=a||{}).data=a.data||{},r=a.garbageCollect=a.garbageCollect||[];a.font!==t&&(o=a.data={},r=a.garbageCollect=[],a.font=t),e.save(),e.font=t;let s=0;const l=n.length;let u,c,d,h,p;for(u=0;un.length){for(u=0;u0&&e.stroke()}}function Et(e,t,n){return n=n||.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&""!==s.strokeColor;let c,d;for(e.save(),e.font=r.string,function(e,t){t.translation&&e.translate(t.translation[0],t.translation[1]),a(t.rotation)||e.rotate(t.rotation),t.color&&(e.fillStyle=t.color),t.textAlign&&(e.textAlign=t.textAlign),t.textBaseline&&(e.textBaseline=t.textBaseline)}(e,s),c=0;ce[0]){const o=n||e;void 0===a&&(a=Kt("_fallback",e));const r={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:e,_rootScopes:o,_fallback:a,_getTarget:i,override:n=>Dt([n,...e],t,o,a)};return new Proxy(r,{deleteProperty:(t,n)=>(delete t[n],delete t._keys,delete e[0][n],!0),get:(n,a)=>$t(n,a,()=>function(e,t,n,a){let i;for(const o of t)if(i=Kt(Bt(o,e),n),void 0!==i)return Ft(e,i)?Wt(n,a,e,i):i}(a,t,e,n)),getOwnPropertyDescriptor:(e,t)=>Reflect.getOwnPropertyDescriptor(e._scopes[0],t),getPrototypeOf:()=>Reflect.getPrototypeOf(e[0]),has:(e,t)=>Yt(e).includes(t),ownKeys:e=>Yt(e),set(e,t,n){const a=e._storage||(e._storage=i());return e[t]=a[t]=n,delete e._keys,!0}})}function qt(e,t,n,a){const r={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:jt(e,a),setContext:t=>qt(e,t,n,a),override:i=>qt(e.override(i),t,n,a)};return new Proxy(r,{deleteProperty:(t,n)=>(delete t[n],delete e[n],!0),get:(e,t,n)=>$t(e,t,()=>function(e,t,n){const{_proxy:a,_context:r,_subProxy:s,_descriptors:l}=e;let u=a[t];return C(u)&&l.isScriptable(t)&&(u=function(e,t,n,a){const{_proxy:i,_context:o,_subProxy:r,_stack:s}=n;if(s.has(e))throw new Error("Recursion detected: "+Array.from(s).join("->")+"->"+e);s.add(e);let l=t(o,r||a);return s.delete(e),Ft(e,l)&&(l=Wt(i._scopes,i,e,l)),l}(t,u,e,n)),i(u)&&u.length&&(u=function(e,t,n,a){const{_proxy:i,_context:r,_subProxy:s,_descriptors:l}=n;if(void 0!==r.index&&a(e))return t[r.index%t.length];if(o(t[0])){const n=t,a=i._scopes.filter(e=>e!==n);t=[];for(const o of n){const n=Wt(a,i,e,o);t.push(qt(n,r,s&&s[e],l))}}return t}(t,u,e,l.isIndexable)),Ft(t,u)&&(u=qt(u,r,s&&s[t],l)),u}(e,t,n)),getOwnPropertyDescriptor:(t,n)=>t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n),getPrototypeOf:()=>Reflect.getPrototypeOf(e),has:(t,n)=>Reflect.has(e,n),ownKeys:()=>Reflect.ownKeys(e),set:(t,n,a)=>(e[n]=a,delete t[n],!0)})}function jt(e,t={scriptable:!0,indexable:!0}){const{_scriptable:n=t.scriptable,_indexable:a=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:a,isScriptable:C(n)?n:()=>n,isIndexable:C(a)?a:()=>a}}const Bt=(e,t)=>e?e+x(t):t,Ft=(e,t)=>o(t)&&"adapters"!==e&&(null===Object.getPrototypeOf(t)||t.constructor===Object);function $t(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||"constructor"===t)return e[t];const a=n();return e[t]=a,a}function Vt(e,t,n){return C(e)?e(t,n):e}const Ut=(e,t)=>!0===e?t:"string"==typeof e?k(t,e):void 0;function Ht(e,t,n,a,i){for(const o of t){const t=Ut(n,o);if(t){e.add(t);const o=Vt(t._fallback,n,i);if(void 0!==o&&o!==n&&o!==a)return o}else if(!1===t&&void 0!==a&&n!==a)return null}return!1}function Wt(e,t,n,a){const r=t._rootScopes,s=Vt(t._fallback,n,a),l=[...e,...r],u=new Set;u.add(a);let c=Gt(u,l,n,s||n,a);return null!==c&&(void 0===s||s===n||(c=Gt(u,l,s,c,a),null!==c))&&Dt(Array.from(u),[""],r,s,()=>function(e,t,n){const a=e._getTarget();t in a||(a[t]={});const r=a[t];return i(r)&&o(n)?n:r||{}}(t,n,a))}function Gt(e,t,n,a,i){for(;n;)n=Ht(e,t,n,a,i);return n}function Kt(e,t){for(const n of t){if(!n)continue;const t=n[e];if(void 0!==t)return t}}function Yt(e){let t=e._keys;return t||(t=e._keys=function(e){const t=new Set;for(const n of e)for(const e of Object.keys(n).filter(e=>!e.startsWith("_")))t.add(e);return Array.from(t)}(e._scopes)),t}function Qt(e,t,n,a){const{iScale:i}=e,{key:o="r"}=this._parsing,r=new Array(a);let s,l,u,c;for(s=0,l=a;st"x"===e?"y":"x";function en(e,t,n,a){const i=e.skip?t:e,o=t,r=n.skip?t:n,s=K(o,i),l=K(r,o);let u=s/(s+l),c=l/(s+l);u=isNaN(u)?0:u,c=isNaN(c)?0:c;const d=a*u,h=a*c;return{previous:{x:o.x-d*(r.x-i.x),y:o.y-d*(r.y-i.y)},next:{x:o.x+h*(r.x-i.x),y:o.y+h*(r.y-i.y)}}}function tn(e,t="x"){const n=Xt(t),a=e.length,i=Array(a).fill(0),o=Array(a);let r,s,l,u=Jt(e,0);for(r=0;r!e.skip)),"monotone"===t.cubicInterpolationMode)tn(e,i);else{let n=a?e[e.length-1]:e[0];for(o=0,r=e.length;o0===e||1===e,rn=(e,t,n)=>-Math.pow(2,10*(e-=1))*Math.sin((e-t)*A/n),sn=(e,t,n)=>Math.pow(2,-10*e)*Math.sin((e-t)*A/n)+1,ln={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>(e-=1)*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-((e-=1)*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>(e-=1)*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>1-Math.cos(e*z),easeOutSine:e=>Math.sin(e*z),easeInOutSine:e=>-.5*(Math.cos(E*e)-1),easeInExpo:e=>0===e?0:Math.pow(2,10*(e-1)),easeOutExpo:e=>1===e?1:1-Math.pow(2,-10*e),easeInOutExpo:e=>on(e)?e:e<.5?.5*Math.pow(2,10*(2*e-1)):.5*(2-Math.pow(2,-10*(2*e-1))),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1-(e-=1)*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>on(e)?e:rn(e,.075,.3),easeOutElastic:e=>on(e)?e:sn(e,.075,.3),easeInOutElastic(e){const t=.1125;return on(e)?e:e<.5?.5*rn(2*e,t,.45):.5+.5*sn(2*e-1,t,.45)},easeInBack(e){const t=1.70158;return e*e*((t+1)*e-t)},easeOutBack(e){const t=1.70158;return(e-=1)*e*((t+1)*e+t)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?e*e*((1+(t*=1.525))*e-t)*.5:.5*((e-=2)*e*((1+(t*=1.525))*e+t)+2)},easeInBounce:e=>1-ln.easeOutBounce(1-e),easeOutBounce(e){const t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?.5*ln.easeInBounce(2*e):.5*ln.easeOutBounce(2*e-1)+.5};function un(e,t,n,a){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function cn(e,t,n,a){return{x:e.x+n*(t.x-e.x),y:"middle"===a?n<.5?e.y:t.y:"after"===a?n<1?e.y:t.y:n>0?t.y:e.y}}function dn(e,t,n,a){const i={x:e.cp2x,y:e.cp2y},o={x:t.cp1x,y:t.cp1y},r=un(e,i,n),s=un(i,o,n),l=un(o,t,n),u=un(r,s,n),c=un(s,l,n);return un(u,c,n)}const hn=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,pn=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function fn(e,t){const n=(""+e).match(hn);if(!n||"normal"===n[1])return 1.2*t;switch(e=+n[2],n[3]){case"px":return e;case"%":e/=100}return t*e}const mn=e=>+e||0;function _n(e,t){const n={},a=o(t),i=a?Object.keys(t):t,r=o(e)?a?n=>l(e[n],e[t[n]]):t=>e[t]:()=>e;for(const e of i)n[e]=mn(r(e));return n}function gn(e){return _n(e,{top:"y",right:"x",bottom:"y",left:"x"})}function vn(e){return _n(e,["topLeft","topRight","bottomLeft","bottomRight"])}function bn(e){const t=gn(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function yn(e,t){e=e||{},t=t||st.font;let n=l(e.size,t.size);"string"==typeof n&&(n=parseInt(n,10));let a=l(e.style,t.style);a&&!(""+a).match(pn)&&(console.warn('Invalid font style specified: "'+a+'"'),a=void 0);const i={family:l(e.family,t.family),lineHeight:fn(l(e.lineHeight,t.lineHeight),n),size:n,style:a,weight:l(e.weight,t.weight),string:""};return i.string=wt(i),i}function wn(e,t,n,a){let o,r,s,l=!0;for(o=0,r=e.length;on&&0===e?0:e+t;return{min:r(a,-Math.abs(o)),max:r(i,o)}}function xn(e,t){return Object.assign(Object.create(e),t)}function Sn(e,t,n){return e?function(e,t){return{x:n=>e+e+t-n,setWidth(e){t=e},textAlign:e=>"center"===e?e:"right"===e?"left":"right",xPlus:(e,t)=>e-t,leftForLtr:(e,t)=>e-t}}(t,n):{x:e=>e,setWidth(e){},textAlign:e=>e,xPlus:(e,t)=>e+t,leftForLtr:(e,t)=>e}}function Cn(e,t){let n,a;"ltr"!==t&&"rtl"!==t||(n=e.canvas.style,a=[n.getPropertyValue("direction"),n.getPropertyPriority("direction")],n.setProperty("direction",t,"important"),e.prevTextDirection=a)}function Tn(e,t){void 0!==t&&(delete e.prevTextDirection,e.canvas.style.setProperty("direction",t[0],t[1]))}function Pn(e){return"angle"===e?{between:Z,compare:Y,normalize:Q}:{between:ee,compare:(e,t)=>e-t,normalize:e=>e}}function En({start:e,end:t,count:n,loop:a,style:i}){return{start:e%n,end:t%n,loop:a&&(t-e+1)%n==0,style:i}}function An(e,t,n){if(!n)return[e];const{property:a,start:i,end:o}=n,r=t.length,{compare:s,between:l,normalize:u}=Pn(a),{start:c,end:d,loop:h,style:p}=function(e,t,n){const{property:a,start:i,end:o}=n,{between:r,normalize:s}=Pn(a),l=t.length;let u,c,{start:d,end:h,loop:p}=e;if(p){for(d+=l,h+=l,u=0,c=l;uv||l(i,g,m)&&0!==s(i,g),w=()=>!v||0===s(o,m)||l(o,g,m);for(let e=c,n=c;e<=d;++e)_=t[e%r],_.skip||(m=u(_[a]),m!==g&&(v=l(m,i,o),null===b&&y()&&(b=0===s(m,i)?e:n),null!==b&&w()&&(f.push(En({start:b,end:e,loop:h,count:r,style:p})),b=null),n=e,g=m));return null!==b&&f.push(En({start:b,end:d,loop:h,count:r,style:p})),f}function Ln(e,t){const n=[],a=e.segments;for(let i=0;ii&&e[o%t].skip;)o--;return o%=t,{start:i,end:o}}(n,i,o,a);return Rn(e,!0===a?[{start:r,end:s,loop:o}]:function(e,t,n,a){const i=e.length,o=[];let r,s=t,l=e[t];for(r=t+1;r<=n;++r){const n=e[r%i];n.skip||n.stop?l.skip||(a=!1,o.push({start:t%i,end:(r-1)%i,loop:a}),t=s=n.stop?r:null):(s=r,l.skip&&(t=r)),l=n}return null!==s&&o.push({start:t%i,end:s%i,loop:a}),o}(n,r,s!a(e[t.axis]));i.lo-=Math.max(0,r);const s=n.slice(i.hi).findIndex(e=>!a(e[t.axis]));i.hi+=Math.max(0,s)}return i}if(o._sharedOptions){const e=r[0],a="function"==typeof e.getRange&&e.getRange(t);if(a){const e=s(r,t,n-a),i=s(r,t,n+a);return{lo:e.lo,hi:i.hi}}}}return{lo:0,hi:r.length-1}}function jn(e,t,n,a,i){const o=e.getSortedVisibleDatasetMetas(),r=n[t];for(let e=0,n=o.length;e{e[r]&&e[r](t[n],i)&&(o.push({element:e,datasetIndex:a,index:l}),s=s||e.inRange(t.x,t.y,i))}),a&&!s?[]:o}var Vn={evaluateInteractionItems:jn,modes:{index(e,t,n,a){const i=mt(t,e),o=n.axis||"x",r=n.includeInvisible||!1,s=n.intersect?Bn(e,i,o,a,r):Fn(e,i,o,!1,a,r),l=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{const t=s[0].index,n=e.data[t];n&&!n.skip&&l.push({element:n,datasetIndex:e.index,index:t})}),l):[]},dataset(e,t,n,a){const i=mt(t,e),o=n.axis||"xy",r=n.includeInvisible||!1;let s=n.intersect?Bn(e,i,o,a,r):Fn(e,i,o,!1,a,r);if(s.length>0){const t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;eBn(e,mt(t,e),n.axis||"xy",a,n.includeInvisible||!1),nearest(e,t,n,a){const i=mt(t,e),o=n.axis||"xy",r=n.includeInvisible||!1;return Fn(e,i,o,n.intersect,a,r)},x:(e,t,n,a)=>$n(e,mt(t,e),"x",n.intersect,a),y:(e,t,n,a)=>$n(e,mt(t,e),"y",n.intersect,a)}};const Un=["left","top","right","bottom"];function Hn(e,t){return e.filter(e=>e.pos===t)}function Wn(e,t){return e.filter(e=>-1===Un.indexOf(e.pos)&&e.box.axis===t)}function Gn(e,t){return e.sort((e,n)=>{const a=t?n:e,i=t?e:n;return a.weight===i.weight?a.index-i.index:a.weight-i.weight})}function Kn(e,t,n,a){return Math.max(e[n],t[n])+Math.max(e[a],t[a])}function Yn(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function Qn(e,t,n,a){const{pos:i,box:r}=n,s=e.maxPadding;if(!o(i)){n.size&&(e[i]-=n.size);const t=a[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?r.height:r.width),n.size=t.size/t.count,e[i]+=n.size}r.getPadding&&Yn(s,r.getPadding());const l=Math.max(0,t.outerWidth-Kn(s,e,"left","right")),u=Math.max(0,t.outerHeight-Kn(s,e,"top","bottom")),c=l!==e.w,d=u!==e.h;return e.w=l,e.h=u,n.horizontal?{same:c,other:d}:{same:d,other:c}}function Zn(e,t){const n=t.maxPadding;return function(e){const a={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{a[e]=Math.max(t[e],n[e])}),a}(e?["left","right"]:["top","bottom"])}function Jn(e,t,n,a){const i=[];let o,r,s,l,u,c;for(o=0,r=e.length,u=0;oe.box.fullSize),!0),a=Gn(Hn(t,"left"),!0),i=Gn(Hn(t,"right")),o=Gn(Hn(t,"top"),!0),r=Gn(Hn(t,"bottom")),s=Wn(t,"x"),l=Wn(t,"y");return{fullSize:n,leftAndTop:a.concat(o),rightAndBottom:i.concat(l).concat(r).concat(s),chartArea:Hn(t,"chartArea"),vertical:a.concat(i).concat(l),horizontal:o.concat(r).concat(s)}}(e.boxes),l=s.vertical,u=s.horizontal;h(e.boxes,e=>{"function"==typeof e.beforeLayout&&e.beforeLayout()});const c=l.reduce((e,t)=>t.box.options&&!1===t.box.options.display?e:e+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:o,availableHeight:r,vBoxMaxWidth:o/2/c,hBoxMaxHeight:r/2}),p=Object.assign({},i);Yn(p,bn(a));const f=Object.assign({maxPadding:p,w:o,h:r,x:i.left,y:i.top},i),m=function(e,t){const n=function(e){const t={};for(const n of e){const{stack:e,pos:a,stackWeight:i}=n;if(!e||!Un.includes(a))continue;const o=t[e]||(t[e]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=i}return t}(e),{vBoxMaxWidth:a,hBoxMaxHeight:i}=t;let o,r,s;for(o=0,r=e.length;o{const n=t.box;Object.assign(n,e.chartArea),n.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}};class na{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,a){return t=Math.max(0,t||e.width),n=n||e.height,{width:t,height:Math.max(0,a?Math.floor(t/a):n)}}isAttached(e){return!0}updateConfig(e){}}class aa extends na{acquireContext(e){return e&&e.getContext&&e.getContext("2d")||null}updateConfig(e){e.options.animation=!1}}const ia="$chartjs",oa={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},ra=e=>null===e||""===e,sa=!!bt&&{passive:!0};function la(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,sa)}function ua(e,t){for(const n of e)if(n===t||n.contains(t))return!0}function ca(e,t,n){const a=e.canvas,i=new MutationObserver(e=>{let t=!1;for(const n of e)t=t||ua(n.addedNodes,a),t=t&&!ua(n.removedNodes,a);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}function da(e,t,n){const a=e.canvas,i=new MutationObserver(e=>{let t=!1;for(const n of e)t=t||ua(n.removedNodes,a),t=t&&!ua(n.addedNodes,a);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}const ha=new Map;let pa=0;function fa(){const e=window.devicePixelRatio;e!==pa&&(pa=e,ha.forEach((t,n)=>{n.currentDevicePixelRatio!==e&&t()}))}function ma(e,t,n){const a=e.canvas,i=a&&ut(a);if(!i)return;const o=ce((e,t)=>{const a=i.clientWidth;n(e,t),a{const t=e[0],n=t.contentRect.width,a=t.contentRect.height;0===n&&0===a||o(n,a)});return r.observe(i),function(e,t){ha.size||window.addEventListener("resize",fa),ha.set(e,t)}(e,o),r}function _a(e,t,n){n&&n.disconnect(),"resize"===t&&function(e){ha.delete(e),ha.size||window.removeEventListener("resize",fa)}(e)}function ga(e,t,n){const a=e.canvas,i=ce(t=>{null!==e.ctx&&n(function(e,t){const n=oa[e.type]||e.type,{x:a,y:i}=mt(e,t);return{type:n,chart:t,native:e,x:void 0!==a?a:null,y:void 0!==i?i:null}}(t,e))},e);return function(e,t,n){e&&e.addEventListener(t,n,sa)}(a,t,i),i}class va extends na{acquireContext(e,t){const n=e&&e.getContext&&e.getContext("2d");return n&&n.canvas===e?(function(e,t){const n=e.style,a=e.getAttribute("height"),i=e.getAttribute("width");if(e[ia]={initial:{height:a,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||"block",n.boxSizing=n.boxSizing||"border-box",ra(i)){const t=yt(e,"width");void 0!==t&&(e.width=t)}if(ra(a))if(""===e.style.height)e.height=e.width/(t||2);else{const t=yt(e,"height");void 0!==t&&(e.height=t)}}(e,t),n):null}releaseContext(e){const t=e.canvas;if(!t[ia])return!1;const n=t[ia].initial;["height","width"].forEach(e=>{const i=n[e];a(i)?t.removeAttribute(e):t.setAttribute(e,i)});const i=n.style||{};return Object.keys(i).forEach(e=>{t.style[e]=i[e]}),t.width=t.width,delete t[ia],!0}addEventListener(e,t,n){this.removeEventListener(e,t);const a=e.$proxies||(e.$proxies={}),i={attach:ca,detach:da,resize:ma}[t]||ga;a[t]=i(e,t,n)}removeEventListener(e,t){const n=e.$proxies||(e.$proxies={}),a=n[t];a&&(({attach:_a,detach:_a,resize:_a}[t]||la)(e,t,a),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,a){return gt(e,t,n,a)}isAttached(e){const t=e&&ut(e);return!(!t||!t.isConnected)}}function ba(e){return!lt()||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?aa:va}var ya=Object.freeze({__proto__:null,BasePlatform:na,BasicPlatform:aa,DomPlatform:va,_detectPlatform:ba});const wa="transparent",ka={boolean:(e,t,n)=>n>.5?t:e,color(e,t,n){const a=Ye(e||wa),i=a.valid&&Ye(t||wa);return i&&i.valid?i.mix(a,n).hexString():t},number:(e,t,n)=>e+(t-e)*n};class xa{constructor(e,t,n,a){const i=t[n];a=wn([e.to,a,i,e.from]);const o=wn([e.from,i,a]);this._active=!0,this._fn=e.fn||ka[e.type||typeof o],this._easing=ln[e.easing]||ln.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=o,this._to=a,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);const a=this._target[this._prop],i=n-this._start,o=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(o,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=wn([e.to,t,a,e.from]),this._from=wn([e.from,a,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){const t=e-this._start,n=this._duration,a=this._prop,i=this._from,o=this._loop,r=this._to;let s;if(this._active=i!==r&&(o||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[a]=this._fn(i,r,s))}wait(){const e=this._promises||(this._promises=[]);return new Promise((t,n)=>{e.push({res:t,rej:n})})}_notify(e){const t=e?"res":"rej",n=this._promises||[];for(let e=0;e{const r=e[a];if(!o(r))return;const s={};for(const e of t)s[e]=r[e];(i(r.properties)&&r.properties||[a]).forEach(e=>{e!==a&&n.has(e)||n.set(e,s)})})}_animateOptions(e,t){const n=t.options,a=function(e,t){if(!t)return;let n=e.options;if(n)return n.$shared&&(e.options=n=Object.assign({},n,{$shared:!1,$animations:{}})),n;e.options=t}(e,n);if(!a)return[];const i=this._createAnimations(a,n);return n.$shared&&function(e,t){const n=[],a=Object.keys(t);for(let t=0;t{e.options=n},()=>{}),i}_createAnimations(e,t){const n=this._properties,a=[],i=e.$animations||(e.$animations={}),o=Object.keys(t),r=Date.now();let s;for(s=o.length-1;s>=0;--s){const l=o[s];if("$"===l.charAt(0))continue;if("options"===l){a.push(...this._animateOptions(e,t));continue}const u=t[l];let c=i[l];const d=n.get(l);if(c){if(d&&c.active()){c.update(d,u,r);continue}c.cancel()}d&&d.duration?(i[l]=c=new xa(d,e,l,u),a.push(c)):e[l]=u}return a}update(e,t){if(0===this._properties.size)return void Object.assign(e,t);const n=this._createAnimations(e,t);return n.length?(ge.add(this._chart,n),!0):void 0}}function Ca(e,t){const n=e&&e.options||{},a=n.reverse,i=void 0===n.min?t:0,o=void 0===n.max?t:0;return{start:a?o:i,end:a?i:o}}function Ta(e,t){const n=[],a=e._getSortedDatasetMetas(t);let i,o;for(i=0,o=a.length;i0||!n&&t<0)return i.index}return null}function Ma(e,t){const{chart:n,_cachedMeta:a}=e,i=n._stacks||(n._stacks={}),{iScale:o,vScale:r,index:s}=a,l=o.axis,u=r.axis,c=function(e,t,n){return`${e.id}.${t.id}.${n.stack||n.type}`}(o,r,a),d=t.length;let h;for(let e=0;en[e].axis===t).shift()}function za(e,t){const n=e.controller.index,a=e.vScale&&e.vScale.axis;if(a){t=t||e._parsed;for(const e of t){const t=e._stacks;if(!t||void 0===t[a]||void 0===t[a][n])return;delete t[a][n],void 0!==t[a]._visualValues&&void 0!==t[a]._visualValues[n]&&delete t[a]._visualValues[n]}}}const Oa=e=>"reset"===e||"none"===e,Ia=(e,t)=>t?e:Object.assign({},e);class Na{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=Ea(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(e){this.index!==e&&za(this._cachedMeta),this.index=e}linkScales(){const e=this.chart,t=this._cachedMeta,n=this.getDataset(),a=(e,t,n,a)=>"x"===e?t:"r"===e?a:n,i=t.xAxisID=l(n.xAxisID,Ra(e,"x")),o=t.yAxisID=l(n.yAxisID,Ra(e,"y")),r=t.rAxisID=l(n.rAxisID,Ra(e,"r")),s=t.indexAxis,u=t.iAxisID=a(s,i,o,r),c=t.vAxisID=a(s,o,i,r);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(o),t.rScale=this.getScaleForId(r),t.iScale=this.getScaleForId(u),t.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){const t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update("reset")}_destroy(){const e=this._cachedMeta;this._data&&se(this._data,this),e._stacked&&za(e)}_dataCheck(){const e=this.getDataset(),t=e.data||(e.data=[]),n=this._data;if(o(t)){const e=this._cachedMeta;this._data=function(e,t){const{iScale:n,vScale:a}=t,i="x"===n.axis?"x":"y",o="x"===a.axis?"x":"y",r=Object.keys(e),s=new Array(r.length);let l,u,c;for(l=0,u=r.length;l0&&n._parsed[e-1];if(!1===this._parsing)n._parsed=a,n._sorted=!0,d=a;else{d=i(a[e])?this.parseArrayData(n,a,e,t):o(a[e])?this.parseObjectData(n,a,e,t):this.parsePrimitiveData(n,a,e,t);const r=()=>null===c[l]||p&&c[l]e&&!t.hidden&&t._stacked&&{keys:Ta(n,!0),values:null})(t,n,this.chart),u={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(e){const{min:t,max:n,minDefined:a,maxDefined:i}=e.getUserBounds();return{min:a?t:Number.NEGATIVE_INFINITY,max:i?n:Number.POSITIVE_INFINITY}}(s);let h,p;function f(){p=a[h];const t=p[s.axis];return!r(p[e.axis])||c>t||d=0;--h)if(!f()){this.updateRangeFromParsed(u,e,p,l);break}return u}getAllParsedValues(e){const t=this._cachedMeta._parsed,n=[];let a,i,o;for(a=0,i=t.length;a=0&&ethis.getContext(n,a,t),c);return p.$shared&&(p.$shared=s,i[o]=Object.freeze(Ia(p,s))),p}_resolveAnimations(e,t,n){const a=this.chart,i=this._cachedDataOpts,o=`animation-${t}`,r=i[o];if(r)return r;let s;if(!1!==a.options.animation){const a=this.chart.config,i=a.datasetAnimationScopeKeys(this._type,t),o=a.getOptionScopes(this.getDataset(),i);s=a.createResolver(o,this.getContext(e,n,t))}const l=new Sa(a,s&&s.animations);return s&&s._cacheable&&(i[o]=Object.freeze(l)),l}getSharedOptions(e){if(e.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},e))}includeOptions(e,t){return!t||Oa(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){const n=this.resolveDataElementOptions(e,t),a=this._sharedOptions,i=this.getSharedOptions(n),o=this.includeOptions(t,i)||i!==a;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:o}}updateElement(e,t,n,a){Oa(a)?Object.assign(e,n):this._resolveAnimations(t,a).update(e,n)}updateSharedOptions(e,t,n){e&&!Oa(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,a){e.active=a;const i=this.getStyle(t,a);this._resolveAnimations(t,n,a).update(e,{options:!a&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,"active",!1)}setHoverStyle(e,t,n){this._setStyle(e,n,"active",!0)}_removeDatasetHoverStyle(){const e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,"active",!1)}_setDatasetHoverStyle(){const e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,"active",!0)}_resyncElements(e){const t=this._data,n=this._cachedMeta.data;for(const[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];const a=n.length,i=t.length,o=Math.min(i,a);o&&this.parse(0,o),i>a?this._insertElements(a,i-a,e):i{for(e.length+=t,r=e.length-1;r>=o;r--)e[r]=e[r-t]};for(s(i),r=e;r{a[e]=n[e]&&n[e].active()?n[e]._to:this[e]}),a}}function qa(e,t){const n=e.options.ticks,i=function(e){const t=e.options.offset,n=e._tickSize(),a=e._length/n+(t?0:1),i=e._maxLength/n;return Math.floor(Math.min(a,i))}(e),o=Math.min(n.maxTicksLimit||i,i),r=n.major.enabled?function(e){const t=[];let n,a;for(n=0,a=e.length;no)return function(e,t,n,a){let i,o=0,r=n[0];for(a=Math.ceil(a),i=0;ii)return t}return Math.max(i,1)}(r,t,o);if(s>0){let e,n;const i=s>1?Math.round((u-l)/(s-1)):null;for(ja(t,c,d,a(i)?0:l-i,l),e=0,n=s-1;e"top"===t||"left"===t?e[t]+n:e[t]-n,Fa=(e,t)=>Math.min(t||e,e);function $a(e,t){const n=[],a=e.length/t,i=e.length;let o=0;for(;or+s)))return u}function Ua(e){return e.drawTicks?e.tickLength:0}function Ha(e,t){if(!e.display)return 0;const n=yn(e.font,t),a=bn(e.padding);return(i(e.text)?e.text.length:1)*n.lineHeight+a.height}function Wa(e,t,n){let a=he(e);return(n&&"right"!==t||!n&&"right"===t)&&(a=(e=>"left"===e?"right":"right"===e?"left":e)(a)),a}class Ga extends Da{constructor(e){super(),this.id=e.id,this.type=e.type,this.options=void 0,this.ctx=e.ctx,this.chart=e.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(e){this.options=e.setContext(this.getContext()),this.axis=e.axis,this._userMin=this.parse(e.min),this._userMax=this.parse(e.max),this._suggestedMin=this.parse(e.suggestedMin),this._suggestedMax=this.parse(e.suggestedMax)}parse(e,t){return e}getUserBounds(){let{_userMin:e,_userMax:t,_suggestedMin:n,_suggestedMax:a}=this;return e=s(e,Number.POSITIVE_INFINITY),t=s(t,Number.NEGATIVE_INFINITY),n=s(n,Number.POSITIVE_INFINITY),a=s(a,Number.NEGATIVE_INFINITY),{min:s(e,n),max:s(t,a),minDefined:r(e),maxDefined:r(t)}}getMinMax(e){let t,{min:n,max:a,minDefined:i,maxDefined:o}=this.getUserBounds();if(i&&o)return{min:n,max:a};const r=this.getMatchingVisibleMetas();for(let s=0,l=r.length;sa?a:n,a=i&&n>a?n:a,{min:s(n,s(a,n)),max:s(a,s(n,a))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(e))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(e,t,n){const{beginAtZero:a,grace:i,ticks:o}=this.options,r=o.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=kn(this,i,a),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const s=r=i||n<=1||!this.isHorizontal())return void(this.labelRotation=a);const u=this._getLabelSizes(),c=u.widest.width,d=u.highest.height,h=J(this.chart.width-c,0,this.maxWidth);o=e.offset?this.maxWidth/n:h/(n-1),c+6>o&&(o=h/(n-(e.offset?.5:1)),r=this.maxHeight-Ua(e.grid)-t.padding-Ha(e.title,this.chart.options.font),s=Math.sqrt(c*c+d*d),l=H(Math.min(Math.asin(J((u.highest.height+6)/o,-1,1)),Math.asin(J(r/s,-1,1))-Math.asin(J(d/s,-1,1)))),l=Math.max(a,Math.min(i,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const e={width:0,height:0},{chart:t,options:{ticks:n,title:a,grid:i}}=this,o=this._isVisible(),r=this.isHorizontal();if(o){const o=Ha(a,t.options.font);if(r?(e.width=this.maxWidth,e.height=Ua(i)+o):(e.height=this.maxHeight,e.width=Ua(i)+o),n.display&&this.ticks.length){const{first:t,last:a,widest:i,highest:o}=this._getLabelSizes(),s=2*n.padding,l=U(this.labelRotation),u=Math.cos(l),c=Math.sin(l);if(r){const t=n.mirror?0:c*i.width+u*o.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{const t=n.mirror?0:u*i.width+c*o.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,a,c,u)}}this._handleMargins(),r?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,a){const{ticks:{align:i,padding:o},position:r}=this.options,s=0!==this.labelRotation,l="top"!==r&&"x"===this.axis;if(this.isHorizontal()){const r=this.getPixelForTick(0)-this.left,u=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;s?l?(c=a*e.width,d=n*t.height):(c=n*e.height,d=a*t.width):"start"===i?d=t.width:"end"===i?c=e.width:"inner"!==i&&(c=e.width/2,d=t.width/2),this.paddingLeft=Math.max((c-r+o)*this.width/(this.width-r),0),this.paddingRight=Math.max((d-u+o)*this.width/(this.width-u),0)}else{let n=t.height/2,a=e.height/2;"start"===i?(n=0,a=e.height):"end"===i&&(n=t.height,a=0),this.paddingTop=n+o,this.paddingBottom=a+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:e,position:t}=this.options;return"top"===t||"bottom"===t||"x"===e}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){let t,n;for(this.beforeTickToLabelConversion(),this.generateTickLabels(e),t=0,n=e.length;t{const n=e.gc,a=n.length/2;let i;if(a>t){for(i=0;i({width:s[e]||0,height:l[e]||0});return{first:T(0),last:T(t-1),widest:T(S),highest:T(C),widths:s,heights:l}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){const t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);const t=this._startPixel+e*this._length;return X(this._alignToPixels?St(this.chart,t,0):t)}getDecimalForPixel(e){const t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){const t=this.ticks||[];if(e>=0&&er*a?r/n:s/a:s*a0}_computeGridLineItems(e){const t=this.axis,n=this.chart,a=this.options,{grid:i,position:r,border:s}=a,u=i.offset,c=this.isHorizontal(),d=this.ticks.length+(u?1:0),h=Ua(i),p=[],f=s.setContext(this.getContext()),m=f.display?f.width:0,_=m/2,g=function(e){return St(n,e,m)};let v,b,y,w,k,x,S,C,T,P,E,A;if("top"===r)v=g(this.bottom),x=this.bottom-h,C=v-_,P=g(e.top)+_,A=e.bottom;else if("bottom"===r)v=g(this.top),P=e.top,A=g(e.bottom)-_,x=v+_,C=this.top+h;else if("left"===r)v=g(this.right),k=this.right-h,S=v-_,T=g(e.left)+_,E=e.right;else if("right"===r)v=g(this.left),T=e.left,E=g(e.right)-_,k=v+_,S=this.left+h;else if("x"===t){if("center"===r)v=g((e.top+e.bottom)/2+.5);else if(o(r)){const e=Object.keys(r)[0],t=r[e];v=g(this.chart.scales[e].getPixelForValue(t))}P=e.top,A=e.bottom,x=v+_,C=x+h}else if("y"===t){if("center"===r)v=g((e.left+e.right)/2);else if(o(r)){const e=Object.keys(r)[0],t=r[e];v=g(this.chart.scales[e].getPixelForValue(t))}k=v-_,S=k-h,T=e.left,E=e.right}const L=l(a.ticks.maxTicksLimit,d),M=Math.max(1,Math.ceil(d/L));for(b=0;b0&&(o-=a/2)}d={left:o,top:i,width:a+t.width,height:n+t.height,color:e.backdropColor}}g.push({label:w,font:T,textOffset:A,options:{rotation:_,color:n,strokeColor:o,strokeWidth:u,textAlign:p,textBaseline:L,translation:[k,x],backdrop:d}})}return g}_getXAxisLabelAlignment(){const{position:e,ticks:t}=this.options;if(-U(this.labelRotation))return"top"===e?"left":"right";let n="center";return"start"===t.align?n="left":"end"===t.align?n="right":"inner"===t.align&&(n="inner"),n}_getYAxisLabelAlignment(e){const{position:t,ticks:{crossAlign:n,mirror:a,padding:i}}=this.options,o=e+i,r=this._getLabelSizes().widest.width;let s,l;return"left"===t?a?(l=this.right+i,"near"===n?s="left":"center"===n?(s="center",l+=r/2):(s="right",l+=r)):(l=this.right-o,"near"===n?s="right":"center"===n?(s="center",l-=r/2):(s="left",l=this.left)):"right"===t?a?(l=this.left+i,"near"===n?s="right":"center"===n?(s="center",l-=r/2):(s="left",l-=r)):(l=this.left+o,"near"===n?s="left":"center"===n?(s="center",l+=r/2):(s="right",l=this.right)):s="right",{textAlign:s,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const e=this.chart,t=this.options.position;return"left"===t||"right"===t?{top:0,left:this.left,bottom:e.height,right:this.right}:"top"===t||"bottom"===t?{top:this.top,left:0,bottom:this.bottom,right:e.width}:void 0}drawBackground(){const{ctx:e,options:{backgroundColor:t},left:n,top:a,width:i,height:o}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,a,i,o),e.restore())}getLineWidthForValue(e){const t=this.options.grid;if(!this._isVisible()||!t.display)return 0;const n=this.ticks.findIndex(t=>t.value===e);return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){const t=this.options.grid,n=this.ctx,a=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(e));let i,o;const r=(e,t,a)=>{a.width&&a.color&&(n.save(),n.lineWidth=a.width,n.strokeStyle=a.color,n.setLineDash(a.borderDash||[]),n.lineDashOffset=a.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,o=a.length;i{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:a,draw:()=>{this.drawBorder()}},{z:t,draw:e=>{this.drawLabels(e)}}]:[{z:t,draw:e=>{this.draw(e)}}]}getMatchingVisibleMetas(e){const t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+"AxisID",a=[];let i,o;for(i=0,o=t.length;i{const a=n.split("."),i=a.pop(),o=[e].concat(a).join("."),r=t[n].split("."),s=r.pop(),l=r.join(".");st.route(o,i,l,s)})}(t,e.defaultRoutes),e.descriptors&&st.describe(t,e.descriptors)}(e,o,n),this.override&&st.override(e.id,e.overrides)),o}get(e){return this.items[e]}unregister(e){const t=this.items,n=e.id,a=this.scope;n in t&&delete t[n],a&&n in st[a]&&(delete st[a][n],this.override&&delete at[n])}}var Ya=new class{constructor(){this.controllers=new Ka(Na,"datasets",!0),this.elements=new Ka(Da,"elements"),this.plugins=new Ka(Object,"plugins"),this.scales=new Ka(Ga,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each("register",e)}remove(...e){this._each("unregister",e)}addControllers(...e){this._each("register",e,this.controllers)}addElements(...e){this._each("register",e,this.elements)}addPlugins(...e){this._each("register",e,this.plugins)}addScales(...e){this._each("register",e,this.scales)}getController(e){return this._get(e,this.controllers,"controller")}getElement(e){return this._get(e,this.elements,"element")}getPlugin(e){return this._get(e,this.plugins,"plugin")}getScale(e){return this._get(e,this.scales,"scale")}removeControllers(...e){this._each("unregister",e,this.controllers)}removeElements(...e){this._each("unregister",e,this.elements)}removePlugins(...e){this._each("unregister",e,this.plugins)}removeScales(...e){this._each("unregister",e,this.scales)}_each(e,t,n){[...t].forEach(t=>{const a=n||this._getRegistryForType(t);n||a.isForType(t)||a===this.plugins&&t.id?this._exec(e,a,t):h(t,t=>{const a=n||this._getRegistryForType(t);this._exec(e,a,t)})})}_exec(e,t,n){const a=x(e);d(n["before"+a],[],n),t[e](n),d(n["after"+a],[],n)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(a(t,n),e,"stop"),this._notify(a(n,t),e,"start")}}function Za(e,t){return t||!1!==e?!0===e?{}:e:null}function Ja(e,{plugin:t,local:n},a,i){const o=e.pluginScopeKeys(t),r=e.getOptionScopes(a,o);return n&&t.defaults&&r.push(t.defaults),e.createResolver(r,i,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function Xa(e,t){const n=st.datasets[e]||{};return((t.datasets||{})[e]||{}).indexAxis||t.indexAxis||n.indexAxis||"x"}function ei(e){if("x"===e||"y"===e||"r"===e)return e}function ti(e,...t){if(ei(e))return e;for(const a of t){const t=a.axis||("top"===(n=a.position)||"bottom"===n?"x":"left"===n||"right"===n?"y":void 0)||e.length>1&&ei(e[0].toLowerCase());if(t)return t}var n;throw new Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function ni(e,t,n){if(n[t+"AxisID"]===e)return{axis:t}}function ai(e){const t=e.options||(e.options={});t.plugins=l(t.plugins,{}),t.scales=function(e,t){const n=at[e.type]||{scales:{}},a=t.scales||{},i=Xa(e.type,t),r=Object.create(null);return Object.keys(a).forEach(t=>{const s=a[t];if(!o(s))return console.error(`Invalid scale configuration for scale: ${t}`);if(s._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const l=ti(t,s,function(e,t){if(t.data&&t.data.datasets){const n=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(n.length)return ni(e,"x",n[0])||ni(e,"y",n[0])}return{}}(t,e),st.scales[s.type]),u=function(e,t){return e===t?"_index_":"_value_"}(l,i),c=n.scales||{};r[t]=v(Object.create(null),[{axis:l},s,c[l],c[u]])}),e.data.datasets.forEach(n=>{const i=n.type||e.type,o=n.indexAxis||Xa(i,t),s=(at[i]||{}).scales||{};Object.keys(s).forEach(e=>{const t=function(e,t){let n=e;return"_index_"===e?n=t:"_value_"===e&&(n="x"===t?"y":"x"),n}(e,o),i=n[t+"AxisID"]||t;r[i]=r[i]||Object.create(null),v(r[i],[{axis:t},a[i],s[e]])})}),Object.keys(r).forEach(e=>{const t=r[e];v(t,[st.scales[t.type],st.scale])}),r}(e,t)}function ii(e){return(e=e||{}).datasets=e.datasets||[],e.labels=e.labels||[],e}const oi=new Map,ri=new Set;function si(e,t){let n=oi.get(e);return n||(n=t(),oi.set(e,n),ri.add(n)),n}const li=(e,t,n)=>{const a=k(t,n);void 0!==a&&e.add(a)};class ui{constructor(e){this._config=function(e){return(e=e||{}).data=ii(e.data),ai(e),e}(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=ii(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){const e=this._config;this.clearCache(),ai(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return si(e,()=>[[`datasets.${e}`,""]])}datasetAnimationScopeKeys(e,t){return si(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,""]])}datasetElementScopeKeys(e,t){return si(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,""]])}pluginScopeKeys(e){const t=e.id;return si(`${this.type}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){const n=this._scopeCache;let a=n.get(e);return a&&!t||(a=new Map,n.set(e,a)),a}getOptionScopes(e,t,n){const{options:a,type:i}=this,o=this._cachedScopes(e,n),r=o.get(t);if(r)return r;const s=new Set;t.forEach(t=>{e&&(s.add(e),t.forEach(t=>li(s,e,t))),t.forEach(e=>li(s,a,e)),t.forEach(e=>li(s,at[i]||{},e)),t.forEach(e=>li(s,st,e)),t.forEach(e=>li(s,it,e))});const l=Array.from(s);return 0===l.length&&l.push(Object.create(null)),ri.has(t)&&o.set(t,l),l}chartOptionScopes(){const{options:e,type:t}=this;return[e,at[t]||{},st.datasets[t]||{},{type:t},st,it]}resolveNamedOptions(e,t,n,a=[""]){const o={$shared:!0},{resolver:r,subPrefixes:s}=ci(this._resolverCache,e,a);let l=r;(function(e,t){const{isScriptable:n,isIndexable:a}=jt(e);for(const o of t){const t=n(o),r=a(o),s=(r||t)&&e[o];if(t&&(C(s)||di(s))||r&&i(s))return!0}return!1})(r,t)&&(o.$shared=!1,l=qt(r,n=C(n)?n():n,this.createResolver(e,n,s)));for(const e of t)o[e]=l[e];return o}createResolver(e,t,n=[""],a){const{resolver:i}=ci(this._resolverCache,e,n);return o(t)?qt(i,t,void 0,a):i}}function ci(e,t,n){let a=e.get(t);a||(a=new Map,e.set(t,a));const i=n.join();let o=a.get(i);return o||(o={resolver:Dt(t,n),subPrefixes:n.filter(e=>!e.toLowerCase().includes("hover"))},a.set(i,o)),o}const di=e=>o(e)&&Object.getOwnPropertyNames(e).some(t=>C(e[t])),hi=["top","bottom","left","right","chartArea"];function pi(e,t){return"top"===e||"bottom"===e||-1===hi.indexOf(e)&&"x"===t}function fi(e,t){return function(n,a){return n[e]===a[e]?n[t]-a[t]:n[e]-a[e]}}function mi(e){const t=e.chart,n=t.options.animation;t.notifyPlugins("afterRender"),d(n&&n.onComplete,[e],t)}function _i(e){const t=e.chart,n=t.options.animation;d(n&&n.onProgress,[e],t)}function gi(e){return lt()&&"string"==typeof e?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}const vi={},bi=e=>{const t=gi(e);return Object.values(vi).filter(e=>e.canvas===t).pop()};function yi(e,t,n){const a=Object.keys(e);for(const i of a){const a=+i;if(a>=t){const o=e[i];delete e[i],(n>0||a>t)&&(e[a+n]=o)}}}class wi{static defaults=st;static instances=vi;static overrides=at;static registry=Ya;static version="4.5.1";static getChart=bi;static register(...e){Ya.add(...e),ki()}static unregister(...e){Ya.remove(...e),ki()}constructor(e,t){const a=this.config=new ui(t),i=gi(e),o=bi(i);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");const r=a.createResolver(a.chartOptionScopes(),this.getContext());this.platform=new(a.platform||ba(i)),this.platform.updateConfig(a);const s=this.platform.acquireContext(i,r.aspectRatio),l=s&&s.canvas,u=l&&l.height,c=l&&l.width;this.id=n(),this.ctx=s,this.canvas=l,this.width=c,this.height=u,this._options=r,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Qa,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=de(e=>this.update(e),r.resizeDelay||0),this._dataChanges=[],vi[this.id]=this,s&&l?(ge.listen(this,"complete",mi),ge.listen(this,"progress",_i),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:i,_aspectRatio:o}=this;return a(e)?t&&o?o:i?n/i:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return Ya}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():vt(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Ct(this.canvas,this.ctx),this}stop(){return ge.stop(this),this}resize(e,t){ge.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){const n=this.options,a=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(a,e,t,i),r=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,vt(this,r,!0)&&(this.notifyPlugins("resize",{size:o}),d(n.onResize,[this,o],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){h(this.options.scales||{},(e,t)=>{e.id=t})}buildOrUpdateScales(){const e=this.options,t=e.scales,n=this.scales,a=Object.keys(n).reduce((e,t)=>(e[t]=!1,e),{});let i=[];t&&(i=i.concat(Object.keys(t).map(e=>{const n=t[e],a=ti(e,n),i="r"===a,o="x"===a;return{options:n,dposition:i?"chartArea":o?"bottom":"left",dtype:i?"radialLinear":o?"category":"linear"}}))),h(i,t=>{const i=t.options,o=i.id,r=ti(o,i),s=l(i.type,t.dtype);void 0!==i.position&&pi(i.position,r)===pi(t.dposition)||(i.position=t.dposition),a[o]=!0;let u=null;o in n&&n[o].type===s?u=n[o]:(u=new(Ya.getScale(s))({id:o,type:s,ctx:this.ctx,chart:this}),n[u.id]=u),u.init(i,e)}),h(a,(e,t)=>{e||delete n[t]}),h(n,e=>{ta.configure(this,e,e.options),ta.addBox(this,e)})}_updateMetasets(){const e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort((e,t)=>e.index-t.index),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,n)=>{0===t.filter(t=>t===e._dataset).length&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){const e=[],t=this.data.datasets;let n,a;for(this._removeUnreferencedMetasets(),n=0,a=t.length;n{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(e){const t=this.config;t.update();const n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),a=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:e,cancelable:!0}))return;const i=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let e=0,t=this.data.datasets.length;e{e.reset()}),this._updateDatasets(e),this.notifyPlugins("afterUpdate",{mode:e}),this._layers.sort(fi("z","_idx"));const{_active:r,_lastEvent:s}=this;s?this._eventHandler(s,!0):r.length&&this._updateHoverStyles(r,r,!0),this.render()}_updateScales(){h(this.scales,e=>{ta.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const e=this.options,t=new Set(Object.keys(this._listeners)),n=new Set(e.events);T(t,n)&&!!this._responsiveListeners===e.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(const{method:n,start:a,count:i}of t)yi(e,a,"_removeElements"===n?-i:i)}_getUniformDataChanges(){const e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];const t=this.data.datasets.length,n=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+","+e.splice(1).join(","))),a=n(0);for(let e=1;ee.split(",")).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;ta.update(this,this.width,this.height,e);const t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],h(this.boxes,e=>{n&&"chartArea"===e.position||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins("afterLayout")}_updateDatasets(e){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:e,cancelable:!0})){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(e){const t=this.ctx,n={meta:e,index:e.index,cancelable:!0},a=Nn(this,e);!1!==this.notifyPlugins("beforeDatasetDraw",n)&&(a&&At(t,a),e.controller.draw(),a&&Lt(t),n.cancelable=!1,this.notifyPlugins("afterDatasetDraw",n))}isPointInArea(e){return Et(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,a){const i=Vn.modes[t];return"function"==typeof i?i(this,e,n,a):[]}getDatasetMeta(e){const t=this.data.datasets[e],n=this._metasets;let a=n.filter(e=>e&&e._dataset===t).pop();return a||(a={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(a)),a}getContext(){return this.$context||(this.$context=xn(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){const t=this.data.datasets[e];if(!t)return!1;const n=this.getDatasetMeta(e);return"boolean"==typeof n.hidden?!n.hidden:!t.hidden}setDatasetVisibility(e,t){this.getDatasetMeta(e).hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){const a=n?"show":"hide",i=this.getDatasetMeta(e),o=i.controller._resolveAnimations(void 0,a);S(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),o.update(i,{visible:n}),this.update(t=>t.datasetIndex===e?a:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){const t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),ge.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,a),e[n]=a},a=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};h(this.options.events,e=>n(e,a))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const e=this._responsiveListeners,t=this.platform,n=(n,a)=>{t.addEventListener(this,n,a),e[n]=a},a=(n,a)=>{e[n]&&(t.removeEventListener(this,n,a),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)};let o;const r=()=>{a("attach",r),this.attached=!0,this.resize(),n("resize",i),n("detach",o)};o=()=>{this.attached=!1,a("resize",i),this._stop(),this._resize(0,0),n("attach",r)},t.isAttached(this.canvas)?r():o()}unbindEvents(){h(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},h(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){const a=n?"set":"remove";let i,o,r,s;for("dataset"===t&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller["_"+a+"DatasetHoverStyle"]()),r=0,s=e.length;r{const n=this.getDatasetMeta(e);if(!n)throw new Error("No dataset found at index "+e);return{datasetIndex:e,element:n.data[t],index:t}});!p(n,t)&&(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return 1===this._plugins._cache.filter(t=>t.plugin.id===e).length}_updateHoverStyles(e,t,n){const a=this.options.hover,i=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),o=i(t,e),r=n?e:i(e,t);o.length&&this.updateHoverStyle(o,a.mode,!1),r.length&&a.mode&&this.updateHoverStyle(r,a.mode,!0)}_eventHandler(e,t){const n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},a=t=>(t.options.events||this.options.events).includes(e.native.type);if(!1===this.notifyPlugins("beforeEvent",n,a))return;const i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins("afterEvent",n,a),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){const{_active:a=[],options:i}=this,o=t,r=this._getActiveElements(e,a,n,o),s=P(e),l=function(e,t,n,a){return n&&"mouseout"!==e.type?a?t:e:null}(e,this._lastEvent,n,s);n&&(this._lastEvent=null,d(i.onHover,[e,r,this],this),s&&d(i.onClick,[e,r,this],this));const u=!p(r,a);return(u||t)&&(this._active=r,this._updateHoverStyles(r,a,t)),this._lastEvent=l,u}_getActiveElements(e,t,n,a){if("mouseout"===e.type)return[];if(!n)return t;const i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,a)}}function ki(){return h(wi.instances,e=>e._plugins.invalidate())}function xi(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class Si{static override(e){Object.assign(Si.prototype,e)}options;constructor(e){this.options=e||{}}init(){}formats(){return xi()}parse(){return xi()}format(){return xi()}add(){return xi()}diff(){return xi()}startOf(){return xi()}endOf(){return xi()}}var Ci={_date:Si};function Ti(e){const t=e.iScale,n=function(e,t){if(!e._cache.$bar){const n=e.getMatchingVisibleMetas(t);let a=[];for(let t=0,i=n.length;te-t))}return e._cache.$bar}(t,e.type);let a,i,o,r,s=t._length;const l=()=>{32767!==o&&-32768!==o&&(S(r)&&(s=Math.min(s,Math.abs(o-r)||s)),r=o)};for(a=0,i=n.length;aMath.abs(s)&&(l=s,u=r),t[n.axis]=u,t._custom={barStart:l,barEnd:u,start:i,end:o,min:r,max:s}}(e,t,n,a):t[n.axis]=n.parse(e,a),t}function Ei(e,t,n,a){const i=e.iScale,o=e.vScale,r=i.getLabels(),s=i===o,l=[];let u,c,d,h;for(u=n,c=n+a;ue.x,n="left",a="right"):(t=e.base"spacing"!==e,_indexable:e=>"spacing"!==e&&!e.startsWith("borderDash")&&!e.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){const t=e.data,{labels:{pointStyle:n,textAlign:a,color:i,useBorderRadius:o,borderRadius:r}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,s)=>{const l=e.getDatasetMeta(0).controller.getStyle(s);return{text:t,fillStyle:l.backgroundColor,fontColor:i,hidden:!e.getDataVisibility(s),lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:l.borderWidth,strokeStyle:l.borderColor,textAlign:a,pointStyle:n,borderRadius:o&&(r||l.borderRadius),index:s}}):[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}};constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){const n=this.getDataset().data,a=this._cachedMeta;if(!1===this._parsing)a._parsed=n;else{let i,r,s=e=>+n[e];if(o(n[e])){const{key:e="value"}=this._parsing;s=t=>+k(n[t],e)}for(i=e,r=e+t;iZ(e,s,l,!0)?1:Math.max(t,t*n,a,a*n),f=(e,t,a)=>Z(e,s,l,!0)?-1:Math.min(t,t*n,a,a*n),m=p(0,u,d),_=p(z,c,h),g=f(E,u,d),v=f(E+z,c,h);a=(m-g)/2,i=(_-v)/2,o=-(m+g)/2,r=-(_+v)/2}return{ratioX:a,ratioY:i,offsetX:o,offsetY:r}}(h,d,s),g=(n.width-o)/p,v=(n.height-o)/f,b=Math.max(Math.min(g,v)/2,0),y=c(this.options.radius,b),w=(y-Math.max(y*s,0))/this._getVisibleDatasetWeightTotal();this.offsetX=m*y,this.offsetY=_*y,a.total=this.calculateTotal(),this.outerRadius=y-w*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-w*l,0),this.updateElements(i,0,i.length,e)}_circumference(e,t){const n=this.options,a=this._cachedMeta,i=this._getCircumference();return t&&n.animation.animateRotate||!this.chart.getDataVisibility(e)||null===a._parsed[e]||a.data[e].hidden?0:this.calculateCircumference(a._parsed[e]*i/A)}updateElements(e,t,n,a){const i="reset"===a,o=this.chart,r=o.chartArea,s=o.options.animation,l=(r.left+r.right)/2,u=(r.top+r.bottom)/2,c=i&&s.animateScale,d=c?0:this.innerRadius,h=c?0:this.outerRadius,{sharedOptions:p,includeOptions:f}=this._getSharedOptions(t,a);let m,_=this._getRotation();for(m=0;m0&&!isNaN(e)?A*(Math.abs(e)/t):0}getLabelAndValue(e){const t=this._cachedMeta,n=this.chart,a=n.data.labels||[],i=et(t._parsed[e],n.options.locale);return{label:a[e]||"",value:i}}getMaxBorderWidth(e){let t=0;const n=this.chart;let a,i,o,r,s;if(!e)for(a=0,i=n.data.datasets.length;a{const o=e.getDatasetMeta(0).controller.getStyle(i);return{text:t,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:a,lineWidth:o.borderWidth,pointStyle:n,hidden:!e.getDataVisibility(i),index:i}})}return[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(e,t){super(e,t),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(e){const t=this._cachedMeta,n=this.chart,a=n.data.labels||[],i=et(t._parsed[e].r,n.options.locale);return{label:a[e]||"",value:i}}parseObjectData(e,t,n,a){return Qt.bind(this)(e,t,n,a)}update(e){const t=this._cachedMeta.data;this._updateRadius(),this.updateElements(t,0,t.length,e)}getMinMax(){const e=this._cachedMeta,t={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return e.data.forEach((e,n)=>{const a=this.getParsed(n).r;!isNaN(a)&&this.chart.getDataVisibility(n)&&(at.max&&(t.max=a))}),t}_updateRadius(){const e=this.chart,t=e.chartArea,n=e.options,a=Math.min(t.right-t.left,t.bottom-t.top),i=Math.max(a/2,0),o=(i-Math.max(n.cutoutPercentage?i/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();this.outerRadius=i-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(e,t,n,a){const i="reset"===a,o=this.chart,r=o.options.animation,s=this._cachedMeta.rScale,l=s.xCenter,u=s.yCenter,c=s.getIndexAngle(0)-.5*E;let d,h=c;const p=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&t++}),t}_computeAngle(e,t,n){return this.chart.getDataVisibility(e)?U(this.resolveDataElementOptions(e,t).angle||n):0}}var Ni=Object.freeze({__proto__:null,BarController:class extends Na{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(e,t,n,a){return Ei(e,t,n,a)}parseArrayData(e,t,n,a){return Ei(e,t,n,a)}parseObjectData(e,t,n,a){const{iScale:i,vScale:o}=e,{xAxisKey:r="x",yAxisKey:s="y"}=this._parsing,l="x"===i.axis?r:s,u="x"===o.axis?r:s,c=[];let d,h,p,f;for(d=n,h=n+a;de.controller.options.grouped),o=n.options.stacked,r=[],s=this._cachedMeta.controller.getParsed(t),l=s&&s[n.axis],u=e=>{const t=e._parsed.find(e=>e[n.axis]===l),i=t&&t[e.vScale.axis];if(a(i)||isNaN(i))return!0};for(const n of i)if((void 0===t||!u(n))&&((!1===o||-1===r.indexOf(n.stack)||void 0===o&&void 0===n.stack)&&r.push(n.stack),n.index===e))break;return r.length||r.push(void 0),r}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(n=>e[n].axis===t).shift()}_getAxis(){const e={},t=this.getFirstScaleIdForIndexAxis();for(const n of this.chart.data.datasets)e[l("x"===this.chart.options.indexAxis?n.xAxisID:n.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,n){const a=this._getStacks(e,n),i=void 0!==t?a.indexOf(t):-1;return-1===i?a.length-1:i}_getRuler(){const e=this.options,t=this._cachedMeta,n=t.iScale,a=[];let i,o;for(i=0,o=t.data.length;i=n?1:-1)}(h,t,s)*r,p===s&&(g-=h/2);const e=t.getPixelForDecimal(0),a=t.getPixelForDecimal(1),o=Math.min(e,a),u=Math.max(e,a);g=Math.max(Math.min(g,u),o),d=g+h,n&&!c&&(l._stacks[t.axis]._visualValues[i]=t.getValueForPixel(d)-t.getValueForPixel(g))}if(g===t.getPixelForValue(s)){const e=D(h)*t.getLineWidthForValue(s)/2;g+=e,h-=e}return{size:h,base:g,head:d,center:d+h/2}}_calculateBarIndexPixels(e,t){const n=t.scale,i=this.options,o=i.skipNull,r=l(i.maxBarThickness,1/0);let s,u;const c=this._getAxisCount();if(t.grouped){const n=o?this._getStackCount(e):t.stackCount,d="flex"===i.barThickness?function(e,t,n,a){const i=t.pixels,o=i[e];let r=e>0?i[e-1]:null,s=e=0;--n)t=Math.max(t,e[n].size(this.resolveDataElementOptions(n))/2);return t>0&&t}getLabelAndValue(e){const t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:a,yScale:i}=t,o=this.getParsed(e),r=a.getLabelForValue(o.x),s=i.getLabelForValue(o.y),l=o._custom;return{label:n[e]||"",value:"("+r+", "+s+(l?", "+l:"")+")"}}update(e){const t=this._cachedMeta.data;this.updateElements(t,0,t.length,e)}updateElements(e,t,n,a){const i="reset"===a,{iScale:o,vScale:r}=this._cachedMeta,{sharedOptions:s,includeOptions:l}=this._getSharedOptions(t,a),u=o.axis,c=r.axis;for(let d=t;d0&&this.getParsed(t-1);for(let n=0;n=v){b.skip=!0;continue}const w=this.getParsed(n),k=a(w[p]),x=b[h]=r.getPixelForValue(w[h],n),S=b[p]=o||k?s.getBasePixel():s.getPixelForValue(l?this.applyStack(s,w,l):w[p],n);b.skip=isNaN(x)||isNaN(S)||k,b.stop=n>0&&Math.abs(w[h]-y[h])>_,m&&(b.parsed=w,b.raw=u.data[n]),d&&(b.options=c||this.resolveDataElementOptions(n,f.active?"active":i)),g||this.updateElement(f,n,b,i),y=w}}getMaxOverflow(){const e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,a=e.data||[];if(!a.length)return n;const i=a[0].size(this.resolveDataElementOptions(0)),o=a[a.length-1].size(this.resolveDataElementOptions(a.length-1));return Math.max(n,i,o)/2}draw(){const e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}},PieController:class extends Oi{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:Ii,RadarController:class extends Na{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(e){const t=this._cachedMeta.vScale,n=this.getParsed(e);return{label:t.getLabels()[e],value:""+t.getLabelForValue(n[t.axis])}}parseObjectData(e,t,n,a){return Qt.bind(this)(e,t,n,a)}update(e){const t=this._cachedMeta,n=t.dataset,a=t.data||[],i=t.iScale.getLabels();if(n.points=a,"resize"!==e){const t=this.resolveDatasetElementOptions(e);this.options.showLine||(t.borderWidth=0);const o={_loop:!0,_fullLoop:i.length===a.length,options:t};this.updateElement(n,void 0,o,e)}this.updateElements(a,0,a.length,e)}updateElements(e,t,n,a){const i=this._cachedMeta.rScale,o="reset"===a;for(let r=t;r0&&this.getParsed(t-1);for(let c=t;c0&&Math.abs(n[p]-b[p])>g,_&&(m.parsed=n,m.raw=u.data[c]),h&&(m.options=d||this.resolveDataElementOptions(c,t.active?"active":i)),v||this.updateElement(t,c,m,i),b=n}this.updateSharedOptions(d,i,c)}getMaxOverflow(){const e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}const n=e.dataset,a=n.options&&n.options.borderWidth||0;if(!t.length)return a;const i=t[0].size(this.resolveDataElementOptions(0)),o=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(a,i,o)/2}}});function Di(e,t,n,a){return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}function qi(e,t,n,a,i,o){const{x:r,y:s,startAngle:l,pixelMargin:u,innerRadius:c}=t,d=Math.max(t.outerRadius+a+n-u,0),h=c>0?c+a+n+u:0;let p=0;const f=i-l;if(a){const e=((c>0?c-a:0)+(d>0?d-a:0))/2;p=(f-(0!==e?f*e/(e+a):f))/2}const m=(f-Math.max(.001,f*d-n/E)/d)/2,_=l+m+p,g=i-m-p,{outerStart:v,outerEnd:b,innerStart:y,innerEnd:w}=function(e,t,n,a){const i=_n(e.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]),o=(n-t)/2,r=Math.min(o,a*t/2),s=e=>{const t=(n-Math.min(o,e))*a/2;return J(e,0,Math.min(o,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:J(i.innerStart,0,r),innerEnd:J(i.innerEnd,0,r)}}(t,h,d,g-_),k=d-v,x=d-b,S=_+v/k,C=g-b/x,T=h+y,P=h+w,A=_+y/T,L=g-w/P;if(e.beginPath(),o){const t=(S+C)/2;if(e.arc(r,s,d,S,t),e.arc(r,s,d,t,C),b>0){const t=Di(x,C,r,s);e.arc(t.x,t.y,b,C,g+z)}const n=Di(P,g,r,s);if(e.lineTo(n.x,n.y),w>0){const t=Di(P,L,r,s);e.arc(t.x,t.y,w,g+z,L+Math.PI)}const a=(g-w/h+(_+y/h))/2;if(e.arc(r,s,h,g-w/h,a,!0),e.arc(r,s,h,a,_+y/h,!0),y>0){const t=Di(T,A,r,s);e.arc(t.x,t.y,y,A+Math.PI,_-z)}const i=Di(k,_,r,s);if(e.lineTo(i.x,i.y),v>0){const t=Di(k,S,r,s);e.arc(t.x,t.y,v,_-z,S)}}else{e.moveTo(r,s);const t=Math.cos(S)*d+r,n=Math.sin(S)*d+s;e.lineTo(t,n);const a=Math.cos(C)*d+r,i=Math.sin(C)*d+s;e.lineTo(a,i)}e.closePath()}function ji(e,t,n=t){e.lineCap=l(n.borderCapStyle,t.borderCapStyle),e.setLineDash(l(n.borderDash,t.borderDash)),e.lineDashOffset=l(n.borderDashOffset,t.borderDashOffset),e.lineJoin=l(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=l(n.borderWidth,t.borderWidth),e.strokeStyle=l(n.borderColor,t.borderColor)}function Bi(e,t,n){e.lineTo(n.x,n.y)}function Fi(e,t,n={}){const a=e.length,{start:i=0,end:o=a-1}=n,{start:r,end:s}=t,l=Math.max(i,r),u=Math.min(o,s),c=is&&o>s;return{count:a,start:l,loop:t.loop,ilen:u(r+(u?s-e:e))%o,b=()=>{p!==f&&(e.lineTo(_,f),e.lineTo(_,p),e.lineTo(_,m))};for(l&&(d=i[v(0)],e.moveTo(d.x,d.y)),c=0;c<=s;++c){if(d=i[v(c)],d.skip)continue;const t=d.x,n=d.y,a=0|t;a===h?(nf&&(f=n),_=(g*_+t)/++g):(b(),e.lineTo(t,n),h=a,g=0,p=f=n),m=n}b()}function Ui(e){const t=e.options,n=t.borderDash&&t.borderDash.length;return e._decimated||e._loop||t.tension||"monotone"===t.cubicInterpolationMode||t.stepped||n?$i:Vi}const Hi="function"==typeof Path2D;class Wi extends Da{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:e=>"borderDash"!==e&&"fill"!==e};constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){const n=this.options;if((n.tension||"monotone"===n.cubicInterpolationMode)&&!n.stepped&&!this._pointsUpdated){const a=n.spanGaps?this._loop:this._fullLoop;an(this._points,n,e,a,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Mn(this,this.options.segment))}first(){const e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){const e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){const n=this.options,a=e[t],i=this.points,o=Ln(this,{property:t,start:a,end:a});if(!o.length)return;const r=[],s=function(e){return e.stepped?cn:e.tension||"monotone"===e.cubicInterpolationMode?dn:un}(n);let l,u;for(l=0,u=o.length;l"borderDash"!==e};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(e){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,t,n){const a=this.getProps(["x","y"],n),{angle:i,distance:o}=G(a,{x:e,y:t}),{startAngle:r,endAngle:s,innerRadius:u,outerRadius:c,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],n),h=(this.options.spacing+this.options.borderWidth)/2,p=l(d,s-r),f=Z(i,r,s)&&r!==s,m=p>=A||f,_=ee(o,u+h,c+h);return m&&_}getCenterPoint(e){const{x:t,y:n,startAngle:a,endAngle:i,innerRadius:o,outerRadius:r}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],e),{offset:s,spacing:l}=this.options,u=(a+i)/2,c=(o+r+l+s)/2;return{x:t+Math.cos(u)*c,y:n+Math.sin(u)*c}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){const{options:t,circumference:n}=this,a=(t.offset||0)/4,i=(t.spacing||0)/2,o=t.circular;if(this.pixelMargin="inner"===t.borderAlign?.33:0,this.fullCircles=n>A?Math.floor(n/A):0,0===n||this.innerRadius<0||this.outerRadius<0)return;e.save();const r=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(r)*a,Math.sin(r)*a);const s=a*(1-Math.sin(Math.min(E,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,function(e,t,n,a,i){const{fullCircles:o,startAngle:r,circumference:s}=t;let l=t.endAngle;if(o){qi(e,t,n,a,l,i);for(let t=0;ti?(u=i/l,e.arc(o,r,l,n+u,a-u,!0)):e.arc(o,r,i,n+z,a-z),e.closePath(),e.clip()}(e,t,m),l.selfJoin&&m-r>=E&&0===p&&"miter"!==c&&function(e,t,n){const{startAngle:a,x:i,y:o,outerRadius:r,innerRadius:s,options:l}=t,{borderWidth:u,borderJoinStyle:c}=l,d=Math.min(u/r,Q(a-n));if(e.beginPath(),e.arc(i,o,r-u/2,a+d/2,n-d/2),s>0){const t=Math.min(u/s,Q(a-n));e.arc(i,o,s+u/2,n-t/2,a+t/2,!0)}else{const t=Math.min(u/2,r*Q(a-n));if("round"===c)e.arc(i,o,t,n-E/2,a+E/2,!0);else if("bevel"===c){const r=2*t*t,s=-r*Math.cos(n+E/2)+i,l=-r*Math.sin(n+E/2)+o,u=r*Math.cos(a+E/2)+i,c=r*Math.sin(a+E/2)+o;e.lineTo(s,l),e.lineTo(u,c)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip("evenodd")}(e,t,m),o||(qi(e,t,n,a,m,i),e.stroke())}(e,this,s,i,o),e.restore()}},BarElement:class extends Da{static id="bar";static defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,inflateAmount:"auto",pointStyle:void 0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(e){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,e&&Object.assign(this,e)}draw(e){const{inflateAmount:t,options:{borderColor:n,backgroundColor:a}}=this,{inner:i,outer:o}=Qi(this),r=(s=o.radius).topLeft||s.topRight||s.bottomLeft||s.bottomRight?Nt:Ji;var s;e.save(),o.w===i.w&&o.h===i.h||(e.beginPath(),r(e,Xi(o,t,i)),e.clip(),r(e,Xi(i,-t,o)),e.fillStyle=n,e.fill("evenodd")),e.beginPath(),r(e,Xi(i,t)),e.fillStyle=a,e.fill(),e.restore()}inRange(e,t,n){return Zi(this,e,t,n)}inXRange(e,t){return Zi(this,e,null,t)}inYRange(e,t){return Zi(this,null,e,t)}getCenterPoint(e){const{x:t,y:n,base:a,horizontal:i}=this.getProps(["x","y","base","horizontal"],e);return{x:i?(t+a)/2:t,y:i?n:(n+a)/2}}getRange(e){return"x"===e?this.width/2:this.height/2}},LineElement:Wi,PointElement:class extends Da{static id="point";parsed;skip;stop;static defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(e){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,e&&Object.assign(this,e)}inRange(e,t,n){const a=this.options,{x:i,y:o}=this.getProps(["x","y"],n);return Math.pow(e-i,2)+Math.pow(t-o,2)=0&&ea=t?a:e,r=e=>i=n?i:e;if(e){const e=D(a),t=D(i);e<0&&t<0?r(0):e>0&&t>0&&o(0)}if(a===i){let t=0===i?1:Math.abs(.05*i);r(i+t),e||o(a-t)}this.min=a,this.max=i}getTickLimit(){const e=this.options.ticks;let t,{maxTicksLimit:n,stepSize:a}=e;return a?(t=Math.ceil(this.max/a)-Math.floor(this.min/a)+1,t>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${a} would result generating up to ${t} ticks. Limiting to 1000.`),t=1e3)):(t=this.computeTickLimit(),n=n||11),n&&(t=Math.min(n,t)),t}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const e=this.options,t=e.ticks;let n=this.getTickLimit();n=Math.max(2,n);const i=function(e,t){const n=[],{bounds:i,step:o,min:r,max:s,precision:l,count:u,maxTicks:c,maxDigits:d,includeBounds:h}=e,p=o||1,f=c-1,{min:m,max:_}=t,g=!a(r),v=!a(s),b=!a(u),y=(_-m)/(d+1);let w,k,x,S,C=j((_-m)/f/p)*p;if(C<1e-14&&!g&&!v)return[{value:m},{value:_}];S=Math.ceil(_/C)-Math.floor(m/C),S>f&&(C=j(S*C/f/p)*p),a(l)||(w=Math.pow(10,l),C=Math.ceil(C*w)/w),"ticks"===i?(k=Math.floor(m/C)*C,x=Math.ceil(_/C)*C):(k=m,x=_),g&&v&&o&&$((s-r)/o,C/1e3)?(S=Math.round(Math.min((s-r)/C,c)),C=(s-r)/S,k=r,x=s):b?(k=g?r:k,x=v?s:x,S=u-1,C=(x-k)/S):(S=(x-k)/C,S=q(S,Math.round(S),C/1e3)?Math.round(S):Math.ceil(S));const T=Math.max(W(C),W(k));w=Math.pow(10,a(l)?T:l),k=Math.round(k*w)/w,x=Math.round(x*w)/w;let P=0;for(g&&(h&&k!==r?(n.push({value:r}),ks)break;n.push({value:e})}return v&&h&&x!==s?n.length&&q(n[n.length-1].value,s,no(s,y,e))?n[n.length-1].value=s:n.push({value:s}):v&&x!==s||n.push({value:x}),n}({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:!1!==t.includeBounds},this._range||this);return"ticks"===e.bounds&&V(i,this,"value"),e.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}configure(){const e=this.ticks;let t=this.min,n=this.max;if(super.configure(),this.options.offset&&e.length){const a=(n-t)/Math.max(e.length-1,1)/2;t-=a,n+=a}this._startValue=t,this._endValue=n,this._valueRange=n-t}getLabelForValue(e){return et(e,this.chart.options.locale,this.options.ticks.format)}}class io extends ao{static id="linear";static defaults={ticks:{callback:nt.formatters.numeric}};determineDataLimits(){const{min:e,max:t}=this.getMinMax(!0);this.min=r(e)?e:0,this.max=r(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){const e=this.isHorizontal(),t=e?this.width:this.height,n=U(this.options.ticks.minRotation),a=(e?Math.sin(n):Math.cos(n))||.001,i=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,i.lineHeight/a))}getPixelForValue(e){return null===e?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}}const oo=e=>Math.floor(N(e)),ro=(e,t)=>Math.pow(10,oo(e)+t);function so(e){return 1===e/Math.pow(10,oo(e))}function lo(e,t,n){const a=Math.pow(10,n),i=Math.floor(e/a);return Math.ceil(t/a)-i}class uo extends Ga{static id="logarithmic";static defaults={ticks:{callback:nt.formatters.logarithmic,major:{enabled:!0}}};constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){const n=ao.prototype.parse.apply(this,[e,t]);if(0!==n)return r(n)&&n>0?n:null;this._zero=!0}determineDataLimits(){const{min:e,max:t}=this.getMinMax(!0);this.min=r(e)?Math.max(0,e):null,this.max=r(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!r(this._userMin)&&(this.min=e===ro(this.min,0)?ro(this.min,-1):ro(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:e,maxDefined:t}=this.getUserBounds();let n=this.min,a=this.max;const i=t=>n=e?n:t,o=e=>a=t?a:e;n===a&&(n<=0?(i(1),o(10)):(i(ro(n,-1)),o(ro(a,1)))),n<=0&&i(ro(a,-1)),a<=0&&o(ro(n,1)),this.min=n,this.max=a}buildTicks(){const e=this.options,t=function(e,{min:t,max:n}){t=s(e.min,t);const a=[],i=oo(t);let o=function(e,t){let n=oo(t-e);for(;lo(e,t,n)>10;)n++;for(;lo(e,t,n)<10;)n--;return Math.min(n,oo(e))}(t,n),r=o<0?Math.pow(10,Math.abs(o)):1;const l=Math.pow(10,o),u=i>o?Math.pow(10,i):0,c=Math.round((t-u)*r)/r,d=Math.floor((t-u)/l/10)*l*10;let h=Math.floor((c-d)/Math.pow(10,o)),p=s(e.min,Math.round((u+d+h*Math.pow(10,o))*r)/r);for(;p=10?h=h<15?15:20:h++,h>=20&&(o++,h=2,r=o>=0?1:r),p=Math.round((u+d+h*Math.pow(10,o))*r)/r;const f=s(e.max,p);return a.push({value:f,major:so(f),significand:h}),a}({min:this._userMin,max:this._userMax},this);return"ticks"===e.bounds&&V(t,this,"value"),e.reverse?(t.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),t}getLabelForValue(e){return void 0===e?"0":et(e,this.chart.options.locale,this.options.ticks.format)}configure(){const e=this.min;super.configure(),this._startValue=N(e),this._valueRange=N(this.max)-N(e)}getPixelForValue(e){return void 0!==e&&0!==e||(e=this.min),null===e||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(N(e)-this._startValue)/this._valueRange)}getValueForPixel(e){const t=this.getDecimalForPixel(e);return Math.pow(10,this._startValue+t*this._valueRange)}}function co(e){const t=e.ticks;if(t.display&&e.display){const e=bn(t.backdropPadding);return l(t.font&&t.font.size,st.font.size)+e.height}return 0}function ho(e,t,n,a,i){return e===a||e===i?{start:t-n/2,end:t+n/2}:ei?{start:t-n,end:t}:{start:t,end:t+n}}function po(e,t,n,a,i){const o=Math.abs(Math.sin(n)),r=Math.abs(Math.cos(n));let s=0,l=0;a.startt.r&&(s=(a.end-t.r)/o,e.r=Math.max(e.r,t.r+s)),i.startt.b&&(l=(i.end-t.b)/r,e.b=Math.max(e.b,t.b+l))}function fo(e,t,n){const a=e.drawingArea,{extra:i,additionalAngle:o,padding:r,size:s}=n,l=e.getPointPosition(t,a+i+r,o),u=Math.round(H(Q(l.angle+z))),c=function(e,t,n){return 90===n||270===n?e-=t/2:(n>270||n<90)&&(e-=t),e}(l.y,s.h,u),d=function(e){return 0===e||180===e?"center":e<180?"left":"right"}(u),h=function(e,t,n){return"right"===n?e-=t:"center"===n&&(e-=t/2),e}(l.x,s.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:h,top:c,right:h+s.w,bottom:c+s.h}}function mo(e,t){if(!t)return!0;const{left:n,top:a,right:i,bottom:o}=e;return!(Et({x:n,y:a},t)||Et({x:n,y:o},t)||Et({x:i,y:a},t)||Et({x:i,y:o},t))}function _o(e,t,n){const{left:i,top:o,right:r,bottom:s}=n,{backdropColor:l}=t;if(!a(l)){const n=vn(t.borderRadius),a=bn(t.backdropPadding);e.fillStyle=l;const u=i-a.left,c=o-a.top,d=r-i+a.width,h=s-o+a.height;Object.values(n).some(e=>0!==e)?(e.beginPath(),Nt(e,{x:u,y:c,w:d,h:h,radius:n}),e.fill()):e.fillRect(u,c,d,h)}}function go(e,t,n,a){const{ctx:i}=e;if(n)i.arc(e.xCenter,e.yCenter,t,0,A);else{let n=e.getPointPosition(0,t);i.moveTo(n.x,n.y);for(let o=1;oe,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(e){super(e),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const e=this._padding=bn(co(this.options)/2),t=this.width=this.maxWidth-e.width,n=this.height=this.maxHeight-e.height;this.xCenter=Math.floor(this.left+t/2+e.left),this.yCenter=Math.floor(this.top+n/2+e.top),this.drawingArea=Math.floor(Math.min(t,n)/2)}determineDataLimits(){const{min:e,max:t}=this.getMinMax(!1);this.min=r(e)&&!isNaN(e)?e:0,this.max=r(t)&&!isNaN(t)?t:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/co(this.options))}generateTickLabels(e){ao.prototype.generateTickLabels.call(this,e),this._pointLabels=this.getLabels().map((e,t)=>{const n=d(this.options.pointLabels.callback,[e,t],this);return n||0===n?n:""}).filter((e,t)=>this.chart.getDataVisibility(t))}fit(){const e=this.options;e.display&&e.pointLabels.display?function(e){const t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},n=Object.assign({},t),a=[],o=[],r=e._pointLabels.length,s=e.options.pointLabels,l=s.centerPointLabels?E/r:0;for(let h=0;h=0&&e=0;i--){const t=e._pointLabelItems[i];if(!t.visible)continue;const o=a.setContext(e.getPointLabelContext(i));_o(n,o,t);const r=yn(o.font),{x:s,y:l,textAlign:u}=t;It(n,e._pointLabels[i],s,l+r.lineHeight/2,r,{color:o.color,textAlign:u,textBaseline:"middle"})}}(this,o),a.display&&this.ticks.forEach((e,t)=>{if(0!==t||0===t&&this.min<0){s=this.getDistanceFromCenterForValue(e.value);const n=this.getContext(t),r=a.setContext(n),l=i.setContext(n);!function(e,t,n,a,i){const o=e.ctx,r=t.circular,{color:s,lineWidth:l}=t;!r&&!a||!s||!l||n<0||(o.save(),o.strokeStyle=s,o.lineWidth=l,o.setLineDash(i.dash||[]),o.lineDashOffset=i.dashOffset,o.beginPath(),go(e,n,r,a),o.closePath(),o.stroke(),o.restore())}(this,r,s,o,l)}}),n.display){for(e.save(),r=o-1;r>=0;r--){const a=n.setContext(this.getPointLabelContext(r)),{color:i,lineWidth:o}=a;o&&i&&(e.lineWidth=o,e.strokeStyle=i,e.setLineDash(a.borderDash),e.lineDashOffset=a.borderDashOffset,s=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),l=this.getPointPosition(r,s),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(l.x,l.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){const e=this.ctx,t=this.options,n=t.ticks;if(!n.display)return;const a=this.getIndexAngle(0);let i,o;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(a),e.textAlign="center",e.textBaseline="middle",this.ticks.forEach((a,r)=>{if(0===r&&this.min>=0&&!t.reverse)return;const s=n.setContext(this.getContext(r)),l=yn(s.font);if(i=this.getDistanceFromCenterForValue(this.ticks[r].value),s.showLabelBackdrop){e.font=l.string,o=e.measureText(a.label).width,e.fillStyle=s.backdropColor;const t=bn(s.backdropPadding);e.fillRect(-o/2-t.left,-i-l.size/2-t.top,o+t.width,l.size+t.height)}It(e,a.label,0,-i,l,{color:s.color,strokeColor:s.textStrokeColor,strokeWidth:s.textStrokeWidth})}),e.restore()}drawTitle(){}}const bo={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},yo=Object.keys(bo);function wo(e,t){return e-t}function ko(e,t){if(a(t))return null;const n=e._adapter,{parser:i,round:o,isoWeekday:s}=e._parseOpts;let l=t;return"function"==typeof i&&(l=i(l)),r(l)||(l="string"==typeof i?n.parse(l,i):n.parse(l)),null===l?null:(o&&(l="week"!==o||!F(s)&&!0!==s?n.startOf(l,o):n.startOf(l,"isoWeek",s)),+l)}function xo(e,t,n,a){const i=yo.length;for(let o=yo.indexOf(e);o=t?n[a]:n[i]]=!0}}else e[t]=!0}function Co(e,t,n){const a=[],i={},o=t.length;let r,s;for(r=0;r=0&&(t[l].major=!0);return t}(e,a,i,n):a}class To extends Ga{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(e){super(e),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(e,t={}){const n=e.time||(e.time={}),a=this._adapter=new Ci._date(e.adapters.date);a.init(t),v(n.displayFormats,a.formats()),this._parseOpts={parser:n.parser,round:n.round,isoWeekday:n.isoWeekday},super.init(e),this._normalized=t.normalized}parse(e,t){return void 0===e?null:ko(this,e)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const e=this.options,t=this._adapter,n=e.time.unit||"day";let{min:a,max:i,minDefined:o,maxDefined:s}=this.getUserBounds();function l(e){o||isNaN(e.min)||(a=Math.min(a,e.min)),s||isNaN(e.max)||(i=Math.max(i,e.max))}o&&s||(l(this._getLabelBounds()),"ticks"===e.bounds&&"labels"===e.ticks.source||l(this.getMinMax(!1))),a=r(a)&&!isNaN(a)?a:+t.startOf(Date.now(),n),i=r(i)&&!isNaN(i)?i:+t.endOf(Date.now(),n)+1,this.min=Math.min(a,i-1),this.max=Math.max(a+1,i)}_getLabelBounds(){const e=this.getLabelTimestamps();let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;return e.length&&(t=e[0],n=e[e.length-1]),{min:t,max:n}}buildTicks(){const e=this.options,t=e.time,n=e.ticks,a="labels"===n.source?this.getLabelTimestamps():this._generate();"ticks"===e.bounds&&a.length&&(this.min=this._userMin||a[0],this.max=this._userMax||a[a.length-1]);const i=this.min,o=ie(a,i,this.max);return this._unit=t.unit||(n.autoSkip?xo(t.minUnit,this.min,this.max,this._getLabelCapacity(i)):function(e,t,n,a,i){for(let o=yo.length-1;o>=yo.indexOf(n);o--){const n=yo[o];if(bo[n].common&&e._adapter.diff(i,a,n)>=t-1)return n}return yo[n?yo.indexOf(n):0]}(this,o.length,t.minUnit,this.min,this.max)),this._majorUnit=n.major.enabled&&"year"!==this._unit?function(e){for(let t=yo.indexOf(e)+1,n=yo.length;t+e.value))}initOffsets(e=[]){let t,n,a=0,i=0;this.options.offset&&e.length&&(t=this.getDecimalForValue(e[0]),a=1===e.length?1-t:(this.getDecimalForValue(e[1])-t)/2,n=this.getDecimalForValue(e[e.length-1]),i=1===e.length?n:(n-this.getDecimalForValue(e[e.length-2]))/2);const o=e.length<3?.5:.25;a=J(a,0,o),i=J(i,0,o),this._offsets={start:a,end:i,factor:1/(a+1+i)}}_generate(){const e=this._adapter,t=this.min,n=this.max,a=this.options,i=a.time,o=i.unit||xo(i.minUnit,t,n,this._getLabelCapacity(t)),r=l(a.ticks.stepSize,1),s="week"===o&&i.isoWeekday,u=F(s)||!0===s,c={};let d,h,p=t;if(u&&(p=+e.startOf(p,"isoWeek",s)),p=+e.startOf(p,u?"day":o),e.diff(n,t,o)>1e5*r)throw new Error(t+" and "+n+" are too far apart with stepSize of "+r+" "+o);const f="data"===a.ticks.source&&this.getDataTimestamps();for(d=p,h=0;d+e)}getLabelForValue(e){const t=this._adapter,n=this.options.time;return n.tooltipFormat?t.format(e,n.tooltipFormat):t.format(e,n.displayFormats.datetime)}format(e,t){const n=this.options.time.displayFormats,a=this._unit,i=t||n[a];return this._adapter.format(e,i)}_tickFormatFunction(e,t,n,a){const i=this.options,o=i.ticks.callback;if(o)return d(o,[e,t,n],this);const r=i.time.displayFormats,s=this._unit,l=this._majorUnit,u=s&&r[s],c=l&&r[l],h=n[t],p=l&&c&&h&&h.major;return this._adapter.format(e,a||(p?c:u))}generateTickLabels(e){let t,n,a;for(t=0,n=e.length;t0?r:1}getDataTimestamps(){let e,t,n=this._cache.data||[];if(n.length)return n;const a=this.getMatchingVisibleMetas();if(this._normalized&&a.length)return this._cache.data=a[0].controller.getAllParsedValues(this);for(e=0,t=a.length;e=e[s].pos&&t<=e[l].pos&&({lo:s,hi:l}=ne(e,"pos",t)),({pos:a,time:o}=e[s]),({pos:i,time:r}=e[l])):(t>=e[s].time&&t<=e[l].time&&({lo:s,hi:l}=ne(e,"time",t)),({time:a,pos:o}=e[s]),({time:i,pos:r}=e[l]));const u=i-a;return u?o+(r-o)*(t-a)/u:o}var Eo=Object.freeze({__proto__:null,CategoryScale:class extends Ga{static id="category";static defaults={ticks:{callback:to}};constructor(e){super(e),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(e){const t=this._addedLabels;if(t.length){const e=this.getLabels();for(const{index:n,label:a}of t)e[n]===a&&e.splice(n,1);this._addedLabels=[]}super.init(e)}parse(e,t){if(a(e))return null;const n=this.getLabels();return((e,t)=>null===e?null:J(Math.round(e),0,t))(t=isFinite(t)&&n[t]===e?t:function(e,t,n,a){const i=e.indexOf(t);return-1===i?((e,t,n,a)=>("string"==typeof t?(n=e.push(t)-1,a.unshift({index:n,label:t})):isNaN(t)&&(n=null),n))(e,t,n,a):i!==e.lastIndexOf(t)?n:i}(n,e,l(t,e),this._addedLabels),n.length-1)}determineDataLimits(){const{minDefined:e,maxDefined:t}=this.getUserBounds();let{min:n,max:a}=this.getMinMax(!0);"ticks"===this.options.bounds&&(e||(n=0),t||(a=this.getLabels().length-1)),this.min=n,this.max=a}buildTicks(){const e=this.min,t=this.max,n=this.options.offset,a=[];let i=this.getLabels();i=0===e&&t===i.length-1?i:i.slice(e,t+1),this._valueRange=Math.max(i.length-(n?0:1),1),this._startValue=this.min-(n?.5:0);for(let n=e;n<=t;n++)a.push({value:n});return a}getLabelForValue(e){return to.call(this,e)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(e){return"number"!=typeof e&&(e=this.parse(e)),null===e?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getPixelForTick(e){const t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:io,LogarithmicScale:uo,RadialLinearScale:vo,TimeScale:To,TimeSeriesScale:class extends To{static id="timeseries";static defaults=To.defaults;constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=Po(t,this.min),this._tableRange=Po(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){const{min:t,max:n}=this,a=[],i=[];let o,r,s,l,u;for(o=0,r=e.length;o=t&&l<=n&&a.push(l);if(a.length<2)return[{time:t,pos:0},{time:n,pos:1}];for(o=0,r=a.length;oe-t)}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;const t=this.getDataTimestamps(),n=this.getLabelTimestamps();return e=t.length&&n.length?this.normalize(t.concat(n)):t.length?t:n,e=this._cache.all=e,e}getDecimalForValue(e){return(Po(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){const t=this._offsets,n=this.getDecimalForPixel(e)/t.factor-t.end;return Po(this._table,n*this._tableRange+this._minPos,!0)}}});const Ao=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Lo=Ao.map(e=>e.replace("rgb(","rgba(").replace(")",", 0.5)"));function Mo(e){return Ao[e%Ao.length]}function Ro(e){return Lo[e%Lo.length]}function zo(e){let t;for(t in e)if(e[t].borderColor||e[t].backgroundColor)return!0;return!1}var Oo={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(e,t,n){if(!n.enabled)return;const{data:{datasets:a},options:i}=e.config,{elements:o}=i,r=zo(a)||(s=i)&&(s.borderColor||s.backgroundColor)||o&&zo(o)||"rgba(0,0,0,0.1)"!==st.borderColor||"rgba(0,0,0,0.1)"!==st.backgroundColor;var s;if(!n.forceOverride&&r)return;const l=function(e){let t=0;return(n,a)=>{const i=e.getDatasetMeta(a).controller;i instanceof Oi?t=function(e,t){return e.backgroundColor=e.data.map(()=>Mo(t++)),t}(n,t):i instanceof Ii?t=function(e,t){return e.backgroundColor=e.data.map(()=>Ro(t++)),t}(n,t):i&&(t=function(e,t){return e.borderColor=Mo(t),e.backgroundColor=Ro(t),++t}(n,t))}}(e);a.forEach(l)}};function Io(e){if(e._decimated){const t=e._data;delete e._decimated,delete e._data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function No(e){e.data.datasets.forEach(e=>{Io(e)})}var Do={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(e,t,n)=>{if(!n.enabled)return void No(e);const i=e.width;e.data.datasets.forEach((t,o)=>{const{_data:r,indexAxis:s}=t,l=e.getDatasetMeta(o),u=r||t.data;if("y"===wn([s,e.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=e.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(e.options.parsing)return;let d,{start:h,count:p}=function(e,t){const n=t.length;let a,i=0;const{iScale:o}=e,{min:r,max:s,minDefined:l,maxDefined:u}=o.getUserBounds();return l&&(i=J(ne(t,o.axis,r).lo,0,n-1)),a=u?J(ne(t,o.axis,s).hi+1,i,n)-i:n-i,{start:i,count:a}}(l,u);if(p<=(n.threshold||4*i))Io(t);else{switch(a(r)&&(t._data=u,delete t.data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(e){this._data=e}})),n.algorithm){case"lttb":d=function(e,t,n,a,i){const o=i.samples||a;if(o>=n)return e.slice(t,t+n);const r=[],s=(n-2)/(o-2);let l=0;const u=t+n-1;let c,d,h,p,f,m=t;for(r[l++]=e[m],c=0;ch&&(h=p,d=e[a],f=a);r[l++]=d,m=f}return r[l++]=e[u],r}(u,h,p,i,n);break;case"min-max":d=function(e,t,n,i){let o,r,s,l,u,c,d,h,p,f,m=0,_=0;const g=[],v=t+n-1,b=e[t].x,y=e[v].x-b;for(o=t;of&&(f=l,d=o),m=(_*m+r.x)/++_;else{const n=o-1;if(!a(c)&&!a(d)){const t=Math.min(c,d),a=Math.max(c,d);t!==h&&t!==n&&g.push({...e[t],x:m}),a!==h&&a!==n&&g.push({...e[a],x:m})}o>0&&n!==h&&g.push(e[n]),g.push(r),u=t,_=0,p=f=l,c=d=h=o}}return g}(u,h,p,i);break;default:throw new Error(`Unsupported decimation algorithm '${n.algorithm}'`)}t._decimated=d}})},destroy(e){No(e)}};function qo(e,t,n,a){if(a)return;let i=t[e],o=n[e];return"angle"===e&&(i=Q(i),o=Q(o)),{property:e,start:i,end:o}}function jo(e,t,n){for(;t>e;t--){const e=n[t];if(!isNaN(e.x)&&!isNaN(e.y))break}return t}function Bo(e,t,n,a){return e&&t?a(e[n],t[n]):e?e[n]:t?t[n]:0}function Fo(e,t){let n=[],a=!1;return i(e)?(a=!0,n=e):n=function(e,t){const{x:n=null,y:a=null}=e||{},i=t.points,o=[];return t.segments.forEach(({start:e,end:t})=>{t=jo(e,t,i);const r=i[e],s=i[t];null!==a?(o.push({x:r.x,y:a}),o.push({x:s.x,y:a})):null!==n&&(o.push({x:n,y:r.y}),o.push({x:n,y:s.y}))}),o}(e,t),n.length?new Wi({points:n,options:{tension:0},_loop:a,_fullLoop:a}):null}function $o(e){return e&&!1!==e.fill}function Vo(e,t,n){let a=e[t].fill;const i=[t];let o;if(!n)return a;for(;!1!==a&&-1===i.indexOf(a);){if(!r(a))return a;if(o=e[a],!o)return!1;if(o.visible)return a;i.push(a),a=o.fill}return!1}function Uo(e,t,n){const a=function(e){const t=e.options,n=t.fill;let a=l(n&&n.target,n);return void 0===a&&(a=!!t.backgroundColor),!1!==a&&null!==a&&(!0===a?"origin":a)}(e);if(o(a))return!isNaN(a.value)&&a;let i=parseFloat(a);return r(i)&&Math.floor(i)===i?function(e,t,n,a){return"-"!==e&&"+"!==e||(n=t+n),!(n===t||n<0||n>=a)&&n}(a[0],t,i,n):["origin","start","end","stack","shape"].indexOf(a)>=0&&a}function Ho(e,t,n){const a=[];for(let i=0;i=0;--t){const n=i[t].$filler;n&&(n.line.updateControlPoints(o,n.axis),a&&n.fill&&Yo(e.ctx,n,o))}},beforeDatasetsDraw(e,t,n){if("beforeDatasetsDraw"!==n.drawTime)return;const a=e.getSortedVisibleDatasetMetas();for(let t=a.length-1;t>=0;--t){const n=a[t].$filler;$o(n)&&Yo(e.ctx,n,e.chartArea)}},beforeDatasetDraw(e,t,n){const a=t.meta.$filler;$o(a)&&"beforeDatasetDraw"===n.drawTime&&Yo(e.ctx,a,e.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const nr=(e,t)=>{let{boxHeight:n=t,boxWidth:a=t}=e;return e.usePointStyle&&(n=Math.min(n,t),a=e.pointStyleWidth||Math.min(a,t)),{boxWidth:a,boxHeight:n,itemHeight:Math.max(t,n)}};class ar extends Da{constructor(e){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t,n){this.maxWidth=e,this.maxHeight=t,this._margins=n,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const e=this.options.labels||{};let t=d(e.generateLabels,[this.chart],this)||[];e.filter&&(t=t.filter(t=>e.filter(t,this.chart.data))),e.sort&&(t=t.sort((t,n)=>e.sort(t,n,this.chart.data))),this.options.reverse&&t.reverse(),this.legendItems=t}fit(){const{options:e,ctx:t}=this;if(!e.display)return void(this.width=this.height=0);const n=e.labels,a=yn(n.font),i=a.size,o=this._computeTitleHeight(),{boxWidth:r,itemHeight:s}=nr(n,i);let l,u;t.font=a.string,this.isHorizontal()?(l=this.maxWidth,u=this._fitRows(o,i,r,s)+10):(u=this.maxHeight,l=this._fitCols(o,a,r,s)+10),this.width=Math.min(l,e.maxWidth||this.maxWidth),this.height=Math.min(u,e.maxHeight||this.maxHeight)}_fitRows(e,t,n,a){const{ctx:i,maxWidth:o,options:{labels:{padding:r}}}=this,s=this.legendHitBoxes=[],l=this.lineWidths=[0],u=a+r;let c=e;i.textAlign="left",i.textBaseline="middle";let d=-1,h=-u;return this.legendItems.forEach((e,p)=>{const f=n+t/2+i.measureText(e.text).width;(0===p||l[l.length-1]+f+2*r>o)&&(c+=u,l[l.length-(p>0?0:1)]=0,h+=u,d++),s[p]={left:0,top:h,row:d,width:f,height:a},l[l.length-1]+=f+r}),c}_fitCols(e,t,n,a){const{ctx:i,maxHeight:o,options:{labels:{padding:r}}}=this,s=this.legendHitBoxes=[],l=this.columnSizes=[],u=o-e;let c=r,d=0,h=0,p=0,f=0;return this.legendItems.forEach((e,o)=>{const{itemWidth:m,itemHeight:_}=function(e,t,n,a,i){const o=function(e,t,n,a){let i=e.text;return i&&"string"!=typeof i&&(i=i.reduce((e,t)=>e.length>t.length?e:t)),t+n.size/2+a.measureText(i).width}(a,e,t,n),r=function(e,t,n){let a=e;return"string"!=typeof t.text&&(a=ir(t,n)),a}(i,a,t.lineHeight);return{itemWidth:o,itemHeight:r}}(n,t,i,e,a);o>0&&h+_+2*r>u&&(c+=d+r,l.push({width:d,height:h}),p+=d+r,f++,d=h=0),s[o]={left:p,top:h,col:f,width:m,height:_},d=Math.max(d,m),h+=_+r}),c+=d,l.push({width:d,height:h}),c}adjustHitBoxes(){if(!this.options.display)return;const e=this._computeTitleHeight(),{legendHitBoxes:t,options:{align:n,labels:{padding:a},rtl:i}}=this,o=Sn(i,this.left,this.width);if(this.isHorizontal()){let i=0,r=pe(n,this.left+a,this.right-this.lineWidths[i]);for(const s of t)i!==s.row&&(i=s.row,r=pe(n,this.left+a,this.right-this.lineWidths[i])),s.top+=this.top+e+a,s.left=o.leftForLtr(o.x(r),s.width),r+=s.width+a}else{let i=0,r=pe(n,this.top+e+a,this.bottom-this.columnSizes[i].height);for(const s of t)s.col!==i&&(i=s.col,r=pe(n,this.top+e+a,this.bottom-this.columnSizes[i].height)),s.top=r,s.left+=this.left+a,s.left=o.leftForLtr(o.x(s.left),s.width),r+=s.height+a}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const e=this.ctx;At(e,this),this._draw(),Lt(e)}}_draw(){const{options:e,columnSizes:t,lineWidths:n,ctx:a}=this,{align:i,labels:o}=e,r=st.color,s=Sn(e.rtl,this.left,this.width),u=yn(o.font),{padding:c}=o,d=u.size,h=d/2;let p;this.drawTitle(),a.textAlign=s.textAlign("left"),a.textBaseline="middle",a.lineWidth=.5,a.font=u.string;const{boxWidth:f,boxHeight:m,itemHeight:_}=nr(o,d),g=this.isHorizontal(),v=this._computeTitleHeight();p=g?{x:pe(i,this.left+c,this.right-n[0]),y:this.top+c+v,line:0}:{x:this.left+c,y:pe(i,this.top+v+c,this.bottom-t[0].height),line:0},Cn(this.ctx,e.textDirection);const b=_+c;this.legendItems.forEach((y,w)=>{a.strokeStyle=y.fontColor,a.fillStyle=y.fontColor;const k=a.measureText(y.text).width,x=s.textAlign(y.textAlign||(y.textAlign=o.textAlign)),S=f+h+k;let C=p.x,T=p.y;if(s.setWidth(this.width),g?w>0&&C+S+c>this.right&&(T=p.y+=b,p.line++,C=p.x=pe(i,this.left+c,this.right-n[p.line])):w>0&&T+b>this.bottom&&(C=p.x=C+t[p.line].width+c,p.line++,T=p.y=pe(i,this.top+v+c,this.bottom-t[p.line].height)),function(e,t,n){if(isNaN(f)||f<=0||isNaN(m)||m<0)return;a.save();const i=l(n.lineWidth,1);if(a.fillStyle=l(n.fillStyle,r),a.lineCap=l(n.lineCap,"butt"),a.lineDashOffset=l(n.lineDashOffset,0),a.lineJoin=l(n.lineJoin,"miter"),a.lineWidth=i,a.strokeStyle=l(n.strokeStyle,r),a.setLineDash(l(n.lineDash,[])),o.usePointStyle){const r={radius:m*Math.SQRT2/2,pointStyle:n.pointStyle,rotation:n.rotation,borderWidth:i},l=s.xPlus(e,f/2);Pt(a,r,l,t+h,o.pointStyleWidth&&f)}else{const o=t+Math.max((d-m)/2,0),r=s.leftForLtr(e,f),l=vn(n.borderRadius);a.beginPath(),Object.values(l).some(e=>0!==e)?Nt(a,{x:r,y:o,w:f,h:m,radius:l}):a.rect(r,o,f,m),a.fill(),0!==i&&a.stroke()}a.restore()}(s.x(C),T,y),C=fe(x,C+f+h,g?C+S:this.right,e.rtl),function(e,t,n){It(a,n.text,e,t+_/2,u,{strikethrough:n.hidden,textAlign:s.textAlign(n.textAlign)})}(s.x(C),T,y),g)p.x+=S+c;else if("string"!=typeof y.text){const e=u.lineHeight;p.y+=ir(y,e)+c}else p.y+=b}),Tn(this.ctx,e.textDirection)}drawTitle(){const e=this.options,t=e.title,n=yn(t.font),a=bn(t.padding);if(!t.display)return;const i=Sn(e.rtl,this.left,this.width),o=this.ctx,r=t.position,s=n.size/2,l=a.top+s;let u,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),u=this.top+l,c=pe(e.align,c,this.right-d);else{const t=this.columnSizes.reduce((e,t)=>Math.max(e,t.height),0);u=l+pe(e.align,this.top,this.bottom-t-e.labels.padding-this._computeTitleHeight())}const h=pe(r,c,c+d);o.textAlign=i.textAlign(he(r)),o.textBaseline="middle",o.strokeStyle=t.color,o.fillStyle=t.color,o.font=n.string,It(o,t.text,h,u,n)}_computeTitleHeight(){const e=this.options.title,t=yn(e.font),n=bn(e.padding);return e.display?t.lineHeight+n.height:0}_getLegendItemAt(e,t){let n,a,i;if(ee(e,this.left,this.right)&&ee(t,this.top,this.bottom))for(i=this.legendHitBoxes,n=0;ne.chart.options.color,boxWidth:40,padding:10,generateLabels(e){const t=e.data.datasets,{labels:{usePointStyle:n,pointStyle:a,textAlign:i,color:o,useBorderRadius:r,borderRadius:s}}=e.legend.options;return e._getSortedDatasetMetas().map(e=>{const l=e.controller.getStyle(n?0:void 0),u=bn(l.borderWidth);return{text:t[e.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!e.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(u.width+u.height)/4,strokeStyle:l.borderColor,pointStyle:a||l.pointStyle,rotation:l.rotation,textAlign:i||l.textAlign,borderRadius:r&&(s||l.borderRadius),datasetIndex:e.index}},this)}},title:{color:e=>e.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:e=>!e.startsWith("on"),labels:{_scriptable:e=>!["generateLabels","filter","sort"].includes(e)}}};class rr extends Da{constructor(e){super(),this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t){const n=this.options;if(this.left=0,this.top=0,!n.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=e,this.height=this.bottom=t;const a=i(n.text)?n.text.length:1;this._padding=bn(n.padding);const o=a*yn(n.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const e=this.options.position;return"top"===e||"bottom"===e}_drawArgs(e){const{top:t,left:n,bottom:a,right:i,options:o}=this,r=o.align;let s,l,u,c=0;return this.isHorizontal()?(l=pe(r,n,i),u=t+e,s=i-n):("left"===o.position?(l=n+e,u=pe(r,a,t),c=-.5*E):(l=i-e,u=pe(r,t,a),c=.5*E),s=a-t),{titleX:l,titleY:u,maxWidth:s,rotation:c}}draw(){const e=this.ctx,t=this.options;if(!t.display)return;const n=yn(t.font),a=n.lineHeight/2+this._padding.top,{titleX:i,titleY:o,maxWidth:r,rotation:s}=this._drawArgs(a);It(e,t.text,0,0,n,{color:t.color,maxWidth:r,rotation:s,textAlign:he(t.align),textBaseline:"middle",translation:[i,o]})}}var sr={id:"title",_element:rr,start(e,t,n){!function(e,t){const n=new rr({ctx:e.ctx,options:t,chart:e});ta.configure(e,n,t),ta.addBox(e,n),e.titleBlock=n}(e,n)},stop(e){const t=e.titleBlock;ta.removeBox(e,t),delete e.titleBlock},beforeUpdate(e,t,n){const a=e.titleBlock;ta.configure(e,a,n),a.options=n},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const lr=new WeakMap;var ur={id:"subtitle",start(e,t,n){const a=new rr({ctx:e.ctx,options:n,chart:e});ta.configure(e,a,n),ta.addBox(e,a),lr.set(e,a)},stop(e){ta.removeBox(e,lr.get(e)),lr.delete(e)},beforeUpdate(e,t,n){const a=lr.get(e);ta.configure(e,a,n),a.options=n},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const cr={average(e){if(!e.length)return!1;let t,n,a=new Set,i=0,o=0;for(t=0,n=e.length;te+t)/a.size,y:i/o}},nearest(e,t){if(!e.length)return!1;let n,a,i,o=t.x,r=t.y,s=Number.POSITIVE_INFINITY;for(n=0,a=e.length;n-1?e.split("\n"):e}function pr(e,t){const{element:n,datasetIndex:a,index:i}=t,o=e.getDatasetMeta(a).controller,{label:r,value:s}=o.getLabelAndValue(i);return{chart:e,label:r,parsed:o.getParsed(i),raw:e.data.datasets[a].data[i],formattedValue:s,dataset:o.getDataset(),dataIndex:i,datasetIndex:a,element:n}}function fr(e,t){const n=e.chart.ctx,{body:a,footer:i,title:o}=e,{boxWidth:r,boxHeight:s}=t,l=yn(t.bodyFont),u=yn(t.titleFont),c=yn(t.footerFont),d=o.length,p=i.length,f=a.length,m=bn(t.padding);let _=m.height,g=0,v=a.reduce((e,t)=>e+t.before.length+t.lines.length+t.after.length,0);v+=e.beforeBody.length+e.afterBody.length,d&&(_+=d*u.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),v&&(_+=f*(t.displayColors?Math.max(s,l.lineHeight):l.lineHeight)+(v-f)*l.lineHeight+(v-1)*t.bodySpacing),p&&(_+=t.footerMarginTop+p*c.lineHeight+(p-1)*t.footerSpacing);let b=0;const y=function(e){g=Math.max(g,n.measureText(e).width+b)};return n.save(),n.font=u.string,h(e.title,y),n.font=l.string,h(e.beforeBody.concat(e.afterBody),y),b=t.displayColors?r+2+t.boxPadding:0,h(a,e=>{h(e.before,y),h(e.lines,y),h(e.after,y)}),b=0,n.font=c.string,h(e.footer,y),n.restore(),g+=m.width,{width:g,height:_}}function mr(e,t,n,a){const{x:i,width:o}=n,{width:r,chartArea:{left:s,right:l}}=e;let u="center";return"center"===a?u=i<=(s+l)/2?"left":"right":i<=o/2?u="left":i>=r-o/2&&(u="right"),function(e,t,n,a){const{x:i,width:o}=a,r=n.caretSize+n.caretPadding;return"left"===e&&i+o+r>t.width||"right"===e&&i-o-r<0||void 0}(u,e,t,n)&&(u="center"),u}function _r(e,t,n){const a=n.yAlign||t.yAlign||function(e,t){const{y:n,height:a}=t;return ne.height-a/2?"bottom":"center"}(e,n);return{xAlign:n.xAlign||t.xAlign||mr(e,t,n,a),yAlign:a}}function gr(e,t,n,a){const{caretSize:i,caretPadding:o,cornerRadius:r}=e,{xAlign:s,yAlign:l}=n,u=i+o,{topLeft:c,topRight:d,bottomLeft:h,bottomRight:p}=vn(r);let f=function(e,t){let{x:n,width:a}=e;return"right"===t?n-=a:"center"===t&&(n-=a/2),n}(t,s);const m=function(e,t,n){let{y:a,height:i}=e;return"top"===t?a+=n:a-="bottom"===t?i+n:i/2,a}(t,l,u);return"center"===l?"left"===s?f+=u:"right"===s&&(f-=u):"left"===s?f-=Math.max(c,h)+i:"right"===s&&(f+=Math.max(d,p)+i),{x:J(f,0,a.width-t.width),y:J(m,0,a.height-t.height)}}function vr(e,t,n){const a=bn(n.padding);return"center"===t?e.x+e.width/2:"right"===t?e.x+e.width-a.right:e.x+a.left}function br(e){return dr([],hr(e))}function yr(e,t){const n=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return n?e.override(n):e}const wr={beforeTitle:t,title(e){if(e.length>0){const t=e[0],n=t.chart.data.labels,a=n?n.length:0;if(this&&this.options&&"dataset"===this.options.mode)return t.dataset.label||"";if(t.label)return t.label;if(a>0&&t.dataIndex{const t={before:[],lines:[],after:[]},i=yr(n,e);dr(t.before,hr(kr(i,"beforeLabel",this,e))),dr(t.lines,kr(i,"label",this,e)),dr(t.after,hr(kr(i,"afterLabel",this,e))),a.push(t)}),a}getAfterBody(e,t){return br(kr(t.callbacks,"afterBody",this,e))}getFooter(e,t){const{callbacks:n}=t,a=kr(n,"beforeFooter",this,e),i=kr(n,"footer",this,e),o=kr(n,"afterFooter",this,e);let r=[];return r=dr(r,hr(a)),r=dr(r,hr(i)),r=dr(r,hr(o)),r}_createItems(e){const t=this._active,n=this.chart.data,a=[],i=[],o=[];let r,s,l=[];for(r=0,s=t.length;re.filter(t,a,i,n))),e.itemSort&&(l=l.sort((t,a)=>e.itemSort(t,a,n))),h(l,t=>{const n=yr(e.callbacks,t);a.push(kr(n,"labelColor",this,t)),i.push(kr(n,"labelPointStyle",this,t)),o.push(kr(n,"labelTextColor",this,t))}),this.labelColors=a,this.labelPointStyles=i,this.labelTextColors=o,this.dataPoints=l,l}update(e,t){const n=this.options.setContext(this.getContext()),a=this._active;let i,o=[];if(a.length){const e=cr[n.position].call(this,a,this._eventPosition);o=this._createItems(n),this.title=this.getTitle(o,n),this.beforeBody=this.getBeforeBody(o,n),this.body=this.getBody(o,n),this.afterBody=this.getAfterBody(o,n),this.footer=this.getFooter(o,n);const t=this._size=fr(this,n),r=Object.assign({},e,t),s=_r(this.chart,n,r),l=gr(n,r,s,this.chart);this.xAlign=s.xAlign,this.yAlign=s.yAlign,i={opacity:1,x:l.x,y:l.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}else 0!==this.opacity&&(i={opacity:0});this._tooltipItems=o,this.$context=void 0,i&&this._resolveAnimations().update(this,i),e&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,n,a){const i=this.getCaretPosition(e,n,a);t.lineTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineTo(i.x3,i.y3)}getCaretPosition(e,t,n){const{xAlign:a,yAlign:i}=this,{caretSize:o,cornerRadius:r}=n,{topLeft:s,topRight:l,bottomLeft:u,bottomRight:c}=vn(r),{x:d,y:h}=e,{width:p,height:f}=t;let m,_,g,v,b,y;return"center"===i?(b=h+f/2,"left"===a?(m=d,_=m-o,v=b+o,y=b-o):(m=d+p,_=m+o,v=b-o,y=b+o),g=m):(_="left"===a?d+Math.max(s,u)+o:"right"===a?d+p-Math.max(l,c)-o:this.caretX,"top"===i?(v=h,b=v-o,m=_-o,g=_+o):(v=h+f,b=v+o,m=_+o,g=_-o),y=v),{x1:m,x2:_,x3:g,y1:v,y2:b,y3:y}}drawTitle(e,t,n){const a=this.title,i=a.length;let o,r,s;if(i){const l=Sn(n.rtl,this.x,this.width);for(e.x=vr(this,n.titleAlign,n),t.textAlign=l.textAlign(n.titleAlign),t.textBaseline="middle",o=yn(n.titleFont),r=n.titleSpacing,t.fillStyle=n.titleColor,t.font=o.string,s=0;s0!==e)?(e.beginPath(),e.fillStyle=i.multiKeyBackground,Nt(e,{x:t,y:f,w:u,h:l,radius:s}),e.fill(),e.stroke(),e.fillStyle=r.backgroundColor,e.beginPath(),Nt(e,{x:n,y:f+1,w:u-2,h:l-2,radius:s}),e.fill()):(e.fillStyle=i.multiKeyBackground,e.fillRect(t,f,u,l),e.strokeRect(t,f,u,l),e.fillStyle=r.backgroundColor,e.fillRect(n,f+1,u-2,l-2))}e.fillStyle=this.labelTextColors[n]}drawBody(e,t,n){const{body:a}=this,{bodySpacing:i,bodyAlign:o,displayColors:r,boxHeight:s,boxWidth:l,boxPadding:u}=n,c=yn(n.bodyFont);let d=c.lineHeight,p=0;const f=Sn(n.rtl,this.x,this.width),m=function(n){t.fillText(n,f.x(e.x+p),e.y+d/2),e.y+=d+i},_=f.textAlign(o);let g,v,b,y,w,k,x;for(t.textAlign=o,t.textBaseline="middle",t.font=c.string,e.x=vr(this,_,n),t.fillStyle=n.bodyColor,h(this.beforeBody,m),p=r&&"right"!==_?"center"===o?l/2+u:l+2+u:0,y=0,k=a.length;y0&&t.stroke()}_updateAnimationTarget(e){const t=this.chart,n=this.$animations,a=n&&n.x,i=n&&n.y;if(a||i){const n=cr[e.position].call(this,this._active,this._eventPosition);if(!n)return;const o=this._size=fr(this,e),r=Object.assign({},n,this._size),s=_r(t,e,r),l=gr(e,r,s,t);a._to===l.x&&i._to===l.y||(this.xAlign=s.xAlign,this.yAlign=s.yAlign,this.width=o.width,this.height=o.height,this.caretX=n.x,this.caretY=n.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(e){const t=this.options.setContext(this.getContext());let n=this.opacity;if(!n)return;this._updateAnimationTarget(t);const a={width:this.width,height:this.height},i={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;const o=bn(t.padding),r=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&r&&(e.save(),e.globalAlpha=n,this.drawBackground(i,e,a,t),Cn(e,t.textDirection),i.y+=o.top,this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),Tn(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){const n=this._active,a=e.map(({datasetIndex:e,index:t})=>{const n=this.chart.getDatasetMeta(e);if(!n)throw new Error("Cannot find a dataset at index "+e);return{datasetIndex:e,element:n.data[t],index:t}}),i=!p(n,a),o=this._positionChanged(a,t);(i||o)&&(this._active=a,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,n=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const a=this.options,i=this._active||[],o=this._getActiveElements(e,i,t,n),r=this._positionChanged(o,e),s=t||!p(o,i)||r;return s&&(this._active=o,(a.enabled||a.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),s}_getActiveElements(e,t,n,a){const i=this.options;if("mouseout"===e.type)return[];if(!a)return t.filter(e=>this.chart.data.datasets[e.datasetIndex]&&void 0!==this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index));const o=this.chart.getElementsAtEventForMode(e,i.mode,i,n);return i.reverse&&o.reverse(),o}_positionChanged(e,t){const{caretX:n,caretY:a,options:i}=this,o=cr[i.position].call(this,e,t);return!1!==o&&(n!==o.x||a!==o.y)}}var Sr={id:"tooltip",_element:xr,positioners:cr,afterInit(e,t,n){n&&(e.tooltip=new xr({chart:e,options:n}))},beforeUpdate(e,t,n){e.tooltip&&e.tooltip.initialize(n)},reset(e,t,n){e.tooltip&&e.tooltip.initialize(n)},afterDraw(e){const t=e.tooltip;if(t&&t._willRender()){const n={tooltip:t};if(!1===e.notifyPlugins("beforeTooltipDraw",{...n,cancelable:!0}))return;t.draw(e.ctx),e.notifyPlugins("afterTooltipDraw",n)}},afterEvent(e,t){if(e.tooltip){const n=t.replay;e.tooltip.handleEvent(t.event,n,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:wr},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:e=>"filter"!==e&&"itemSort"!==e&&"external"!==e,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};return wi.register(Ni,Eo,eo,e),wi.helpers={...Dn},wi._adapters=Ci,wi.Animation=xa,wi.Animations=Sa,wi.animator=ge,wi.controllers=Ya.controllers.items,wi.DatasetController=Na,wi.Element=Da,wi.elements=eo,wi.Interaction=Vn,wi.layouts=ta,wi.platforms=ya,wi.Scale=Ga,wi.Ticks=nt,Object.assign(wi,Ni,Eo,eo,e,ya),wi.Chart=wi,"undefined"!=typeof window&&(window.Chart=wi),wi}),/*! showdown v 2.1.0 - 21-04-2022 */ +function(){function e(e){"use strict";var t={omitExtraWLInCodeBlocks:{defaultValue:!1,describe:"Omit the default extra whiteline added to code blocks",type:"boolean"},noHeaderId:{defaultValue:!1,describe:"Turn on/off generated header id",type:"boolean"},prefixHeaderId:{defaultValue:!1,describe:"Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic 'section-' prefix",type:"string"},rawPrefixHeaderId:{defaultValue:!1,describe:'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)',type:"boolean"},ghCompatibleHeaderId:{defaultValue:!1,describe:"Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)",type:"boolean"},rawHeaderId:{defaultValue:!1,describe:"Remove only spaces, ' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids",type:"boolean"},headerLevelStart:{defaultValue:!1,describe:"The header blocks level start",type:"integer"},parseImgDimensions:{defaultValue:!1,describe:"Turn on/off image dimension parsing",type:"boolean"},simplifiedAutoLink:{defaultValue:!1,describe:"Turn on/off GFM autolink style",type:"boolean"},excludeTrailingPunctuationFromURLs:{defaultValue:!1,describe:"Excludes trailing punctuation from links generated with autoLinking",type:"boolean"},literalMidWordUnderscores:{defaultValue:!1,describe:"Parse midword underscores as literal underscores",type:"boolean"},literalMidWordAsterisks:{defaultValue:!1,describe:"Parse midword asterisks as literal asterisks",type:"boolean"},strikethrough:{defaultValue:!1,describe:"Turn on/off strikethrough support",type:"boolean"},tables:{defaultValue:!1,describe:"Turn on/off tables support",type:"boolean"},tablesHeaderId:{defaultValue:!1,describe:"Add an id to table headers",type:"boolean"},ghCodeBlocks:{defaultValue:!0,describe:"Turn on/off GFM fenced code blocks support",type:"boolean"},tasklists:{defaultValue:!1,describe:"Turn on/off GFM tasklist support",type:"boolean"},smoothLivePreview:{defaultValue:!1,describe:"Prevents weird effects in live previews due to incomplete input",type:"boolean"},smartIndentationFix:{defaultValue:!1,describe:"Tries to smartly fix indentation in es6 strings",type:"boolean"},disableForced4SpacesIndentedSublists:{defaultValue:!1,describe:"Disables the requirement of indenting nested sublists by 4 spaces",type:"boolean"},simpleLineBreaks:{defaultValue:!1,describe:"Parses simple line breaks as
(GFM Style)",type:"boolean"},requireSpaceBeforeHeadingText:{defaultValue:!1,describe:"Makes adding a space between `#` and the header text mandatory (GFM Style)",type:"boolean"},ghMentions:{defaultValue:!1,describe:"Enables github @mentions",type:"boolean"},ghMentionsLink:{defaultValue:"https://github.com/{u}",describe:"Changes the link generated by @mentions. Only applies if ghMentions option is enabled.",type:"string"},encodeEmails:{defaultValue:!0,describe:"Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities",type:"boolean"},openLinksInNewWindow:{defaultValue:!1,describe:"Open all links in new windows",type:"boolean"},backslashEscapesHTMLTags:{defaultValue:!1,describe:"Support for HTML Tag escaping. ex:
foo
",type:"boolean"},emoji:{defaultValue:!1,describe:"Enable emoji support. Ex: `this is a :smile: emoji`",type:"boolean"},underline:{defaultValue:!1,describe:"Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``",type:"boolean"},ellipsis:{defaultValue:!0,describe:"Replaces three dots with the ellipsis unicode character",type:"boolean"},completeHTMLDocument:{defaultValue:!1,describe:"Outputs a complete html document, including ``, `` and `` tags",type:"boolean"},metadata:{defaultValue:!1,describe:"Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).",type:"boolean"},splitAdjacentBlockquotes:{defaultValue:!1,describe:"Split adjacent blockquote blocks",type:"boolean"}};if(!1===e)return JSON.parse(JSON.stringify(t));var n={};for(var a in t)t.hasOwnProperty(a)&&(n[a]=t[a].defaultValue);return n}var t={},n={},a={},i=e(!0),o="vanilla",r={github:{omitExtraWLInCodeBlocks:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,disableForced4SpacesIndentedSublists:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghCompatibleHeaderId:!0,ghMentions:!0,backslashEscapesHTMLTags:!0,emoji:!0,splitAdjacentBlockquotes:!0},original:{noHeaderId:!0,ghCodeBlocks:!1},ghost:{omitExtraWLInCodeBlocks:!0,parseImgDimensions:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,smoothLivePreview:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghMentions:!1,encodeEmails:!0},vanilla:e(!0),allOn:function(){"use strict";var t=e(!0),n={};for(var a in t)t.hasOwnProperty(a)&&(n[a]=!0);return n}()};function s(e,n){"use strict";var a=n?"Error in "+n+" extension->":"Error in unnamed extension",i={valid:!0,error:""};t.helper.isArray(e)||(e=[e]);for(var o=0;o").replace(/&/g,"&")};var u=function(e,t,n,a){"use strict";var i,o,r,s,l,u=a||"",c=u.indexOf("g")>-1,d=new RegExp(t+"|"+n,"g"+u.replace(/g/g,"")),h=new RegExp(t,u.replace(/g/g,"")),p=[];do{for(i=0;r=d.exec(e);)if(h.test(r[0]))i++||(s=(o=d.lastIndex)-r[0].length);else if(i&&! --i){l=r.index+r[0].length;var f={left:{start:s,end:o},match:{start:o,end:r.index},right:{start:r.index,end:l},wholeMatch:{start:s,end:l}};if(p.push(f),!c)return p}}while(i&&(d.lastIndex=o));return p};t.helper.matchRecursiveRegExp=function(e,t,n,a){"use strict";for(var i=u(e,t,n,a),o=[],r=0;r0){var d=[];0!==s[0].wholeMatch.start&&d.push(e.slice(0,s[0].wholeMatch.start));for(var h=0;h=0?i+(a||0):i},t.helper.splitAtIndex=function(e,n){"use strict";if(!t.helper.isString(e))throw"InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string";return[e.substring(0,n),e.substring(n)]},t.helper.encodeEmailAddress=function(e){"use strict";var t=[function(e){return"&#"+e.charCodeAt(0)+";"},function(e){return"&#x"+e.charCodeAt(0).toString(16)+";"},function(e){return e}];return e=e.replace(/./g,function(e){if("@"===e)e=t[Math.floor(2*Math.random())](e);else{var n=Math.random();e=n>.9?t[2](e):n>.45?t[1](e):t[0](e)}return e})},t.helper.padEnd=function(e,t,n){"use strict";return t|=0,n=String(n||" "),e.length>t?String(e):((t-=e.length)>n.length&&(n+=n.repeat(t/n.length)),String(e)+n.slice(0,t))},"undefined"==typeof console&&(console={warn:function(e){"use strict";alert(e)},log:function(e){"use strict";alert(e)},error:function(e){"use strict";throw e}}),t.helper.regexes={asteriskDashAndColon:/([*_:~])/g},t.helper.emojis={"+1":"👍","-1":"👎",100:"💯",1234:"🔢","1st_place_medal":"🥇","2nd_place_medal":"🥈","3rd_place_medal":"🥉","8ball":"🎱",a:"🅰️",ab:"🆎",abc:"🔤",abcd:"🔡",accept:"🉑",aerial_tramway:"🚡",airplane:"✈️",alarm_clock:"⏰",alembic:"⚗️",alien:"👽",ambulance:"🚑",amphora:"🏺",anchor:"⚓️",angel:"👼",anger:"💢",angry:"😠",anguished:"😧",ant:"🐜",apple:"🍎",aquarius:"♒️",aries:"♈️",arrow_backward:"◀️",arrow_double_down:"⏬",arrow_double_up:"⏫",arrow_down:"⬇️",arrow_down_small:"🔽",arrow_forward:"▶️",arrow_heading_down:"⤵️",arrow_heading_up:"⤴️",arrow_left:"⬅️",arrow_lower_left:"↙️",arrow_lower_right:"↘️",arrow_right:"➡️",arrow_right_hook:"↪️",arrow_up:"⬆️",arrow_up_down:"↕️",arrow_up_small:"🔼",arrow_upper_left:"↖️",arrow_upper_right:"↗️",arrows_clockwise:"🔃",arrows_counterclockwise:"🔄",art:"🎨",articulated_lorry:"🚛",artificial_satellite:"🛰",astonished:"😲",athletic_shoe:"👟",atm:"🏧",atom_symbol:"⚛️",avocado:"🥑",b:"🅱️",baby:"👶",baby_bottle:"🍼",baby_chick:"🐤",baby_symbol:"🚼",back:"🔙",bacon:"🥓",badminton:"🏸",baggage_claim:"🛄",baguette_bread:"🥖",balance_scale:"⚖️",balloon:"🎈",ballot_box:"🗳",ballot_box_with_check:"☑️",bamboo:"🎍",banana:"🍌",bangbang:"‼️",bank:"🏦",bar_chart:"📊",barber:"💈",baseball:"⚾️",basketball:"🏀",basketball_man:"⛹️",basketball_woman:"⛹️‍♀️",bat:"🦇",bath:"🛀",bathtub:"🛁",battery:"🔋",beach_umbrella:"🏖",bear:"🐻",bed:"🛏",bee:"🐝",beer:"🍺",beers:"🍻",beetle:"🐞",beginner:"🔰",bell:"🔔",bellhop_bell:"🛎",bento:"🍱",biking_man:"🚴",bike:"🚲",biking_woman:"🚴‍♀️",bikini:"👙",biohazard:"☣️",bird:"🐦",birthday:"🎂",black_circle:"⚫️",black_flag:"🏴",black_heart:"🖤",black_joker:"🃏",black_large_square:"⬛️",black_medium_small_square:"◾️",black_medium_square:"◼️",black_nib:"✒️",black_small_square:"▪️",black_square_button:"🔲",blonde_man:"👱",blonde_woman:"👱‍♀️",blossom:"🌼",blowfish:"🐡",blue_book:"📘",blue_car:"🚙",blue_heart:"💙",blush:"😊",boar:"🐗",boat:"⛵️",bomb:"💣",book:"📖",bookmark:"🔖",bookmark_tabs:"📑",books:"📚",boom:"💥",boot:"👢",bouquet:"💐",bowing_man:"🙇",bow_and_arrow:"🏹",bowing_woman:"🙇‍♀️",bowling:"🎳",boxing_glove:"🥊",boy:"👦",bread:"🍞",bride_with_veil:"👰",bridge_at_night:"🌉",briefcase:"💼",broken_heart:"💔",bug:"🐛",building_construction:"🏗",bulb:"💡",bullettrain_front:"🚅",bullettrain_side:"🚄",burrito:"🌯",bus:"🚌",business_suit_levitating:"🕴",busstop:"🚏",bust_in_silhouette:"👤",busts_in_silhouette:"👥",butterfly:"🦋",cactus:"🌵",cake:"🍰",calendar:"📆",call_me_hand:"🤙",calling:"📲",camel:"🐫",camera:"📷",camera_flash:"📸",camping:"🏕",cancer:"♋️",candle:"🕯",candy:"🍬",canoe:"🛶",capital_abcd:"🔠",capricorn:"♑️",car:"🚗",card_file_box:"🗃",card_index:"📇",card_index_dividers:"🗂",carousel_horse:"🎠",carrot:"🥕",cat:"🐱",cat2:"🐈",cd:"💿",chains:"⛓",champagne:"🍾",chart:"💹",chart_with_downwards_trend:"📉",chart_with_upwards_trend:"📈",checkered_flag:"🏁",cheese:"🧀",cherries:"🍒",cherry_blossom:"🌸",chestnut:"🌰",chicken:"🐔",children_crossing:"🚸",chipmunk:"🐿",chocolate_bar:"🍫",christmas_tree:"🎄",church:"⛪️",cinema:"🎦",circus_tent:"🎪",city_sunrise:"🌇",city_sunset:"🌆",cityscape:"🏙",cl:"🆑",clamp:"🗜",clap:"👏",clapper:"🎬",classical_building:"🏛",clinking_glasses:"🥂",clipboard:"📋",clock1:"🕐",clock10:"🕙",clock1030:"🕥",clock11:"🕚",clock1130:"🕦",clock12:"🕛",clock1230:"🕧",clock130:"🕜",clock2:"🕑",clock230:"🕝",clock3:"🕒",clock330:"🕞",clock4:"🕓",clock430:"🕟",clock5:"🕔",clock530:"🕠",clock6:"🕕",clock630:"🕡",clock7:"🕖",clock730:"🕢",clock8:"🕗",clock830:"🕣",clock9:"🕘",clock930:"🕤",closed_book:"📕",closed_lock_with_key:"🔐",closed_umbrella:"🌂",cloud:"☁️",cloud_with_lightning:"🌩",cloud_with_lightning_and_rain:"⛈",cloud_with_rain:"🌧",cloud_with_snow:"🌨",clown_face:"🤡",clubs:"♣️",cocktail:"🍸",coffee:"☕️",coffin:"⚰️",cold_sweat:"😰",comet:"☄️",computer:"💻",computer_mouse:"🖱",confetti_ball:"🎊",confounded:"😖",confused:"😕",congratulations:"㊗️",construction:"🚧",construction_worker_man:"👷",construction_worker_woman:"👷‍♀️",control_knobs:"🎛",convenience_store:"🏪",cookie:"🍪",cool:"🆒",policeman:"👮",copyright:"©️",corn:"🌽",couch_and_lamp:"🛋",couple:"👫",couple_with_heart_woman_man:"💑",couple_with_heart_man_man:"👨‍❤️‍👨",couple_with_heart_woman_woman:"👩‍❤️‍👩",couplekiss_man_man:"👨‍❤️‍💋‍👨",couplekiss_man_woman:"💏",couplekiss_woman_woman:"👩‍❤️‍💋‍👩",cow:"🐮",cow2:"🐄",cowboy_hat_face:"🤠",crab:"🦀",crayon:"🖍",credit_card:"💳",crescent_moon:"🌙",cricket:"🏏",crocodile:"🐊",croissant:"🥐",crossed_fingers:"🤞",crossed_flags:"🎌",crossed_swords:"⚔️",crown:"👑",cry:"😢",crying_cat_face:"😿",crystal_ball:"🔮",cucumber:"🥒",cupid:"💘",curly_loop:"➰",currency_exchange:"💱",curry:"🍛",custard:"🍮",customs:"🛃",cyclone:"🌀",dagger:"🗡",dancer:"💃",dancing_women:"👯",dancing_men:"👯‍♂️",dango:"🍡",dark_sunglasses:"🕶",dart:"🎯",dash:"💨",date:"📅",deciduous_tree:"🌳",deer:"🦌",department_store:"🏬",derelict_house:"🏚",desert:"🏜",desert_island:"🏝",desktop_computer:"🖥",male_detective:"🕵️",diamond_shape_with_a_dot_inside:"💠",diamonds:"♦️",disappointed:"😞",disappointed_relieved:"😥",dizzy:"💫",dizzy_face:"😵",do_not_litter:"🚯",dog:"🐶",dog2:"🐕",dollar:"💵",dolls:"🎎",dolphin:"🐬",door:"🚪",doughnut:"🍩",dove:"🕊",dragon:"🐉",dragon_face:"🐲",dress:"👗",dromedary_camel:"🐪",drooling_face:"🤤",droplet:"💧",drum:"🥁",duck:"🦆",dvd:"📀","e-mail":"📧",eagle:"🦅",ear:"👂",ear_of_rice:"🌾",earth_africa:"🌍",earth_americas:"🌎",earth_asia:"🌏",egg:"🥚",eggplant:"🍆",eight_pointed_black_star:"✴️",eight_spoked_asterisk:"✳️",electric_plug:"🔌",elephant:"🐘",email:"✉️",end:"🔚",envelope_with_arrow:"📩",euro:"💶",european_castle:"🏰",european_post_office:"🏤",evergreen_tree:"🌲",exclamation:"❗️",expressionless:"😑",eye:"👁",eye_speech_bubble:"👁‍🗨",eyeglasses:"👓",eyes:"👀",face_with_head_bandage:"🤕",face_with_thermometer:"🤒",fist_oncoming:"👊",factory:"🏭",fallen_leaf:"🍂",family_man_woman_boy:"👪",family_man_boy:"👨‍👦",family_man_boy_boy:"👨‍👦‍👦",family_man_girl:"👨‍👧",family_man_girl_boy:"👨‍👧‍👦",family_man_girl_girl:"👨‍👧‍👧",family_man_man_boy:"👨‍👨‍👦",family_man_man_boy_boy:"👨‍👨‍👦‍👦",family_man_man_girl:"👨‍👨‍👧",family_man_man_girl_boy:"👨‍👨‍👧‍👦",family_man_man_girl_girl:"👨‍👨‍👧‍👧",family_man_woman_boy_boy:"👨‍👩‍👦‍👦",family_man_woman_girl:"👨‍👩‍👧",family_man_woman_girl_boy:"👨‍👩‍👧‍👦",family_man_woman_girl_girl:"👨‍👩‍👧‍👧",family_woman_boy:"👩‍👦",family_woman_boy_boy:"👩‍👦‍👦",family_woman_girl:"👩‍👧",family_woman_girl_boy:"👩‍👧‍👦",family_woman_girl_girl:"👩‍👧‍👧",family_woman_woman_boy:"👩‍👩‍👦",family_woman_woman_boy_boy:"👩‍👩‍👦‍👦",family_woman_woman_girl:"👩‍👩‍👧",family_woman_woman_girl_boy:"👩‍👩‍👧‍👦",family_woman_woman_girl_girl:"👩‍👩‍👧‍👧",fast_forward:"⏩",fax:"📠",fearful:"😨",feet:"🐾",female_detective:"🕵️‍♀️",ferris_wheel:"🎡",ferry:"⛴",field_hockey:"🏑",file_cabinet:"🗄",file_folder:"📁",film_projector:"📽",film_strip:"🎞",fire:"🔥",fire_engine:"🚒",fireworks:"🎆",first_quarter_moon:"🌓",first_quarter_moon_with_face:"🌛",fish:"🐟",fish_cake:"🍥",fishing_pole_and_fish:"🎣",fist_raised:"✊",fist_left:"🤛",fist_right:"🤜",flags:"🎏",flashlight:"🔦",fleur_de_lis:"⚜️",flight_arrival:"🛬",flight_departure:"🛫",floppy_disk:"💾",flower_playing_cards:"🎴",flushed:"😳",fog:"🌫",foggy:"🌁",football:"🏈",footprints:"👣",fork_and_knife:"🍴",fountain:"⛲️",fountain_pen:"🖋",four_leaf_clover:"🍀",fox_face:"🦊",framed_picture:"🖼",free:"🆓",fried_egg:"🍳",fried_shrimp:"🍤",fries:"🍟",frog:"🐸",frowning:"😦",frowning_face:"☹️",frowning_man:"🙍‍♂️",frowning_woman:"🙍",middle_finger:"🖕",fuelpump:"⛽️",full_moon:"🌕",full_moon_with_face:"🌝",funeral_urn:"⚱️",game_die:"🎲",gear:"⚙️",gem:"💎",gemini:"♊️",ghost:"👻",gift:"🎁",gift_heart:"💝",girl:"👧",globe_with_meridians:"🌐",goal_net:"🥅",goat:"🐐",golf:"⛳️",golfing_man:"🏌️",golfing_woman:"🏌️‍♀️",gorilla:"🦍",grapes:"🍇",green_apple:"🍏",green_book:"📗",green_heart:"💚",green_salad:"🥗",grey_exclamation:"❕",grey_question:"❔",grimacing:"😬",grin:"😁",grinning:"😀",guardsman:"💂",guardswoman:"💂‍♀️",guitar:"🎸",gun:"🔫",haircut_woman:"💇",haircut_man:"💇‍♂️",hamburger:"🍔",hammer:"🔨",hammer_and_pick:"⚒",hammer_and_wrench:"🛠",hamster:"🐹",hand:"✋",handbag:"👜",handshake:"🤝",hankey:"💩",hatched_chick:"🐥",hatching_chick:"🐣",headphones:"🎧",hear_no_evil:"🙉",heart:"❤️",heart_decoration:"💟",heart_eyes:"😍",heart_eyes_cat:"😻",heartbeat:"💓",heartpulse:"💗",hearts:"♥️",heavy_check_mark:"✔️",heavy_division_sign:"➗",heavy_dollar_sign:"💲",heavy_heart_exclamation:"❣️",heavy_minus_sign:"➖",heavy_multiplication_x:"✖️",heavy_plus_sign:"➕",helicopter:"🚁",herb:"🌿",hibiscus:"🌺",high_brightness:"🔆",high_heel:"👠",hocho:"🔪",hole:"🕳",honey_pot:"🍯",horse:"🐴",horse_racing:"🏇",hospital:"🏥",hot_pepper:"🌶",hotdog:"🌭",hotel:"🏨",hotsprings:"♨️",hourglass:"⌛️",hourglass_flowing_sand:"⏳",house:"🏠",house_with_garden:"🏡",houses:"🏘",hugs:"🤗",hushed:"😯",ice_cream:"🍨",ice_hockey:"🏒",ice_skate:"⛸",icecream:"🍦",id:"🆔",ideograph_advantage:"🉐",imp:"👿",inbox_tray:"📥",incoming_envelope:"📨",tipping_hand_woman:"💁",information_source:"ℹ️",innocent:"😇",interrobang:"⁉️",iphone:"📱",izakaya_lantern:"🏮",jack_o_lantern:"🎃",japan:"🗾",japanese_castle:"🏯",japanese_goblin:"👺",japanese_ogre:"👹",jeans:"👖",joy:"😂",joy_cat:"😹",joystick:"🕹",kaaba:"🕋",key:"🔑",keyboard:"⌨️",keycap_ten:"🔟",kick_scooter:"🛴",kimono:"👘",kiss:"💋",kissing:"😗",kissing_cat:"😽",kissing_closed_eyes:"😚",kissing_heart:"😘",kissing_smiling_eyes:"😙",kiwi_fruit:"🥝",koala:"🐨",koko:"🈁",label:"🏷",large_blue_circle:"🔵",large_blue_diamond:"🔷",large_orange_diamond:"🔶",last_quarter_moon:"🌗",last_quarter_moon_with_face:"🌜",latin_cross:"✝️",laughing:"😆",leaves:"🍃",ledger:"📒",left_luggage:"🛅",left_right_arrow:"↔️",leftwards_arrow_with_hook:"↩️",lemon:"🍋",leo:"♌️",leopard:"🐆",level_slider:"🎚",libra:"♎️",light_rail:"🚈",link:"🔗",lion:"🦁",lips:"👄",lipstick:"💄",lizard:"🦎",lock:"🔒",lock_with_ink_pen:"🔏",lollipop:"🍭",loop:"➿",loud_sound:"🔊",loudspeaker:"📢",love_hotel:"🏩",love_letter:"💌",low_brightness:"🔅",lying_face:"🤥",m:"Ⓜ️",mag:"🔍",mag_right:"🔎",mahjong:"🀄️",mailbox:"📫",mailbox_closed:"📪",mailbox_with_mail:"📬",mailbox_with_no_mail:"📭",man:"👨",man_artist:"👨‍🎨",man_astronaut:"👨‍🚀",man_cartwheeling:"🤸‍♂️",man_cook:"👨‍🍳",man_dancing:"🕺",man_facepalming:"🤦‍♂️",man_factory_worker:"👨‍🏭",man_farmer:"👨‍🌾",man_firefighter:"👨‍🚒",man_health_worker:"👨‍⚕️",man_in_tuxedo:"🤵",man_judge:"👨‍⚖️",man_juggling:"🤹‍♂️",man_mechanic:"👨‍🔧",man_office_worker:"👨‍💼",man_pilot:"👨‍✈️",man_playing_handball:"🤾‍♂️",man_playing_water_polo:"🤽‍♂️",man_scientist:"👨‍🔬",man_shrugging:"🤷‍♂️",man_singer:"👨‍🎤",man_student:"👨‍🎓",man_teacher:"👨‍🏫",man_technologist:"👨‍💻",man_with_gua_pi_mao:"👲",man_with_turban:"👳",tangerine:"🍊",mans_shoe:"👞",mantelpiece_clock:"🕰",maple_leaf:"🍁",martial_arts_uniform:"🥋",mask:"😷",massage_woman:"💆",massage_man:"💆‍♂️",meat_on_bone:"🍖",medal_military:"🎖",medal_sports:"🏅",mega:"📣",melon:"🍈",memo:"📝",men_wrestling:"🤼‍♂️",menorah:"🕎",mens:"🚹",metal:"🤘",metro:"🚇",microphone:"🎤",microscope:"🔬",milk_glass:"🥛",milky_way:"🌌",minibus:"🚐",minidisc:"💽",mobile_phone_off:"📴",money_mouth_face:"🤑",money_with_wings:"💸",moneybag:"💰",monkey:"🐒",monkey_face:"🐵",monorail:"🚝",moon:"🌔",mortar_board:"🎓",mosque:"🕌",motor_boat:"🛥",motor_scooter:"🛵",motorcycle:"🏍",motorway:"🛣",mount_fuji:"🗻",mountain:"⛰",mountain_biking_man:"🚵",mountain_biking_woman:"🚵‍♀️",mountain_cableway:"🚠",mountain_railway:"🚞",mountain_snow:"🏔",mouse:"🐭",mouse2:"🐁",movie_camera:"🎥",moyai:"🗿",mrs_claus:"🤶",muscle:"💪",mushroom:"🍄",musical_keyboard:"🎹",musical_note:"🎵",musical_score:"🎼",mute:"🔇",nail_care:"💅",name_badge:"📛",national_park:"🏞",nauseated_face:"🤢",necktie:"👔",negative_squared_cross_mark:"❎",nerd_face:"🤓",neutral_face:"😐",new:"🆕",new_moon:"🌑",new_moon_with_face:"🌚",newspaper:"📰",newspaper_roll:"🗞",next_track_button:"⏭",ng:"🆖",no_good_man:"🙅‍♂️",no_good_woman:"🙅",night_with_stars:"🌃",no_bell:"🔕",no_bicycles:"🚳",no_entry:"⛔️",no_entry_sign:"🚫",no_mobile_phones:"📵",no_mouth:"😶",no_pedestrians:"🚷",no_smoking:"🚭","non-potable_water":"🚱",nose:"👃",notebook:"📓",notebook_with_decorative_cover:"📔",notes:"🎶",nut_and_bolt:"🔩",o:"⭕️",o2:"🅾️",ocean:"🌊",octopus:"🐙",oden:"🍢",office:"🏢",oil_drum:"🛢",ok:"🆗",ok_hand:"👌",ok_man:"🙆‍♂️",ok_woman:"🙆",old_key:"🗝",older_man:"👴",older_woman:"👵",om:"🕉",on:"🔛",oncoming_automobile:"🚘",oncoming_bus:"🚍",oncoming_police_car:"🚔",oncoming_taxi:"🚖",open_file_folder:"📂",open_hands:"👐",open_mouth:"😮",open_umbrella:"☂️",ophiuchus:"⛎",orange_book:"📙",orthodox_cross:"☦️",outbox_tray:"📤",owl:"🦉",ox:"🐂",package:"📦",page_facing_up:"📄",page_with_curl:"📃",pager:"📟",paintbrush:"🖌",palm_tree:"🌴",pancakes:"🥞",panda_face:"🐼",paperclip:"📎",paperclips:"🖇",parasol_on_ground:"⛱",parking:"🅿️",part_alternation_mark:"〽️",partly_sunny:"⛅️",passenger_ship:"🛳",passport_control:"🛂",pause_button:"⏸",peace_symbol:"☮️",peach:"🍑",peanuts:"🥜",pear:"🍐",pen:"🖊",pencil2:"✏️",penguin:"🐧",pensive:"😔",performing_arts:"🎭",persevere:"😣",person_fencing:"🤺",pouting_woman:"🙎",phone:"☎️",pick:"⛏",pig:"🐷",pig2:"🐖",pig_nose:"🐽",pill:"💊",pineapple:"🍍",ping_pong:"🏓",pisces:"♓️",pizza:"🍕",place_of_worship:"🛐",plate_with_cutlery:"🍽",play_or_pause_button:"⏯",point_down:"👇",point_left:"👈",point_right:"👉",point_up:"☝️",point_up_2:"👆",police_car:"🚓",policewoman:"👮‍♀️",poodle:"🐩",popcorn:"🍿",post_office:"🏣",postal_horn:"📯",postbox:"📮",potable_water:"🚰",potato:"🥔",pouch:"👝",poultry_leg:"🍗",pound:"💷",rage:"😡",pouting_cat:"😾",pouting_man:"🙎‍♂️",pray:"🙏",prayer_beads:"📿",pregnant_woman:"🤰",previous_track_button:"⏮",prince:"🤴",princess:"👸",printer:"🖨",purple_heart:"💜",purse:"👛",pushpin:"📌",put_litter_in_its_place:"🚮",question:"❓",rabbit:"🐰",rabbit2:"🐇",racehorse:"🐎",racing_car:"🏎",radio:"📻",radio_button:"🔘",radioactive:"☢️",railway_car:"🚃",railway_track:"🛤",rainbow:"🌈",rainbow_flag:"🏳️‍🌈",raised_back_of_hand:"🤚",raised_hand_with_fingers_splayed:"🖐",raised_hands:"🙌",raising_hand_woman:"🙋",raising_hand_man:"🙋‍♂️",ram:"🐏",ramen:"🍜",rat:"🐀",record_button:"⏺",recycle:"♻️",red_circle:"🔴",registered:"®️",relaxed:"☺️",relieved:"😌",reminder_ribbon:"🎗",repeat:"🔁",repeat_one:"🔂",rescue_worker_helmet:"⛑",restroom:"🚻",revolving_hearts:"💞",rewind:"⏪",rhinoceros:"🦏",ribbon:"🎀",rice:"🍚",rice_ball:"🍙",rice_cracker:"🍘",rice_scene:"🎑",right_anger_bubble:"🗯",ring:"💍",robot:"🤖",rocket:"🚀",rofl:"🤣",roll_eyes:"🙄",roller_coaster:"🎢",rooster:"🐓",rose:"🌹",rosette:"🏵",rotating_light:"🚨",round_pushpin:"📍",rowing_man:"🚣",rowing_woman:"🚣‍♀️",rugby_football:"🏉",running_man:"🏃",running_shirt_with_sash:"🎽",running_woman:"🏃‍♀️",sa:"🈂️",sagittarius:"♐️",sake:"🍶",sandal:"👡",santa:"🎅",satellite:"📡",saxophone:"🎷",school:"🏫",school_satchel:"🎒",scissors:"✂️",scorpion:"🦂",scorpius:"♏️",scream:"😱",scream_cat:"🙀",scroll:"📜",seat:"💺",secret:"㊙️",see_no_evil:"🙈",seedling:"🌱",selfie:"🤳",shallow_pan_of_food:"🥘",shamrock:"☘️",shark:"🦈",shaved_ice:"🍧",sheep:"🐑",shell:"🐚",shield:"🛡",shinto_shrine:"⛩",ship:"🚢",shirt:"👕",shopping:"🛍",shopping_cart:"🛒",shower:"🚿",shrimp:"🦐",signal_strength:"📶",six_pointed_star:"🔯",ski:"🎿",skier:"⛷",skull:"💀",skull_and_crossbones:"☠️",sleeping:"😴",sleeping_bed:"🛌",sleepy:"😪",slightly_frowning_face:"🙁",slightly_smiling_face:"🙂",slot_machine:"🎰",small_airplane:"🛩",small_blue_diamond:"🔹",small_orange_diamond:"🔸",small_red_triangle:"🔺",small_red_triangle_down:"🔻",smile:"😄",smile_cat:"😸",smiley:"😃",smiley_cat:"😺",smiling_imp:"😈",smirk:"😏",smirk_cat:"😼",smoking:"🚬",snail:"🐌",snake:"🐍",sneezing_face:"🤧",snowboarder:"🏂",snowflake:"❄️",snowman:"⛄️",snowman_with_snow:"☃️",sob:"😭",soccer:"⚽️",soon:"🔜",sos:"🆘",sound:"🔉",space_invader:"👾",spades:"♠️",spaghetti:"🍝",sparkle:"❇️",sparkler:"🎇",sparkles:"✨",sparkling_heart:"💖",speak_no_evil:"🙊",speaker:"🔈",speaking_head:"🗣",speech_balloon:"💬",speedboat:"🚤",spider:"🕷",spider_web:"🕸",spiral_calendar:"🗓",spiral_notepad:"🗒",spoon:"🥄",squid:"🦑",stadium:"🏟",star:"⭐️",star2:"🌟",star_and_crescent:"☪️",star_of_david:"✡️",stars:"🌠",station:"🚉",statue_of_liberty:"🗽",steam_locomotive:"🚂",stew:"🍲",stop_button:"⏹",stop_sign:"🛑",stopwatch:"⏱",straight_ruler:"📏",strawberry:"🍓",stuck_out_tongue:"😛",stuck_out_tongue_closed_eyes:"😝",stuck_out_tongue_winking_eye:"😜",studio_microphone:"🎙",stuffed_flatbread:"🥙",sun_behind_large_cloud:"🌥",sun_behind_rain_cloud:"🌦",sun_behind_small_cloud:"🌤",sun_with_face:"🌞",sunflower:"🌻",sunglasses:"😎",sunny:"☀️",sunrise:"🌅",sunrise_over_mountains:"🌄",surfing_man:"🏄",surfing_woman:"🏄‍♀️",sushi:"🍣",suspension_railway:"🚟",sweat:"😓",sweat_drops:"💦",sweat_smile:"😅",sweet_potato:"🍠",swimming_man:"🏊",swimming_woman:"🏊‍♀️",symbols:"🔣",synagogue:"🕍",syringe:"💉",taco:"🌮",tada:"🎉",tanabata_tree:"🎋",taurus:"♉️",taxi:"🚕",tea:"🍵",telephone_receiver:"📞",telescope:"🔭",tennis:"🎾",tent:"⛺️",thermometer:"🌡",thinking:"🤔",thought_balloon:"💭",ticket:"🎫",tickets:"🎟",tiger:"🐯",tiger2:"🐅",timer_clock:"⏲",tipping_hand_man:"💁‍♂️",tired_face:"😫",tm:"™️",toilet:"🚽",tokyo_tower:"🗼",tomato:"🍅",tongue:"👅",top:"🔝",tophat:"🎩",tornado:"🌪",trackball:"🖲",tractor:"🚜",traffic_light:"🚥",train:"🚋",train2:"🚆",tram:"🚊",triangular_flag_on_post:"🚩",triangular_ruler:"📐",trident:"🔱",triumph:"😤",trolleybus:"🚎",trophy:"🏆",tropical_drink:"🍹",tropical_fish:"🐠",truck:"🚚",trumpet:"🎺",tulip:"🌷",tumbler_glass:"🥃",turkey:"🦃",turtle:"🐢",tv:"📺",twisted_rightwards_arrows:"🔀",two_hearts:"💕",two_men_holding_hands:"👬",two_women_holding_hands:"👭",u5272:"🈹",u5408:"🈴",u55b6:"🈺",u6307:"🈯️",u6708:"🈷️",u6709:"🈶",u6e80:"🈵",u7121:"🈚️",u7533:"🈸",u7981:"🈲",u7a7a:"🈳",umbrella:"☔️",unamused:"😒",underage:"🔞",unicorn:"🦄",unlock:"🔓",up:"🆙",upside_down_face:"🙃",v:"✌️",vertical_traffic_light:"🚦",vhs:"📼",vibration_mode:"📳",video_camera:"📹",video_game:"🎮",violin:"🎻",virgo:"♍️",volcano:"🌋",volleyball:"🏐",vs:"🆚",vulcan_salute:"🖖",walking_man:"🚶",walking_woman:"🚶‍♀️",waning_crescent_moon:"🌘",waning_gibbous_moon:"🌖",warning:"⚠️",wastebasket:"🗑",watch:"⌚️",water_buffalo:"🐃",watermelon:"🍉",wave:"👋",wavy_dash:"〰️",waxing_crescent_moon:"🌒",wc:"🚾",weary:"😩",wedding:"💒",weight_lifting_man:"🏋️",weight_lifting_woman:"🏋️‍♀️",whale:"🐳",whale2:"🐋",wheel_of_dharma:"☸️",wheelchair:"♿️",white_check_mark:"✅",white_circle:"⚪️",white_flag:"🏳️",white_flower:"💮",white_large_square:"⬜️",white_medium_small_square:"◽️",white_medium_square:"◻️",white_small_square:"▫️",white_square_button:"🔳",wilted_flower:"🥀",wind_chime:"🎐",wind_face:"🌬",wine_glass:"🍷",wink:"😉",wolf:"🐺",woman:"👩",woman_artist:"👩‍🎨",woman_astronaut:"👩‍🚀",woman_cartwheeling:"🤸‍♀️",woman_cook:"👩‍🍳",woman_facepalming:"🤦‍♀️",woman_factory_worker:"👩‍🏭",woman_farmer:"👩‍🌾",woman_firefighter:"👩‍🚒",woman_health_worker:"👩‍⚕️",woman_judge:"👩‍⚖️",woman_juggling:"🤹‍♀️",woman_mechanic:"👩‍🔧",woman_office_worker:"👩‍💼",woman_pilot:"👩‍✈️",woman_playing_handball:"🤾‍♀️",woman_playing_water_polo:"🤽‍♀️",woman_scientist:"👩‍🔬",woman_shrugging:"🤷‍♀️",woman_singer:"👩‍🎤",woman_student:"👩‍🎓",woman_teacher:"👩‍🏫",woman_technologist:"👩‍💻",woman_with_turban:"👳‍♀️",womans_clothes:"👚",womans_hat:"👒",women_wrestling:"🤼‍♀️",womens:"🚺",world_map:"🗺",worried:"😟",wrench:"🔧",writing_hand:"✍️",x:"❌",yellow_heart:"💛",yen:"💴",yin_yang:"☯️",yum:"😋",zap:"⚡️",zipper_mouth_face:"🤐",zzz:"💤",octocat:':octocat:',showdown:"S"},t.Converter=function(e){"use strict";var n={},l=[],u=[],c={},d=o,h={parsed:{},raw:"",format:""};function p(e,n){if(n=n||null,t.helper.isString(e)){if(n=e=t.helper.stdExtName(e),t.extensions[e])return console.warn("DEPRECATION WARNING: "+e+" is an old extension that uses a deprecated loading method.Please inform the developer that the extension should be updated!"),void function(e,n){"function"==typeof e&&(e=e(new t.Converter));t.helper.isArray(e)||(e=[e]);var a=s(e,n);if(!a.valid)throw Error(a.error);for(var i=0;i[ \t]+¨NBSP;<"),!n){if(!window||!window.document)throw new Error("HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM");n=window.document}var a=n.createElement("div");a.innerHTML=e;var i={preList:function(e){for(var n=e.querySelectorAll("pre"),a=[],i=0;i'}else a.push(n[i].innerHTML),n[i].innerHTML="",n[i].setAttribute("prenum",i.toString());return a}(a)};!function e(t){for(var n=0;n? ?(['"].*['"])?\)$/m)>-1)r="";else if(!r){if(o||(o=i.toLowerCase().replace(/ ?\n/g," ")),r="#"+o,t.helper.isUndefined(a.gUrls[o]))return e;r=a.gUrls[o],t.helper.isUndefined(a.gTitles[o])||(u=a.gTitles[o])}var c='
"};return e=(e=(e=(e=(e=a.converter._dispatch("anchors.before",e,n,a)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g,i)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,i)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]??(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,i)).replace(/\[([^\[\]]+)]()()()()()/g,i),n.ghMentions&&(e=e.replace(/(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gim,function(e,a,i,o,r){if("\\"===i)return a+o;if(!t.helper.isString(n.ghMentionsLink))throw new Error("ghMentionsLink option must be a string");var s=n.ghMentionsLink.replace(/\{u}/g,r),l="";return n.openLinksInNewWindow&&(l=' rel="noopener noreferrer" target="¨E95Eblank"'),a+'"+o+""})),e=a.converter._dispatch("anchors.after",e,n,a)});var c=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi,d=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi,h=/()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi,p=/(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gim,f=/<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,m=function(e){"use strict";return function(n,a,i,o,r,s,l){var u=i=i.replace(t.helper.regexes.asteriskDashAndColon,t.helper.escapeCharactersCallback),c="",d="",h=a||"",p=l||"";return/^www\./i.test(i)&&(i=i.replace(/^www\./i,"http://www.")),e.excludeTrailingPunctuationFromURLs&&s&&(c=s),e.openLinksInNewWindow&&(d=' rel="noopener noreferrer" target="¨E95Eblank"'),h+'"+u+""+c+p}},_=function(e,n){"use strict";return function(a,i,o){var r="mailto:";return i=i||"",o=t.subParser("unescapeSpecialChars")(o,e,n),e.encodeEmails?(r=t.helper.encodeEmailAddress(r+o),o=t.helper.encodeEmailAddress(o)):r+=o,i+''+o+""}};t.subParser("autoLinks",function(e,t,n){"use strict";return e=(e=(e=n.converter._dispatch("autoLinks.before",e,t,n)).replace(h,m(t))).replace(f,_(t,n)),e=n.converter._dispatch("autoLinks.after",e,t,n)}),t.subParser("simplifiedAutoLinks",function(e,t,n){"use strict";return t.simplifiedAutoLink?(e=n.converter._dispatch("simplifiedAutoLinks.before",e,t,n),e=(e=t.excludeTrailingPunctuationFromURLs?e.replace(d,m(t)):e.replace(c,m(t))).replace(p,_(t,n)),e=n.converter._dispatch("simplifiedAutoLinks.after",e,t,n)):e}),t.subParser("blockGamut",function(e,n,a){"use strict";return e=a.converter._dispatch("blockGamut.before",e,n,a),e=t.subParser("blockQuotes")(e,n,a),e=t.subParser("headers")(e,n,a),e=t.subParser("horizontalRule")(e,n,a),e=t.subParser("lists")(e,n,a),e=t.subParser("codeBlocks")(e,n,a),e=t.subParser("tables")(e,n,a),e=t.subParser("hashHTMLBlocks")(e,n,a),e=t.subParser("paragraphs")(e,n,a),e=a.converter._dispatch("blockGamut.after",e,n,a)}),t.subParser("blockQuotes",function(e,n,a){"use strict";e=a.converter._dispatch("blockQuotes.before",e,n,a),e+="\n\n";var i=/(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm;return n.splitAdjacentBlockquotes&&(i=/^ {0,3}>[\s\S]*?(?:\n\n)/gm),e=e.replace(i,function(e){return e=(e=(e=e.replace(/^[ \t]*>[ \t]?/gm,"")).replace(/¨0/g,"")).replace(/^[ \t]+$/gm,""),e=t.subParser("githubCodeBlocks")(e,n,a),e=(e=(e=t.subParser("blockGamut")(e,n,a)).replace(/(^|\n)/g,"$1 ")).replace(/(\s*
[^\r]+?<\/pre>)/gm,function(e,t){var n=t;return n=(n=n.replace(/^  /gm,"¨0")).replace(/¨0/g,"")}),t.subParser("hashBlock")("
\n"+e+"\n
",n,a)}),e=a.converter._dispatch("blockQuotes.after",e,n,a)}),t.subParser("codeBlocks",function(e,n,a){"use strict";e=a.converter._dispatch("codeBlocks.before",e,n,a);return e=(e=(e+="¨0").replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g,function(e,i,o){var r=i,s=o,l="\n";return r=t.subParser("outdent")(r,n,a),r=t.subParser("encodeCode")(r,n,a),r=(r=(r=t.subParser("detab")(r,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,""),n.omitExtraWLInCodeBlocks&&(l=""),r="
"+r+l+"
",t.subParser("hashBlock")(r,n,a)+s})).replace(/¨0/,""),e=a.converter._dispatch("codeBlocks.after",e,n,a)}),t.subParser("codeSpans",function(e,n,a){"use strict";return void 0===(e=a.converter._dispatch("codeSpans.before",e,n,a))&&(e=""),e=e.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(e,i,o,r){var s=r;return s=(s=s.replace(/^([ \t]*)/g,"")).replace(/[ \t]*$/g,""),s=i+""+(s=t.subParser("encodeCode")(s,n,a))+"",s=t.subParser("hashHTMLSpans")(s,n,a)}),e=a.converter._dispatch("codeSpans.after",e,n,a)}),t.subParser("completeHTMLDocument",function(e,t,n){"use strict";if(!t.completeHTMLDocument)return e;e=n.converter._dispatch("completeHTMLDocument.before",e,t,n);var a="html",i="\n",o="",r='\n',s="",l="";for(var u in void 0!==n.metadata.parsed.doctype&&(i="\n","html"!==(a=n.metadata.parsed.doctype.toString().toLowerCase())&&"html5"!==a||(r='')),n.metadata.parsed)if(n.metadata.parsed.hasOwnProperty(u))switch(u.toLowerCase()){case"doctype":break;case"title":o=""+n.metadata.parsed.title+"\n";break;case"charset":r="html"===a||"html5"===a?'\n':'\n';break;case"language":case"lang":s=' lang="'+n.metadata.parsed[u]+'"',l+='\n';break;default:l+='\n'}return e=i+"\n\n"+o+r+l+"\n\n"+e.trim()+"\n\n",e=n.converter._dispatch("completeHTMLDocument.after",e,t,n)}),t.subParser("detab",function(e,t,n){"use strict";return e=(e=(e=(e=(e=(e=n.converter._dispatch("detab.before",e,t,n)).replace(/\t(?=\t)/g," ")).replace(/\t/g,"¨A¨B")).replace(/¨B(.+?)¨A/g,function(e,t){for(var n=t,a=4-n.length%4,i=0;i/g,">"),e=n.converter._dispatch("encodeAmpsAndAngles.after",e,t,n)}),t.subParser("encodeBackslashEscapes",function(e,n,a){"use strict";return e=(e=(e=a.converter._dispatch("encodeBackslashEscapes.before",e,n,a)).replace(/\\(\\)/g,t.helper.escapeCharactersCallback)).replace(/\\([`*_{}\[\]()>#+.!~=|:-])/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("encodeBackslashEscapes.after",e,n,a)}),t.subParser("encodeCode",function(e,n,a){"use strict";return e=(e=a.converter._dispatch("encodeCode.before",e,n,a)).replace(/&/g,"&").replace(//g,">").replace(/([*_{}\[\]\\=~-])/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("encodeCode.after",e,n,a)}),t.subParser("escapeSpecialCharsWithinTagAttributes",function(e,n,a){"use strict";return e=(e=(e=a.converter._dispatch("escapeSpecialCharsWithinTagAttributes.before",e,n,a)).replace(/<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi,function(e){return e.replace(/(.)<\/?code>(?=.)/g,"$1`").replace(/([\\`*_~=|])/g,t.helper.escapeCharactersCallback)})).replace(/-]|-[^>])(?:[^-]|-[^-])*)--)>/gi,function(e){return e.replace(/([\\`*_~=|])/g,t.helper.escapeCharactersCallback)}),e=a.converter._dispatch("escapeSpecialCharsWithinTagAttributes.after",e,n,a)}),t.subParser("githubCodeBlocks",function(e,n,a){"use strict";return n.ghCodeBlocks?(e=a.converter._dispatch("githubCodeBlocks.before",e,n,a),e=(e=(e+="¨0").replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g,function(e,i,o,r){var s=n.omitExtraWLInCodeBlocks?"":"\n";return r=t.subParser("encodeCode")(r,n,a),r="
"+(r=(r=(r=t.subParser("detab")(r,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,""))+s+"
",r=t.subParser("hashBlock")(r,n,a),"\n\n¨G"+(a.ghCodeBlocks.push({text:e,codeblock:r})-1)+"G\n\n"})).replace(/¨0/,""),a.converter._dispatch("githubCodeBlocks.after",e,n,a)):e}),t.subParser("hashBlock",function(e,t,n){"use strict";return e=(e=n.converter._dispatch("hashBlock.before",e,t,n)).replace(/(^\n+|\n+$)/g,""),e="\n\n¨K"+(n.gHtmlBlocks.push(e)-1)+"K\n\n",e=n.converter._dispatch("hashBlock.after",e,t,n)}),t.subParser("hashCodeTags",function(e,n,a){"use strict";e=a.converter._dispatch("hashCodeTags.before",e,n,a);return e=t.helper.replaceRecursiveRegExp(e,function(e,i,o,r){var s=o+t.subParser("encodeCode")(i,n,a)+r;return"¨C"+(a.gHtmlSpans.push(s)-1)+"C"},"]*>","","gim"),e=a.converter._dispatch("hashCodeTags.after",e,n,a)}),t.subParser("hashElement",function(e,t,n){"use strict";return function(e,t){var a=t;return a=(a=(a=a.replace(/\n\n/g,"\n")).replace(/^\n/,"")).replace(/\n+$/g,""),a="\n\n¨K"+(n.gHtmlBlocks.push(a)-1)+"K\n\n"}}),t.subParser("hashHTMLBlocks",function(e,n,a){"use strict";e=a.converter._dispatch("hashHTMLBlocks.before",e,n,a);var i=["pre","div","h1","h2","h3","h4","h5","h6","blockquote","table","dl","ol","ul","script","noscript","form","fieldset","iframe","math","style","section","header","footer","nav","article","aside","address","audio","canvas","figure","hgroup","output","video","p"],o=function(e,t,n,i){var o=e;return-1!==n.search(/\bmarkdown\b/)&&(o=n+a.converter.makeHtml(t)+i),"\n\n¨K"+(a.gHtmlBlocks.push(o)-1)+"K\n\n"};n.backslashEscapesHTMLTags&&(e=e.replace(/\\<(\/?[^>]+?)>/g,function(e,t){return"<"+t+">"}));for(var r=0;r]*>)","im"),u="<"+i[r]+"\\b[^>]*>",c="";-1!==(s=t.helper.regexIndexOf(e,l));){var d=t.helper.splitAtIndex(e,s),h=t.helper.replaceRecursiveRegExp(d[1],o,u,c,"im");if(h===d[1])break;e=d[0].concat(h)}return e=e.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,t.subParser("hashElement")(e,n,a)),e=(e=t.helper.replaceRecursiveRegExp(e,function(e){return"\n\n¨K"+(a.gHtmlBlocks.push(e)-1)+"K\n\n"},"^ {0,3}\x3c!--","--\x3e","gm")).replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,t.subParser("hashElement")(e,n,a)),e=a.converter._dispatch("hashHTMLBlocks.after",e,n,a)}),t.subParser("hashHTMLSpans",function(e,t,n){"use strict";function a(e){return"¨C"+(n.gHtmlSpans.push(e)-1)+"C"}return e=(e=(e=(e=(e=n.converter._dispatch("hashHTMLSpans.before",e,t,n)).replace(/<[^>]+?\/>/gi,function(e){return a(e)})).replace(/<([^>]+?)>[\s\S]*?<\/\1>/g,function(e){return a(e)})).replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g,function(e){return a(e)})).replace(/<[^>]+?>/gi,function(e){return a(e)}),e=n.converter._dispatch("hashHTMLSpans.after",e,t,n)}),t.subParser("unhashHTMLSpans",function(e,t,n){"use strict";e=n.converter._dispatch("unhashHTMLSpans.before",e,t,n);for(var a=0;a]*>\\s*]*>","^ {0,3}\\s*
","gim"),e=a.converter._dispatch("hashPreCodeTags.after",e,n,a)}),t.subParser("headers",function(e,n,a){"use strict";e=a.converter._dispatch("headers.before",e,n,a);var i=isNaN(parseInt(n.headerLevelStart))?1:parseInt(n.headerLevelStart),o=n.smoothLivePreview?/^(.+)[ \t]*\n={2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n=+[ \t]*\n+/gm,r=n.smoothLivePreview?/^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n-+[ \t]*\n+/gm;e=(e=e.replace(o,function(e,o){var r=t.subParser("spanGamut")(o,n,a),s=n.noHeaderId?"":' id="'+l(o)+'"',u=""+r+"";return t.subParser("hashBlock")(u,n,a)})).replace(r,function(e,o){var r=t.subParser("spanGamut")(o,n,a),s=n.noHeaderId?"":' id="'+l(o)+'"',u=i+1,c=""+r+"";return t.subParser("hashBlock")(c,n,a)});var s=n.requireSpaceBeforeHeadingText?/^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm:/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm;function l(e){var i,o;if(n.customizedHeaderId){var r=e.match(/\{([^{]+?)}\s*$/);r&&r[1]&&(e=r[1])}return i=e,o=t.helper.isString(n.prefixHeaderId)?n.prefixHeaderId:!0===n.prefixHeaderId?"section-":"",n.rawPrefixHeaderId||(i=o+i),i=n.ghCompatibleHeaderId?i.replace(/ /g,"-").replace(/&/g,"").replace(/¨T/g,"").replace(/¨D/g,"").replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g,"").toLowerCase():n.rawHeaderId?i.replace(/ /g,"-").replace(/&/g,"&").replace(/¨T/g,"¨").replace(/¨D/g,"$").replace(/["']/g,"-").toLowerCase():i.replace(/[^\w]/g,"").toLowerCase(),n.rawPrefixHeaderId&&(i=o+i),a.hashLinkCounts[i]?i=i+"-"+a.hashLinkCounts[i]++:a.hashLinkCounts[i]=1,i}return e=e.replace(s,function(e,o,r){var s=r;n.customizedHeaderId&&(s=r.replace(/\s?\{([^{]+?)}\s*$/,""));var u=t.subParser("spanGamut")(s,n,a),c=n.noHeaderId?"":' id="'+l(r)+'"',d=i-1+o.length,h=""+u+"";return t.subParser("hashBlock")(h,n,a)}),e=a.converter._dispatch("headers.after",e,n,a)}),t.subParser("horizontalRule",function(e,n,a){"use strict";e=a.converter._dispatch("horizontalRule.before",e,n,a);var i=t.subParser("hashBlock")("
",n,a);return e=(e=(e=e.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm,i)).replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm,i)).replace(/^ {0,2}( ?_){3,}[ \t]*$/gm,i),e=a.converter._dispatch("horizontalRule.after",e,n,a)}),t.subParser("images",function(e,n,a){"use strict";function i(e,n,i,o,r,s,l,u){var c=a.gUrls,d=a.gTitles,h=a.gDimensions;if(i=i.toLowerCase(),u||(u=""),e.search(/\(? ?(['"].*['"])?\)$/m)>-1)o="";else if(""===o||null===o){if(""!==i&&null!==i||(i=n.toLowerCase().replace(/ ?\n/g," ")),o="#"+i,t.helper.isUndefined(c[i]))return e;o=c[i],t.helper.isUndefined(d[i])||(u=d[i]),t.helper.isUndefined(h[i])||(r=h[i].width,s=h[i].height)}n=n.replace(/"/g,""").replace(t.helper.regexes.asteriskDashAndColon,t.helper.escapeCharactersCallback);var p=''+n+'"}return e=(e=(e=(e=(e=(e=a.converter._dispatch("images.before",e,n,a)).replace(/!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g,i)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,function(e,t,n,a,o,r,s,l){return i(e,t,n,a=a.replace(/\s/g,""),o,r,s,l)})).replace(/!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g,i)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,i)).replace(/!\[([^\[\]]+)]()()()()()/g,i),e=a.converter._dispatch("images.after",e,n,a)}),t.subParser("italicsAndBold",function(e,t,n){"use strict";function a(e,t,n){return t+e+n}return e=n.converter._dispatch("italicsAndBold.before",e,t,n),e=t.literalMidWordUnderscores?(e=(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,function(e,t){return a(t,"","")})).replace(/\b__(\S[\s\S]*?)__\b/g,function(e,t){return a(t,"","")})).replace(/\b_(\S[\s\S]*?)_\b/g,function(e,t){return a(t,"","")}):(e=(e=e.replace(/___(\S[\s\S]*?)___/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e})).replace(/__(\S[\s\S]*?)__/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e})).replace(/_([^\s_][\s\S]*?)_/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e}),e=t.literalMidWordAsterisks?(e=(e=e.replace(/([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g,function(e,t,n){return a(n,t+"","")})).replace(/([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g,function(e,t,n){return a(n,t+"","")})).replace(/([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g,function(e,t,n){return a(n,t+"","")}):(e=(e=e.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e})).replace(/\*\*(\S[\s\S]*?)\*\*/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e})).replace(/\*([^\s*][\s\S]*?)\*/g,function(e,t){return/\S$/.test(t)?a(t,"",""):e}),e=n.converter._dispatch("italicsAndBold.after",e,t,n)}),t.subParser("lists",function(e,n,a){"use strict";function i(e,i){a.gListLevel++,e=e.replace(/\n{2,}$/,"\n");var o=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm,r=/\n[ \t]*\n(?!¨0)/.test(e+="¨0");return n.disableForced4SpacesIndentedSublists&&(o=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm),e=(e=e.replace(o,function(e,i,o,s,l,u,c){c=c&&""!==c.trim();var d=t.subParser("outdent")(l,n,a),h="";return u&&n.tasklists&&(h=' class="task-list-item" style="list-style-type: none;"',d=d.replace(/^[ \t]*\[(x|X| )?]/m,function(){var e='-1?(d=t.subParser("githubCodeBlocks")(d,n,a),d=t.subParser("blockGamut")(d,n,a)):(d=(d=t.subParser("lists")(d,n,a)).replace(/\n$/,""),d=(d=t.subParser("hashHTMLBlocks")(d,n,a)).replace(/\n\n+/g,"\n\n"),d=r?t.subParser("paragraphs")(d,n,a):t.subParser("spanGamut")(d,n,a)),d=""+(d=d.replace("¨A",""))+"\n"})).replace(/¨0/g,""),a.gListLevel--,i&&(e=e.replace(/\s+$/,"")),e}function o(e,t){if("ol"===t){var n=e.match(/^ *(\d+)\./);if(n&&"1"!==n[1])return' start="'+n[1]+'"'}return""}function r(e,t,a){var r=n.disableForced4SpacesIndentedSublists?/^ ?\d+\.[ \t]/gm:/^ {0,3}\d+\.[ \t]/gm,s=n.disableForced4SpacesIndentedSublists?/^ ?[*+-][ \t]/gm:/^ {0,3}[*+-][ \t]/gm,l="ul"===t?r:s,u="";if(-1!==e.search(l))!function n(c){var d=c.search(l),h=o(e,t);-1!==d?(u+="\n\n<"+t+h+">\n"+i(c.slice(0,d),!!a)+"\n",l="ul"===(t="ul"===t?"ol":"ul")?r:s,n(c.slice(d))):u+="\n\n<"+t+h+">\n"+i(c,!!a)+"\n"}(e);else{var c=o(e,t);u="\n\n<"+t+c+">\n"+i(e,!!a)+"\n"}return u}return e=a.converter._dispatch("lists.before",e,n,a),e+="¨0",e=(e=a.gListLevel?e.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,function(e,t,n){return r(t,n.search(/[*+-]/g)>-1?"ul":"ol",!0)}):e.replace(/(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,function(e,t,n,a){return r(n,a.search(/[*+-]/g)>-1?"ul":"ol",!1)})).replace(/¨0/,""),e=a.converter._dispatch("lists.after",e,n,a)}),t.subParser("metadata",function(e,t,n){"use strict";if(!t.metadata)return e;function a(e){n.metadata.raw=e,(e=(e=e.replace(/&/g,"&").replace(/"/g,""")).replace(/\n {4}/g," ")).replace(/^([\S ]+): +([\s\S]+?)$/gm,function(e,t,a){return n.metadata.parsed[t]=a,""})}return e=(e=(e=(e=n.converter._dispatch("metadata.before",e,t,n)).replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/,function(e,t,n){return a(n),"¨M"})).replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/,function(e,t,i){return t&&(n.metadata.format=t),a(i),"¨M"})).replace(/¨M/g,""),e=n.converter._dispatch("metadata.after",e,t,n)}),t.subParser("outdent",function(e,t,n){"use strict";return e=(e=(e=n.converter._dispatch("outdent.before",e,t,n)).replace(/^(\t|[ ]{1,4})/gm,"¨0")).replace(/¨0/g,""),e=n.converter._dispatch("outdent.after",e,t,n)}),t.subParser("paragraphs",function(e,n,a){"use strict";for(var i=(e=(e=(e=a.converter._dispatch("paragraphs.before",e,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,"")).split(/\n{2,}/g),o=[],r=i.length,s=0;s=0?o.push(l):l.search(/\S/)>=0&&(l=(l=t.subParser("spanGamut")(l,n,a)).replace(/^([ \t]*)/g,"

"),l+="

",o.push(l))}for(r=o.length,s=0;s]*>\s*]*>/.test(c)&&(d=!0)}o[s]=c}return e=(e=(e=o.join("\n")).replace(/^\n+/g,"")).replace(/\n+$/g,""),a.converter._dispatch("paragraphs.after",e,n,a)}),t.subParser("runExtension",function(e,t,n,a){"use strict";if(e.filter)t=e.filter(t,a.converter,n);else if(e.regex){var i=e.regex;i instanceof RegExp||(i=new RegExp(i,"g")),t=t.replace(i,e.replace)}return t}),t.subParser("spanGamut",function(e,n,a){"use strict";return e=a.converter._dispatch("spanGamut.before",e,n,a),e=t.subParser("codeSpans")(e,n,a),e=t.subParser("escapeSpecialCharsWithinTagAttributes")(e,n,a),e=t.subParser("encodeBackslashEscapes")(e,n,a),e=t.subParser("images")(e,n,a),e=t.subParser("anchors")(e,n,a),e=t.subParser("autoLinks")(e,n,a),e=t.subParser("simplifiedAutoLinks")(e,n,a),e=t.subParser("emoji")(e,n,a),e=t.subParser("underline")(e,n,a),e=t.subParser("italicsAndBold")(e,n,a),e=t.subParser("strikethrough")(e,n,a),e=t.subParser("ellipsis")(e,n,a),e=t.subParser("hashHTMLSpans")(e,n,a),e=t.subParser("encodeAmpsAndAngles")(e,n,a),n.simpleLineBreaks?/\n\n¨K/.test(e)||(e=e.replace(/\n+/g,"
\n")):e=e.replace(/ +\n/g,"
\n"),e=a.converter._dispatch("spanGamut.after",e,n,a)}),t.subParser("strikethrough",function(e,n,a){"use strict";return n.strikethrough&&(e=(e=a.converter._dispatch("strikethrough.before",e,n,a)).replace(/(?:~){2}([\s\S]+?)(?:~){2}/g,function(e,i){return function(e){return n.simplifiedAutoLink&&(e=t.subParser("simplifiedAutoLinks")(e,n,a)),""+e+""}(i)}),e=a.converter._dispatch("strikethrough.after",e,n,a)),e}),t.subParser("stripLinkDefinitions",function(e,n,a){"use strict";var i=function(i,o,r,s,l,u,c){return o=o.toLowerCase(),e.toLowerCase().split(o).length-1<2?i:(r.match(/^data:.+?\/.+?;base64,/)?a.gUrls[o]=r.replace(/\s/g,""):a.gUrls[o]=t.subParser("encodeAmpsAndAngles")(r,n,a),u?u+c:(c&&(a.gTitles[o]=c.replace(/"|'/g,""")),n.parseImgDimensions&&s&&l&&(a.gDimensions[o]={width:s,height:l}),""))};return e=(e=(e=(e+="¨0").replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm,i)).replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm,i)).replace(/¨0/,"")}),t.subParser("tables",function(e,n,a){"use strict";if(!n.tables)return e;function i(e){return/^:[ \t]*--*$/.test(e)?' style="text-align:left;"':/^--*[ \t]*:[ \t]*$/.test(e)?' style="text-align:right;"':/^:[ \t]*--*[ \t]*:$/.test(e)?' style="text-align:center;"':""}function o(e,i){var o="";return e=e.trim(),(n.tablesHeaderId||n.tableHeaderId)&&(o=' id="'+e.replace(/ /g,"_").toLowerCase()+'"'),""+(e=t.subParser("spanGamut")(e,n,a))+"\n"}function r(e,i){return""+t.subParser("spanGamut")(e,n,a)+"\n"}function s(e){var s,l=e.split("\n");for(s=0;s\n\n\n",i=0;i\n";for(var o=0;o\n"}return n+"\n\n"}(h,f)}return e=(e=(e=(e=a.converter._dispatch("tables.before",e,n,a)).replace(/\\(\|)/g,t.helper.escapeCharactersCallback)).replace(/^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm,s)).replace(/^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm,s),e=a.converter._dispatch("tables.after",e,n,a)}),t.subParser("underline",function(e,n,a){"use strict";return n.underline?(e=a.converter._dispatch("underline.before",e,n,a),e=(e=n.literalMidWordUnderscores?(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,function(e,t){return""+t+""})).replace(/\b__(\S[\s\S]*?)__\b/g,function(e,t){return""+t+""}):(e=e.replace(/___(\S[\s\S]*?)___/g,function(e,t){return/\S$/.test(t)?""+t+"":e})).replace(/__(\S[\s\S]*?)__/g,function(e,t){return/\S$/.test(t)?""+t+"":e})).replace(/(_)/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("underline.after",e,n,a)):e}),t.subParser("unescapeSpecialChars",function(e,t,n){"use strict";return e=(e=n.converter._dispatch("unescapeSpecialChars.before",e,t,n)).replace(/¨E(\d+)E/g,function(e,t){var n=parseInt(t);return String.fromCharCode(n)}),e=n.converter._dispatch("unescapeSpecialChars.after",e,t,n)}),t.subParser("makeMarkdown.blockquote",function(e,n){"use strict";var a="";if(e.hasChildNodes())for(var i=e.childNodes,o=i.length,r=0;r ")}),t.subParser("makeMarkdown.codeBlock",function(e,t){"use strict";var n=e.getAttribute("language"),a=e.getAttribute("precodenum");return"```"+n+"\n"+t.preList[a]+"\n```"}),t.subParser("makeMarkdown.codeSpan",function(e){"use strict";return"`"+e.innerHTML+"`"}),t.subParser("makeMarkdown.emphasis",function(e,n){"use strict";var a="";if(e.hasChildNodes()){a+="*";for(var i=e.childNodes,o=i.length,r=0;r",e.hasAttribute("width")&&e.hasAttribute("height")&&(t+=" ="+e.getAttribute("width")+"x"+e.getAttribute("height")),e.hasAttribute("title")&&(t+=' "'+e.getAttribute("title")+'"'),t+=")"),t}),t.subParser("makeMarkdown.links",function(e,n){"use strict";var a="";if(e.hasChildNodes()&&e.hasAttribute("href")){var i=e.childNodes,o=i.length;a="[";for(var r=0;r",e.hasAttribute("title")&&(a+=' "'+e.getAttribute("title")+'"'),a+=")"}return a}),t.subParser("makeMarkdown.list",function(e,n,a){"use strict";var i="";if(!e.hasChildNodes())return"";for(var o=e.childNodes,r=o.length,s=e.getAttribute("start")||1,l=0;l"+t.preList[n]+""}),t.subParser("makeMarkdown.strikethrough",function(e,n){"use strict";var a="";if(e.hasChildNodes()){a+="~~";for(var i=e.childNodes,o=i.length,r=0;rtr>th"),l=e.querySelectorAll("tbody>tr");for(a=0;af&&(f=m)}for(a=0;a/g,"\\$1>")).replace(/^#/gm,"\\#")).replace(/^(\s*)([-=]{3,})(\s*)$/,"$1\\$2$3")).replace(/^( {0,3}\d+)\./gm,"$1\\.")).replace(/^( {0,3})([+-])/gm,"$1\\$2")).replace(/]([\s]*)\(/g,"\\]$1\\(")).replace(/^ {0,3}\[([\S \t]*?)]:/gm,"\\[$1]:")});"function"==typeof define&&define.amd?define(function(){"use strict";return t}):"undefined"!=typeof module&&module.exports?module.exports=t:this.showdown=t}.call(this);var NostrTools=(()=>{var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,i=(t,n)=>{for(var a in n)e(t,a,{get:n[a],enumerable:!0})},o={};function r(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&"Uint8Array"===e.constructor.name}function s(e,t=""){if(!Number.isSafeInteger(e)||e<0){throw new Error(`${t&&`"${t}" `}expected integer >= 0, got ${e}`)}}function l(e,t,n=""){const a=r(e),i=e?.length,o=void 0!==t;if(!a||o&&i!==t){throw new Error((n&&`"${n}" `)+"expected Uint8Array"+(o?` of length ${t}`:"")+", got "+(a?`length=${i}`:"type="+typeof e))}return e}function u(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash must wrapped by utils.createHasher");s(e.outputLen),s(e.blockLen)}function c(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function d(...e){for(let t=0;t>>t}i(o,{Relay:()=>Ya,SimplePool:()=>Ja,finalizeEvent:()=>Dt,fj:()=>Ia,generateSecretKey:()=>It,getEventHash:()=>zt,getFilterLimit:()=>Oa,getPublicKey:()=>Nt,kinds:()=>jt,matchFilter:()=>Ma,matchFilters:()=>Ra,mergeFilters:()=>za,nip04:()=>Ki,nip05:()=>Mo,nip10:()=>jo,nip11:()=>Fo,nip13:()=>Uo,nip17:()=>Ko,nip18:()=>Wr,nip19:()=>Xa,nip21:()=>Qr,nip25:()=>es,nip27:()=>as,nip28:()=>ls,nip30:()=>fs,nip39:()=>ys,nip42:()=>$a,nip44:()=>Qo,nip47:()=>xs,nip54:()=>Ts,nip57:()=>As,nip59:()=>Yo,nip77:()=>Ns,nip98:()=>Zs,parseReferences:()=>Gi,serializeEvent:()=>Rt,sortEvents:()=>xt,utils:()=>St,validateEvent:()=>kt,verifiedSymbol:()=>yt,verifyEvent:()=>qt});var f=(()=>"function"==typeof Uint8Array.from([]).toHex&&"function"==typeof Uint8Array.fromHex)(),m=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function _(e){if(l(e),f)return e.toHex();let t="";for(let n=0;n=g&&e<=v?e-g:e>=b&&e<=y?e-(b-10):e>=w&&e<=k?e-(w-10):void 0}function S(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);if(f)return Uint8Array.fromHex(e);const t=e.length,n=t/2;if(t%2)throw new Error("hex string expected, got unpadded hex of length "+t);const a=new Uint8Array(n);for(let t=0,i=0;te(n).update(t).digest(),a=e(void 0);return n.outputLen=a.outputLen,n.blockLen=a.blockLen,n.create=t=>e(t),Object.assign(n,t),Object.freeze(n)}function P(e=32){const t="object"==typeof globalThis?globalThis.crypto:null;if("function"!=typeof t?.getRandomValues)throw new Error("crypto.getRandomValues must be defined");return t.getRandomValues(new Uint8Array(e))}var E=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])});function A(e,t,n){return e&t^~e&n}function L(e,t,n){return e&t^e&n^t&n}var M=class{blockLen;outputLen;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(e,t,n,a){this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=a,this.buffer=new Uint8Array(e),this.view=h(this.buffer)}update(e){c(this),l(e);const{view:t,buffer:n,blockLen:a}=this,i=e.length;for(let o=0;o='+n)}(e,this),this.finished=!0;const{buffer:t,view:n,blockLen:a,isLE:i}=this;let{pos:o}=this;t[o++]=128,d(this.buffer.subarray(o)),this.padOffset>a-o&&(this.process(n,0),o=0);for(let e=o;ep.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;e>>3,i=p(n,17)^p(n,19)^n>>>10;O[e]=i+O[e-7]+a+O[e-16]|0}let{A:n,B:a,C:i,D:o,E:r,F:s,G:l,H:u}=this;for(let e=0;e<64;e++){const t=u+(p(r,6)^p(r,11)^p(r,25))+A(r,s,l)+z[e]+O[e]|0,c=(p(n,2)^p(n,13)^p(n,22))+L(n,a,i)|0;u=l,l=s,s=r,r=o+t|0,o=i,i=a,a=n,n=t+c|0}n=n+this.A|0,a=a+this.B|0,i=i+this.C|0,o=o+this.D|0,r=r+this.E|0,s=s+this.F|0,l=l+this.G|0,u=u+this.H|0,this.set(n,a,i,o,r,s,l,u)}roundClean(){d(O)}destroy(){this.set(0,0,0,0,0,0,0,0),d(this.buffer)}},N=class extends I{A=0|R[0];B=0|R[1];C=0|R[2];D=0|R[3];E=0|R[4];F=0|R[5];G=0|R[6];H=0|R[7];constructor(){super(32)}},D=T(()=>new N,E(1)),q=BigInt(0),j=BigInt(1);function B(e,t=""){if("boolean"!=typeof e){throw new Error((t&&`"${t}" `)+"expected boolean, got type="+typeof e)}return e}function F(e){if("bigint"==typeof e){if(!K(e))throw new Error("positive bigint expected, got "+e)}else s(e);return e}function $(e){const t=F(e).toString(16);return 1&t.length?"0"+t:t}function V(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);return""===e?q:BigInt("0x"+e)}function U(e){return V(_(e))}function H(e){return V(_(function(e){return Uint8Array.from(e)}(l(e)).reverse()))}function W(e,t){s(t);const n=S((e=F(e)).toString(16).padStart(2*t,"0"));if(n.length!==t)throw new Error("number too large");return n}function G(e,t){return W(e,t).reverse()}var K=e=>"bigint"==typeof e&&q<=e;function Y(e,t,n,a){if(!function(e,t,n){return K(e)&&K(t)&&K(n)&&t<=e&&e(j<Object.entries(t).forEach(([t,a])=>function(t,n,a){const i=e[t];if(a&&void 0===i)return;const o=typeof i;if(o!==n||null===i)throw new Error(`param "${t}" is invalid: expected ${n}, got ${o}`)}(t,a,n));a(t,!1),a(n,!0)}function J(e){const t=new WeakMap;return(n,...a)=>{const i=t.get(n);if(void 0!==i)return i;const o=e(n,...a);return t.set(n,o),o}}var X=BigInt(0),ee=BigInt(1),te=BigInt(2),ne=BigInt(3),ae=BigInt(4),ie=BigInt(5),oe=BigInt(7),re=BigInt(8),se=BigInt(9),le=BigInt(16);function ue(e,t){const n=e%t;return n>=X?n:t+n}function ce(e,t,n){let a=e;for(;t-- >X;)a*=a,a%=n;return a}function de(e,t){if(e===X)throw new Error("invert: expected non-zero number");if(t<=X)throw new Error("invert: expected positive modulus, got "+t);let n=ue(e,t),a=t,i=X,o=ee,r=ee,s=X;for(;n!==X;){const e=a/n,t=a%n,l=i-r*e,u=o-s*e;a=n,n=t,i=r,o=s,r=l,s=u}if(a!==ee)throw new Error("invert: does not exist");return ue(i,t)}function he(e,t,n){if(!e.eql(e.sqr(t),n))throw new Error("Cannot find square root")}function pe(e,t){const n=(e.ORDER+ee)/ae,a=e.pow(t,n);return he(e,a,t),a}function fe(e,t){const n=(e.ORDER-ie)/re,a=e.mul(t,te),i=e.pow(a,n),o=e.mul(t,i),r=e.mul(e.mul(o,te),i),s=e.mul(o,e.sub(r,e.ONE));return he(e,s,t),s}function me(e){if(e1e3)throw new Error("Cannot find square root: probably non-prime P");if(1===n)return pe;let o=i.pow(a,t);const r=(t+ee)/te;return function(e,a){if(e.is0(a))return a;if(1!==be(e,a))throw new Error("Cannot find square root");let i=n,s=e.mul(e.ONE,o),l=e.pow(a,t),u=e.pow(a,r);for(;!e.eql(l,e.ONE);){if(e.is0(l))return e.ZERO;let t=1,n=e.sqr(l);for(;!e.eql(n,e.ONE);)if(t++,n=e.sqr(n),t===i)throw new Error("Cannot find square root");const a=ee<{let n=e.pow(t,r),s=e.mul(n,a);const l=e.mul(n,i),u=e.mul(n,o),c=e.eql(e.sqr(s),t),d=e.eql(e.sqr(l),t);n=e.cmov(n,s,c),s=e.cmov(u,l,d);const h=e.eql(e.sqr(s),t),p=e.cmov(n,s,h);return he(e,p,t),p}}(e):me(e)}var ge=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function ve(e,t,n=!1){const a=new Array(t.length).fill(n?e.ZERO:void 0),i=t.reduce((t,n,i)=>e.is0(n)?t:(a[i]=t,e.mul(t,n)),e.ONE),o=e.inv(i);return t.reduceRight((t,n,i)=>e.is0(n)?t:(a[i]=e.mul(t,a[i]),e.mul(t,n)),o),a}function be(e,t){const n=(e.ORDER-ee)/te,a=e.pow(t,n),i=e.eql(a,e.ONE),o=e.eql(a,e.ZERO),r=e.eql(a,e.neg(e.ONE));if(!i&&!o&&!r)throw new Error("invalid Legendre symbol result");return i?1:o?0:-1}var ye=class{ORDER;BITS;BYTES;isLE;ZERO=X;ONE=ee;_lengths;_sqrt;_mod;constructor(e,t={}){if(e<=X)throw new Error("invalid field: expected ORDER > 0, got "+e);let n;this.isLE=!1,null!=t&&"object"==typeof t&&("number"==typeof t.BITS&&(n=t.BITS),"function"==typeof t.sqrt&&(this.sqrt=t.sqrt),"boolean"==typeof t.isLE&&(this.isLE=t.isLE),t.allowedLengths&&(this._lengths=t.allowedLengths?.slice()),"boolean"==typeof t.modFromBytes&&(this._mod=t.modFromBytes));const{nBitLength:a,nByteLength:i}=function(e,t){void 0!==t&&s(t);const n=void 0!==t?t:e.toString(2).length;return{nBitLength:n,nByteLength:Math.ceil(n/8)}}(e,n);if(i>2048)throw new Error("invalid field: expected ORDER of <= 2048 bytes");this.ORDER=e,this.BITS=a,this.BYTES=i,this._sqrt=void 0,Object.preventExtensions(this)}create(e){return ue(e,this.ORDER)}isValid(e){if("bigint"!=typeof e)throw new Error("invalid field element: expected bigint, got "+typeof e);return X<=e&&eX;)n&ee&&(a=e.mul(a,i)),i=e.sqr(i),n>>=ee;return a}(this,e,t)}div(e,t){return ue(e*de(t,this.ORDER),this.ORDER)}sqrN(e){return e*e}addN(e,t){return e+t}subN(e,t){return e-t}mulN(e,t){return e*t}inv(e){return de(e,this.ORDER)}sqrt(e){return this._sqrt||(this._sqrt=_e(this.ORDER)),this._sqrt(this,e)}toBytes(e){return this.isLE?G(e,this.BYTES):W(e,this.BYTES)}fromBytes(e,t=!1){l(e);const{_lengths:n,BYTES:a,isLE:i,ORDER:o,_mod:r}=this;if(n){if(!n.includes(e.length)||e.length>a)throw new Error("Field.fromBytes: expected "+n+" bytes, got "+e.length);const t=new Uint8Array(a);t.set(e,i?0:t.length-e.length),e=t}if(e.length!==a)throw new Error("Field.fromBytes: expected "+a+" bytes, got "+e.length);let s=i?H(e):U(e);if(r&&(s=ue(s,o)),!t&&!this.isValid(s))throw new Error("invalid field element: outside of range 0..ORDER");return s}invertBatch(e){return ve(this,e)}cmov(e,t,n){return n?t:e}};function we(e,t={}){return new ye(e,t)}function ke(e){if("bigint"!=typeof e)throw new Error("field order must be bigint");const t=e.toString(2).length;return Math.ceil(t/8)}function xe(e){const t=ke(e);return t+Math.ceil(t/2)}function Se(e,t,n=!1){l(e);const a=e.length,i=ke(t),o=xe(t);if(a<16||a1024)throw new Error("expected "+o+"-1024 bytes of input, got "+a);const r=ue(n?H(e):U(e),t-ee)+ee;return n?G(r,i):W(r,i)}var Ce=BigInt(0),Te=BigInt(1);function Pe(e,t){const n=t.negate();return e?n:t}function Ee(e,t){const n=ve(e.Fp,t.map(e=>e.Z));return t.map((t,a)=>e.fromAffine(t.toAffine(n[a])))}function Ae(e,t){if(!Number.isSafeInteger(e)||e<=0||e>t)throw new Error("invalid window size, expected [1.."+t+"], got W="+e)}function Le(e,t){Ae(e,t);const n=2**e;return{windows:Math.ceil(t/e)+1,windowSize:2**(e-1),mask:Q(e),maxNumber:n,shiftBy:BigInt(e)}}function Me(e,t,n){const{windowSize:a,mask:i,maxNumber:o,shiftBy:r}=n;let s=Number(e&i),l=e>>r;s>a&&(s-=o,l+=Te);const u=t*a;return{nextN:l,offset:u+Math.abs(s)-1,isZero:0===s,isNeg:s<0,isNegF:t%2!=0,offsetF:u}}var Re=new WeakMap,ze=new WeakMap;function Oe(e){return ze.get(e)||1}function Ie(e){if(e!==Ce)throw new Error("invalid wNAF")}var Ne=class{BASE;ZERO;Fn;bits;constructor(e,t){this.BASE=e.BASE,this.ZERO=e.ZERO,this.Fn=e.Fn,this.bits=t}_unsafeLadder(e,t,n=this.ZERO){let a=e;for(;t>Ce;)t&Te&&(n=n.add(a)),a=a.double(),t>>=Te;return n}precomputeWindow(e,t){const{windows:n,windowSize:a}=Le(t,this.bits),i=[];let o=e,r=o;for(let e=0;e(e[t]="function",e),{ORDER:"bigint",BYTES:"number",BITS:"number"}))}(t),t}return we(e,{isLE:n})}function qe(e,t){return function(n){const a=e(n);return{secretKey:a,publicKey:t(a)}}}var je=class{oHash;iHash;blockLen;outputLen;finished=!1;destroyed=!1;constructor(e,t){if(u(e),l(t,void 0,"key"),this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const n=this.blockLen,a=new Uint8Array(n);a.set(t.length>n?e.create().update(t).digest():t);for(let e=0;enew je(e,t).update(n).digest();Be.create=(e,t)=>new je(e,t);var Fe=(e,t)=>(e+(e>=0?t:-t)/Ke)/t;function $e(e,t,n){const[[a,i],[o,r]]=t,s=Fe(r*e,n),l=Fe(-i*e,n);let u=e-s*a-l*o,c=-s*i-l*r;const d=uq;e>>=j,t+=1);return t}(n)/2))+Ge;if(u=p||c=p)throw new Error("splitScalar (endomorphism): failed, k="+e);return{k1neg:d,k1:u,k2neg:h,k2:c}}function Ve(e){if(!["compact","recovered","der"].includes(e))throw new Error('Signature format must be "compact", "recovered", or "der"');return e}function Ue(e,t){const n={};for(let a of Object.keys(t))n[a]=void 0===e[a]?t[a]:e[a];return B(n.lowS,"lowS"),B(n.prehash,"prehash"),void 0!==n.format&&Ve(n.format),n}var He={Err:class extends Error{constructor(e=""){super(e)}},_tlv:{encode:(e,t)=>{const{Err:n}=He;if(e<0||e>256)throw new n("tlv.encode: wrong tag");if(1&t.length)throw new n("tlv.encode: unpadded data");const a=t.length/2,i=$(a);if(i.length/2&128)throw new n("tlv.encode: long form length too big");const o=a>127?$(i.length/2|128):"";return $(e)+o+i+t},decode(e,t){const{Err:n}=He;let a=0;if(e<0||e>256)throw new n("tlv.encode: wrong tag");if(t.length<2||t[a++]!==e)throw new n("tlv.decode: wrong tlv");const i=t[a++];let o=0;if(!!(128&i)){const e=127&i;if(!e)throw new n("tlv.decode(long): indefinite length not supported");if(e>4)throw new n("tlv.decode(long): byte length is too big");const r=t.subarray(a,a+e);if(r.length!==e)throw new n("tlv.decode: length bytes not complete");if(0===r[0])throw new n("tlv.decode(long): zero leftmost byte");for(const e of r)o=o<<8|e;if(a+=e,o<128)throw new n("tlv.decode(long): not minimal encoding")}else o=i;const r=t.subarray(a,a+o);if(r.length!==o)throw new n("tlv.decode: wrong value length");return{v:r,l:t.subarray(a+o)}}},_int:{encode(e){const{Err:t}=He;if(eCe))throw new Error(`CURVE.${e} must be positive bigint`)}const i=De(t.p,n.Fp,a),o=De(t.n,n.Fn,a),r=["Gx","Gy","a","weierstrass"===e?"b":"d"];for(const e of r)if(!i.isValid(t[e]))throw new Error(`CURVE.${e} must be valid field element of CURVE.Fp`);return{CURVE:t=Object.freeze(Object.assign({},t)),Fp:i,Fn:o}}("weierstrass",e,t),{Fp:a,Fn:i}=n;let o=n.CURVE;const{h:r,n:s}=o;Z(t,{},{allowInfinityPoint:"boolean",clearCofactor:"function",isTorsionFree:"function",fromBytes:"function",toBytes:"function",endo:"object"});const{endo:u}=t;if(u&&(!a.is0(o.a)||"bigint"!=typeof u.beta||!Array.isArray(u.basises)))throw new Error('invalid endo: expected "beta": bigint and "basises": array');const c=Xe(a,i);function d(){if(!a.isOdd)throw new Error("compression is not supported: Field does not have .isOdd()")}const h=t.toBytes||function(e,t,n){const{x:i,y:o}=t.toAffine(),r=a.toBytes(i);if(B(n,"isCompressed"),n){d();return C(Je(!a.isOdd(o)),r)}return C(Uint8Array.of(4),r,a.toBytes(o))},p=t.fromBytes||function(e){l(e,void 0,"Point");const{publicKey:t,publicKeyUncompressed:n}=c,i=e.length,o=e[0],r=e.subarray(1);if(i!==t||2!==o&&3!==o){if(i===n&&4===o){const e=a.BYTES,t=a.fromBytes(r.subarray(0,e)),n=a.fromBytes(r.subarray(e,2*e));if(!m(t,n))throw new Error("bad point: is not on curve");return{x:t,y:n}}throw new Error(`bad point: got length ${i}, expected compressed=${t} or uncompressed=${n}`)}{const e=a.fromBytes(r);if(!a.isValid(e))throw new Error("bad point: is not on curve, wrong x");const t=f(e);let n;try{n=a.sqrt(t)}catch(e){const t=e instanceof Error?": "+e.message:"";throw new Error("bad point: is not on curve, sqrt error"+t)}d();return!(1&~o)!==a.isOdd(n)&&(n=a.neg(n)),{x:e,y:n}}};function f(e){const t=a.sqr(e),n=a.mul(t,e);return a.add(a.add(n,a.mul(e,o.a)),o.b)}function m(e,t){const n=a.sqr(t),i=f(e);return a.eql(n,i)}if(!m(o.Gx,o.Gy))throw new Error("bad curve params: generator point");const g=a.mul(a.pow(o.a,Ye),Qe),v=a.mul(a.sqr(o.b),BigInt(27));if(a.is0(a.add(g,v)))throw new Error("bad curve params: a or b");function b(e,t,n=!1){if(!a.isValid(t)||n&&a.is0(t))throw new Error(`bad point coordinate ${e}`);return t}function y(e){if(!(e instanceof P))throw new Error("Weierstrass Point expected")}function w(e){if(!u||!u.basises)throw new Error("no endo");return $e(e,u.basises,i.ORDER)}const k=J((e,t)=>{const{X:n,Y:i,Z:o}=e;if(a.eql(o,a.ONE))return{x:n,y:i};const r=e.is0();null==t&&(t=r?a.ONE:a.inv(o));const s=a.mul(n,t),l=a.mul(i,t),u=a.mul(o,t);if(r)return{x:a.ZERO,y:a.ZERO};if(!a.eql(u,a.ONE))throw new Error("invZ was invalid");return{x:s,y:l}}),x=J(e=>{if(e.is0()){if(t.allowInfinityPoint&&!a.is0(e.Y))return;throw new Error("bad point: ZERO")}const{x:n,y:i}=e.toAffine();if(!a.isValid(n)||!a.isValid(i))throw new Error("bad point: x or y not field elements");if(!m(n,i))throw new Error("bad point: equation left != right");if(!e.isTorsionFree())throw new Error("bad point: not in prime-order subgroup");return!0});function T(e,t,n,i,o){return n=new P(a.mul(n.X,e),n.Y,n.Z),t=Pe(i,t),n=Pe(o,n),t.add(n)}class P{static BASE=new P(o.Gx,o.Gy,a.ONE);static ZERO=new P(a.ZERO,a.ONE,a.ZERO);static Fp=a;static Fn=i;X;Y;Z;constructor(e,t,n){this.X=b("x",e),this.Y=b("y",t,!0),this.Z=b("z",n),Object.freeze(this)}static CURVE(){return o}static fromAffine(e){const{x:t,y:n}=e||{};if(!e||!a.isValid(t)||!a.isValid(n))throw new Error("invalid affine point");if(e instanceof P)throw new Error("projective point not allowed");return a.is0(t)&&a.is0(n)?P.ZERO:new P(t,n,a.ONE)}static fromBytes(e){const t=P.fromAffine(p(l(e,void 0,"point")));return t.assertValidity(),t}static fromHex(e){return P.fromBytes(S(e))}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(e=8,t=!0){return A.createCache(this,e),t||this.multiply(Ye),this}assertValidity(){x(this)}hasEvenY(){const{y:e}=this.toAffine();if(!a.isOdd)throw new Error("Field doesn't support isOdd");return!a.isOdd(e)}equals(e){y(e);const{X:t,Y:n,Z:i}=this,{X:o,Y:r,Z:s}=e,l=a.eql(a.mul(t,s),a.mul(o,i)),u=a.eql(a.mul(n,s),a.mul(r,i));return l&&u}negate(){return new P(this.X,a.neg(this.Y),this.Z)}double(){const{a:e,b:t}=o,n=a.mul(t,Ye),{X:i,Y:r,Z:s}=this;let l=a.ZERO,u=a.ZERO,c=a.ZERO,d=a.mul(i,i),h=a.mul(r,r),p=a.mul(s,s),f=a.mul(i,r);return f=a.add(f,f),c=a.mul(i,s),c=a.add(c,c),l=a.mul(e,c),u=a.mul(n,p),u=a.add(l,u),l=a.sub(h,u),u=a.add(h,u),u=a.mul(l,u),l=a.mul(f,l),c=a.mul(n,c),p=a.mul(e,p),f=a.sub(d,p),f=a.mul(e,f),f=a.add(f,c),c=a.add(d,d),d=a.add(c,d),d=a.add(d,p),d=a.mul(d,f),u=a.add(u,d),p=a.mul(r,s),p=a.add(p,p),d=a.mul(p,f),l=a.sub(l,d),c=a.mul(p,h),c=a.add(c,c),c=a.add(c,c),new P(l,u,c)}add(e){y(e);const{X:t,Y:n,Z:i}=this,{X:r,Y:s,Z:l}=e;let u=a.ZERO,c=a.ZERO,d=a.ZERO;const h=o.a,p=a.mul(o.b,Ye);let f=a.mul(t,r),m=a.mul(n,s),_=a.mul(i,l),g=a.add(t,n),v=a.add(r,s);g=a.mul(g,v),v=a.add(f,m),g=a.sub(g,v),v=a.add(t,i);let b=a.add(r,l);return v=a.mul(v,b),b=a.add(f,_),v=a.sub(v,b),b=a.add(n,i),u=a.add(s,l),b=a.mul(b,u),u=a.add(m,_),b=a.sub(b,u),d=a.mul(h,v),u=a.mul(p,_),d=a.add(u,d),u=a.sub(m,d),d=a.add(m,d),c=a.mul(u,d),m=a.add(f,f),m=a.add(m,f),_=a.mul(h,_),v=a.mul(p,v),m=a.add(m,_),_=a.sub(f,_),_=a.mul(h,_),v=a.add(v,_),f=a.mul(m,v),c=a.add(c,f),f=a.mul(b,v),u=a.mul(g,u),u=a.sub(u,f),f=a.mul(g,m),d=a.mul(b,d),d=a.add(d,f),new P(u,c,d)}subtract(e){return this.add(e.negate())}is0(){return this.equals(P.ZERO)}multiply(e){const{endo:n}=t;if(!i.isValidNot0(e))throw new Error("invalid scalar: out of range");let a,o;const r=e=>A.cached(this,e,e=>Ee(P,e));if(n){const{k1neg:t,k1:i,k2neg:s,k2:l}=w(e),{p:u,f:c}=r(i),{p:d,f:h}=r(l);o=c.add(h),a=T(n.beta,u,d,t,s)}else{const{p:t,f:n}=r(e);a=t,o=n}return Ee(P,[a,o])[0]}multiplyUnsafe(e){const{endo:n}=t,a=this;if(!i.isValid(e))throw new Error("invalid scalar: out of range");if(e===We||a.is0())return P.ZERO;if(e===Ge)return a;if(A.hasCache(this))return this.multiply(e);if(n){const{k1neg:t,k1:i,k2neg:o,k2:r}=w(e),{p1:s,p2:l}=function(e,t,n,a){let i=t,o=e.ZERO,r=e.ZERO;for(;n>Ce||a>Ce;)n&Te&&(o=o.add(i)),a&Te&&(r=r.add(i)),i=i.double(),n>>=Te,a>>=Te;return{p1:o,p2:r}}(P,a,i,r);return T(n.beta,s,l,t,o)}return A.unsafe(a,e)}toAffine(e){return k(this,e)}isTorsionFree(){const{isTorsionFree:e}=t;return r===Ge||(e?e(P,this):A.unsafe(this,s).is0())}clearCofactor(){const{clearCofactor:e}=t;return r===Ge?this:e?e(P,this):this.multiplyUnsafe(r)}isSmallOrder(){return this.multiplyUnsafe(r).is0()}toBytes(e=!0){return B(e,"isCompressed"),this.assertValidity(),h(P,this,e)}toHex(e=!0){return _(this.toBytes(e))}toString(){return``}}const E=i.BITS,A=new Ne(P,t.endo?Math.ceil(E/2):E);return P.BASE.precompute(8),P}function Je(e){return Uint8Array.of(e?2:3)}function Xe(e,t){return{secretKey:t.BYTES,publicKey:1+e.BYTES,publicKeyUncompressed:1+2*e.BYTES,publicKeyHasPrefix:!0,signature:2*t.BYTES}}function et(e,t,n={}){u(t),Z(n,{},{hmac:"function",lowS:"boolean",randomBytes:"function",bits2int:"function",bits2int_modN:"function"});const a=(n=Object.assign({},n)).randomBytes||P,i=n.hmac||((e,n)=>Be(t,e,n)),{Fp:o,Fn:c}=e,{ORDER:d,BITS:h}=c,{keygen:p,getPublicKey:f,getSharedSecret:m,utils:g,lengths:v}=function(e,t={}){const{Fn:n}=e,a=t.randomBytes||P,i=Object.assign(Xe(e.Fp,n),{seed:xe(n.ORDER)});function o(e=a(i.seed)){return Se(l(e,i.seed,"seed"),n.ORDER)}function s(t,a=!0){return e.BASE.multiply(n.fromBytes(t)).toBytes(a)}function u(e){const{secretKey:t,publicKey:a,publicKeyUncompressed:o}=i;if(!r(e))return;if("_lengths"in n&&n._lengths||t===a)return;const s=l(e,void 0,"key").length;return s===a||s===o}const c={isValidSecretKey:function(e){try{const t=n.fromBytes(e);return n.isValidNot0(t)}catch(e){return!1}},isValidPublicKey:function(t,n){const{publicKey:a,publicKeyUncompressed:o}=i;try{const i=t.length;return!(!0===n&&i!==a||!1===n&&i!==o||!e.fromBytes(t))}catch(e){return!1}},randomSecretKey:o},d=qe(o,s);return Object.freeze({getPublicKey:s,getSharedSecret:function(t,a,i=!0){if(!0===u(t))throw new Error("first arg must be private key");if(!1===u(a))throw new Error("second arg must be public key");const o=n.fromBytes(t);return e.fromBytes(a).multiply(o).toBytes(i)},keygen:d,Point:e,utils:c,lengths:i})}(e,n),b={prehash:!0,lowS:"boolean"!=typeof n.lowS||n.lowS,format:"compact",extraEntropy:!1},y=d*Ked>>Ge}function k(e,t){if(!c.isValidNot0(t))throw new Error(`invalid signature ${e}: out of range 1..Point.Fn.ORDER`);return t}function x(){if(y)throw new Error('"recovered" sig type is not supported for cofactor >2 curves')}function T(e,t){Ve(t);const n=v.signature;return l(e,"compact"===t?n:"recovered"===t?n+1:void 0)}class E{r;s;recovery;constructor(e,t,n){if(this.r=k("r",e),this.s=k("s",t),null!=n){if(x(),![0,1,2,3].includes(n))throw new Error("invalid recovery id");this.recovery=n}Object.freeze(this)}static fromBytes(e,t=b.format){let n;if(T(e,t),"der"===t){const{r:t,s:n}=He.toSig(l(e));return new E(t,n)}"recovered"===t&&(n=e[0],t="compact",e=e.subarray(1));const a=v.signature/2,i=e.subarray(0,a),o=e.subarray(a,2*a);return new E(c.fromBytes(i),c.fromBytes(o),n)}static fromHex(e,t){return this.fromBytes(S(e),t)}assertRecovery(){const{recovery:e}=this;if(null==e)throw new Error("invalid recovery id: must be present");return e}addRecoveryBit(e){return new E(this.r,this.s,e)}recoverPublicKey(t){const{r:n,s:a}=this,i=this.assertRecovery(),r=2===i||3===i?n+d:n;if(!o.isValid(r))throw new Error("invalid recovery id: sig.r+curve.n != R.x");const s=o.toBytes(r),u=e.fromBytes(C(Je(!(1&i)),s)),h=c.inv(r),p=L(l(t,void 0,"msgHash")),f=c.create(-p*h),m=c.create(a*h),_=e.BASE.multiplyUnsafe(f).add(u.multiplyUnsafe(m));if(_.is0())throw new Error("invalid recovery: point at infinify");return _.assertValidity(),_}hasHighS(){return w(this.s)}toBytes(e=b.format){if(Ve(e),"der"===e)return S(He.hexFromSig(this));const{r:t,s:n}=this,a=c.toBytes(t),i=c.toBytes(n);return"recovered"===e?(x(),C(Uint8Array.of(this.assertRecovery()),a,i)):C(a,i)}toHex(e){return _(this.toBytes(e))}}const A=n.bits2int||function(e){if(e.length>8192)throw new Error("input is too large");const t=U(e),n=8*e.length-h;return n>0?t>>BigInt(n):t},L=n.bits2int_modN||function(e){return c.create(A(e))},M=Q(h);function R(e){return Y("num < 2^"+h,e,We,M),c.toBytes(e)}function z(e,n){return l(e,void 0,"message"),n?l(t(e),void 0,"prehashed message"):e}return Object.freeze({keygen:p,getPublicKey:f,getSharedSecret:m,utils:g,lengths:v,Point:e,sign:function(n,o,r={}){const{seed:u,k2sig:d}=function(t,n,i){const{lowS:o,prehash:r,extraEntropy:s}=Ue(i,b);t=z(t,r);const u=L(t),d=c.fromBytes(n);if(!c.isValidNot0(d))throw new Error("invalid private key");const h=[R(d),R(u)];if(null!=s&&!1!==s){const e=!0===s?a(v.secretKey):s;h.push(l(e,void 0,"extraEntropy"))}const p=C(...h),f=u;return{seed:p,k2sig:function(t){const n=A(t);if(!c.isValidNot0(n))return;const a=c.inv(n),i=e.BASE.multiply(n).toAffine(),r=c.create(i.x);if(r===We)return;const s=c.create(a*c.create(f+r*d));if(s===We)return;let l=(i.x===r?0:2)|Number(i.y&Ge),u=s;return o&&w(s)&&(u=c.neg(s),l^=1),new E(r,u,y?void 0:l)}}}(n,o,r);return function(e,t,n){if(s(e,"hashLen"),s(t,"qByteLen"),"function"!=typeof n)throw new Error("hmacFn must be a function");const a=e=>new Uint8Array(e),i=Uint8Array.of(),o=Uint8Array.of(0),r=Uint8Array.of(1);let l=a(e),u=a(e),c=0;const d=()=>{l.fill(1),u.fill(0),c=0},h=(...e)=>n(u,C(l,...e)),p=(e=i)=>{u=h(o,e),l=h(),0!==e.length&&(u=h(r,e),l=h())},f=()=>{if(c++>=1e3)throw new Error("drbg: tried max amount of iterations");let e=0;const n=[];for(;e{let n;for(d(),p(e);!(n=t(f()));)p();return d(),n}}(t.outputLen,c.BYTES,i)(u,d).toBytes(r.format)},verify:function(t,n,a,i={}){const{lowS:o,prehash:s,format:u}=Ue(i,b);if(a=l(a,void 0,"publicKey"),n=z(n,s),!r(t)){throw new Error("verify expects Uint8Array signature"+(t instanceof E?", use sig.toBytes()":""))}T(t,u);try{const i=E.fromBytes(t,u),r=e.fromBytes(a);if(o&&i.hasHighS())return!1;const{r:s,s:l}=i,d=L(n),h=c.inv(l),p=c.create(d*h),f=c.create(s*h),m=e.BASE.multiplyUnsafe(p).add(r.multiplyUnsafe(f));if(m.is0())return!1;return c.create(m.x)===s}catch(e){return!1}},recoverPublicKey:function(e,t,n={}){const{prehash:a}=Ue(n,b);return t=z(t,a),E.fromBytes(e,"recovered").recoverPublicKey(t).toBytes()},Signature:E,hash:t})}var tt={p:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:BigInt(1),a:BigInt(0),b:BigInt(7),Gx:BigInt("0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"),Gy:BigInt("0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8")},nt={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),basises:[[BigInt("0x3086d221a7d46bcde86c90e49284eb15"),-BigInt("0xe4437ed6010e88286f547fa90abfe4c3")],[BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),BigInt("0x3086d221a7d46bcde86c90e49284eb15")]]},at=BigInt(0),it=BigInt(2);var ot=we(tt.p,{sqrt:function(e){const t=tt.p,n=BigInt(3),a=BigInt(6),i=BigInt(11),o=BigInt(22),r=BigInt(23),s=BigInt(44),l=BigInt(88),u=e*e*e%t,c=u*u*e%t,d=ce(c,n,t)*c%t,h=ce(d,n,t)*c%t,p=ce(h,it,t)*u%t,f=ce(p,i,t)*p%t,m=ce(f,o,t)*f%t,_=ce(m,s,t)*m%t,g=ce(_,l,t)*_%t,v=ce(g,s,t)*m%t,b=ce(v,n,t)*c%t,y=ce(b,r,t)*f%t,w=ce(y,a,t)*u%t,k=ce(w,it,t);if(!ot.eql(ot.sqr(k),e))throw new Error("Cannot find square root");return k}}),rt=Ze(tt,{Fp:ot,endo:nt}),st=et(rt,D),lt={};function ut(e,...t){let n=lt[e];if(void 0===n){const t=D((a=e,Uint8Array.from(a,(e,t)=>{const n=e.charCodeAt(0);if(1!==e.length||n>127)throw new Error(`string contains non-ASCII character "${a[t]}" with code ${n} at position ${t}`);return n})));n=C(t,t),lt[e]=n}var a;return D(C(n,...t))}var ct=e=>e.toBytes(!0).slice(1),dt=e=>e%it===at;function ht(e){const{Fn:t,BASE:n}=rt,a=t.fromBytes(e),i=n.multiply(a);return{scalar:dt(i.y)?a:t.neg(a),bytes:ct(i)}}function pt(e){const t=ot;if(!t.isValidNot0(e))throw new Error("invalid x: Fail if x ≥ p");const n=t.create(e*e),a=t.create(n*e+BigInt(7));let i=t.sqrt(a);dt(i)||(i=t.neg(i));const o=rt.fromAffine({x:e,y:i});return o.assertValidity(),o}var ft=U;function mt(...e){return rt.Fn.create(ft(ut("BIP0340/challenge",...e)))}function _t(e){return ht(e).bytes}function gt(e,t,n=P(32)){const{Fn:a}=rt,i=l(e,void 0,"message"),{bytes:o,scalar:r}=ht(t),s=l(n,32,"auxRand"),u=a.toBytes(r^ft(ut("BIP0340/aux",s))),c=ut("BIP0340/nonce",u,o,i),{bytes:d,scalar:h}=ht(c),p=mt(d,o,i),f=new Uint8Array(64);if(f.set(d,0),f.set(a.toBytes(a.create(h+p*r)),32),!vt(f,i,o))throw new Error("sign: Invalid signature produced");return f}function vt(e,t,n){const{Fp:a,Fn:i,BASE:o}=rt,r=l(e,64,"signature"),s=l(t,void 0,"message"),u=l(n,32,"publicKey");try{const e=pt(ft(u)),t=ft(r.subarray(0,32));if(!a.isValidNot0(t))return!1;const n=ft(r.subarray(32,64));if(!i.isValidNot0(n))return!1;const l=mt(i.toBytes(t),ct(e),s),c=o.multiplyUnsafe(n).add(e.multiplyUnsafe(i.neg(l))),{x:d,y:h}=c.toAffine();return!(c.is0()||!dt(h)||d!==t)}catch(e){return!1}}var bt=(()=>{const e=(e=P(48))=>Se(e,tt.n);return{keygen:qe(e,_t),getPublicKey:_t,sign:gt,verify:vt,Point:rt,utils:{randomSecretKey:e,taggedHash:ut,lift_x:pt,pointToBytes:ct},lengths:{secretKey:32,publicKey:32,publicKeyHasPrefix:!1,signature:64,seed:48}}})(),yt=Symbol("verified"),wt=e=>e instanceof Object;function kt(e){if(!wt(e))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;te.created_at!==t.created_at?t.created_at-e.created_at:e.id.localeCompare(t.id))}var St={};i(St,{binarySearch:()=>Lt,bytesToHex:()=>_,hexToBytes:()=>S,insertEventIntoAscendingList:()=>At,insertEventIntoDescendingList:()=>Et,mergeReverseSortedLists:()=>Mt,normalizeURL:()=>Pt,utf8Decoder:()=>Ct,utf8Encoder:()=>Tt});var Ct=new TextDecoder("utf-8"),Tt=new TextEncoder;function Pt(e){try{-1===e.indexOf("://")&&(e="wss://"+e);let t=new URL(e);return"http:"===t.protocol?t.protocol="ws:":"https:"===t.protocol&&(t.protocol="wss:"),t.pathname=t.pathname.replace(/\/+/g,"/"),t.pathname.endsWith("/")&&(t.pathname=t.pathname.slice(0,-1)),("80"===t.port&&"ws:"===t.protocol||"443"===t.port&&"wss:"===t.protocol)&&(t.port=""),t.searchParams.sort(),t.hash="",t.toString()}catch(t){throw new Error(`Invalid URL: ${e}`)}}function Et(e,t){const[n,a]=Lt(e,e=>t.id===e.id?0:t.created_at===e.created_at?-1:e.created_at-t.created_at);return a||e.splice(n,0,t),e}function At(e,t){const[n,a]=Lt(e,e=>t.id===e.id?0:t.created_at===e.created_at?-1:t.created_at-e.created_at);return a||e.splice(n,0,t),e}function Lt(e,t){let n=0,a=e.length-1;for(;n<=a;){const i=Math.floor((n+a)/2),o=t(e[i]);if(0===o)return[i,!0];o<0?a=i-1:n=i+1}return[n,!1]}function Mt(e,t){const n=new Array(e.length+t.length);n.length=0;let a=0,i=0,o=[];for(;at[i]?.created_at?(r=e[a],a++):(r=t[i],i++),n.length>0&&n[n.length-1].created_at===r.created_at){if(o.includes(r.id))continue}else o.length=0;n.push(r),o.push(r.id)}for(;a0&&n[n.length-1].created_at===t.created_at){if(o.includes(t.id))continue}else o.length=0;n.push(t),o.push(t.id)}for(;i0&&n[n.length-1].created_at===e.created_at){if(o.includes(e.id))continue}else o.length=0;n.push(e),o.push(e.id)}return n}function Rt(e){if(!kt(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function zt(e){return _(D(Tt.encode(Rt(e))))}var Ot=new class{generateSecretKey(){return bt.utils.randomSecretKey()}getPublicKey(e){return _(bt.getPublicKey(e))}finalizeEvent(e,t){const n=e;return n.pubkey=_(bt.getPublicKey(t)),n.id=zt(n),n.sig=_(bt.sign(S(zt(n)),t)),n[yt]=!0,n}verifyEvent(e){if("boolean"==typeof e[yt])return e[yt];try{const t=zt(e);if(t!==e.id)return e[yt]=!1,!1;const n=bt.verify(S(e.sig),S(t),S(e.pubkey));return e[yt]=n,n}catch(t){return e[yt]=!1,!1}}},It=Ot.generateSecretKey,Nt=Ot.getPublicKey,Dt=Ot.finalizeEvent,qt=Ot.verifyEvent,jt={};function Bt(e){return e<1e4&&0!==e&&3!==e}function Ft(e){return 0===e||3===e||1e4<=e&&e<2e4}function $t(e){return 2e4<=e&&e<3e4}function Vt(e){return 3e4<=e&&e<4e4}function Ut(e){return Bt(e)?"regular":Ft(e)?"replaceable":$t(e)?"ephemeral":Vt(e)?"parameterized":"unknown"}function Ht(e,t){const n=t instanceof Array?t:[t];return kt(e)&&n.includes(e.kind)||!1}i(jt,{Application:()=>ga,BadgeAward:()=>en,BadgeDefinition:()=>ca,BlockedRelaysList:()=>Vn,BlossomServerList:()=>Qn,BookmarkList:()=>Bn,Bookmarksets:()=>sa,Calendar:()=>Sa,CalendarEventRSVP:()=>Ca,ChannelCreation:()=>dn,ChannelHideMessage:()=>fn,ChannelMessage:()=>pn,ChannelMetadata:()=>hn,ChannelMuteUser:()=>mn,ChatMessage:()=>tn,ClassifiedListing:()=>ya,ClientAuth:()=>Xn,Comment:()=>yn,CommunitiesList:()=>Fn,CommunityDefinition:()=>Aa,CommunityPostApproval:()=>En,Contacts:()=>Yt,CreateOrUpdateProduct:()=>pa,CreateOrUpdateStall:()=>ha,Curationsets:()=>la,Date:()=>ka,DirectMessageRelaysList:()=>Kn,DraftClassifiedListing:()=>wa,DraftLong:()=>ma,Emojisets:()=>_a,EncryptedDirectMessage:()=>Qt,EventDeletion:()=>Zt,FavoriteRelays:()=>Hn,FileMessage:()=>rn,FileMetadata:()=>bn,FileServerPreference:()=>Yn,Followsets:()=>ia,ForumThread:()=>nn,GenericRepost:()=>sn,Genericlists:()=>oa,GiftWrap:()=>gn,GroupMetadata:()=>La,HTTPAuth:()=>aa,Handlerinformation:()=>Ea,Handlerrecommendation:()=>Pa,Highlights:()=>In,InterestsList:()=>Wn,Interestsets:()=>da,JobFeedback:()=>Mn,JobRequest:()=>An,JobResult:()=>Ln,Label:()=>Pn,LightningPubRPC:()=>Jn,LiveChatMessage:()=>wn,LiveEvent:()=>va,LongFormArticle:()=>fa,Metadata:()=>Wt,Mutelist:()=>Dn,NWCWalletInfo:()=>Zn,NWCWalletRequest:()=>ea,NWCWalletResponse:()=>ta,NormalVideo:()=>un,NostrConnect:()=>na,OpenTimestamps:()=>_n,Photo:()=>ln,Pinlist:()=>qn,Poll:()=>vn,PollResponse:()=>Nn,PrivateDirectMessage:()=>on,ProblemTracker:()=>Sn,ProfileBadges:()=>ua,PublicChatsList:()=>$n,Reaction:()=>Xt,RecommendRelay:()=>Kt,RelayList:()=>jn,RelayReview:()=>Ta,Relaysets:()=>ra,Report:()=>Cn,Reporting:()=>Tn,Repost:()=>Jt,Seal:()=>an,SearchRelaysList:()=>Un,ShortTextNote:()=>Gt,ShortVideo:()=>cn,Time:()=>xa,UserEmojiList:()=>Gn,UserStatuses:()=>ba,Voice:()=>kn,VoiceComment:()=>xn,Zap:()=>On,ZapGoal:()=>Rn,ZapRequest:()=>zn,classifyKind:()=>Ut,isAddressableKind:()=>Vt,isEphemeralKind:()=>$t,isKind:()=>Ht,isRegularKind:()=>Bt,isReplaceableKind:()=>Ft});var Wt=0,Gt=1,Kt=2,Yt=3,Qt=4,Zt=5,Jt=6,Xt=7,en=8,tn=9,nn=11,an=13,on=14,rn=15,sn=16,ln=20,un=21,cn=22,dn=40,hn=41,pn=42,fn=43,mn=44,_n=1040,gn=1059,vn=1068,bn=1063,yn=1111,wn=1311,kn=1222,xn=1244,Sn=1971,Cn=1984,Tn=1984,Pn=1985,En=4550,An=5999,Ln=6999,Mn=7e3,Rn=9041,zn=9734,On=9735,In=9802,Nn=1018,Dn=1e4,qn=10001,jn=10002,Bn=10003,Fn=10004,$n=10005,Vn=10006,Un=10007,Hn=10012,Wn=10015,Gn=10030,Kn=10050,Yn=10096,Qn=10063,Zn=13194,Jn=21e3,Xn=22242,ea=23194,ta=23195,na=24133,aa=27235,ia=3e4,oa=30001,ra=30002,sa=30003,la=30004,ua=30008,ca=30009,da=30015,ha=30017,pa=30018,fa=30023,ma=30024,_a=30030,ga=30078,va=30311,ba=30315,ya=30402,wa=30403,ka=31922,xa=31923,Sa=31924,Ca=31925,Ta=31987,Pa=31989,Ea=31990,Aa=34550,La=39e3;function Ma(e,t){if(e.ids&&-1===e.ids.indexOf(t.id))return!1;if(e.kinds&&-1===e.kinds.indexOf(t.kind))return!1;if(e.authors&&-1===e.authors.indexOf(t.pubkey))return!1;for(let n in e)if("#"===n[0]){let a=e[`#${n.slice(1)}`];if(a&&!t.tags.find(([e,t])=>e===n.slice(1)&&-1!==a.indexOf(t)))return!1}return!(e.since&&t.created_ate.until)}function Ra(e,t){for(let n=0;n{if("kinds"===e||"ids"===e||"authors"===e||"#"===e[0]){t[e]=t[e]||[];for(let a=0;at.limit)&&(t.limit=a.limit),a.until&&(!t.until||a.until>t.until)&&(t.until=a.until),a.since&&(!t.since||a.sinceFt(e))?e.authors.length*e.kinds.length:1/0,e.authors?.length&&e.kinds?.every(e=>Vt(e))&&e["#d"]?.length?e.authors.length*e.kinds.length*e["#d"].length:1/0)}var Ia={};function Na(e,t){let n=t.length+3,a=e.indexOf(`"${t}":`)+n,i=e.slice(a).indexOf('"')+a+1;return e.slice(i,i+64)}function Da(e,t){let n=t.length,a=e.indexOf(`"${t}":`)+n+3,i=e.slice(a),o=Math.min(i.indexOf(","),i.indexOf("}"));return parseInt(i.slice(0,o),10)}function qa(e){let t=e.slice(0,22).indexOf('"EVENT"');if(-1===t)return null;let n=e.slice(t+7+1).indexOf('"');if(-1===n)return null;let a=t+7+1+n,i=e.slice(a+1,80).indexOf('"');if(-1===i)return null;let o=a+1+i;return e.slice(a+1,o)}function ja(e,t){return t===Na(e,"id")}function Ba(e,t){return t===Na(e,"pubkey")}function Fa(e,t){return t===Da(e,"kind")}i(Ia,{getHex64:()=>Na,getInt:()=>Da,getSubscriptionId:()=>qa,matchEventId:()=>ja,matchEventKind:()=>Fa,matchEventPubkey:()=>Ba});var $a={};function Va(e,t){return{kind:Xn,created_at:Math.floor(Date.now()/1e3),tags:[["relay",e],["challenge",t]],content:""}}i($a,{makeAuthEvent:()=>Va});var Ua,Ha=class extends Error{constructor(e,t){super(`Tried to send message '${e} on a closed connection to ${t}.`),this.name="SendingOnClosedConnection"}},Wa=class{url;_connected=!1;onclose=null;onnotice=e=>console.debug(`NOTICE from ${this.url}: ${e}`);onauth;baseEoseTimeout=4400;publishTimeout=4400;pingFrequency=29e3;pingTimeout=2e4;resubscribeBackoff=[1e4,1e4,1e4,2e4,2e4,3e4,6e4];openSubs=new Map;enablePing;enableReconnect;idleSince=Date.now();ongoingOperations=0;reconnectTimeoutHandle;pingIntervalHandle;reconnectAttempts=0;skipReconnection=!1;connectionPromise;openCountRequests=new Map;openEventPublishes=new Map;ws;challenge;authPromise;serial=0;verifyEvent;_WebSocket;constructor(e,t){this.url=Pt(e),this.verifyEvent=t.verifyEvent,this._WebSocket=t.websocketImplementation||WebSocket,this.enablePing=t.enablePing,this.enableReconnect=t.enableReconnect||!1}static async connect(e,t){const n=new Wa(e,t);return await n.connect(t),n}closeAllSubscriptions(e){for(let[t,n]of this.openSubs)n.close(e);this.openSubs.clear();for(let[t,n]of this.openEventPublishes)n.reject(new Error(e));this.openEventPublishes.clear();for(let[t,n]of this.openCountRequests)n.reject(new Error(e));this.openCountRequests.clear()}get connected(){return this._connected}async reconnect(){const e=this.resubscribeBackoff[Math.min(this.reconnectAttempts,this.resubscribeBackoff.length-1)];this.reconnectAttempts++,this.reconnectTimeoutHandle=setTimeout(async()=>{try{await this.connect()}catch(e){}},e)}handleHardClose(e){this.pingIntervalHandle&&(clearInterval(this.pingIntervalHandle),this.pingIntervalHandle=void 0),this._connected=!1,this.connectionPromise=void 0,this.idleSince=void 0,this.enableReconnect&&!this.skipReconnection?this.reconnect():(this.onclose?.(),this.closeAllSubscriptions(e))}async connect(e){let t;return this.connectionPromise||(this.challenge=void 0,this.authPromise=void 0,this.skipReconnection=!1,this.connectionPromise=new Promise((n,a)=>{e?.timeout&&(t=setTimeout(()=>{a("connection timed out"),this.connectionPromise=void 0,this.skipReconnection=!0,this.onclose?.(),this.handleHardClose("relay connection timed out")},e.timeout)),e?.abort&&(e.abort.onabort=a);try{this.ws=new this._WebSocket(this.url)}catch(e){return clearTimeout(t),void a(e)}this.ws.onopen=()=>{this.reconnectTimeoutHandle&&(clearTimeout(this.reconnectTimeoutHandle),this.reconnectTimeoutHandle=void 0),clearTimeout(t),this._connected=!0;const e=this.reconnectAttempts>0;this.reconnectAttempts=0;for(const t of this.openSubs.values()){if(t.eosed=!1,e)for(let e=0;ethis.pingpong(),this.pingFrequency)),n()},this.ws.onerror=()=>{clearTimeout(t),a("connection failed"),this.connectionPromise=void 0,this.skipReconnection=!0,this.onclose?.(),this.handleHardClose("relay connection failed")},this.ws.onclose=e=>{clearTimeout(t),a(e.message||"websocket closed"),this.handleHardClose("relay connection closed")},this.ws.onmessage=this._onmessage.bind(this)})),this.connectionPromise}waitForPingPong(){return new Promise(e=>{this.ws.once("pong",()=>e(!0)),this.ws.ping()})}waitForDummyReq(){return new Promise((e,t)=>{if(!this.connectionPromise)return t(new Error(`no connection to ${this.url}, can't ping`));try{const t=this.subscribe([{ids:["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],limit:0}],{label:"",oneose:()=>{e(!0),t.close()},onclose(){e(!0)},eoseTimeout:this.pingTimeout+1e3})}catch(e){t(e)}})}async pingpong(){if(1===this.ws?.readyState){await Promise.any([this.ws&&this.ws.ping&&this.ws.once?this.waitForPingPong():this.waitForDummyReq(),new Promise(e=>setTimeout(()=>e(!1),this.pingTimeout))])||this.ws?.readyState===this._WebSocket.OPEN&&this.ws?.close()}}async send(e){if(!this.connectionPromise)throw new Ha(e,this.url);this.connectionPromise.then(()=>{this.ws?.send(e)})}async auth(e){const t=this.challenge;if(!t)throw new Error("can't perform auth, no challenge was received");return this.authPromise||(this.authPromise=new Promise(async(n,a)=>{try{let i=await e(Va(this.url,t)),o=setTimeout(()=>{let e=this.openEventPublishes.get(i.id);e&&(e.reject(new Error("auth timed out")),this.openEventPublishes.delete(i.id))},this.publishTimeout);this.openEventPublishes.set(i.id,{resolve:n,reject:a,timeout:o}),this.send('["AUTH",'+JSON.stringify(i)+"]")}catch(e){console.warn("subscribe auth function failed:",e)}})),this.authPromise}async publish(e){this.idleSince=void 0,this.ongoingOperations++;const t=new Promise((t,n)=>{const a=setTimeout(()=>{const t=this.openEventPublishes.get(e.id);t&&(t.reject(new Error("publish timed out")),this.openEventPublishes.delete(e.id))},this.publishTimeout);this.openEventPublishes.set(e.id,{resolve:t,reject:n,timeout:a})});return this.send('["EVENT",'+JSON.stringify(e)+"]"),this.ongoingOperations--,0===this.ongoingOperations&&(this.idleSince=Date.now()),t}async count(e,t){this.serial++;const n=t?.id||"count:"+this.serial,a=new Promise((e,t)=>{this.openCountRequests.set(n,{resolve:e,reject:t})});return this.send('["COUNT","'+n+'",'+JSON.stringify(e).substring(1)),a}subscribe(e,t){""!==t.label&&(this.idleSince=void 0,this.ongoingOperations++);const n=this.prepareSubscription(e,t);return n.fire(),t.abort&&(t.abort.onabort=()=>n.close(String(t.abort.reason||""))),n}prepareSubscription(e,t){this.serial++;const n=t.id||(t.label?t.label+":":"sub:")+this.serial,a=new Ga(this,n,e,t);return this.openSubs.set(n,a),a}close(){this.skipReconnection=!0,this.reconnectTimeoutHandle&&(clearTimeout(this.reconnectTimeoutHandle),this.reconnectTimeoutHandle=void 0),this.pingIntervalHandle&&(clearInterval(this.pingIntervalHandle),this.pingIntervalHandle=void 0),this.closeAllSubscriptions("relay connection closed by us"),this._connected=!1,this.idleSince=void 0,this.onclose?.(),this.ws?.readyState===this._WebSocket.OPEN&&this.ws?.close()}_onmessage(e){const t=e.data;if(!t)return;const n=qa(t);if(n){const e=this.openSubs.get(n);if(!e)return;const a=Na(t,"id"),i=e.alreadyHaveEvent?.(a);if(e.receivedEvent?.(this,a),i)return}try{let e=JSON.parse(t);switch(e[0]){case"EVENT":{const t=this.openSubs.get(e[1]),n=e[2];return this.verifyEvent(n)&&Ra(t.filters,n)?t.onevent(n):t.oninvalidevent?.(n),void((!t.lastEmitted||t.lastEmitted{console.warn(`onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`,e)})}fire(){this.relay.send('["REQ","'+this.id+'",'+JSON.stringify(this.filters).substring(1)),this.eoseTimeoutHandle=setTimeout(this.receivedEose.bind(this),this.eoseTimeout)}receivedEose(){this.eosed||(clearTimeout(this.eoseTimeoutHandle),this.eosed=!0,this.oneose?.())}close(e="closed by caller"){if(!this.closed&&this.relay.connected){try{this.relay.send('["CLOSE",'+JSON.stringify(this.id)+"]")}catch(e){if(!(e instanceof Ha))throw e}this.closed=!0}this.relay.openSubs.delete(this.id),this.relay.ongoingOperations--,0===this.relay.ongoingOperations&&(this.relay.idleSince=Date.now()),this.onclose?.(e)}};try{Ua=WebSocket}catch{}var Ka,Ya=class extends Wa{constructor(e,t){super(e,{verifyEvent:qt,websocketImplementation:Ua,...t})}static async connect(e,t){const n=new Ya(e,t);return await n.connect(),n}},Qa=e=>(e[yt]=!0,!0),Za=class{relays=new Map;seenOn=new Map;trackRelays=!1;verifyEvent;enablePing;enableReconnect;automaticallyAuth;trustedRelayURLs=new Set;onRelayConnectionFailure;onRelayConnectionSuccess;allowConnectingToRelay;maxWaitForConnection;_WebSocket;constructor(e){this.verifyEvent=e.verifyEvent,this._WebSocket=e.websocketImplementation,this.enablePing=e.enablePing,this.enableReconnect=e.enableReconnect||!1,this.automaticallyAuth=e.automaticallyAuth,this.onRelayConnectionFailure=e.onRelayConnectionFailure,this.onRelayConnectionSuccess=e.onRelayConnectionSuccess,this.allowConnectingToRelay=e.allowConnectingToRelay,this.maxWaitForConnection=e.maxWaitForConnection||3e3}async ensureRelay(e,t){e=Pt(e);let n=this.relays.get(e);if(n||(n=new Wa(e,{verifyEvent:this.trustedRelayURLs.has(e)?Qa:this.verifyEvent,websocketImplementation:this._WebSocket,enablePing:this.enablePing,enableReconnect:this.enableReconnect}),n.onclose=()=>{this.relays.delete(e)},this.relays.set(e,n)),this.automaticallyAuth){const t=this.automaticallyAuth(e);t&&(n.onauth=t)}try{await n.connect({timeout:t?.connectionTimeout,abort:t?.abort})}catch(t){throw this.relays.delete(e),t}return n}close(e){e.map(Pt).forEach(e=>{this.relays.get(e)?.close(),this.relays.delete(e)})}subscribe(e,t,n){const a=[],i=[];for(let n=0;ne.url===o)||-1===i.indexOf(o)&&(i.push(o),a.push({url:o,filter:t}))}return this.subscribeMap(a,n)}subscribeMany(e,t,n){return this.subscribe(e,t,n)}subscribeMap(e,t){const n=new Map;for(const t of e){const{url:e,filter:a}=t;n.has(e)||n.set(e,[]),n.get(e).push(a)}const a=Array.from(n.entries()).map(([e,t])=>({url:e,filters:t}));this.trackRelays&&(t.receivedEvent=(e,t)=>{let n=this.seenOn.get(t);n||(n=new Set,this.seenOn.set(t,n)),n.add(e)});const i=new Set,o=[],r=[];let s=e=>{r[e]||(r[e]=!0,r.filter(e=>e).length===a.length&&(t.oneose?.(),s=()=>{}))};const l=[];let u=(e,n)=>{l[e]||(s(e),l[e]=n,l.filter(e=>e).length===a.length&&(t.onclose?.(l),u=()=>{}))};const c=e=>{if(t.alreadyHaveEvent?.(e))return!0;const n=i.has(e);return i.add(e),n},d=Promise.all(a.map(async({url:e,filters:n},a)=>{if(!1===this.allowConnectingToRelay?.(e,["read",n]))return void u(a,"connection skipped by allowConnectingToRelay");let i;try{i=await this.ensureRelay(e,{connectionTimeout:this.maxWaitForConnection<(t.maxWait||0)?Math.max(.8*t.maxWait,t.maxWait-1e3):this.maxWaitForConnection,abort:t.abort})}catch(t){return this.onRelayConnectionFailure?.(e),void u(a,t?.message||String(t))}this.onRelayConnectionSuccess?.(e);let r=i.subscribe(n,{...t,oneose:()=>s(a),onclose:e=>{e.startsWith("auth-required: ")&&t.onauth?i.auth(t.onauth).then(()=>{i.subscribe(n,{...t,oneose:()=>s(a),onclose:e=>{u(a,e)},alreadyHaveEvent:c,eoseTimeout:t.maxWait,abort:t.abort})}).catch(e=>{u(a,`auth was required and attempted, but failed with: ${e}`)}):u(a,e)},alreadyHaveEvent:c,eoseTimeout:t.maxWait,abort:t.abort});o.push(r)}));return{async close(e){await d,o.forEach(t=>{t.close(e)})}}}subscribeEose(e,t,n){let a;return a=this.subscribe(e,t,{...n,oneose(){const t="closed automatically on eose";a?a.close(t):n.onclose?.(e.map(e=>t))}}),a}subscribeManyEose(e,t,n){return this.subscribeEose(e,t,n)}async querySync(e,t,n){return new Promise(async a=>{const i=[];this.subscribeEose(e,t,{...n,onevent(e){i.push(e)},onclose(e){a(i)}})})}async get(e,t,n){t.limit=1;const a=await this.querySync(e,t,n);return a.sort((e,t)=>t.created_at-e.created_at),a[0]||null}publish(e,t,n){return e.map(Pt).map(async(e,a,i)=>{if(i.indexOf(e)!==a)return Promise.reject("duplicate url");if(!1===this.allowConnectingToRelay?.(e,["write",t]))return Promise.reject("connection skipped by allowConnectingToRelay");let o;try{o=await this.ensureRelay(e,{connectionTimeout:this.maxWaitForConnection<(n?.maxWait||0)?Math.max(.8*n.maxWait,n.maxWait-1e3):this.maxWaitForConnection,abort:n?.abort})}catch(t){return this.onRelayConnectionFailure?.(e),String("connection failure: "+String(t))}return o.publish(t).catch(async e=>{if(e instanceof Error&&e.message.startsWith("auth-required: ")&&n?.onauth)return await o.auth(n.onauth),o.publish(t);throw e}).then(e=>{if(this.trackRelays){let e=this.seenOn.get(t.id);e||(e=new Set,this.seenOn.set(t.id,e)),e.add(o)}return e})})}listConnectionStatus(){const e=new Map;return this.relays.forEach((t,n)=>e.set(n,t.connected)),e}destroy(){this.relays.forEach(e=>e.close()),this.relays=new Map}pruneIdleRelays(e=1e4){const t=[];for(const[n,a]of this.relays)a.idleSince&&Date.now()-a.idleSince>=e&&(this.relays.delete(n),t.push(n),a.close());return t}};try{Ka=WebSocket}catch{}var Ja=class extends Za{constructor(e){super({verifyEvent:qt,websocketImplementation:Ka,maxWaitForConnection:3e3,...e})}},Xa={};function ei(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&"Uint8Array"===e.constructor.name}function ti(e){if(!ei(e))throw new Error("Uint8Array expected")}function ni(e,t){return!!Array.isArray(t)&&(0===t.length||(e?t.every(e=>"string"==typeof e):t.every(e=>Number.isSafeInteger(e))))}function ai(e){if("function"!=typeof e)throw new Error("function expected");return!0}function ii(e,t){if("string"!=typeof t)throw new Error(`${e}: string expected`);return!0}function oi(e){if(!Number.isSafeInteger(e))throw new Error(`invalid integer: ${e}`)}function ri(e){if(!Array.isArray(e))throw new Error("array expected")}function si(e,t){if(!ni(!0,t))throw new Error(`${e}: array of strings expected`)}function li(e,t){if(!ni(!1,t))throw new Error(`${e}: array of numbers expected`)}function ui(...e){const t=e=>e,n=(e,t)=>n=>e(t(n));return{encode:e.map(e=>e.encode).reduceRight(n,t),decode:e.map(e=>e.decode).reduce(n,t)}}function ci(e){const t="string"==typeof e?e.split(""):e,n=t.length;si("alphabet",t);const a=new Map(t.map((e,t)=>[e,t]));return{encode:a=>(ri(a),a.map(a=>{if(!Number.isSafeInteger(a)||a<0||a>=n)throw new Error(`alphabet.encode: digit index outside alphabet "${a}". Allowed: ${e}`);return t[a]})),decode:t=>(ri(t),t.map(t=>{ii("alphabet.decode",t);const n=a.get(t);if(void 0===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n}))}}function di(e=""){return ii("join",e),{encode:t=>(si("join.decode",t),t.join(e)),decode:t=>(ii("join.decode",t),t.split(e))}}function hi(e,t="="){return oi(e),ii("padding",t),{encode(n){for(si("padding.encode",n);n.length*e%8;)n.push(t);return n},decode(n){si("padding.decode",n);let a=n.length;if(a*e%8)throw new Error("padding: invalid, string should have whole number of bytes");for(;a>0&&n[a-1]===t;a--){if((a-1)*e%8==0)throw new Error("padding: invalid, string has too much padding")}return n.slice(0,a)}}}function pi(e){return ai(e),{encode:e=>e,decode:t=>e(t)}}function fi(e,t,n){if(t<2)throw new Error(`convertRadix: invalid from=${t}, base cannot be less than 2`);if(n<2)throw new Error(`convertRadix: invalid to=${n}, base cannot be less than 2`);if(ri(e),!e.length)return[];let a=0;const i=[],o=Array.from(e,e=>{if(oi(e),e<0||e>=t)throw new Error(`invalid integer: ${e}`);return e}),r=o.length;for(;;){let e=0,s=!0;for(let i=a;izi,Bech32MaxSize:()=>Ri,NostrTypeGuard:()=>Mi,decode:()=>Ii,decodeNostrURI:()=>Oi,encodeBytes:()=>Fi,naddrEncode:()=>Ui,neventEncode:()=>Vi,noteEncode:()=>ji,nprofileEncode:()=>$i,npubEncode:()=>qi,nsecEncode:()=>Di});var mi=(e,t)=>0===t?e:mi(t,e%t),_i=(e,t)=>e+(t-mi(e,t)),gi=(()=>{let e=[];for(let t=0;t<40;t++)e.push(2**t);return e})();function vi(e,t,n,a){if(ri(e),t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw new Error(`convertRadix2: wrong to=${n}`);if(_i(t,n)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${_i(t,n)}`);let i=0,o=0;const r=gi[t],s=gi[n]-1,l=[];for(const a of e){if(oi(a),a>=r)throw new Error(`convertRadix2: invalid data word=${a} from=${t}`);if(i=i<32)throw new Error(`convertRadix2: carry overflow pos=${o} from=${t}`);for(o+=t;o>=n;o-=n)l.push((i>>o-n&s)>>>0);const e=gi[o];if(void 0===e)throw new Error("invalid carry");i&=e-1}if(i=i<=t)throw new Error("Excess padding");if(!a&&i>0)throw new Error(`Non-zero padding: ${i}`);return a&&o>0&&l.push(i>>>0),l}function bi(e,t=!1){if(oi(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(_i(8,e)>32||_i(e,8)>32)throw new Error("radix2: carry overflow");return{encode:n=>{if(!ei(n))throw new Error("radix2.encode input should be Uint8Array");return vi(Array.from(n),8,e,!t)},decode:n=>(li("radix2.decode",n),Uint8Array.from(vi(n,e,8,t)))}}function yi(e){return ai(e),function(...t){try{return e.apply(null,t)}catch(e){}}}ui(bi(4),ci("0123456789ABCDEF"),di("")),ui(bi(5),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"),hi(5),di("")),ui(bi(5),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"),di("")),ui(bi(5),ci("0123456789ABCDEFGHIJKLMNOPQRSTUV"),hi(5),di("")),ui(bi(5),ci("0123456789ABCDEFGHIJKLMNOPQRSTUV"),di("")),ui(bi(5),ci("0123456789ABCDEFGHJKMNPQRSTVWXYZ"),di(""),pi(e=>e.toUpperCase().replace(/O/g,"0").replace(/[IL]/g,"1")));var wi=(()=>"function"==typeof Uint8Array.from([]).toBase64&&"function"==typeof Uint8Array.fromBase64)(),ki=(e,t)=>{ii("base64",e);const n=t?/^[A-Za-z0-9=_-]+$/:/^[A-Za-z0-9=+/]+$/,a=t?"base64url":"base64";if(e.length>0&&!n.test(e))throw new Error("invalid base64");return Uint8Array.fromBase64(e,{alphabet:a,lastChunkHandling:"strict"})},xi=wi?{encode:e=>(ti(e),e.toBase64()),decode:e=>ki(e,!1)}:ui(bi(6),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),hi(6),di("")),Si=(ui(bi(6),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),di("")),wi||ui(bi(6),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),hi(6),di("")),ui(bi(6),ci("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),di("")),e=>{return ui((oi(t=58),{encode:e=>{if(!ei(e))throw new Error("radix.encode input should be Uint8Array");return fi(Array.from(e),256,t)},decode:e=>(li("radix.decode",e),Uint8Array.from(fi(e,t,256)))}),ci(e),di(""));var t}),Ci=(Si("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"),Si("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"),Si("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"),ui(ci("qpzry9x8gf2tvdw0s3jn54khce6mua7l"),di(""))),Ti=[996825010,642813549,513874426,1027748829,705979059];function Pi(e){const t=e>>25;let n=(33554431&e)<<5;for(let e=0;e>e&1)&&(n^=Ti[e]);return n}function Ei(e,t,n=1){const a=e.length;let i=1;for(let t=0;t126)throw new Error(`Invalid prefix (${e})`);i=Pi(i)^n>>5}i=Pi(i);for(let t=0;ta)throw new TypeError(`Length ${o} exceeds limit ${a}`);const r=e.toLowerCase(),s=Ei(r,n,t);return`${r}1${Ci.encode(n)}${s}`}function s(e,n=90){ii("bech32.decode input",e);const a=e.length;if(a<8||!1!==n&&a>n)throw new TypeError(`invalid string length: ${a} (${e}). Expected (8..${n})`);const i=e.toLowerCase();if(e!==i&&e!==e.toUpperCase())throw new Error("String must be lowercase or uppercase");const o=i.lastIndexOf("1");if(0===o||-1===o)throw new Error('Letter "1" must be present between prefix and data only');const r=i.slice(0,o),s=i.slice(o+1);if(s.length<6)throw new Error("Data must be at least 6 characters long");const l=Ci.decode(s).slice(0,-6),u=Ei(r,l,t);if(!s.endsWith(u))throw new Error(`Invalid checksum in ${e}: expected "${u}"`);return{prefix:r,words:l}}return{encode:r,decode:s,encodeFromBytes:function(e,t){return r(e,i(t))},decodeToBytes:function(e){const{prefix:t,words:n}=s(e,!1);return{prefix:t,words:n,bytes:a(n)}},decodeUnsafe:yi(s),fromWords:a,fromWordsUnsafe:o,toWords:i}}var Li=Ai("bech32"),Mi=(Ai("bech32m"),(()=>"function"==typeof Uint8Array.from([]).toHex&&"function"==typeof Uint8Array.fromHex)()||ui(bi(4),ci("0123456789abcdef"),di(""),pi(e=>{if("string"!=typeof e||e.length%2!=0)throw new TypeError(`hex.decode: expected string, got ${typeof e} with length ${e.length}`);return e.toLowerCase()})),{isNProfile:e=>/^nprofile1[a-z\d]+$/.test(e||""),isNEvent:e=>/^nevent1[a-z\d]+$/.test(e||""),isNAddr:e=>/^naddr1[a-z\d]+$/.test(e||""),isNSec:e=>/^nsec1[a-z\d]{58}$/.test(e||""),isNPub:e=>/^npub1[a-z\d]{58}$/.test(e||""),isNote:e=>/^note1[a-z\d]+$/.test(e||""),isNcryptsec:e=>/^ncryptsec1[a-z\d]+$/.test(e||"")}),Ri=5e3,zi=/[\x21-\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;function Oi(e){try{return e.startsWith("nostr:")&&(e=e.substring(6)),Ii(e)}catch(e){return{type:"invalid",data:null}}}function Ii(e){let{prefix:t,words:n}=Li.decode(e,Ri),a=new Uint8Array(Li.fromWords(n));switch(t){case"nprofile":{let e=Ni(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:_(e[0][0]),relays:e[1]?e[1].map(e=>Ct.decode(e)):[]}}}case"nevent":{let e=Ni(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for nevent");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");if(e[2]&&32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(e[3]&&4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:_(e[0][0]),relays:e[1]?e[1].map(e=>Ct.decode(e)):[],author:e[2]?.[0]?_(e[2][0]):void 0,kind:e[3]?.[0]?parseInt(_(e[3][0]),16):void 0}}}case"naddr":{let e=Ni(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!e[2]?.[0])throw new Error("missing TLV 2 for naddr");if(32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(!e[3]?.[0])throw new Error("missing TLV 3 for naddr");if(4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:Ct.decode(e[0][0]),pubkey:_(e[2][0]),kind:parseInt(_(e[3][0]),16),relays:e[1]?e[1].map(e=>Ct.decode(e)):[]}}}case"nsec":return{type:t,data:a};case"npub":case"note":return{type:t,data:_(a)};default:throw new Error(`unknown prefix ${t}`)}}function Ni(e){let t={},n=e;for(;n.length>0;){let e=n[0],a=n[1],i=n.slice(2,2+a);if(n=n.slice(2+a),i.lengthTt.encode(e))}))}function Vi(e){let t;return void 0!==e.kind&&(t=function(e){const t=new Uint8Array(4);return t[0]=e>>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t}(e.kind)),Bi("nevent",Hi({0:[S(e.id)],1:(e.relays||[]).map(e=>Tt.encode(e)),2:e.author?[S(e.author)]:[],3:t?[new Uint8Array(t)]:[]}))}function Ui(e){let t=new ArrayBuffer(4);return new DataView(t).setUint32(0,e.kind,!1),Bi("naddr",Hi({0:[Tt.encode(e.identifier)],1:(e.relays||[]).map(e=>Tt.encode(e)),2:[S(e.pubkey)],3:[new Uint8Array(t)]}))}function Hi(e){let t=[];return Object.entries(e).reverse().forEach(([e,n])=>{n.forEach(n=>{let a=new Uint8Array(n.length+2);a.set([parseInt(e)],0),a.set([n.length],1),a.set(n,2),t.push(a)})}),C(...t)}var Wi=/\bnostr:((note|npub|naddr|nevent|nprofile)1\w+)\b|#\[(\d+)\]/g;function Gi(e){let t=[];for(let n of e.content.matchAll(Wi))if(n[2])try{let{type:e,data:a}=Ii(n[1]);switch(e){case"npub":t.push({text:n[0],profile:{pubkey:a,relays:[]}});break;case"nprofile":t.push({text:n[0],profile:a});break;case"note":t.push({text:n[0],event:{id:a,relays:[]}});break;case"nevent":t.push({text:n[0],event:a});break;case"naddr":t.push({text:n[0],address:a})}}catch(e){}else if(n[3]){let a=parseInt(n[3],10),i=e.tags[a];if(!i)continue;switch(i[0]){case"p":t.push({text:n[0],profile:{pubkey:i[1],relays:i[2]?[i[2]]:[]}});break;case"e":t.push({text:n[0],event:{id:i[1],relays:i[2]?[i[2]]:[]}});break;case"a":try{let[e,a,o]=i[1].split(":");t.push({text:n[0],address:{identifier:o,pubkey:a,kind:parseInt(e,10),relays:i[2]?[i[2]]:[]}})}catch(e){}}}return t}var Ki={};function Yi(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Qi(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("positive integer expected, got "+e)}function Zi(e,t,n=""){const a=(i=e)instanceof Uint8Array||ArrayBuffer.isView(i)&&"Uint8Array"===i.constructor.name;var i;const o=e?.length,r=void 0!==t;if(!a||r&&o!==t){throw new Error((n&&`"${n}" `)+"expected Uint8Array"+(r?` of length ${t}`:"")+", got "+(a?`length=${o}`:"type="+typeof e))}return e}function Ji(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function Xi(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function eo(...e){for(let t=0;tAo,encrypt:()=>Eo});var to=(()=>68===new Uint8Array(new Uint32Array([287454020]).buffer)[0])();function no(e,t){if(a=t,(n=e).buffer===a.buffer&&n.byteOffset{function n(n,...a){if(Zi(n,void 0,"key"),!to)throw new Error("Non little-endian hardware is not yet supported");if(void 0!==e.nonceLength){Zi(a[0],e.varSizeNonce?void 0:e.nonceLength,"nonce")}const i=e.tagLength;i&&void 0!==a[1]&&Zi(a[1],void 0,"AAD");const o=t(n,...a),r=(e,t)=>{if(void 0!==t){if(2!==e)throw new Error("cipher output not supported");Zi(t,void 0,"output")}};let s=!1;return{encrypt(e,t){if(s)throw new Error("cannot encrypt() twice with same key + nonce");return s=!0,Zi(e),r(o.encrypt.length,t),o.encrypt(e,t)},decrypt(e,t){if(Zi(e),i&&e.length"e"===e&&t);return a&&!a[1].match(/^[a-f0-9]{64}$/)?"Zap request 'e' tag is not valid hex.":t.tags.find(([e,t])=>"relays"===e&&t)?null:"Zap request doesn't have a 'relays' tag."}function Os({zapRequest:e,preimage:t,bolt11:n,paidAt:a}){let i=JSON.parse(e),o=i.tags.filter(([e])=>"e"===e||"p"===e||"a"===e),r={kind:9735,created_at:Math.round(a.getTime()/1e3),content:"",tags:[...o,["P",i.pubkey],["bolt11",n],["description",e]]};return t&&r.tags.push(["preimage",t]),r}function Is(e){if(e.length<50)return 0;const t=(e=e.substring(0,50)).lastIndexOf("1");if(-1===t)return 0;const n=e.substring(0,t);if(!n.startsWith("lnbc"))return 0;const a=n.substring(4);if(a.length<1)return 0;const i=a[a.length-1],o=i.charCodeAt(0)-"0".charCodeAt(0),r=o>=0&&o<=9;let s=a.length-1;if(r&&s++,s<1)return 0;const l=parseInt(a.substring(0,s));switch(i){case"m":return 1e5*l;case"u":return 100*l;case"n":return l/10;case"p":return l/1e4;default:return 1e8*l}}var Ns={};i(Ns,{Negentropy:()=>Gs,NegentropyStorageVector:()=>Ws,NegentropySync:()=>Qs});var Ds=32,qs=0,js=1,Bs=2,Fs=class{_raw;length;constructor(e){"number"==typeof e?(this._raw=new Uint8Array(e),this.length=0):e instanceof Uint8Array?(this._raw=new Uint8Array(e),this.length=e.length):(this._raw=new Uint8Array(512),this.length=0)}unwrap(){return this._raw.subarray(0,this.length)}get capacity(){return this._raw.byteLength}extend(e){if(e instanceof Fs&&(e=e.unwrap()),"number"!=typeof e.length)throw Error("bad length");const t=e.length+this.length;if(this.capacity>>=7;t.reverse();for(let e=0;e4294967295&&(n=1),a.setUint32(o,4294967295&r,!0),t=n,n=0}}negate(){let e=new DataView(this.buf.buffer);for(let t=0;t<8;t++){let n=4*t;e.setUint32(n,~e.getUint32(n,!0))}let t=new Uint8Array(Ds);t[0]=1,this.add(t)}getFingerprint(e){let t=new Fs;return t.extend(this.buf),t.extend(Vs(e)),D(t.unwrap()).subarray(0,16)}},Ws=class{items;sealed;constructor(){this.items=[],this.sealed=!1}insert(e,t){if(this.sealed)throw Error("already sealed");const n=S(t);if(n.byteLength!==Ds)throw Error("bad id size for added item");this.items.push({timestamp:e,id:n})}seal(){if(this.sealed)throw Error("already sealed");this.sealed=!0,this.items.sort(Ys);for(let e=1;e=this.items.length)throw Error("out of range");return this.items[e]}iterate(e,t,n){this._checkSealed(),this._checkBounds(e,t);for(let a=e;aYs(e,n)<0)}fingerprint(e,t){let n=new Hs;return n.setToZero(),this.iterate(e,t,e=>(n.add(e.id),!0)),n.getFingerprint(t-e)}_checkSealed(){if(!this.sealed)throw Error("not sealed")}_checkBounds(e,t){if(e>t||t>this.items.length)throw Error("bad range")}_binarySearch(e,t,n,a){let i=n-t;for(;i>0;){let n=t,o=Math.floor(i/2);n+=o,a(e[n])?(t=++n,i-=o+1):i=o}return t}},Gs=class{storage;frameSizeLimit;lastTimestampIn;lastTimestampOut;constructor(e,t=6e4){if(t<4096)throw Error("frameSizeLimit too small");this.storage=e,this.frameSizeLimit=t,this.lastTimestampIn=0,this.lastTimestampOut=0}_bound(e,t){return{timestamp:e,id:t||new Uint8Array(0)}}initiate(){let e=new Fs;return e.extend(new Uint8Array([97])),this.splitRange(0,this.storage.size(),this._bound(Number.MAX_VALUE),e),_(e.unwrap())}reconcile(e,t,n){const a=new Fs(S(e));this.lastTimestampIn=this.lastTimestampOut=0;let i=new Fs;i.extend(new Uint8Array([97]));let o=Us(a,1)[0];if(o<96||o>111)throw Error("invalid negentropy protocol version byte");if(97!==o)throw Error("unsupported negentropy protocol version requested: "+(o-96));let r=this.storage.size(),s=this._bound(0),l=0,u=!1;for(;0!==a.length;){let e=new Fs,o=()=>{u&&(u=!1,e.extend(this.encodeBound(s)),e.extend(Vs(qs)))},c=this.decodeBound(a),d=$s(a),h=l,p=this.storage.findLowerBound(l,r,c);if(d===qs)u=!0;else if(d===js){0!==Ks(Us(a,16),this.storage.fingerprint(h,p))?(o(),this.splitRange(h,p,c,e)):u=!0}else{if(d!==Bs)throw Error("unexpected mode");{let e=$s(a),i={};for(let t=0;t{let n=e.id;const a=_(n);return i[a]?delete i[_(n)]:t?.(a),!0}),n)for(let e of Object.values(i))n(_(e))}}if(this.exceededFrameSizeLimit(i.length+e.length)){let e=this.storage.fingerprint(p,r);i.extend(this.encodeBound(this._bound(Number.MAX_VALUE))),i.extend(Vs(js)),i.extend(e);break}i.extend(e),l=p,s=c}return 1===i.length?null:_(i.unwrap())}splitRange(e,t,n,a){let i=t-e;if(i<32)a.extend(this.encodeBound(n)),a.extend(Vs(Bs)),a.extend(Vs(i)),this.storage.iterate(e,t,e=>(a.extend(e.id),!0));else{let o=Math.floor(i/16),r=i%16,s=e;for(let e=0;e<16;e++){let i,l=o+(e(a===s-1?e=n:t=n,!0)),i=this.getMinimalBound(e,t)}a.extend(this.encodeBound(i)),a.extend(Vs(js)),a.extend(u)}}}exceededFrameSizeLimit(e){return e>this.frameSizeLimit-200}decodeTimestampIn(e){let t=$s(e);return t=0===t?Number.MAX_VALUE:t-1,this.lastTimestampIn===Number.MAX_VALUE||t===Number.MAX_VALUE?(this.lastTimestampIn=Number.MAX_VALUE,Number.MAX_VALUE):(t+=this.lastTimestampIn,this.lastTimestampIn=t,t)}decodeBound(e){let t=this.decodeTimestampIn(e),n=$s(e);if(n>Ds)throw Error("bound key too long");return{timestamp:t,id:Us(e,n)}}encodeTimestampOut(e){if(e===Number.MAX_VALUE)return this.lastTimestampOut=Number.MAX_VALUE,Vs(0);let t=e;return e-=this.lastTimestampOut,this.lastTimestampOut=t,Vs(e+1)}encodeBound(e){let t=new Fs;return t.extend(this.encodeTimestampOut(e.timestamp)),t.extend(Vs(e.id.length)),t.extend(e.id),t}getMinimalBound(e,t){if(t.timestamp!==e.timestamp)return this._bound(t.timestamp);{let n=0,a=t.id,i=e.id;for(let e=0;et[n])return 1}return e.byteLength>t.byteLength?1:e.byteLength{switch(e[0]){case"NEG-MSG":e.length<3&&console.warn(`got invalid NEG-MSG from ${this.relay.url}: ${e}`);try{const t=this.neg.reconcile(e[2],this.onhave,this.onneed);t?this.relay.send(`["NEG-MSG", "${this.subscription.id}", "${t}"]`):(this.close(),a.onclose?.())}catch(e){console.error("negentropy reconcile error:",e),a?.onclose?.(`reconcile error: ${e}`)}break;case"NEG-CLOSE":{const t=e[2];console.warn("negentropy error:",t),a.onclose?.(t);break}case"NEG-ERR":a.onclose?.()}}}async start(){const e=this.neg.initiate();this.relay.send(`["NEG-OPEN","${this.subscription.id}",${JSON.stringify(this.filter)},"${e}"]`)}close(){this.relay.send(`["NEG-CLOSE","${this.subscription.id}"]`),this.subscription.close()}},Zs={};i(Zs,{getToken:()=>el,hashPayload:()=>sl,unpackEventFromToken:()=>nl,validateEvent:()=>ul,validateEventKind:()=>il,validateEventMethodTag:()=>rl,validateEventPayloadTag:()=>ll,validateEventTimestamp:()=>al,validateEventUrlTag:()=>ol,validateToken:()=>tl});var Js,Xs="Nostr ";async function el(e,t,n,a=!1,i){const o={kind:aa,tags:[["u",e],["method",t]],created_at:Math.round((new Date).getTime()/1e3),content:""};i&&o.tags.push(["payload",sl(i)]);const r=await n(o);return(a?Xs:"")+xi.encode(Tt.encode(JSON.stringify(r)))}async function tl(e,t,n){const a=await nl(e).catch(e=>{throw e});return await ul(a,t,n).catch(e=>{throw e})}async function nl(e){if(!e)throw new Error("Missing token");e=e.replace(Xs,"");const t=Ct.decode(xi.decode(e));if(!t||0===t.length||!t.startsWith("{"))throw new Error("Invalid token");return JSON.parse(t)}function al(e){return!!e.created_at&&Math.round((new Date).getTime()/1e3)-e.created_at<60}function il(e){return e.kind===aa}function ol(e,t){const n=e.tags.find(e=>"u"===e[0]);return!!n&&(n.length>0&&n[1]===t)}function rl(e,t){const n=e.tags.find(e=>"method"===e[0]);return!!n&&(n.length>0&&n[1].toLowerCase()===t.toLowerCase())}function sl(e){return _(D(Tt.encode(JSON.stringify(e))))}function ll(e,t){const n=e.tags.find(e=>"payload"===e[0]);if(!n)return!1;const a=sl(t);return n.length>0&&n[1]===a}async function ul(e,t,n,a){if(!qt(e))throw new Error("Invalid nostr event, signature invalid");if(!il(e))throw new Error("Invalid nostr event, kind invalid");if(!al(e))throw new Error("Invalid nostr event, created_at timestamp invalid");if(!ol(e,t))throw new Error("Invalid nostr event, url tag invalid");if(!rl(e,n))throw new Error("Invalid nostr event, method tag invalid");if(Boolean(a)&&"object"==typeof a&&Object.keys(a).length>0&&!ll(e,a))throw new Error("Invalid nostr event, payload tag does not match request body hash");return!0}return Js=o,((i,o,r,s)=>{if(o&&"object"==typeof o||"function"==typeof o)for(let l of n(o))a.call(i,l)||l===r||e(i,l,{get:()=>o[l],enumerable:!(s=t(o,l))||s.enumerable});return i})(e({},"__esModule",{value:!0}),Js)})();window.localisation={},window.localisation.de={confirm:"Ja",server:"Server",theme:"Theme",site_customisation:"Website-Anpassung",funding:"Funding",users:"Benutzer",audit:"Prüfung",apps:"Apps",channels:"Kanäle",transactions:"Transaktionen",dashboard:"Armaturenbrett",node:"Knoten",export_users:"Benutzer exportieren",no_users:"Keine Benutzer gefunden",total_capacity:"Gesamtkapazität",avg_channel_size:"Durchschn. Kanalgröße",biggest_channel_size:"Größte Kanalgröße",smallest_channel_size:"Kleinste Kanalgröße",number_of_channels:"Anzahl der Kanäle",active_channels:"Aktive Kanäle",connect_peer:"Peer verbinden",connect:"Verbinden",open_channel:"Offener Kanal",open:"Öffnen",close_channel:"Kanal schließen",close:"Schließen",restart:"Server neu starten",save:"Speichern",save_tooltip:"Änderungen speichern",credit_debit:"Kredit / Debit",credit_hint:"Klicke Enter, um das Konto zu belasten",credit_label:"{denomination} zu belasten",credit_ok:"Erfolgreiches Gutschreiben/Abziehen von virtuellen Geldern ({amount} Sats). Zahlungen hängen von den tatsächlichen Mitteln der Finanzierungsquelle ab.",restart_tooltip:"Starte den Server neu, um die Änderungen zu übernehmen",add_funds_tooltip:"Füge Geld zu einer Wallet hinzu.",reset_defaults:"Zurücksetzen",reset_defaults_tooltip:"Alle Einstellungen auf die Standardeinstellungen zurücksetzen.",download_backup:"Datenbank-Backup herunterladen",name_your_wallet:"Vergib deiner {name} Wallet einen Namen",paste_invoice_label:"Füge eine Rechnung, Zahlungsanforderung oder LNURL ein *",lnbits_description:"Einfach zu installieren und kompakt, LNbits kann auf jeder Funding-Quelle im Lightning Netzwerk aufsetzen und sogar LNbits selbst! Du kannst LNbits für dich selbst betreiben oder anderen die Verwaltung durch dich anbieten. Jede Wallet hat ihre eigenen API-Schlüssel und die Anzahl der Wallets ist unbegrenzt. Die Möglichkeit, Gelder auf verschiedene Accounts mit unterschiedlicher Logik aufteilen zu können macht LNbits zu einem nützlichen Werkzeug für deine Buchhaltung - aber auch als Entwicklungswerkzeug. Erweiterungen bereichern LNbits Accounts um zusätzliche Funktionalität, so dass du mit einer Reihe von neuartigen Technologien auf dem Lightning-Netzwerk experimentieren kannst. Wir haben es so einfach wie möglich gemacht, Erweiterungen zu entwickeln, und als freies und Open-Source-Projekt möchten wir Menschen ermutigen, sich selbst hieran zu versuchen und gemeinsam mit uns neue Funktionalitäten zu entwickeln.",export_to_phone:"Auf dem Telefon öffnen",export_to_phone_desc:"Dieser QR-Code beinhaltet vollständige Rechte auf deine Wallet. Du kannst den QR-Code mit Deinem Telefon scannen, um deine Wallet dort zu öffnen.",wallet:"Brieftasche:",wallets:"Wallets",add_wallet:"Wallet hinzufügen",delete_wallet:"Wallet löschen",delete_wallet_desc:"Die Wallet wird gelöscht, die hierin beinhalteten Daten hierin oder innerhalb einer Erweiterung sind UNWIEDERBRINGLICH.",rename_wallet:"Wallet umbenennen",update_name:"Namen aktualisieren",fiat_tracking:"Fiat-Tracking",currency:"Währung",update_currency:"Währung aktualisieren",press_to_claim:"Klicken, um Bitcoin einzufordern.",donate:"Spenden",view_github:"Auf GitHub anzeigen",voidwallet_active:"VoidWallet ist aktiv! Zahlungen deaktiviert",use_with_caution:"BITTE MIT VORSICHT BENUTZEN - {name} Wallet ist noch BETA",service_fee:"Dienstleistungsgebühr: {amount} % pro Transaktion",service_fee_max:"Servicegebühr: {amount} % pro Transaktion (max {max} Sats)",service_fee_tooltip:"Bearbeitungsgebühr, die vom LNbits Server-Administrator pro ausgehender Transaktion berechnet wird",toggle_darkmode:"Auf Dark Mode umschalten",payment_reactions:"Zahlungsreaktionen",view_swagger_docs:"LNbits Swagger API-Dokumentation",api_docs:"API-Dokumentation",api_keys_api_docs:"Knoten-URL, API-Schlüssel und API-Dokumentation",lnbits_version:"LNbits-Version",runs_on:"Läuft auf",paste:"Einfügen",paste_from_clipboard:"Einfügen aus der Zwischenablage",paste_request:"Anfrage einfügen",create_invoice:"Rechnung erstellen",camera_tooltip:"Verwende die Kamera, um eine Rechnung oder einen QR-Code zu scannen",export_csv:"Exportieren als CSV",chart_tooltip:"Diagramm anzeigen",pending:"Ausstehend",copy_invoice:"Rechnung kopieren",withdraw_from:"Abheben von",cancel:"Stornieren",scan:"Scannen",read:"Lesen",pay:"Zahlen",memo:"Memo",date:"Datum",payment_processing:"Zahlung wird verarbeitet ...",not_enough_funds:"Geldmittel sind erschöpft!",search_by_tag_memo_amount:"Suche nach Tag, Memo, Betrag",invoice_waiting:"Rechnung wartend auf Zahlung",payment_received:"Zahlung erhalten",payment_sent:"Zahlung gesendet",receive:"erhalten",send:"schicken",outgoing_payment_pending:"Ausgehende Zahlung wartend",drain_funds:"Sats abziehen",drain_funds_desc:"LNURL-withdraw QR-Code, der das Abziehen aller Geldmittel aus dieser Wallet erlaubt. Teile ihn mit niemandem! Kompatibel mit balanceCheck und balanceNotify, so dass dein Wallet die Sats nach dem ersten Abzug kontinuierlich von hier abziehen kann.",i_understand:"Ich verstehe",copy_wallet_url:"Wallet-URL kopieren",disclaimer_dialog_title:"Wichtig!",disclaimer_dialog:"Login-Funktionalität wird in einem zukünftigen Update veröffentlicht. Bis dahin ist die Speicherung der Wallet-URL als Lesezeichen absolut notwendig, um Zugriff auf die Wallet zu erhalten! Dieser Service ist in BETA und wir übernehmen keine Verantwortung für Verluste durch verlorene Zugriffe.",no_transactions:"Keine Transaktionen",manage:"Verwalten",exchanges:"Börsenplätze",extensions:"Erweiterungen",no_extensions:"Du hast noch keine Erweiterungen installiert :(",created:"Erstellt",search_extensions:"Sucherweiterungen",extension_sources:"Erweiterungsquellen",ext_sources_hint:"Repositorys, von denen die Erweiterungen heruntergeladen werden können.",ext_sources_label:"Quell-URL (verwenden Sie nur die offizielle LNbits-Erweiterungsquelle und vertrauenswürdige Quellen)",warning:"Warnung",repository:"Repository",confirm_continue:"Bist du sicher, dass du fortfahren möchtest?",manage_extension_details:"Erweiterung installieren/deinstallieren",install:"Installieren",uninstall:"Deinstallieren",drop_db:"Daten löschen",enable:"Aktivieren",pay_to_enable:"Zahlen Sie zum Aktivieren",enable_extension_details:"Erweiterung für aktuellen Benutzer aktivieren",disable:"Deaktivieren",delete:"Löschen",installed:"Installiert",activated:"Aktiviert",deactivated:"Deaktiviert",release_notes:"Versionshinweise",activate_extension_details:"Erweiterung für Benutzer verfügbar/nicht verfügbar machen",featured:"Vorgestellt",all:"Alle",only_admins_can_install:"(Nur Administratorkonten können Erweiterungen installieren)",admin_only:"Nur für Admins",new_version:"Neue Version",extension_depends_on:"Hängt ab von:",extension_rating_soon:"Bewertungen sind bald verfügbar",extension_installed_version:"Installierte Version",extension_uninstall_warning:"Sie sind dabei, die Erweiterung für alle Benutzer zu entfernen.",uninstall_confirm:"Ja, deinstallieren",extension_db_drop_info:"Alle Daten für die Erweiterung werden dauerhaft gelöscht. Es gibt keine Möglichkeit, diesen Vorgang rückgängig zu machen!",extension_db_drop_warning:"Sie sind dabei, alle Daten für die Erweiterung zu entfernen. Bitte geben Sie den Namen der Erweiterung ein, um fortzufahren:",extension_required_lnbits_version:"Diese Version erfordert mindestens die LNbits-Version",min_version:"Mindestwert (inklusive)",max_version:"Maximalwert (ausgeschlossen)",payment_hash:"Zahlungs-Hash",fee:"Gebühr",amount:"Menge",amount_sats:"Betrag (sats)",tag:"Tag",unit:"Einheit",description:"Beschreibung",expiry:"Ablauf",webhook:"Webhook",payment_proof:"Beleg",update:"Aktualisieren",update_available:"Aktualisierung {version} verfügbar!",latest_update:"Sie sind auf der neuesten Version {version}.",notifications:"Benachrichtigungen",no_notifications:"Keine Benachrichtigungen",notifications_disabled:"LNbits Statusbenachrichtigungen sind deaktiviert.",enable_notifications:"Aktiviere Benachrichtigungen",enable_notifications_desc:"Wenn aktiviert, werden die neuesten LNbits-Statusaktualisierungen, wie Sicherheitsvorfälle und Updates, abgerufen.",enable_watchdog:"Aktiviere Watchdog",enable_watchdog_desc:"Wenn aktiviert, wird Ihre Zahlungsquelle automatisch auf VoidWallet umgestellt, wenn Ihr Guthaben niedriger als das LNbits-Guthaben ist. Nach einem Update müssen Sie dies manuell aktivieren.",watchdog_interval:"Überwachungszeitintervall",watchdog_interval_desc:"Wie oft die Hintergrundaufgabe nach einem Abschaltsignal im Wachhund-Delta [node_balance - lnbits_balance] suchen soll (in Minuten).",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Limit, bevor der Notausschalter die Finanzierungsquelle auf VoidWallet ändert [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Benachrichtigungsquelle",notification_source_label:"Quell-URL (verwenden Sie nur die offizielle LNbits-Statusquelle und Quellen, denen Sie vertrauen können)",more:"mehr",less:"weniger",releases:"Veröffentlichungen",watchdog:"Wachhund",server_logs:"Serverprotokolle",ip_blocker:"IP-Sperre",security:"Sicherheit",security_tools:"Sicherheitstools",block_access_hint:"Zugriff per IP sperren",allow_access_hint:"Zugriff durch IP erlauben (überschreibt blockierte IPs)",enter_ip:"Geben Sie die IP ein und drücken Sie die Eingabetaste",rate_limiter:"Ratenbegrenzer",wallet_limiter:"Geldbeutel-Limiter",wallet_limit_max_withdraw_per_day:"Maximales tägliches Wallet-Auszahlungslimit in Sats (0 zum Deaktivieren)",wallet_max_ballance:"Maximales Guthaben der Wallet in Sats (0 zum Deaktivieren)",wallet_limit_secs_between_trans:"Mindestsekunden zwischen Transaktionen pro Wallet (0 zum Deaktivieren)",number_of_requests:"Anzahl der Anfragen",time_unit:"Zeiteinheit",minute:"Minute",second:"Sekunde",hour:"Stunde",disable_server_log:"Server-Log deaktivieren",enable_server_log:"Serverprotokollierung aktivieren",coming_soon:"Funktion demnächst verfügbar",session_has_expired:"Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",instant_access_question:"Möchten Sie sofortigen Zugang?",login_with_user_id:"Mit Benutzer-ID anmelden",or:"oder",create_new_wallet:"Neue Geldbörse erstellen",login_to_account:"Melden Sie sich bei Ihrem Konto an",create_account:"Konto erstellen",account_settings:"Kontoeinstellungen",signin_with_nostr:"Mit Nostr fortfahren",signin_with_google:"Mit Google anmelden",signin_with_github:"Anmelden mit GitHub",signin_with_keycloak:"Mit Keycloak anmelden",username_or_email:"Benutzername oder E-Mail",password:"Passwort",password_config:"Passwortkonfiguration",password_repeat:"Passwortwiederholung",change_password:"Passwort ändern",update_credentials:"Anmeldeinformationen aktualisieren",update_pubkey:"Öffentlichen Schlüssel aktualisieren",set_password:"Passwort festlegen",invalid_password:"Das Passwort muss mindestens 8 Zeichen haben.",login:"Anmelden",register:"Registrieren",username:"Benutzername",pubkey:"Öffentlicher Schlüssel",user_id:"Benutzer-ID",email:"E-Mail",first_name:"Vorname",last_name:"Nachname",picture:"Bild",verify_email:"E-Mail verifizieren mit",account:"Konto",update_account:"Konto aktualisieren",invalid_username:"Ungültiger Benutzername",auth_provider:"Anbieter für Authentifizierung",my_account:"Mein Konto",back:"Zurück",logout:"Abmelden",look_and_feel:"Aussehen und Verhalten",toggle_gradient:"Verlauf umschalten",gradient_background:"Verlaufs-Hintergrund",language:"Sprache",color_scheme:"Farbschema",admin_settings:"Admin-Einstellungen",extension_cost:"Diese Version erfordert eine Zahlung von mindestens {cost} Sats.",extension_paid_sats:"Sie haben bereits {paid_sats} Sats bezahlt.",release_details_error:"Kann die Details zur Veröffentlichung nicht abrufen.",pay_from_wallet:"Zahlen aus dem Geldbeutel",wallet_required:"Wallet *",show_qr:"QR anzeigen",retry_install:"Installieren erneut versuchen",new_payment:"Neue Zahlung vornehmen",update_payment:"Zahlung aktualisieren",already_paid_question:"Haben Sie schon bezahlt?",sell:"Verkaufen",sell_require:"Zahlung anfordern, um die Erweiterung zu aktivieren",sell_info:"Die {name}-Erweiterung erfordert eine Zahlung von mindestens {amount} Satoshis, um aktiviert zu werden.",hide_empty_wallets:"Leere Geldbörsen verbergen",recheck:"Erneut überprüfen",contributors:"Mitwirkende",license:"Lizenz",reset_key:"Zurücksetzen-Schlüssel",reset_password:"Passwort zurücksetzen",border_choices:"Randoptionen",select_all:"Alles auswählen",nfc_supported:"NFC unterstützt",nfc_not_supported:"NFC wird nicht unterstützt",expire_date:"Ablaufdatum:",hash:"Hash:",welcome_lnbits:"Willkommen bei LNbits",setup_su_account:"Richten Sie das Superuser-Konto unten ein.",create_ticker_converter:"Währungsticker-Konverter erstellen",enable_audit:"Audit aktivieren",recommended:"Empfohlen",audit_desc:"HTTP-Anfragen entsprechend den angegebenen Filtern aufzeichnen",audit_record_req:"Anfragekörper aufzeichnen",audit_record_warning:"Warnung:",audit_record_req_warning_1:"Vertrauliche Daten (wie Passwörter) werden protokolliert.",audit_record_req_warning_2:"Der Anfragetext kann groß sein.",audit_record_use:"Verwenden Sie es mit Vorsicht.",audit_ip:"IP-Adresse aufzeichnen",audit_ip_desc:"Speichern Sie die IP-Adresse des Clients",audit_path_params:"Pfadparameter aufzeichnen",audit_query_params:"Abfrageparameter aufzeichnen",audit_http_methods:"HTTP-Methoden einschließen",audit_http_methods_hint:"Liste der HTTP-Methoden, die einbezogen werden sollen. Leere Listen bedeuten alle.",audit_http_methods_label:"HTTP-Methoden",audit_resp_codes:"HTTP-Antwortcodes einbeziehen",audit_resp_codes_hint:"Liste der einzuschließenden HTTP-Codes (regex-Match). Leere Liste bedeutet alle. Z.B.: 4.*, 5.*",audit_resp_codes_label:"HTTP-Antwortcode (Regex)",audit_paths:"Einfügepfade",audit_paths_hint:"Liste der aufzunehmenden Pfade (Regex-Übereinstimmung). Leere Liste bedeutet alle.",audit_paths_label:"HTTP-Pfad (Regex)",audit_paths_exclude:"Pfade ausschließen",audit_paths_exclude_hint:"Liste der auszuschließenden Pfade (regex-Match). Leere Liste bedeutet keine.",audit_paths_exclude_label:"HTTP-Pfad (Regex)",exchange_providers:"Austauschdienste",admin_extensions:"Admin-Erweiterungen",admin_extensions_label:"Admin-Erweiterungen",admin_extensions_hint:"Nur Benutzer mit Admin-Rechten können Erweiterungen verwenden.",user_default_extensions:"Standarderweiterungen des Benutzers",user_default_extensions_label:"Benutzererweiterungen",user_default_extensions_hint:"Erweiterungen, die standardmäßig für die Benutzer aktiviert werden.",miscellanous:"Verschiedenes",misc_disable_extensions:"Erweiterungen deaktivieren",misc_disable_extensions_label:"Alle Erweiterungen deaktivieren",misc_hide_api:"API ausblenden",misc_hide_api_label:"Verbirgt Wallet-API, Erweiterungen können es ehren",wallets_management:"Verwaltung von Geldbörsen",funding_source_info:"Finanzierungsquelleninformationen",funding_source:"Finanzierungsquelle: {wallet_class}",node_balance:"Kontostand: {balance} Sats",lnbits_balance:"LNbits-Guthaben: {balance} Sats",funding_reserve_percent:"Reservieren Prozent: {percent} %",node_management:"Knotenverwaltung",node_management_not_supported:"Knotenverwaltung wird von der aktiven Finanzierungsquelle nicht unterstützt",toggle_node_ui:"Node-Benutzeroberfläche",toggle_public_node_ui:"Öffentliche Knoten-Benutzeroberfläche",toggle_transactions_node_ui:"Transaktionen-Tab (Bei großen CLN-Knoten deaktivieren)",invoice_expiry:"Rechnungsablauf",invoice_expiry_label:"Rechnungsablauf (Sekunden)",fee_reserve:"Gebührenreserve",fee_reserve_msats:"Reservierungsgebühr in msats",fee_reserve_percent:"Reservierungsgebühr in Prozent",server_management:"Serververwaltung",base_url:"Basis-URL",base_url_label:"Statische/Basis-URL für den Server",authentication:"Authentifizierung",auth_token_expiry_label:"Token-Ablaufminuten",auth_token_expiry_hint:"Zeit in Minuten bis der Token abläuft",auth_allowed_methods_label:"Erlaubte Autorisierungsmethoden",auth_allowed_methods_hint:"Wählen Sie Autorisierungsmethoden aus",auth_nostr_label:"Nostr-Anforderungs-URL",auth_nostr_hint:"Absolute URL, die die Clients für die Anmeldung verwenden.",auth_google_ci_label:"Google-Client-ID",auth_google_ci_hint:"Stellen Sie sicher, dass die autorisierten Umleitungs-URIs https://{domain}/api/v1/auth/google/token enthalten",auth_google_cs_label:"Google-Client-Geheimnis",auth_gh_client_id_label:"GitHub-Client-ID",auth_gh_client_id_hint:"Stellen Sie sicher, dass die URL für den Autorisierungsrückruf auf https://{domain}/api/v1/auth/github/token gesetzt ist.",auth_gh_client_secret_label:"GitHub-Client-Geheimnis",auth_keycloak_label:"Keycloak Discovery-URL",auth_keycloak_ci_label:"Keycloak-Client-ID",auth_keycloak_ci_hint:"Stellen Sie sicher, dass die Autorisierungs-Callback-URL auf https://{domain}/api/v1/auth/keycloak/token eingestellt ist.",auth_keycloak_cs_label:"Keycloak-Client-Geheimnis",auth_keycloak_custom_org_label:"Keycloak Benutzerdefinierte Organisation",auth_keycloak_custom_icon_label:"Keycloak Benutzerdefiniertes Symbol (URL)",auth_oidc_label:"OIDC Discovery-URL",auth_oidc_ci_label:"OIDC-Client-ID",auth_oidc_ci_hint:"Stellen Sie sicher, dass die Autorisierungs-Callback-URL auf https://{domain}/api/v1/auth/oidc/token eingestellt ist.",auth_oidc_cs_label:"OIDC-Client-Geheimnis",auth_oidc_custom_org_label:"OIDC Benutzerdefinierter Organisationsname (z.B. Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC Benutzerdefiniertes Symbol (URL)",currency_settings:"Währungseinstellungen",allowed_currencies:"Erlaubte Währungen",allowed_currencies_hint:"Begrenzen Sie die Anzahl der verfügbaren Fiat-Währungen",default_account_currency:"Standardkontowährung",default_account_currency_hint:"Standardwährung für Buchhaltung",service_fee_label:"Servicegebühr (%)",service_fee_hint:"Gebühr pro Transaktion (%)",service_fee_max_label:"Servicegebühr max. (sats)",service_fee_max_hint:"Maximale Servicegebühr in (sats) berechnen.",fee_wallet:"Gebühren-Wallet",fee_wallet_label:"Gebühren-Wallet (Wallet-ID)",fee_wallet_hint:"Wallet-ID, an die Gelder gesendet werden sollen",disable_fee:"Gebühr deaktivieren",disable_fee_internal:"Dienstleistungsgebühr für interne Zahlungen deaktivieren",disable_fee_internal_desc:"Dienstleistungsgebühr für interne Lightning-Zahlungen deaktivieren",ui_management:"UI-Verwaltung",ui_site_title:"Seitentitel",ui_site_tagline:"Seitenslogan",ui_elements_enable:"Elemente auf der Startseite aktivieren",ui_elements_disable:"Elemente auf der Startseite deaktivieren",ui_toggle_elements_tip:"Entfernen Sie Homepage-Elemente wie 'läuft auf' usw.",ui_site_description:"Seitenbeschreibung",ui_site_description_hint:"Verwenden Sie einfachen Text, Markdown oder rohes HTML",ui_default_wallet_name:"Standard-Walletname",lnbits_wallet:"LNbits-Wallet",denomination:"Nomination",denomination_hint:"Der Name für das FakeWallet-Token",ui_qr_code_logo:"QR-Code-Logo",ui_qr_code_logo_hint:"URL zum Logo-Bild im QR-Code",ui_custom_badge:"Benutzerdefiniertes Abzeichen",ui_custom_badge_label:"Benutzerdefiniertes Abzeichen 'MIT VORSICHT VERWENDEN - LNbits-Wallet ist noch in der BETA-Phase'",ui_custom_badge_color_label:"Benutzerdefinierte Abzeichenfarbe",themes:"Themen",themes_hint:"Wählen Sie Themen, die für Benutzer verfügbar sind",custom_logo:"Benutzerdefiniertes Logo",custom_logo_hint:"URL zum Logobild",ad_space_title:"Anzeigentitel",ad_space_title_label:"Unterstützt von",ad_slots:"Werbeplätze",ad_slots_hint:"URL-Adressen und Bilddateipfade im CSV-Format, Erweiterungen können darauf achten",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Anzeigen aktiviert",ads_disabled:"Anzeigen deaktiviert",user_management:"Benutzerverwaltung",admin_users:"Admin-Benutzer",admin_users_hint:"Benutzer mit Administratorrechten",admin_users_label:"Benutzer-ID",allowed_users:"Zugelassene Benutzer",allowed_users_hint:"Nur diese Benutzer können LNbits verwenden.",allowed_users_label:"Benutzer-ID",allow_creation_user:"Erlauben Sie die Erstellung neuer Benutzer",allow_creation_user_desc:"Erlauben Sie das Erstellen neuer Benutzer auf der Indexseite",components:"Komponenten",long_running_endpoints:"Top 5 lang laufende Endpunkte",http_request_methods:"HTTP-Anfragemethoden",http_response_codes:"HTTP-Antwortcodes",request_details:"Anfragedetails",http_request_details:"HTTP-Anfragedetails"},window.localisation.en={confirm:"Yes",server:"Server",theme:"Theme",site_customisation:"Site Customisation",funding:"Funding",users:"Users",audit:"Audit",api_watch:"API Watch",apps:"Apps",channels:"Channels",transactions:"Transactions",dashboard:"Dashboard",node:"Node",export_users:"Export Users",no_users:"No users found",total_capacity:"Total Capacity",avg_channel_size:"Avg. Channel Size",biggest_channel_size:"Biggest Channel Size",smallest_channel_size:"Smallest Channel Size",number_of_channels:"Number of Channels",active_channels:"Active Channels",connect_peer:"Connect Peer",connect:"Connect",reconnect:"Reconnect",open_channel:"Open Channel",open:"Open",clear:"Clear",close_channel:"Close Channel",close:"Close",restart:"Restart server",image_library:"Image Library",save:"Save",save_tooltip:"Save your changes",must_save:"You have unsaved changes",credit_debit:"Credit / Debit",credit_hint:"Press Enter to credit/debit wallet (negative values allowed)",credit_label:"{denomination} to credit/debit",credit_ok:"Success crediting/debiting virtual funds ({amount} sats). Payments depend on actual funds on funding source.",restart_tooltip:"Restart the server for changes to take effect",add_funds_tooltip:"Add funds to a wallet.",reset_defaults:"Reset to defaults",reset_defaults_tooltip:"Delete all settings and reset to defaults.",download_backup:"Download database backup",name_your_wallet:"Name your {name} wallet",paste_invoice_label:"Paste an invoice, payment request or lnurl code *",lnbits_description:"Easy to set up and lightweight, LNbits can run on any Lightning Network funding source and even LNbits itself! You can run LNbits for yourself, or easily offer a custodian solution for others. Each wallet has its own API keys and there is no limit to the number of wallets you can make. Being able to partition funds makes LNbits a useful tool for money management and as a development tool. Extensions add extra functionality to LNbits so you can experiment with a range of cutting-edge technologies on the lightning network. We have made developing extensions as easy as possible, and as a free and open-source project, we encourage people to develop and submit their own.",export_to_phone:"Export to Phone with QR Code",export_to_phone_desc:"This QR code contains your wallet URL with full access. You can scan it from your phone to open your wallet from there.",access_wallet_on_mobile:"Mobile Access",stored_paylinks:"Stored LNURL pay links",wallet:"Wallet: ",wallet_name:"Wallet name",wallet_type:"Wallet type",shared_wallet:"Shared Wallet",share_wallet:"Share Wallet",update_permissions:"Update Permissions",shared_wallet_id:"Shared Wallet ID",shared_wallet_desc:"You have been invited to have access to someone else's wallet.",wallets:"Wallets",exclude_wallets:"Exclude Wallets",add_wallet:"Add wallet",reject_wallet:"Reject wallet",add_new_wallet:"Add a new wallet",pin_wallet:"Pin wallet",delete_wallet:"Delete wallet",delete_wallet_desc:"This whole wallet will be deleted, the funds will be UNRECOVERABLE.",rename_wallet:"Rename wallet",update_name:"Update name",fiat_tracking:"Fiat tracking",fiat_providers:"Fiat providers",fiat_warning_bitcoin:'Fiat providers can get twitchy about anything bitcoin, so avoid using word "bitcoin" in your memos!',currency:"Currency",update_currency:"Update currency",press_to_claim:"Press to claim bitcoin",claim_desc:"It seems you have a claimable amount of bitcoin but you don’t have a wallet yet. Press the button below to claim it. This will create a new wallet for you.",donate:"Donate",view_github:"View on GitHub",voidwallet_active:"VoidWallet is active! Payments disabled",voidwallet_active_user:"Funding source unavailable. Please contact your admin to configure.",voidwallet_active_admin:"Funding source unavailable. Click here to configure.",service_fee_badge:"Service fee: {amount} % per transaction",service_fee_max_badge:"Service fee: {amount} % per transaction (max {max} {denom})",service_fee_tooltip:"Service fee charged by the LNbits server admin per outgoing transaction",toggle_darkmode:"Toggle Dark Mode",payment_reactions:"Payment Reactions",view_swagger_docs:"View LNbits Swagger API docs",api_docs:"API docs",api_keys_api_docs:"Node URL, API keys and API docs",lnbits_version:"LNbits version",runs_on:"Runs on",paste:"Paste",paste_from_clipboard:"Paste from clipboard",paste_request:"Paste Request",create_invoice:"Create Invoice",camera_tooltip:"Use camera to scan an invoice/QR",export_csv:"Export to CSV",export_csv_details:"Export to CSV with details",chart_tooltip:"Show chart",pending:"Pending",copy_invoice:"Copy invoice",withdraw_from:"Withdraw from",cancel:"Cancel",scan:"Scan",read:"Read",write:"Write",pay:"Pay",memo:"Memo",date:"Date",path:"Path",internal_memo:"Internal memo (optional)",internal_memo_hint_receive:"This memo is not shown to the payer but it's stored in the invoice for your reference.",internal_memo_hint_pay:"This memo is not shown to the payee but it's stored in the payment for your reference.",payment_processing:"Processing payment...",payment_processing:"Processing payment...",payment_successful:"Payment successful!",payment_pending:"Payment pending...",payment_check:"Check payment",not_enough_funds:"Not enough funds!",search_by_tag_memo_amount:"Search by tag, memo, amount",search:"Search",invoice_waiting:"Invoice waiting to be paid",payment_received:"Payment Received",payment_sent:"Payment Sent",payment_failed:"Payment Failed",receive:"receive",send:"send",outgoing_payment_pending:"Outgoing payment pending",drain_funds:"Drain Funds",drain_funds_desc:"This is an LNURL-withdraw QR code for slurping everything from this wallet. Do not share with anyone. It is compatible with balanceCheck and balanceNotify so your wallet may keep pulling the funds continuously from here after the first withdraw.",i_understand:"I understand",copy_wallet_url:"Copy wallet URL",disclaimer_dialog_title:"Important!",disclaimer_dialog:"You *must* save your login credentials to be able to access your wallet again. If you lose them, you will lose access to your wallet and funds.\n\nFind your login credentials on your account settings page.\n\nLNbits holds no responsibility for loss of access to funds.",no_transactions:"No transactions made yet",manage:"Manage",exchanges:"Exchanges",extensions:"Extensions",no_extensions:"You don't have any extensions installed :(",created:"Created",created_at:"Created At",updated_at:"Updated At",search_extensions:"Search extensions",search_wallets:"Search wallets",extension_sources:"Extension Sources",ext_sources_hint:"Repositories from where the extensions can be downloaded",ext_sources_label:"Source URL (only use the official LNbits extension source, and sources you can trust)",warning:"Warning",repository:"Repository",confirm_continue:"Are you sure you want to continue?",manage_extension_details:"Install/uninstall extension",upload:"Upload",install:"Install",uninstall:"Uninstall",drop_db:"Remove Data",enable:"Enable",enabled:"Enabled",disabled:"Disabled",pay_to_enable:"Pay To Enable",enable_extension_details:"Enable extension for current user",disable:"Disable",delete:"Delete",installed:"Installed",activated:"Activated",deactivated:"Deactivated",activate:"Activate",deactivate:"Deactivate",release_notes:"Release Notes",activate_extension_details:"Make extension available/unavailable for users",featured:"Featured",all:"All",only_admins_can_install:"(Only admin accounts can install extensions)",only_admins_can_create_extensions:"Only admin accounts can create extensions",admin_only:"Admin Only",make_user_admin:"Make User Admin",revoke_admin:"Revoke Admin",new_version:"New Version",reviews_url:"Reviews URL",reviews_url_label:"Reviews server URL",reviews_url_hint:"Full PaidReviews URL including the settings id (e.g. https://example.com/paidreviews/SETTINGS_ID)",reviews_open:"View reviews",reviews_leave:"Leave a review",reviews_name:"Your name",reviews_comment:"Your review",reviews_rating:"Rating",reviews_submit:"Submit review",reviews_loading:"Loading reviews...",reviews_refresh:"Refresh reviews",reviews_error_load:"Could not load reviews",reviews_url_not_configured:"Reviews URL not configured",reviews_pay_invoice:"Pay invoice",reviews_invoice_paid:"Invoice paid",reviews_invoice_title:"Pay this invoice to submit your review",reviews_count:"Reviews",no_reviews:"No reviews yet",extension_has_free_release:"Has free releases",extension_has_paid_release:"Has paid releases",extension_depends_on:"Depends on:",extension_rating_soon:"Ratings coming soon",extension_installed_version:"Installed version",extension_uninstall_warning:"You are about to remove the extension for all users.",uninstall_confirm:"Yes, Uninstall",extension_db_drop_info:"All data for the extension will be permanently deleted. There is no way to undo this operation!",extension_db_drop_warning:"You are about to remove all data for the extension. Please type the extension name to continue:",extension_required_lnbits_version:"This release requires LNbits version",min_version:"Minimum (included)",max_version:"Maximum (excluded)",preimage:"Preimage",preimage_hint:"Preimage to settle the hold invoice",hold_invoice:"Hold Invoice",hold_invoice_description:"This invoice is on hold and requires a preimage to settle.",payment_hash:"Payment Hash",invoice_cancelled:"Invoice Cancelled",invoice_settled:"Invoice Settled",hold_invoice_payment_hash:"Payment hash for hold invoice (optional)",settle_invoice:"Settle Invoice",cancel_invoice:"Cancel Invoice",fee:"Fee",amount:"Amount",amount_limits:"Amount Limits",amount_sats:"Amount (sats)",faucest_wallet:"Faucet Wallet",faucest_wallet_desc_1:"Each time a payment is confirmed by the {provider} provider funds will be subtracted from this wallet.",faucest_wallet_desc_2:"This helps monitor all {provider} payments and their status.",faucest_wallet_desc_3:"This wallet must be topped up with the amount of sats that the admin is willing to offer in exchange for the fiat currency.",faucest_wallet_desc_4:"If this wallet is configured, but is empty, the {provider} payments will not be processed.",faucest_wallet_desc_5:"This wallet can eventually get to a negative balance if parallel fiat payments are made.",faucest_wallet_id:"Faucet Wallet ID (optional)",faucest_wallet_id_hint:"Wallet ID to use for the faucet. It will be used to send the funds to the user.",tag:"Tag",unit:"Unit",description:"Description",expiry:"Expiry",webhook:"Webhook",webhook_url:"Webhook URL",webhook_url_hint:"Webhook URL to send the payment details to. It will be called when the payment is completed.",copy_webhook_url:"Copy webhook URL",webhook_events_list:"The following events must be supported by the webhook:",webhook_stripe_description:"One the stripe side you must configure a webhook with a URL that points to your LNbits server.",webhook_square_description:"On the Square side configure a webhook pointing to this exact LNbits URL.",square_webhook_url_hint:"Must exactly match the Square notification URL. LNbits requires the /api/v1/callback/square path.",access_token:"Access Token",location_id:"Location ID",square_location_id_hint:"Square location ID to create payment links for. Use the endpoint to select sandbox or production.",api_version:"API Version",payment_proof:"Payment Proof",update:"Update",update_available:"Update {version} available!",funding_sources:"Funding Sources",funding_source:"Funding Source",requires_server_restart:"Changing these settings requires a server restart to take effect.",funding_source_info:"Select the active funding wallet",phoenixd_warning:"Phoenixd mnemonic is only available if phoenixd data-dir is specified and is readable by LNbits. It's not indicative of phoenixd not running. It just means LNbits cannot access the mnemonic to display it here.",latest_update:"You are on the latest version {version}.",notifications:"Notifications",notifications_configure:"Configure Notifications",notifications_nostr_config:"Nostr Configuration",notifications_enable_nostr:"Enable Nostr",notifications_enable_nostr_desc:"Send notifications over Nostr",notifications_nostr_private_key:"Nostr Private Key",notifications_nostr_private_key_desc:"Private key (hex or nsec) to sign the messages sent to Nostr",notifications_nostr_identifier:"Nostr Identifier",notifications_nostr_identifier_desc:"Nip5 identifier to send notifications to",notifications_nostr_identifiers:"Nostr Identifiers",notifications_nostr_identifiers_desc:"List of identifiers to send notifications to.",notifications_telegram_config:"Telegram Configuration",notifications_enable_telegram:"Enable Telegram",notifications_enable_telegram_desc:"Send notifications over Telegram",notifications_telegram_access_token:"Access Token",notifications_telegram_access_token_desc:"Access token for the bot",notifications_chat_id:"Telegram Chat ID",notifications_chat_id_desc:"Telegram Chat ID to send the notifications to",notifications_excluded_wallets_desc:"Do not send notifications for these wallets",notifications_email_config:"Email Configuration",notifications_enable_email:"Enable Email",notifications_enable_email_desc:"Send notifications over email",notifications_send_test_email:"Send test email",notifications_send_email:"Send email",notifications_send_email_desc:"Email you will send from",notifications_send_email_username:"Username",notifications_send_email_username_desc:"Username, will use the email if not set",notifications_send_email_password:"Send email password",notifications_send_email_password_desc:"Password for the email you will send from",notifications_send_email_server_port:"Send email SMTP port",notifications_send_email_server_port_desc:"Port for the SMTP server",notifications_send_email_server:"Send email SMTP server",notifications_send_email_server_desc:"SMTP server for the email you will send from",notifications_send_to_emails:"Emails to send to",notifications_send_to_emails_desc:"Emails notifications will be sent to",notification_settings_update:"Settings updated",notification_settings_update_desc:"Send a notification when server settings have been updated",notification_server_start_stop:"Server Start/Stop",notification_server_start_stop_desc:"Send a notification when the server has been started/stopped",notification_watchdog_limit:"Watchdog Limit Notification",notification_watchdog_limit_desc:"Send a notification when the watchdog limit has been reached (does not affect the funding source)",notification_server_status:"Server Status",notification_server_status_desc:"Send regular notifications about the server status (interval value in hours)",notification_incoming_payment:"Incoming Payments",notification_incoming_payment_desc:"Send a notification when a wallet has received a payment above the specified amount (sats)",notification_outgoing_payment:"Outgoing Payments",notification_outgoing_payment_desc:"Send a notification when a wallet has sent a payment above the specified amount (sats)",notification_credit_debit:"Credit / Debit",notification_credit_debit_desc:"Send a notification when a wallet has been credited/debited by the superuser",notification_balance_delta_changed:"Balance Delta Changed",notification_balance_delta_changed_desc:"Send a notification when the difference between the node balance and the LNbits balance has changed by more than the specified amount (in sats). Set to 0 to disable. This runs every minute.",watchdog_introduction:"Watchdog is a feature that allows you to automatically switch the LNbits funding source to VoidWallet if your node balance is lower than the LNbits balance by a certain threshold. This can help prevent overspending and keep your node's funds safe.",enable_watchdog:"Enable Watchdog",enable_watchdog_desc:"You will need to re-enable this manually after an update.",watchdog_interval:"Watchdog Check Interval",watchdog_interval_desc:"How often LNbits should check for a killswitch signal in the watchdog threshold delta value [node_balance - lnbits_balance] (in minutes).",watchdog_delta:"Watchdog Threshold Delta",watchdog_delta_desc:"The LNbit's > Node balance delta threshold. If this threshold is exceeded, the funding source is changed to VoidWallet.",status:"Status",notification_source:"Notification Source",notification_source_label:"Source URL (only use the official LNbits status source, and sources you can trust)",more:"more",more_count:"{count} more",less:"less",releases:"Releases",watchdog:"Watchdog",server_logs:"Server Logs",ip_blocker:"IP Blacklist/Whitelist",security:"Security",security_tools:"Security Tools",block_access_hint:"Block access by IP",allow_access_hint:"Allow access by IP (will override blocked IPs)",enter_ip:"Enter an IP address and press enter",rate_limiter:"Rate Limiter",callback_url_rules:"Callback URL Rules",enter_callback_url_rule:"Enter URL rule as regex and hit enter",callback_url_rule_hint:"Callback URLs (like LNURL one) will be validated against these rules. At leat one rule must match. No rule means all URLs are allowed.",wallet_limiter:"Wallet Limiter",wallet_config:"Wallet Config",wallet_charts:"Wallet Charts",wallet_limit_max_withdraw_per_day:"Max daily wallet withdrawal in sats (0 for no limit, -1 to block withdrawal)",wallet_max_ballance:"Wallet max balance in sats (0 to disable)",wallet_limit_secs_between_trans:"Min secs between transactions per wallet (0 to disable)",only_incoming_payments_allowed:"Allow incoming payments only",disable_outgoing_payments:"Disable outgoing payments",number_of_requests:"Number of requests to allow",number_of_requests_hint:'Number of requests to allow per "time unit" for the rate limiter. Set to 0 to disable.',time_unit:"Time unit",minute:"Minute",settings:"Settings",second:"Second",hour:"Hour",disable_server_log:"Disable Server Log",enable_server_log:"Enable Server Log",coming_soon:"Feature coming soon",session_has_expired:"Your session has expired. Please login again.",instant_access_question:"or instant access",login_with_user_id:"Login with user ID",or:"or",create_new_wallet:"Create New Wallet",delete_all_wallets:"Delete All Wallets",confirm_delete_all_wallets:"Are you sure you want to delete ALL wallets for this user?",login_to_account:"Login to your account",create_account:"Create account",account_settings:"Account Settings",signin_with_oauth:"Login with",signin_with_oauth_or:"or Login with",signin_with_nostr:"Continue with Nostr",signin_with_google:"Sign in with Google",signin_with_github:"Sign in with GitHub",signin_with_custom_org:"Sign in with {custom_org}",username_or_email:"Username or Email",password:"Password",password_config:"Password Config",password_repeat:"Password repeat",update_password:"Update Password",change_password:"Change Password",update_credentials:"Update Credentials",update_pubkey:"Update Public Key",nostr_pubkey_tooltip:"Enter this user's Nostr public key (hex value)",set_password:"Set Password",set_password_tooltip:"Set a password for this user",invalid_password:"Password must have at least 8 characters",invalid_password_repeat:"Passwords do not match",reset_key_generated:"A reset key has been generated.",reset_key_copy:"Click OK to copy the reset URL to your clipboard.",login:"Login",register:"Register",username:"Username",pubkey:"Public Key",user_id:"User ID",id:"ID",email:"Email",first_name:"First Name",last_name:"Last Name",picture:"Picture",user_picture_desc:"URL to an image to use as profile picture. You can upload it as an asset.",verify_email:"Verify email with",account:"Account",update_account:"Update Account",invalid_username:"Invalid Username",auth_provider:"Auth Provider",external_id:"External ID",my_account:"My Account",existing_account_question:"Already have an account?",background_image:"Background Image",back:"Back",logout:"Logout",look_and_feel:"Look and Feel",endpoint:"Endpoint",api:"API",api_stripe:"API",api_token:"API Token",api_tokens:"API Tokens",access_control_list:"Access Control List",access_control_list_admin_warning:"This is an admin account. The generated tokens will have admin privileges.",new_api_acl:"New Access Control List",api_token_id:"Token Id",toggle_gradient:"Toggle Gradient",gradient_background:"Gradient Background",rounded_ui:"Rounded Cards & Buttons",toggle_rounded_ui:"Toggle rounded corners for cards and buttons",card_gradient:"Card Gradient",toggle_card_gradient:"Toggle gradient on cards",card_shadow:"Card Shadow",toggle_card_shadow:"Toggle shadow on cards",burger_menu_background:"Burger Menu Background",toggle_burger_menu_background:"Toggle burger menu background",language:"Language",assets:"Assets",max_asset_size_mb:"Max Asset Size (MB)",max_asset_size_mb_desc:"The maximum allowed size for asset uploads in megabytes (can use decimal values).",assets_allowed_mime_types:"Allowed MIME Types",assets_allowed_mime_types_desc:"The MIME types that are allowed for asset uploads. No value means all uploads are allowed.",thumbnail_width:"Thumbnail Width",thumbnail_width_desc:"Width of the generated thumbnail in pixels.",thumbnail_height:"Thumbnail Height",thumbnail_height_desc:"Height of the generated thumbnail in pixels.",thumbnail_format:"Thumbnail Format",thumbnail_format_desc:"Image format of the generated thumbnail (PNG, JPEG, etc.).",max_assets_per_user:"Max Assets Per User",max_assets_per_user_desc:"The maximum number of assets a user can upload. Zero means upload forbidden.",assets_no_limit_users:"Users Without Asset Limits",assets_no_limit_users_desc:"These users can upload an unlimited number of assets (user id based).",color_scheme:"Color Scheme",visible_wallet_count:"Visible Wallet Count",admin_settings:"Admin Settings",extension_cost:"This release requires a payment of minimum {cost} sats.",extension_paid_sats:"You have already paid {paid_sats} sats.",create_extension:"Create Extension",release_details_error:"Cannot get the release details.",pay_from_wallet:"Pay from Wallet",pay_with:"Pay with {provider}",select_payment_provider:"Select payment provider",wallet_required:"Wallet *",show_qr:"Show QR",retry_install:"Retry Install",new_payment:"Make New Payment",update_payment:"Update Payment",already_paid_question:"Have you already paid?",sell:"Sell",sell_require:"Ask payment to enable extension",sell_info:"The {name} extension requires a payment of minimum {amount} sats to enable.",hide_empty_wallets:"Hide empty wallets",recheck:"Recheck",check:"Check",check_connection:"Check Connection",check_webhook:"Check Webhook",contributors:"Contributors",license:"License",reset_key:"Reset Key",reset_password:"Reset Password",border_choices:"Border Choices",select_all:"Select All",nfc_supported:"NFC Supported",nfc_not_supported:"NFC not Supported",expire_date:"Expire Date: ",hash:"Hash: ",welcome_lnbits:"Welcome to LNbits",setup_su_account:"Set up the Superuser account below.",first_install_token:"First Install Token",create_ticker_converter:"Create Currency Ticker Converter",enable_audit:"Enable Audit",recommended:"Recommended",audit_desc:"Log HTTP requests according to the filters specified below.",audit_record_req:"Log Request Body",audit_record_warning:"Warning!",audit_record_req_warning_1:"Sensitive data (like passwords) will be logged.",audit_record_req_warning_2:"The request body can be large. This can fill up your logs quickly.",audit_record_use:"Use this with caution!",audit_ip:"Log IP Address",audit_ip_desc:"Log the IP address of users making requests to LNbits.",audit_path_params:"Log Path Parameters",audit_query_params:"Log Query Parameters",audit_http_methods:"Include HTTP Methods",audit_http_methods_hint:"List of HTTP methods to be logged. No value means all methods will be logged.",audit_http_methods_label:"HTTP Methods to Log",audit_resp_codes_hint:"List of HTTP codes to be included (regex match). Empty lists means all. Eg: 4.*, 5.*",audit_resp_codes_label:"HTTP Response Codes to Log (regex)",audit_paths_hint:"List of paths to be included (regex match). Empty list means all.",audit_paths_label:"HTTP Paths to Log (regex)",audit_paths_exclude_hint:"List of paths to be excluded (regex match). Empty list means none.",audit_paths_exclude_label:"HTTP Paths to Exclude from Logging (regex)",exchange_providers:"Exchange Providers",admin_extensions:"Admin Extensions",admin_extensions_label:"Admin extensions",admin_extensions_hint:"Extensions only user with admin privileges can use",user_default_extensions:"User Default Extensions",user_default_extensions_label:"User extensions",user_default_extensions_hint:"Extensions that will be enabled by default for the users.",extension_builder:"Extension Builder",extension_builder_manifest_url:"Extension Builder Manifest URL",extension_builder_manifest_url_hint:"URL to a JSON manifest file with extension builder details",miscellanous:"Miscellanous",misc_disable_extensions:"Disable Extensions",misc_disable_extensions_label:"Disable all extensions",misc_disable_extensions_builder:"Enable Extensions Builder",misc_disable_extensions_builder_label:"Enable Extensions Builder for non admin users.",misc_hide_api:"Hide API",misc_hide_api_label:"Hides wallet API, extensions can choose to honor",wallets_management:"Wallets Management",funding_source_info:"Funding Source Information",funding_source:"Funding source: {wallet_class}",node_balance:"Node balance: {balance} sats",lnbits_balance:"LNbits balance: {balance} sats",funding_reserve_percent:"Funding reserve percentage: {percent} %",node_management:"Node Management",node_management_not_supported:"Node management is not supported by the active funding source",toggle_node_ui:"Node UI",toggle_public_node_ui:"Public Node UI",toggle_transactions_node_ui:"Transactions Tab (Disable on large CLN nodes)",invoice_expiry:"Invoice Expiry",routing_fee_reserve_calculations:"Routing Fee Reserve Calculations",routing_fee_reserve_calculations_desc:"LNbits sets aside a “reserve amount” for each payment to cover routing fees. The maximum routing fee passed to the funding source is whichever is higher: the minimum routing fee reserve or the routing fee reserve percentage.",millisats:"millisats",fee_reserve:"Minimum Routing Fee Reserve",fee_reserve_percent:"Routing Fee Reserve Percentage",fee_reserve_min_hint:"The minimum fee reserved per payment.
This acts as a floor - the maximum allowed routing fee will never be lower than this value regardless of payment size.",fee_reserve_percent_hint:"The percentage of the payment amount to reserve for routing fees.",payment_timeouts:"Payment Timeouts",payment_wait_time:"Payment Wait Time",seconds:"seconds",payment_pending_interval:"Check payment interval (sec)",payment_pending_interval_desc:"Interval to check pending payments",payment_pending_interval_tooltip:"Controls how often LNbits checks for pending payments to update their status. Higher values can reduce the load on the node and speed up the payment process, but it will take longer for pending payments to be updated.",payment_wait_time_desc:"Wait time before marking an outgoing payment as pending. Default: 5s; raise for slow-settling invoices.",payment_wait_time_tooltip:"Controls how long LNbits waits for an outgoing payment attempt to confirm before marking it as pending. Higher values help when paying slow-settling invoices (e.g., HODL invoices, Boltz). The payment will be rechecked later and updated automatically or manually.",server_management:"Server Management",base_url_label:"Base URL of the server",authentication:"Authentication",auth_token_expiry_label:"Token expiry (minutes)",auth_token_expiry_hint:"Time in minutes until the token expires",auth_authentication_cache_label:"Cache time (minutes)",auth_authentication_cache_hint:"Time in minutes to cache successful authentication (0 to disable)",auth_allowed_methods_label:"Allowed authorization methods",auth_allowed_methods_hint:"Select allowed authorization methods",auth_nostr_label:"Nostr Request URL",auth_nostr_hint:"Absolute URL that the clients will use to login.",auth_google_ci_label:"Google Client ID",auth_google_ci_hint:"Make sure that the authorized redirect URIs contain https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"GitHub Client ID",auth_gh_client_id_hint:"Make sure that the authorization callback URL is set to https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Client Secret",auth_keycloak_label:"Keycloak Discovery URL",auth_keycloak_ci_label:"Keycloak Client ID",auth_keycloak_ci_hint:"Make sure thant the authorization callback URL is set to https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak Client Secret",auth_keycloak_custom_org_label:"Keycloak Custom Organization",auth_keycloak_custom_icon_label:"Keycloak Custom Icon (URL)",auth_oidc_label:"OIDC Discovery URL",auth_oidc_ci_label:"OIDC Client ID",auth_oidc_ci_hint:"Make sure that the authorization callback URL is set to https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC Client Secret",auth_oidc_custom_org_label:"OIDC Custom Organization Name (e.g., Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC Custom Icon (URL)",currency_settings:"Currency Settings",allowed_currencies:"Allowed Currencies",allowed_currencies_hint:"Set the allowed fiat currencies for the exchange features",default_account_currency:"Default Accounting Currency",default_account_currency_hint:"The default currency to use for accounting features.",min_incoming_payment_amount:"Min Incoming Payment Amount",min_incoming_payment_amount_desc:"Minimum amount allowed for generating an invoice",max_incoming_payment_amount:"Maximum Incoming Payment Amount",max_incoming_payment_amount_desc:"Maximum amount allowed when generating an invoice",max_outgoing_payment_amount:"Maximum Outgoing Payment Amount",max_outgoing_payment_amount_desc:"Maximum amount allowed when making a payment",service_fees:"Service Fees",service_fee:"Service Fee",service_fee_label:"Service Fee Charged Per Transaction",service_fee_max_label:"Maximum Service Fee Limit",fee_wallet_label:"Service Fee Wallet ID",fee_wallet_hint:"The ID of the wallet to which to send service funds",disable_fee:"Disable Service Fees for Internal Payments",ui_management:"UI Management",ui_site_title:"Site Title",ui_changing_remove_lnbits_elements:" (changing will remove LNbits elements on the homepage and footer)",ui_site_tagline:"Site Tagline",ui_elements_enable:"Enable elements on homepage/footer",ui_elements_disable:"Disable elements on homepage/footer",ui_toggle_elements_tip:"Remove homepage elements like 'runs on' etc",ui_site_description:"Site Description",ui_site_description_hint:"Use plain text, Markdown, or raw HTML",ui_default_wallet_name:"Default Wallet Name",ui_default_theme:"Default Theme",wallet_featured_button_title:"Wallet - Featured Button",wallet_featured_button_label:"Wallet Featured Button Label",wallet_featured_button_label_hint:"Show featured button on the wallet homepage",wallet_featured_button_url:"Featured Button URL",wallet_featured_button_url_hint:"On click the button will open this URL. Leave empty to hide the button.",wallet_featured_button_icon:"Featured Button Icon",wallet_featured_button_icon_hint:'Icon shown on the featured button (Quasar icon name e.g. "bolt")',lnbits_wallet:"LNbits wallet",denomination:"Denomination",denomination_hint:"The name for the FakeWallet token",denomination_error:"Denomination must be 3 characters, or `sats`",ui_qr_code_logo:"QR Code/Favicon Logo",ui_qr_code_logo_hint:"QR code icon and favicon logo URL",ui_apple_touch_icon:"Apple Touch Icon",ui_apple_touch_icon_hint:"Apple touch icon URL",ui_custom_image:"Custom Image",ui_custom_image_label:"URL to custom image",ui_custom_image_hint:"This image is shown on the LNbits homepage and login screen.",ui_custom_badge_title:"Custom Badge Settings",ui_custom_badge_desc:"Show a custom badge in the header of LNbits",ui_custom_badge:"Custom Badge Text",ui_custom_badge_label:"Custom Badge 'USE WITH CAUTION'",ui_custom_badge_color_label:"Custom Badge Color",themes:"Themes",themes_hint:"Choose themes available for users",custom_logo:"Custom Logo",custom_logo_hint:"URL to logo image",ad_space_section_title:"Advertisement Space",ad_space_section_desc:"Configure the advertisement space on the wallet sidebar.",ad_space_title:"Advertisement Space Title",ad_space_title_hint:"Title shown above the advertisement space",ad_slots:"Advertisement Slots",ad_slots_hint:"Advertisement image filepaths in CSV format, extensions can choose to honor. Format: url;img_light_url;img_dark_url, url..",ads_enabled:"Enable Advertisement",ads_disabled:"Disabled Advertisement",user_management:"User Management",admin_users:"Admin Users",admin_users_hint:"Users with admin privileges",admin_users_label:"User ID",allowed_users:"Allowed Users",allowed_users_hint:"Only these users can use LNbits",allowed_users_hint_feature:"Only these users can use {feature}",allowed_users_label:"User ID",allow_creation_user:"Allow creation of new users",allow_creation_user_desc:"Allow creation of new users on the index page",require_user_activation:"Require user activation",require_user_activation_desc:"New users will be activated only after they pass one of the confirmation methods. Admins can activate users manually from the admin panel.",reusable_activation_code:"Reusable activation code",reusable_activation_code_label:"Reusable activation code",reusable_activation_code_hint:"This activation code can be used multiple times by different users.",one_time_activation_code:"One-time activation codes",one_time_activation_code_label:"Add activation code",one_time_activation_code_hint:"List of one-time activation codes. Each code can be used only once, then will be reomved from the list.",invitation_code:"Invitation Code",invitation_code_hint:"The invitation code that you have received.",email:"Email",email_confirmation_hint:"Email address to send the confirmation code to.",nostr_identifier:"Nostr Identifier",nostr_identifier_hint:"Nostr nip5 identifier or to send the confirmation code to.",new_user_not_allowed:"Registration is disabled.",start_user_impersonation:"Impersonate this user",stop_user_impersonation:"Stop User Impersonation",components:"Components",long_running_endpoints:"Top 5 Long Running Endpoints",http_request_methods:"HTTP Request Methods",http_response_codes:"HTTP Response Codes",request_details:"Request Details",http_request_details:"HTTP Request Details",payment_details:"Payment Details",payment_details_desc:"Detailed information about the payment",payments:"Payments",payment_show_internal:"Show Internal Payments",payment_chart_flow:"Monthly Payment Flow",payment_chart_status:"Payment Status",payment_chart_tx_per_wallet:"Transactions per Wallet (balance/count)",payment_details_back:"Back to Payments",payment_chart_tags:"Payments by Tags",payments_balance_in_out:"Balance In/Out",payments_count_in_out:"Count In/Out",payments_status_chart:"Status Chart",payments_tag_chart:"Tag Chart",payments_balance_chart:"Balance Chart",payments_wallets_chart:"Wallets Chart",payments_balance_in_out_chart:"Balance In/Out Chart",payments_count_in_out_chart:"Count In/Out Chart",reset_wallet_keys:"Reset Keys",reset_wallet_keys_desc:"Reset the API keys for this wallet. This will invalidate the current keys and generate new ones.",view_list:"View wallets as list",view_column:"View wallets as rows",filter_payments:"Filter payments",filter_labels:"Filter labels",filter_date:"Filter by date",websocket_example:"Websocket example",client_id:"Client ID",secret_key:"Secret Key",signing_secret:"Signing Secret",signing_secret_hint:"Signing secret for the webhook. Messages will be signed with this secret.",webhook_id:"Webhook ID",webhook_id_hint:"PayPal webhook ID used to verify incoming events.",webhook_paypal_description:"On the PayPal side configure a webhook pointing to your LNbits server.",square_webhook_signature_key_hint:"Square webhook signature key used to verify incoming events.",callback_success_url:"Callback Success URL",callback_success_url_hint:"The user will be redirected to this URL after the payment is successful",connected:"Connected",not_connected:"Not Connected",free:"Free",paid:"Paid",funding_source_retries:"Max Retries",funding_source_retries_desc:"Maximum number of retries for funding sources, before it falls back to VoidWallet.",add_label:"Add Label",label:"Label",labels:"Labels",label_filter:"Label Filter",no_labels_defined:"No labels defined yet",manage_labels:"Manage Labels",update_label:"Update Label",delete_label:"Delete Label",add_remove_labels:"Add or Remove Labels",payment_labels_updated:"Payment labels updated",color:"Color",sort:"Sort",sort_by:"Sort by"},window.localisation.es={confirm:"Sí",server:"Servidor",theme:"Tema",site_customisation:"Personalización del sitio",funding:"Financiación",users:"Usuarios",audit:"Auditoría",apps:"Aplicaciones",channels:"Canales",transactions:"Transacciones",dashboard:"Tablero de instrumentos",node:"Nodo",export_users:"Exportar Usuarios",no_users:"No se encontraron usuarios",total_capacity:"Capacidad Total",avg_channel_size:"Tamaño Medio del Canal",biggest_channel_size:"Tamaño del Canal Más Grande",smallest_channel_size:"Tamaño de canal más pequeño",number_of_channels:"Número de canales",active_channels:"Canales activos",connect_peer:"Conectar Par",connect:"Conectar",open_channel:"Canal Abierto",open:"Abrir",close_channel:"Cerrar canal",close:"Cerrar",restart:"Reiniciar el servidor",save:"Guardar",save_tooltip:"Guardar cambios",credit_debit:"Crédito / Débito",credit_hint:"Presione Enter para cargar la cuenta",credit_label:"Cargar {denomination}",credit_ok:"Éxito al acreditar/debitar fondos virtuales ({amount} sats). Los pagos dependen de los fondos reales en la fuente de financiación.",restart_tooltip:"Reinicie el servidor para aplicar los cambios",add_funds_tooltip:"Agregue fondos a una billetera.",reset_defaults:"Restablecer",reset_defaults_tooltip:"Borrar todas las configuraciones y restablecer a los valores predeterminados.",download_backup:"Descargar copia de seguridad de la base de datos",name_your_wallet:"Nombre de su billetera {name}",paste_invoice_label:"Pegue la factura aquí",lnbits_description:"Fácil de instalar y liviano, LNbits puede ejecutarse en cualquier fuente de financiación de la red Lightning y hasta LNbits mismo! Puede ejecutar LNbits para usted mismo o ofrecer una solución competente a otros. Cada billetera tiene su propia clave API y no hay límite para la cantidad de billeteras que puede crear. La capacidad de particionar fondos hace de LNbits una herramienta útil para la administración de fondos y como herramienta de desarrollo. Las extensiones agregan funcionalidad adicional a LNbits, por lo que puede experimentar con una variedad de tecnologías de vanguardia en la red Lightning. Lo hemos hecho lo más simple posible para desarrollar extensiones y, como un proyecto gratuito y de código abierto, animamos a las personas a que se desarrollen a sí mismas y envíen sus propios contribuciones.",export_to_phone:"Exportar a teléfono con código QR",export_to_phone_desc:"Este código QR contiene su URL de billetera con acceso completo. Puede escanearlo desde su teléfono para abrir su billetera allí.",wallet:"Billetera:",wallets:"Billeteras",add_wallet:"Agregar nueva billetera",delete_wallet:"Eliminar billetera",delete_wallet_desc:"Esta billetera completa se eliminará, los fondos son IRREVERSIBLES.",rename_wallet:"Cambiar el nombre de la billetera",update_name:"Actualizar nombre",fiat_tracking:"Seguimiento Fiat",currency:"Moneda",update_currency:"Actualizar moneda",press_to_claim:"Presione para reclamar Bitcoin",donate:"Donar",view_github:"Ver en GitHub",voidwallet_active:"¡VoidWallet está activo! Pagos desactivados",use_with_caution:"USAR CON CUIDADO - {name} Wallet aún está en BETA",service_fee:"Tarifa de servicio: {amount} % por transacción",service_fee_max:"Tarifa de servicio: {amount} % por transacción (máx {max} sats)",service_fee_tooltip:"Comisión de servicio cobrada por el administrador del servidor LNbits por cada transacción saliente",toggle_darkmode:"Cambiar modo oscuro",payment_reactions:"Reacciones de Pago",view_swagger_docs:"Ver documentación de API de LNbits Swagger",api_docs:"Documentación de API",api_keys_api_docs:"URL del nodo, claves de API y documentación de API",lnbits_version:"Versión de LNbits",runs_on:"Corre en",paste:"Pegar",paste_from_clipboard:"Pegar desde el portapapeles",paste_request:"Pegar solicitud",create_invoice:"Crear factura",camera_tooltip:"Utilice la cámara para escanear una factura / código QR",export_csv:"Exportar a CSV",chart_tooltip:"Mostrar gráfico",pending:"Pendiente",copy_invoice:"Copiar factura",withdraw_from:"Retirar de",cancel:"Cancelar",scan:"Escanear",read:"Leer",pay:"Pagar",memo:"Memo",date:"Fecha",payment_processing:"Procesando pago ...",not_enough_funds:"¡No hay suficientes fondos!",search_by_tag_memo_amount:"Buscar por etiqueta, memo, cantidad",invoice_waiting:"Factura esperando pago",payment_received:"Pago recibido",payment_sent:"Pago enviado",receive:"recibir",send:"enviar",outgoing_payment_pending:"Pago saliente pendiente",drain_funds:"Drenar fondos",drain_funds_desc:"Este es un código QR LNURL-withdraw para drenar todos los fondos de esta billetera. No lo comparta con nadie. Es compatible con balanceCheck y balanceNotify, por lo que su billetera puede continuar drenando los fondos de aquí después del primer drenaje.",i_understand:"Lo entiendo",copy_wallet_url:"Copiar URL de billetera",disclaimer_dialog_title:"¡Importante!",disclaimer_dialog:"La funcionalidad de inicio de sesión se lanzará en una actualización futura, por ahora, asegúrese de guardar esta página como marcador para acceder a su billetera en el futuro. Este servicio está en BETA y no asumimos ninguna responsabilidad por personas que pierdan el acceso a sus fondos.",no_transactions:"No hay transacciones todavía",manage:"Administrar",exchanges:"Intercambios",extensions:"Extensiones",no_extensions:"No tienes extensiones instaladas :(",created:"Creado",search_extensions:"Extensiones de búsqueda",extension_sources:"Fuentes de extensión",ext_sources_hint:"Repositorios desde donde se pueden descargar las extensiones",ext_sources_label:"URL de origen (utilice solo la fuente oficial de la extensión LNbits y fuentes en las que pueda confiar)",warning:"Advertencia",repository:"Repositorio",confirm_continue:"¿Está seguro de que desea continuar?",manage_extension_details:"Instalar/desinstalar extensión",install:"Instalar",uninstall:"Desinstalar",drop_db:"Eliminar datos",enable:"Habilitar",pay_to_enable:"Pagar para habilitar",enable_extension_details:"Habilitar extensión para el usuario actual",disable:"Deshabilitar",delete:"Eliminar",installed:"Instalado",activated:"Activado",deactivated:"Desactivado",release_notes:"Notas de la versión",activate_extension_details:"Hacer que la extensión esté disponible/no disponible para los usuarios",featured:"Destacado",all:"Todos",only_admins_can_install:"(Solo las cuentas de administrador pueden instalar extensiones)",admin_only:"Solo administradores",new_version:"Nueva Versión",extension_depends_on:"Depende de:",extension_rating_soon:"Calificaciones próximamente",extension_installed_version:"Versión instalada",extension_uninstall_warning:"Está a punto de eliminar la extensión para todos los usuarios.",uninstall_confirm:"Sí, desinstalar",extension_db_drop_info:"Todos los datos para la extensión se eliminarán permanentemente. ¡No hay manera de deshacer esta operación!",extension_db_drop_warning:"Está a punto de eliminar todos los datos para la extensión. Por favor, escriba el nombre de la extensión para continuar:",extension_required_lnbits_version:"Esta versión requiere al menos una versión de LNbits",min_version:"Mínimo (incluido)",max_version:"Máximo (excluido)",payment_hash:"Hash de pago",fee:"Cuota",amount:"Cantidad",amount_sats:"Cantidad (sats)",tag:"Etiqueta",unit:"Unidad",description:"Descripción",expiry:"Expiración",webhook:"Webhook",payment_proof:"Prueba de pago",update:"Actualizar",update_available:"¡Actualización {version} disponible!",latest_update:"Usted está en la última versión {version}.",notifications:"Notificaciones",no_notifications:"No hay notificaciones",notifications_disabled:"Las notificaciones de estado de LNbits están desactivadas.",enable_notifications:"Activar notificaciones",enable_notifications_desc:"Si está activado, buscará las últimas actualizaciones del estado de LNbits, como incidentes de seguridad y actualizaciones.",enable_watchdog_desc:"Si está activado, cambiará automáticamente su fuente de financiamiento a VoidWallet si su saldo es inferior al saldo de LNbits. Tendrá que activarlo manualmente después de una actualización.",watchdog_interval:"Intervalo de vigilancia",watchdog_interval_desc:"Con qué frecuencia la tarea de fondo debe verificar la señal de killswitch en el delta del watchdog [node_balance - lnbits_balance] (en minutos).",watchdog_delta:"Vigilante Delta",watchdog_delta_desc:"Límite antes de que el interruptor de apagado cambie la fuente de financiamiento a VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fuente de notificación",notification_source_label:"URL de origen (solo use la fuente oficial de estado de LNbits y fuentes en las que confíe)",more:"más",less:"menos",releases:"Lanzamientos",watchdog:"Perro guardián",server_logs:"Registros del Servidor",ip_blocker:"Bloqueador de IP",security:"Seguridad",security_tools:"Herramientas de seguridad",block_access_hint:"Bloquear acceso por IP",allow_access_hint:"Permitir acceso por IP (anulará las IPs bloqueadas)",enter_ip:"Ingrese la IP y presione enter",rate_limiter:"Limitador de tasa",wallet_limiter:"Limitador de Cartera",wallet_limit_max_withdraw_per_day:"Límite diario de retiro de la cartera en sats (0 para deshabilitar)",wallet_max_ballance:"Saldo máximo de la billetera en sats (0 para desactivar)",wallet_limit_secs_between_trans:"Mín. segs entre transacciones por cartera (0 para desactivar)",number_of_requests:"Número de solicitudes",time_unit:"Unidad de tiempo",minute:"minuto",second:"segundo",hour:"hora",disable_server_log:"Desactivar registro del servidor",enable_server_log:"Activar registro del servidor",coming_soon:"Función próximamente disponible",session_has_expired:"Tu sesión ha expirado. Por favor, inicia sesión de nuevo.",instant_access_question:"¿Quieres acceso instantáneo?",login_with_user_id:"Iniciar sesión con ID de usuario",or:"o",create_new_wallet:"Crear Nueva Cartera",login_to_account:"Inicie sesión en su cuenta",create_account:"Crear cuenta",account_settings:"Configuración de la cuenta",signin_with_nostr:"Continuar con Nostr",signin_with_google:"Inicia sesión con Google",signin_with_github:"Inicia sesión con GitHub",signin_with_keycloak:"Iniciar sesión con Keycloak",username_or_email:"Nombre de usuario o correo electrónico",password:"Contraseña",password_config:"Configuración de Contraseña",password_repeat:"Repetición de contraseña",change_password:"Cambiar contraseña",update_credentials:"Actualizar credenciales",update_pubkey:"Actualizar clave pública",set_password:"Establecer contraseña",invalid_password:"La contraseña debe tener al menos 8 caracteres.",login:"Iniciar sesión",register:"Registrarse",username:"Nombre de usuario",pubkey:"Clave pública",user_id:"Identificación de usuario",email:"Correo electrónico",first_name:"Nombre de pila",last_name:"Apellido",picture:"Imagen",verify_email:"Verifique el correo electrónico con",account:"Cuenta",update_account:"Actualizar cuenta",invalid_username:"Nombre de usuario inválido",auth_provider:"Proveedor de Autenticación",my_account:"Mi cuenta",back:"Atrás",logout:"Cerrar sesión",look_and_feel:"Apariencia",toggle_gradient:"Alternar degradado",gradient_background:"Fondo de gradiente",language:"Idioma",color_scheme:"Esquema de colores",admin_settings:"Configuración del administrador",extension_cost:"Esta versión requiere un pago mínimo de {cost} sats.",extension_paid_sats:"Ya has pagado {paid_sats} sats.",release_details_error:"No se pueden obtener los detalles de la versión.",pay_from_wallet:"Pagar desde la billetera",wallet_required:"Billetera *",show_qr:"Mostrar QR",retry_install:"Reintentar Instalación",new_payment:"Realizar nuevo pago",update_payment:"Actualizar Pago",already_paid_question:"¿Ya has pagado?",sell:"Vender",sell_require:"Solicitar pago para habilitar la extensión",sell_info:"La extensión {name} requiere un pago mínimo de {amount} sats para habilitar.",hide_empty_wallets:"Ocultar billeteras vacías",recheck:"Revisar de nuevo",contributors:"Colaboradores",license:"Licencia",reset_key:"Restablecer clave",reset_password:"Restablecer contraseña",border_choices:"Opciones de Borde",select_all:"Seleccionar todo",nfc_supported:"Compatible con NFC",nfc_not_supported:"NFC no compatible",expire_date:"Fecha de vencimiento:",hash:"Hash:",welcome_lnbits:"Bienvenido a LNbits",setup_su_account:"Configura la cuenta de Superusuario a continuación.",create_ticker_converter:"Crear Convertidor de Ticker de Moneda",enable_audit:"Habilitar auditoría",recommended:"Recomendado",audit_desc:"Registrar solicitudes HTTP de acuerdo con los filtros especificados",audit_record_req:"Registrar cuerpo de solicitud",audit_record_warning:"Advertencia:",audit_record_req_warning_1:"los datos confidenciales (como las contraseñas) serán registrados.",audit_record_req_warning_2:"el cuerpo de la solicitud puede tener un tamaño grande.",audit_record_use:"Úsalo con precaución.",audit_ip:"Registrar Dirección IP",audit_ip_desc:"Registra la dirección IP del cliente",audit_path_params:"Registrar parámetros de ruta",audit_query_params:"Registrar parámetros de consulta",audit_http_methods:"Incluye métodos HTTP",audit_http_methods_hint:"Lista de métodos HTTP a incluir. Las listas vacías significan todos.",audit_http_methods_label:"Métodos HTTP",audit_resp_codes:"Incluir Códigos de Respuesta HTTP",audit_resp_codes_hint:"Lista de códigos HTTP a incluir (coincidencia regex). Listas vacías significan todos. Ej: 4.*, 5.*",audit_resp_codes_label:"Código de respuesta HTTP (regex)",audit_paths:"Incluir rutas",audit_paths_hint:"Lista de rutas a incluir (coincidencia de expresión regular). Lista vacía significa todas.",audit_paths_label:"Ruta HTTP (regex)",audit_paths_exclude:"Excluir rutas",audit_paths_exclude_hint:"Lista de rutas a excluir (coincidencia de expresiones regulares). Lista vacía significa ninguna.",audit_paths_exclude_label:"Ruta HTTP (regex)",exchange_providers:"Proveedores de intercambio",admin_extensions:"Extensiones de Administración",admin_extensions_label:"Extensiones de administración",admin_extensions_hint:"Solo los usuarios con privilegios de administrador pueden usar extensiones.",user_default_extensions:"Extensiones predeterminadas del usuario",user_default_extensions_label:"Extensiones de usuario",user_default_extensions_hint:"Extensiones que estarán habilitadas de forma predeterminada para los usuarios.",miscellanous:"Misceláneo",misc_disable_extensions:"Desactivar extensiones",misc_disable_extensions_label:"Desactivar todas las extensiones",misc_hide_api:"Ocultar API",misc_hide_api_label:"Oculta la API de la billetera, las extensiones pueden optar por respetar",wallets_management:"Gestión de Carteras",funding_source_info:"Información sobre la Fuente de Financiamiento",funding_source:"Fuente de financiamiento: {wallet_class}",node_balance:"Balance de Nodo: {balance} sats",lnbits_balance:"Saldo de LNbits: {balance} sats",funding_reserve_percent:"Reserve Porcentaje: {percent} %",node_management:"Gestión de nodos",node_management_not_supported:"La gestión de nodos no es compatible con la fuente de financiación activa",toggle_node_ui:"Interfaz de usuario de nodo",toggle_public_node_ui:"Interfaz Pública de Nodo",toggle_transactions_node_ui:"Pestaña de transacciones (desactivar en nodos CLN grandes)",invoice_expiry:"Vencimiento de la Factura",invoice_expiry_label:"Expiración de la factura (segundos)",fee_reserve:"Reserva de tarifa",fee_reserve_msats:"Cuota de reserva en msats",fee_reserve_percent:"Tasa de reserva en porcentaje",server_management:"Gestión del Servidor",base_url:"URL base",base_url_label:"URL base estática para el servidor",authentication:"Autenticación",auth_token_expiry_label:"Minutos de vencimiento del token",auth_token_expiry_hint:"Tiempo en minutos hasta que el token expire",auth_allowed_methods_label:"Métodos de autorización permitidos",auth_allowed_methods_hint:"Seleccione métodos de autorización",auth_nostr_label:"URL de solicitud Nostr",auth_nostr_hint:"URL absoluto que los clientes utilizarán para iniciar sesión.",auth_google_ci_label:"ID de cliente de Google",auth_google_ci_hint:"Asegúrate de que los URIs de redirección autorizados contengan https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Secreto del Cliente de Google",auth_gh_client_id_label:"ID de cliente de GitHub",auth_gh_client_id_hint:"Asegúrate de que la URL de devolución de llamada de autorización esté configurada en https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Secreto del cliente de GitHub",auth_keycloak_label:"URL de descubrimiento de Keycloak",auth_keycloak_ci_label:"ID de cliente de Keycloak",auth_keycloak_ci_hint:"Asegúrate de que la URL de devolución de llamada de autorización esté configurada en https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Secreto del Cliente de Keycloak",auth_keycloak_custom_org_label:"Organización personalizada de Keycloak",auth_keycloak_custom_icon_label:"Icono personalizado de Keycloak (URL)",auth_oidc_label:"URL de descubrimiento de OIDC",auth_oidc_ci_label:"ID de cliente de OIDC",auth_oidc_ci_hint:"Asegúrate de que la URL de devolución de llamada de autorización esté configurada en https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Secreto del Cliente de OIDC",auth_oidc_custom_org_label:"Nombre de organización personalizada OIDC (ej. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Icono personalizado de OIDC (URL)",currency_settings:"Configuración de moneda",allowed_currencies:"Monedas permitidas",allowed_currencies_hint:"Limite el número de monedas fiduciarias disponibles",default_account_currency:"Moneda predeterminada de la cuenta",default_account_currency_hint:"Moneda predeterminada para contabilidad",service_fee_label:"Tarifa de servicio (%)",service_fee_hint:"Tarifa cobrada por tx (%)",service_fee_max_label:"Tarifa de servicio máx (sats)",service_fee_max_hint:"Tarifa máxima por servicio a cobrar en (sats)",fee_wallet:"Billetera de Tarifas",fee_wallet_label:"Billetera de tarifas (ID de billetera)",fee_wallet_hint:"ID de la billetera a la que enviar fondos",disable_fee:"Desactivar tarifa",disable_fee_internal:"Desactivar tarifa de servicio para pagos internos",disable_fee_internal_desc:"Desactivar tarifa de servicio para pagos internos Lightning",ui_management:"Gestión de la interfaz de usuario",ui_site_title:"Título del Sitio",ui_site_tagline:"Lema del sitio",ui_elements_enable:"Habilitar elementos en la página de inicio",ui_elements_disable:"Desactivar elementos en la página de inicio",ui_toggle_elements_tip:"Eliminar elementos de la página de inicio como 'funciona en', etc.",ui_site_description:"Descripción del sitio",ui_site_description_hint:"Usa texto sin formato, Markdown o HTML sin procesar",ui_default_wallet_name:"Nombre predeterminado de la billetera",lnbits_wallet:"Cartera LNbits",denomination:"Denominación",denomination_hint:"El nombre para el token FakeWallet",ui_qr_code_logo:"Logo de código QR",ui_qr_code_logo_hint:"URL a la imagen del logo en el código QR",ui_custom_badge:"Insignia personalizada",ui_custom_badge_label:"Insignia personalizada 'USAR CON PRECAUCIÓN - La billetera LNbits aún está en BETA'",ui_custom_badge_color_label:"Color personalizado de insignia",themes:"Temas",themes_hint:"Elige los temas disponibles para los usuarios",custom_logo:"Logotipo personalizado",custom_logo_hint:"URL a la imagen del logo",ad_space_title:"Título del Espacio Publicitario",ad_space_title_label:"Respaldado por",ad_slots:"Espacios publicitarios",ad_slots_hint:"URL de anuncio y rutas de archivo de imagen en formato CSV, las extensiones pueden optar por respetar",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Anuncios habilitados",ads_disabled:"Anuncios desactivados",user_management:"Gestión de Usuarios",admin_users:"Usuarios Administradores",admin_users_hint:"Usuarios con privilegios de administrador",admin_users_label:"ID de usuario",allowed_users:"Usuarios Permitidos",allowed_users_hint:"Solo estos usuarios pueden usar LNbits",allowed_users_label:"ID de usuario",allow_creation_user:"Permitir la creación de nuevos usuarios",allow_creation_user_desc:"Permitir la creación de nuevos usuarios en la página de índice",components:"Componentes",long_running_endpoints:"Principales 5 puntos de conexión de larga duración",http_request_methods:"Métodos de solicitud HTTP",http_response_codes:"Códigos de Respuesta HTTP",request_details:"Detalles de la solicitud",http_request_details:"Detalles de la Solicitud HTTP"},window.localisation.fr={confirm:"Oui",server:"Serveur",theme:"Thème",site_customisation:"Personnalisation du site",funding:"Financement",users:"Utilisateurs",audit:"Audit",apps:"Applications",channels:"Canaux",transactions:"Transactions",dashboard:"Tableau de bord",node:"Noeud",export_users:"Exporter les utilisateurs",no_users:"Aucun utilisateur trouvé",total_capacity:"Capacité totale",avg_channel_size:"Taille moyenne du canal",biggest_channel_size:"Taille de canal maximale",smallest_channel_size:"Taille de canal la plus petite",number_of_channels:"Nombre de canaux",active_channels:"Canaux actifs",connect_peer:"Connecter un pair",connect:"Connecter",open_channel:"Ouvrir le canal",open:"Ouvrir",close_channel:"Fermer le canal",close:"Fermer",restart:"Redémarrer le serveur",save:"Enregistrer",save_tooltip:"Enregistrer vos modifications",credit_debit:"Crédit / Débit",credit_hint:"Appuyez sur Entrée pour créditer le compte",credit_label:"{denomination} à créditer",credit_ok:"Succès du crédit/débit des fonds virtuels ({amount} sats). Les paiements dépendent des fonds réels sur la source de financement.",restart_tooltip:"Redémarrez le serveur pour que les changements prennent effet",add_funds_tooltip:"Ajouter des fonds à un portefeuille.",reset_defaults:"Réinitialiser aux valeurs par défaut",reset_defaults_tooltip:"Supprimer tous les paramètres et les réinitialiser aux valeurs par défaut.",download_backup:"Télécharger la sauvegarde de la base de données",name_your_wallet:"Nommez votre portefeuille {name}",paste_invoice_label:"Coller une facture, une demande de paiement ou un code lnurl *",lnbits_description:"Facile à installer et léger, LNbits peut fonctionner sur n'importe quelle source de financement du réseau Lightning et même LNbits lui-même! Vous pouvez exécuter LNbits pour vous-même ou offrir facilement une solution de gardien pour les autres. Chaque portefeuille a ses propres clés API et il n'y a pas de limite au nombre de portefeuilles que vous pouvez créer. La capacité de partitionner les fonds rend LNbits un outil utile pour la gestion de l'argent et comme outil de développement. Les extensions ajoutent une fonctionnalité supplémentaire à LNbits afin que vous puissiez expérimenter une gamme de technologies de pointe sur le réseau Lightning. Nous avons rendu le développement d'extensions aussi simple que possible et, en tant que projet gratuit et open source, nous encourageons les gens à développer et à soumettre les leurs.",export_to_phone:"Exporter vers le téléphone avec un code QR",export_to_phone_desc:"Ce code QR contient l'URL de votre portefeuille avec un accès complet. Vous pouvez le scanner depuis votre téléphone pour ouvrir votre portefeuille depuis là-bas.",wallet:"Portefeuille :",wallets:"Portefeuilles",add_wallet:"Ajouter un nouveau portefeuille",delete_wallet:"Supprimer le portefeuille",delete_wallet_desc:"Ce portefeuille entier sera supprimé et les fonds seront IRRECUPERABLES.",rename_wallet:"Renommer le portefeuille",update_name:"Mettre à jour le nom",fiat_tracking:"Suivi Fiat",currency:"Devise",update_currency:"Mettre à jour la devise",press_to_claim:"Appuyez pour demander du Bitcoin",donate:"Donner",view_github:"Voir sur GitHub",voidwallet_active:"VoidWallet est actif! Paiements désactivés",use_with_caution:"UTILISER AVEC PRUDENCE - Le portefeuille {name} est toujours en version BETA",service_fee:"Frais de service : {amount} % par transaction",service_fee_max:"Frais de service : {amount} % par transaction (max {max} sats)",service_fee_tooltip:"Frais de service facturés par l'administrateur du serveur LNbits pour chaque transaction sortante",toggle_darkmode:"Basculer le mode sombre",payment_reactions:"Réactions de paiement",view_swagger_docs:"Voir les documentation de l'API Swagger de LNbits",api_docs:"Documentation de l'API",api_keys_api_docs:"URL du nœud, clés API et documentation API",lnbits_version:"Version de LNbits",runs_on:"Fonctionne sur",paste:"Coller",paste_from_clipboard:"Coller depuis le presse-papiers",paste_request:"Coller la requête",create_invoice:"Créer une facture",camera_tooltip:"Utiliser la caméra pour scanner une facture / un code QR",export_csv:"Exporter vers CSV",chart_tooltip:"Afficher le graphique",pending:"En attente",copy_invoice:"Copier la facture",withdraw_from:"Retirer de",cancel:"Annuler",scan:"Scanner",read:"Lire",pay:"Payer",memo:"Mémo",date:"Date",payment_processing:"Traitement du paiement...",not_enough_funds:"Fonds insuffisants !",search_by_tag_memo_amount:"Rechercher par tag, mémo, montant",invoice_waiting:"Facture en attente de paiement",payment_received:"Paiement reçu",payment_sent:"Paiement envoyé",receive:"recevoir",send:"envoyer",outgoing_payment_pending:"Paiement sortant en attente",drain_funds:"Vider les fonds",drain_funds_desc:"Il s'agit d'un code QR LNURL-withdraw pour tout aspirer de ce portefeuille. Ne le partagez avec personne. Il est compatible avec balanceCheck et balanceNotify, de sorte que votre portefeuille peut continuer à retirer les fonds continuellement à partir d'ici après le premier retrait.",i_understand:"J'ai compris",copy_wallet_url:"Copier l'URL du portefeuille",disclaimer_dialog_title:"Important !",disclaimer_dialog:"La fonctionnalité de connexion sera publiée dans une future mise à jour, pour l'instant, assurez-vous de mettre cette page en favori pour accéder à votre portefeuille ultérieurement ! Ce service est en BETA, et nous ne sommes pas responsables des personnes qui perdent l'accès à leurs fonds.",no_transactions:"Aucune transaction effectuée pour le moment",manage:"Gérer",exchanges:"Échanges",extensions:"Extensions",no_extensions:"Vous n'avez installé aucune extension :(",created:"Créé",search_extensions:"Rechercher des extensions",extension_sources:"Sources d'extension",ext_sources_hint:"Dépôts à partir desquels les extensions peuvent être téléchargées",ext_sources_label:"URL source (utilisez uniquement la source officielle de l'extension LNbits et des sources fiables)",warning:"Avertissement",repository:"Référentiel",confirm_continue:"Êtes-vous sûr de vouloir continuer ?",manage_extension_details:"Installer/désinstaller l'extension",install:"Installer",uninstall:"Désinstaller",drop_db:"Supprimer les données",enable:"Activer",pay_to_enable:"Payer pour activer",enable_extension_details:"Activer l'extension pour l'utilisateur actuel",disable:"Désactiver",delete:"Supprimer",installed:"Installé",activated:"Activé",deactivated:"Désactivé",release_notes:"Notes de version",activate_extension_details:"Rendre l'extension disponible/indisponible pour les utilisateurs",featured:"Mis en avant",all:"Tout",only_admins_can_install:"Seuls les comptes administrateurs peuvent installer des extensions",admin_only:"Réservé aux administrateurs",new_version:"Nouvelle version",extension_depends_on:"Dépend de :",extension_rating_soon:"Notes des utilisateurs à venir bientôt",extension_installed_version:"Version installée",extension_uninstall_warning:"Vous êtes sur le point de supprimer l'extension pour tous les utilisateurs.",uninstall_confirm:"Oui, Désinstaller",extension_db_drop_info:"Toutes les données pour l'extension seront supprimées de manière permanente. Il n'est pas possible d'annuler cette opération !",extension_db_drop_warning:"Vous êtes sur le point de supprimer toutes les données de l'extension. Veuillez taper le nom de l'extension pour continuer :",extension_required_lnbits_version:"Cette version nécessite au moins LNbits version",min_version:"Minimum (inclus)",max_version:"Maximum (exclu)",payment_hash:"Hash de paiement",fee:"Frais",amount:"Montant",amount_sats:"Montant (sats)",tag:"Étiqueter",unit:"Unité",description:"Description",expiry:"Expiration",webhook:"Webhook",payment_proof:"Preuve de paiement",update:"Mettre à jour",update_available:"Mise à jour {version} disponible !",latest_update:"Vous êtes sur la dernière version {version}.",notifications:"Notifications",no_notifications:"Aucune notification",notifications_disabled:"Les notifications de statut LNbits sont désactivées.",enable_notifications:"Activer les notifications",enable_notifications_desc:"Si activé, il récupérera les dernières mises à jour du statut LNbits, telles que les incidents de sécurité et les mises à jour.",enable_watchdog:"Activer le Watchdog",enable_watchdog_desc:"Si elle est activée, elle changera automatiquement votre source de financement en VoidWallet si votre solde est inférieur au solde LNbits. Vous devrez activer manuellement après une mise à jour.",watchdog_interval:"Intervalle du gardien",watchdog_interval_desc:"À quelle fréquence la tâche en arrière-plan doit-elle vérifier la présence d'un signal d'arrêt d'urgence dans le delta du gardien [node_balance - lnbits_balance] (en minutes).",watchdog_delta:"Chien de garde Delta",watchdog_delta_desc:"Limite avant que l'interrupteur d'arrêt ne change la source de financement pour VoidWallet [lnbits_balance - node_balance > delta]",status:"Statut",notification_source:"Source de notification",notification_source_label:"URL source (utilisez uniquement la source officielle de statut LNbits et des sources de confiance)",more:"plus",less:"moins",releases:"Versions",watchdog:"Chien de garde",server_logs:"Journaux du serveur",ip_blocker:"Bloqueur d'IP",security:"Sécurité",security_tools:"Outils de sécurité",block_access_hint:"Bloquer l'accès par IP",allow_access_hint:"Autoriser l'accès par IP (cela passera outre les IP bloquées)",enter_ip:"Entrez l'adresse IP et appuyez sur Entrée",rate_limiter:"Limiteur de débit",wallet_limiter:"Limiteur de portefeuille",wallet_limit_max_withdraw_per_day:"Retrait quotidien maximum du portefeuille en sats (0 pour désactiver)",wallet_max_ballance:"Solde maximum du portefeuille en sats (0 pour désactiver)",wallet_limit_secs_between_trans:"Minutes et secondes entre les transactions par portefeuille (0 pour désactiver)",number_of_requests:"Nombre de requêtes",time_unit:"Unité de temps",minute:"minute",second:"seconde",hour:"heure",disable_server_log:"Désactiver le journal du serveur",enable_server_log:"Activer le journal du serveur",coming_soon:"Fonctionnalité à venir bientôt",session_has_expired:"Votre session a expiré. Veuillez vous reconnecter.",instant_access_question:"Voulez-vous un accès instantané ?",login_with_user_id:"Connexion avec l'identifiant utilisateur",or:"ou",create_new_wallet:"Créer un nouveau portefeuille",login_to_account:"Connectez-vous à votre compte",create_account:"Créer un compte",account_settings:"Paramètres du compte",signin_with_nostr:"Continuer avec Nostr",signin_with_google:"Connectez-vous avec Google",signin_with_github:"Connectez-vous avec GitHub",signin_with_keycloak:"Connectez-vous avec Keycloak",username_or_email:"Nom d'utilisateur ou e-mail",password:"Mot de passe",password_config:"Configuration du mot de passe",password_repeat:"Répétition du mot de passe",change_password:"Changer le mot de passe",update_credentials:"Mettre à jour les informations d'identification",update_pubkey:"Mettre à jour la clé publique",set_password:"Définir le mot de passe",invalid_password:"Le mot de passe doit comporter au moins 8 caractères",login:"Connexion",register:"Inscrire",username:"Nom d'utilisateur",pubkey:"Clé publique",user_id:"Identifiant utilisateur",email:"E-mail",first_name:"Prénom",last_name:"Nom de famille",picture:"Image",verify_email:"Vérifiez l'e-mail avec",account:"Compte",update_account:"Mettre à jour le compte",invalid_username:"Nom d'utilisateur invalide",auth_provider:"Fournisseur d'authentification",my_account:"Mon compte",back:"Retour",logout:"Déconnexion",look_and_feel:"Apparence",toggle_gradient:"Basculer le dégradé",gradient_background:"Fond en dégradé",language:"Langue",color_scheme:"Schéma de couleurs",admin_settings:"Paramètres administrateur",extension_cost:"Cette version nécessite un paiement minimum de {cost} sats.",extension_paid_sats:"Vous avez déjà payé {paid_sats} sats.",release_details_error:"Impossible d'obtenir les détails de la version.",pay_from_wallet:"Payer depuis le portefeuille",wallet_required:"Portefeuille *",show_qr:"Afficher le QR",retry_install:"Réessayer l'installation",new_payment:"Effectuer un nouveau paiement",update_payment:"Mettre à jour le paiement",already_paid_question:"Avez-vous déjà payé ?",sell:"Vendre",sell_require:"Demander un paiement pour activer l'extension",sell_info:"L'extension {name} nécessite un paiement minimum de {amount} sats pour être activée.",hide_empty_wallets:"Masquer les portefeuilles vides",recheck:"Revérifier",contributors:"Contributeurs",license:"Licence",reset_key:"Réinitialiser la clé",reset_password:"Réinitialiser le mot de passe",border_choices:"Choix de bordure",select_all:"Sélectionner tout",nfc_supported:"NFC pris en charge",nfc_not_supported:"NFC non pris en charge",expire_date:"Date d'expiration :",hash:"Hash :",welcome_lnbits:"Bienvenue à LNbits",setup_su_account:"Configurez le compte Superuser ci-dessous.",create_ticker_converter:"Créer un convertisseur de code de devise",enable_audit:"Activer l'audit",recommended:"Recommandé",audit_desc:"Enregistrer les requêtes HTTP selon les filtres spécifiés",audit_record_req:"Enregistrer le corps de la demande",audit_record_warning:"Avertissement :",audit_record_req_warning_1:"les données confidentielles (comme les mots de passe) seront enregistrées.",audit_record_req_warning_2:"le corps de la requête peut être de grande taille.",audit_record_use:"Utilisez-le avec précaution.",audit_ip:"Enregistrer l'adresse IP",audit_ip_desc:"Enregistrer l'adresse IP du client",audit_path_params:"Enregistrer les paramètres de chemin",audit_query_params:"Enregistrer les paramètres de la requête",audit_http_methods:"Inclure les méthodes HTTP",audit_http_methods_hint:"Liste des méthodes HTTP à inclure. Listes vides signifie toutes.",audit_http_methods_label:"Méthodes HTTP",audit_resp_codes:"Inclure les codes de réponse HTTP",audit_resp_codes_hint:"Liste des codes HTTP à inclure (correspondance regex). Les listes vides signifient tout. Ex : 4.*, 5.*",audit_resp_codes_label:"Code de réponse HTTP (regex)",audit_paths:"Inclure des chemins",audit_paths_hint:"Liste des chemins à inclure (correspondance regex). Liste vide signifie tout.",audit_paths_label:"Chemin HTTP (regex)",audit_paths_exclude:"Exclure les chemins",audit_paths_exclude_hint:"Liste des chemins à exclure (correspondance regex). Liste vide signifie aucun.",audit_paths_exclude_label:"Chemin HTTP (regex)",exchange_providers:"Fournisseurs d'échange",admin_extensions:"Extensions d'administration",admin_extensions_label:"Extensions d'administration",admin_extensions_hint:"Seuls les utilisateurs avec des privilèges d'administrateur peuvent utiliser les extensions.",user_default_extensions:"Extensions par défaut de l'utilisateur",user_default_extensions_label:"Extensions utilisateur",user_default_extensions_hint:"Extensions qui seront activées par défaut pour les utilisateurs.",miscellanous:"Divers",misc_disable_extensions:"Désactiver les extensions",misc_disable_extensions_label:"Désactiver toutes les extensions",misc_hide_api:"Masquer l'API",misc_hide_api_label:"Masque l'API du portefeuille, les extensions peuvent choisir de respecter",wallets_management:"Gestion des portefeuilles",funding_source_info:"Informations sur la source de financement",funding_source:"Source de financement : {wallet_class}",node_balance:"Solde du nœud : {balance} sats",lnbits_balance:"Solde LNbits : {balance} sats",funding_reserve_percent:"Pourcentage de Réserve : {percent} %",node_management:"Gestion des nœuds",node_management_not_supported:"La gestion des nœuds n'est pas prise en charge par la source de financement active",toggle_node_ui:"Interface utilisateur de nœud",toggle_public_node_ui:"Interface utilisateur du nœud public",toggle_transactions_node_ui:"Onglet des transactions (Désactiver sur les grands nœuds CLN)",invoice_expiry:"Expiration de la facture",invoice_expiry_label:"Expiration de la facture (secondes)",fee_reserve:"Réserve de frais",fee_reserve_msats:"Frais de réservation en msats",fee_reserve_percent:"Frais de réservation en pourcentage",server_management:"Gestion de serveur",base_url:"URL de base",base_url_label:"URL statique/de base pour le serveur",authentication:"Authentification",auth_token_expiry_label:"Durée d'expiration du jeton (en minutes)",auth_token_expiry_hint:"Durée en minutes avant l'expiration du jeton",auth_allowed_methods_label:"Méthodes d'autorisation autorisées",auth_allowed_methods_hint:"Sélectionnez les méthodes d'autorisation",auth_nostr_label:"URL de requête Nostr",auth_nostr_hint:"URL absolue que les clients utiliseront pour se connecter.",auth_google_ci_label:"ID Client Google",auth_google_ci_hint:"Assurez-vous que les URIs de redirection autorisées contiennent https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Secret client Google",auth_gh_client_id_label:"Identifiant client GitHub",auth_gh_client_id_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Secret Client GitHub",auth_keycloak_label:"URL de découverte Keycloak",auth_keycloak_ci_label:"ID Client Keycloak",auth_keycloak_ci_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Secret client Keycloak",auth_keycloak_custom_org_label:"Organisation personnalisée Keycloak",auth_keycloak_custom_icon_label:"Icône personnalisée Keycloak (URL)",auth_oidc_label:"URL de découverte OIDC",auth_oidc_ci_label:"ID Client OIDC",auth_oidc_ci_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Secret client OIDC",auth_oidc_custom_org_label:"Nom de l'organisation personnalisée OIDC (par ex. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Icône personnalisée OIDC (URL)",currency_settings:"Paramètres de devise",allowed_currencies:"Devises autorisées",allowed_currencies_hint:"Limiter le nombre de devises fiduciaires disponibles",default_account_currency:"Devise par défaut du compte",default_account_currency_hint:"Devise par défaut pour la comptabilité",service_fee_label:"Frais de service (%)",service_fee_hint:"Frais facturés par tx (%)",service_fee_max_label:"Frais de service max (sats)",service_fee_max_hint:"Frais de service maximum à facturer en (sats)",fee_wallet:"Portefeuille de frais",fee_wallet_label:"Portefeuille de frais (ID de portefeuille)",fee_wallet_hint:"Identifiant de portefeuille pour envoyer des fonds à",disable_fee:"Désactiver les frais",disable_fee_internal:"Désactiver les frais de service pour les paiements internes",disable_fee_internal_desc:"Désactiver les frais de service pour les paiements Lightning internes",ui_management:"Gestion de l'interface utilisateur",ui_site_title:"Titre du site",ui_site_tagline:"Slogan du site",ui_elements_enable:"Activer les éléments sur la page d'accueil",ui_elements_disable:"Désactiver les éléments sur la page d'accueil",ui_toggle_elements_tip:"Supprimer les éléments de la page d'accueil comme 'fonctionne avec', etc.",ui_site_description:"Description du site",ui_site_description_hint:"Utilisez du texte brut, du Markdown ou du HTML brut",ui_default_wallet_name:"Nom par Défaut du Portefeuille",lnbits_wallet:"Portefeuille LNbits",denomination:"Dénomination",denomination_hint:"Le nom du jeton FakeWallet",ui_qr_code_logo:"Logo de code QR",ui_qr_code_logo_hint:"URL de l'image du logo dans le code QR",ui_custom_badge:"Badge personnalisé",ui_custom_badge_label:"Badge personnalisé 'À UTILISER AVEC PRÉCAUTION - Le portefeuille LNbits est encore en BÊTA'",ui_custom_badge_color_label:"Couleur de badge personnalisée",themes:"Thèmes",themes_hint:"Choisissez des thèmes disponibles pour les utilisateurs",custom_logo:"Logo personnalisé",custom_logo_hint:"URL de l'image du logo",ad_space_title:"Titre de l'espace publicitaire",ad_space_title_label:"Soutenu par",ad_slots:"Emplacements publicitaires",ad_slots_hint:"URL de l'annonce et chemins des fichiers image au format CSV, les extensions peuvent choisir de respecter",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Annonces activées",ads_disabled:"Publicités désactivées",user_management:"Gestion des utilisateurs",admin_users:"Utilisateurs administrateurs",admin_users_hint:"Utilisateurs avec des privilèges d'administration",admin_users_label:"Identifiant utilisateur",allowed_users:"Utilisateurs autorisés",allowed_users_hint:"Seuls ces utilisateurs peuvent utiliser LNbits",allowed_users_label:"ID utilisateur",allow_creation_user:"Autoriser la création de nouveaux utilisateurs",allow_creation_user_desc:"Permettre la création de nouveaux utilisateurs sur la page d’index",components:"Composants",long_running_endpoints:"Top 5 points de terminaison longue durée",http_request_methods:"Méthodes de requête HTTP",http_response_codes:"Codes de réponse HTTP",request_details:"Détails de la demande",http_request_details:"Détails de la requête HTTP"},window.localisation.it={confirm:"Sì",server:"Server",theme:"Tema",site_customisation:"Personalizzazione del sito",funding:"Funding",users:"Utenti",audit:"Verifica",apps:"Applicazioni",channels:"Canali",transactions:"Transazioni",dashboard:"Pannello di controllo",node:"Interruttore",export_users:"Esporta utenti",no_users:"Nessun utente trovato",total_capacity:"Capacità Totale",avg_channel_size:"Dimensione media del canale",biggest_channel_size:"Dimensione del canale più grande",smallest_channel_size:"Dimensione Più Piccola del Canale",number_of_channels:"Numero di Canali",active_channels:"Canali Attivi",connect_peer:"Connetti Peer",connect:"Connetti",open_channel:"Canale aperto",open:"Apri",close_channel:"Chiudi Canale",close:"Chiudi",restart:"Riavvia il server",save:"Salva",save_tooltip:"Salva le modifiche",credit_debit:"Credito / Debito",credit_hint:"Premere Invio per accreditare i fondi",credit_label:"{denomination} da accreditare",credit_ok:"Credito/addebito riuscito di fondi virtuali ({amount} sats). I pagamenti dipendono dai fondi effettivi sulla fonte di finanziamento.",restart_tooltip:"Riavvia il server affinché le modifiche abbiano effetto",add_funds_tooltip:"Aggiungere fondi a un portafoglio",reset_defaults:"Ripristina le impostazioni predefinite",reset_defaults_tooltip:"Cancella tutte le impostazioni e ripristina i valori predefiniti",download_backup:"Scarica il backup del database",name_your_wallet:"Dai un nome al tuo portafoglio {name}",paste_invoice_label:"Incolla una fattura, una richiesta di pagamento o un codice lnurl *",lnbits_description:"Leggero e facile da configurare, LNbits può funzionare su qualsiasi fonte di finanziamento Lightning Network e persino LNbits stesso! Potete gestire LNbits per conto vostro o offrire facilmente una soluzione di custodia per altri. Ogni portafoglio ha le proprie chiavi API e non c'è limite al numero di portafogli che si possono creare. La possibilità di suddividere i fondi rende LNbits uno strumento utile per la gestione del denaro e come strumento di sviluppo. Le estensioni aggiungono ulteriori funzionalità a LNbits, consentendo di sperimentare una serie di tecnologie all'avanguardia sulla rete Lightning. Abbiamo reso lo sviluppo delle estensioni il più semplice possibile e, in quanto progetto libero e open-source, incoraggiamo le persone a sviluppare e inviare le proprie",export_to_phone:"Esportazione su telefono con codice QR",export_to_phone_desc:"Questo codice QR contiene l'URL del portafoglio con accesso da amministratore. È possibile scansionarlo dal telefono per aprire il portafoglio da lì.",wallet:"Portafoglio:",wallets:"Portafogli",add_wallet:"Aggiungi un nuovo portafoglio",delete_wallet:"Elimina il portafoglio",delete_wallet_desc:"L'intero portafoglio sarà cancellato, i fondi saranno irrecuperabili",rename_wallet:"Rinomina il portafoglio",update_name:"Aggiorna il nome",fiat_tracking:"Tracciamento Fiat",currency:"Valuta",update_currency:"Aggiorna valuta",press_to_claim:"Premi per richiedere bitcoin",donate:"Donazioni",view_github:"Visualizza su GitHub",voidwallet_active:"VoidWallet è attivo! Pagamenti disabilitati",use_with_caution:"USARE CON CAUTELA - {name} portafoglio è ancora in BETA",service_fee:"Commissione di servizio: {amount} % per transazione",service_fee_max:"Commissione di servizio: {amount} % per transazione (max {max} sats)",service_fee_tooltip:"Commissione di servizio addebitata dall'amministratore del server LNbits per ogni transazione in uscita",toggle_darkmode:"Attiva la modalità notturna",payment_reactions:"Reazioni al Pagamento",view_swagger_docs:"Visualizza i documentazione dell'API Swagger di LNbits",api_docs:"Documentazione dell'API",api_keys_api_docs:"URL del nodo, chiavi API e documentazione API",lnbits_version:"Versione di LNbits",runs_on:"Esegue su",paste:"Incolla",paste_from_clipboard:"Incolla dagli appunti",paste_request:"Richiesta di pagamento",create_invoice:"Crea fattura",camera_tooltip:"Usa la fotocamera per scansionare la fattura/QR",export_csv:"Esporta CSV",chart_tooltip:"Mostra grafico",pending:"In attesa",copy_invoice:"Copia fattura",withdraw_from:"Prelevare da",cancel:"Annulla",scan:"Scansiona",read:"Leggi",pay:"Paga",memo:"Memo",date:"Dati",payment_processing:"Elaborazione pagamento...",not_enough_funds:"Non ci sono abbastanza fondi!",search_by_tag_memo_amount:"Cerca per tag, memo, importo...",invoice_waiting:"Fattura in attesa di pagamento",payment_received:"Pagamento ricevuto",payment_sent:"Pagamento inviato",receive:"ricevere",send:"inviare",outgoing_payment_pending:"Pagamento in uscita in attesa",drain_funds:"Fondi di drenaggio",drain_funds_desc:"Questo è un codice QR LNURL-withdraw per prelevare tutti i fondi da questo portafoglio. Non condividerlo con nessuno. È compatibile con balanceCheck e balanceNotify, di conseguenza il vostro portafoglio può continuare a prelevare continuamente i fondi da qui dopo il primo prelievo",i_understand:"Ho capito",copy_wallet_url:"Copia URL portafoglio",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"La funzionalità di login sarà rilasciata in un futuro aggiornamento; per ora, assicuratevi di salvare tra i preferiti questa pagina per accedere nuovamente in futuro a questo portafoglio! Questo servizio è in fase BETA e non ci assumiamo alcuna responsabilità per la perdita all'accesso dei fondi",no_transactions:"Nessuna transazione effettuata",manage:"Gestisci",exchanges:"Scambi",extensions:"Estensioni",no_extensions:"Non ci sono estensioni installate :(",created:"Creato",search_extensions:"Estensioni di ricerca",extension_sources:"Fonti di estensione",ext_sources_hint:"Repository da cui è possibile scaricare le estensioni",ext_sources_label:"URL di origine (utilizzare solo la fonte ufficiale dell'estensione LNbits e fonti affidabili)",warning:"Attenzione",repository:"Deposito",confirm_continue:"Sei sicuro di voler continuare?",manage_extension_details:"Installa/disinstalla estensione",install:"Installare",uninstall:"Disinstalla",drop_db:"Rimuovi Dati",enable:"Abilita",pay_to_enable:"Paga per abilitare",enable_extension_details:"Attiva l'estensione per l'utente corrente",disable:"Disabilita",delete:"Elimina",installed:"Installato",activated:"Attivato",deactivated:"Disattivato",release_notes:"Note di Rilascio",activate_extension_details:"Rendi l'estensione disponibile/non disponibile per gli utenti",featured:"In primo piano",all:"Tutto",only_admins_can_install:"Solo gli account amministratore possono installare estensioni.",admin_only:"Solo amministratore",new_version:"Nuova Versione",extension_depends_on:"Dipende da:",extension_rating_soon:"Valutazioni in arrivo",extension_installed_version:"Versione installata",extension_uninstall_warning:"Stai per rimuovere l'estensione per tutti gli utenti.",uninstall_confirm:"Sì, Disinstalla",extension_db_drop_info:"Tutti i dati relativi all'estensione saranno cancellati permanentemente. Non c'è modo di annullare questa operazione!",extension_db_drop_warning:"Stai per rimuovere tutti i dati per l'estensione. Digita il nome dell'estensione per continuare:",extension_required_lnbits_version:"Questa versione richiede almeno la versione LNbits",min_version:"Minimo (incluso)",max_version:"Massimo (escluso)",payment_hash:"Hash del pagamento",fee:"Tariffa",amount:"Importo",amount_sats:"Importo (sats)",tag:"Etichetta",unit:"Unità",description:"Descrizione",expiry:"Scadenza",webhook:"Webhook",payment_proof:"Prova di pagamento",update:"Aggiorna",update_available:"Aggiornamento {version} disponibile!",latest_update:"Sei sulla versione più recente {version}.",notifications:"Notifiche",no_notifications:"Nessuna notifica",notifications_disabled:"Le notifiche di stato di LNbits sono disattivate.",enable_notifications:"Attiva le notifiche",enable_notifications_desc:"Se attivato, recupererà gli ultimi aggiornamenti sullo stato di LNbits, come incidenti di sicurezza e aggiornamenti.",enable_watchdog:"Attiva Watchdog",enable_watchdog_desc:"Se abilitato, cambierà automaticamente la tua fonte di finanziamento in VoidWallet se il tuo saldo è inferiore al saldo LNbits. Dovrai abilitarlo manualmente dopo un aggiornamento.",watchdog_interval:"Intervallo Watchdog",watchdog_interval_desc:"Quanto spesso il task in background dovrebbe controllare un segnale di killswitch nel delta del watchdog [node_balance - lnbits_balance] (in minuti).",watchdog_delta:"Guardiano Delta",watchdog_delta_desc:"Limite prima che l'interruttore di sicurezza modifichi la fonte di finanziamento in VoidWallet [lnbits_balance - node_balance > delta]",status:"Stato",notification_source:"Sorgente di notifica",notification_source_label:"URL sorgente (utilizzare solo la fonte ufficiale di stato LNbits e fonti di cui ti puoi fidare)",more:"più",less:"meno",releases:"Pubblicazioni",watchdog:"Cane da guardia",server_logs:"Registri del server",ip_blocker:"Blocco IP",security:"Sicurezza",security_tools:"Strumenti di sicurezza",block_access_hint:"Blocca l'accesso per IP",allow_access_hint:"Consenti l'accesso per IP (sovrascriverà gli IP bloccati)",enter_ip:"Inserisci l'IP e premi invio",rate_limiter:"Limitatore di frequenza",wallet_limiter:"Limitatore del Portafoglio",wallet_limit_max_withdraw_per_day:"Prelievo massimo giornaliero dal portafoglio in sats (0 per disabilitare)",wallet_max_ballance:"Saldo massimo del portafoglio in sats (0 per disabilitare)",wallet_limit_secs_between_trans:"Minuti e secondi tra transazioni per portafoglio (0 per disabilitare)",number_of_requests:"Numero di richieste",time_unit:"Unità di tempo",minute:"minuto",second:"secondo",hour:"ora",disable_server_log:"Disabilita Registro Server",enable_server_log:"Attiva Registro Server",coming_soon:"Caratteristica in arrivo prossimamente",session_has_expired:"La tua sessione è scaduta. Per favore, effettua nuovamente il login.",instant_access_question:"Vuoi accesso immediato?",login_with_user_id:"Accedi con ID utente",or:"oppure",create_new_wallet:"Crea nuovo portafoglio",login_to_account:"Accedi al tuo account",create_account:"Crea un account",account_settings:"Impostazioni dell'account",signin_with_nostr:"Continua con Nostr",signin_with_google:"Accedi con Google",signin_with_github:"Accedi con GitHub",signin_with_keycloak:"Accedi con Keycloak",username_or_email:"Nome utente o Email",password:"Password",password_config:"Configurazione della password",password_repeat:"Ripeti la password",change_password:"Cambia Password",update_credentials:"Aggiorna credenziali",update_pubkey:"Aggiorna chiave pubblica",set_password:"Imposta password",invalid_password:"La password deve contenere almeno 8 caratteri",login:"Accesso",register:"Registrati",username:"Nome utente",pubkey:"Chiave pubblica",user_id:"ID utente",email:"Email",first_name:"Nome",last_name:"Cognome",picture:"Immagine",verify_email:"Verifica email con",account:"Conto",update_account:"Aggiorna Account",invalid_username:"Nome utente non valido",auth_provider:"Provider di Autenticazione",my_account:"Il mio account",back:"Indietro",logout:"Esci",look_and_feel:"Aspetto e Comportamento",toggle_gradient:"Attiva/disattiva gradiente",gradient_background:"Sfondo sfumato",language:"Lingua",color_scheme:"Schema dei colori",admin_settings:"Impostazioni di amministrazione",extension_cost:"Questa versione richiede un pagamento minimo di {cost} satoshi.",extension_paid_sats:"Hai già pagato {paid_sats} sats.",release_details_error:"Impossibile ottenere i dettagli della versione.",pay_from_wallet:"Paga dal Portafoglio",wallet_required:"Portafoglio *",show_qr:"Mostra QR",retry_install:"Riprova Installazione",new_payment:"Effettua Nuovo Pagamento",update_payment:"Aggiorna Pagamento",already_paid_question:"Hai già pagato?",sell:"Vendi",sell_require:"Chiedi il pagamento per abilitare l'estensione",sell_info:"L'estensione {name} richiede un pagamento minimo di {amount} sats per essere abilitata.",hide_empty_wallets:"Nascondi portafogli vuoti",recheck:"Ricontrolla",contributors:"Contributori",license:"Licenza",reset_key:"Reimposta Chiave",reset_password:"Reimposta password",border_choices:"Scelte del bordo",select_all:"Seleziona tutto",nfc_supported:"Supportato NFC",nfc_not_supported:"NFC non supportato",expire_date:"Data di scadenza:",hash:"Hash:",welcome_lnbits:"Benvenuto in LNbits",setup_su_account:"Configura l'account Superuser qui sotto.",create_ticker_converter:"Crea Convertitore di Simboli di Valuta",enable_audit:"Abilita controllo",recommended:"Consigliato",audit_desc:"Registrare le richieste HTTP secondo i filtri specificati",audit_record_req:"Registra il corpo della richiesta",audit_record_warning:"Avvertimento:",audit_record_req_warning_1:"I dati riservati (come le password) verranno registrati.",audit_record_req_warning_2:"il corpo della richiesta può avere grandi dimensioni.",audit_record_use:"Usalo con cautela.",audit_ip:"Registrare l'indirizzo IP",audit_ip_desc:"Registra l'indirizzo IP del cliente",audit_path_params:"Registra i parametri del percorso",audit_query_params:"Registrare i parametri di query",audit_http_methods:"Includi i metodi HTTP",audit_http_methods_hint:"Elenco di metodi HTTP da includere. Liste vuote significano tutti.",audit_http_methods_label:"Metodi HTTP",audit_resp_codes:"Includere codici di risposta HTTP",audit_resp_codes_hint:"Elenco dei codici HTTP da includere (corrispondenza regex). Liste vuote significano tutto. Ad esempio: 4.*, 5.*",audit_resp_codes_label:"Codice di risposta HTTP (regex)",audit_paths:"Includi percorsi",audit_paths_hint:"Elenco dei percorsi da includere (corrispondenza regex). Elenco vuoto significa tutto.",audit_paths_label:"Percorso HTTP (regex)",audit_paths_exclude:"Escludi percorsi",audit_paths_exclude_hint:"Elenco dei percorsi da escludere (corrispondenza regex). Un elenco vuoto significa nessuno.",audit_paths_exclude_label:"Percorso HTTP (regex)",exchange_providers:"Fornitori di scambio",admin_extensions:"Estensioni Admin",admin_extensions_label:"Estensioni amministrative",admin_extensions_hint:"Solo un utente con privilegi di amministratore può utilizzare le estensioni.",user_default_extensions:"Estensioni predefinite dell'utente",user_default_extensions_label:"Estensioni utente",user_default_extensions_hint:"Estensioni che saranno abilitate di default per gli utenti.",miscellanous:"Varie",misc_disable_extensions:"Disabilita estensioni",misc_disable_extensions_label:"Disabilita tutte le estensioni",misc_hide_api:"Nascondi API",misc_hide_api_label:"Nasconde l'api del portafoglio, le estensioni possono scegliere di onorare",wallets_management:"Gestione dei portafogli",funding_source_info:"Informazioni sulla fonte di finanziamento",funding_source:"Fonte di finanziamento: {wallet_class}",node_balance:"Saldo Nodo: {balance} sats",lnbits_balance:"Saldo LNbits: {balance} sats",funding_reserve_percent:"Riserva Percentuale: {percent} %",node_management:"Gestione dei nodi",node_management_not_supported:"La gestione dei nodi non è supportata dalla fonte di finanziamento attiva.",toggle_node_ui:"Interfaccia utente del nodo",toggle_public_node_ui:"Interfaccia Utente Nodo Pubblico",toggle_transactions_node_ui:"Scheda Transazioni (Disabilita su nodi CLN grandi)",invoice_expiry:"Scadenza fattura",invoice_expiry_label:"Scadenza fattura (secondi)",fee_reserve:"Riserva delle commissioni",fee_reserve_msats:"Tariffa di prenotazione in msats",fee_reserve_percent:"Commissione di riserva in percentuale",server_management:"Gestione server",base_url:"URL di base",base_url_label:"URL statica/base per il server",authentication:"Autenticazione",auth_token_expiry_label:"Minuti di scadenza del token",auth_token_expiry_hint:"Tempo in minuti fino alla scadenza del token",auth_allowed_methods_label:"Metodi di autorizzazione consentiti",auth_allowed_methods_hint:"Seleziona i metodi di autorizzazione",auth_nostr_label:"URL richiesta Nostr",auth_nostr_hint:"URL assoluto che i clienti utilizzeranno per accedere.",auth_google_ci_label:"ID client di Google",auth_google_ci_hint:"Assicurati che gli URI di reindirizzamento autorizzati contengano https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"ID client di GitHub",auth_gh_client_id_hint:"Assicurati che l'URL di callback dell'autorizzazione sia impostato su https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Segreto Client GitHub",auth_keycloak_label:"URL di individuazione di Keycloak",auth_keycloak_ci_label:"ID client di Keycloak",auth_keycloak_ci_hint:"Assicurati che l'URL di callback dell'autorizzazione sia impostato su https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak Client Secret",auth_keycloak_custom_org_label:"Organizzazione personalizzata di Keycloak",auth_keycloak_custom_icon_label:"Icona personalizzata di Keycloak (URL)",auth_oidc_label:"URL di individuazione di OIDC",auth_oidc_ci_label:"ID client di OIDC",auth_oidc_ci_hint:"Assicurati che l'URL di callback dell'autorizzazione sia impostato su https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC Client Secret",auth_oidc_custom_org_label:"Nome organizzazione personalizzata OIDC (es. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Icona personalizzata di OIDC (URL)",currency_settings:"Impostazioni valuta",allowed_currencies:"Valute consentite",allowed_currencies_hint:"Limita il numero di valute fiat disponibili",default_account_currency:"Valuta predefinita del conto",default_account_currency_hint:"Valuta predefinita per la contabilità",service_fee_label:"Tassa di servizio (%)",service_fee_hint:"Tariffa addebitata per transazione (%)",service_fee_max_label:"Commissione di servizio max (sats)",service_fee_max_hint:"Commissione massima da addebitare in (sats)",fee_wallet:"Portafoglio delle commissioni",fee_wallet_label:"Portafoglio delle commissioni (ID portafoglio)",fee_wallet_hint:"ID portafoglio a cui inviare fondi",disable_fee:"Disabilita Commissione",disable_fee_internal:"Disabilita la commissione di servizio per i pagamenti interni",disable_fee_internal_desc:"Disabilita la commissione di servizio per i pagamenti Lightning interni",ui_management:"Gestione dell'interfaccia utente",ui_site_title:"Titolo del sito",ui_site_tagline:"Slogan del sito",ui_elements_enable:"Abilita elementi sulla homepage",ui_elements_disable:"Disabilita elementi sulla homepage",ui_toggle_elements_tip:"Rimuovi elementi della homepage come 'runs on' ecc.",ui_site_description:"Descrizione del sito",ui_site_description_hint:"Usa testo normale, Markdown o HTML grezzo",ui_default_wallet_name:"Nome predefinito del portafoglio",lnbits_wallet:"Portafoglio LNbits",denomination:"Denominazione",denomination_hint:"Il nome per il token FakeWallet",ui_qr_code_logo:"Logo del codice QR",ui_qr_code_logo_hint:"URL all'immagine del logo nel codice QR",ui_custom_badge:"Badge personalizzato",ui_custom_badge_label:"Badge personalizzato 'USARE CON CAUTELA - Il portafoglio LNbits è ancora in BETA'",ui_custom_badge_color_label:"Colore distintivo personalizzato",themes:"Temi",themes_hint:"Scegli i temi disponibili per gli utenti",custom_logo:"Logo personalizzato",custom_logo_hint:"URL all'immagine del logo",ad_space_title:"Titolo Spazio Pubblicitario",ad_space_title_label:"Supportato da",ad_slots:"Spazi pubblicitari",ad_slots_hint:"Percorso dell'URL e dell'immagine in formato CSV, le estensioni possono scegliere di rispettare",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Annunci abilitati",ads_disabled:"Annunci disabilitati",user_management:"Gestione utenti",admin_users:"Utenti amministratori",admin_users_hint:"Utenti con privilegi di amministratore",admin_users_label:"ID utente",allowed_users:"Utenti consentiti",allowed_users_hint:"Solo questi utenti possono usare LNbits",allowed_users_label:"ID utente",allow_creation_user:"Consenti la creazione di nuovi utenti",allow_creation_user_desc:"Consenti la creazione di nuovi utenti nella pagina indice",components:"Componenti",long_running_endpoints:"I primi 5 endpoint a lunga esecuzione",http_request_methods:"Metodi di richiesta HTTP",http_response_codes:"Codici di risposta HTTP",request_details:"Dettagli della richiesta",http_request_details:"Dettagli della richiesta HTTP"},window.localisation.jp={confirm:"はい",server:"サーバー",theme:"テーマ",site_customisation:"サイトカスタマイズ",funding:"資金調達",users:"ユーザー",audit:"監査",apps:"アプリ",channels:"チャンネル",transactions:"トランザクション",dashboard:"ダッシュボード",node:"ノード",export_users:"ユーザーのエクスポート",no_users:"ユーザーが見つかりません",total_capacity:"合計容量",avg_channel_size:"平均チャンネルサイズ",biggest_channel_size:"最大チャネルサイズ",smallest_channel_size:"最小チャンネルサイズ",number_of_channels:"チャンネル数",active_channels:"アクティブチャンネル",connect_peer:"ピアを接続",connect:"接続",open_channel:"オープンチャンネル",open:"開く",close_channel:"チャンネルを閉じる",close:"閉じる",restart:"サーバーを再起動する",save:"保存",save_tooltip:"変更を保存する",credit_debit:"クレジット / デビット",credit_hint:"クレジットカードを使用して資金を追加するには、LNbitsを使用してください。",credit_label:"{denomination} をクレジットに",restart_tooltip:"サーバーを再起動して変更を適用します",add_funds_tooltip:"ウォレットに資金を追加します。",reset_defaults:"リセット",reset_defaults_tooltip:"すべての設定を削除してデフォルトに戻します。",download_backup:"データベースのバックアップをダウンロードする",name_your_wallet:"あなたのウォレットの名前 {name}",paste_invoice_label:"請求書を貼り付けてください",lnbits_description:"簡単にインストールでき、軽量なLNbitsは、あらゆるライトニングネットワークの資金源と、LNbits自身でさえも実行できます!LNbitsを個人で実行することも、他人に対してカストディアンソリューションをで実行できます! LNbitsを自分で実行することも、他の人に優れたソリューションを提供することもできます。各ウォレットには独自のAPIキーがあり、作成できるウォレットの数に制限はありません。資金を分割する機能は、LNbitsを資金管理ツールとして使用したり、開発ツールとして使用したりするための便利なツールです。拡張機能は、LNbitsに追加の機能を追加します。そのため、LNbitsは最先端の技術をネットワークLightningで試すことができます。拡張機能を開発するのは簡単で、無料でオープンソースのプロジェクトであるため、人々が自分で開発し、自分の貢献を送信することを奨励しています。",export_to_phone:"電話にエクスポート",export_to_phone_desc:"ウォレットを電話にエクスポートすると、ウォレットを削除する前にウォレットを復元できます。ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。",wallet:"ウォレット:",wallets:"ウォレット",add_wallet:"ウォレットを追加",delete_wallet:"ウォレットを削除",delete_wallet_desc:"ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。",rename_wallet:"ウォレットの名前を変更",update_name:"名前を更新",fiat_tracking:"フィアット追跡",currency:"通貨",update_currency:"通貨を更新する",press_to_claim:"クレームするには押してください",donate:"寄付",view_github:"GitHubで表示",voidwallet_active:"Voidwalletアクティブ",use_with_caution:"注意して使用してください - {name} ウォレットはまだベータ版です",service_fee:"取引ごとのサービス手数料: {amount} %",service_fee_max:"取引手数料:{amount}%(最大{max}サトシ)",service_fee_tooltip:"LNbitsサーバー管理者が発生する送金ごとの手数料",toggle_darkmode:"ダークモードを切り替える",payment_reactions:"支払いの反応",view_swagger_docs:"Swaggerドキュメントを表示",api_docs:"APIドキュメント",api_keys_api_docs:"ノードURL、APIキー、APIドキュメント",lnbits_version:"LNbits バージョン",runs_on:"で実行",paste:"貼り付け",paste_from_clipboard:"クリップボードから貼り付け",paste_request:"リクエストを貼り付ける",create_invoice:"請求書を作成する",camera_tooltip:"QRコードを読み取る",export_csv:"CSVでエクスポート",chart_tooltip:"チャートを表示するには、グラフの上にカーソルを合わせます",pending:"保留中",copy_invoice:"請求書をコピー",withdraw_from:"出金",cancel:"キャンセル",scan:"スキャン",read:"読む",pay:"支払う",memo:"メモ",date:"日付",payment_processing:"支払い処理中",not_enough_funds:"資金が不足しています",search_by_tag_memo_amount:"タグ、メモ、金額で検索",invoice_waiting:"請求書を待っています",payment_received:"お支払いありがとうございます",payment_sent:"支払いが完了しました",receive:"受け取る",send:"送信",outgoing_payment_pending:"支払い保留中",drain_funds:"資金を排出する",drain_funds_desc:"ウォレットの残高をすべて他のウォレットに送金します",i_understand:"理解した",copy_wallet_url:"ウォレットURLをコピー",disclaimer_dialog_title:"重要!",disclaimer_dialog:"ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。ウォレットを削除する前に、ウォレットをエクスポートしてください。",no_transactions:"トランザクションはありません",manage:"管理",exchanges:"取引所",extensions:"拡張機能",no_extensions:"拡張機能はありません",created:"作成済み",search_extensions:"検索拡張機能",extension_sources:"拡張ソース",ext_sources_hint:"拡張機能をダウンロードできるリポジトリ",ext_sources_label:"ソースURL(公式のLNbits拡張ソースおよび信頼できるソースのみを使用してください)",warning:"警告",repository:"リポジトリ",confirm_continue:"続行してもよろしいですか?",manage_extension_details:"拡張機能のインストール/アンインストール",install:"インストール",uninstall:"アンインストール",drop_db:"データを削除",enable:"有効",pay_to_enable:"有効にするために支払う",enable_extension_details:"現在のユーザーの拡張機能を有効にする",disable:"無効",delete:"削除",installed:"インストール済み",activated:"有効化",deactivated:"無効化",release_notes:"リリースノート",activate_extension_details:"拡張機能をユーザーが利用できるようにする/利用できないようにする",featured:"特集",all:"すべて",only_admins_can_install:"(管理者アカウントのみが拡張機能をインストールできます)",admin_only:"管理者のみ",new_version:"新しいバージョン",extension_depends_on:"依存先:",extension_rating_soon:"評価は近日公開",extension_installed_version:"インストール済みバージョン",extension_uninstall_warning:"すべてのユーザーの拡張機能を削除しようとしています.",uninstall_confirm:"はい、アンインストールします",extension_db_drop_info:"エクステンションのすべてのデータが完全に削除されます。この操作を元に戻す方法はありません!",extension_db_drop_warning:"エクステンションのすべてのデータを削除しようとしています。続行するには、エクステンションの名前を入力してください:",extension_required_lnbits_version:"このリリースには少なくとも LNbits バージョンが必要です",min_version:"最小値(含む)",max_version:"最大(除外)",payment_hash:"支払いハッシュ",fee:"料金",amount:"量",amount_sats:"金額 (サッツ)",tag:"タグ",unit:"単位",description:"説明",expiry:"有効期限",webhook:"ウェブフック",payment_proof:"支払い証明",update:"更新",update_available:"アップデート{version}が利用可能です!",latest_update:"あなたは最新バージョン{version}を使用しています。",notifications:"通知",no_notifications:"通知はありません",notifications_disabled:"LNbitsステータス通知は無効です。",enable_notifications:"通知を有効にする",enable_notifications_desc:"有効にすると、セキュリティインシデントやアップデートのような最新のLNbitsステータス更新を取得します。",enable_watchdog:"ウォッチドッグを有効にする",enable_watchdog_desc:"有効にすると、残高がLNbitsの残高より少ない場合に、資金源を自動的にVoidWalletに変更します。アップデート後は手動で有効にする必要があります。",watchdog_interval:"ウォッチドッグ・インターバル",watchdog_interval_desc:"バックグラウンドタスクがウォッチドッグデルタ[node_balance - lnbits_balance]でキルスイッチシグナルを確認する頻度(分単位)。",watchdog_delta:"ウォッチドッグデルタ",watchdog_delta_desc:"キルスイッチが資金源をVoidWalletに変更する前の限界 [lnbits_balance - node_balance > delta]",status:"ステータス",notification_source:"通知ソース",notification_source_label:"ソースURL(公式のLNbitsステータスソースのみを使用し、信頼できるソースのみを利用してください)",more:"より多くの",less:"少ない",releases:"リリース",watchdog:"ウォッチドッグ",server_logs:"サーバーログ",ip_blocker:"IPブロッカー",security:"セキュリティ",security_tools:"セキュリティツール",block_access_hint:"IPによるアクセスをブロック",allow_access_hint:"IPによるアクセスを許可する(ブロックされたIPを上書きします)",enter_ip:"IPを入力してエンターキーを押してください",rate_limiter:"レートリミッター",wallet_limiter:"ウォレットリミッター",wallet_limit_max_withdraw_per_day:"1日あたりの最大ウォレット出金額をsatsで入力してください(0 で無効)。",wallet_max_ballance:"ウォレットの最大残高(sats)(0は無効)",wallet_limit_secs_between_trans:"トランザクション間の最小秒数(ウォレットごと)(0は無効)",number_of_requests:"リクエストの数",time_unit:"時間単位",minute:"分",second:"秒",hour:"時間",disable_server_log:"サーバーログを無効にする",enable_server_log:"サーバーログを有効にする",coming_soon:"機能は間もなく登場します",session_has_expired:"あなたのセッションは期限切れです。もう一度ログインしてください。",instant_access_question:"即時アクセスをご希望ですか?",login_with_user_id:"ユーザーIDでログイン",or:"または",create_new_wallet:"新しいウォレットを作成",login_to_account:"アカウントにログインしてください",create_account:"アカウントを作成",account_settings:"アカウント設定",signin_with_nostr:"Nostrで続行",signin_with_google:"Googleでサインイン",signin_with_github:"GitHubでサインイン",signin_with_keycloak:"Keycloakでサインイン",username_or_email:"ユーザー名またはメールアドレス",password:"パスワード",password_config:"パスワード設定",password_repeat:"パスワードの再入力",change_password:"パスワードを変更",update_credentials:"資格情報を更新する",update_pubkey:"公開鍵を更新",set_password:"パスワードを設定",invalid_password:"パスワードは少なくとも8文字必要です",login:"ログイン",register:"登録",username:"ユーザー名",pubkey:"公開鍵",user_id:"ユーザーID",email:"メール",first_name:"名",last_name:"姓",picture:"写真",verify_email:"メールアドレスの確認を行ってください",account:"アカウント",update_account:"アカウントを更新",invalid_username:"無効なユーザー名",auth_provider:"認証プロバイダ",my_account:"マイアカウント",back:"戻る",logout:"ログアウト",look_and_feel:"ルック・アンド・フィール",toggle_gradient:"グラデーションを切り替える",gradient_background:"グラデーション背景",language:"言語",color_scheme:"カラースキーム",admin_settings:"管理設定",extension_cost:"このリリースには最低 {cost} サトシの支払いが必要です。",extension_paid_sats:"すでに{paid_sats} satsを支払いました。",release_details_error:"リリースの詳細を取得できません。",pay_from_wallet:"ウォレットから支払う",wallet_required:"ウォレット *",show_qr:"QRを表示",retry_install:"再試行インストール",new_payment:"新しい支払いを作成する",update_payment:"支払いを更新する",already_paid_question:"すでに支払いましたか?",sell:"販売する",sell_require:"拡張を有効にするために支払いを求める",sell_info:"{name}拡張機能を有効にするには、最小{amount}サツの支払いが必要です。",hide_empty_wallets:"空のウォレットを非表示にする",recheck:"再確認",contributors:"貢献者",license:"ライセンス",reset_key:"リセットキー",reset_password:"パスワードをリセットする",border_choices:"境界の選択肢",select_all:"すべて選択",nfc_supported:"NFC対応",nfc_not_supported:"NFCがサポートされていません",expire_date:"有効期限日:",hash:"ハッシュ:",welcome_lnbits:"LNbitsへようこそ",setup_su_account:"スーパーアカウントを以下に設定してください。",create_ticker_converter:"通貨ティッカーコンバーターを作成",enable_audit:"監査を有効にする",recommended:"推奨",audit_desc:"指定されたフィルターに従ってHTTPリクエストを記録する",audit_record_req:"リクエストボディの記録",audit_record_warning:"警告:",audit_record_req_warning_1:"パスワードなどの機密データが記録されます。",audit_record_req_warning_2:"リクエストボディは大きなサイズになる可能性があります。",audit_record_use:"注意して使用してください。",audit_ip:"IPアドレスを記録する",audit_ip_desc:"クライアントのIPアドレスを記録する",audit_path_params:"パスパラメータを記録",audit_query_params:"クエリパラメータを記録する",audit_http_methods:"HTTPメソッドを含める",audit_http_methods_hint:"含めるHTTPメソッドのリスト。空のリストはすべてを意味します。",audit_http_methods_label:"HTTPメソッド",audit_resp_codes:"HTTPレスポンスコードを含める",audit_resp_codes_hint:"含めるHTTPコードの一覧(正規表現で一致)。空のリストはすべてを意味します。例: 4.*, 5.*",audit_resp_codes_label:"HTTPレスポンスコード(正規表現)",audit_paths:"パスを含める",audit_paths_hint:"含めるパスのリスト(正規表現マッチ)。空のリストはすべてを意味します。",audit_paths_label:"HTTP パス (正規表現)",audit_paths_exclude:"パスを除外",audit_paths_exclude_hint:"除外するパスの一覧(正規表現の一致)。空のリストは対象がないことを意味します。",audit_paths_exclude_label:"HTTP パス (正規表現)",exchange_providers:"取引所プロバイダー",admin_extensions:"管理拡張機能",admin_extensions_label:"管理者拡張機能",admin_extensions_hint:"拡張機能は管理者権限を持つユーザーのみが使用できます",user_default_extensions:"ユーザーデフォルト拡張機能",user_default_extensions_label:"ユーザー拡張機能",user_default_extensions_hint:"ユーザーに対してデフォルトで有効化される拡張機能。",miscellanous:"その他",misc_disable_extensions:"拡張機能を無効にする",misc_disable_extensions_label:"すべての拡張機能を無効にする",misc_hide_api:"APIを非表示",misc_hide_api_label:"ウォレットAPIを隠すことができ、拡張機能は尊重することを選ぶことができます。",wallets_management:"ウォレット管理",funding_source_info:"資金源情報",funding_source:"資金源: {wallet_class}",node_balance:"ノード残高: {balance} サッツ",lnbits_balance:"LNbits残高: {balance} sats",funding_reserve_percent:"予約パーセント: {percent} %",node_management:"ノード管理",node_management_not_supported:"アクティブな資金源ではノード管理がサポートされていません",toggle_node_ui:"ノードUI",toggle_public_node_ui:"パブリックノードUI",toggle_transactions_node_ui:"トランザクションタブ(大規模なCLNノードで無効化)",invoice_expiry:"インボイスの有効期限",invoice_expiry_label:"インボイスの有効期限(秒)",fee_reserve:"料金予約",fee_reserve_msats:"ミリサトシでの予約手数料",fee_reserve_percent:"パーセンテージの予約料",server_management:"サーバー管理",base_url:"ベースURL",base_url_label:"サーバーの静的/基本URL",authentication:"認証",auth_token_expiry_label:"トークン有効期限(分)",auth_token_expiry_hint:"トークンが失効するまでの時間(分)",auth_allowed_methods_label:"許可された認証方法",auth_allowed_methods_hint:"認証方法を選択",auth_nostr_label:"Nostr リクエスト URL",auth_nostr_hint:"クライアントがログインするために使用する絶対URL。",auth_google_ci_label:"Google クライアントID",auth_google_ci_hint:"認可されたリダイレクトURIにhttps://{domain}/api/v1/auth/google/tokenが含まれていることを確認してください",auth_google_cs_label:"Google クライアントシークレット",auth_gh_client_id_label:"GitHub クライアントID",auth_gh_client_id_hint:"認証コールバックURLがhttps://{domain}/api/v1/auth/github/tokenに設定されていることを確認してください。",auth_gh_client_secret_label:"GitHub クライアントシークレット",auth_keycloak_label:"キーコーク ディスカバリー URL",auth_keycloak_ci_label:"Keycloak クライアント ID",auth_keycloak_ci_hint:"認証コールバックURLが https://{domain}/api/v1/auth/keycloak/token に設定されていることを確認してください。",auth_keycloak_cs_label:"キークローククライアントシークレット",auth_keycloak_custom_org_label:"Keycloak カスタム組織",auth_keycloak_custom_icon_label:"Keycloak カスタムアイコン (URL)",auth_oidc_label:"OIDC ディスカバリー URL",auth_oidc_ci_label:"OIDC クライアント ID",auth_oidc_ci_hint:"認証コールバックURLが https://{domain}/api/v1/auth/oidc/token に設定されていることを確認してください。",auth_oidc_cs_label:"OIDC クライアントシークレット",auth_oidc_custom_org_label:"OIDC カスタム組織名(例:Zitadel、Authentik)",auth_oidc_custom_icon_label:"OIDC カスタムアイコン (URL)",currency_settings:"通貨設定",allowed_currencies:"許可されている通貨",allowed_currencies_hint:"利用可能な法定通貨の数を制限する",default_account_currency:"デフォルト口座通貨",default_account_currency_hint:"会計のデフォルト通貨",service_fee_label:"サービス料 (%)",service_fee_hint:"1 取引あたりの手数料 (%)",service_fee_max_label:"サービス料最大 (sats)",service_fee_max_hint:"(サット)での最大サービス料金",fee_wallet:"手数料ウォレット",fee_wallet_label:"手数料ウォレット (ウォレットID)",fee_wallet_hint:"送金先のウォレットID",disable_fee:"手数料を無効にする",disable_fee_internal:"内部支払に対するサービス手数料を無効にする",disable_fee_internal_desc:"内部のライトニングペイメントのサービス料金を無効にする",ui_management:"UI管理",ui_site_title:"サイトのタイトル",ui_site_tagline:"サイトのタグライン",ui_elements_enable:"ホームページの要素を有効にする",ui_elements_disable:"ホームページの要素を無効にする",ui_toggle_elements_tip:"「runs on」などのホームページ要素を削除します。",ui_site_description:"サイトの説明",ui_site_description_hint:"プレーンテキスト、Markdown、または生のHTMLを使用してください。",ui_default_wallet_name:"デフォルトウォレット名",lnbits_wallet:"LNbitsウォレット",denomination:"額面",denomination_hint:"FakeWalletトークンの名前",ui_qr_code_logo:"QRコードロゴ",ui_qr_code_logo_hint:"QRコードのロゴ画像のURL",ui_custom_badge:"カスタムバッジ",ui_custom_badge_label:"カスタムバッジ「使用に注意 - LNbitsウォレットはまだベータ版です」",ui_custom_badge_color_label:"カスタムバッジカラー",themes:"テーマ",themes_hint:"ユーザーが利用可能なテーマを選択してください",custom_logo:"カスタムロゴ",custom_logo_hint:"ロゴ画像へのURL",ad_space_title:"広告スペースのタイトル",ad_space_title_label:"サポートされています",ad_slots:"広告スロット",ad_slots_hint:"CSV形式の広告URLと画像ファイルパス、拡張機能は遵守することを選択できます",ad_slots_label:"URL;img_light_url;img_dark_url、URL...",ads_enabled:"広告が有効になっています",ads_disabled:"広告が無効になっています",user_management:"ユーザー管理",admin_users:"管理者ユーザー",admin_users_hint:"管理者権限を持つユーザー",admin_users_label:"ユーザーID",allowed_users:"許可されたユーザー",allowed_users_hint:"これらのユーザーのみがLNbitsを使用できます。",allowed_users_label:"ユーザーID",allow_creation_user:"新しいユーザーの作成を許可",allow_creation_user_desc:"インデックスページで新しいユーザーの作成を許可する",components:"コンポーネント",long_running_endpoints:"トップ5の長時間実行エンドポイント",http_request_methods:"HTTPリクエストメソッド",http_response_codes:"HTTPレスポンスコード",request_details:"リクエストの詳細",http_request_details:"HTTPリクエストの詳細"},window.localisation.cn={confirm:"确定",server:"服务器",theme:"主题",site_customisation:"网站定制",funding:"资金",users:"用户",audit:"审计",apps:"应用程序",channels:"频道",transactions:"交易记录",dashboard:"控制面板",node:"节点",export_users:"导出用户",no_users:"未找到用户",total_capacity:"总容量",avg_channel_size:"平均频道大小",biggest_channel_size:"最大通道大小",smallest_channel_size:"最小频道尺寸",number_of_channels:"频道数量",active_channels:"活跃频道",connect_peer:"连接对等",connect:"连接",open_channel:"打开频道",open:"打开",close_channel:"关闭频道",close:"关闭",restart:"重新启动服务器",save:"保存",save_tooltip:"保存更改",credit_debit:"信用卡 / 借记卡",credit_hint:"按 Enter 键充值账户",credit_label:"{denomination} 充值",credit_ok:"成功记入/扣除虚拟资金 ({amount} sats)。付款取决于资金来源的实际资金。",restart_tooltip:"重新启动服务器以使更改生效",add_funds_tooltip:"为钱包添加资金",reset_defaults:"重置为默认设置",reset_defaults_tooltip:"删除所有设置并重置为默认设置",download_backup:"下载数据库备份",name_your_wallet:"给你的 {name}钱包起个名字",paste_invoice_label:"粘贴发票,付款请求或lnurl*",lnbits_description:"LNbits 设置简单、轻量级,可以在任何闪电网络的资金来源上运行,甚至可以在LNbits自身上运行!您可以为自己运行LNbits,或者轻松为他人提供托管解决方案。每个钱包都有自己的 API 密钥,你可以创建的钱包数量没有限制。能够把资金分开管理使 LNbits 成为一款有用的资金管理和开发工具。扩展程序增加了 LNbits 的额外功能,所以你可以在闪电网络上尝试各种尖端技术。我们已经尽可能简化了开发扩展程序的过程,作为一个免费和开源的项目,我们鼓励人们开发并提交自己的扩展程序。",export_to_phone:"通过二维码导出到手机",export_to_phone_desc:"这个二维码包含您钱包的URL。您可以使用手机扫描的方式打开您的钱包。",wallet:"钱包:",wallets:"钱包",add_wallet:"添加新钱包",delete_wallet:"删除钱包",delete_wallet_desc:"整个钱包将被删除,资金将无法恢复",rename_wallet:"重命名钱包",update_name:"更新名称",fiat_tracking:"菲亚特追踪",currency:"货币",update_currency:"更新货币",press_to_claim:"点击领取比特币",donate:"捐献",view_github:"在GitHub上查看",voidwallet_active:"VoidWallet 已激活!付款功能已禁用。",use_with_caution:"请谨慎使用 - {name}钱包还处于测试版阶段",service_fee:"服务费:{amount}% 每笔交易",service_fee_max:"服务费:{amount}% 每笔交易(最高 {max} sats)",service_fee_tooltip:"LNbits服务器管理员每笔外发交易收取的服务费",toggle_darkmode:"切换暗黑模式",payment_reactions:"支付反应",view_swagger_docs:"查看 LNbits Swagger API 文档",api_docs:"API文档",api_keys_api_docs:"节点URL、API密钥和API文档",lnbits_version:"LNbits版本",runs_on:"可运行在",paste:"粘贴",paste_from_clipboard:"从剪贴板粘贴",paste_request:"粘贴请求",create_invoice:"创建发票",camera_tooltip:"用相机扫描发票/二维码",export_csv:"导出为CSV",chart_tooltip:"显示图表",pending:"待处理",copy_invoice:"复制发票",withdraw_from:"从",cancel:"取消",scan:"扫描",read:"读取",pay:"付款",memo:"备注",date:"日期",payment_processing:"正在处理支付...",not_enough_funds:"资金不足!",search_by_tag_memo_amount:"按标签、备注、金额搜索",invoice_waiting:"待支付的发票",payment_received:"收到付款",payment_sent:"付款已发送",receive:"收款",send:"付款",outgoing_payment_pending:"付款正在等待处理",drain_funds:"清空资金",drain_funds_desc:"这是一个 LNURL-取款的二维码,用于从该钱包中提取全部资金。请不要与他人分享。它与 balanceCheck 和 balanceNotify 兼容,因此在第一次取款后,您的钱包还可能会持续从这里提取资金",i_understand:"我明白",copy_wallet_url:"复制钱包URL",disclaimer_dialog_title:"重要!",disclaimer_dialog:"登录功能将在以后的更新中发布,请将此页面加为书签,以便将来访问您的钱包!此服务处于测试阶段,我们不对资金的丢失承担任何责任。",no_transactions:"尚未进行任何交易",manage:"管理",exchanges:"交易所",extensions:"扩展程序",no_extensions:"你没有安装任何扩展程序 :(",created:"已创建",search_extensions:"搜索扩展程序",extension_sources:"扩展源",ext_sources_hint:"可以下载扩展的存储库",ext_sources_label:"来源网址(仅使用官方LNbits扩展程序来源和您可以信任的来源)",warning:"警告",repository:"代码库",confirm_continue:"你确定要继续吗?",manage_extension_details:"安装/卸载扩展程序",install:"安装",uninstall:"卸载",drop_db:"删除数据",enable:"启用",pay_to_enable:"支付以启用",enable_extension_details:"为当前用户启用扩展程序",disable:"禁用",delete:"删除",installed:"已安装",activated:"已激活",deactivated:"已停用",release_notes:"发布说明",activate_extension_details:"对用户开放或禁用扩展程序",featured:"精选",all:"全部",only_admins_can_install:"(只有管理员账户可以安装扩展)",admin_only:"仅限管理员",new_version:"新版本",extension_depends_on:"依赖于:",extension_rating_soon:"即将推出评分",extension_installed_version:"已安装的版本",extension_uninstall_warning:"您即将对所有用户删除该扩展程序。",uninstall_confirm:"是的,卸载",extension_db_drop_info:"该扩展程序的所有数据将被永久删除。此操作无法撤销!",extension_db_drop_warning:"您即将删除该扩展的所有数据。请继续输入扩展程序名称以确认操作:",extension_required_lnbits_version:"此版本要求最低的 LNbits 版本为",min_version:"最小值(包含)",max_version:"最大值(不含)",payment_hash:"付款哈希",fee:"费",amount:"金额",amount_sats:"金额(聪)",tag:"标签",unit:"单位",description:"详情",expiry:"过期时间",webhook:"Webhook",payment_proof:"付款证明",update:"更新",update_available:"更新{version}可用!",latest_update:"您当前使用的是最新版本{version}。",notifications:"通知",no_notifications:"没有通知",notifications_disabled:"LNbits状态通知已禁用。",enable_notifications:"启用通知",enable_notifications_desc:"如果启用,它将获取最新的LNbits状态更新,如安全事件和更新。",enable_watchdog:"启用看门狗",enable_watchdog_desc:"如果启用,当您的余额低于LNbits余额时,系统将自动将您的资金来源更改为VoidWallet。更新后您将需要手动启用。",watchdog_interval:"看门狗间隔",watchdog_interval_desc:"后台任务应该多久检查一次看门狗增量中的 killswitch 信号 [node_balance - lnbits_balance](以分钟计)。",watchdog_delta:"看门狗德尔塔",watchdog_delta_desc:"在触发紧急停止前切换资金来源至VoidWallet的限制 [lnbits_balance - node_balance > delta]",status:"状态",notification_source:"通知来源",notification_source_label:"来源 URL(仅使用官方LNbits状态源和您信任的源)",more:"更多",less:"少",releases:"版本",watchdog:"监控程序",server_logs:"服务器日志",ip_blocker:"IP 阻止器",security:"安全",security_tools:"安全工具",block_access_hint:"屏蔽IP访问",allow_access_hint:"允许通过IP访问(将覆盖被屏蔽的IP)",enter_ip:"输入IP地址并按回车键",rate_limiter:"速率限制器",wallet_limiter:"钱包限制器",wallet_limit_max_withdraw_per_day:"每日钱包最大提现额度(单位:sats)(设为0则禁用)",wallet_max_ballance:"钱包最大余额(以sats计)(设为0则禁用)",wallet_limit_secs_between_trans:"每个钱包交易间最少秒数(设为0则禁用)",number_of_requests:"请求次数",time_unit:"时间单位",minute:"分钟",second:"秒",hour:"小时",disable_server_log:"禁用服务器日志",enable_server_log:"启用服务器日志",coming_soon:"功能即将推出",session_has_expired:"您的会话已过期。请重新登录。",instant_access_question:"想要即时访问吗?",login_with_user_id:"使用用户ID登录",or:"或",create_new_wallet:"创建新钱包",login_to_account:"登录您的账户",create_account:"创建账户",account_settings:"账户设置",signin_with_nostr:"继续使用 Nostr",signin_with_google:"使用谷歌账号登录",signin_with_github:"使用GitHub登录",signin_with_keycloak:"使用Keycloak登录",username_or_email:"用户名或电子邮箱",password:"密码",password_config:"密码配置",password_repeat:"密码重复",change_password:"修改密码",update_credentials:"更新凭证",update_pubkey:"更新公钥",set_password:"设置密码",invalid_password:"密码至少需要有8个字符",login:"登录",register:"注册",username:"用户名",pubkey:"公钥",user_id:"用户ID",email:"电子邮件",first_name:"名字",last_name:"姓氏",picture:"图片",verify_email:"验证电子邮件与",account:"账户",update_account:"更新帐户",invalid_username:"无效用户名",auth_provider:"认证提供者",my_account:"我的账户",back:"返回",logout:"注销",look_and_feel:"外观和感觉",toggle_gradient:"切换渐变",gradient_background:"渐变背景",language:"语言",color_scheme:"配色方案",admin_settings:"管理员设置",extension_cost:"此版本需要支付最低 {cost} sats。",extension_paid_sats:"您已经支付了{paid_sats} sats。",release_details_error:"无法获取发布详情。",pay_from_wallet:"从钱包支付",wallet_required:"钱包 *",show_qr:"显示QR码",retry_install:"重试安装",new_payment:"创建新支付",update_payment:"更新付款",already_paid_question:"你已经付款了吗?",sell:"出售",sell_require:"请求付款以启用扩展",sell_info:"{name} 扩展需要支付至少 {amount} sat 才能启用。",hide_empty_wallets:"隐藏空钱包",recheck:"重新检查",contributors:"贡献者们",license:"许可证",reset_key:"重置密钥",reset_password:"重置密码",border_choices:"边框选项",select_all:"全选",nfc_supported:"支持NFC",nfc_not_supported:"不支持NFC",expire_date:"有效期:",hash:"哈希:",welcome_lnbits:"欢迎来到LNbits",setup_su_account:"设置超级用户账户如下。",create_ticker_converter:"创建货币代码转换器",enable_audit:"启用审核",recommended:"推荐",audit_desc:"根据指定的过滤器记录HTTP请求",audit_record_req:"记录请求主体",audit_record_warning:"警告:",audit_record_req_warning_1:"机密数据(如密码)将被记录。",audit_record_req_warning_2:"请求主体可能会有较大尺寸。",audit_record_use:"请谨慎使用。",audit_ip:"记录 IP 地址",audit_ip_desc:"记录客户端的IP地址",audit_path_params:"记录路径参数",audit_query_params:"记录查询参数",audit_http_methods:"包括 HTTP 方法",audit_http_methods_hint:"要包含的 HTTP 方法列表。空列表表示全部。",audit_http_methods_label:"HTTP 方法",audit_resp_codes:"包括 HTTP 响应代码",audit_resp_codes_hint:"要包含的 HTTP 代码列表(正则表达式匹配)。空列表表示全部。例如:4.*,5.*",audit_resp_codes_label:"HTTP响应代码(正则表达式)",audit_paths:"包含路径",audit_paths_hint:"要包含的路径列表(正则表达式匹配)。空列表意味着全部。",audit_paths_label:"HTTP 路径(正则表达式)",audit_paths_exclude:"排除路径",audit_paths_exclude_hint:"要排除的路径列表(正则表达式匹配)。空列表表示没有。",audit_paths_exclude_label:"HTTP 路径(正则表达式)",exchange_providers:"兑换提供商",admin_extensions:"管理员扩展",admin_extensions_label:"管理员扩展件",admin_extensions_hint:"只有具有管理员权限的用户才能使用扩展程序",user_default_extensions:"用户默认扩展",user_default_extensions_label:"用户扩展",user_default_extensions_hint:"对用户默认启用的扩展。",miscellanous:"杂项",misc_disable_extensions:"禁用扩展程序",misc_disable_extensions_label:"禁用所有扩展程序",misc_hide_api:"隐藏 API",misc_hide_api_label:"隐藏钱包 api,扩展程序可以选择遵守",wallets_management:"钱包管理",funding_source_info:"资金来源信息",funding_source:"资金来源:{wallet_class}",node_balance:"节点余额:{balance} sats",lnbits_balance:"LNbits 余额:{balance} sats",funding_reserve_percent:"保留百分比: {percent} %",node_management:"节点管理",node_management_not_supported:"活动资金来源不支持节点管理",toggle_node_ui:"节点用户界面",toggle_public_node_ui:"公共节点用户界面",toggle_transactions_node_ui:"交易选项卡(在大型 CLN 节点上禁用)",invoice_expiry:"发票到期",invoice_expiry_label:"发票到期(秒)",fee_reserve:"费用储备",fee_reserve_msats:"以msats计的保留费",fee_reserve_percent:"以百分比计的保留费用",server_management:"服务器管理",base_url:"基本URL",base_url_label:"服务器的静态/基本网址",authentication:"认证",auth_token_expiry_label:"令牌过期分钟数",auth_token_expiry_hint:"令牌过期的剩余时间(分钟)",auth_allowed_methods_label:"允许的授权方法",auth_allowed_methods_hint:"选择授权方法",auth_nostr_label:"Nostr请求URL",auth_nostr_hint:"客户端将用于登录的绝对URL。",auth_google_ci_label:"谷歌客户ID",auth_google_ci_hint:"确保授权重定向URI包含https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google客户端密钥",auth_gh_client_id_label:"GitHub 客户端 ID",auth_gh_client_id_hint:"确保授权回调 URL 设置为 https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub客户端密码",auth_keycloak_label:"Keycloak 发现 URL",auth_keycloak_ci_label:"Keycloak 客户端 ID",auth_keycloak_ci_hint:"确保授权回调URL设置为https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak客户端密钥",auth_keycloak_custom_org_label:"Keycloak 自定义组织",auth_keycloak_custom_icon_label:"Keycloak 自定义图标 (URL)",auth_oidc_label:"OIDC 发现 URL",auth_oidc_ci_label:"OIDC 客户端 ID",auth_oidc_ci_hint:"确保授权回调URL设置为https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC客户端密钥",auth_oidc_custom_org_label:"OIDC 自定义组织名称(例如 Zitadel、Authentik)",auth_oidc_custom_icon_label:"OIDC 自定义图标 (URL)",currency_settings:"货币设置",allowed_currencies:"允许的货币",allowed_currencies_hint:"限制可用法定货币的数量",default_account_currency:"默认账户货币",default_account_currency_hint:"默认的会计货币",service_fee_label:"服务费 (%)",service_fee_hint:"每笔交易收取的费用 (%)",service_fee_max_label:"服务费最大值(聪)",service_fee_max_hint:"最大服务费以 (sats) 收取",fee_wallet:"费用钱包",fee_wallet_label:"费用钱包(钱包 ID)",fee_wallet_hint:"用于接收资金的钱包 ID",disable_fee:"禁用费用",disable_fee_internal:"禁用内部付款服务费",disable_fee_internal_desc:"禁用内部闪电支付的服务费",ui_management:"用户界面管理",ui_site_title:"网站标题",ui_site_tagline:"网站标语",ui_elements_enable:"在主页上启用元素",ui_elements_disable:"禁用主页上的元素",ui_toggle_elements_tip:"移除主页元素,例如“运行于”等。",ui_site_description:"网站描述",ui_site_description_hint:"使用纯文本、Markdown或原始HTML",ui_default_wallet_name:"默认钱包名称",lnbits_wallet:"LNbits 钱包",denomination:"面额",denomination_hint:"FakeWallet 代币的名称",ui_qr_code_logo:"二维码标志",ui_qr_code_logo_hint:"二维码中标志图像的 URL",ui_custom_badge:"自定义徽章",ui_custom_badge_label:"自定义徽章“慎用 - LNbits 钱包仍在测试阶段”",ui_custom_badge_color_label:"自定义徽章颜色",themes:"主题",themes_hint:"选择可供用户使用的主题",custom_logo:"自定义徽标",custom_logo_hint:"徽标图像的URL",ad_space_title:"广告位标题",ad_space_title_label:"由...支持",ad_slots:"广告位",ad_slots_hint:"广告网址和图像文件路径以CSV格式存储,扩展可以选择遵循。",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"启用广告",ads_disabled:"广告已禁用",user_management:"用户管理",admin_users:"管理员用户",admin_users_hint:"具有管理员权限的用户",admin_users_label:"用户ID",allowed_users:"允许的用户",allowed_users_hint:"仅这些用户可以使用LNbits",allowed_users_label:"用户 ID",allow_creation_user:"允许创建新用户",allow_creation_user_desc:"允许在索引页面上创建新用户",components:"组件",long_running_endpoints:"前五个长时间运行的端点",http_request_methods:"HTTP请求方法",http_response_codes:"HTTP响应代码",request_details:"请求详情",http_request_details:"HTTP请求详细信息"},window.localisation.nl={confirm:"Ja",server:"Server",theme:"Thema",site_customisation:"Site-aanpassing",funding:"Financiering",users:"Gebruikers",audit:"Controle",apps:"Apps",channels:"Kanalen",transactions:"Transacties",dashboard:"Dashboard",node:"Knooppunt",export_users:"Gebruikers exporteren",no_users:"Geen gebruikers gevonden",total_capacity:"Totale capaciteit",avg_channel_size:"Gem. Kanaalgrootte",biggest_channel_size:"Grootste Kanaalgrootte",smallest_channel_size:"Kleinste Kanaalgrootte",number_of_channels:"Aantal kanalen",active_channels:"Actieve Kanalen",connect_peer:"Peer verbinden",connect:"Verbinden",open_channel:"Open Kanaal",open:"Open",close_channel:"Kanaal Sluiten",close:"Sluiten",restart:"Server opnieuw opstarten",save:"Opslaan",save_tooltip:"Sla uw wijzigingen op",credit_debit:"Credit / Debet",credit_hint:"Druk op Enter om de rekening te crediteren",credit_label:"{denomination} te crediteren",credit_ok:"Succesvol crediteren/debiteren van virtuele gelden ({amount} sats). Betalingen zijn afhankelijk van de werkelijke fondsen op de financieringsbron.",restart_tooltip:"Start de server opnieuw op zodat wijzigingen van kracht worden",add_funds_tooltip:"Voeg geld toe aan een portemonnee.",reset_defaults:"Standaardinstellingen herstellen",reset_defaults_tooltip:"Wis alle instellingen en herstel de standaardinstellingen.",download_backup:"Databaseback-up downloaden",name_your_wallet:"Geef je {name} portemonnee een naam",paste_invoice_label:"Plak een factuur, betalingsverzoek of lnurl-code*",lnbits_description:"Gemakkelijk in te stellen en lichtgewicht, LNbits kan op elke lightning-netwerkfinancieringsbron draaien en zelfs LNbits zelf! U kunt LNbits voor uzelf laten draaien of gemakkelijk een bewaardersoplossing voor anderen bieden. Elke portemonnee heeft zijn eigen API-sleutels en er is geen limiet aan het aantal portemonnees dat u kunt maken. Het kunnen partitioneren van fondsen maakt LNbits een nuttige tool voor geldbeheer en als ontwikkelingstool. Extensies voegen extra functionaliteit toe aan LNbits, zodat u kunt experimenteren met een reeks toonaangevende technologieën op het bliksemschichtnetwerk. We hebben het ontwikkelen van extensies zo eenvoudig mogelijk gemaakt en als een gratis en opensource-project moedigen we mensen aan om hun eigen ontwikkelingen in te dienen.",export_to_phone:"Exporteren naar telefoon met QR-code",export_to_phone_desc:"Deze QR-code bevat uw portemonnee-URL met volledige toegang. U kunt het vanaf uw telefoon scannen om uw portemonnee van daaruit te openen.",wallet:"Wallet:",wallets:"Portemonnees",add_wallet:"Een nieuwe portemonnee toevoegen",delete_wallet:"Portemonnee verwijderen",delete_wallet_desc:"Deze hele portemonnee wordt verwijderd, de fondsen worden NIET TERUGGEVONDEN.",rename_wallet:"Portemonnee hernoemen",update_name:"Naam bijwerken",fiat_tracking:"Volgfunctie voor fiat-valuata",currency:"Valuta",update_currency:"Valuta bijwerken",press_to_claim:"Druk om bitcoin te claimen",donate:"Doneren",view_github:"Bekijken op GitHub",voidwallet_active:"VoidWallet is actief! Betalingen uitgeschakeld",use_with_caution:"GEBRUIK MET VOORZICHTIGHEID - {name} portemonnee is nog in BETA",service_fee:"Servicekosten: {amount} % per transactie",service_fee_max:"Servicekosten: {amount} % per transactie (max {max} sats)",service_fee_tooltip:"Transactiekosten in rekening gebracht door de LNbits serverbeheerder per uitgaande transactie",toggle_darkmode:"Donkere modus aan/uit",payment_reactions:"Betalingsreacties",view_swagger_docs:"Bekijk LNbits Swagger API-documentatie",api_docs:"API-documentatie",api_keys_api_docs:"Node URL, API-sleutels en API-documentatie",lnbits_version:"LNbits-versie",runs_on:"Draait op",paste:"Plakken",paste_from_clipboard:"Plakken van klembord",paste_request:"Verzoek plakken",create_invoice:"Factuur aanmaken",camera_tooltip:"Gebruik de camera om een factuur/QR-code te scannen",export_csv:"Exporteer naar CSV",chart_tooltip:"Toon grafiek",pending:"In behandeling",copy_invoice:"Kopieer factuur",withdraw_from:"Opnemen van",cancel:"Annuleren",scan:"Scannen",read:"Lezen",pay:"Betalen",memo:"Memo",date:"Datum",payment_processing:"Verwerking betaling...",not_enough_funds:"Onvoldoende saldo!",search_by_tag_memo_amount:"Zoeken op tag, memo, bedrag",invoice_waiting:"Factuur wachtend op betaling",payment_received:"Betaling ontvangen",payment_sent:"Betaling verzonden",receive:"ontvangen",send:"versturen",outgoing_payment_pending:"Uitgaande betaling in behandeling",drain_funds:"Geld opnemen",drain_funds_desc:"Dit is een LNURL-withdraw QR-code om alles uit deze portemonnee te halen. Deel deze code niet met anderen. Het is compatibel met balanceCheck en balanceNotify zodat jouw portemonnee continu geld kan blijven opnemen vanaf hier na de eerste opname.",i_understand:"Ik begrijp het",copy_wallet_url:"Kopieer portemonnee-URL",disclaimer_dialog_title:"Belangrijk!",disclaimer_dialog:"Inlogfunctionaliteit wordt uitgebracht in een toekomstige update. Zorg er nu voor dat je deze pagina als favoriet markeert om in de toekomst toegang te krijgen tot je portemonnee! Deze service is in BETA en we zijn niet verantwoordelijk voor mensen die de toegang tot hun fondsen verliezen.",no_transactions:"Er zijn nog geen transacties gedaan",manage:"Beheer",exchanges:"Beurzen",extensions:"Extensies",no_extensions:"Je hebt geen extensies geïnstalleerd :(",created:"Aangemaakt",search_extensions:"Zoekextensies",extension_sources:"Extensiebronnen",ext_sources_hint:"Repositories van waar de extensies kunnen worden gedownload",ext_sources_label:"Bron-URL (gebruik alleen de officiële LNbits-extensiebron en bronnen die je kunt vertrouwen)",warning:"Waarschuwing",repository:"Repository",confirm_continue:"Weet je zeker dat je wilt doorgaan?",manage_extension_details:"Installeren/verwijderen van extensie",install:"Installeren",uninstall:"Deïnstalleren",drop_db:"Gegevens verwijderen",enable:"Inschakelen",pay_to_enable:"Betalen om te activeren",enable_extension_details:"Schakel extensie in voor huidige gebruiker",disable:"Uitschakelen",delete:"Verwijderen",installed:"Geïnstalleerd",activated:"Geactiveerd",deactivated:"Gedeactiveerd",release_notes:"Release-opmerkingen",activate_extension_details:"Maak extensie beschikbaar/niet beschikbaar voor gebruikers",featured:"Uitgelicht",all:"Alles",only_admins_can_install:"Alleen beheerdersaccounts kunnen extensies installeren",admin_only:"Alleen beheerder",new_version:"Nieuwe Versie",extension_depends_on:"Afhankelijk van:",extension_rating_soon:"Beoordelingen binnenkort beschikbaar",extension_installed_version:"Geïnstalleerde versie",extension_uninstall_warning:"U staat op het punt de extensie voor alle gebruikers te verwijderen.",uninstall_confirm:"Ja, de-installeren",extension_db_drop_info:"Alle gegevens voor de extensie zullen permanent worden verwijderd. Er is geen manier om deze bewerking ongedaan te maken!",extension_db_drop_warning:"U staat op het punt alle gegevens voor de extensie te verwijderen. Typ de naam van de extensie om door te gaan:",extension_required_lnbits_version:"Deze release vereist ten minste LNbits-versie",min_version:"Minimum (inbegrepen)",max_version:"Maximum (uitgesloten)",payment_hash:"Betalings-hash",fee:"Kosten",amount:"Bedrag",amount_sats:"Bedrag (sats)",tag:"Label",unit:"Eenheid",description:"Beschrijving",expiry:"Vervaldatum",webhook:"Webhook",payment_proof:"Betalingsbewijs",update:"Bijwerken",update_available:"Update {version} beschikbaar!",latest_update:"U bent op de nieuwste versie {version}.",notifications:"Meldingen",no_notifications:"Geen meldingen",notifications_disabled:"LNbits-statusmeldingen zijn uitgeschakeld.",enable_notifications:"Schakel meldingen in",enable_notifications_desc:"Indien ingeschakeld zal het de laatste LNbits Status updates ophalen, zoals veiligheidsincidenten en updates.",enable_watchdog:"Inschakelen Watchdog",enable_watchdog_desc:"Indien ingeschakeld, wordt uw betaalbron automatisch gewijzigd naar VoidWallet als uw saldo lager is dan het saldo van LNbits. U zult dit na een update handmatig moeten inschakelen.",watchdog_interval:"Watchdog-interval",watchdog_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op een killswitch signaal in het watchdog verschil [node_balance - lnbits_balance] (in minuten).",watchdog_delta:"Waakhond Delta",watchdog_delta_desc:"Limiet voordat de killswitch de financieringsbron verandert naar VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notificatiebron",notification_source_label:"Bron-URL (gebruik alleen de officiële LNbits-statusbron en bronnen die u vertrouwt)",more:"meer",less:"minder",releases:"Uitgaven",watchdog:"Waakhond",server_logs:"Serverlogboeken",ip_blocker:"IP-blokkering",security:"Beveiliging",security_tools:"Beveiligingstools",block_access_hint:"Toegang blokkeren per IP",allow_access_hint:"Toegang verlenen op basis van IP (zal geblokkeerde IP's overschrijven)",enter_ip:"Voer IP in en druk op enter",rate_limiter:"Snelheidsbegrenzer",wallet_limiter:"Portemonnee Limietsteller",wallet_limit_max_withdraw_per_day:"Maximale dagelijkse opname van wallet in sats (0 om uit te schakelen)",wallet_max_ballance:"Maximale portefeuillesaldo in sats (0 om uit te schakelen)",wallet_limit_secs_between_trans:"Min seconden tussen transacties per portemonnee (0 om uit te schakelen)",number_of_requests:"Aantal verzoeken",time_unit:"Tijdeenheid",minute:"minuut",second:"seconde",hour:"uur",disable_server_log:"Serverlog uitschakelen",enable_server_log:"Activeer Serverlog",coming_soon:"Functie binnenkort beschikbaar",session_has_expired:"Uw sessie is verlopen. Log alstublieft opnieuw in.",instant_access_question:"Wil je directe toegang?",login_with_user_id:"Inloggen met gebruikers-ID",or:"of",create_new_wallet:"Nieuwe portemonnee aanmaken",login_to_account:"Log in op je account",create_account:"Account aanmaken",account_settings:"Accountinstellingen",signin_with_nostr:"Doorgaan met Nostr",signin_with_google:"Inloggen met Google",signin_with_github:"Inloggen met GitHub",signin_with_keycloak:"Inloggen met Keycloak",username_or_email:"Gebruikersnaam of e-mail",password:"Wachtwoord",password_config:"Wachtwoordconfiguratie",password_repeat:"Wachtwoord herhalen",change_password:"Wachtwoord wijzigen",update_credentials:"Referenties bijwerken",update_pubkey:"Openbare Sleutel Bijwerken",set_password:"Wachtwoord instellen",invalid_password:"Wachtwoord moet ten minste 8 tekens bevatten",login:"Inloggen",register:"Registreren",username:"Gebruikersnaam",pubkey:"Publieke Sleutel",user_id:"Gebruikers-ID",email:"E-mail",first_name:"Voornaam",last_name:"Achternaam",picture:"Foto",verify_email:"E-mail verifiëren met",account:"Account",update_account:"Account bijwerken",invalid_username:"Ongeldige gebruikersnaam",auth_provider:"Auth Provider",my_account:"Mijn Account",back:"Terug",logout:"Afmelden",look_and_feel:"Uiterlijk en gedrag",toggle_gradient:"Gradiënt Schakelen",gradient_background:"Verloopachtergrond",language:"Taal",color_scheme:"Kleurenschema",admin_settings:"Beheerdersinstellingen",extension_cost:"Deze release vereist een betaling van minimaal {cost} sats.",extension_paid_sats:"U heeft al {paid_sats} sats betaald.",release_details_error:"Kan de gegevens van de release niet ophalen.",pay_from_wallet:"Betalen vanuit Portemonnee",wallet_required:"Wallet *",show_qr:"Toon QR",retry_install:"Opnieuw installeren",new_payment:"Nieuwe betaling maken",update_payment:"Betaling bijwerken",already_paid_question:"Heb je al betaald?",sell:"Verkopen",sell_require:"Vraag betaling om de extensie te activeren.",sell_info:"De {name} extensie vereist een betaling van minimaal {amount} sats om in te schakelen.",hide_empty_wallets:"Verberg lege portemonnees",recheck:"Opnieuw controleren",contributors:"Bijdragers",license:"Licentie",reset_key:"Hersteltoets",reset_password:"Wachtwoord Resetten",border_choices:"Randkeuzes",select_all:"Alles selecteren",nfc_supported:"NFC Ondersteund",nfc_not_supported:"NFC niet ondersteund",expire_date:"Vervaldatum:",hash:"Hash:",welcome_lnbits:"Welkom bij LNbits",setup_su_account:"Stel het Superuser-account hieronder in.",create_ticker_converter:"Maak Valuta Ticker Converter",enable_audit:"Audit inschakelen",recommended:"Aanbevolen",audit_desc:"HTTP-verzoeken vastleggen volgens de opgegeven filters",audit_record_req:"Verzoeklichaam registreren",audit_record_warning:"Waarschuwing:",audit_record_req_warning_1:"vertrouwelijke gegevens (zoals wachtwoorden) worden gelogd.",audit_record_req_warning_2:"de aanvraagbody kan een grote omvang hebben.",audit_record_use:"Gebruik het met voorzichtigheid.",audit_ip:"IP-adres vastleggen",audit_ip_desc:"Leg het IP-adres van de klant vast",audit_path_params:"Parameters van het pad opnemen",audit_query_params:"Queryparameters vastleggen",audit_http_methods:"Inclusief HTTP-methoden",audit_http_methods_hint:"Lijst van HTTP-methoden die moeten worden opgenomen. Lege lijsten betekenen alles.",audit_http_methods_label:"HTTP-methoden",audit_resp_codes:"Inclusief HTTP-responscodes",audit_resp_codes_hint:"Lijst van op te nemen HTTP-codes (regex-overeenkomst). Lege lijst betekent alles. Bijvoorbeeld: 4.*, 5.*",audit_resp_codes_label:"HTTP-responscode (regex)",audit_paths:"Inclusiepad",audit_paths_hint:"Lijst met paden die moeten worden opgenomen (regex match). Lege lijst betekent alles.",audit_paths_label:"HTTP-pad (regex)",audit_paths_exclude:"Paden uitsluiten",audit_paths_exclude_hint:"Lijst met paden die moeten worden uitgesloten (regex-overeenkomst). Een lege lijst betekent geen.",audit_paths_exclude_label:"HTTP-pad (regex)",exchange_providers:"Wisselaanbieders",admin_extensions:"Beheeruitbreidingen",admin_extensions_label:"Beheerdersuitbreidingen",admin_extensions_hint:"Alleen gebruikers met beheerdersrechten kunnen extensies gebruiken.",user_default_extensions:"Standaardextensies voor gebruikers",user_default_extensions_label:"Gebruikersuitbreidingen",user_default_extensions_hint:"Extensies die standaard voor de gebruikers worden ingeschakeld.",miscellanous:"Diversen",misc_disable_extensions:"Extensies uitschakelen",misc_disable_extensions_label:"Alle extensies uitschakelen",misc_hide_api:"API verbergen",misc_hide_api_label:"Verbergt de wallet-API, extensies kunnen ervoor kiezen dit te respecteren",wallets_management:"Beheer van portemonnees",funding_source_info:"Financieringsbroninfo",funding_source:"Financieringsbron: {wallet_class}",node_balance:"Node Balans: {balance} sats",lnbits_balance:"LNbits Saldo: {balance} sats",funding_reserve_percent:"Reservepercentage: {percent} %",node_management:"Nodebeheer",node_management_not_supported:"Nodebeheer wordt niet ondersteund door de actieve financieringsbron",toggle_node_ui:"Node UI",toggle_public_node_ui:"Openbare Node UI",toggle_transactions_node_ui:"Transacties Tabblad (Uitschakelen op grote CLN-nodes)",invoice_expiry:"Factuurvervaldatum",invoice_expiry_label:"Factuurverloop (seconden)",fee_reserve:"Toegangsvergoeding Reserve",fee_reserve_msats:"Reserveringskosten in msats",fee_reserve_percent:"Reserveringskosten in procent",server_management:"Serverbeheer",base_url:"Basis-URL",base_url_label:"Statisch/Basis-URL voor de server",authentication:"Authenticatie",auth_token_expiry_label:"Token vervalt over minuten",auth_token_expiry_hint:"Tijd in minuten totdat de token verloopt",auth_allowed_methods_label:"Toegestane autorisatiemethoden",auth_allowed_methods_hint:"Selecteer autorisatiemethoden",auth_nostr_label:"Nostr Aanvraag-URL",auth_nostr_hint:"Absolute URL die de klanten zullen gebruiken om in te loggen.",auth_google_ci_label:"Google Client-ID",auth_google_ci_hint:"Zorg ervoor dat de geautoriseerde omleidings-URL's https://{domain}/api/v1/auth/google/token bevatten.",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"GitHub client-ID",auth_gh_client_id_hint:"Zorg ervoor dat de autorisatie-callback-URL is ingesteld op https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Clientgeheim",auth_keycloak_label:"Keycloak Ontdekking URL",auth_keycloak_ci_label:"Keycloak-client-ID",auth_keycloak_ci_hint:"Zorg ervoor dat de autorisatie callback-URL is ingesteld op https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak Clientgeheim",auth_keycloak_custom_org_label:"Keycloak Aangepaste Organisatie",auth_keycloak_custom_icon_label:"Keycloak Aangepast Pictogram (URL)",auth_oidc_label:"OIDC Ontdekking URL",auth_oidc_ci_label:"OIDC-client-ID",auth_oidc_ci_hint:"Zorg ervoor dat de autorisatie callback-URL is ingesteld op https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC Clientgeheim",auth_oidc_custom_org_label:"OIDC Aangepaste Organisatienaam (bijv. Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC Aangepast Pictogram (URL)",currency_settings:"Valuta-instellingen",allowed_currencies:"Toegestane valuta's",allowed_currencies_hint:"Beperk het aantal beschikbare fiatvaluta's",default_account_currency:"Standaardrekeningvaluta",default_account_currency_hint:"Standaardvaluta voor boekhouding",service_fee_label:"Servicekosten (%)",service_fee_hint:"Toeslag per transactie (%)",service_fee_max_label:"Servicekosten max (sats)",service_fee_max_hint:"Maximale servicekosten om in rekening te brengen in (sats)",fee_wallet:"Kosten Portemonnee",fee_wallet_label:"Kosten portemonnee (wallet ID)",fee_wallet_hint:"Wallet-ID om geld naar over te maken",disable_fee:"Kosten uitschakelen",disable_fee_internal:"Servicekosten uitschakelen voor interne betalingen",disable_fee_internal_desc:"Dienstenkosten uitschakelen voor interne Lightning-betalingen",ui_management:"UI-beheer",ui_site_title:"Site titel",ui_site_tagline:"Site-slogan",ui_elements_enable:"Elementen op de homepage inschakelen",ui_elements_disable:"Elementen op de homepage uitschakelen",ui_toggle_elements_tip:"Verwijder startpagina-elementen zoals 'werkt op' enz.",ui_site_description:"Sitebeschrijving",ui_site_description_hint:"Gebruik platte tekst, Markdown, of ruwe HTML",ui_default_wallet_name:"Standaard Wallet Naam",lnbits_wallet:"LNbits-portemonnee",denomination:"Denominatie",denomination_hint:"De naam voor de FakeWallet token",ui_qr_code_logo:"QR-code-logo",ui_qr_code_logo_hint:"URL naar logo-afbeelding in QR-code",ui_custom_badge:"Aangepaste badge",ui_custom_badge_label:"Aangepaste Badge 'GEBRUIK MET VOORZICHTIGHEID - LNbits-portemonnee is nog in BÈTA'",ui_custom_badge_color_label:"Aangepaste Badge Kleur",themes:"Thema's",themes_hint:"Kies thema's beschikbaar voor gebruikers",custom_logo:"Aangepast logo",custom_logo_hint:"URL naar logo-afbeelding",ad_space_title:"Advertentieruimte Titel",ad_space_title_label:"Ondersteund door",ad_slots:"Advertentieblokken",ad_slots_hint:"Ad URL en afbeeldingspad in CSV-formaat, extensies kunnen ervoor kiezen te honoreren",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Advertenties ingeschakeld",ads_disabled:"Advertenties uitgeschakeld",user_management:"Gebruikersbeheer",admin_users:"Beheerdersgebruikers",admin_users_hint:"Gebruikers met beheerdersrechten",admin_users_label:"Gebruikers-ID",allowed_users:"Toegestane gebruikers",allowed_users_hint:"Alleen deze gebruikers kunnen LNbits gebruiken",allowed_users_label:"Gebruikers-ID",allow_creation_user:"Sta het aanmaken van nieuwe gebruikers toe",allow_creation_user_desc:"Sta de aanmaak van nieuwe gebruikers op de indexpagina toe",components:"Componenten",long_running_endpoints:"Top 5 langlopende eindpunten",http_request_methods:"HTTP-aanvraagmethoden",http_response_codes:"HTTP-responscodes",request_details:"Aanvraagdetails",http_request_details:"HTTP-verzoekdetails"},window.localisation.pi={confirm:"Aye",server:"Cap`n",theme:"Theme",site_customisation:"Site Customisation",funding:"Funding",users:"Buccaneers",audit:"Arrr-dit",apps:"Arrrrplications",channels:"Channels",transactions:"Pirate Transactions and loot",dashboard:"Arrr-board",node:"Node",export_users:"Export Mateys",no_users:"No swabbies found",total_capacity:"Total Capacity",avg_channel_size:"Avg. Channel Size",biggest_channel_size:"Largest Bilge Size",smallest_channel_size:"Smallest Channel Size",number_of_channels:"Nummer o' Channels",active_channels:"Active Channels",connect_peer:"Connect Peer",connect:"Connect",open_channel:"Open Channel",open:"Open yer hatches",close_channel:"Shut Yer Gob Channel",close:"Batten down the hatches, we be closin",restart:"Arr, restart Cap`n",save:"Bury Treasure",save_tooltip:"Bury yer changes, matey",credit_debit:"Credit / Debit",credit_hint:"Press Enter to credit account and make it richer",credit_label:"{denomination} to credit, arr!",credit_ok:"Success creditin'/debitin' virtual funds ({amount} sats). Payments depend on actual funds on fundin' source.",restart_tooltip:"Restart the Cap`n for changes to take effect, arr!",add_funds_tooltip:"Add doubloons to a chest and make it heavier",reset_defaults:"Reset to Davy Jones Locker",reset_defaults_tooltip:"Scuttle all settings and reset to Davy Jones Locker. Aye, start anew!",download_backup:"Download database booty",name_your_wallet:"Name yer {name} treasure chest",paste_invoice_label:"Paste a booty, payment request or lnurl code, matey!",lnbits_description:"Arr, easy to set up and lightweight, LNbits can run on any Lightning Network funding source and even LNbits itself! Ye can run LNbits for yourself, or easily offer a custodian solution for others. Each chest has its own API keys and there be no limit to the number of chests ye can make. Being able to partition booty makes LNbits a useful tool for money management and as a development tool. Arr, extensions add extra functionality to LNbits so ye can experiment with a range of cutting-edge technologies on the lightning network. We have made developing extensions as easy as possible, and as a free and open-source project, we encourage scallywags to develop and submit their own.",export_to_phone:"Export to Phone with QR Code, me hearties",export_to_phone_desc:"This QR code contains yer chest URL with full access. Ye can scan it from yer phone to open yer chest from there, arr!",wallet:"Booty Chest:",wallets:"Treasure Chests",add_wallet:"Add a new chest and fill it with doubloons!",delete_wallet:"Scuttle the Chest",delete_wallet_desc:"This whole chest will be scuttled, the booty will be UNRECOVERABLE. Aye, be warned!",rename_wallet:"Rename the Chest, me hearty",update_name:"Update name like a captain",fiat_tracking:"Trackin' o' the treasure",currency:"Curr'nsey",update_currency:"Update doubloons",press_to_claim:"Press to claim gold doubloons, matey!",donate:"Donate like a true pirate!",view_github:"View on GitHub and find treasures",voidwallet_active:"VoidWallet be active! Payments disabled",use_with_caution:"USE WITH CAUTION - {name} chest be still in BETA. Aye, be careful!",service_fee:"Service fee: {amount} % per transaction",service_fee_max:"Service fee: {amount} % per transaction (max {max} sats)",service_fee_tooltip:"Service fee charged by the LNbits server admin per goin' transaction",toggle_darkmode:"Toggle Dark Mode, arr!",payment_reactions:"Payment Reactions",view_swagger_docs:"View LNbits Swagger API docs and learn the secrets",api_docs:"API docs for the scallywags",api_keys_api_docs:"Node URL, API keys and API docs",lnbits_version:"LNbits version, arr!",runs_on:"Runs on, matey",paste:"Stow",paste_from_clipboard:"Paste from clipboard",paste_request:"Paste Request and find treasures",create_invoice:"Create Booty Request and get rich, me hearties!",camera_tooltip:"Use spyglass to scan a booty/QR, arr!",export_csv:"Export to CSV and keep track of the booty",chart_tooltip:"Show ye chart, me hearty",pending:"Pendin like a ship at anchor",copy_invoice:"Copy booty request, arrr",withdraw_from:"Withdraw from",cancel:"Abandon ship! We be retreatin",scan:"Avast! Scan me beauty, arrr",read:"Read it, if ye dare",pay:"Pay up or walk the plank, ye scallywag",memo:"Message in a bottle, argh",date:"Date of the map, me matey",payment_processing:"Processing yer payment... don´t make me say it again",not_enough_funds:"Arrr, ye don´t have enough doubloons! Walk the plank!",search_by_tag_memo_amount:"Search by tag, message, or booty amount, savvy",invoice_waiting:"Invoice waiting to be plundered, arrr",payment_received:"Payment Received like a treasure, argh",payment_sent:"Payment Sent, hoist the colors! We´ve got some doubloons!",receive:"booty",send:"hoist",outgoing_payment_pending:"Outgoing payment pending in the port, ye scurvy dog",drain_funds:"Plunder all the doubloons, ye buccaneer",drain_funds_desc:"This be an LNURL-withdraw QR code for slurpin everything from this wallet. Don`t share with anyone. It be compatible with balanceCheck and balanceNotify so yer wallet may keep pullin` the funds continuously from here after the first withdraw.",i_understand:"I understand, yo ho ho and a bottle of rum!",copy_wallet_url:"Copy wallet URL like a map, savvy",disclaimer_dialog_title:"Avast!",disclaimer_dialog:"Login functionality to be released in a future update, for now, make sure ye bookmark this page for future access to your booty! This service be in BETA, and we hold no responsibility for people losing access to doubloons.",no_transactions:"No transactions made yet, me hearties. Belay that!",manage:"Manage, me hearty",exchanges:"Exchanges",extensions:"Yer Extensions, ye scurvy dog",no_extensions:"Ye don't have any extensions installed, ye scallywag :(. Where be yer loot?",created:"Created like a legend, savvy",search_extensions:"Search fer extensions",extension_sources:"Extension Sources",ext_sources_hint:"Repositories from wharrr the extensions can be downloaded",ext_sources_label:"Source URL (only use th' official LNbits extension source, and sources ye can trust)",warning:"Avast",repository:"Repository",confirm_continue:"Be ye sure ye want t' proceed?",manage_extension_details:"Install/uninstall extension",install:"Set sail",uninstall:"Avaast",drop_db:"Scuttle Data",enable:"Enable",pay_to_enable:"Pay To Hoist",enable_extension_details:"Enable extension fer th' current user",disable:"Disablin'",delete:"Blow down",installed:"Installed",activated:"Activated",deactivated:"Deactivated",release_notes:"Release Notes",activate_extension_details:"Make extension available/unavailable fer users",featured:"Featured",all:"Arr",only_admins_can_install:"(Only admin accounts can install extensions)",admin_only:"Cap'n Only",new_version:"New Version",extension_depends_on:"Depends on:",extension_rating_soon:"Ratings a'comin' soon",extension_installed_version:"Installed version",extension_uninstall_warning:"Ye be about t' remove th' extension fer all hands.",uninstall_confirm:"Aye, Uninstall",extension_db_drop_info:"All data fer th' extension will be permanently deleted. There be no way to undo this operation!",extension_db_drop_warning:"Ye be about to scuttle all data fer th' extension. Please scribble th' extension name to continue:",extension_required_lnbits_version:"This release be needin' at least LNbits version",min_version:"Minimum (inclooded)",max_version:"Maximum (excluded)",payment_hash:"Payment Hash like a treasure map, arrr",fee:"Fee like a toll to cross a strait, matey",amount:"Amount of doubloons, arrr",amount_sats:"Amount (sats)",tag:"Tag",unit:"Unit of measurement like a fathom, ye buccaneer",description:"Description like a tale of adventure, arrr",expiry:"Expiry like the food on a ship, ye landlubber",webhook:"Webhook like a fishing line, arrr",payment_proof:"Payment Proof like a seal of authenticity, argh",update:"Updatin'",update_available:"Update {version} available, me matey!",latest_update:"Ye be on th' latest version {version}.",notifications:"Notificashuns",no_notifications:"No noticin's",notifications_disabled:"LNbits status notifications be disabled, arr!",enable_notifications:"Enable Notifications",enable_notifications_desc:"If ye be allowin' it, it'll be fetchin' the latest LNbits Status updates, like security incidents and updates.",enable_watchdog:"Enable Seadog",enable_watchdog_desc:"If enabled, it will swap yer treasure source t' VoidWallet on its own if yer balance be lower than th' LNbits balance. Ye'll need t' enable by hand after an update.",watchdog_interval:"Seadog Interval",watchdog_interval_desc:"How oft th' background task should be checkin' fer a killswitch signal in th' seadog delta [node_balance - lnbits_balance] (in minutes), arr.",watchdog_delta:"Seadog Delta",watchdog_delta_desc:"Limit afore killswitch changes fundin' source to VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notification Source",notification_source_label:"Source URL (only use th' official LNbits status source, and sources ye can trust)",more:"Arr, 'tis more.",less:"Arr, 'tis more fewer.",releases:"Releases",watchdog:"Seadog",server_logs:"Server Logs",ip_blocker:"IP Blockar",security:"Securrrity",security_tools:"Securrrity tools",block_access_hint:"Block access by IP",allow_access_hint:"Grant permission by IP (will override barred IPs)",enter_ip:"Enter IP and hit enter",rate_limiter:"Rate Limiter",wallet_limiter:"Pouch Limitar",wallet_limit_max_withdraw_per_day:"Max daily wallet withdrawal in sats (0 for no limit, -1 to block withdrawal)",wallet_max_ballance:"Purse max heaviness in sats (0 fer scuttle)",wallet_limit_secs_between_trans:"Min secs 'tween transactions per wallet (0 to disable)",number_of_requests:"Number o' requests",time_unit:"time bein'",minute:"minnit",second:"second",hour:"hour",disable_server_log:"Disabl' {Server} Log",enable_server_log:"Enable Server Log",coming_soon:"Feature comin' soon",session_has_expired:"Yer session has expired. Please login again.",instant_access_question:"Be wantin' quick entry, aye?",login_with_user_id:"Login with user ID",or:"arr",create_new_wallet:"Create New Wallet",login_to_account:"Log in to yer account",create_account:"Create account",account_settings:"Account Settin's",signin_with_nostr:"Continue with Nostr",signin_with_google:"Sign in wit' Google",signin_with_github:"Sign in wit' GitHub",signin_with_keycloak:"Sign in wit' Keycloak",username_or_email:"Usarrrname or Email",password:"Passwarrd",password_config:"Passwarrd Config",password_repeat:"Passwarrd repeat",change_password:"Change Passwarrd",update_credentials:"Hoist New Credentials",update_pubkey:"Swab Public Key",set_password:"Set yer Secret Code",invalid_password:"Passwarrd must be havin' at leest 8 charrracters",login:"Log in",register:"Sign on",username:"Username",pubkey:"Public Key",user_id:"User ID",email:"Email",first_name:"Firrrst Name",last_name:"Surname",picture:"pictur'",verify_email:"Verify email with",account:"Arrrccount",update_account:"Updatin' Arrrccount",invalid_username:"Username be not valid, matey!",auth_provider:"Auth Provider becometh Auth Provider, ye see?",my_account:"Me Arrrccount",back:"Return",logout:"Log out yer session",look_and_feel:"Look and Feel",toggle_gradient:"Toggle Gradient",gradient_background:"Gradient Background",language:"Langwidge",color_scheme:"Colour Scheme",admin_settings:"Admin Settin's",extension_cost:"This release be needin' a payment o' minimum {cost} sats, arr.",extension_paid_sats:"Ye have already paid {paid_sats} sats.",release_details_error:"Cannot get th' release details.",pay_from_wallet:"Pay from ye Wallet",wallet_required:"Doubloon Locker *",show_qr:"Show QR",retry_install:"Try 'nstallin' Again",new_payment:"Make New Payment",update_payment:"Be Updatin' Payment",already_paid_question:"Have ye already paid?",sell:"Sell",sell_require:"Ask fer payment to enable extension",sell_info:"The {name} extension requires a payment of minimum {amount} sats to enable.",hide_empty_wallets:"Stow empty wallets",recheck:"Recheck",contributors:"Contributors",license:"License",reset_key:"Reset Key",reset_password:"Reset Password",border_choices:"Border Choices",select_all:"Select All",nfc_supported:"NFC Supported",nfc_not_supported:"NFC not Supported",expire_date:"Expire Date:",hash:"Mizzenmast:",welcome_lnbits:"Welcome t' LNbits",setup_su_account:"Set up the Superuser account below.",create_ticker_converter:"Create Currency Ticker Converter",enable_audit:"Set Sail Fer Auditin'",recommended:"Recommended",audit_desc:"Record HTTP requests accordin' with the specified filters",audit_record_req:"Record Request Body",audit_record_warning:"Arrrning:",audit_record_req_warning_1:"confidential data (like passwords) will be logged.",audit_record_req_warning_2:"th' request body can have large size.",audit_record_use:"Use it with caution.",audit_ip:"Log IP Address",audit_ip_desc:"Record the IP address o' the client",audit_path_params:"Record Path Parameters",audit_query_params:"Rransack th' Query Parameters",audit_http_methods:"Include HTTP Methods",audit_http_methods_hint:"List o' HTTP methods to be included. Empty lists means all.",audit_http_methods_label:"HTTP Methods",audit_resp_codes:"Include HTTP Response Codes",audit_resp_codes_hint:"List o' HTTP codes t' be included (regex match). Empty lists means all. Eg: 4.*, 5.*",audit_resp_codes_label:"HTTP Response code (regex)",audit_paths:"Include Paths",audit_paths_hint:"List o' paths t' be included (regex match). Empty list means all.",audit_paths_label:"HTTP Path (regex)",audit_paths_exclude:"Exclude Paths",audit_paths_exclude_hint:"List o' paths t' be excluded (regex match). Empty list means none.",audit_paths_exclude_label:"HTTP Path (regex)",exchange_providers:"Trade Buccaneers",admin_extensions:"Admin Extensions",admin_extensions_label:"Admin extensions",admin_extensions_hint:"Extensions only user with admin privileges can use",user_default_extensions:"Crew Mate Default Extensions",user_default_extensions_label:"User extensions",user_default_extensions_hint:"Extensions that will be enabled by default fer the users.",miscellanous:"Miscelaneous",misc_disable_extensions:"Belay Extensions",misc_disable_extensions_label:"Disable all extensions",misc_hide_api:"Stow API",misc_hide_api_label:"Burieds wallet api, extensions be able t' choose t' honor",wallets_management:"Wallets Management",funding_source_info:"Loot Source Info",funding_source:"Loot Source: {wallet_class}",node_balance:"Node Balance: {balance} doubloons",lnbits_balance:"LNbits Balance: {balance} pieces o' eight",funding_reserve_percent:"Reserve Percent: {percent} %",node_management:"Node Management",node_management_not_supported:"Node Management not be supported by active funding source",toggle_node_ui:"Node Main Deck",toggle_public_node_ui:"Public Node UI",toggle_transactions_node_ui:"Transactions Tab (Disable on large CLN nodes)",invoice_expiry:"Invoice Expiry",invoice_expiry_label:"Invoice expiry (seconds)",fee_reserve:"Plunder Reserve",fee_reserve_msats:"Reserve fee in msats",fee_reserve_percent:"Reserve fee in percent",server_management:"Server Management",base_url:"Base URL",base_url_label:"Static/Base url fer the server",authentication:"Authent Mateys!",auth_token_expiry_label:"Token expire minutes",auth_token_expiry_hint:"Time in minutes until th' token expires",auth_allowed_methods_label:"Allowed authorizashun methods",auth_allowed_methods_hint:"Select arrrrthorization methods",auth_nostr_label:"Nostr Request URL",auth_nostr_hint:"Absolute URL that th' clients will use t' login.",auth_google_ci_label:"Google Client ID",auth_google_ci_hint:"Make sure that the authorized redirect URIs contain https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"GitHub Client ID",auth_gh_client_id_hint:"Make sure that the authorization callback URL is set to https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Client Secret",auth_keycloak_label:"Keycloak Discovery URL",auth_keycloak_ci_label:"Keycloak Client ID",auth_keycloak_ci_hint:"Make sure thant th' authorization callback URL be set t' https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak Client Secret",auth_keycloak_custom_org_label:"Keycloak Custom Organization",auth_keycloak_custom_icon_label:"Keycloak Custom Icon (URL)",auth_oidc_label:"OIDC Discovery URL",auth_oidc_ci_label:"OIDC Client ID",auth_oidc_ci_hint:"Make sure thant th' authorization callback URL be set t' https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC Client Secret",auth_oidc_custom_org_label:"OIDC Custom Organization Name (e.g., Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC Custom Icon (URL)",currency_settings:"Doubloon Settin's",allowed_currencies:"Allo'ed Doubloons",allowed_currencies_hint:"Limit the number of available fiat doubloons",default_account_currency:"Default Account Currency",default_account_currency_hint:"Default dubloon fer accountin'",service_fee_label:"Service fee (%).",service_fee_hint:"Fee charged per tx (%)",service_fee_max_label:"Service fee max (sats)",service_fee_max_hint:"Max service fee to charge in (sats)",fee_wallet:"Fee Wallet",fee_wallet_label:"Tariff wallet (wallet ID)",fee_wallet_hint:"Wallett ID t' send funds t'",disable_fee:"Disable Fee",disable_fee_internal:"Disable Service Fee for Internal Payments",disable_fee_internal_desc:"Disable Service Fee fer Internal Lightning Payments",ui_management:"UI Management",ui_site_title:"Site Title",ui_site_tagline:"Site Tagline",ui_elements_enable:"Set course for the homepage elements!",ui_elements_disable:"Disarm elements on homepage",ui_toggle_elements_tip:"Be rid of homepage elements like 'runs on' etc",ui_site_description:"Site Description",ui_site_description_hint:"Use plain text, Markdown, or raw HTML",ui_default_wallet_name:"Default Wallet Name",lnbits_wallet:"LNbits wallet",denomination:"Denomination",denomination_hint:"The name fer the FakeWallet doubloon",ui_qr_code_logo:"QR Code Logo",ui_qr_code_logo_hint:"URL t' logo image in QR code",ui_custom_badge:"Custom Badge",ui_custom_badge_label:"Custom Badge 'USE WITH CAUTION - LNbits wallet be still in BETA'",ui_custom_badge_color_label:"Custom Bauble Color",themes:"Themes",themes_hint:"Choose themes available for users",custom_logo:"Custom Logo",custom_logo_hint:"URL to logo image",ad_space_title:"Ad Space Title",ad_space_title_label:"Supported by",ad_slots:"Adversment Sprogs",ad_slots_hint:"Ad url an' image filepaths in CSV format, extensions can choose t' honor",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Ads Enabled",ads_disabled:"Ads Keelhauled",user_management:"User Matey-handlin'",admin_users:"Admin Scurvy Dogs",admin_users_hint:"Scallywags with cap'n privileges",admin_users_label:"User ID",allowed_users:"Allowed Users",allowed_users_hint:"Only these scallywags can use LNbits",allowed_users_label:"User ID",allow_creation_user:"Permit creation of new scallywags",allow_creation_user_desc:"Allow creation o' new users on th' index page",components:"Components",long_running_endpoints:"Top 5 Long Runnin' Endpoints",http_request_methods:"HTTP Request Methods",http_response_codes:"HTTP Response Codes",request_details:"Request Details",http_request_details:"HTTP Request Details"},window.localisation.pl={confirm:"Tak",server:"Serwer",theme:"Motyw",site_customisation:"Dostosowanie witryny",funding:"Finansowanie",users:"Użytkownicy",audit:"Audyt",apps:"Aplikacje",channels:"Kanały",transactions:"Transakcje",dashboard:"Panel kontrolny",node:"Węzeł",export_users:"Eksportuj użytkowników",no_users:"Nie znaleziono użytkowników",total_capacity:"Całkowita Pojemność",avg_channel_size:"Średni rozmiar kanału",biggest_channel_size:"Największy Rozmiar Kanału",smallest_channel_size:"Najmniejszy Rozmiar Kanału",number_of_channels:"Ilość kanałów",active_channels:"Aktywne kanały",connect_peer:"Połącz z węzłem równorzędnym",connect:"Połącz",open_channel:"Otwarty Kanał",open:"Otwórz",close_channel:"Zamknij kanał",close:"Zamknij",restart:"Restart serwera",save:"Zapisz",save_tooltip:"Zapisz zmiany",credit_debit:"Kredyt / Debet",credit_hint:"Naciśnij Enter aby doładować konto",credit_label:"{denomination} doładowanie",credit_ok:"Pomyślne zaksięgowanie/obciążenie wirtualnych środków ({amount} sats). Płatności zależą od rzeczywistych środków na źródle finansowania.",restart_tooltip:"Zrestartuj serwer aby aktywować zmiany",add_funds_tooltip:"Dodaj środki do portfela.",reset_defaults:"Powrót do ustawień domyślnych",reset_defaults_tooltip:"Wymaż wszystkie ustawienia i ustaw domyślne.",download_backup:"Pobierz kopię zapasową bazy danych",name_your_wallet:"Nazwij swój portfel {name}",paste_invoice_label:"Wklej fakturę, żądanie zapłaty lub kod lnurl *",lnbits_description:"Łatwy i lekki w konfiguracji, LNbits może działać w oparciu o dowolne źródło finansowania w sieci lightning czy nawet inną instancję LNbits! Możesz uruchomić instancję LNbits dla siebie lub dla innych. Każdy portfel ma swoje klucze API i nie ma ograniczeń jeśli chodzi o ilość portfeli. LNbits umożliwia dzielenie środków w celu zarządzania nimi, jest również dobrym narzędziem deweloperskim. Rozszerzenia zwiększają funkcjonalność LNbits co umożliwia eksperymentowanie z nowym technologiami w sieci lightning. Tworzenie rozszerzeń jest proste dlatego zachęcamy innych deweloperów do tworzenia dodatkowych funkcjonalności i wysyłanie do nas PR",export_to_phone:"Eksport kodu QR na telefon",export_to_phone_desc:"Ten kod QR zawiera adres URL Twojego portfela z pełnym dostępem do niego. Możesz go zeskanować na swoim telefonie aby otworzyć na nim ten portfel.",wallet:"Portfel:",wallets:"Portfele",add_wallet:"Dodaj portfel",delete_wallet:"Usuń portfel",delete_wallet_desc:"Ten portfel zostanie usunięty, środków na nim zgromadzonych NIE BĘDZIE MOŻNA ODZYSKAĆ.",rename_wallet:"Zmień nazwę portfela",update_name:"Zaktualizuj nazwę",fiat_tracking:"Śledzenie Fiata",currency:"Waluta",update_currency:"Aktualizuj walutę",press_to_claim:"Naciśnij aby odebrać Bitcoiny",donate:"Podaruj",view_github:"Otwórz GitHub",voidwallet_active:"VoidWallet jest aktywny! Płatności są niemożliwe",use_with_caution:"KORZYSTAJ Z ROZWAGĄ - portfel {name} jest w wersji BETA",service_fee:"Opłata serwisowa: {amount} % za transakcję",service_fee_max:"Opłata serwisowa: {amount} % za transakcję (maks {max} sat)",service_fee_tooltip:"Opłata serwisowa pobierana przez administratora serwera LNbits za każdą wychodzącą transakcję",toggle_darkmode:"Tryb nocny",payment_reactions:"Reakcje na płatność",view_swagger_docs:"Dokumentacja Swagger API",api_docs:"Dokumentacja API",api_keys_api_docs:"Adres URL węzła, klucze API i dokumentacja API",lnbits_version:"Wersja LNbits",runs_on:"Działa na",paste:"Wklej",paste_from_clipboard:"Wklej ze schowka",paste_request:"Wklej żądanie",create_invoice:"Utwórz fakturę",camera_tooltip:"Użyj kamery aby zeskanować fakturę lub kod QR",export_csv:"Eksport do CSV",chart_tooltip:"Wykres",pending:"W toku",copy_invoice:"Skopiuj fakturę",withdraw_from:"Wypłać z",cancel:"Anuluj",scan:"Skanuj",read:"Odczytaj",pay:"Zapłać",memo:"Memo",date:"Data",payment_processing:"Przetwarzam płatność...",not_enough_funds:"Brak wystarczających środków!",search_by_tag_memo_amount:"Szukaj po tagu, memo czy wartości",invoice_waiting:"Faktura oczekuje na zapłatę",payment_received:"Otrzymano płatność",payment_sent:"Wysłano płatność",receive:"odbierać",send:"wysłać",outgoing_payment_pending:"Płatność wychodząca w toku",drain_funds:"Opróżnij środki",drain_funds_desc:"To jest kod QR służący do opróżnienia portfela (LNURL-withdraw). Nie udostępniaj go nikomu. Ten kod jest kompatybilny z funkcjami, które umożliwiają wielokrotne żądania aż do zupełnego opróżnienia portfela.",i_understand:"Rozumiem",copy_wallet_url:"Skopiuj URL portfela",disclaimer_dialog_title:"Ważne!",disclaimer_dialog:"Funkcja logowania zostanie uruchomiona w przyszłości. Póki co upewnij się, że zapisałeś adres URL tej strony aby mieć dostęp do tego portfela. Nie udostępniaj adresu tej strony nikomu, kto nie ma mieć do tego portfela dostępu! Ta usługa działa w wersji BETA, nie odpowiadamy za utratę dostępu do środków przez osoby używające LNbits.",no_transactions:"Brak transakcji",manage:"Zarządzaj",exchanges:"Giełdy",extensions:"Rozszerzenia",no_extensions:"Nie masz zainstalowanych żadnych rozszerzeń :(",created:"Utworzono",search_extensions:"Szukaj rozszerzeń",extension_sources:"Źródła rozszerzeń",ext_sources_hint:"Repozytoria, z których można pobrać rozszerzenia",ext_sources_label:"URL źródłowy (używaj tylko oficjalnego źródła rozszerzenia LNbits oraz źródeł, którym możesz zaufać)",warning:"Ostrzeżenie",repository:"Repozytorium",confirm_continue:"Czy na pewno chcesz kontynuować?",manage_extension_details:"Instaluj/odinstaluj rozszerzenie",install:"Zainstaluj",uninstall:"Odinstaluj",drop_db:"Usuń dane",enable:"Włącz",pay_to_enable:"Zapłać, aby włączyć",enable_extension_details:"Włącz rozszerzenie dla aktualnego użytkownika",disable:"Wyłącz",delete:"Usuń",installed:"Zainstalowano",activated:"Aktywowany",deactivated:"Dezaktywowany",release_notes:"Informacje o wydaniu",activate_extension_details:"Udostępnij/nie udostępniaj rozszerzenia użytkownikom",featured:"Polecane",all:"Wszystko",only_admins_can_install:"Tylko konta administratorów mogą instalować rozszerzenia",admin_only:"Tylko dla administratora",new_version:"Nowa wersja",extension_depends_on:"Zależy od:",extension_rating_soon:"Oceny będą dostępne wkrótce",extension_installed_version:"Zainstalowana wersja",extension_uninstall_warning:"Za chwilę usuniesz rozszerzenie dla wszystkich użytkowników.",uninstall_confirm:"Tak, Odinstaluj",extension_db_drop_info:"Wszystkie dane dla rozszerzenia zostaną trwale usunięte. Nie ma sposobu, aby cofnąć tę operację!",extension_db_drop_warning:"Za chwilę usuniesz wszystkie dane dla rozszerzenia. Proszę wpisz nazwę rozszerzenia, aby kontynuować:",extension_required_lnbits_version:"To wymaga przynajmniej wersji LNbits",min_version:"Minimum (włącznie)",max_version:"Maksymalna (wyłączona)",payment_hash:"Hash Płatności",fee:"Opłata",amount:"Wartość",amount_sats:"Kwota (sats)",tag:"Etykieta",unit:"Jednostka",description:"Opis",expiry:"Wygasa",webhook:"Webhook",payment_proof:"Potwierdzenie płatności",update:"Aktualizuj",update_available:"Aktualizacja {version} dostępna!",latest_update:"Korzystasz z najnowszej wersji {version}.",notifications:"Powiadomienia",no_notifications:"Brak powiadomień",notifications_disabled:"Powiadomienia o statusie LNbits są wyłączone.",enable_notifications:"Włącz powiadomienia",enable_notifications_desc:"Jeśli ta opcja zostanie włączona, będzie pobierać najnowsze informacje o statusie LNbits, takie jak incydenty bezpieczeństwa i aktualizacje.",enable_watchdog:"Włącz Watchdog",enable_watchdog_desc:"Jeśli zostanie włączone, automatycznie zmieni źródło finansowania na VoidWallet, jeśli saldo jest niższe niż saldo LNbits. Po aktualizacji trzeba będzie włączyć ręcznie.",watchdog_interval:"Interwał Watchdog",watchdog_interval_desc:"Jak często zadanie w tle powinno sprawdzać sygnał wyłącznika awaryjnego w delcie strażnika [node_balance - lnbits_balance] (w minutach).",watchdog_delta:"Strażnik Delta",watchdog_delta_desc:"Limit przed aktywacją wyłącznika zmienia źródło finansowania na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stan",notification_source:"Źródło powiadomień",notification_source_label:"Adres URL źródła (używaj tylko oficjalnego źródła statusu LNbits oraz źródeł, którym możesz zaufać)",more:"więcej",less:"mniej",releases:"Wydania",watchdog:"Pies gończy",server_logs:"Dzienniki serwera",ip_blocker:"Blokada IP",security:"Bezpieczeństwo",security_tools:"Narzędzia bezpieczeństwa",block_access_hint:"Zablokuj dostęp przez IP",allow_access_hint:"Zezwól na dostęp przez IP (zignoruje zablokowane adresy IP)",enter_ip:"Wpisz adres IP i naciśnij enter",rate_limiter:"Ogranicznik Częstotliwości",wallet_limiter:"Ogranicznik Portfela",wallet_limit_max_withdraw_per_day:"Maksymalna dzienna wypłata z portfela w satoshi (0 aby wyłączyć)",wallet_max_ballance:"Maksymalny stan portfela w satoshi (0 aby wyłączyć)",wallet_limit_secs_between_trans:"Min sekund pomiędzy transakcjami na portfel (0 aby wyłączyć)",number_of_requests:"Liczba żądań",time_unit:"Jednostka czasu",minute:"minuta",second:"sekunda",hour:"godzina",disable_server_log:"Wyłącz log serwera",enable_server_log:"Włącz dziennik serwera",coming_soon:"Funkcja wkrótce będzie dostępna",session_has_expired:"Twoja sesja wygasła. Proszę zaloguj się ponownie.",instant_access_question:"Chcesz mieć natychmiastowy dostęp?",login_with_user_id:"Zaloguj się za pomocą identyfikatora użytkownika",or:"lub",create_new_wallet:"Utwórz nowy portfel",login_to_account:"Zaloguj się do swojego konta",create_account:"Załóż konto",account_settings:"Ustawienia konta",signin_with_nostr:"Kontynuuj z Nostr",signin_with_google:"Zaloguj się przez Google",signin_with_github:"Zaloguj się przez GitHub",signin_with_keycloak:"Zaloguj się przez Keycloak",username_or_email:"Nazwa użytkownika lub Email",password:"Hasło",password_config:"Konfiguracja Hasła",password_repeat:"Powtórz hasło",change_password:"Zmień hasło",update_credentials:"Aktualizuj dane logowania",update_pubkey:"Zaktualizuj klucz publiczny",set_password:"Ustaw hasło",invalid_password:"Hasło musi zawierać co najmniej 8 znaków",login:"Logowanie",register:"Zarejestruj",username:"Nazwa użytkownika",pubkey:"Klucz publiczny",user_id:"Identyfikator użytkownika",email:"Email",first_name:"Imię",last_name:"Nazwisko",picture:"Zdjęcie",verify_email:"Zweryfikuj email za pomocą",account:"Konto",update_account:"Aktualizuj konto",invalid_username:"Nieprawidłowa nazwa użytkownika",auth_provider:"Dostawca uwierzytelniania",my_account:"Moje Konto",back:"Wstecz",logout:"Wyloguj",look_and_feel:"Wygląd i zachowanie",toggle_gradient:"Przełącz gradient",gradient_background:"Tło gradientowe",language:"Język",color_scheme:"Schemat kolorów",admin_settings:"Ustawienia administratora",extension_cost:"To niniejsze wydanie wymaga zapłaty minimalnej {cost} satów.",extension_paid_sats:"Już zapłaciłeś {paid_sats} satów.",release_details_error:"Nie można uzyskać szczegółów wydania.",pay_from_wallet:"Zapłać z portfela",wallet_required:"Portfel *",show_qr:"Pokaż kod QR",retry_install:"Ponów instalację",new_payment:"Dokonaj nowej płatności",update_payment:"Zaktualizuj płatność",already_paid_question:"Czy już zapłaciłeś?",sell:"Sprzedaj",sell_require:"Poproś o płatność, aby włączyć rozszerzenie",sell_info:"Rozszerzenie {name} wymaga płatności w wysokości minimum {amount} sats, aby je włączyć.",hide_empty_wallets:"Ukryj puste portfele",recheck:"Sprawdź ponownie",contributors:"Współpracownicy",license:"Licencja",reset_key:"Resetuj klucz",reset_password:"Zresetuj hasło",border_choices:"Wybory granicy",select_all:"Zaznacz wszystko",nfc_supported:"Obsługa NFC",nfc_not_supported:"NFC nieobsługiwane",expire_date:"Data wygaśnięcia:",hash:"Hash:",welcome_lnbits:"Witamy w LNbits",setup_su_account:"Skonfiguruj konto Superuser poniżej.",create_ticker_converter:"Stwórz Konwerter Kursu Walutowego",enable_audit:"Włącz Audyt",recommended:"Zalecane",audit_desc:"Rejestruj żądania HTTP zgodnie z określonymi filtrami",audit_record_req:"Zarejestruj treść żądania",audit_record_warning:"Ostrzeżenie:",audit_record_req_warning_1:"dane poufne (takie jak hasła) będą rejestrowane.",audit_record_req_warning_2:"treść żądania może mieć duży rozmiar.",audit_record_use:"Używaj tego ostrożnie.",audit_ip:"Zapisz adres IP",audit_ip_desc:"Zarejestruj adres IP klienta",audit_path_params:"Zarejestruj parametry ścieżki",audit_query_params:"Zarejestruj parametry zapytania",audit_http_methods:"Uwzględnij metody HTTP",audit_http_methods_hint:"Lista metod HTTP do uwzględnienia. Pusta lista oznacza wszystkie.",audit_http_methods_label:"Metody HTTP",audit_resp_codes:"Uwzględnij kody odpowiedzi HTTP",audit_resp_codes_hint:"Lista kodów HTTP do uwzględnienia (dopasowanie do wyrażenia regularnego). Puste listy oznaczają wszystkie. Np: 4.*, 5.*",audit_resp_codes_label:"Kod odpowiedzi HTTP (wyrażenie regularne)",audit_paths:"Ścieżki dołączania",audit_paths_hint:"Lista ścieżek do uwzględnienia (dopasowanie regex). Pusta lista oznacza wszystkie.",audit_paths_label:"Ścieżka HTTP (regex)",audit_paths_exclude:"Wyklucz ścieżki",audit_paths_exclude_hint:"Lista ścieżek do wykluczenia (dopasowanie do wyrażenia regularnego). Pusta lista oznacza brak.",audit_paths_exclude_label:"Ścieżka HTTP (wyrażenie regularne)",exchange_providers:"Dostawcy wymiany",admin_extensions:"Rozszerzenia administracyjne",admin_extensions_label:"Rozszerzenia administracyjne",admin_extensions_hint:"Tylko użytkownik rozszerzeń z uprawnieniami administratora może używać",user_default_extensions:"Domyślne Rozszerzenia Użytkownika",user_default_extensions_label:"Rozszerzenia użytkownika",user_default_extensions_hint:"Rozszerzenia, które będą domyślnie włączone dla użytkowników.",miscellanous:"Różne",misc_disable_extensions:"Wyłącz rozszerzenia",misc_disable_extensions_label:"Wyłącz wszystkie rozszerzenia",misc_hide_api:"Ukryj API",misc_hide_api_label:"Ukrywa interfejs API portfela, rozszerzenia mogą zdecydować się na honorowanie",wallets_management:"Zarządzanie portfelami",funding_source_info:"Informacje o źródle finansowania",funding_source:"Źródło finansowania: {wallet_class}",node_balance:"Saldo węzła: {balance} sats",lnbits_balance:"Saldo LNbits: {balance} sats",funding_reserve_percent:"Rezerwa procentowa: {percent} %",node_management:"Zarządzanie węzłami",node_management_not_supported:"Zarządzanie węzłami nie jest obsługiwane przez aktywne źródło finansowania.",toggle_node_ui:"Interfejs użytkownika węzła",toggle_public_node_ui:"Interfejs węzła publicznego",toggle_transactions_node_ui:"Karta transakcji (wyłącz na dużych węzłach CLN)",invoice_expiry:"Wygaśnięcie faktury",invoice_expiry_label:"Termin wygaśnięcia faktury (sekundy)",fee_reserve:"Rezerwa Opłat",fee_reserve_msats:"Opłata rezerwowa w msats",fee_reserve_percent:"Opłata rezerwacyjna w procentach",server_management:"Zarządzanie serwerem",base_url:"Podstawowy adres URL",base_url_label:"Adres URL statyczny/bazowy dla serwera",authentication:"Uwierzytelnianie",auth_token_expiry_label:"Minuty wygaśnięcia tokenu",auth_token_expiry_hint:"Czas w minutach do wygaśnięcia tokenu",auth_allowed_methods_label:"Dopuszczalne metody autoryzacji",auth_allowed_methods_hint:"Wybierz metody autoryzacji",auth_nostr_label:"Żądanie URL Nostr",auth_nostr_hint:"Absolutny URL, którego klienci będą używać do logowania.",auth_google_ci_label:"Identyfikator klienta Google",auth_google_ci_hint:"Upewnij się, że autoryzowane URI przekierowania zawierają https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Hasło tajne klienta Google",auth_gh_client_id_label:"Identyfikator klienta GitHub",auth_gh_client_id_hint:"Upewnij się, że adres URL wywołania zwrotnego autoryzacji jest ustawiony na https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Client Secret",auth_keycloak_label:"Adres URL Discovery Keycloak",auth_keycloak_ci_label:"Identyfikator klienta Keycloak",auth_keycloak_ci_hint:"Upewnij się, że URL zwrotu autoryzacji jest ustawiony na https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Hasło klienta Keycloak",auth_keycloak_custom_org_label:"Własna organizacja Keycloak",auth_keycloak_custom_icon_label:"Własna ikona Keycloak (URL)",auth_oidc_label:"Adres URL Discovery OIDC",auth_oidc_ci_label:"Identyfikator klienta OIDC",auth_oidc_ci_hint:"Upewnij się, że URL zwrotu autoryzacji jest ustawiony na https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Hasło klienta OIDC",auth_oidc_custom_org_label:"Nazwa własnej organizacji OIDC (np. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Własna ikona OIDC (URL)",currency_settings:"Ustawienia waluty",allowed_currencies:"Dozwolone waluty",allowed_currencies_hint:"Ogranicz liczbę dostępnych walut fiducjarnych",default_account_currency:"Domyślna waluta konta",default_account_currency_hint:"Domyślna waluta dla księgowości",service_fee_label:"Opłata serwisowa (%)",service_fee_hint:"Opłata pobierana za transakcję (%)",service_fee_max_label:"Opłata za usługę max (sats)",service_fee_max_hint:"Maksymalna opłata serwisowa do pobrania w (sats)",fee_wallet:"Portfel opłat",fee_wallet_label:"Portfel opłat (ID portfela)",fee_wallet_hint:"Identyfikator portfela, do którego wysłać środki",disable_fee:"Wyłącz opłatę",disable_fee_internal:"Wyłącz opłatę za usługę dla płatności wewnętrznych",disable_fee_internal_desc:"Wyłącz opłatę serwisową dla wewnętrznych płatności Lightning",ui_management:"Zarządzanie interfejsem użytkownika",ui_site_title:"Tytuł strony",ui_site_tagline:"Podpis strony",ui_elements_enable:"Włącz elementy na stronie głównej",ui_elements_disable:"Wyłącz elementy na stronie głównej",ui_toggle_elements_tip:"Usuń elementy strony głównej takie jak 'runs on' itp.",ui_site_description:"Opis strony",ui_site_description_hint:"Użyj zwykłego tekstu, Markdown lub surowego HTML",ui_default_wallet_name:"Domyślna nazwa portfela",lnbits_wallet:"Portfel LNbits",denomination:"Nominacja",denomination_hint:"Nazwa dla tokena FakeWallet",ui_qr_code_logo:"Logo kodu QR",ui_qr_code_logo_hint:"Adres URL do obrazu logo w kodzie QR",ui_custom_badge:"Niestandardowa odznaka",ui_custom_badge_label:"Znak niestandardowy 'UŻYWAJ OSTROŻNIE - portfel LNbits wciąż jest w WERSJI BETA'",ui_custom_badge_color_label:"Niestandardowy kolor odznaki",themes:"Motywy",themes_hint:"Wybierz motywy dostępne dla użytkowników",custom_logo:"Logo niestandardowe",custom_logo_hint:"URL do obrazu logo",ad_space_title:"Tytuł reklamy",ad_space_title_label:"Wspierane przez",ad_slots:"Sloty reklamowe",ad_slots_hint:"Adres URL i ścieżki plików obrazów w formacie CSV, rozszerzenia mogą zdecydować się na honorowanie",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Reklamy włączone",ads_disabled:"Reklamy wyłączone",user_management:"Zarządzanie użytkownikami",admin_users:"Użytkownicy administratorzy",admin_users_hint:"Użytkownicy z uprawnieniami administratora",admin_users_label:"Identyfikator użytkownika",allowed_users:"Dozwoleni użytkownicy",allowed_users_hint:"Tylko ci użytkownicy mogą używać LNbits",allowed_users_label:"Identyfikator użytkownika",allow_creation_user:"Zezwól na tworzenie nowych użytkowników",allow_creation_user_desc:"Zezwól na tworzenie nowych użytkowników na stronie głównej indeksu",components:"Komponenty",long_running_endpoints:"5 najdłużej działających punktów końcowych",http_request_methods:"Metody żądań HTTP",http_response_codes:"Kody Odpowiedzi HTTP",request_details:"Szczegóły żądania",http_request_details:"Szczegóły żądania HTTP"},window.localisation.fr={confirm:"Oui",server:"Serveur",theme:"Thème",site_customisation:"Personnalisation du site",funding:"Financement",users:"Utilisateurs",audit:"Audit",apps:"Applications",channels:"Canaux",transactions:"Transactions",dashboard:"Tableau de bord",node:"Noeud",export_users:"Exporter les utilisateurs",no_users:"Aucun utilisateur trouvé",total_capacity:"Capacité totale",avg_channel_size:"Taille moyenne du canal",biggest_channel_size:"Taille de canal maximale",smallest_channel_size:"Taille de canal la plus petite",number_of_channels:"Nombre de canaux",active_channels:"Canaux actifs",connect_peer:"Connecter un pair",connect:"Connecter",open_channel:"Ouvrir le canal",open:"Ouvrir",close_channel:"Fermer le canal",close:"Fermer",restart:"Redémarrer le serveur",save:"Enregistrer",save_tooltip:"Enregistrer vos modifications",credit_debit:"Crédit / Débit",credit_hint:"Appuyez sur Entrée pour créditer le compte",credit_label:"{denomination} à créditer",credit_ok:"Succès du crédit/débit des fonds virtuels ({amount} sats). Les paiements dépendent des fonds réels sur la source de financement.",restart_tooltip:"Redémarrez le serveur pour que les changements prennent effet",add_funds_tooltip:"Ajouter des fonds à un portefeuille.",reset_defaults:"Réinitialiser aux valeurs par défaut",reset_defaults_tooltip:"Supprimer tous les paramètres et les réinitialiser aux valeurs par défaut.",download_backup:"Télécharger la sauvegarde de la base de données",name_your_wallet:"Nommez votre portefeuille {name}",paste_invoice_label:"Coller une facture, une demande de paiement ou un code lnurl *",lnbits_description:"Facile à installer et léger, LNbits peut fonctionner sur n'importe quelle source de financement du réseau Lightning et même LNbits lui-même! Vous pouvez exécuter LNbits pour vous-même ou offrir facilement une solution de gardien pour les autres. Chaque portefeuille a ses propres clés API et il n'y a pas de limite au nombre de portefeuilles que vous pouvez créer. La capacité de partitionner les fonds rend LNbits un outil utile pour la gestion de l'argent et comme outil de développement. Les extensions ajoutent une fonctionnalité supplémentaire à LNbits afin que vous puissiez expérimenter une gamme de technologies de pointe sur le réseau Lightning. Nous avons rendu le développement d'extensions aussi simple que possible et, en tant que projet gratuit et open source, nous encourageons les gens à développer et à soumettre les leurs.",export_to_phone:"Exporter vers le téléphone avec un code QR",export_to_phone_desc:"Ce code QR contient l'URL de votre portefeuille avec un accès complet. Vous pouvez le scanner depuis votre téléphone pour ouvrir votre portefeuille depuis là-bas.",wallet:"Portefeuille :",wallets:"Portefeuilles",add_wallet:"Ajouter un nouveau portefeuille",delete_wallet:"Supprimer le portefeuille",delete_wallet_desc:"Ce portefeuille entier sera supprimé et les fonds seront IRRECUPERABLES.",rename_wallet:"Renommer le portefeuille",update_name:"Mettre à jour le nom",fiat_tracking:"Suivi Fiat",currency:"Devise",update_currency:"Mettre à jour la devise",press_to_claim:"Appuyez pour demander du Bitcoin",donate:"Donner",view_github:"Voir sur GitHub",voidwallet_active:"VoidWallet est actif! Paiements désactivés",use_with_caution:"UTILISER AVEC PRUDENCE - Le portefeuille {name} est toujours en version BETA",service_fee:"Frais de service : {amount} % par transaction",service_fee_max:"Frais de service : {amount} % par transaction (max {max} sats)",service_fee_tooltip:"Frais de service facturés par l'administrateur du serveur LNbits pour chaque transaction sortante",toggle_darkmode:"Basculer le mode sombre",payment_reactions:"Réactions de paiement",view_swagger_docs:"Voir les documentation de l'API Swagger de LNbits",api_docs:"Documentation de l'API",api_keys_api_docs:"URL du nœud, clés API et documentation API",lnbits_version:"Version de LNbits",runs_on:"Fonctionne sur",paste:"Coller",paste_from_clipboard:"Coller depuis le presse-papiers",paste_request:"Coller la requête",create_invoice:"Créer une facture",camera_tooltip:"Utiliser la caméra pour scanner une facture / un code QR",export_csv:"Exporter vers CSV",chart_tooltip:"Afficher le graphique",pending:"En attente",copy_invoice:"Copier la facture",withdraw_from:"Retirer de",cancel:"Annuler",scan:"Scanner",read:"Lire",pay:"Payer",memo:"Mémo",date:"Date",payment_processing:"Traitement du paiement...",not_enough_funds:"Fonds insuffisants !",search_by_tag_memo_amount:"Rechercher par tag, mémo, montant",invoice_waiting:"Facture en attente de paiement",payment_received:"Paiement reçu",payment_sent:"Paiement envoyé",receive:"recevoir",send:"envoyer",outgoing_payment_pending:"Paiement sortant en attente",drain_funds:"Vider les fonds",drain_funds_desc:"Il s'agit d'un code QR LNURL-withdraw pour tout aspirer de ce portefeuille. Ne le partagez avec personne. Il est compatible avec balanceCheck et balanceNotify, de sorte que votre portefeuille peut continuer à retirer les fonds continuellement à partir d'ici après le premier retrait.",i_understand:"J'ai compris",copy_wallet_url:"Copier l'URL du portefeuille",disclaimer_dialog_title:"Important !",disclaimer_dialog:"La fonctionnalité de connexion sera publiée dans une future mise à jour, pour l'instant, assurez-vous de mettre cette page en favori pour accéder à votre portefeuille ultérieurement ! Ce service est en BETA, et nous ne sommes pas responsables des personnes qui perdent l'accès à leurs fonds.",no_transactions:"Aucune transaction effectuée pour le moment",manage:"Gérer",exchanges:"Échanges",extensions:"Extensions",no_extensions:"Vous n'avez installé aucune extension :(",created:"Créé",search_extensions:"Rechercher des extensions",extension_sources:"Sources d'extension",ext_sources_hint:"Dépôts à partir desquels les extensions peuvent être téléchargées",ext_sources_label:"URL source (utilisez uniquement la source officielle de l'extension LNbits et des sources fiables)",warning:"Avertissement",repository:"Référentiel",confirm_continue:"Êtes-vous sûr de vouloir continuer ?",manage_extension_details:"Installer/désinstaller l'extension",install:"Installer",uninstall:"Désinstaller",drop_db:"Supprimer les données",enable:"Activer",pay_to_enable:"Payer pour activer",enable_extension_details:"Activer l'extension pour l'utilisateur actuel",disable:"Désactiver",delete:"Supprimer",installed:"Installé",activated:"Activé",deactivated:"Désactivé",release_notes:"Notes de version",activate_extension_details:"Rendre l'extension disponible/indisponible pour les utilisateurs",featured:"Mis en avant",all:"Tout",only_admins_can_install:"Seuls les comptes administrateurs peuvent installer des extensions",admin_only:"Réservé aux administrateurs",new_version:"Nouvelle version",extension_depends_on:"Dépend de :",extension_rating_soon:"Notes des utilisateurs à venir bientôt",extension_installed_version:"Version installée",extension_uninstall_warning:"Vous êtes sur le point de supprimer l'extension pour tous les utilisateurs.",uninstall_confirm:"Oui, Désinstaller",extension_db_drop_info:"Toutes les données pour l'extension seront supprimées de manière permanente. Il n'est pas possible d'annuler cette opération !",extension_db_drop_warning:"Vous êtes sur le point de supprimer toutes les données de l'extension. Veuillez taper le nom de l'extension pour continuer :",extension_required_lnbits_version:"Cette version nécessite au moins LNbits version",min_version:"Minimum (inclus)",max_version:"Maximum (exclu)",payment_hash:"Hash de paiement",fee:"Frais",amount:"Montant",amount_sats:"Montant (sats)",tag:"Étiqueter",unit:"Unité",description:"Description",expiry:"Expiration",webhook:"Webhook",payment_proof:"Preuve de paiement",update:"Mettre à jour",update_available:"Mise à jour {version} disponible !",latest_update:"Vous êtes sur la dernière version {version}.",notifications:"Notifications",no_notifications:"Aucune notification",notifications_disabled:"Les notifications de statut LNbits sont désactivées.",enable_notifications:"Activer les notifications",enable_notifications_desc:"Si activé, il récupérera les dernières mises à jour du statut LNbits, telles que les incidents de sécurité et les mises à jour.",enable_watchdog:"Activer le Watchdog",enable_watchdog_desc:"Si elle est activée, elle changera automatiquement votre source de financement en VoidWallet si votre solde est inférieur au solde LNbits. Vous devrez activer manuellement après une mise à jour.",watchdog_interval:"Intervalle du gardien",watchdog_interval_desc:"À quelle fréquence la tâche en arrière-plan doit-elle vérifier la présence d'un signal d'arrêt d'urgence dans le delta du gardien [node_balance - lnbits_balance] (en minutes).",watchdog_delta:"Chien de garde Delta",watchdog_delta_desc:"Limite avant que l'interrupteur d'arrêt ne change la source de financement pour VoidWallet [lnbits_balance - node_balance > delta]",status:"Statut",notification_source:"Source de notification",notification_source_label:"URL source (utilisez uniquement la source officielle de statut LNbits et des sources de confiance)",more:"plus",less:"moins",releases:"Versions",watchdog:"Chien de garde",server_logs:"Journaux du serveur",ip_blocker:"Bloqueur d'IP",security:"Sécurité",security_tools:"Outils de sécurité",block_access_hint:"Bloquer l'accès par IP",allow_access_hint:"Autoriser l'accès par IP (cela passera outre les IP bloquées)",enter_ip:"Entrez l'adresse IP et appuyez sur Entrée",rate_limiter:"Limiteur de débit",wallet_limiter:"Limiteur de portefeuille",wallet_limit_max_withdraw_per_day:"Retrait quotidien maximum du portefeuille en sats (0 pour désactiver)",wallet_max_ballance:"Solde maximum du portefeuille en sats (0 pour désactiver)",wallet_limit_secs_between_trans:"Minutes et secondes entre les transactions par portefeuille (0 pour désactiver)",number_of_requests:"Nombre de requêtes",time_unit:"Unité de temps",minute:"minute",second:"seconde",hour:"heure",disable_server_log:"Désactiver le journal du serveur",enable_server_log:"Activer le journal du serveur",coming_soon:"Fonctionnalité à venir bientôt",session_has_expired:"Votre session a expiré. Veuillez vous reconnecter.",instant_access_question:"Voulez-vous un accès instantané ?",login_with_user_id:"Connexion avec l'identifiant utilisateur",or:"ou",create_new_wallet:"Créer un nouveau portefeuille",login_to_account:"Connectez-vous à votre compte",create_account:"Créer un compte",account_settings:"Paramètres du compte",signin_with_nostr:"Continuer avec Nostr",signin_with_google:"Connectez-vous avec Google",signin_with_github:"Connectez-vous avec GitHub",signin_with_keycloak:"Connectez-vous avec Keycloak",username_or_email:"Nom d'utilisateur ou e-mail",password:"Mot de passe",password_config:"Configuration du mot de passe",password_repeat:"Répétition du mot de passe",change_password:"Changer le mot de passe",update_credentials:"Mettre à jour les informations d'identification",update_pubkey:"Mettre à jour la clé publique",set_password:"Définir le mot de passe",invalid_password:"Le mot de passe doit comporter au moins 8 caractères",login:"Connexion",register:"Inscrire",username:"Nom d'utilisateur",pubkey:"Clé publique",user_id:"Identifiant utilisateur",email:"E-mail",first_name:"Prénom",last_name:"Nom de famille",picture:"Image",verify_email:"Vérifiez l'e-mail avec",account:"Compte",update_account:"Mettre à jour le compte",invalid_username:"Nom d'utilisateur invalide",auth_provider:"Fournisseur d'authentification",my_account:"Mon compte",back:"Retour",logout:"Déconnexion",look_and_feel:"Apparence",toggle_gradient:"Basculer le dégradé",gradient_background:"Fond en dégradé",language:"Langue",color_scheme:"Schéma de couleurs",admin_settings:"Paramètres administrateur",extension_cost:"Cette version nécessite un paiement minimum de {cost} sats.",extension_paid_sats:"Vous avez déjà payé {paid_sats} sats.",release_details_error:"Impossible d'obtenir les détails de la version.",pay_from_wallet:"Payer depuis le portefeuille",wallet_required:"Portefeuille *",show_qr:"Afficher le QR",retry_install:"Réessayer l'installation",new_payment:"Effectuer un nouveau paiement",update_payment:"Mettre à jour le paiement",already_paid_question:"Avez-vous déjà payé ?",sell:"Vendre",sell_require:"Demander un paiement pour activer l'extension",sell_info:"L'extension {name} nécessite un paiement minimum de {amount} sats pour être activée.",hide_empty_wallets:"Masquer les portefeuilles vides",recheck:"Revérifier",contributors:"Contributeurs",license:"Licence",reset_key:"Réinitialiser la clé",reset_password:"Réinitialiser le mot de passe",border_choices:"Choix de bordure",select_all:"Sélectionner tout",nfc_supported:"NFC pris en charge",nfc_not_supported:"NFC non pris en charge",expire_date:"Date d'expiration :",hash:"Hash :",welcome_lnbits:"Bienvenue à LNbits",setup_su_account:"Configurez le compte Superuser ci-dessous.",create_ticker_converter:"Créer un convertisseur de code de devise",enable_audit:"Activer l'audit",recommended:"Recommandé",audit_desc:"Enregistrer les requêtes HTTP selon les filtres spécifiés",audit_record_req:"Enregistrer le corps de la demande",audit_record_warning:"Avertissement :",audit_record_req_warning_1:"les données confidentielles (comme les mots de passe) seront enregistrées.",audit_record_req_warning_2:"le corps de la requête peut être de grande taille.",audit_record_use:"Utilisez-le avec précaution.",audit_ip:"Enregistrer l'adresse IP",audit_ip_desc:"Enregistrer l'adresse IP du client",audit_path_params:"Enregistrer les paramètres de chemin",audit_query_params:"Enregistrer les paramètres de la requête",audit_http_methods:"Inclure les méthodes HTTP",audit_http_methods_hint:"Liste des méthodes HTTP à inclure. Listes vides signifie toutes.",audit_http_methods_label:"Méthodes HTTP",audit_resp_codes:"Inclure les codes de réponse HTTP",audit_resp_codes_hint:"Liste des codes HTTP à inclure (correspondance regex). Les listes vides signifient tout. Ex : 4.*, 5.*",audit_resp_codes_label:"Code de réponse HTTP (regex)",audit_paths:"Inclure des chemins",audit_paths_hint:"Liste des chemins à inclure (correspondance regex). Liste vide signifie tout.",audit_paths_label:"Chemin HTTP (regex)",audit_paths_exclude:"Exclure les chemins",audit_paths_exclude_hint:"Liste des chemins à exclure (correspondance regex). Liste vide signifie aucun.",audit_paths_exclude_label:"Chemin HTTP (regex)",exchange_providers:"Fournisseurs d'échange",admin_extensions:"Extensions d'administration",admin_extensions_label:"Extensions d'administration",admin_extensions_hint:"Seuls les utilisateurs avec des privilèges d'administrateur peuvent utiliser les extensions.",user_default_extensions:"Extensions par défaut de l'utilisateur",user_default_extensions_label:"Extensions utilisateur",user_default_extensions_hint:"Extensions qui seront activées par défaut pour les utilisateurs.",miscellanous:"Divers",misc_disable_extensions:"Désactiver les extensions",misc_disable_extensions_label:"Désactiver toutes les extensions",misc_hide_api:"Masquer l'API",misc_hide_api_label:"Masque l'API du portefeuille, les extensions peuvent choisir de respecter",wallets_management:"Gestion des portefeuilles",funding_source_info:"Informations sur la source de financement",funding_source:"Source de financement : {wallet_class}",node_balance:"Solde du nœud : {balance} sats",lnbits_balance:"Solde LNbits : {balance} sats",funding_reserve_percent:"Pourcentage de Réserve : {percent} %",node_management:"Gestion des nœuds",node_management_not_supported:"La gestion des nœuds n'est pas prise en charge par la source de financement active",toggle_node_ui:"Interface utilisateur de nœud",toggle_public_node_ui:"Interface utilisateur du nœud public",toggle_transactions_node_ui:"Onglet des transactions (Désactiver sur les grands nœuds CLN)",invoice_expiry:"Expiration de la facture",invoice_expiry_label:"Expiration de la facture (secondes)",fee_reserve:"Réserve de frais",fee_reserve_msats:"Frais de réservation en msats",fee_reserve_percent:"Frais de réservation en pourcentage",server_management:"Gestion de serveur",base_url:"URL de base",base_url_label:"URL statique/de base pour le serveur",authentication:"Authentification",auth_token_expiry_label:"Durée d'expiration du jeton (en minutes)",auth_token_expiry_hint:"Durée en minutes avant l'expiration du jeton",auth_allowed_methods_label:"Méthodes d'autorisation autorisées",auth_allowed_methods_hint:"Sélectionnez les méthodes d'autorisation",auth_nostr_label:"URL de requête Nostr",auth_nostr_hint:"URL absolue que les clients utiliseront pour se connecter.",auth_google_ci_label:"ID Client Google",auth_google_ci_hint:"Assurez-vous que les URIs de redirection autorisées contiennent https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Secret client Google",auth_gh_client_id_label:"Identifiant client GitHub",auth_gh_client_id_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Secret Client GitHub",auth_keycloak_label:"URL de découverte Keycloak",auth_keycloak_ci_label:"ID Client Keycloak",auth_keycloak_ci_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Secret client Keycloak",auth_keycloak_custom_org_label:"Organisation personnalisée Keycloak",auth_keycloak_custom_icon_label:"Icône personnalisée Keycloak (URL)",auth_oidc_label:"URL de découverte OIDC",auth_oidc_ci_label:"ID Client OIDC",auth_oidc_ci_hint:"Assurez-vous que l'URL de rappel d'autorisation est définie sur https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Secret client OIDC",auth_oidc_custom_org_label:"Nom de l'organisation personnalisée OIDC (par ex. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Icône personnalisée OIDC (URL)",currency_settings:"Paramètres de devise",allowed_currencies:"Devises autorisées",allowed_currencies_hint:"Limiter le nombre de devises fiduciaires disponibles",default_account_currency:"Devise par défaut du compte",default_account_currency_hint:"Devise par défaut pour la comptabilité",service_fee_label:"Frais de service (%)",service_fee_hint:"Frais facturés par tx (%)",service_fee_max_label:"Frais de service max (sats)",service_fee_max_hint:"Frais de service maximum à facturer en (sats)",fee_wallet:"Portefeuille de frais",fee_wallet_label:"Portefeuille de frais (ID de portefeuille)",fee_wallet_hint:"Identifiant de portefeuille pour envoyer des fonds à",disable_fee:"Désactiver les frais",disable_fee_internal:"Désactiver les frais de service pour les paiements internes",disable_fee_internal_desc:"Désactiver les frais de service pour les paiements Lightning internes",ui_management:"Gestion de l'interface utilisateur",ui_site_title:"Titre du site",ui_site_tagline:"Slogan du site",ui_elements_enable:"Activer les éléments sur la page d'accueil",ui_elements_disable:"Désactiver les éléments sur la page d'accueil",ui_toggle_elements_tip:"Supprimer les éléments de la page d'accueil comme 'fonctionne avec', etc.",ui_site_description:"Description du site",ui_site_description_hint:"Utilisez du texte brut, du Markdown ou du HTML brut",ui_default_wallet_name:"Nom par Défaut du Portefeuille",lnbits_wallet:"Portefeuille LNbits",denomination:"Dénomination",denomination_hint:"Le nom du jeton FakeWallet",ui_qr_code_logo:"Logo de code QR",ui_qr_code_logo_hint:"URL de l'image du logo dans le code QR",ui_custom_badge:"Badge personnalisé",ui_custom_badge_label:"Badge personnalisé 'À UTILISER AVEC PRÉCAUTION - Le portefeuille LNbits est encore en BÊTA'",ui_custom_badge_color_label:"Couleur de badge personnalisée",themes:"Thèmes",themes_hint:"Choisissez des thèmes disponibles pour les utilisateurs",custom_logo:"Logo personnalisé",custom_logo_hint:"URL de l'image du logo",ad_space_title:"Titre de l'espace publicitaire",ad_space_title_label:"Soutenu par",ad_slots:"Emplacements publicitaires",ad_slots_hint:"URL de l'annonce et chemins des fichiers image au format CSV, les extensions peuvent choisir de respecter",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Annonces activées",ads_disabled:"Publicités désactivées",user_management:"Gestion des utilisateurs",admin_users:"Utilisateurs administrateurs",admin_users_hint:"Utilisateurs avec des privilèges d'administration",admin_users_label:"Identifiant utilisateur",allowed_users:"Utilisateurs autorisés",allowed_users_hint:"Seuls ces utilisateurs peuvent utiliser LNbits",allowed_users_label:"ID utilisateur",allow_creation_user:"Autoriser la création de nouveaux utilisateurs",allow_creation_user_desc:"Permettre la création de nouveaux utilisateurs sur la page d’index",components:"Composants",long_running_endpoints:"Top 5 points de terminaison longue durée",http_request_methods:"Méthodes de requête HTTP",http_response_codes:"Codes de réponse HTTP",request_details:"Détails de la demande",http_request_details:"Détails de la requête HTTP"},window.localisation.nl={confirm:"Ja",server:"Server",theme:"Thema",site_customisation:"Site-aanpassing",funding:"Financiering",users:"Gebruikers",audit:"Controle",apps:"Apps",channels:"Kanalen",transactions:"Transacties",dashboard:"Dashboard",node:"Knooppunt",export_users:"Gebruikers exporteren",no_users:"Geen gebruikers gevonden",total_capacity:"Totale capaciteit",avg_channel_size:"Gem. Kanaalgrootte",biggest_channel_size:"Grootste Kanaalgrootte",smallest_channel_size:"Kleinste Kanaalgrootte",number_of_channels:"Aantal kanalen",active_channels:"Actieve Kanalen",connect_peer:"Peer verbinden",connect:"Verbinden",open_channel:"Open Kanaal",open:"Open",close_channel:"Kanaal Sluiten",close:"Sluiten",restart:"Server opnieuw opstarten",save:"Opslaan",save_tooltip:"Sla uw wijzigingen op",credit_debit:"Credit / Debet",credit_hint:"Druk op Enter om de rekening te crediteren",credit_label:"{denomination} te crediteren",credit_ok:"Succesvol crediteren/debiteren van virtuele gelden ({amount} sats). Betalingen zijn afhankelijk van de werkelijke fondsen op de financieringsbron.",restart_tooltip:"Start de server opnieuw op zodat wijzigingen van kracht worden",add_funds_tooltip:"Voeg geld toe aan een portemonnee.",reset_defaults:"Standaardinstellingen herstellen",reset_defaults_tooltip:"Wis alle instellingen en herstel de standaardinstellingen.",download_backup:"Databaseback-up downloaden",name_your_wallet:"Geef je {name} portemonnee een naam",paste_invoice_label:"Plak een factuur, betalingsverzoek of lnurl-code*",lnbits_description:"Gemakkelijk in te stellen en lichtgewicht, LNbits kan op elke lightning-netwerkfinancieringsbron draaien en zelfs LNbits zelf! U kunt LNbits voor uzelf laten draaien of gemakkelijk een bewaardersoplossing voor anderen bieden. Elke portemonnee heeft zijn eigen API-sleutels en er is geen limiet aan het aantal portemonnees dat u kunt maken. Het kunnen partitioneren van fondsen maakt LNbits een nuttige tool voor geldbeheer en als ontwikkelingstool. Extensies voegen extra functionaliteit toe aan LNbits, zodat u kunt experimenteren met een reeks toonaangevende technologieën op het bliksemschichtnetwerk. We hebben het ontwikkelen van extensies zo eenvoudig mogelijk gemaakt en als een gratis en opensource-project moedigen we mensen aan om hun eigen ontwikkelingen in te dienen.",export_to_phone:"Exporteren naar telefoon met QR-code",export_to_phone_desc:"Deze QR-code bevat uw portemonnee-URL met volledige toegang. U kunt het vanaf uw telefoon scannen om uw portemonnee van daaruit te openen.",wallet:"Wallet:",wallets:"Portemonnees",add_wallet:"Een nieuwe portemonnee toevoegen",delete_wallet:"Portemonnee verwijderen",delete_wallet_desc:"Deze hele portemonnee wordt verwijderd, de fondsen worden NIET TERUGGEVONDEN.",rename_wallet:"Portemonnee hernoemen",update_name:"Naam bijwerken",fiat_tracking:"Volgfunctie voor fiat-valuata",currency:"Valuta",update_currency:"Valuta bijwerken",press_to_claim:"Druk om bitcoin te claimen",donate:"Doneren",view_github:"Bekijken op GitHub",voidwallet_active:"VoidWallet is actief! Betalingen uitgeschakeld",use_with_caution:"GEBRUIK MET VOORZICHTIGHEID - {name} portemonnee is nog in BETA",service_fee:"Servicekosten: {amount} % per transactie",service_fee_max:"Servicekosten: {amount} % per transactie (max {max} sats)",service_fee_tooltip:"Transactiekosten in rekening gebracht door de LNbits serverbeheerder per uitgaande transactie",toggle_darkmode:"Donkere modus aan/uit",payment_reactions:"Betalingsreacties",view_swagger_docs:"Bekijk LNbits Swagger API-documentatie",api_docs:"API-documentatie",api_keys_api_docs:"Node URL, API-sleutels en API-documentatie",lnbits_version:"LNbits-versie",runs_on:"Draait op",paste:"Plakken",paste_from_clipboard:"Plakken van klembord",paste_request:"Verzoek plakken",create_invoice:"Factuur aanmaken",camera_tooltip:"Gebruik de camera om een factuur/QR-code te scannen",export_csv:"Exporteer naar CSV",chart_tooltip:"Toon grafiek",pending:"In behandeling",copy_invoice:"Kopieer factuur",withdraw_from:"Opnemen van",cancel:"Annuleren",scan:"Scannen",read:"Lezen",pay:"Betalen",memo:"Memo",date:"Datum",payment_processing:"Verwerking betaling...",not_enough_funds:"Onvoldoende saldo!",search_by_tag_memo_amount:"Zoeken op tag, memo, bedrag",invoice_waiting:"Factuur wachtend op betaling",payment_received:"Betaling ontvangen",payment_sent:"Betaling verzonden",receive:"ontvangen",send:"versturen",outgoing_payment_pending:"Uitgaande betaling in behandeling",drain_funds:"Geld opnemen",drain_funds_desc:"Dit is een LNURL-withdraw QR-code om alles uit deze portemonnee te halen. Deel deze code niet met anderen. Het is compatibel met balanceCheck en balanceNotify zodat jouw portemonnee continu geld kan blijven opnemen vanaf hier na de eerste opname.",i_understand:"Ik begrijp het",copy_wallet_url:"Kopieer portemonnee-URL",disclaimer_dialog_title:"Belangrijk!",disclaimer_dialog:"Inlogfunctionaliteit wordt uitgebracht in een toekomstige update. Zorg er nu voor dat je deze pagina als favoriet markeert om in de toekomst toegang te krijgen tot je portemonnee! Deze service is in BETA en we zijn niet verantwoordelijk voor mensen die de toegang tot hun fondsen verliezen.",no_transactions:"Er zijn nog geen transacties gedaan",manage:"Beheer",exchanges:"Beurzen",extensions:"Extensies",no_extensions:"Je hebt geen extensies geïnstalleerd :(",created:"Aangemaakt",search_extensions:"Zoekextensies",extension_sources:"Extensiebronnen",ext_sources_hint:"Repositories van waar de extensies kunnen worden gedownload",ext_sources_label:"Bron-URL (gebruik alleen de officiële LNbits-extensiebron en bronnen die je kunt vertrouwen)",warning:"Waarschuwing",repository:"Repository",confirm_continue:"Weet je zeker dat je wilt doorgaan?",manage_extension_details:"Installeren/verwijderen van extensie",install:"Installeren",uninstall:"Deïnstalleren",drop_db:"Gegevens verwijderen",enable:"Inschakelen",pay_to_enable:"Betalen om te activeren",enable_extension_details:"Schakel extensie in voor huidige gebruiker",disable:"Uitschakelen",delete:"Verwijderen",installed:"Geïnstalleerd",activated:"Geactiveerd",deactivated:"Gedeactiveerd",release_notes:"Release-opmerkingen",activate_extension_details:"Maak extensie beschikbaar/niet beschikbaar voor gebruikers",featured:"Uitgelicht",all:"Alles",only_admins_can_install:"Alleen beheerdersaccounts kunnen extensies installeren",admin_only:"Alleen beheerder",new_version:"Nieuwe Versie",extension_depends_on:"Afhankelijk van:",extension_rating_soon:"Beoordelingen binnenkort beschikbaar",extension_installed_version:"Geïnstalleerde versie",extension_uninstall_warning:"U staat op het punt de extensie voor alle gebruikers te verwijderen.",uninstall_confirm:"Ja, de-installeren",extension_db_drop_info:"Alle gegevens voor de extensie zullen permanent worden verwijderd. Er is geen manier om deze bewerking ongedaan te maken!",extension_db_drop_warning:"U staat op het punt alle gegevens voor de extensie te verwijderen. Typ de naam van de extensie om door te gaan:",extension_required_lnbits_version:"Deze release vereist ten minste LNbits-versie",min_version:"Minimum (inbegrepen)",max_version:"Maximum (uitgesloten)",payment_hash:"Betalings-hash",fee:"Kosten",amount:"Bedrag",amount_sats:"Bedrag (sats)",tag:"Label",unit:"Eenheid",description:"Beschrijving",expiry:"Vervaldatum",webhook:"Webhook",payment_proof:"Betalingsbewijs",update:"Bijwerken",update_available:"Update {version} beschikbaar!",latest_update:"U bent op de nieuwste versie {version}.",notifications:"Meldingen",no_notifications:"Geen meldingen",notifications_disabled:"LNbits-statusmeldingen zijn uitgeschakeld.",enable_notifications:"Schakel meldingen in",enable_notifications_desc:"Indien ingeschakeld zal het de laatste LNbits Status updates ophalen, zoals veiligheidsincidenten en updates.",enable_watchdog:"Inschakelen Watchdog",enable_watchdog_desc:"Indien ingeschakeld, wordt uw betaalbron automatisch gewijzigd naar VoidWallet als uw saldo lager is dan het saldo van LNbits. U zult dit na een update handmatig moeten inschakelen.",watchdog_interval:"Watchdog-interval",watchdog_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op een killswitch signaal in het watchdog verschil [node_balance - lnbits_balance] (in minuten).",watchdog_delta:"Waakhond Delta",watchdog_delta_desc:"Limiet voordat de killswitch de financieringsbron verandert naar VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notificatiebron",notification_source_label:"Bron-URL (gebruik alleen de officiële LNbits-statusbron en bronnen die u vertrouwt)",more:"meer",less:"minder",releases:"Uitgaven",watchdog:"Waakhond",server_logs:"Serverlogboeken",ip_blocker:"IP-blokkering",security:"Beveiliging",security_tools:"Beveiligingstools",block_access_hint:"Toegang blokkeren per IP",allow_access_hint:"Toegang verlenen op basis van IP (zal geblokkeerde IP's overschrijven)",enter_ip:"Voer IP in en druk op enter",rate_limiter:"Snelheidsbegrenzer",wallet_limiter:"Portemonnee Limietsteller",wallet_limit_max_withdraw_per_day:"Maximale dagelijkse opname van wallet in sats (0 om uit te schakelen)",wallet_max_ballance:"Maximale portefeuillesaldo in sats (0 om uit te schakelen)",wallet_limit_secs_between_trans:"Min seconden tussen transacties per portemonnee (0 om uit te schakelen)",number_of_requests:"Aantal verzoeken",time_unit:"Tijdeenheid",minute:"minuut",second:"seconde",hour:"uur",disable_server_log:"Serverlog uitschakelen",enable_server_log:"Activeer Serverlog",coming_soon:"Functie binnenkort beschikbaar",session_has_expired:"Uw sessie is verlopen. Log alstublieft opnieuw in.",instant_access_question:"Wil je directe toegang?",login_with_user_id:"Inloggen met gebruikers-ID",or:"of",create_new_wallet:"Nieuwe portemonnee aanmaken",login_to_account:"Log in op je account",create_account:"Account aanmaken",account_settings:"Accountinstellingen",signin_with_nostr:"Doorgaan met Nostr",signin_with_google:"Inloggen met Google",signin_with_github:"Inloggen met GitHub",signin_with_keycloak:"Inloggen met Keycloak",username_or_email:"Gebruikersnaam of e-mail",password:"Wachtwoord",password_config:"Wachtwoordconfiguratie",password_repeat:"Wachtwoord herhalen",change_password:"Wachtwoord wijzigen",update_credentials:"Referenties bijwerken",update_pubkey:"Openbare Sleutel Bijwerken",set_password:"Wachtwoord instellen",invalid_password:"Wachtwoord moet ten minste 8 tekens bevatten",login:"Inloggen",register:"Registreren",username:"Gebruikersnaam",pubkey:"Publieke Sleutel",user_id:"Gebruikers-ID",email:"E-mail",first_name:"Voornaam",last_name:"Achternaam",picture:"Foto",verify_email:"E-mail verifiëren met",account:"Account",update_account:"Account bijwerken",invalid_username:"Ongeldige gebruikersnaam",auth_provider:"Auth Provider",my_account:"Mijn Account",back:"Terug",logout:"Afmelden",look_and_feel:"Uiterlijk en gedrag",toggle_gradient:"Gradiënt Schakelen",gradient_background:"Verloopachtergrond",language:"Taal",color_scheme:"Kleurenschema",admin_settings:"Beheerdersinstellingen",extension_cost:"Deze release vereist een betaling van minimaal {cost} sats.",extension_paid_sats:"U heeft al {paid_sats} sats betaald.",release_details_error:"Kan de gegevens van de release niet ophalen.",pay_from_wallet:"Betalen vanuit Portemonnee",wallet_required:"Wallet *",show_qr:"Toon QR",retry_install:"Opnieuw installeren",new_payment:"Nieuwe betaling maken",update_payment:"Betaling bijwerken",already_paid_question:"Heb je al betaald?",sell:"Verkopen",sell_require:"Vraag betaling om de extensie te activeren.",sell_info:"De {name} extensie vereist een betaling van minimaal {amount} sats om in te schakelen.",hide_empty_wallets:"Verberg lege portemonnees",recheck:"Opnieuw controleren",contributors:"Bijdragers",license:"Licentie",reset_key:"Hersteltoets",reset_password:"Wachtwoord Resetten",border_choices:"Randkeuzes",select_all:"Alles selecteren",nfc_supported:"NFC Ondersteund",nfc_not_supported:"NFC niet ondersteund",expire_date:"Vervaldatum:",hash:"Hash:",welcome_lnbits:"Welkom bij LNbits",setup_su_account:"Stel het Superuser-account hieronder in.",create_ticker_converter:"Maak Valuta Ticker Converter",enable_audit:"Audit inschakelen",recommended:"Aanbevolen",audit_desc:"HTTP-verzoeken vastleggen volgens de opgegeven filters",audit_record_req:"Verzoeklichaam registreren",audit_record_warning:"Waarschuwing:",audit_record_req_warning_1:"vertrouwelijke gegevens (zoals wachtwoorden) worden gelogd.",audit_record_req_warning_2:"de aanvraagbody kan een grote omvang hebben.",audit_record_use:"Gebruik het met voorzichtigheid.",audit_ip:"IP-adres vastleggen",audit_ip_desc:"Leg het IP-adres van de klant vast",audit_path_params:"Parameters van het pad opnemen",audit_query_params:"Queryparameters vastleggen",audit_http_methods:"Inclusief HTTP-methoden",audit_http_methods_hint:"Lijst van HTTP-methoden die moeten worden opgenomen. Lege lijsten betekenen alles.",audit_http_methods_label:"HTTP-methoden",audit_resp_codes:"Inclusief HTTP-responscodes",audit_resp_codes_hint:"Lijst van op te nemen HTTP-codes (regex-overeenkomst). Lege lijst betekent alles. Bijvoorbeeld: 4.*, 5.*",audit_resp_codes_label:"HTTP-responscode (regex)",audit_paths:"Inclusiepad",audit_paths_hint:"Lijst met paden die moeten worden opgenomen (regex match). Lege lijst betekent alles.",audit_paths_label:"HTTP-pad (regex)",audit_paths_exclude:"Paden uitsluiten",audit_paths_exclude_hint:"Lijst met paden die moeten worden uitgesloten (regex-overeenkomst). Een lege lijst betekent geen.",audit_paths_exclude_label:"HTTP-pad (regex)",exchange_providers:"Wisselaanbieders",admin_extensions:"Beheeruitbreidingen",admin_extensions_label:"Beheerdersuitbreidingen",admin_extensions_hint:"Alleen gebruikers met beheerdersrechten kunnen extensies gebruiken.",user_default_extensions:"Standaardextensies voor gebruikers",user_default_extensions_label:"Gebruikersuitbreidingen",user_default_extensions_hint:"Extensies die standaard voor de gebruikers worden ingeschakeld.",miscellanous:"Diversen",misc_disable_extensions:"Extensies uitschakelen",misc_disable_extensions_label:"Alle extensies uitschakelen",misc_hide_api:"API verbergen",misc_hide_api_label:"Verbergt de wallet-API, extensies kunnen ervoor kiezen dit te respecteren",wallets_management:"Beheer van portemonnees",funding_source_info:"Financieringsbroninfo",funding_source:"Financieringsbron: {wallet_class}",node_balance:"Node Balans: {balance} sats",lnbits_balance:"LNbits Saldo: {balance} sats",funding_reserve_percent:"Reservepercentage: {percent} %",node_management:"Nodebeheer",node_management_not_supported:"Nodebeheer wordt niet ondersteund door de actieve financieringsbron",toggle_node_ui:"Node UI",toggle_public_node_ui:"Openbare Node UI",toggle_transactions_node_ui:"Transacties Tabblad (Uitschakelen op grote CLN-nodes)",invoice_expiry:"Factuurvervaldatum",invoice_expiry_label:"Factuurverloop (seconden)",fee_reserve:"Toegangsvergoeding Reserve",fee_reserve_msats:"Reserveringskosten in msats",fee_reserve_percent:"Reserveringskosten in procent",server_management:"Serverbeheer",base_url:"Basis-URL",base_url_label:"Statisch/Basis-URL voor de server",authentication:"Authenticatie",auth_token_expiry_label:"Token vervalt over minuten",auth_token_expiry_hint:"Tijd in minuten totdat de token verloopt",auth_allowed_methods_label:"Toegestane autorisatiemethoden",auth_allowed_methods_hint:"Selecteer autorisatiemethoden",auth_nostr_label:"Nostr Aanvraag-URL",auth_nostr_hint:"Absolute URL die de klanten zullen gebruiken om in te loggen.",auth_google_ci_label:"Google Client-ID",auth_google_ci_hint:"Zorg ervoor dat de geautoriseerde omleidings-URL's https://{domain}/api/v1/auth/google/token bevatten.",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"GitHub client-ID",auth_gh_client_id_hint:"Zorg ervoor dat de autorisatie-callback-URL is ingesteld op https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Clientgeheim",auth_keycloak_label:"Keycloak Ontdekking URL",auth_keycloak_ci_label:"Keycloak-client-ID",auth_keycloak_ci_hint:"Zorg ervoor dat de autorisatie callback-URL is ingesteld op https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak Clientgeheim",auth_keycloak_custom_org_label:"Keycloak Aangepaste Organisatie",auth_keycloak_custom_icon_label:"Keycloak Aangepast Pictogram (URL)",auth_oidc_label:"OIDC Ontdekking URL",auth_oidc_ci_label:"OIDC-client-ID",auth_oidc_ci_hint:"Zorg ervoor dat de autorisatie callback-URL is ingesteld op https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC Clientgeheim",auth_oidc_custom_org_label:"OIDC Aangepaste Organisatienaam (bijv. Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC Aangepast Pictogram (URL)",currency_settings:"Valuta-instellingen",allowed_currencies:"Toegestane valuta's",allowed_currencies_hint:"Beperk het aantal beschikbare fiatvaluta's",default_account_currency:"Standaardrekeningvaluta",default_account_currency_hint:"Standaardvaluta voor boekhouding",service_fee_label:"Servicekosten (%)",service_fee_hint:"Toeslag per transactie (%)",service_fee_max_label:"Servicekosten max (sats)",service_fee_max_hint:"Maximale servicekosten om in rekening te brengen in (sats)",fee_wallet:"Kosten Portemonnee",fee_wallet_label:"Kosten portemonnee (wallet ID)",fee_wallet_hint:"Wallet-ID om geld naar over te maken",disable_fee:"Kosten uitschakelen",disable_fee_internal:"Servicekosten uitschakelen voor interne betalingen",disable_fee_internal_desc:"Dienstenkosten uitschakelen voor interne Lightning-betalingen",ui_management:"UI-beheer",ui_site_title:"Site titel",ui_site_tagline:"Site-slogan",ui_elements_enable:"Elementen op de homepage inschakelen",ui_elements_disable:"Elementen op de homepage uitschakelen",ui_toggle_elements_tip:"Verwijder startpagina-elementen zoals 'werkt op' enz.",ui_site_description:"Sitebeschrijving",ui_site_description_hint:"Gebruik platte tekst, Markdown, of ruwe HTML",ui_default_wallet_name:"Standaard Wallet Naam",lnbits_wallet:"LNbits-portemonnee",denomination:"Denominatie",denomination_hint:"De naam voor de FakeWallet token",ui_qr_code_logo:"QR-code-logo",ui_qr_code_logo_hint:"URL naar logo-afbeelding in QR-code",ui_custom_badge:"Aangepaste badge",ui_custom_badge_label:"Aangepaste Badge 'GEBRUIK MET VOORZICHTIGHEID - LNbits-portemonnee is nog in BÈTA'",ui_custom_badge_color_label:"Aangepaste Badge Kleur",themes:"Thema's",themes_hint:"Kies thema's beschikbaar voor gebruikers",custom_logo:"Aangepast logo",custom_logo_hint:"URL naar logo-afbeelding",ad_space_title:"Advertentieruimte Titel",ad_space_title_label:"Ondersteund door",ad_slots:"Advertentieblokken",ad_slots_hint:"Ad URL en afbeeldingspad in CSV-formaat, extensies kunnen ervoor kiezen te honoreren",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Advertenties ingeschakeld",ads_disabled:"Advertenties uitgeschakeld",user_management:"Gebruikersbeheer",admin_users:"Beheerdersgebruikers",admin_users_hint:"Gebruikers met beheerdersrechten",admin_users_label:"Gebruikers-ID",allowed_users:"Toegestane gebruikers",allowed_users_hint:"Alleen deze gebruikers kunnen LNbits gebruiken",allowed_users_label:"Gebruikers-ID",allow_creation_user:"Sta het aanmaken van nieuwe gebruikers toe",allow_creation_user_desc:"Sta de aanmaak van nieuwe gebruikers op de indexpagina toe",components:"Componenten",long_running_endpoints:"Top 5 langlopende eindpunten",http_request_methods:"HTTP-aanvraagmethoden",http_response_codes:"HTTP-responscodes",request_details:"Aanvraagdetails",http_request_details:"HTTP-verzoekdetails"},window.localisation.we={confirm:"Ydw",server:"Gweinydd",theme:"Thema",site_customisation:"Addasu Safle",funding:"Arian fyndio",users:"Defnyddwyr",audit:"Archwilio",apps:"Apiau",channels:"Sianelau",transactions:"Trafodion",dashboard:"Panel Gweinyddol",node:"Nod",export_users:"Allfor Defnyddwyr",no_users:"Heb ganfod defnyddwyr",total_capacity:"Capasiti Cyfanswm",avg_channel_size:"Maint Sianel Cyf.",biggest_channel_size:"Maint Sianel Fwyaf",smallest_channel_size:"Maint Sianel Lleiaf",number_of_channels:"Nifer y Sianeli",active_channels:"Sianeli Gweithredol",connect_peer:"Cysylltu â Chymar",connect:"Cysylltu",open_channel:"Sianel Agored",open:"Agor",close_channel:"Cau Sianel",close:"cau",restart:"Ailgychwyn gweinydd",save:"Save",save_tooltip:"cadw eich newidiadau",credit_debit:"Credyd / Debyd",credit_hint:"Pwyswch Enter i gyfrif credyd",credit_label:"{denomination} i gredyd",credit_ok:"Credydu/dad-debydu llwyddiannus o gronfeydd rhithwir ({amount} sats). Mae taliadau yn dibynnu ar y cronfeydd gwirioneddol sydd ar y ffynhonnell ariannu.",restart_tooltip:"Ailgychwyn y gweinydd er mwyn i newidiadau ddod i rym",add_funds_tooltip:"Ychwanegu arian at waled.",reset_defaults:"Ailosod i`r rhagosodiadau",reset_defaults_tooltip:"Dileu pob gosodiad ac ailosod i`r rhagosodiadau.",download_backup:"Lawrlwytho copi wrth gefn cronfa ddata",name_your_wallet:"Enwch eich waled {name}",paste_invoice_label:"Gludwch anfoneb, cais am daliad neu god lnurl *",lnbits_description:"Yn hawdd iw sefydlu ac yn ysgafn, gall LNbits redeg ar unrhyw ffynhonnell ariannu rhwydwaith mellt a hyd yn oed LNbits ei hun! Gallwch redeg LNbits i chi`ch hun, neu gynnig datrysiad ceidwad i eraill yn hawdd. Mae gan bob waled ei allweddi API ei hun ac nid oes cyfyngiad ar nifer y waledi y gallwch eu gwneud. Mae gallu rhannu cronfeydd yn gwneud LNbits yn arf defnyddiol ar gyfer rheoli arian ac fel offeryn datblygu. Mae estyniadau yn ychwanegu ymarferoldeb ychwanegol at LNbits fel y gallwch arbrofi gydag ystod o dechnolegau blaengar ar y rhwydwaith mellt. Rydym wedi gwneud datblygu estyniadau mor hawdd â phosibl, ac fel prosiect ffynhonnell agored am ddim, rydym yn annog pobl i ddatblygu a chyflwyno eu rhai eu hunain.",export_to_phone:"Allforio i Ffôn gyda chod QR",export_to_phone_desc:"Mae`r cod QR hwn yn cynnwys URL eich waled gyda mynediad llawn. Gallwch ei sganio o`ch ffôn i agor eich waled oddi yno.",wallet:"Waled:",wallets:"Waledi",add_wallet:"Ychwanegu waled newydd",delete_wallet:"Dileu waled",delete_wallet_desc:"Bydd y waled gyfan hon yn cael ei dileu, ni fydd modd adennill yr arian.",rename_wallet:"Ailenwi waled",update_name:"Diweddaru enw",fiat_tracking:"Olrhain Fiat",currency:"Arian Cyfred",update_currency:"Diweddaru arian cyfred",press_to_claim:"Pwyswch i hawlio bitcoin",donate:"Rhoi",view_github:"Gweld ar GitHub",voidwallet_active:" Mae VoidWallet yn weithredol! Taliadau wedi`u hanalluogi",use_with_caution:"DEFNYDDIO GYDA GOFAL - mae waled {name} yn dal yn BETA",service_fee:"Ffi gwasanaeth: {amount} % y trafodiad",service_fee_max:"Ffi gwasanaeth: {amount} % y trafodiad (uchafswm {max} sats)",service_fee_tooltip:"Ffi gwasanaeth a godir gan weinyddwr gweinydd LNbits ym mhob trafodiad sy'n mynd allan",toggle_darkmode:"Toglo Modd Tywyll",payment_reactions:"Adweithiau Talu",view_swagger_docs:"Gweld dogfennau API LNbits Swagger",api_docs:"Dogfennau API",api_keys_api_docs:"URL y nod, allweddi API a dogfennau API",lnbits_version:"Fersiwn LNbits",runs_on:"Yn rhedeg ymlaen",paste:"Gludo",paste_from_clipboard:"Gludo o'r clipfwrdd",paste_request:"Gludo Cais",create_invoice:"Creu Anfoneb",camera_tooltip:"Defnyddio camera i sganio anfoneb/QR",export_csv:"Allforio i CSV",chart_tooltip:"Dangos siart",pending:"yn yr arfaeth",copy_invoice:"Copi anfoneb",withdraw_from:"Tynnu oddi ar",cancel:"Canslo",scan:"Sgan",read:"Darllen",pay:"Talu",memo:"Memo",date:"Dyddiad",payment_processing:"Prosesu taliad...",not_enough_funds:"Dim digon o arian!",search_by_tag_memo_amount:"Chwilio yn ôl tag, memo, swm",invoice_waiting:"Anfoneb yn aros i gael ei thalu",payment_received:"Taliad a Dderbyniwyd",payment_sent:"Taliad a Anfonwyd",receive:"derbyn",send:"anfon",outgoing_payment_pending:"Taliad sy`n aros yn yr arfaeth",drain_funds:"Cronfeydd Draenio",drain_funds_desc:"Cod QR Tynnu`n ôl LNURL yw hwn ar gyfer slurpio popeth o`r waled hon. Peidiwch â rhannu gyda neb. Mae`n gydnaws â balanceCheck a balanceNotify felly efallai y bydd eich waled yn tynnu`r arian yn barhaus o`r fan hon ar ôl y codiad cyntaf.",i_understand:"Rwy`n deall",copy_wallet_url:"Copi URL waled",disclaimer_dialog_title:"Pwysig!",disclaimer_dialog:"Swyddogaeth mewngofnodi i`w ryddhau mewn diweddariad yn y dyfodol, am y tro, gwnewch yn siŵr eich bod yn rhoi nod tudalen ar y dudalen hon ar gyfer mynediad i`ch waled yn y dyfodol! Mae`r gwasanaeth hwn yn BETA, ac nid ydym yn gyfrifol am bobl sy`n colli mynediad at arian.",no_transactions:"Dim trafodion wedi`u gwneud eto",manage:"Rheoli",exchanges:"Cyfnewidfeydd",extensions:"Estyniadau",no_extensions:"Nid oes gennych unrhyw estyniadau wedi'u gosod :(",created:"Crëwyd",search_extensions:"Chwilio estyniadau",extension_sources:"Ffynonellau Estyniad",ext_sources_hint:"Repoau o ble gellir lawrlwytho'r estyniadau",ext_sources_label:"URL Ffynhonnell (defnyddiwch ffynhonnell estyniad swyddogol LNbits yn unig, a ffynonellau y gallwch ymddiried ynddynt)",warning:"Rhybudd",repository:"Ystorfa",confirm_continue:"Ydych chi'n siŵr eich bod chi eisiau parhau?",manage_extension_details:"Gosod/dadosod estyniad",install:"Gosod",uninstall:"Dadgymhwyso",drop_db:"Dileu Data",enable:"Galluogi",pay_to_enable:"Talu I Alluogi",enable_extension_details:"Galluogi estyniad ar gyfer y defnyddiwr presennol",disable:"Analluogi",delete:"Dileu",installed:"Gosodwyd",activated:"Wedi'i actifadu",deactivated:"Anweithredol",release_notes:"Nodiadau Rhyddhau",activate_extension_details:"Gwneud estyniad ar gael/anar gael i ddefnyddwyr",featured:"Nodweddwyd",all:"Pob",only_admins_can_install:"Dim ond cyfrifon gweinyddwr all osod estyniadau",admin_only:"Dim ond Gweinyddwr",new_version:"Fersiwn Newydd",extension_depends_on:"Dibynnu ar:",extension_rating_soon:"Sgôr yn dod yn fuan",extension_installed_version:"Fersiwn wedi'i gosod",extension_uninstall_warning:"Rydych chi ar fin dileu'r estyniad ar gyfer pob defnyddiwr.",uninstall_confirm:"Ie, Dad-osod",extension_db_drop_info:"Bydd yr holl ddata ar gyfer yr estyniad yn cael ei ddileu'n barhaol. Does dim ffordd o dadwneud y weithrediad hwn!",extension_db_drop_warning:"Rydych chi ar fin dileu'r holl ddata ar gyfer yr estyniad. Teipiwch enw'r estyniad i barhau:",extension_required_lnbits_version:"Mae'r rhyddhau hwn yn gofyn o leiaf am fersiwn LNbits",min_version:"Isafswm (cynnwys)",max_version:"Uchafswm (wedi'i eithrio)",payment_hash:"Hais Taliad",fee:"Fee",amount:"swm",amount_sats:"Swm (sats)",tag:"Tag",unit:"Uned",description:"Disgrifiad",expiry:"dod i ben",webhook:"bachyn we",payment_proof:"prawf taliad",update:"Diweddariad",update_available:"Diweddariad {version} ar gael!",latest_update:"Rydych chi ar y fersiwn diweddaraf {version}.",notifications:"Hysbysiadau",no_notifications:"Dim hysbysiadau",notifications_disabled:"Hysbysiadau statws LNbits wedi'u analluogi.",enable_notifications:"Galluogi Hysbysiadau",enable_notifications_desc:"Os bydd wedi'i alluogi bydd yn nôl y diweddariadau Statws LNbits diweddaraf, fel digwyddiadau diogelwch a diweddariadau.",enable_watchdog:"Galluogi Watchdog",enable_watchdog_desc:"Os bydd yn cael ei alluogi bydd yn newid eich ffynhonnell ariannu i VoidWallet yn awtomatig os bydd eich balans yn is na balans LNbits. Bydd angen i chi alluogi â llaw ar ôl diweddariad.",watchdog_interval:"Amserlennu Gwylio",watchdog_interval_desc:"Pa mor aml y dylai'r dasg gefndir wirio am signal torri yn y gwarchodfa delta [node_balance - lnbits_balance] (mewn munudau).",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Terfyn cyn i'r switshladd newid ffynhonnell ariannu i VoidWallet [lnbits_balance - node_balance > delta]",status:"Statws",notification_source:"Ffynhonnell Hysbysiad",notification_source_label:"URL Ffynhonnell (defnyddiwch yn unig ffynhonnell statws swyddogol LNbits, a ffynonellau y gallwch ymddiried ynddynt)",more:"mwy",less:"llai",releases:"Rhyddhau",watchdog:"Gwyliwr",server_logs:"Logiau Gweinydd",ip_blocker:"Rheolydd IP",security:"Diogelwch",security_tools:"Offer teclynnau diogelwch",block_access_hint:"Atal mynediad gan IP",allow_access_hint:"Caniatáu mynediad gan IP (bydd yn diystyru IPs sydd wedi'u blocio)",enter_ip:"Rhowch IP a gwasgwch enter",rate_limiter:"Cyfyngydd Cyfradd",wallet_limiter:"Cyfyngwr Waled",wallet_limit_max_withdraw_per_day:"Uchafswm tynnu’n ôl waled dyddiol mewn sats (0 i analluogi)",wallet_max_ballance:"Uchafswm balans y waled mewn sats (0 i analluogi)",wallet_limit_secs_between_trans:"Eiliadau lleiaf rhwng trafodion fesul waled (0 i analluogi)",number_of_requests:"Nifer y ceisiadau",time_unit:"Uned amser",minute:"munud",second:"ail",hour:"awr",disable_server_log:"Analluogi Log Gweinydd",enable_server_log:"Galluogi Log Gweinydd",coming_soon:"Nodwedd yn dod yn fuan",session_has_expired:"Mae eich sesiwn wedi dod i ben. Mewngofnodwch eto.",instant_access_question:"Eisiau mynediad ar unwaith?",login_with_user_id:"Mewngofnodi gyda ID y defnyddiwr",or:"neu",create_new_wallet:"Creu Waled Newydd",login_to_account:"Mewngofnodwch i'ch cyfrif",create_account:"Creu cyfrif",account_settings:"Gosodiadau Cyfrif",signin_with_nostr:"Parhewch gyda Nostr",signin_with_google:"Mewngofnodi gyda Google",signin_with_github:"Mewngofnodi gyda GitHub",signin_with_keycloak:"Mewngofnodi gyda Keycloak",username_or_email:"Defnyddiwr neu E-bost",password:"Cyfrinair",password_config:"Ffurfweddiad Cyfrinair",password_repeat:"Ailadrodd cyfrinair",change_password:"Newid Cyfrinair",update_credentials:"Diweddaru Cyfrifoldebau",update_pubkey:"Diweddaru Allwedd Gyhoeddus",set_password:"Gosod Cyfrinair",invalid_password:"Rhaid i'r cyfrinair gynnwys o leiaf 8 nod.",login:"Mewngofnodi",register:"Cofrestru",username:"Enw defnyddiwr",pubkey:"Allwedd Gyhoeddus",user_id:"ID Defnyddiwr",email:"E-bost",first_name:"Enw Cyntaf",last_name:"Cyfenw",picture:"Llun",verify_email:"Gwirio e-bost gyda",account:"Cyfrif",update_account:"Diweddaru Cyfrif",invalid_username:"Enw Defnyddiwr Annilys",auth_provider:"Darparwr Dilysiad",my_account:"Fy Nghyfrif",back:"Yn ôl",logout:"Allgofnodi",look_and_feel:"Edrych a Theimlo",toggle_gradient:"Toglo Graddiênt",gradient_background:"Cefndir Graddiant",language:"Iaith",color_scheme:"Cynllun Lliw",admin_settings:"Gosodiadau Gweinyddol",extension_cost:"Mae'r rhyddhad hwn yn gofyn am daliad o leiaf {cost} sats.",extension_paid_sats:"Rydych chi eisoes wedi talu {paid_sats} sats.",release_details_error:"Methu cael manylion y rhyddhau.",pay_from_wallet:"Talu o'r Waled",wallet_required:"Waled *",show_qr:"Dangos QR",retry_install:"Ailgeisio Gosod",new_payment:"Gwneud Taliad Newydd",update_payment:"Diweddarwch Dalu",already_paid_question:"Ydych chi eisoes wedi talu?",sell:"Gwerthu",sell_require:"Gofynnwch am daliad i alluogi estyniad",sell_info:"Mae angen taliad o leiaf {amount} sats ar yr estyniad {name} i'w alluogi.",hide_empty_wallets:"Cuddio waledau gwag",recheck:"Ailwirio",contributors:"Cyfranwyr",license:"Trwydded",reset_key:"Ailosod Allwedd",reset_password:"Ailosod Cyfrinair",border_choices:"Dewisiadau Ffin",select_all:"Dewis Pob Un",nfc_supported:"Cefnogir NFC",nfc_not_supported:"NFC heb ei Gefnogi",expire_date:"Dyddiad Dod i Ben:",hash:"Hash:",welcome_lnbits:"Croeso i LNbits",setup_su_account:"Sefydlu'r cyfrif Superuser isod.",create_ticker_converter:"Creu Trosi Ticiwr Arian",enable_audit:"Galluogi Archwilio",recommended:"Argymhellir",audit_desc:"Cofnodi ceisiadau HTTP yn ôl y hidlwyr penodedig",audit_record_req:"Cofnodi Corff y Cais",audit_record_warning:"Rhybudd:",audit_record_req_warning_1:"data cyfrinachol (fel cyfrineiriau) yn cael eu logio.",audit_record_req_warning_2:"mae gan y corff cais faint mawr.",audit_record_use:"Defnyddiwch ef gyda gofal.",audit_ip:"Cofnodi Cyfeiriad IP",audit_ip_desc:"Cofnodwch gyfeiriad IP y cleient",audit_path_params:"Cofnod Paramedrau Llwybr",audit_query_params:"Cofnod Paramedrau Holiannau",audit_http_methods:"Cynnwys Dulliau HTTP",audit_http_methods_hint:"Rhestr o ddulliau HTTP i'w cynnwys. Yn golygu pob un yw rhestrau gwag.",audit_http_methods_label:"Dulliau HTTP",audit_resp_codes:"Cynnwys Codau Ymateb HTTP",audit_resp_codes_hint:"Rhestr o godau HTTP i'w cynnwys (cydweddu regex). Mae rhestrau gwag yn golygu popeth. Ee: 4.*, 5.*",audit_resp_codes_label:"Cod Ymateb HTTP (regex)",audit_paths:"Cynnwys Llwybrau",audit_paths_hint:"Rhestr o lwybrau i'w cynnwys (cydweddiad rhegiwlar). Mae rhestr wag yn golygu pob un.",audit_paths_label:"Llwybr HTTP (regex)",audit_paths_exclude:"Eithrio Llwybrau",audit_paths_exclude_hint:"Rhestr o lwybrau i'w heithrio (cydweddu regex). Mae rhestr wag yn golygu dim.",audit_paths_exclude_label:"Llwybr HTTP (regex)",exchange_providers:"Darparwyr Cyfnewid",admin_extensions:"Estyniadau Gweinyddol",admin_extensions_label:"Estyniadau gweinyddu",admin_extensions_hint:"Dim ond defnyddiwr Estyniadau gyda braint gweinyddwr sy'n gallu defnyddio",user_default_extensions:"Rhyngwyneb Diofyn Defnyddiwr",user_default_extensions_label:"Estyniadau defnyddiwr",user_default_extensions_hint:"Estyniadau a fydd yn cael eu galluogi yn ddiofyn ar gyfer y defnyddwyr.",miscellanous:"Amrywiol",misc_disable_extensions:"Analluogi Estyniadau",misc_disable_extensions_label:"Analluogi'r holl estynniadau",misc_hide_api:"Cuddio API",misc_hide_api_label:"Yn cuddio api waled, gall estyniadau ddewis anrhydeddu",wallets_management:"Rheoli Waledau",funding_source_info:"Gwybodaeth am Ffynhonnell Ariannu",funding_source:"Ffynhonnell Ariannu: {wallet_class}",node_balance:"Cydbwysedd Nôd: {balance} sats",lnbits_balance:"Cydbwysedd LNbits: {balance} sats",funding_reserve_percent:"Cadw Canran: {percent} %",node_management:"Rheoli Nodau",node_management_not_supported:"Nid yw Rheoli Nodau yn cael ei gefnogi gan ffynhonnell ariannu weithredol",toggle_node_ui:"Node UI",toggle_public_node_ui:"UI Nod Cyhoeddus",toggle_transactions_node_ui:"Tab Trafodion (Analluoga ar nodau CLN mawr)",invoice_expiry:"Dyddiad Dod i Ben yr Anfoneb",invoice_expiry_label:"Darfod anfoneb (eiliadau)",fee_reserve:"Cadw Ffi",fee_reserve_msats:"Ffi cadw yn msats",fee_reserve_percent:"Ffioedd cadw mewn canran",server_management:"Rheoli Gweinyddwr",base_url:"Prif URL",base_url_label:"Url statig/sylfaen ar gyfer y gweinydd",authentication:"Dilysiad",auth_token_expiry_label:"Cofnodi munudau dod i ben",auth_token_expiry_hint:"Amser mewn munudau tan fod y tocyn yn dod i ben",auth_allowed_methods_label:"Dulliau awdurdodi a ganiateir",auth_allowed_methods_hint:"Dewiswch ddulliau awdurdodi",auth_nostr_label:"URL Cais Nostr",auth_nostr_hint:"URL absoliwt y bydd y cleientiaid yn ei ddefnyddio i fewngofnodi.",auth_google_ci_label:"ID Cleient Google",auth_google_ci_hint:"Sicrhewch fod yr URIs adnewyddu awdurdodedig yn cynnwys https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Cwsmer Google Dirgel",auth_gh_client_id_label:"ID Cleient GitHub",auth_gh_client_id_hint:"Gwnewch yn siŵr bod y URL galwad yn ôl awdurdodi wedi'i osod i https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Cudd-wybodaeth Cleient GitHub",auth_keycloak_label:"URL Darganfod Keycloak",auth_keycloak_ci_label:"ID Cleient Keycloak",auth_keycloak_ci_hint:"Gwnewch yn siŵr bod URL adalw awdurdodiad wedi'i osod i https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Cyfrinach Cleient Keycloak",auth_keycloak_custom_org_label:"Sefydliad Wedi'i Addasu Keycloak",auth_keycloak_custom_icon_label:"Eicon Wedi'i Addasu Keycloak (URL)",auth_oidc_label:"URL Darganfod OIDC",auth_oidc_ci_label:"ID Cleient OIDC",auth_oidc_ci_hint:"Gwnewch yn siŵr bod URL adalw awdurdodiad wedi'i osod i https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Cyfrinach Cleient OIDC",auth_oidc_custom_org_label:"Enw Sefydliad Wedi'i Addasu OIDC (e.e. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Eicon Wedi'i Addasu OIDC (URL)",currency_settings:"Gosodiadau Arian Cyfred",allowed_currencies:"Ariannau a Ganiateir",allowed_currencies_hint:"Cyfyngu nifer yr arian cyfred fiat sydd ar gael",default_account_currency:"Arian Cyfred Diofyn y Cyfrif",default_account_currency_hint:"Arian cyfred diofyn ar gyfer cyfrifyddu",service_fee_label:"Ffioedd gwasanaeth (%)",service_fee_hint:"Ffi a godir fesul trx (%)",service_fee_max_label:"Ffioedd gwasanaeth uchaf (sats)",service_fee_max_hint:"Uchafswm ffi gwasanaeth i godi mewn (sats)",fee_wallet:"Waled Ffioedd",fee_wallet_label:"Ffi waled (ID waled)",fee_wallet_hint:"ID Cwlt hon i anfon cronfeydd i",disable_fee:"Analluogi Ffi",disable_fee_internal:"Analluogi Ffi Gwasanaeth ar gyfer Taliadau Mewnol",disable_fee_internal_desc:"Analluogi Ffi Gwasanaeth ar gyfer Taliadau Mellt Mewnol",ui_management:"Rheoli UI",ui_site_title:"Teitl y Safle",ui_site_tagline:"Tagline'r Safle",ui_elements_enable:"Galluogi elfennau ar hafan",ui_elements_disable:"Analluoga elfennau ar y dudalen gartref",ui_toggle_elements_tip:"Tynn elfennau tudalen gartref fel 'yn rhedeg ar' ayyb.",ui_site_description:"Disgrifiad Safle",ui_site_description_hint:"Defnyddiwch destun plaen, Markdown, neu HTML crai",ui_default_wallet_name:"Enw Diofyn y Waled",lnbits_wallet:"Cwdyn LNbits",denomination:"Enwad",denomination_hint:"Enw'r token FakeWallet",ui_qr_code_logo:"Logo Cod QR",ui_qr_code_logo_hint:"URL i ddelwedd logo yn y cod QR",ui_custom_badge:"Bathodyn Personol",ui_custom_badge_label:"Bathodyn Custom 'DEFNYDDIO GYDA RHYBUDD - mae waled LNbits dal mewn BETA'",ui_custom_badge_color_label:"Lliw Bathodyn Personol",themes:"Themâu",themes_hint:"Dewiswch themâu sydd ar gael i ddefnyddwyr",custom_logo:"Logo Personol",custom_logo_hint:"URL i ddelwedd logo",ad_space_title:"Teitl Gofod Hysbysebu",ad_space_title_label:"Cefnogir gan",ad_slots:"Slotiau Hysbysebu",ad_slots_hint:"Ychwanegu url a llwybrau ffeil delwedd yn y fformat CSV, gall estyniadau ddewis i barchu",ad_slots_label:"url;url_delwedd_ysgafn;url_delwedd_tywyll, url...",ads_enabled:"Hysbysebion wedi'u Galluogi",ads_disabled:"Hysbysebion Wedi'u Analluogi",user_management:"Rheoli Defnyddwyr",admin_users:"Defnyddwyr Gweinyddol",admin_users_hint:"Defnyddwyr â breintiau gweinyddol",admin_users_label:"ID Defnyddiwr",allowed_users:"Defnyddwyr a Ganiateir",allowed_users_hint:"Dim ond y defnyddwyr hyn all ddefnyddio LNbits",allowed_users_label:"ID defnyddiwr",allow_creation_user:"Caniatáu creu defnyddwyr newydd",allow_creation_user_desc:"Caniatáu creu defnyddwyr newydd ar y dudalen fynegai",components:"Cydrannau",long_running_endpoints:"5 Pwynt Terfyn Hir-rhediad Uchaf",http_request_methods:"Dulliau Cais HTTP",http_response_codes:"Codau Ymateb HTTP",request_details:"Manylion y Cais",http_request_details:"Manylion Cais HTTP"},window.localisation.pt={confirm:"Sim",server:"Servidor",theme:"Tema",site_customisation:"Customização do Site",funding:"Financiamento",users:"Usuários",audit:"Auditoria",apps:"Aplicativos",channels:"Canais",transactions:"Transações",dashboard:"Painel de Controle",node:"Nó",export_users:"Exportar Usuários",no_users:"Nenhum usuário encontrado",total_capacity:"Capacidade Total",avg_channel_size:"Tamanho Médio do Canal",biggest_channel_size:"Maior Tamanho do Canal",smallest_channel_size:"Menor Tamanho de Canal",number_of_channels:"Número de Canais",active_channels:"Canais Ativos",connect_peer:"Conectar Par",connect:"Conectar",open_channel:"Canal Aberto",open:"Abrir",close_channel:"Fechar Canal",close:"Fechar",restart:"Reiniciar servidor",save:"Gravar",save_tooltip:"Gravar as alterações",credit_debit:"Crédito / Débito",credit_hint:"Pressione Enter para creditar a conta",credit_label:"{denomination} para creditar",credit_ok:"Sucesso ao creditar/debitar fundos virtuais ({amount} sats). Os pagamentos dependem dos fundos reais na fonte de financiamento.",restart_tooltip:"Reinicie o servidor para que as alterações tenham efeito",add_funds_tooltip:"Adicionar fundos a uma carteira.",reset_defaults:"Redefinir para padrões",reset_defaults_tooltip:"Apagar todas as configurações e redefinir para os padrões.",download_backup:"Fazer backup da base de dados",name_your_wallet:"Nomeie sua carteira {name}",paste_invoice_label:"Cole uma fatura, pedido de pagamento ou código lnurl *",lnbits_description:"Fácil de configurar e leve, o LNbits pode ser executado em qualquer fonte de financiamento da Lightning Network e até mesmo o LNbits em si! Você pode executar o LNbits para si mesmo ou oferecer facilmente uma solução de custódia para outros. Cada carteira tem suas próprias chaves de API e não há limite para o número de carteiras que você pode criar. Ser capaz de particionar fundos torna o LNbits uma ferramenta útil para gerenciamento de dinheiro e como uma ferramenta de desenvolvimento. As extensões adicionam funcionalidades extras ao LNbits para que você possa experimentar uma série de tecnologias de ponta na rede lightning. Nós tornamos o desenvolvimento de extensões o mais fácil possível e, como um projeto gratuito e de código aberto, incentivamos as pessoas a desenvolver e enviar as suas próprias.",export_to_phone:"Exportar para o telefone com código QR",export_to_phone_desc:"Este código QR contém a URL da sua carteira com acesso total. Você pode escaneá-lo do seu telefone para abrir sua carteira a partir dele.",wallet:"Carteira:",wallets:"Carteiras",add_wallet:"Adicionar nova carteira",delete_wallet:"Excluir carteira",delete_wallet_desc:"Toda a carteira será excluída, os fundos serão IRRECUPERÁVEIS.",rename_wallet:"Renomear carteira",update_name:"Atualizar nome",fiat_tracking:"Rastreamento Fiat",currency:"Moeda",update_currency:"Atualizar moeda",press_to_claim:"Pressione para solicitar bitcoin",donate:"Doar",view_github:"Ver no GitHub",voidwallet_active:"VoidWallet está ativo! Pagamentos desabilitados",use_with_caution:"USE COM CAUTELA - a carteira {name} ainda está em BETA",service_fee:"Taxa de serviço: {amount} % por transação",service_fee_max:"Taxa de serviço: {amount} % por transação (máximo de {max} sats)",service_fee_tooltip:"Taxa de serviço cobrada pelo administrador do servidor LNbits por transação de saída",toggle_darkmode:"Alternar modo escuro",payment_reactions:"Reações de Pagamento",view_swagger_docs:"Ver a documentação da API do LNbits Swagger",api_docs:"Documentação da API",api_keys_api_docs:"URL do Nó, chaves de API e documentação de API",lnbits_version:"Versão do LNbits",runs_on:"Executa em",paste:"Colar",paste_from_clipboard:"Colar da área de transferência",paste_request:"Colar Pedido",create_invoice:"Criar Fatura",camera_tooltip:"Usar a câmara para escanear uma fatura / QR",export_csv:"Exportar para CSV",chart_tooltip:"Mostrar gráfico",pending:"Pendente",copy_invoice:"Copiar fatura",withdraw_from:"Retirar de",cancel:"Cancelar",scan:"Escanear",read:"Ler",pay:"Pagar",memo:"Memo",date:"Data",payment_processing:"Processando pagamento...",not_enough_funds:"Fundos insuficientes!",search_by_tag_memo_amount:"Pesquisar por tag, memo, quantidade",invoice_waiting:"Fatura aguardando pagamento",payment_received:"Pagamento Recebido",payment_sent:"Pagamento Enviado",receive:"receber",send:"enviar",outgoing_payment_pending:"Pagamento de saída pendente",drain_funds:"Esvasiar carteira",drain_funds_desc:"Este é um código QR de saque LNURL para sacar tudo desta carteira. Não o partilhe com ninguém. É compatível com balanceCheck e balanceNotify para que a sua carteira possa continuar levantando os fundos continuamente daqui após o primeiro saque.",i_understand:"Eu entendo",copy_wallet_url:"Copiar URL da carteira",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"Funcionalidade de login a ser lançada numa atualização futura, por enquanto, certifique-se que marca esta página para acesso futuro à sua carteira! Este serviço está em BETA, e não nos responsabilizamos por pessoas que perderem o acesso aos fundos.",no_transactions:"Ainda não foram feitas transações",manage:"Gerir",exchanges:"Trocas",extensions:"Extensões",no_extensions:"Não há nenhuma extensão instalada :(",created:"Criado",search_extensions:"Pesquisar extensões",extension_sources:"Fontes de Extensão",ext_sources_hint:"Repositórios de onde as extensões podem ser baixadas",ext_sources_label:"URL de origem (use apenas a fonte oficial da extensão LNbits e fontes em que você confia)",warning:"Aviso",repository:"Repositório",confirm_continue:"Tem certeza de que deseja continuar?",manage_extension_details:"Instalar/desinstalar extensão",install:"Instalar",uninstall:"Desinstalar",drop_db:"Remover Dados",enable:"Ativar",pay_to_enable:"Pagar para Ativar",enable_extension_details:"Ativar extensão para o usuário atual",disable:"Desativar",delete:"Excluir",installed:"Instalado",activated:"Ativado",deactivated:"Desativado",release_notes:"Notas de Lançamento",activate_extension_details:"Torne a extensão disponível/indisponível para usuários",featured:"Destacado",all:"Todos",only_admins_can_install:"Apenas contas de administrador podem instalar extensões.",admin_only:"Apenas para administradores",new_version:"Nova Versão",extension_depends_on:"Depende de:",extension_rating_soon:"Avaliações em breve",extension_installed_version:"Versão instalada",extension_uninstall_warning:"Você está prestes a remover a extensão para todos os usuários.",uninstall_confirm:"Sim, Desinstalar",extension_db_drop_info:"Todos os dados da extensão serão permanentemente excluídos. Não há como desfazer essa operação!",extension_db_drop_warning:"Você está prestes a remover todos os dados para a extensão. Por favor, digite o nome da extensão para continuar:",extension_required_lnbits_version:"Esta versão requer pelo menos a versão LNbits",min_version:"Mínimo (incluído)",max_version:"Máximo (excluído)",payment_hash:"Hash de pagamento",fee:"Taxa",amount:"Quantidade",amount_sats:"Quantidade (sats)",tag:"Etiqueta",unit:"Unidade",description:"Descrição",expiry:"Validade",webhook:"Webhook",payment_proof:"Comprovativo de pagamento",update:"Atualizar",update_available:"Atualização {version} disponível!",latest_update:"Você está na última versão {version}.",notifications:"Notificações",no_notifications:"Sem notificações",notifications_disabled:"As notificações de status do LNbits estão desativadas.",enable_notifications:"Ativar Notificações",enable_notifications_desc:"Se ativado, ele buscará as últimas atualizações de status do LNbits, como incidentes de segurança e atualizações.",enable_watchdog:"Ativar Watchdog",enable_watchdog_desc:"Se ativado, mudará automaticamente a sua fonte de financiamento para VoidWallet caso o seu saldo seja inferior ao saldo LNbits. Você precisará ativar manualmente após uma atualização.",watchdog_interval:"Intervalo do Watchdog",watchdog_interval_desc:"Com que frequência a tarefa de fundo deve verificar um sinal de desligamento no delta do watchdog [node_balance - lnbits_balance] (em minutos).",watchdog_delta:"Observador Delta",watchdog_delta_desc:"Limite antes que o killswitch altere a fonte de financiamento para VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fonte de Notificação",notification_source_label:"URL de Origem (use apenas a fonte oficial de status do LNbits e fontes em que confia)",more:"mais",less:"menos",releases:"Lançamentos",watchdog:"Cão de guarda",server_logs:"Registros do Servidor",ip_blocker:"Bloqueador de IP",security:"Segurança",security_tools:"Ferramentas de segurança",block_access_hint:"Bloquear acesso por IP",allow_access_hint:"Permitir acesso por IP (substituirá IPs bloqueados)",enter_ip:"Digite o IP e pressione enter.",rate_limiter:"Limitador de Taxa",wallet_limiter:"Limitador de Carteira",wallet_limit_max_withdraw_per_day:"Limite diário máximo de saque da carteira em sats (0 para desativar)",wallet_max_ballance:"Saldo máximo da carteira em sats (0 para desativar)",wallet_limit_secs_between_trans:"Minutos seg. entre transações por carteira (0 para desativar)",number_of_requests:"Número de solicitações",time_unit:"Unidade de tempo",minute:"minuto",second:"segundo",hour:"hora",disable_server_log:"Desativar Log do Servidor",enable_server_log:"Ativar Log do Servidor",coming_soon:"Funcionalidade em breve",session_has_expired:"Sua sessão expirou. Por favor, faça login novamente.",instant_access_question:"Quer acesso imediato?",login_with_user_id:"Entrar com ID do usuário",or:"ou",create_new_wallet:"Criar Nova Carteira",login_to_account:"Faça login na sua conta",create_account:"Criar conta",account_settings:"Configurações da Conta",signin_with_nostr:"Continue com Nostr",signin_with_google:"Entrar com o Google",signin_with_github:"Entrar com o GitHub",signin_with_keycloak:"Entrar com o Keycloak",username_or_email:"Nome de usuário ou Email",password:"Senha",password_config:"Configuração de Senha",password_repeat:"Repetição de senha",change_password:"Alterar Senha",update_credentials:"Atualizar Credenciais",update_pubkey:"Atualizar Chave Pública",set_password:"Definir Senha",invalid_password:"A senha deve ter pelo menos 8 caracteres",login:"Entrar",register:"Registrar",username:"Nome de usuário",pubkey:"Chave Pública",user_id:"ID do Usuário",email:"E-mail",first_name:"Nome próprio",last_name:"Sobrenome",picture:"Foto",verify_email:"Verifique o e-mail com",account:"Conta",update_account:"Atualizar Conta",invalid_username:"Nome de usuário inválido",auth_provider:"Provedor de Autenticação",my_account:"Minha Conta",back:"Voltar",logout:"Sair",look_and_feel:"Aparência e Sensação",toggle_gradient:"Alternar Gradiente",gradient_background:"Fundo Gradiente",language:"Idioma",color_scheme:"Esquema de Cores",admin_settings:"Configurações de Administração",extension_cost:"Este lançamento requer um pagamento mínimo de {cost} sats.",extension_paid_sats:"Você já pagou {paid_sats} sats.",release_details_error:"Não é possível obter os detalhes da versão.",pay_from_wallet:"Pague da Carteira",wallet_required:"Carteira *",show_qr:"Exibir QR",retry_install:"Reinstalar Tente Novamente",new_payment:"Realizar Novo Pagamento",update_payment:"Atualizar Pagamento",already_paid_question:"Já pagou?",sell:"Vender",sell_require:"Peça pagamento para habilitar a extensão",sell_info:"A extensão {name} requer um pagamento mínimo de {amount} sats para habilitar.",hide_empty_wallets:"Ocultar carteiras vazias",recheck:"Rever",contributors:"Colaboradores",license:"Licença",reset_key:"Redefinir Chave",reset_password:"Redefinir Senha",border_choices:"Opções de Borda",select_all:"Selecionar tudo",nfc_supported:"NFC Suportado",nfc_not_supported:"NFC não suportado",expire_date:"Data de Expiração:",hash:"Hash:",welcome_lnbits:"Bem-vindo ao LNbits",setup_su_account:"Configure a conta Superusuário abaixo.",create_ticker_converter:"Criar Conversor de Moeda Ticker",enable_audit:"Ativar Auditoria",recommended:"Recomendado",audit_desc:"Registre solicitações HTTP de acordo com os filtros especificados",audit_record_req:"Registrar Corpo da Solicitação",audit_record_warning:"Aviso:",audit_record_req_warning_1:"dados confidenciais (como senhas) serão registrados.",audit_record_req_warning_2:"o corpo da solicitação pode ter um tamanho grande.",audit_record_use:"Use com cautela.",audit_ip:"Registrar Endereço IP",audit_ip_desc:"Registre o endereço IP do cliente",audit_path_params:"Registrar parâmetros de caminho",audit_query_params:"Registrar Parâmetros de Consulta",audit_http_methods:"Incluir métodos HTTP",audit_http_methods_hint:"Lista de métodos HTTP a serem incluídos. Listas vazias significam todos.",audit_http_methods_label:"Métodos HTTP",audit_resp_codes:"Incluir Códigos de Resposta HTTP",audit_resp_codes_hint:"Lista de códigos HTTP a serem incluídos (correspondência com expressões regulares). Listas vazias significam todos. Ex: 4.*, 5.*",audit_resp_codes_label:"Código de resposta HTTP (regex)",audit_paths:"Incluir Caminhos",audit_paths_hint:"Lista de caminhos a serem incluídos (correspondência regex). Lista vazia significa todos.",audit_paths_label:"Caminho HTTP (regex)",audit_paths_exclude:"Excluir Caminhos",audit_paths_exclude_hint:"Lista de caminhos a serem excluídos (correspondência com regex). Lista vazia significa nenhum.",audit_paths_exclude_label:"Caminho HTTP (regex)",exchange_providers:"Provedores de Câmbio",admin_extensions:"Extensões do Administrador",admin_extensions_label:"Extensões administrativas",admin_extensions_hint:"Somente usuários com privilégios de administrador podem usar extensões.",user_default_extensions:"Extensões Padrão do Usuário",user_default_extensions_label:"Extensões do usuário",user_default_extensions_hint:"Extensões que serão ativadas por padrão para os usuários.",miscellanous:"Diversos",misc_disable_extensions:"Desativar Extensões",misc_disable_extensions_label:"Desativar todas as extensões",misc_hide_api:"Ocultar API",misc_hide_api_label:"Oculta a API da carteira, extensões podem optar por honrar",wallets_management:"Gestão de Carteiras",funding_source_info:"Informações da Fonte de Financiamento",funding_source:"Fonte de Financiamento: {wallet_class}",node_balance:"Saldo do Nó: {balance} sats",lnbits_balance:"Saldo do LNbits: {balance} sats",funding_reserve_percent:"Reserve Percentagem: {percent} %",node_management:"Gerenciamento de Nós",node_management_not_supported:"Gerenciamento de nós não suportado pela fonte de financiamento ativa",toggle_node_ui:"Interface do Usuário de Nó",toggle_public_node_ui:"Interface Pública do Nó",toggle_transactions_node_ui:"Aba de Transações (Desativar em nós grandes do CLN)",invoice_expiry:"Validade da Fatura",invoice_expiry_label:"Expiração da fatura (segundos)",fee_reserve:"Reserva de Taxa",fee_reserve_msats:"Taxa de reserva em msats",fee_reserve_percent:"Taxa de reserva em porcentagem",server_management:"Gerenciamento de Servidor",base_url:"URL base",base_url_label:"URL estático/base para o servidor",authentication:"Autenticação",auth_token_expiry_label:"Minutos de expiração do token",auth_token_expiry_hint:"Tempo em minutos até que o token expire",auth_allowed_methods_label:"Métodos de autorização permitidos",auth_allowed_methods_hint:"Selecione os métodos de autorização",auth_nostr_label:"URL de Solicitação Nostr",auth_nostr_hint:"URL absoluta que os clientes usarão para fazer login.",auth_google_ci_label:"ID do Cliente do Google",auth_google_ci_hint:"Certifique-se de que os URIs de redirecionamento autorizados contenham https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Segredo do Cliente do Google",auth_gh_client_id_label:"ID do Cliente do GitHub",auth_gh_client_id_hint:"Certifique-se de que a URL de retorno de chamada de autorização esteja definida como https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Cliente Secreto do GitHub",auth_keycloak_label:"URL de Descoberta do Keycloak",auth_keycloak_ci_label:"ID do Cliente do Keycloak",auth_keycloak_ci_hint:"Certifique-se de que o URL de retorno de chamada de autorização esteja definido como https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Segredo do Cliente do Keycloak",auth_keycloak_custom_org_label:"Organização Personalizada do Keycloak",auth_keycloak_custom_icon_label:"Ícone Personalizado do Keycloak (URL)",auth_oidc_label:"URL de Descoberta do OIDC",auth_oidc_ci_label:"ID do Cliente do OIDC",auth_oidc_ci_hint:"Certifique-se de que o URL de retorno de chamada de autorização esteja definido como https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Segredo do Cliente do OIDC",auth_oidc_custom_org_label:"Nome da Organização Personalizada OIDC (ex. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Ícone Personalizado do OIDC (URL)",currency_settings:"Configurações de Moeda",allowed_currencies:"Moedas Permitidas",allowed_currencies_hint:"Limite o número de moedas fiduciárias disponíveis",default_account_currency:"Moeda Padrão da Conta",default_account_currency_hint:"Moeda padrão para contabilidade",service_fee_label:"Taxa de serviço (%)",service_fee_hint:"Taxa cobrada por transação (%)",service_fee_max_label:"Taxa de serviço máx (sats)",service_fee_max_hint:"Taxa máxima de serviço a cobrar em (sats)",fee_wallet:"Carteira de Taxas",fee_wallet_label:"Carteira de taxa (ID da carteira)",fee_wallet_hint:"ID da carteira para enviar fundos para",disable_fee:"Desativar taxa",disable_fee_internal:"Desativar Taxa de Serviço para Pagamentos Internos",disable_fee_internal_desc:"Desativar Taxa de Serviço para Pagamentos Internos Lightning",ui_management:"Gestão de UI",ui_site_title:"Título do Site",ui_site_tagline:"Tagline do site",ui_elements_enable:"Ativar elementos na página inicial",ui_elements_disable:"Desativar elementos na página inicial",ui_toggle_elements_tip:"Remova elementos da homepage como 'executa em' etc.",ui_site_description:"Descrição do Site",ui_site_description_hint:"Use texto simples, Markdown ou HTML bruto",ui_default_wallet_name:"Nome Padrão da Carteira",lnbits_wallet:"Carteira LNbits",denomination:"Denominação",denomination_hint:"O nome para o token FakeWallet",ui_qr_code_logo:"Logo do Código QR",ui_qr_code_logo_hint:"URL para imagem do logotipo no código QR",ui_custom_badge:"Distintivo Personalizado",ui_custom_badge_label:"Emblema Personalizado 'USE COM CAUTELA - A carteira LNbits ainda está em BETA'",ui_custom_badge_color_label:"Cor Personalizada do Distintivo",themes:"Temas",themes_hint:"Escolha os temas disponíveis para os usuários",custom_logo:"Logotipo Personalizado",custom_logo_hint:"URL para imagem do logotipo",ad_space_title:"Título do Espaço Publicitário",ad_space_title_label:"Suportado por",ad_slots:"Espaços Publicitários",ad_slots_hint:"Adicionar URL e caminhos de arquivo de imagem no formato CSV, extensões podem optar por respeitar",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Anúncios Ativados",ads_disabled:"Anúncios Desativados",user_management:"Gestão de Usuários",admin_users:"Usuários Administrativos",admin_users_hint:"Usuários com privilégios de administrador",admin_users_label:"ID do Usuário",allowed_users:"Usuários Permitidos",allowed_users_hint:"Somente estes usuários podem usar LNbits",allowed_users_label:"ID do usuário",allow_creation_user:"Permitir a criação de novos usuários",allow_creation_user_desc:"Permitir a criação de novos usuários na página inicial",components:"Componentes",long_running_endpoints:"Principais 5 Endpoints de Longa Execução",http_request_methods:"Métodos de Requisição HTTP",http_response_codes:"Códigos de Resposta HTTP",request_details:"Detalhes da solicitação",http_request_details:"Detalhes da Solicitação HTTP"},window.localisation.br={confirm:"Sim",server:"Servidor",theme:"Tema",site_customisation:"Customização do Site",funding:"Financiamento",users:"Usuários",audit:"Auditoria",api_watch:"Relógio da API",apps:"Aplicativos",channels:"Canais",transactions:"Transações",dashboard:"Painel de Controle",node:"Nó",export_users:"Exportar Usuários",no_users:"Nenhum usuário encontrado",total_capacity:"Capacidade Total",avg_channel_size:"Tamanho médio do canal",biggest_channel_size:"Maior Tamanho de Canal",smallest_channel_size:"Tamanho Mínimo do Canal",number_of_channels:"Número de Canais",active_channels:"Canais Ativos",connect_peer:"Conectar Par",connect:"Conectar",reconnect:"Reconectar",open_channel:"Canal Aberto",open:"Abrir",clear:"Limpar",close_channel:"Fechar Canal",close:"Fechar",restart:"Reiniciar servidor",image_library:"Biblioteca de Imagens",save:"Salvar",save_tooltip:"Salvar suas alterações",must_save:"Você tem alterações não salvas",credit_debit:"Crédito / Débito",credit_hint:"Pressione Enter para creditar a conta",credit_label:"{denomination} para creditar",credit_ok:"Sucesso ao creditar/debitar fundos virtuais ({amount} sats). Os pagamentos dependem dos fundos reais na fonte de financiamento.",restart_tooltip:"Reinicie o servidor para que as alterações tenham efeito",add_funds_tooltip:"Adicionar fundos a uma carteira.",reset_defaults:"Redefinir para padrões",reset_defaults_tooltip:"Apagar todas as configurações e redefinir para os padrões.",download_backup:"Fazer backup do banco de dados",name_your_wallet:"Nomeie sua carteira {name}",paste_invoice_label:"Cole uma fatura, pedido de pagamento ou código lnurl *",lnbits_description:"Fácil de configurar e leve, o LNbits pode ser executado em qualquer fonte de financiamento da Lightning Network e até mesmo o LNbits em si! Você pode executar o LNbits para si mesmo ou oferecer facilmente uma solução de custódia para outros. Cada carteira tem suas próprias chaves de API e não há limite para o número de carteiras que você pode criar. Ser capaz de particionar fundos torna o LNbits uma ferramenta útil para gerenciamento de dinheiro e como uma ferramenta de desenvolvimento. As extensões adicionam funcionalidades extras ao LNbits para que você possa experimentar uma série de tecnologias de ponta na rede lightning. Nós tornamos o desenvolvimento de extensões o mais fácil possível e, como um projeto gratuito e de código aberto, incentivamos as pessoas a desenvolver e enviar as suas próprias.",export_to_phone:"Exportar para o telefone com código QR",export_to_phone_desc:"Este código QR contém a URL da sua carteira com acesso total. Você pode escaneá-lo do seu telefone para abrir sua carteira a partir dele.",access_wallet_on_mobile:"Acesso Móvel",stored_paylinks:"Links LNURL de pagamento armazenados",wallet:"Carteira:",wallet_name:"Nome da carteira",wallet_type:"Tipo de carteira",shared_wallet:"Carteira Compartilhada",share_wallet:"Compartilhar Carteira",update_permissions:"Atualizar Permissões",shared_wallet_id:"ID da Carteira Compartilhada",shared_wallet_desc:"Você foi convidado(a) para ter acesso à carteira de outra pessoa.",wallets:"Carteiras",exclude_wallets:"Excluir Carteiras",add_wallet:"Adicionar nova carteira",reject_wallet:"Rejeitar carteira",add_new_wallet:"Adicionar uma nova carteira",pin_wallet:"Fixar carteira",delete_wallet:"Excluir carteira",delete_wallet_desc:"Toda a carteira será excluída, os fundos serão IRRECUPERÁVEIS.",rename_wallet:"Renomear carteira",update_name:"Atualizar nome",fiat_tracking:"Rastreamento Fiat",fiat_providers:"Provedores fiat",fiat_warning_bitcoin:'Provedores Fiat podem ficar nervosos com qualquer coisa relacionada ao bitcoin, portanto, evite usar a palavra "bitcoin" nos seus memorandos!',currency:"Moeda",update_currency:"Atualizar moeda",press_to_claim:"Pressione para solicitar bitcoin",claim_desc:"Parece que você tem um valor resgatável de bitcoin, mas ainda não tem uma carteira. Pressione o botão abaixo para reivindicá-lo. Isso criará uma nova carteira para você.",donate:"Doar",view_github:"Ver no GitHub",voidwallet_active:"VoidWallet está ativo! Pagamentos desabilitados",voidwallet_active_user:"Fonte de financiamento indisponível. Por favor, entre em contato com seu administrador para configurar.",voidwallet_active_admin:"Fonte de financiamento indisponível. Clique aqui para configurar.",service_fee_badge:"Taxa de serviço: {amount} % por transação",service_fee_max_badge:"Taxa de serviço: {amount} % por transação (máximo {max} {denom})",service_fee_tooltip:"Taxa de serviço cobrada pelo administrador do servidor LNbits por transação de saída",toggle_darkmode:"Alternar modo escuro",payment_reactions:"Reações de Pagamento",view_swagger_docs:"Ver a documentação da API do LNbits Swagger",api_docs:"Documentação da API",api_keys_api_docs:"URL do Node, chaves da API e documentação da API",lnbits_version:"Versão do LNbits",runs_on:"Executa em",paste:"Colar",paste_from_clipboard:"Cole do clipboard",paste_request:"Colar Pedido",create_invoice:"Criar Fatura",camera_tooltip:"Usar a câmara para escanear uma fatura / QR",export_csv:"Exportar para CSV",export_csv_details:"Exportar para CSV com detalhes",chart_tooltip:"Mostrar gráfico",pending:"Pendente",copy_invoice:"Copiar fatura",withdraw_from:"Sacar de",cancel:"Cancelar",scan:"Escanear",read:"Ler",write:"Escrever",pay:"Pagar",memo:"Memo",date:"Data",path:"Caminho",internal_memo:"Memorando interno (opcional)",internal_memo_hint_receive:"Este memorando não é mostrado ao pagador, mas é armazenado na fatura para sua referência.",internal_memo_hint_pay:"Este memorando não é exibido ao beneficiário, mas é armazenado no pagamento para sua referência.",payment_processing:"Processando pagamento...",payment_successful:"Pagamento bem-sucedido!",payment_pending:"Pagamento pendente...",payment_check:"Cheque pagamento",not_enough_funds:"Fundos insuficientes!",search_by_tag_memo_amount:"Pesquisar por tag, memo, quantidade",search:"Buscar",invoice_waiting:"Fatura aguardando pagamento",payment_received:"Pagamento Recebido",payment_sent:"Pagamento Enviado",payment_failed:"Pagamento Falhou",receive:"receber",send:"enviar",outgoing_payment_pending:"Pagamento pendente de saída",drain_funds:"Drenar Fundos",drain_funds_desc:"Este é um código QR de retirada do LNURL para sugar tudo desta carteira. Não compartilhe com ninguém. É compatível com balanceCheck e balanceNotify para que sua carteira possa continuar retirando os fundos continuamente daqui após a primeira retirada.",i_understand:"Eu entendo",copy_wallet_url:"Copiar URL da carteira",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"Funcionalidade de login a ser lançada em uma atualização futura, por enquanto, certifique-se de marcar esta página para acesso futuro à sua carteira! Este serviço está em BETA, e não nos responsabilizamos por pessoas que perderem o acesso aos fundos.",no_transactions:"Ainda não foram feitas transações",manage:"Gerenciar",exchanges:"Bolsas de valores",extensions:"Extensões",no_extensions:"Você não possui nenhuma extensão instalada :(",created:"Criado",created_at:"Criado em",updated_at:"Atualizado em",search_extensions:"Extensões de pesquisa",search_wallets:"Pesquisar carteiras",extension_sources:"Fontes de Extensão",ext_sources_hint:"Repositórios de onde as extensões podem ser baixadas",ext_sources_label:"URL de origem (use apenas a fonte oficial da extensão LNbits e fontes confiáveis)",warning:"Aviso",repository:"Repositório",confirm_continue:"Você tem certeza de que deseja continuar?",manage_extension_details:"Instalar/desinstalar extensão",upload:"Enviar",install:"Instalar",uninstall:"Desinstalar",drop_db:"Remover Dados",enable:"Ativar",enabled:"Habilitado",disabled:"Desativado",pay_to_enable:"Pague para Habilitar",enable_extension_details:"Ativar extensão para o usuário atual",disable:"Desativar",delete:"Excluir",installed:"Instalado",activated:"Ativado",deactivated:"Desativado",activate:"Ativar",deactivate:"Desativar",release_notes:"Notas de Lançamento",activate_extension_details:"Tornar a extensão disponível/indisponível para usuários",featured:"Destacado",all:"Tudo",only_admins_can_install:"Apenas contas de administrador podem instalar extensões.",only_admins_can_create_extensions:"Apenas contas de administrador podem criar extensões",admin_only:"Apenas para Administração",make_user_admin:"Tornar usuário administrador",revoke_admin:"Revogar Admin",new_version:"Nova Versão",reviews_url:"URL de Avaliações",reviews_url_label:"URL do servidor de avaliações",reviews_url_hint:"URL completa do PaidReviews incluindo o id das configurações (por exemplo, https://example.com/paidreviews/SETTINGS_ID)",reviews_open:"Ver avaliações",reviews_leave:"Deixe uma avaliação",reviews_name:"Seu nome",reviews_comment:"Sua avaliação",reviews_rating:"Avaliação",reviews_submit:"Enviar avaliação",reviews_loading:"Carregando avaliações...",reviews_refresh:"Atualizar avaliações",reviews_error_load:"Não foi possível carregar as avaliações",reviews_url_not_configured:"URL de avaliações não configurada",reviews_pay_invoice:"Pagar fatura",reviews_invoice_paid:"Fatura paga",reviews_invoice_title:"Pague esta fatura para enviar sua avaliação",reviews_count:"Avaliações",no_reviews:"Ainda não há avaliações",extension_has_free_release:"Tem lançamentos gratuitos",extension_has_paid_release:"Tem lançamentos pagos",extension_depends_on:"Depende de:",extension_rating_soon:"Avaliações estarão disponíveis em breve",extension_installed_version:"Versão instalada",extension_uninstall_warning:"Você está prestes a remover a extensão para todos os usuários.",uninstall_confirm:"Sim, Desinstalar",extension_db_drop_info:"Todos os dados da extensão serão permanentemente excluídos. Não há como desfazer essa operação!",extension_db_drop_warning:"Você está prestes a remover todos os dados para a extensão. Por favor, digite o nome da extensão para continuar:",extension_required_lnbits_version:"Esta versão requer no mínimo a versão do LNbits",min_version:"Mínimo (incluído)",max_version:"Máximo (excluído)",preimage:"Pré-imagem",preimage_hint:"Pré-imagem para liquidar a fatura de retenção",hold_invoice:"Reter Fatura",hold_invoice_description:"Esta fatura está em espera e requer uma pré-imagem para ser liquidada.",payment_hash:"Hash de pagamento",invoice_cancelled:"Fatura Cancelada",invoice_settled:"Fatura Liquidada",hold_invoice_payment_hash:"Hash de pagamento para fatura em espera (opcional)",settle_invoice:"Liquidar Fatura",cancel_invoice:"Cancelar Fatura",fee:"Taxa",amount:"Quantidade",amount_limits:"Limites de Quantia",amount_sats:"Quantidade (sats)",faucest_wallet:"Carteira de Torneira",faucest_wallet_desc_1:"Toda vez que um pagamento for confirmado pelo provedor {provider}, os fundos serão subtraídos desta carteira.",faucest_wallet_desc_2:"Isso ajuda a monitorar todos os pagamentos do {provider} e seu status.",faucest_wallet_desc_3:"Esta carteira deve ser recarregada com a quantia de sats que o administrador está disposto a oferecer em troca da moeda fiduciária.",faucest_wallet_desc_4:"Se esta carteira estiver configurada, mas estiver vazia, os pagamentos de {provider} não serão processados.",faucest_wallet_desc_5:"Esta carteira pode eventualmente ficar com saldo negativo se pagamentos fiduciários paralelos forem feitos.",faucest_wallet_id:"ID da Carteira de Torneira (opcional)",faucest_wallet_id_hint:"ID da carteira a ser usado para a torneira. Será usado para enviar os fundos ao usuário.",tag:"Etiqueta",unit:"Unidade",description:"Descrição",expiry:"Validade",webhook:"Webhook",webhook_url:"URL do Webhook",webhook_url_hint:"URL de Webhook para enviar os detalhes do pagamento. Será chamada quando o pagamento for concluído.",copy_webhook_url:"Copiar URL do webhook",webhook_events_list:"Os seguintes eventos devem ser suportados pelo webhook:",webhook_stripe_description:"No lado do Stripe, você deve configurar um webhook com um URL que aponta para o seu servidor LNbits.",payment_proof:"Comprovante de pagamento",update:"Atualizar",update_available:"Atualização {version} disponível!",funding_sources:"Fontes de Financiamento",latest_update:"Você está na versão mais recente {version}.",notifications:"Notificações",notifications_configure:"Configurar Notificações",notifications_nostr_config:"Configuração do Nostr",notifications_enable_nostr:"Ativar Nostr",notifications_enable_nostr_desc:"Enviar notificações pelo Nostr",notifications_nostr_private_key:"Chave Privada Nostr",notifications_nostr_private_key_desc:"Chave privada (hex ou nsec) para assinar as mensagens enviadas para Nostr",notifications_nostr_identifier:"Identificador Nostr",notifications_nostr_identifier_desc:"Identificador Nip5 para enviar notificações para",notifications_nostr_identifiers:"Identificadores Nostr",notifications_nostr_identifiers_desc:"Lista de identificadores para enviar notificações.",notifications_telegram_config:"Configuração do Telegram",notifications_enable_telegram:"Ativar Telegram",notifications_enable_telegram_desc:"Enviar notificações pelo Telegram",notifications_telegram_access_token:"Token de Acesso",notifications_telegram_access_token_desc:"Token de acesso para o bot",notifications_chat_id:"ID de bate-papo do Telegram",notifications_chat_id_desc:"ID do chat do Telegram para enviar as notificações para",notifications_excluded_wallets_desc:"Não envie notificações para essas carteiras",notifications_email_config:"Configuração de Email",notifications_enable_email:"Habilitar Email",notifications_enable_email_desc:"Enviar notificações por e-mail",notifications_send_test_email:"Enviar e-mail de teste",notifications_send_email:"Enviar e-mail",notifications_send_email_desc:"Email que você enviará de",notifications_send_email_username:"Nome de usuário",notifications_send_email_username_desc:"Nome de usuário, usará o e-mail se não estiver definido",notifications_send_email_password:"Enviar senha de e-mail",notifications_send_email_password_desc:"Senha para o e-mail que você enviará de",notifications_send_email_server_port:"Enviar e-mail porta SMTP",notifications_send_email_server_port_desc:"Porta para o servidor SMTP",notifications_send_email_server:"Enviar e-mail servidor SMTP",notifications_send_email_server_desc:"Servidor SMTP para o e-mail de que você enviará",notifications_send_to_emails:"Emails para enviar para",notifications_send_to_emails_desc:"Notificações de e-mails serão enviadas para",notification_settings_update:"Configurações atualizadas",notification_settings_update_desc:"Notificar quando as configurações do servidor forem atualizadas",notification_server_start_stop:"Iniciar/Parar Servidor",notification_server_start_stop_desc:"Notificar quando o servidor tiver sido iniciado/parado",notification_watchdog_limit:"Notificação de Limite do Watchdog",notification_watchdog_limit_desc:"Notifique quando o limite do watchdog for alcançado (não afeta a fonte de financiamento)",notification_server_status:"Status do Servidor",notification_server_status_desc:"Enviar notificações regulares sobre o status do servidor (valor do intervalo em horas)",notification_incoming_payment:"Pagamentos Recebidos",notification_incoming_payment_desc:"Notificar quando uma carteira tiver recebido um pagamento acima do valor especificado (sats)",notification_outgoing_payment:"Pagamentos Saída",notification_outgoing_payment_desc:"Notificar quando uma carteira tiver enviado um pagamento acima do valor especificado (sats)",notification_credit_debit:"Crédito / Débito",notification_credit_debit_desc:"Notificar quando uma carteira tiver sido creditada/debitada pelo superusuário",notification_balance_delta_changed:"Mudança no Delta de Saldo",notification_balance_delta_changed_desc:"Notifique quando a diferença entre o saldo do nó e o saldo do LNbits tiver mudado mais do que a quantidade especificada (em sats). Defina como 0 para desativar. Isso é executado a cada minuto.",enable_watchdog:"Ativar Watchdog",enable_watchdog_desc:"Se ativado, ele mudará automaticamente sua fonte de financiamento para VoidWallet se o seu saldo for inferior ao saldo do LNbits. Você precisará ativar manualmente após uma atualização.",watchdog_interval:"Intervalo do Watchdog",watchdog_interval_desc:"Com que frequência a tarefa de fundo deve verificar um sinal de interrupção no delta do monitor [node_balance - lnbits_balance] (em minutos).",watchdog_delta:"Observador Delta",watchdog_delta_desc:"Limite antes da mudança do mecanismo de segurança alterar a fonte de financiamento para VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fonte de Notificação",notification_source_label:"URL de origem (use apenas a fonte de status oficial do LNbits e fontes de confiança)",more:"mais",more_count:"Mais {count}",less:"menos",releases:"Lançamentos",watchdog:"Cão de guarda",server_logs:"Registros do Servidor",ip_blocker:"Bloqueador de IP",security:"Segurança",security_tools:"Ferramentas de segurança",block_access_hint:"Bloquear acesso por IP",allow_access_hint:"Permitir acesso por IP (substituirá os IPs bloqueados)",enter_ip:"Digite o IP e pressione enter",rate_limiter:"Limitador de Taxa",callback_url_rules:"Regras de URL de Retorno",enter_callback_url_rule:"Digite a regra de URL como regex e pressione enter",callback_url_rule_hint:"URLs de retorno de chamada (como a de LNURL) serão validados conforme estas regras. Pelo menos uma regra deve corresponder. Nenhuma regra significa que todas as URLs são permitidas.",wallet_limiter:"Limitador de Carteira",wallet_config:"Configuração da Carteira",wallet_charts:"Gráficos da Carteira",wallet_limit_max_withdraw_per_day:"Retirada máxima diária da carteira em sats (0 para desativar)",wallet_max_ballance:"Saldo máximo da carteira em sats (0 para desativar)",wallet_limit_secs_between_trans:"Minutos e segundos entre transações por carteira (0 para desativar)",only_incoming_payments_allowed:"Apenas pagamentos recebidos são permitidos",disable_outgoing_payments:"Desativar pagamentos de saída",number_of_requests:"Número de solicitações",time_unit:"Unidade de tempo",minute:"minuto",settings:"Configurações",second:"segundo",hour:"hora",disable_server_log:"Desativar Log do Servidor",enable_server_log:"Ativar Registro do Servidor",coming_soon:"Funcionalidade em breve",session_has_expired:"Sua sessão expirou. Por favor, faça login novamente.",instant_access_question:"Quer acesso imediato?",login_with_user_id:"Faça login com ID do usuário",or:"ou",create_new_wallet:"Criar Nova Carteira",delete_all_wallets:"Excluir Todas as Carteiras",confirm_delete_all_wallets:"Tem certeza de que deseja excluir TODAS as carteiras deste usuário?",login_to_account:"Faça login na sua conta",create_account:"Criar conta",account_settings:"Configurações da Conta",signin_with_oauth:"Entrar com",signin_with_oauth_or:"ou entre com",signin_with_nostr:"Continuar com Nostr",signin_with_google:"Entrar com o Google",signin_with_github:"Entrar com GitHub",signin_with_custom_org:"Entrar com {custom_org}",username_or_email:"Nome de usuário ou E-mail",password:"Senha",password_config:"Configuração de Senha",password_repeat:"Repetição de senha",update_password:"Atualizar Senha",change_password:"Alterar Senha",update_credentials:"Atualizar credenciais",update_pubkey:"Atualizar Chave Pública",nostr_pubkey_tooltip:"Insira a chave pública Nostr deste usuário (valor hexadecimal)",set_password:"Definir Senha",set_password_tooltip:"Defina uma senha para este usuário",invalid_password:"A senha deve ter pelo menos 8 caracteres",invalid_password_repeat:"As senhas não coincidem",reset_key_generated:"Uma chave de reinicialização foi gerada.",reset_key_copy:"Clique em OK para copiar o URL de redefinição para sua área de transferência.",login:"Entrar",register:"Registrar",username:"Nome de usuário",pubkey:"Chave Pública",user_id:"ID do Usuário",id:"ID",email:"E-mail",first_name:"Primeiro Nome",last_name:"Sobrenome",picture:"Foto",user_picture_desc:"URL para uma imagem a ser usada como foto de perfil. Você pode carregá-la como um ativo.",verify_email:"Verifique o e-mail com",account:"Conta",update_account:"Atualizar Conta",invalid_username:"Nome de usuário inválido",auth_provider:"Provedor de Autenticação",external_id:"ID Externo",my_account:"Minha Conta",existing_account_question:"Já tem uma conta?",background_image:"Imagem de Fundo",back:"Voltar",logout:"Sair",look_and_feel:"Aparência",endpoint:"Ponto de extremidade",api:"API",api_stripe:"API",api_token:"Token de API",api_tokens:"Tokens da API",access_control_list:"Lista de Controle de Acesso",access_control_list_admin_warning:"Esta é uma conta de administrador. Os tokens gerados terão privilégios de administrador.",new_api_acl:"Nova Lista de Controle de Acesso",api_token_id:"Id do Token",toggle_gradient:"Alternar Gradiente",gradient_background:"Fundo em Degradê",rounded_ui:"Cartões e Botões Arredondados",toggle_rounded_ui:"Alternar cantos arredondados para cartões e botões",card_gradient:"Gradiente do Cartão",toggle_card_gradient:"Alternar gradiente nos cartões",card_shadow:"Sombra do Cartão",toggle_card_shadow:"Alternar sombra nas cartas",language:"Idioma",assets:"Ativos",max_asset_size_mb:"Tamanho Máximo do Ativo (MB)",max_asset_size_mb_desc:"O tamanho máximo permitido para uploads de ativos em megabytes (pode usar valores decimais).",assets_allowed_mime_types:"Tipos MIME permitidos",assets_allowed_mime_types_desc:"Os tipos MIME permitidos para uploads de ativos. Nenhum valor significa que todos os uploads são permitidos.",thumbnail_width:"Largura da Miniatura",thumbnail_width_desc:"Largura da miniatura gerada em pixels.",thumbnail_height:"Altura da miniatura",thumbnail_height_desc:"Altura da miniatura gerada em pixels.",thumbnail_format:"Formato da Miniatura",thumbnail_format_desc:"Formato de imagem da miniatura gerada (PNG, JPEG, etc.).",max_assets_per_user:"Máximo de ativos por usuário",max_assets_per_user_desc:"O número máximo de ativos que um usuário pode fazer upload. Zero significa que o upload está proibido.",assets_no_limit_users:"Usuários sem Limites de Ativos",assets_no_limit_users_desc:"Esses usuários podem enviar um número ilimitado de ativos (com base no ID do usuário).",color_scheme:"Esquema de Cores",visible_wallet_count:"Contagem de Carteiras Visíveis",admin_settings:"Configurações do Administrador",extension_cost:"Este lançamento requer um pagamento mínimo de {cost} sats.",extension_paid_sats:"Você já pagou {paid_sats} sats.",create_extension:"Criar Extensão",release_details_error:"Não é possível obter os detalhes da versão.",pay_from_wallet:"Pagar com a Carteira",pay_with:"Pague com {provider}",select_payment_provider:"Selecione o provedor de pagamento",wallet_required:"Carteira *",show_qr:"Exibir QR",retry_install:"Repetir Instalação",new_payment:"Efetuar Novo Pagamento",update_payment:"Atualizar Pagamento",already_paid_question:"Você já pagou?",sell:"Vender",sell_require:"Peça pagamento para habilitar a extensão",sell_info:"A extensão {name} requer um pagamento mínimo de {amount} sats para habilitar.",hide_empty_wallets:"Ocultar carteiras vazias",recheck:"Verificar novamente",check:"Verificar",check_connection:"Verificar Conexão",check_webhook:"Verificar Webhook",contributors:"Contribuidores",license:"Licença",reset_key:"Redefinir Chave",reset_password:"Redefinir senha",border_choices:"Opções de Borda",select_all:"Selecionar tudo",nfc_supported:"Compatível com NFC",nfc_not_supported:"NFC não suportado",expire_date:"Data de Expiração:",hash:"Hash:",welcome_lnbits:"Bem-vindo ao LNbits",setup_su_account:"Configure a conta Superuser abaixo.",first_install_token:"Primeiro Token de Instalação",create_ticker_converter:"Criar Conversor de Ticker de Moeda",enable_audit:"Habilitar Auditoria",recommended:"Recomendado",audit_desc:"Gravar solicitações HTTP de acordo com os filtros especificados",audit_record_req:"Gravar Corpo da Requisição",audit_record_warning:"Aviso:",audit_record_req_warning_1:"dados confidenciais (como senhas) serão registrados.",audit_record_req_warning_2:"o corpo da solicitação pode ter um tamanho grande.",audit_record_use:"Use com cuidado.",audit_ip:"Registrar endereço IP",audit_ip_desc:"Registre o endereço IP do cliente",audit_path_params:"Registrar Parâmetros de Caminho",audit_query_params:"Registrar Parâmetros de Consulta",audit_http_methods:"Incluir métodos HTTP",audit_http_methods_hint:"Lista de métodos HTTP a serem incluídos. Listas vazias significam todos.",audit_http_methods_label:"Métodos HTTP",audit_resp_codes:"Incluir Códigos de Resposta HTTP",audit_resp_codes_hint:"Lista de códigos HTTP a serem incluídos (correspondência regex). Listas vazias significam todos. Ex: 4.*, 5.*",audit_resp_codes_label:"Código de resposta HTTP (regex)",audit_paths:"Incluir Caminhos",audit_paths_hint:"Lista de caminhos a serem incluídos (correspondência de regex). Lista vazia significa todos.",audit_paths_label:"Caminho HTTP (regex)",audit_paths_exclude:"Excluir Caminhos",audit_paths_exclude_hint:"Lista de caminhos a serem excluídos (correspondência regex). Lista vazia significa nenhum.",audit_paths_exclude_label:"Caminho HTTP (regex)",exchange_providers:"Provedores de Câmbio",admin_extensions:"Extensões de Administração",admin_extensions_label:"Extensões de administração",admin_extensions_hint:"Somente usuários com privilégios de administrador podem usar extensões.",user_default_extensions:"Extensões Padrão do Usuário",user_default_extensions_label:"Extensões do usuário",user_default_extensions_hint:"Extensões que serão ativadas por padrão para os usuários.",extension_builder:"Construtor de Extensão",extension_builder_manifest_url:"URL do Manifesto do Criador de Extensões",extension_builder_manifest_url_hint:"URL para um arquivo JSON manifest com detalhes do extension builder",miscellanous:"Diversos",misc_disable_extensions:"Desativar extensões",misc_disable_extensions_label:"Desativar todas as extensões",misc_disable_extensions_builder:"Habilitar Extensions Builder",misc_disable_extensions_builder_label:"Habilitar Extensions Builder para usuários não administradores.",misc_hide_api:"Ocultar API",misc_hide_api_label:"Oculta a API de carteira, extensões podem optar por honrar",wallets_management:"Gerenciamento de Carteiras",funding_source_info:"Informações da Fonte de Financiamento",funding_source:"Fonte de Financiamento: {wallet_class}",node_balance:"Saldo do Nó: {balance} sats",lnbits_balance:"Saldo do LNbits: {balance} sats",funding_reserve_percent:"Reserve Percentual: {percent} %",node_management:"Gerenciamento de Nós",node_management_not_supported:"Gerenciamento de nó não suportado pela fonte de financiamento ativa",toggle_node_ui:"Interface do Nó",toggle_public_node_ui:"Interface Pública do Nó",toggle_transactions_node_ui:"Guia de Transações (Desativar em nós grandes CLN)",invoice_expiry:"Expiração da Fatura",invoice_expiry_label:"Validade da fatura",routing_fee_reserve_calculations:"Cálculos de Reserva de Taxa de Roteamento",routing_fee_reserve_calculations_desc:'LNbits reserva um "valor de reserva" para cada pagamento para cobrir as taxas de roteamento. A taxa de roteamento máxima passada para a fonte de financiamento é a que for maior: a reserva mínima de taxa de roteamento ou a percentagem de reserva de taxa de roteamento.',millisats:"milissats",fee_reserve:"Reserva Mínima de Taxa de Encaminhamento",fee_reserve_percent:"Porcentagem da Reserva de Taxa de Roteamento",fee_reserve_min_hint:"A taxa mínima reservada por pagamento.
Isso atua como um piso - a taxa de roteamento máxima nunca será inferior a este valor, independentemente do tamanho do pagamento.",fee_reserve_percent_hint:"A porcentagem do valor do pagamento a reservar para taxas de roteamento.",payment_timeouts:"Tempos de Espera de Pagamento",payment_wait_time:"Tempo de Espera do Pagamento",seconds:"segundos",payment_wait_time_desc:"Tempo de espera antes de marcar um pagamento de saída como pendente. Padrão: 5s; aumentar para faturas de liquidação lenta.",payment_wait_time_tooltip:"Controla quanto tempo o LNbits espera para uma tentativa de pagamento de saída ser confirmada antes de marcá-la como pendente. Valores mais altos ajudam ao pagar faturas de liquidação lenta (por exemplo, faturas HODL, Boltz). O pagamento será verificado novamente mais tarde e atualizado automaticamente ou manualmente.",server_management:"Gerenciamento de Servidor",base_url:"URL base",base_url_label:"URL estática/base para o servidor",authentication:"Autenticação",auth_token_expiry_label:"Minutos para expiração do token",auth_token_expiry_hint:"Tempo em minutos até o token expirar",auth_authentication_cache_label:"Tempo de cache (minutos)",auth_authentication_cache_hint:"Tempo em minutos para armazenar em cache a autenticação bem-sucedida (0 para desativar)",auth_allowed_methods_label:"Métodos de autorização permitidos",auth_allowed_methods_hint:"Selecione métodos de autorização",auth_nostr_label:"URL de Solicitação Nostr",auth_nostr_hint:"URL absoluta que os clientes usarão para fazer login.",auth_google_ci_label:"ID do Cliente do Google",auth_google_ci_hint:"Certifique-se de que os URIs de redirecionamento autorizados contenham https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Segredo do Cliente do Google",auth_gh_client_id_label:"ID do Cliente do GitHub",auth_gh_client_id_hint:"Certifique-se de que a URL de callback de autorização esteja definida como https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"Segredo do Cliente do GitHub",auth_keycloak_label:"URL de Descoberta do Keycloak",auth_keycloak_ci_label:"ID do Cliente Keycloak",auth_keycloak_ci_hint:"Certifique-se de que a URL de retorno de chamada de autorização esteja definida para https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Segredo do Cliente Keycloak",auth_keycloak_custom_org_label:"Organização Personalizada do Keycloak",auth_keycloak_custom_icon_label:"Ícone Personalizado do Keycloak (URL)",auth_oidc_label:"URL de Descoberta do OIDC",auth_oidc_ci_label:"ID do Cliente OIDC",auth_oidc_ci_hint:"Certifique-se de que a URL de retorno de chamada de autorização esteja definida para https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Segredo do Cliente OIDC",auth_oidc_custom_org_label:"Nome da Organização Personalizada OIDC (ex. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Ícone Personalizado do OIDC (URL)",auth_keycloak_custom_org_label:"Keycloak Custom Organization",auth_keycloak_custom_icon_label:"Ícone Personalizado do Keycloak (URL)",currency_settings:"Configurações de Moeda",allowed_currencies:"Moedas Permitidas",allowed_currencies_hint:"Limite o número de moedas fiduciárias disponíveis",default_account_currency:"Moeda Padrão da Conta",default_account_currency_hint:"Moeda padrão para contabilidade",min_incoming_payment_amount:"Quantia Mínima de Pagamento de Entrada",min_incoming_payment_amount_desc:"Quantidade mínima permitida para gerar uma fatura",max_incoming_payment_amount:"Valor Máximo do Pagamento Recebido",max_incoming_payment_amount_desc:"Quantidade máxima permitida para gerar uma fatura",max_outgoing_payment_amount:"Valor Máximo de Pagamento de Saída",max_outgoing_payment_amount_desc:"Valor máximo permitido para efetuar um pagamento",service_fee:"Taxa de serviço: {amount} % por transação",service_fee_label:"Taxa de serviço (%)",service_fee_hint:"Taxa cobrada por tx (%)",service_fee_max:"Taxa de serviço: {amount} % por transação (máx {max} sats)",service_fee_max_label:"Taxa de serviço máx (sats)",service_fee_max_hint:"Taxa máxima de serviço a cobrar em (sats)",fee_wallet:"Carteira de Taxas",fee_wallet_label:"Carteira de tarifas (ID da carteira)",fee_wallet_hint:"ID da carteira para enviar fundos para",disable_fee:"Desativar Taxa",disable_fee_internal:"Desativar taxa de serviço para pagamentos internos",disable_fee_internal_desc:"Desativar Taxa de Serviço para Pagamentos Internos Lightning",ui_management:"Gerenciamento de UI",ui_site_title:"Título do Site",ui_changing_remove_lnbits_elements:"(alterar removerá os elementos LNbits na página inicial e rodapé)",ui_site_tagline:"Tagline do site",ui_elements_enable:"Habilitar elementos na página inicial",ui_elements_disable:"Desativar elementos na página inicial",ui_toggle_elements_tip:"Remover elementos da página inicial, como 'funciona com', etc.",ui_site_description:"Descrição do Site",ui_site_description_hint:"Use texto simples, Markdown ou HTML bruto",ui_default_wallet_name:"Nome Padrão da Carteira",ui_default_theme:"Tema Padrão",wallet_featured_button_label:"Carteira Rótulo do Botão em Destaque",wallet_featured_button_label_hint:"Mostrar botão em destaque na página inicial da carteira",wallet_featured_button_url:"URL do Botão em Destaque",wallet_featured_button_url_hint:"Ao clicar, o botão abrirá este URL. Deixe em branco para ocultar o botão.",wallet_featured_button_icon:"Ícone do Botão em Destaque",wallet_featured_button_icon_hint:"Ícone mostrado no botão de destaque (verifique os ícones quasar)",lnbits_wallet:"Carteira LNbits",denomination:"Denominação",denomination_hint:"O nome para o token FakeWallet",denomination_error:"A denominação deve ter 3 caracteres ou `sats`.",ui_qr_code_logo:"Logo do QR Code",ui_qr_code_logo_hint:"URL para imagem de logo no código QR",ui_apple_touch_icon:"Ícone de Toque da Apple",ui_apple_touch_icon_hint:"URL do ícone de toque da Apple",ui_custom_image:"Imagem Personalizada",ui_custom_image_label:"URL para imagem personalizada",ui_custom_image_hint:"Imagem exibida na página inicial/login",ui_custom_badge:"Distintivo Personalizado",ui_custom_badge_label:"Distintivo Personalizado 'USE COM CUIDADO - a carteira LNbits ainda está em BETA'",ui_custom_badge_color_label:"Cor Personalizada do Distintivo",themes:"Temas",themes_hint:"Escolha temas disponíveis para usuários",custom_logo:"Logotipo personalizado",custom_logo_hint:"URL para a imagem do logotipo",ad_space_title:"Título do Espaço Publicitário",ad_space_title_label:"Suportado por",ad_slots:"Slots de Anúncio",ad_slots_hint:"Adicionar URL e caminhos de arquivo de imagem no formato CSV, as extensões podem optar por honrar",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Anúncios Ativados",ads_disabled:"Anúncios Desativados",user_management:"Gerenciamento de Usuários",admin_users:"Usuários Administradores",admin_users_hint:"Usuários com privilégios de administrador",admin_users_label:"ID do Usuário",allowed_users:"Usuários Permitidos",allowed_users_hint:"Somente esses usuários podem usar o LNbits",allowed_users_hint_feature:"Somente estes usuários podem usar {feature}",allowed_users_label:"ID do Usuário",allow_creation_user:"Permitir a criação de novos usuários",allow_creation_user_desc:"Permitir a criação de novos usuários na página de índice",require_user_activation:"Requer ativação do usuário",require_user_activation_desc:"Novos usuários serão ativados somente após passarem por um dos métodos de confirmação. Administradores podem ativar usuários manualmente a partir do painel de administração.",reusable_activation_code:"Código de ativação reutilizável",reusable_activation_code_label:"Código de ativação reutilizável",reusable_activation_code_hint:"Este código de ativação pode ser usado várias vezes por diferentes usuários.",one_time_activation_code:"Códigos de ativação única",one_time_activation_code_label:"Adicionar código de ativação",one_time_activation_code_hint:"Lista de códigos de ativação únicos. Cada código pode ser usado apenas uma vez, depois será removido da lista.",invitation_code:"Código de Convite",invitation_code_hint:"O código de convite que você recebeu.",email_confirmation_hint:"Endereço de e-mail para enviar o código de confirmação.",nostr_identifier:"Identificador Nostr",nostr_identifier_hint:"Identificador nostr nip5 ou para enviar o código de confirmação.",new_user_not_allowed:"O registro está desativado.",start_user_impersonation:"Personificar este usuário",stop_user_impersonation:"Parar a Personificação do Usuário",components:"Componentes",long_running_endpoints:"Top 5 Endpoints de Longa Execução",http_request_methods:"Métodos de Requisição HTTP",http_response_codes:"Códigos de Resposta HTTP",request_details:"Detalhes do Pedido",http_request_details:"Detalhes da Requisição HTTP",payment_details:"Detalhes do Pagamento",payment_details_desc:"Informações detalhadas sobre o pagamento",payments:"Pagamentos",payment_show_internal:"Mostrar Pagamentos Internos",payment_chart_flow:"Fluxo de Pagamento Mensal",payment_chart_status:"Status do Pagamento",payment_chart_tx_per_wallet:"Transações por Carteira (saldo/contagem)",payment_details_back:"Voltar para Pagamentos",payment_chart_tags:"Pagamentos por Tags",payments_balance_in_out:"Entradas/Saídas de Saldo",payments_count_in_out:"Contar Entrada/Saída",payments_status_chart:"Gráfico de Status",payments_tag_chart:"Gráfico de Marcadores",payments_balance_chart:"Gráfico de Saldo",payments_wallets_chart:"Gráfico de Carteiras",payments_balance_in_out_chart:"Gráfico de Entrada/Saída de Saldo",payments_count_in_out_chart:"Gráfico de Entrada/Saída",reset_wallet_keys:"Redefinir Chaves",reset_wallet_keys_desc:"Redefina as chaves de API para esta carteira. Isso invalidará as chaves atuais e gerará novas.",view_list:"Visualizar carteiras como lista",view_column:"Visualizar carteiras como linhas",filter_payments:"Filtrar pagamentos",filter_labels:"Rótulos de filtro",filter_date:"Filtrar por data",websocket_example:"Exemplo de Websocket",client_id:"ID do Cliente",secret_key:"Chave Secreta",signing_secret:"Segredo de Assinatura",signing_secret_hint:"Segredo de assinatura para o webhook. As mensagens serão assinadas com este segredo.",webhook_id:"ID do Webhook",webhook_id_hint:"ID do webhook do PayPal usado para verificar eventos recebidos.",webhook_paypal_description:"No lado do PayPal, configure um webhook apontando para o seu servidor LNbits.",callback_success_url:"URL de Sucesso de Callback",callback_success_url_hint:"O usuário será redirecionado para este URL após o pagamento ser bem-sucedido.",connected:"Conectado",not_connected:"Não Conectado",free:"Grátis",paid:"Pago",funding_source_retries:"Máximo de tentativas",funding_source_retries_desc:"Número máximo de tentativas para fontes de financiamento, antes de voltar para VoidWallet.",add_label:"Adicionar Rótulo",label:"Etiqueta",labels:"Rótulos",label_filter:"Filtro de Rótulo",no_labels_defined:"Ainda não há rótulos definidos",manage_labels:"Gerenciar Etiquetas",update_label:"Atualizar Rótulo",delete_label:"Excluir Rótulo",add_remove_labels:"Adicionar ou Remover Rótulos",payment_labels_updated:"Rótulos de pagamento atualizados",color:"Cor",sort:"Ordenar",sort_by:"Ordenar por"},window.localisation.cs={confirm:"Ano",server:"Server",theme:"Téma",site_customisation:"Přizpůsobení stránek",funding:"Financování",users:"Uživatelé",audit:"Audit",apps:"Aplikace",channels:"Kanály",transactions:"Transakce",dashboard:"Přehled",node:"Uzel",export_users:"Exportovat uživatele",no_users:"Nebyli nalezeni žádní uživatelé",total_capacity:"Celková kapacita",avg_channel_size:"Průmerná velikost kanálu",biggest_channel_size:"Největší velikost kanálu",smallest_channel_size:"Nejmenší velikost kanálu",number_of_channels:"Počet kanálů",active_channels:"Aktivní kanály",connect_peer:"Připojit peer",connect:"Připojit",open_channel:"Otevřít kanál",open:"Otevřít",close_channel:"Zavřít kanál",close:"Zavřít",restart:"Restartovat server",save:"Uložit",save_tooltip:"Uložit změny",credit_debit:"Kreditní / Debetní",credit_hint:"Stiskněte Enter pro připsání na účet",credit_label:"{denomination} k připsání",credit_ok:"Úspěšné připsání/odepsání virtuálních prostředků ({amount} satů). Platby závisí na skutečných prostředcích z financujícího zdroje.",restart_tooltip:"Restartujte server pro aplikaci změn",add_funds_tooltip:"Přidat prostředky do peněženky.",reset_defaults:"Obnovit výchozí",reset_defaults_tooltip:"Smazat všechna nastavení a obnovit výchozí.",download_backup:"Stáhnout zálohu databáze",name_your_wallet:"Pojmenujte svou {name} peněženku",paste_invoice_label:"Vložte fakturu, platební požadavek nebo lnurl kód *",lnbits_description:"Snadno nastavitelný a lehkotonážní, LNbits může běžet na jakémkoliv zdroji financování Lightning Network a dokonce LNbits samotné! LNbits můžete provozovat pro sebe, nebo snadno nabízet správu peněženek pro ostatní. Každá peněženka má své vlastní API klíče a není omezen počet peněženek, které můžete vytvořit. Možnost rozdělení prostředků dělá z LNbits užitečný nástroj pro správu peněz a jako vývojový nástroj. Rozšíření přidávají extra funkčnost k LNbits, takže můžete experimentovat s řadou špičkových technologií na lightning network. Vývoj rozšíření jsme učinili co nejjednodušší a jako svobodný a open-source projekt podporujeme lidi ve vývoji a zasílání vlastních rozšíření.",export_to_phone:"Exportovat do telefonu pomocí QR kódu",export_to_phone_desc:"Tento QR kód obsahuje URL vaší peněženky s plným přístupem. Můžete jej naskenovat z telefonu a otevřít peněženku odtamtud.",wallet:"Peněženka:",wallets:"Peněženky",add_wallet:"Přidat novou peněženku",delete_wallet:"Smazat peněženku",delete_wallet_desc:"Celá peněženka bude smazána, prostředky budou NEOBNOVITELNÉ.",rename_wallet:"Přejmenovat peněženku",update_name:"Aktualizovat název",fiat_tracking:"Sledování fiatu",currency:"Měna",update_currency:"Aktualizovat měnu",press_to_claim:"Stiskněte pro nárokování bitcoinu",donate:"Darovat",view_github:"Zobrazit na GitHubu",voidwallet_active:"VoidWallet je aktivní! Platby zakázány",use_with_caution:"POUŽÍVEJTE S OBEZŘETNOSTÍ - {name} peněženka je stále v BETĚ",service_fee:"Servisný poplatek: {amount} % za transakci",service_fee_max:"Servisný poplatek: {amount} % za transakci (max {max} satoshi)",service_fee_tooltip:"Servisní poplatek účtovaný správcem LNbits serveru za odchozí transakci",toggle_darkmode:"Přepnout tmavý režim",payment_reactions:"Reakce na platby",view_swagger_docs:"Zobrazit LNbits Swagger API dokumentaci",api_docs:"API dokumentace",api_keys_api_docs:"Adresa uzlu, API klíče a API dokumentace",lnbits_version:"Verze LNbits",runs_on:"Běží na",paste:"Vložit",paste_from_clipboard:"Vložit ze schránky",paste_request:"Vložit požadavek",create_invoice:"Vytvořit fakturu",camera_tooltip:"Použijte kameru pro skenování faktury/QR",export_csv:"Exportovat do CSV",chart_tooltip:"Zobrazit graf",pending:"Čeká na vyřízení",copy_invoice:"Kopírovat fakturu",withdraw_from:"Vybrat z",cancel:"Zrušit",scan:"Skenovat",read:"Číst",pay:"Platit",memo:"Poznámka",date:"Datum",payment_processing:"Zpracování platby...",not_enough_funds:"Nedostatek prostředků!",search_by_tag_memo_amount:"Hledat podle tagu, poznámky, částky",invoice_waiting:"Faktura čeká na platbu",payment_received:"Platba přijata",payment_sent:"Platba odeslána",receive:"přijmout",send:"odeslat",outgoing_payment_pending:"Odchozí platba čeká na vyřízení",drain_funds:"Vyčerpat prostředky",drain_funds_desc:"Toto je LNURL-withdraw QR kód pro vyčerpání všeho z této peněženky. Nesdílejte s nikým. Je kompatibilní s balanceCheck a balanceNotify, takže vaše peněženka může kontinuálně čerpat prostředky odsud po prvním výběru.",i_understand:"Rozumím",copy_wallet_url:"Kopírovat URL peněženky",disclaimer_dialog_title:"Důležité!",disclaimer_dialog:"Funkcionalita přihlášení bude vydána v budoucí aktualizaci, zatím si ujistěte, že jste si tuto stránku uložili do záložek pro budoucí přístup k vaší peněžence! Tato služba je v BETA verzi a nepřebíráme žádnou zodpovědnost za ztrátu přístupu k prostředkům.",no_transactions:"Zatím žádné transakce",manage:"Spravovat",exchanges:"Burzy",extensions:"Rozšíření",no_extensions:"Nemáte nainstalováno žádné rozšíření :(",created:"Vytvořeno",search_extensions:"Hledat rozšíření",extension_sources:"Zdroje rozšíření",ext_sources_hint:"Úložiště, odkud lze rozšíření stáhnout.",ext_sources_label:"Zdrojová URL (používejte pouze oficiální zdroj rozšíření LNbits a zdroje, kterým můžete důvěřovat)",warning:"Varování",repository:"Repositář",confirm_continue:"Jste si jistí, že chcete pokračovat?",manage_extension_details:"Instalovat/odinstalovat rozšíření",install:"Instalovat",uninstall:"Odinstalovat",drop_db:"Odstranit data",enable:"Povolit",pay_to_enable:"Zaplatit pro aktivaci",enable_extension_details:"Povolit rozšíření pro aktuálního uživatele",disable:"Zakázat",delete:"Smazat",installed:"Nainstalováno",activated:"Aktivováno",deactivated:"Deaktivováno",release_notes:"Poznámky k vydání",activate_extension_details:"Zpřístupnit/zakázat rozšíření pro uživatele",featured:"Doporučené",all:"Vše",only_admins_can_install:"(Pouze administrátorské účty mohou instalovat rozšíření)",admin_only:"Pouze pro adminy",new_version:"Nová verze",extension_depends_on:"Závisí na:",extension_rating_soon:"Hodnocení brzy dostupné",extension_installed_version:"Nainstalovaná verze",extension_uninstall_warning:"Chystáte se odstranit rozšíření pro všechny uživatele.",uninstall_confirm:"Ano, odinstalovat",extension_db_drop_info:"Všechna data pro rozšíření budou trvale odstraněna. Tuto operaci nelze vrátit zpět!",extension_db_drop_warning:"Chystáte se odstranit všechna data pro rozšíření. Prosím, pokračujte zadáním názvu rozšíření:",extension_required_lnbits_version:"Toto vydání vyžaduje alespoň verzi LNbits",min_version:"Minimum (včetně)",max_version:"Maximální (vyloučeno)",payment_hash:"Hash platby",fee:"Poplatek",amount:"Částka",amount_sats:"Částka (sats)",tag:"Tag",unit:"Jednotka",description:"Popis",expiry:"Expirace",webhook:"Webhook",payment_proof:"Důkaz platby",update:"Aktualizovat",update_available:"Dostupná aktualizace {version}!",latest_update:"Máte nejnovější verzi {version}.",notifications:"Notifikace",no_notifications:"Žádné notifikace",notifications_disabled:"Notifikace stavu LNbits jsou zakázány.",enable_notifications:"Povolit notifikace",enable_notifications_desc:"Pokud je povoleno, bude stahovat nejnovější aktualizace stavu LNbits, jako jsou bezpečnostní incidenty a aktualizace.",watchdog_interval:"Interval Watchdog",watchdog_interval_desc:"Jak často by měl úkol na pozadí kontrolovat signál killswitch v watchdog delta [node_balance - lnbits_balance] (v minutách).",watchdog_delta:"Delta Watchdog",watchdog_delta_desc:"Limit předtím, než killswitch změní zdroj financování na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stav",notification_source:"Zdroj notifikací",notification_source_label:"URL zdroje (používejte pouze oficiální zdroj stavu LNbits a zdroje, kterým můžete věřit)",more:"více",less:"méně",releases:"Vydání",watchdog:"Watchdog",server_logs:"Logy serveru",ip_blocker:"Blokování IP",security:"Bezpečnost",security_tools:"Nástroje bezpečnosti",block_access_hint:"Blokovat přístup podle IP",allow_access_hint:"Povolit přístup podle IP (přepíše blokované IP)",enter_ip:"Zadejte IP a stiskněte enter",rate_limiter:"Omezovač počtu požadavků",wallet_limiter:"Omezení peněženky",wallet_limit_max_withdraw_per_day:"Maximální denní limit pro výběr z peněženky v sats (0 pro deaktivaci)",wallet_max_ballance:"Maximální zůstatek v peněžence v sats (0 pro zakázání)",wallet_limit_secs_between_trans:"Minimální počet sekund mezi transakcemi na peněženku (0 pro vypnutí)",number_of_requests:"Počet požadavků",time_unit:"Časová jednotka",minute:"minuta",second:"sekunda",hour:"hodina",disable_server_log:"Zakázat log serveru",enable_server_log:"Povolit log serveru",coming_soon:"Funkce brzy dostupná",session_has_expired:"Vaše relace vypršela. Prosím, přihlašte se znovu.",instant_access_question:"Chcete okamžitý přístup?",login_with_user_id:"Přihlásit se s uživatelským ID",or:"nebo",create_new_wallet:"Vytvořit novou peněženku",login_to_account:"Přihlaste se ke svému účtu",create_account:"Vytvořit účet",account_settings:"Nastavení účtu",signin_with_nostr:"Pokračovat s Nostr",signin_with_google:"Přihlásit se přes Google",signin_with_github:"Přihlásit se přes GitHub",signin_with_keycloak:"Přihlásit se přes Keycloak",username_or_email:"Uživatelské jméno nebo Email",password:"Heslo",password_config:"Konfigurace hesla",password_repeat:"Opakujte heslo",change_password:"Změnit heslo",update_credentials:"Aktualizovat přihlašovací údaje",update_pubkey:"Aktualizovat veřejný klíč",set_password:"Nastavit heslo",invalid_password:"Heslo musí mít alespoň 8 znaků",login:"Přihlášení",register:"Registrovat",username:"Uživatelské jméno",pubkey:"Veřejný klíč",user_id:"ID uživatele",email:"Email",first_name:"Křestní jméno",last_name:"Příjmení",picture:"Obrázek",verify_email:"Ověřte e-mail s",account:"Účet",update_account:"Aktualizovat účet",invalid_username:"Neplatné uživatelské jméno",auth_provider:"Poskytovatel ověření",my_account:"Můj účet",back:"Zpět",logout:"Odhlásit se",look_and_feel:"Vzhled a chování",toggle_gradient:"Přepnout gradient",gradient_background:"Barevný přechod pozadí",language:"Jazyk",color_scheme:"Barevné schéma",admin_settings:"Nastavení administrátora",extension_cost:"Toto vydání vyžaduje minimální platbu {cost} satoshi.",extension_paid_sats:"Již jste zaplatili {paid_sats} sats.",release_details_error:"Nelze získat podrobnosti o vydání.",pay_from_wallet:"Platit z peněženky",wallet_required:"Peněženka *",show_qr:"Zobrazit QR",retry_install:"Zkusit znovu nainstalovat",new_payment:"Vytvořit novou platbu",update_payment:"Aktualizovat platbu",already_paid_question:"Už jste zaplatili?",sell:"Prodat",sell_require:"Požádejte o platbu, abyste povolili rozšíření",sell_info:"Rozšíření {name} vyžaduje platbu minimálně {amount} sats pro aktivaci.",hide_empty_wallets:"Skrýt prázdné peněženky",recheck:"Znovu zkontrolovat",contributors:"Přispěvatelé",license:"Licence",reset_key:"Obnovit klíč",reset_password:"Obnovit heslo",border_choices:"Možnosti ohraničení",select_all:"Vybrat vše",nfc_supported:"Podpora NFC",nfc_not_supported:"NFC není podporováno",expire_date:"Datum expirace:",hash:"Hash:",welcome_lnbits:"Vítejte v LNbits",setup_su_account:"Nastavte účet Superuser níže.",create_ticker_converter:"Vytvořit převodník měnových tickerů",enable_audit:"Povolit audit",recommended:"Doporučeno",audit_desc:"Zaznamenávejte HTTP požadavky podle zadaných filtrů",audit_record_req:"Záznam Tělo Požadavku",audit_record_warning:"Varování:",audit_record_req_warning_1:"důvěrná data (jako hesla) budou zaznamenána.",audit_record_req_warning_2:"tělo žádosti může mít velkou velikost.",audit_record_use:"Používejte to opatrně.",audit_ip:"Zaznamenat IP adresu",audit_ip_desc:"Zaznamenejte IP adresu klienta",audit_path_params:"Zaznamenat parametry cesty",audit_query_params:"Zaznamenat parametry dotazu",audit_http_methods:"Zahrnout metody HTTP",audit_http_methods_hint:"Seznam metod HTTP, které mají být zahrnuty. Prázdné seznamy znamenají všechny.",audit_http_methods_label:"Metody HTTP",audit_resp_codes:"Zahrnout kódy odpovědí HTTP",audit_resp_codes_hint:"Seznam kódů HTTP, které mají být zahrnuty (regex match). Prázdné seznamy znamenají všechny. Např.: 4.*, 5.*",audit_resp_codes_label:"Kód odpovědi HTTP (regex)",audit_paths:"Zahrnout cesty",audit_paths_hint:"Seznam cest, které mají být zahrnuty (regex shoda). Prázdný seznam znamená vše.",audit_paths_label:"HTTP cesta (regex)",audit_paths_exclude:"Vyloučit cesty",audit_paths_exclude_hint:"Seznam cest, které mají být vyloučeny (regex shoda). Prázdný seznam znamená žádné.",audit_paths_exclude_label:"HTTP cesta (regex)",exchange_providers:"Poskytovatelé směny",admin_extensions:"Rozšíření pro správce",admin_extensions_label:"Administrátorské rozšíření",admin_extensions_hint:"Rozšíření může používat pouze uživatel s administrátorskými oprávněními.",user_default_extensions:"Výchozí rozšíření uživatele",user_default_extensions_label:"Uživatelská rozšíření",user_default_extensions_hint:"Rozšíření, která budou u uživatelů ve výchozím nastavení povolena.",miscellanous:"Různé",misc_disable_extensions:"Zakázat rozšíření",misc_disable_extensions_label:"Zakázat všechna rozšíření",misc_hide_api:"Skrýt API",misc_hide_api_label:"Skrývá API peněženky, rozšíření se mohou rozhodnout ctít",wallets_management:"Správa peněženek",funding_source_info:"Informace o zdroji financování",funding_source:"Zdroj financování: {wallet_class}",node_balance:"Stav uzlu: {balance} sats",lnbits_balance:"Zůstatek LNbits: {balance} sats",funding_reserve_percent:"Rezervovat procento: {percent} %",node_management:"Správa uzlů",node_management_not_supported:"Správa uzlů není podporována aktivním zdrojem financování",toggle_node_ui:"Uživatelské rozhraní uzlu",toggle_public_node_ui:"Veřejné rozhraní uzlu",toggle_transactions_node_ui:"Karta Transakce (Zakázat na velkých uzlech CLN)",invoice_expiry:"Datum vypršení faktury",invoice_expiry_label:"Vypršení faktury (sekundy)",fee_reserve:"Rezerva poplatku",fee_reserve_msats:"Rezervační poplatek v msats",fee_reserve_percent:"Rezervační poplatek v procentech",server_management:"Správa serveru",base_url:"Základní URL",base_url_label:"Statická/Základní URL pro server",authentication:"Ověření",auth_token_expiry_label:"Minuty vypršení platnosti tokenu",auth_token_expiry_hint:"Čas v minutách do vypršení tokenu",auth_allowed_methods_label:"Povolené metody autorizace",auth_allowed_methods_hint:"Vyberte metody autorizace",auth_nostr_label:"URL žádosti Nostr",auth_nostr_hint:"Absolutní URL, které klienti použijí pro přihlášení.",auth_google_ci_label:"ID klienta Google",auth_google_ci_hint:"Ujistěte se, že autorizované přesměrovací URI obsahují https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Heslo klienta Google",auth_gh_client_id_label:"ID klienta GitHub",auth_gh_client_id_hint:"Ujistěte se, že je nastavena zpětná adresa URL pro autorizaci na https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Klientský tajný klíč",auth_keycloak_label:"URL pro zjištění Keycloak",auth_keycloak_ci_label:"ID klienta Keycloak",auth_keycloak_ci_hint:"Ujistěte se, že je autorizace callback URL nastavena na https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Klíč k aplikaci Keycloak tajemství",auth_keycloak_custom_org_label:"Vlastní organizace Keycloak",auth_keycloak_custom_icon_label:"Vlastní ikona Keycloak (URL)",auth_oidc_label:"URL pro zjištění OIDC",auth_oidc_ci_label:"ID klienta OIDC",auth_oidc_ci_hint:"Ujistěte se, že je autorizace callback URL nastavena na https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Klíč k aplikaci OIDC tajemství",auth_oidc_custom_org_label:"Název vlastní organizace OIDC (např. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Vlastní ikona OIDC (URL)",currency_settings:"Nastavení měny",allowed_currencies:"Povolené měny",allowed_currencies_hint:"Omezte počet dostupných fiat měn",default_account_currency:"Výchozí měna účtu",default_account_currency_hint:"Výchozí měna pro účetnictví",service_fee_label:"Poplatek za službu (%)",service_fee_hint:"Poplatek účtovaný za transakci (%)",service_fee_max_label:"Poplatek za službu max (sats)",service_fee_max_hint:"Maximální poplatek za službu k účtování v (sats)",fee_wallet:"Poplatková peněženka",fee_wallet_label:"Poplatková peněženka (ID peněženky)",fee_wallet_hint:"ID peněženky, na kterou se mají odeslat prostředky",disable_fee:"Zakázat poplatek",disable_fee_internal:"Zakázat poplatek za službu pro interní platby",disable_fee_internal_desc:"Zakázat servisní poplatek za interní lightning platby",ui_management:"Správa uživatelského rozhraní",ui_site_title:"Název stránky",ui_site_tagline:"Stránkový slogan",ui_elements_enable:"Povolit prvky na domovské stránce",ui_elements_disable:"Zakázat prvky na úvodní stránce",ui_toggle_elements_tip:"Odebrat prvky z domovské stránky, jako je 'běží na' atd.",ui_site_description:"Popis webu",ui_site_description_hint:"Použijte prostý text, Markdown nebo surové HTML.",ui_default_wallet_name:"Výchozí název peněženky",lnbits_wallet:"Peněženka LNbits",denomination:"Nominální hodnota",denomination_hint:"Název pro token FakeWallet",ui_qr_code_logo:"Logo QR kódu",ui_qr_code_logo_hint:"URL k obrázku loga v QR kódu",ui_custom_badge:"Vlastní odznak",ui_custom_badge_label:"Vlastní odznak 'POUŽÍVEJTE S OPATRNOSTÍ - Peněženka LNbits je stále v BETA verzi'",ui_custom_badge_color_label:"Barva vlastního odznaku",themes:"Motivy",themes_hint:"Vyberte motivy dostupné pro uživatele",custom_logo:"Vlastní logo",custom_logo_hint:"URL k obrázku loga",ad_space_title:"Název reklamního prostoru",ad_space_title_label:"Podporováno",ad_slots:"Reklamní sloty",ad_slots_hint:"Adresa URL reklamy a cesty k souborům obrázků ve formátu CSV, rozšíření se mohou rozhodnout respektovat",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Reklamy povoleny",ads_disabled:"Reklamy deaktivovány",user_management:"Správa uživatelů",admin_users:"Administrátorští uživatelé",admin_users_hint:"Uživatelé s administrátorskými oprávněními",admin_users_label:"ID uživatele",allowed_users:"Povolení uživatelé",allowed_users_hint:"Pouze tito uživatelé mohou používat LNbits.",allowed_users_label:"Uživatelské ID",allow_creation_user:"Povolit vytvoření nových uživatelů",allow_creation_user_desc:"Povolit vytváření nových uživatelů na úvodní stránce",components:"Soubory",long_running_endpoints:"Top 5 dlouho běžících koncových bodů",http_request_methods:"Metody HTTP požadavků",http_response_codes:"Kódy HTTP odpovědí",request_details:"Podrobnosti žádosti",http_request_details:"Podrobnosti HTTP žádosti"},window.localisation.sk={confirm:"Áno",server:"Server",theme:"Téma",site_customisation:"Prispôsobenie lokality",funding:"Financovanie",users:"Používatelia",audit:"Audit",apps:"Aplikácie",channels:"Kanály",transactions:"Transakcie",dashboard:"Prehľad",node:"Uzol",export_users:"Exportovať používateľov",no_users:"Nenašli sa žiadni používatelia",total_capacity:"Celková kapacita",avg_channel_size:"Priemerná veľkosť kanálu",biggest_channel_size:"Najväčší kanál",smallest_channel_size:"Najmenší kanál",number_of_channels:"Počet kanálov",active_channels:"Aktívne kanály",connect_peer:"Pripojiť peer",connect:"Pripojiť",open_channel:"Otvoriť kanál",open:"Otvoriť",close_channel:"Zatvoriť kanál",close:"Zatvoriť",restart:"Reštartovať server",save:"Uložiť",save_tooltip:"Uložiť vaše zmeny",credit_debit:"Kreditná / Debetná",credit_hint:"Stlačte Enter pre pripísanie na účet",credit_label:"{denomination} na pripísanie",restart_tooltip:"Pre prejavenie zmien reštartujte server",add_funds_tooltip:"Pridať prostriedky do peňaženky.",reset_defaults:"Obnoviť predvolené",reset_defaults_tooltip:"Odstrániť všetky nastavenia a obnoviť predvolené.",download_backup:"Stiahnuť zálohu databázy",name_your_wallet:"Pomenujte vašu {name} peňaženku",paste_invoice_label:"Vložte faktúru, platobnú požiadavku alebo lnurl kód *",lnbits_description:"Ľahko nastaviteľný a ľahkotonážny, LNbits môže bežať na akomkoľvek zdroji financovania Lightning Network a dokonca LNbits samotný! LNbits môžete používať pre seba, alebo ľahko ponúknuť správcovské riešenie pre iných. Každá peňaženka má svoje vlastné API kľúče a nie je limit na počet peňaženiek, ktoré môžete vytvoriť. Schopnosť rozdeľovať finančné prostriedky robí z LNbits užitočný nástroj pre správu peňazí a ako vývojový nástroj. Rozšírenia pridávajú extra funkčnosť do LNbits, takže môžete experimentovať s radou najnovších technológií na lightning sieti. Vývoj rozšírení sme urobili čo najjednoduchší a ako voľný a open-source projekt, podporujeme ľudí vývoj a odovzdávanie vlastných rozšírení.",export_to_phone:"Exportovať do telefónu s QR kódom",export_to_phone_desc:"Tento QR kód obsahuje URL vašej peňaženky s plným prístupom. Môžete ho naskenovať z vášho telefónu a otvoriť vašu peňaženku odtiaľ.",wallet:"Peňaženka:",wallets:"Peňaženky",add_wallet:"Pridať novú peňaženku",delete_wallet:"Zmazať peňaženku",delete_wallet_desc:"Celá peňaženka bude zmazaná, prostriedky budú NEOBNOVITEĽNÉ.",rename_wallet:"Premenovať peňaženku",update_name:"Aktualizovať meno",fiat_tracking:"Sledovanie fiat",currency:"Mena",update_currency:"Aktualizovať menu",press_to_claim:"Stlačte pre nárok na bitcoin",donate:"Prispieť",view_github:"Zobraziť na GitHube",voidwallet_active:"VoidWallet je aktívny! Platby zakázané",use_with_caution:"POUŽÍVAJTE OPATRNE - {name} peňaženka je stále v BETE",service_fee:"Servisný poplatok: {amount} % za transakciu",service_fee_max:"Servisný poplatok: {amount} % za transakciu (max {max} satoshi)",service_fee_tooltip:"Servisný poplatok účtovaný správcom LNbits servera za odchádzajúcu transakciu",toggle_darkmode:"Prepnúť Tmavý režim",payment_reactions:"Reakcie na platbu",view_swagger_docs:"Zobraziť LNbits Swagger API dokumentáciu",api_docs:"API dokumentácia",api_keys_api_docs:"Adresa uzla, API kľúče a API dokumentácia",lnbits_version:"Verzia LNbits",runs_on:"Beží na",paste:"Vložiť",paste_from_clipboard:"Vložiť zo schránky",paste_request:"Vložiť požiadavku",create_invoice:"Vytvoriť faktúru",camera_tooltip:"Použite kameru na naskenovanie faktúry/QR",export_csv:"Exportovať do CSV",chart_tooltip:"Zobraziť graf",pending:"Čakajúce",copy_invoice:"Kopírovať faktúru",withdraw_from:"Vybrať z",cancel:"Zrušiť",scan:"Skenovať",read:"Čítať",pay:"Platiť",memo:"Poznámka",date:"Dátum",payment_processing:"Spracovávanie platby...",not_enough_funds:"Nedostatok prostriedkov!",search_by_tag_memo_amount:"Vyhľadať podľa značky, poznámky, sumy",invoice_waiting:"Faktúra čakajúca na zaplatenie",payment_received:"Platba prijatá",payment_sent:"Platba odoslaná",receive:"prijímať",send:"posielať",outgoing_payment_pending:"Odchádzajúca platba čaká",drain_funds:"Vyprázdniť prostriedky",drain_funds_desc:"Toto je LNURL-withdraw QR kód pre vyprázdnienie všetkého z tejto peňaženky. S nikým ho nezdieľajte. Je kompatibilný s balanceCheck a balanceNotify, takže vaša peňaženka môže naďalej kontinuálne vyťahovať prostriedky odtiaľto po prvom výbere.",i_understand:"Rozumiem",copy_wallet_url:"Kopírovať URL peňaženky",disclaimer_dialog_title:"Dôležité!",disclaimer_dialog:"Funkcionalita prihlásenia bude vydaná v budúcej aktualizácii, zatiaľ si uistite, že ste si túto stránku pridali medzi záložky pre budúci prístup k vašej peňaženke! Táto služba je v BETA verzii a nenesieme zodpovednosť za stratu prístupu k prostriedkom.",no_transactions:"Zatiaľ žiadne transakcie",manage:"Spravovať",exchanges:"Burzy",extensions:"Rozšírenia",no_extensions:"Nemáte nainštalované žiadne rozšírenia :(",created:"Vytvorené",search_extensions:"Hľadať rozšírenia",extension_sources:"Rozšírenie zdrojov",ext_sources_hint:"Úložiská, z ktorých sa môžu stiahnuť rozšírenia.",ext_sources_label:"Zdrojová URL (použite iba oficiálny zdroj rozšírenia LNbits a zdroje, ktorým môžete dôverovať)",warning:"Upozornenie",repository:"Repozitár",confirm_continue:"Ste si istí, že chcete pokračovať?",manage_extension_details:"Inštalovať/odinštalovať rozšírenie",install:"Inštalovať",uninstall:"Odinštalovať",drop_db:"Odstrániť údaje",enable:"Povoliť",pay_to_enable:"Zaplaťte na aktiváciu",enable_extension_details:"Povoliť rozšírenie pre aktuálneho používateľa",disable:"Zakázať",delete:"Odstrániť",installed:"Nainštalované",activated:"Aktivované",deactivated:"Deaktivované",release_notes:"Poznámky k vydaniu",activate_extension_details:"Sprístupniť/neprístupniť rozšírenie pre používateľov",featured:"Odporúčané",all:"Všetky",only_admins_can_install:"(Iba administrátorské účty môžu inštalovať rozšírenia)",admin_only:"Iba pre administrátorov",new_version:"Nová verzia",extension_depends_on:"Závisí na:",extension_rating_soon:"Hodnotenia budú čoskoro dostupné",extension_installed_version:"Nainštalovaná verzia",extension_uninstall_warning:"Chystáte sa odstrániť rozšírenie pre všetkých používateľov.",uninstall_confirm:"Áno, Odinštalovať",extension_db_drop_info:"Všetky údaje pre rozšírenie budú trvalo vymazané. Túto operáciu nie je možné vrátiť!",extension_db_drop_warning:"Chystáte sa odstrániť všetky údaje pre rozšírenie. Pre pokračovanie prosím napíšte názov rozšírenia:",extension_required_lnbits_version:"Toto vydanie vyžaduje aspoň verziu LNbits",min_version:"Minimum (vrátane)",max_version:"Maximálne (vylúčené)",payment_hash:"Hash platby",fee:"Poplatok",amount:"Suma",amount_sats:"Suma (sats)",tag:"Tag",unit:"Jednotka",description:"Popis",expiry:"Expirácia",webhook:"Webhook",payment_proof:"Dôkaz platby",update:"Aktualizovať",update_available:"Dostupná aktualizácia {version}!",latest_update:"Máte najnovšiu verziu {version}.",notifications:"Notifikácie",no_notifications:"Žiadne notifikácie",notifications_disabled:"Notifikácie stavu LNbits sú zakázané.",enable_notifications:"Povoliť Notifikácie",enable_notifications_desc:"Ak povolené, budú sa načítavať najnovšie aktualizácie stavu LNbits, ako sú bezpečnostné incidenty a aktualizácie.",enable_watchdog:"Povoliť Watchdog",enable_watchdog_desc:"Ak povolené, vaš zdroj financovania sa automaticky zmení na VoidWallet, ak je váš zostatok nižší ako zostatok LNbits. Po aktualizácii bude treba povoliť manuálne.",watchdog_interval:"Interval Watchdog",watchdog_interval_desc:"Ako často by malo pozadie kontrolovať signál killswitch v watchdog delta [node_balance - lnbits_balance] (v minútach).",watchdog_delta:"Delta Watchdog",watchdog_delta_desc:"Limit pred zmenou zdroja financovania na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stav",notification_source:"Zdroj notifikácií",notification_source_label:"URL zdroja (používajte len oficiálny LNbits zdroj stavu a zdroje, ktorým môžete dôverovať)",more:"viac",less:"menej",releases:"Vydania",watchdog:"Watchdog",server_logs:"Logy servera",ip_blocker:"Blokovanie IP",security:"Bezpečnosť",security_tools:"Nástroje bezpečnosti",block_access_hint:"Blokovať prístup podľa IP",allow_access_hint:"Povoliť prístup podľa IP (prebije blokované IP)",enter_ip:"Zadajte IP a stlačte enter",rate_limiter:"Obmedzovač počtu požiadaviek",wallet_limiter:"Obmedzovač peňaženky",wallet_limit_max_withdraw_per_day:"Maximálny denný výber z peňaženky v satošiach (0 pre zrušenie)",wallet_max_ballance:"Maximálny zostatok v peňaženke v satošiach (0 pre deaktiváciu)",wallet_limit_secs_between_trans:"Minimálny počet sekúnd medzi transakciami na peňaženku (0 na deaktiváciu)",number_of_requests:"Počet požiadaviek",time_unit:"Časová jednotka",minute:"minúta",second:"sekunda",hour:"hodina",disable_server_log:"Zakázať Log servera",enable_server_log:"Povoliť Log servera",coming_soon:"Funkcia bude čoskoro dostupná",session_has_expired:"Vaša relácia vypršala. Prosím, prihláste sa znova.",instant_access_question:"Chcete okamžitý prístup?",login_with_user_id:"Prihlásiť sa s používateľským ID",or:"alebo",create_new_wallet:"Vytvoriť novú peňaženku",login_to_account:"Prihláste sa do vášho účtu",create_account:"Vytvoriť účet",account_settings:"Nastavenia účtu",signin_with_nostr:"Pokračovať s Nostr",signin_with_google:"Prihlásiť sa pomocou Google",signin_with_github:"Prihlásiť sa pomocou GitHub",signin_with_keycloak:"Prihlásiť sa pomocou Keycloak",username_or_email:"Používateľské meno alebo email",password:"Heslo",password_config:"Konfigurácia hesla",password_repeat:"Opakovanie hesla",change_password:"Zmeniť heslo",update_credentials:"Aktualizovať poverenia",update_pubkey:"Aktualizovať verejný kľúč",set_password:"Nastaviť heslo",invalid_password:"Heslo musí mať aspoň 8 znakov",login:"Prihlásenie",register:"Registrovať",username:"Používateľské meno",pubkey:"Verejný kľúč",user_id:"ID používateľa",email:"Email",first_name:"Meno",last_name:"Priezvisko",picture:"Obrázok",verify_email:"Overiť e-mail s",account:"Účet",update_account:"Aktualizovať účet",invalid_username:"Neplatné užívateľské meno",auth_provider:"Poskytovateľ autentifikácie",my_account:"Môj účet",back:"Späť",logout:"Odhlásiť sa",look_and_feel:"Vzhľad a dojem",toggle_gradient:"Prepnúť prechodový režim",gradient_background:"Gradientné pozadie",language:"Jazyk",color_scheme:"Farebná schéma",admin_settings:"Nastavenia správcu",extension_cost:"Táto verzia vyžaduje minimálnu platbu {cost} satoshi.",extension_paid_sats:"Už ste zaplatili {paid_sats} sats.",release_details_error:"Nepodarilo sa získať podrobnosti o vydaní.",pay_from_wallet:"Zaplatiť z peňaženky",wallet_required:"Peňaženka *",show_qr:"Zobraziť QR",retry_install:"Skúste inštaláciu znova",new_payment:"Vytvoriť novú platbu",update_payment:"Aktualizovať platbu",already_paid_question:"Už ste zaplatili?",sell:"Predať",sell_require:"Požiadajte o platbu na povolenie rozšírenia",sell_info:"Rozšírenie {name} vyžaduje platbu minimálne {amount} sats na aktiváciu.",hide_empty_wallets:"Skryť prázdne peňaženky",recheck:"Prekontrolovať znova",contributors:"Prispievatelia",license:"Licencia",reset_key:"Resetovať kľúč",reset_password:"Obnoviť heslo",border_choices:"Výber obrysov",select_all:"Vybrať všetko",nfc_supported:"Podpora NFC",nfc_not_supported:"NFC nie je podporované",expire_date:"Dátum exspirácie:",hash:"Hash:",welcome_lnbits:"Vitajte v LNbits",setup_su_account:"Nastavte účet Superuser nižšie.",create_ticker_converter:"Vytvoriť prevodník mienových tickerov",enable_audit:"Povoliť audit",recommended:"Odporúčané",audit_desc:"Zaznamenávajte HTTP požiadavky podľa špecifikovaných filtrov.",audit_record_req:"Zaznamenať telo žiadosti",audit_record_warning:"Upozornenie:",audit_record_req_warning_1:"dôverné údaje (ako napríklad heslá) budú zaznamenané.",audit_record_req_warning_2:"telo žiadosti môže mať veľkú veľkosť.",audit_record_use:"Používajte to s opatrnosťou.",audit_ip:"Zaznamenať IP adresu",audit_ip_desc:"Zaznamenajte IP adresu klienta",audit_path_params:"Zaznamenať hodnoty cesty",audit_query_params:"Zaznamenať parametre dopytu",audit_http_methods:"Zahrnúť metódy HTTP",audit_http_methods_hint:"Zoznam zahrnutých metód HTTP. Prázdne zoznamy znamenajú všetky.",audit_http_methods_label:"HTTP metódy",audit_resp_codes:"Zahrnúť kódy odpovede HTTP",audit_resp_codes_hint:"Zoznam kódov HTTP, ktoré sa majú zahrnúť (zhoda s regexom). Prázdny zoznam znamená všetky. Napr: 4.*, 5.*",audit_resp_codes_label:"Kód odpovede HTTP (regex)",audit_paths:"Cesty zahrnúť",audit_paths_hint:"Zoznam ciest, ktoré sa majú zahrnúť (zhoda s regexom). Prázdny zoznam znamená všetky.",audit_paths_label:"HTTP cesta (regex)",audit_paths_exclude:"Vylúčiť cesty",audit_paths_exclude_hint:"Zoznam ciest, ktoré majú byť vylúčené (zhoda s regexom). Prázdny zoznam znamená žiadne.",audit_paths_exclude_label:"Cesta HTTP (regex)",exchange_providers:"Poskytovatelia výmeny",admin_extensions:"Rozšírenia administrátora",admin_extensions_label:"Rozšírenia správcu",admin_extensions_hint:"Rozšírenia môže používať iba používateľ s administrátorskými právami.",user_default_extensions:"Predvolené rozšírenia používateľa",user_default_extensions_label:"Používateľské rozšírenia",user_default_extensions_hint:"Rozšírenia, ktoré budú predvolene povolené pre používateľov.",miscellanous:"Rôzne",misc_disable_extensions:"Zakázať rozšírenia",misc_disable_extensions_label:"Zakázať všetky rozšírenia",misc_hide_api:"Skryť API",misc_hide_api_label:"Skryje API peňaženky, rozšírenia sa môžu rozhodnúť dodržiavať",wallets_management:"Správa peňaženiek",funding_source_info:"Informácie o zdroji financovania",funding_source:"Zdroj financovania: {wallet_class}",node_balance:"Stav uzla: {balance} sats",lnbits_balance:"Zostatok LNbits: {balance} sats",funding_reserve_percent:"Rezervovať percento: {percent} %",node_management:"Správa uzlov",node_management_not_supported:"Správa uzlov nie je podporovaná aktívnym zdrojom financovania",toggle_node_ui:"Používateľské rozhranie uzla",toggle_public_node_ui:"Verejné používateľské rozhranie uzla",toggle_transactions_node_ui:"Karta transakcií (Zakázať na veľkých CLN uzloch)",invoice_expiry:"Platnosť faktúry",invoice_expiry_label:"Doba platnosti faktúry (sekundy)",fee_reserve:"Rezerva poplatkov",fee_reserve_msats:"Rezervačný poplatok v msats",fee_reserve_percent:"Rezervačný poplatok v percentách",server_management:"Správa servera",base_url:"Základná URL adresa",base_url_label:"Statická/Základná URL adresa pre server",authentication:"Autentifikácia",auth_token_expiry_label:"Minúty do vypršania tokenu",auth_token_expiry_hint:"Čas v minútach do vypršania platnosti tokenu",auth_allowed_methods_label:"Povolené metódy autorizácie",auth_allowed_methods_hint:"Vyberte metódy autorizácie",auth_nostr_label:"Adresa URL žiadosti Nostr",auth_nostr_hint:"Absolútna URL adresa, ktorú klienti použijú na prihlásenie.",auth_google_ci_label:"ID klienta Google",auth_google_ci_hint:"Uistite sa, že autorizované presmerovacie URI obsahujú https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google Client Secret",auth_gh_client_id_label:"Identifikátor klienta GitHub",auth_gh_client_id_hint:"Uistite sa, že URL adresa pre spätné volanie autorizácie je nastavená na https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub Client Secret",auth_keycloak_label:"URL zistenia Keycloak",auth_keycloak_ci_label:"ID klienta Keycloak",auth_keycloak_ci_hint:"Uistite sa, že URL spätného volania autorizácie je nastavená na https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Tajný kľúč klienta Keycloak",auth_keycloak_custom_org_label:"Vlastná organizácia Keycloak",auth_keycloak_custom_icon_label:"Vlastná ikona Keycloak (URL)",auth_oidc_label:"URL zistenia OIDC",auth_oidc_ci_label:"ID klienta OIDC",auth_oidc_ci_hint:"Uistite sa, že URL spätného volania autorizácie je nastavená na https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"Tajný kľúč klienta OIDC",auth_oidc_custom_org_label:"Názov vlastnej organizácie OIDC (napr. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Vlastná ikona OIDC (URL)",currency_settings:"Nastavenia meny",allowed_currencies:"Povolené meny",allowed_currencies_hint:"Obmedzte počet dostupných fiat mien",default_account_currency:"Predvolená mena účtu",default_account_currency_hint:"Predvolená mena pre účtovníctvo",service_fee_label:"Poplatok za službu (%)",service_fee_hint:"Poplatok účtovaný za transakciu (%)",service_fee_max_label:"Poplatok za službu max (sats)",service_fee_max_hint:"Maximálny servisný poplatok na účtovanie v (sats)",fee_wallet:"Peňaženka s poplatkami",fee_wallet_label:"Peňaženka poplatkov (ID peňaženky)",fee_wallet_hint:"ID peňaženky, do ktorej sa majú odoslať prostriedky",disable_fee:"Zakázať poplatok",disable_fee_internal:"Zakázať poplatok za službu pre interné platby",disable_fee_internal_desc:"Zakázať poplatok za službu pre interné platby Lightning",ui_management:"Správa používateľského rozhrania",ui_site_title:"Názov stránky",ui_site_tagline:"Slogan webovej stránky",ui_elements_enable:"Povoliť prvky na domovskej stránke",ui_elements_disable:"Zakázať prvky na domovskej stránke",ui_toggle_elements_tip:"Odstrániť prvky úvodnej stránky, ako napríklad 'používa' atď.",ui_site_description:"Popis lokality",ui_site_description_hint:"Použite obyčajný text, Markdown alebo surové HTML.",ui_default_wallet_name:"Predvolený názov peňaženky",lnbits_wallet:"LNbits peňaženka",denomination:"Nominálna hodnota",denomination_hint:"Názov pre token FakeWallet",ui_qr_code_logo:"Logo QR kódu",ui_qr_code_logo_hint:"URL k obrázku loga v QR kóde",ui_custom_badge:"Vlastná odznak",ui_custom_badge_label:"Vlastný odznak 'POUŽÍVAŤ S OPATRNOSŤOU - LNbits peňaženka je stále v BETA verzii'",ui_custom_badge_color_label:"Vlastná farba odznaku",themes:"Motívy",themes_hint:"Vyberte témy dostupné pre používateľov",custom_logo:"Vlastné logo",custom_logo_hint:"URL k obrázku loga",ad_space_title:"Názov reklamného priestoru",ad_space_title_label:"Podporované spoločnosťou",ad_slots:"Reklamné sloty",ad_slots_hint:"Pridajte URL adresu a cesty k obrazovým súborom vo formáte CSV, rozšírenia sa môžu rozhodnúť dodržať",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Reklamy povolené",ads_disabled:"Reklamy deaktivované",user_management:"Správa používateľov",admin_users:"Administrátorskí používatelia",admin_users_hint:"Používatelia s administrátorskými oprávneniami",admin_users_label:"ID používateľa",allowed_users:"Povolení používatelia",allowed_users_hint:"Iba títo používatelia môžu používať LNbits.",allowed_users_label:"ID používateľa",allow_creation_user:"Povoliť vytváranie nových používateľov",allow_creation_user_desc:"Povoliť vytváranie nových používateľov na indexovej stránke",components:"Súčasti",long_running_endpoints:"Top 5 dlho bežiacich koncových bodov",http_request_methods:"Metódy HTTP žiadostí",http_response_codes:"Kódy odpovedí HTTP",request_details:"Podrobnosti žiadosti",http_request_details:"Podrobnosti požiadavky HTTP"},window.localisation.kr={confirm:"확인",server:"서버",theme:"테마",site_customisation:"사이트 사용자 정의",funding:"자금",users:"사용자",audit:"감사",apps:"앱",channels:"채널",transactions:"거래 내역",dashboard:"현황판",node:"노드",export_users:"사용자 내보내기",no_users:"사용자가 없습니다",total_capacity:"총 용량",avg_channel_size:"평균 채널 용량",biggest_channel_size:"가장 큰 채널 용량",smallest_channel_size:"가장 작은 채널 용량",number_of_channels:"채널 수",active_channels:"활성화된 채널",connect_peer:"피어 연결하기",connect:"연결하기",open_channel:"채널 개설하기",open:"개설",close_channel:"채널 폐쇄하기",close:"폐쇄",restart:"서버 재시작",save:"저장",save_tooltip:"변경 사항 저장",credit_debit:"크레딧 / 직불카드",credit_hint:"계정에 자금을 넣으려면 Enter를 눌러주세요",credit_label:"{denomination} 단위로 충전하기",credit_ok:"가상 자금({amount} sats) 입출금 성공. 지불은 자금 출처의 실제 자금에 따라 달라집니다.",restart_tooltip:"변경 사항을 적용하려면 서버를 재시작해야 합니다.",add_funds_tooltip:"지갑에 자금을 추가합니다.",reset_defaults:"기본 설정으로 돌아가기",reset_defaults_tooltip:"설정했던 내용들을 모두 지우고, 기본 설정으로 돌아갑니다.",download_backup:"데이터베이스 백업 다운로드",name_your_wallet:"사용할 {name}지갑의 이름을 정하세요",paste_invoice_label:"인보이스, 결제 요청, 혹은 lnurl 코드를 붙여넣으세요 *",lnbits_description:"설정이 쉽고 가벼운 LNbits는 어떤 라이트닝 네트워크의 예산 자원 위에서든 돌아갈 수 있습니다, 그리고 다른 LNbits 지갑들입니다. 스스로 사용하기 위해, 또는 다른 사람들에게 수탁형 솔루션을 제공하기 위해 LNbits를 운영할 수 있습니다. 각 지갑들은 자신만의 API key를 가지며, 생성 가능한 지갑의 수에는 제한이 없습니다. 자금을 분할할 수 있는 기능으로 인해, LNbits는 자금 운영 도구로써뿐만 아니라 개발 도구로써도 유용합니다. 확장 기능들은 LNbits에 여러분들이 라이트닝 네트워크의 다양한 최신 기술들을 수행해볼 수 있게 하는 추가 기능을 제공합니다. LNbits 개발진들은 확장 기능들의 개발 또한 가능한 쉽게 만들었으며, 무료 오픈 소스 프로젝트답게 사람들이 자신만의 확장 기능들을 개발하고 제출하기를 응원합니다.",export_to_phone:"QR 코드를 이용해 모바일 기기로 내보내기",export_to_phone_desc:"이 QR 코드는 선택된 지갑의 최대 접근 권한을 가진 전체 URL을 담고 있습니다. 스캔 후, 모바일 기기에서 지갑을 열 수 있습니다.",wallet:"지갑:",wallets:"지갑",add_wallet:"새로운 지갑을 추가합니다",delete_wallet:"지갑을 삭제합니다",delete_wallet_desc:"이 지갑은 삭제될 것이며, 삭제 시 지갑 내 자금은 복구가 불가능합니다.",rename_wallet:"지갑 이름 변경",update_name:"이름 변경하기",fiat_tracking:"법정통화 가격 표시",currency:"통화",update_currency:"통화 수정하기",press_to_claim:"비트코인을 수령하려면 눌러주세요",donate:"기부",view_github:"GitHub 페이지 보기",voidwallet_active:"VoidWallet이 활성화되었습니다! 결제가 불가능합니다.",use_with_caution:"주의하세요 - {name} 지갑은 아직 BETA 단계입니다.",service_fee:"서비스 수수료: 거래액의 {amount} %",service_fee_max:"서비스 수수료: 거래액의 {amount} % (최대 {max} sats)",service_fee_tooltip:"지불 결제 시마다 LNbits 서버 관리자에게 납부되는 서비스 수수료",toggle_darkmode:"다크 모드 전환",payment_reactions:"결제 반응",view_swagger_docs:"LNbits Swagger API 문서를 봅니다",api_docs:"API 문서",api_keys_api_docs:"노드 URL, API 키와 API 문서",lnbits_version:"LNbits 버전",runs_on:"Runs on",paste:"붙여넣기",paste_from_clipboard:"클립보드에서 붙여넣기",paste_request:"지불 요청 붙여넣기",create_invoice:"인보이스 생성하기",camera_tooltip:"카메라를 이용해서 인보이스/QR을 스캔하세요",export_csv:"CSV 형태로 내보내기",chart_tooltip:"그래프로 보여주기",pending:"대기 중",copy_invoice:"인보이스 복사하기",withdraw_from:"출금",cancel:"취소",scan:"스캔",read:"분석하기",pay:"지불하기",memo:"Memo",date:"일시",payment_processing:"결제 처리 중...",not_enough_funds:"자금이 부족합니다!",search_by_tag_memo_amount:"태그, memo, 수량으로 검색하기",invoice_waiting:"결제를 기다리는 인보이스",payment_received:"받은 결제액",payment_sent:"보낸 결제액",receive:"받기",send:"보내기",outgoing_payment_pending:"지불 대기 중",drain_funds:"자금 비우기",drain_funds_desc:"이는 선택된 지갑으로부터 모든 자금을 인출하는 LNURL-withdraw QR 코드입니다. 그 누구와도 공유하지 마세요. balanceCheck 및 balanceNotify 기능과 호환되며, 당신의 지갑은 첫 출금 이후로도 계속 자금을 끌어당기고 있을 수 있습니다.",i_understand:"이해하였습니다",copy_wallet_url:"지갑 URL 복사하기",disclaimer_dialog_title:"중요!",disclaimer_dialog:"로그인 기능은 향후 업데이트를 통해 지원될 계획이지만, 현재로써는 이 페이지에 향후 다시 접속하기 위해 북마크 설정하는 것을 잊지 마세요! 이 서비스는 아직 BETA 과정에 있고, LNbits 개발자들은 자금 손실에 대해 전혀 책임을 지지 않습니다.",no_transactions:"아직 아무런 거래도 이루어지지 않았습니다",manage:"관리",exchanges:"거래소",extensions:"확장 기능",no_extensions:"아직 설치된 확장 기능들이 없네요 :(",created:"생성됨",search_extensions:"확장 기능 검색하기",extension_sources:"확장 소스",ext_sources_hint:"확장 프로그램을 다운로드할 수 있는 저장소",ext_sources_label:"출처 URL (공식 LNbits 확장 소스만 사용하고, 신뢰할 수 있는 출처를 사용하세요)",warning:"주의",repository:"저장소",confirm_continue:"정말로 계속할까요?",manage_extension_details:"확장 기능 설치/삭제하기",install:"설치",uninstall:"삭제",drop_db:"데이터 삭제",enable:"활성화",pay_to_enable:"지불하여 활성화",enable_extension_details:"현재 사용자 계정에 해당 확장 기능을 활성화합니다",disable:"비활성화",delete:"삭제",installed:"설치됨",activated:"작동됨",deactivated:"작동 중지",release_notes:"배포 노트",activate_extension_details:"사용자들의 확장 기능 사용 가능 여부를 결정합니다",featured:"추천",all:"전체",only_admins_can_install:"(관리자 계정만이 확장 기능을 설치할 수 있습니다)",admin_only:"관리자 전용",new_version:"새로운 버전",extension_depends_on:"의존성 존재:",extension_rating_soon:"평점 기능도 곧 구현됩니다",extension_installed_version:"설치된 버전",extension_uninstall_warning:"모든 사용자들로부터 이 확장 기능을 제거한다는 점에 유의하세요.",uninstall_confirm:"네, 삭제합니다",extension_db_drop_info:"해당 확장 기능의 모든 데이터가 영구적으로 삭제됩니다. 작업 수행 후에는 되돌릴 수 없습니다!",extension_db_drop_warning:"해당 확장 기능의 모든 데이터가 영구적으로 삭제될 겁니다. 계속하려면 확장 기능의 이름을 입력해주세요:",extension_required_lnbits_version:"이 배포 버전은 더 높은 버전의 lnbits가 설치되어 있어야 합니다.",min_version:"최소값 (포함됨)",max_version:"최대값 (제외됨)",payment_hash:"결제 해쉬값",fee:"수수료",amount:"액수",amount_sats:"금액 (사토시)",tag:"태그",unit:"단위",description:"상세",expiry:"만료",webhook:"Webhook",payment_proof:"Payment 증거",update:"업데이트",update_available:"{version}으로 업데이트가 가능합니다.",latest_update:"이미 {version} 버전으로 업데이트되었습니다.",notifications:"알림",no_notifications:"알림 없음",notifications_disabled:"LNbits 상태 알림이 비활성화되었습니다.",enable_notifications:"알림 활성화",enable_notifications_desc:"활성화 시, 가장 최신의 보안 사고나 소프트웨어 업데이트 등의 LNbits 상황 업데이트를 불러옵니다.",enable_watchdog:"와치독 활성화",enable_watchdog_desc:"활성화 시, LNbits 잔금보다 당신의 잔금이 지정한 수준보다 더 낮아질 경우 자동으로 자금의 원천을 VoidWallet으로 변경합니다. 업데이트 이후 수동으로 활성화해 주어야 합니다.",watchdog_interval:"와치독 시간 간격",watchdog_interval_desc:"와치독 델타 값을 기반으로 하여 당신의 LNbits 서버에서 나오는 비상 정지 신호를 백그라운드 작업으로 얼마나 자주 확인할 것인지를 결정합니다. (분 단위)",watchdog_delta:"와치독 델타",watchdog_delta_desc:"당신의 자금 원천을 VoidWallet으로 변경하기까지의 기준 값 [LNbits 잔액 - 노드 잔액 > 델타 값]",status:"상황",notification_source:"알림 메세지 출처",notification_source_label:"알림 메세지를 가져올 URL (공식 LNbits 상황판 출처나, 당신이 신뢰할 수 있는 출처만을 사용하세요)",more:"더 알아보기",less:"적게",releases:"배포 버전들",watchdog:"와치독",server_logs:"서버 로그",ip_blocker:"IP 기반 차단기",security:"보안",security_tools:"보안 도구들",block_access_hint:"IP 기준으로 접속 차단하기",allow_access_hint:"IP 기준으로 접속 허용하기 (차단한 IP들을 무시합니다)",enter_ip:"IP 주소를 입력하고 Enter를 눌러주세요",rate_limiter:"횟수로 제한하기",wallet_limiter:"지갑 제한기",wallet_limit_max_withdraw_per_day:"일일 최대 지갑 출금액(sats) (0은 비활성화)",wallet_max_ballance:"지갑 최대 잔액(sats) (0은 비활성화)",wallet_limit_secs_between_trans:"지갑 당 거래 사이 최소 초 (0은 비활성화)",number_of_requests:"요청 횟수",time_unit:"시간 단위",minute:"분",second:"초",hour:"시간",disable_server_log:"서버 로깅 중단하기",enable_server_log:"서버 로깅 활성화하기",coming_soon:"곧 구현될 기능들입니다",session_has_expired:"세션 유효 기간이 만료되었습니다. 다시 로그인해 주세요.",instant_access_question:"즉시 액세스하시겠습니까?",login_with_user_id:"사용자 ID로 로그인",or:"또는",create_new_wallet:"새 지갑 만들기",login_to_account:"계정에 로그인하세요.",create_account:"계정 생성",account_settings:"계정 설정",signin_with_nostr:"Nostr로 계속하기",signin_with_google:"Google으로 로그인",signin_with_github:"GitHub으로 로그인",signin_with_keycloak:"Keycloak으로 로그인",username_or_email:"사용자 이름 또는 이메일",password:"비밀번호",password_config:"비밀번호 설정",password_repeat:"비밀번호 재입력",change_password:"비밀번호 변경",update_credentials:"자격 증명 업데이트",update_pubkey:"공개 키 업데이트",set_password:"비밀번호 설정",invalid_password:"비밀번호는 최소 8자 이상이어야 합니다",login:"로그인",register:"등록",username:"사용자 이름",pubkey:"공개 키",user_id:"사용자 ID",email:"이메일",first_name:"성명",last_name:"성",picture:"사진",verify_email:"이메일을 인증하려면",account:"계정",update_account:"계정 업데이트",invalid_username:"잘못된 사용자 이름",auth_provider:"인증 제공자",my_account:"내 계정",back:"뒤로",logout:"로그아웃",look_and_feel:"외관과 느낌",toggle_gradient:"그라디언트 전환",gradient_background:"그라디언트 배경",language:"언어",color_scheme:"색상 구성",admin_settings:"관리자 설정",extension_cost:"이 버전은 최소 {cost} sats의 지불이 필요합니다.",extension_paid_sats:"당신은 이미 {paid_sats} sats를 지불했습니다.",release_details_error:"릴리스 세부 정보를 가져올 수 없습니다.",pay_from_wallet:"지갑에서 결제하다",wallet_required:"지갑 *",show_qr:"QR 보기",retry_install:"다시 설치하세요",new_payment:"새로운 결제하기",update_payment:"결제 업데이트",already_paid_question:"이미 지불하셨나요?",sell:"판매",sell_require:"확장을 활성화하려면 결제를 요청하십시오.",sell_info:"{name} 확장 기능을 활성화하려면 최소 {amount} 사토시의 결제가 필요합니다.",hide_empty_wallets:"빈 지갑 숨기기",recheck:"재확인",contributors:"기여자",license:"라이선스",reset_key:"재설정 키",reset_password:"비밀번호 재설정",border_choices:"테두리 선택사항",select_all:"모두 선택",nfc_supported:"NFC 지원됨",nfc_not_supported:"NFC 지원되지 않음",expire_date:"만료 날짜:",hash:"해시:",welcome_lnbits:"LNbits에 오신 것을 환영합니다.",setup_su_account:"슈퍼유저 계정을 아래에 설정하십시오.",create_ticker_converter:"통화 티커 변환기 생성",enable_audit:"감사 활성화",recommended:"추천됨",audit_desc:"지정된 필터에 따라 HTTP 요청 기록",audit_record_req:"레코드 요청 본문",audit_record_warning:"경고:",audit_record_req_warning_1:"암호와 같은 기밀 데이터가 기록됩니다.",audit_record_req_warning_2:"요청 본문은 큰 크기를 가질 수 있습니다.",audit_record_use:"주의해서 사용하십시오.",audit_ip:"IP 주소 기록",audit_ip_desc:"클라이언트의 IP 주소를 기록하십시오.",audit_path_params:"경로 매개변수 기록",audit_query_params:"쿼리 매개변수 기록",audit_http_methods:"HTTP 메서드 포함",audit_http_methods_hint:"포함할 HTTP 메서드 목록. 목록이 비어 있으면 모두 포함됩니다.",audit_http_methods_label:"HTTP 방법",audit_resp_codes:"HTTP 응답 코드 포함",audit_resp_codes_hint:"포함할 HTTP 코드 목록(정규 표현식 일치). 빈 목록은 모두를 의미합니다. 예: 4.*, 5.*",audit_resp_codes_label:"HTTP 응답 코드 (정규식)",audit_paths:"포함 경로",audit_paths_hint:"포함할 경로 목록 (정규 표현식 일치). 빈 목록은 모두를 의미합니다.",audit_paths_label:"HTTP 경로 (정규식)",audit_paths_exclude:"제외 경로",audit_paths_exclude_hint:"제외할 경로 목록 (정규 표현식 일치). 빈 목록은 없음을 의미합니다.",audit_paths_exclude_label:"HTTP 경로 (정규식)",exchange_providers:"거래소 공급자",admin_extensions:"관리자 확장 프로그램",admin_extensions_label:"관리자 확장 기능",admin_extensions_hint:"확장 기능은 관리자 권한이 있는 사용자만 사용할 수 있습니다.",user_default_extensions:"사용자 기본 확장자",user_default_extensions_label:"사용자 확장 기능",user_default_extensions_hint:"사용자에게 기본적으로 활성화될 확장 기능.",miscellanous:"기타",misc_disable_extensions:"확장 프로그램 사용 안 함",misc_disable_extensions_label:"모든 확장 프로그램 비활성화",misc_hide_api:"API 숨기기",misc_hide_api_label:"지갑 API 숨기기, 확장 기능은 준수할 수 있음",wallets_management:"지갑 관리",funding_source_info:"자금 출처 정보",funding_source:"자금 출처: {wallet_class}",node_balance:"노드 잔액: {balance} 사토시",lnbits_balance:"LNbits 잔액: {balance} sats",funding_reserve_percent:"예약 비율: {percent} %",node_management:"노드 관리",node_management_not_supported:"활성화된 자금 출처에 의해 노드 관리는 지원되지 않습니다.",toggle_node_ui:"노드 UI",toggle_public_node_ui:"공개 노드 UI",toggle_transactions_node_ui:"트랜잭션 탭 (대형 CLN 노드에서는 비활성화)",invoice_expiry:"송장 만료",invoice_expiry_label:"송장 만료 (초)",fee_reserve:"수수료 예약",fee_reserve_msats:"msats의 예약 수수료",fee_reserve_percent:"예약 수수료(%)",server_management:"서버 관리",base_url:"기본 URL",base_url_label:"서버의 정적/기본 URL",authentication:"인증",auth_token_expiry_label:"토큰 만료 시간(분)",auth_token_expiry_hint:"토큰이 만료되기까지 남은 시간(분)",auth_allowed_methods_label:"허용된 인증 방법",auth_allowed_methods_hint:"인증 방법 선택",auth_nostr_label:"Nostr 요청 URL",auth_nostr_hint:"클라이언트가 로그인하는 데 사용할 절대 URL.",auth_google_ci_label:"Google 클라이언트 ID",auth_google_ci_hint:"허가된 리디렉션 URI에 https://{domain}/api/v1/auth/google/token이 포함되어 있는지 확인하세요.",auth_google_cs_label:"Google 클라이언트 시크릿",auth_gh_client_id_label:"GitHub 클라이언트 ID",auth_gh_client_id_hint:"인가 콜백 URL이 https://{domain}/api/v1/auth/github/token으로 설정되어 있는지 확인하십시오.",auth_gh_client_secret_label:"GitHub 클라이언트 비밀키",auth_keycloak_label:"Keycloak 디스커버리 URL",auth_keycloak_ci_label:"키클록 클라이언트 ID",auth_keycloak_ci_hint:"승인 콜백 URL이 https://{domain}/api/v1/auth/keycloak/token으로 설정되어 있는지 확인하십시오.",auth_keycloak_cs_label:"Keycloak 클라이언트 시크릿",auth_keycloak_custom_org_label:"Keycloak 사용자 정의 조직",auth_keycloak_custom_icon_label:"Keycloak 사용자 정의 아이콘 (URL)",auth_oidc_label:"OIDC 디스커버리 URL",auth_oidc_ci_label:"OIDC 클라이언트 ID",auth_oidc_ci_hint:"승인 콜백 URL이 https://{domain}/api/v1/auth/oidc/token으로 설정되어 있는지 확인하십시오.",auth_oidc_cs_label:"OIDC 클라이언트 시크릿",auth_oidc_custom_org_label:"OIDC 사용자 정의 조직 이름 (예: Zitadel, Authentik)",auth_oidc_custom_icon_label:"OIDC 사용자 정의 아이콘 (URL)",currency_settings:"통화 설정",allowed_currencies:"허용되는 통화",allowed_currencies_hint:"사용 가능한 법정 화폐의 수를 제한하십시오.",default_account_currency:"기본 계좌 통화",default_account_currency_hint:"회계 기본 통화",service_fee_label:"서비스 수수료 (%)",service_fee_hint:"트랜잭션당 수수료 (%)",service_fee_max_label:"서비스 수수료 최대 (sats)",service_fee_max_hint:"(사토시)로 부과할 최대 서비스 요금",fee_wallet:"수수료 지갑",fee_wallet_label:"수수료 지갑 (지갑 ID)",fee_wallet_hint:"자금을 보낼 지갑 ID",disable_fee:"수수료 비활성화",disable_fee_internal:"내부 결제에 대한 서비스 요금 비활성화",disable_fee_internal_desc:"내부 라이트닝 결제에 대한 서비스 요금 비활성화",ui_management:"UI 관리",ui_site_title:"사이트 제목",ui_site_tagline:"사이트 태그라인",ui_elements_enable:"홈페이지의 요소 활성화",ui_elements_disable:"홈페이지의 요소 비활성화",ui_toggle_elements_tip:"'에 의해 구동됨' 등의 홈페이지 요소 제거",ui_site_description:"사이트 설명",ui_site_description_hint:"일반 텍스트, Markdown, 또는 원시 HTML을 사용하십시오.",ui_default_wallet_name:"기본 지갑 이름",lnbits_wallet:"LNbits 지갑",denomination:"액면가",denomination_hint:"FakeWallet 토큰의 이름",ui_qr_code_logo:"QR 코드 로고",ui_qr_code_logo_hint:"QR 코드의 로고 이미지 URL",ui_custom_badge:"맞춤 배지",ui_custom_badge_label:"사용자 지정 배지 '주의하여 사용 - LNbits 지갑은 여전히 BETA 상태입니다'",ui_custom_badge_color_label:"사용자 정의 배지 색상",themes:"테마",themes_hint:"사용자가 사용할 수 있는 테마 선택",custom_logo:"맞춤 로고",custom_logo_hint:"로고 이미지의 URL",ad_space_title:"광고 공간 제목",ad_space_title_label:"지원:",ad_slots:"광고 슬롯",ad_slots_hint:"광고 URL 및 이미지 파일 경로를 CSV 형식으로, 확장자는 준수할 수 있습니다.",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"광고 활성화됨",ads_disabled:"광고 비활성화됨",user_management:"사용자 관리",admin_users:"관리자 사용자",admin_users_hint:"관리자 권한이 있는 사용자",admin_users_label:"사용자 ID",allowed_users:"허용된 사용자",allowed_users_hint:"LNbits는 이 사용자들만 사용할 수 있습니다.",allowed_users_label:"사용자 ID",allow_creation_user:"새 사용자 생성 허용",allow_creation_user_desc:"색인 페이지에서 새 사용자 생성 허용",components:"구성 요소",long_running_endpoints:"최상위 5개의 장시간 실행 엔드포인트",http_request_methods:"HTTP 요청 메서드",http_response_codes:"HTTP 응답 코드",request_details:"요청 세부사항",http_request_details:"HTTP 요청 세부사항"},window.localisation.fi={confirm:"Kyllä",server:"Palvelin",theme:"Teema",site_customisation:"Sivuston kustomointi",funding:"Rahoitus",users:"Käyttäjät",audit:"Seuranta",api_watch:"API-seuranta",apps:"Sovellukset",channels:"Kanavat",transactions:"Tapahtumat",dashboard:"Ohjauspaneeli",node:"Solmu",export_users:"Vie käyttäjät",no_users:"Käyttäjiä ei löytynyt",total_capacity:"Kokonaiskapasiteetti",avg_channel_size:"Keskimääräisen kanavan kapasiteetti",biggest_channel_size:"Suurimman kanavan kapasiteetti",smallest_channel_size:"Pienimmän kanavan kapasiteetti",number_of_channels:"Kanavien lukumäärä",active_channels:"Aktiivisia kanavia",connect_peer:"Yhdistä naapuriin",connect:"Yhdistä",reconnect:"Uudista yhteys",open_channel:"Avaa kanava",open:"Avaa",close_channel:"Sulje kanava",close:"Sulje",restart:"Palvelimen uudelleen käynnistys",image_library:"Kuvakirjasto",save:"Tallenna",save_tooltip:"Tallenna muutokset",credit_debit:"Hyvitä / Veloita",credit_hint:"Hyväksy painamalla Enter (negatiivisetkin arvot ovat sallittuja)",credit_label:"Hyvitä / Veloita tilille {denomination}-varoja",credit_ok:"Virtuaalivarojen ({amount} sat) hyvitys-/veloitustapahtuma onnistui. Maksukyky riippuuu rahoituslähteen todellisista varoista.",restart_tooltip:"Uudelleenkäynnistä palvelu muutosten käyttöönottamiseksi",add_funds_tooltip:"Lisää varoja lompakkoon",reset_defaults:"Palauta oletusasetukset",reset_defaults_tooltip:"Poista kaikki asetusten muutokset ja palauta järjestelmän oletusasetukset.",download_backup:"Lataa tietokannan varmuuskopio",name_your_wallet:"Nimeä lompakkosi {name}",paste_invoice_label:"Liita lasku, maksupyyntö tai LNURL-koodi*",lnbits_description:"Kevyt ja helppokäyttöinen LNbits voi käyttää rahoituslähteinään mitä vain Lightning-palveluita ja jopa LNbits-palvelua! Voit käyttää sitä itsenäisesti ja helposti tarjota erilaisia Lightning-palveluita. Pystyt luomaan sillä salamaverkkolompakoita eikä niiden määrää ole rajoitettu. Jokaiselle lompakolle saat yksilölliset API-avaimet. Varojen osittaminen tekee siitä erittäin kätevän varojen hallinnassa sekä myös ohjelmistokehityksen työkalun. Laajennukset lisäävät LNbits:in toiminnallisuuksia. Näinpä voit helposti testailla useita erilaisia ja viimeisimpiä salamaverkon teknologioita. Laajennuksien kehittämisen olemme pyrkineet tekemään mahdollisimman helpoksi pitämällä LNbits:in ilmaisena OpenSource-projektina. Kannustamme kaikkia kehittämään ja jakelemaan omia laajennuksia!",export_to_phone:"Käytä puhelimessa lukemalla QR-koodi",export_to_phone_desc:"Tämä QR-koodi sisältää URL-osoitteen, jolla saa lompakkoosi täydet valtuudet. Voit lukea sen puhelimellasi ja avata sillä lompakkosi. Voit myös lisätä lompakkosi selaimella käytettäväksi PWA-sovellukseksi puhelimen aloitusruudulle. ",access_wallet_on_mobile:"Mobiili käyttö",wallet:"Lompakko:",wallet_name:"Lompakon nimi",wallets:"Lompakot",add_wallet:"Lisää lompakko",add_new_wallet:"Lisää uusi lompakko",pin_wallet:"Kiinnitä lompakko",delete_wallet:"Poista lompakko",delete_wallet_desc:"Lompakko poistetaan pysyvästi. Siirrä lompakosta varat ennalta muualle, sillä tämä toiminto on PERUUTTAMATON!",rename_wallet:"Nimeä lompakko uudelleen",update_name:"Tallenna",fiat_tracking:"Käytettävä valuutta",fiat_providers:"Valuutan välittäjät",currency:"Valuutta",update_currency:"Tallenna",press_to_claim:"Lunasta varat painamalla tästä",claim_desc:"Näyttää että sinulla on lunastamattomia bitcoin varoja, mutta sinulla ei vielä ole lompakkoa. Lunasta varat allaolevaa nappia painamalla, ja sinulle luodaan lompakko.",donate:"Lahjoita",view_github:"Näytä GitHub:ssa",voidwallet_active:"VoidWallet on aktiivinen. Se ei tue maksutapahtumia!",use_with_caution:"KÄYTÄ VAROEN - BETA-ohjelmisto on käytössä palvelussa: {name}",service_fee_tooltip:"LNbits palvelimen ylläpitäjä veloittaa lähtevästä maksusta palvelumaksun.",toggle_darkmode:"Tumma näkymä",payment_reactions:"Maksureaktiot",view_swagger_docs:"Näytä LNbits Swagger API-dokumentit",api_docs:"API-dokumentaatio",api_keys_api_docs:"Solmun URL, API-avaimet ja -dokumentaatio",lnbits_version:"LNbits versio",runs_on:"Mukana menossa",paste:"Liitä",paste_from_clipboard:"Liitä leikepöydältä",paste_request:"Liitä pyyntö",create_invoice:"Laskuta",camera_tooltip:"Kuvaa lasku tai QR-koodi",export_csv:"Vie CSV-tiedostoon",export_csv_details:"Vie CSV-tiedostoon lisätietoineen",chart_tooltip:"Näytä kaaviokuva",pending:"Odottaa",copy_invoice:"Kopioi lasku",withdraw_from:"Nosta kohteesta",cancel:"Peruuta",scan:"Scannaa",read:"Lue",write:"Kirjoita",pay:"Maksa",memo:"Kuvaus",date:"Päiväys",path:"Path",payment_processing:"Maksua käsitellään...",not_enough_funds:"Varat eivät riitä!",search_by_tag_memo_amount:"Etsi tunnisteella, muistiolla tai määrällä",invoice_waiting:"Lasku odottaa maksua",payment_received:"Maksu vastaanotettu",payment_sent:"Maksu lähetetty",payment_failed:"Maksu epäonnistui",receive:"vastaanota",send:"lähetä",outgoing_payment_pending:"Lähtevä maksu odottaa",drain_funds:"Tyhjennä varat",drain_funds_desc:"Tämä LNURL-withdraw -tyyppinen QR-koodi on tarkoitettu kaikkien varojen imurointiin lompakosta. ÄLÄ JAA SITÄ KENELLEKÄÄN! Se on balanceCheck- ja balanceNotify-toimintojen kanssa yhteensopiva, joten sitä voi käyttää lompakon tyhjentämiseen ensimmäisen käytön jälleen jatkuvasti.",i_understand:"Vakuutan ymmärtäväni",copy_wallet_url:"Kopioi lompakon URL",disclaimer_dialog_title:"Tärkeää!",disclaimer_dialog:"Sinun *PITÄÄ TALLETTAA* kirjautumistietosi turvallisesta ja helposti saataville, jotta pääset jatkossa kirjautumaan lompakkoosi! Löydät kirjautumistiedot Tilin asetukset -sivulta. Kukaan ei ota mitään vastuuta varojen säilymisestä tai niiden käytettävyyden takaamisesta.",no_transactions:"Lompakossa ei ole yhtään tapahtumaa",manage:"Hallinnointi",exchanges:"Vaihtokurssit",extensions:"Laajennukset",no_extensions:"Laajennuksia ei ole asennettu :(",created:"Luotu",search_extensions:"Etsi laajennuksia",search_wallets:"Etsi lompakkoa",extension_sources:"Laajennuslähteet",ext_sources_hint:"Lähteet joista laajennuksia voi ladata",ext_sources_label:"Lähde-URL (käytä vain virallista LNbits tai muuta luotettaa laajennuslähdettä)",warning:"Varoitus",repository:"Laajennuksien lähde",confirm_continue:"Haluatko varmasti jatkaa?",manage_extension_details:"Asenna/Poista laajennus",install:"Asenna",uninstall:"Poista",drop_db:"Poista tiedot",enable:"Ota käyttöön",enabled:"Käytössä",pay_to_enable:"Maksa ottaaksesi käyttöön",enable_extension_details:"Ota laajennus käyttöön tälle käyttäjälle",disable:"Poista käytöstä",delete:"Poista",installed:"Asennettu",activated:"Käytössä",deactivated:"Poissa käytöstä",release_notes:"Julkaisutiedot",activate_extension_details:"Aseta/Poista laajennus käyttäjien saatavilta",featured:"Esittelyssä",all:"Kaikki",only_admins_can_install:"(Vain pääkäyttäjät voivat asentaa laajennuksia)",admin_only:"Pääkäyttäjille",new_version:"Uusi versio",extension_depends_on:"Edellyttää:",extension_rating_soon:"Arvostelut on tulossa pian",extension_installed_version:"Nykyinen versio",extension_uninstall_warning:"Olet poistamassa laajennuksen kaikilta käyttäjiltä.",uninstall_confirm:"Kyllä, poista asennus",extension_db_drop_info:"Kaikki laajennuksen tallettama tieto poistetaan pysyvästi. Poistoa ei voi jälkikäteen peruuttaa!",extension_db_drop_warning:"Olet tuhoamassa laajennuksen tallettamat tiedot. Vahvista poisto kirjoittamalla viivalle seuraavassa näkyvä laajennuksen nimi:",extension_required_lnbits_version:"Tämä laajennus vaatii vähintään LNbits-version",min_version:"Minimi (sisältyy)",max_version:"Enimmäismäärä (ei sisälly)",payment_hash:"Maksun tiiviste",fee:"Kulu",amount:"Määrä",amount_limits:"Määrien rajat",amount_sats:"Määrä (sat)",faucest_wallet:"Faucet Wallet",faucest_wallet_desc_1:"Each time a payment is confirmed by the {provider} provider funds will be subtracted from this wallet.",faucest_wallet_desc_2:"This helps monitor all {provider} payments and their status.",faucest_wallet_desc_3:"This wallet must be topped up with the amount of sats that the admin is willing to offer in exchange for the fiat currency.",faucest_wallet_desc_4:"If this wallet is configured, but is empty, the {provider} payments will not be processed.",faucest_wallet_desc_5:"This wallet can eventually get to a negative balance if parallel fiat payments are made.",faucest_wallet_id:"Faucet Wallet ID (optional)",faucest_wallet_id_hint:"Wallet ID to use for the faucet. It will be used to send the funds to the user.",tag:"Tunniste",unit:"Yksikkö",description:"Kuvaus",expiry:"Vanhenee",webhook:"Webhook",webhook_url:"Webhook URL",webhook_url_hint:"Webhook URL to send the payment details to. It will be called when the payment is completed.",webhook_events_list:"The following events must be supported by the webhook:",webhook_stripe_description:"One the stripe side you must configure a webhook with a URL that points to your LNbits server.",payment_proof:"Maksun varmenne",update:"Päivitä",update_available:"Saatavilla on päivitys {version}-versioon!",update_available:"Rahoituslähteet",latest_update:"Käytössä oleva versio {version}, on viimeisin saatavilla oleva.",notifications:"Tiedotteet",notifications_configure:"Määritä tiedotukset",notifications_nostr_config:"Nostr-määritykset",notifications_enable_nostr:"Kaytä Nostr:ia",notifications_enable_nostr_desc:"Lähetä tietodukset Nostr:in kautta",notifications_nostr_private_key:"Nostr-yksityisavain",notifications_nostr_private_key_desc:"Yksityinen avain (hex tai nsec) Nostr-viestien lähettämisen allekirjoitukseen",notifications_nostr_identifiers:"Nostr-tunnisteet",notifications_nostr_identifiers_desc:"Lista tunnisteista kenelle tiedotukset lähetetään",notifications_telegram_config:"Telegram-määritykset",notifications_enable_telegram:"Käytä Telegram:ia",notifications_enable_telegram_desc:"Lähetä tietodukset Telegram:in kautta",notifications_telegram_access_token:"Access Token",notifications_telegram_access_token_desc:"Telegram botin Access token",notifications_chat_id:"Keskustelun tunnus",notifications_chat_id_desc:"Keskustelun tunnus minne tiedotukset lähetetään",notifications_email_config:"Sähköposti määritykset",notifications_enable_email:"Käytä sähköpostia",notifications_enable_email_desc:"Lähetä tiedotteet sähköpostilla",notifications_send_test_email:"Lähetä testiposti",notifications_send_email:"Lähetä sähköpostiosoitteella",notifications_send_email_desc:"Lähettäjänä näkyvä sähköpostiosoite",notifications_send_email_username:"Käyttäjätunnus",notifications_send_email_username_desc:"Käyttäjätunnus, mikäli tyhjä, käytetään sähköpostiosoitetta",notifications_send_email_password:"Lähtevän sähköpostin salasana",notifications_send_email_password_desc:"Salasana lähettävälle sähköpostille",notifications_send_email_server_port:"Lähtevän sähköpostin SMTP-portti",notifications_send_email_server_port_desc:"SMTP-palvelimen portti",notifications_send_email_server:"Lähtevän sähköpostin SMTP-palvelin",notifications_send_email_server_desc:"SMTP-palvelin jonka kautta sähköpostit lähetetään",notifications_send_to_emails:"Sähköpostien vastaanottaja",notifications_send_to_emails_desc:"Kenelle sähköpostit lähetetään",notification_settings_update:"Asetuksia päivitetty",notification_settings_update_desc:"Tiedota kun palvelimen asetuksia on päivitetty",notification_server_start_stop:"Palvelimen Käynnystys/Sammutus",notification_server_start_stop_desc:"Tiedota kun palvelin on käynnistetty tai sammutettu",notification_watchdog_limit:"Watchdog-raja -tiedote",notification_watchdog_limit_desc:"Tiedota kun watchdog-raja on saavutettu (ei vaikuta rahoituslähteeseen)",notification_server_status:"Palvelimen tila",notification_server_status_desc:"Lähetä säännölliset tiedotteet palvelimen tilasta (anna tiedotusväli tunteina)",notification_incoming_payment:"Saapuvat maksut",notification_incoming_payment_desc:"Tiedota kun lompakon vastaanottaman ja saapuvan maksun määrä ylittää rajan (sat)",notification_outgoing_payment:"Lähtevät maksut",notification_outgoing_payment_desc:"Tiedota kun lompakon lähettävän ja maksettavan maksun määrä ylittää rajan (sat)",notification_credit_debit:"Hyvitys / Veloitus",notification_credit_debit_desc:"Tiedota kun Superuser tekee lompakon hyvitys- tai veloitustapahtumia",notification_balance_delta_changed:"Saldon määrän muutos",notification_balance_delta_changed_desc:"Tiedota kun solmun ja LNbits saldojen eri poikkeaa edes yhden satoshin. Tämä tarkastus tehdään joka minuuttu.",enable_watchdog:"Watchdog-kytkin",enable_watchdog_desc:"Tämän ollessa käytössä, ja solmun varojen laskiessa alle LNbits-varojen määrän, otetaan automaattisesti käyttöön VoidWallet. Päivityksen jälkeen tämä asetus pitää tarkastaa uudelleen.",watchdog_interval:"Watchdog-aikaväli",watchdog_interval_desc:"Tällä määritetään kuinka usein taustatoiminto tarkistaa varojen Delta-muutokset [node_balance - lnbits_balance] killswitch-signaalille. Hakujen väli ilmoitetaan minuutteina.",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Mikäli rahoituslähteen saldo laskee alle LNbits kokonaissaldon, muutetaan rahoituslähteeksi heti VoidWallet. Päivittämisen jälkeen asetus pitää päivittää manuaalisestsi.",status:"Tilanne",notification_source:"Tiedotteiden lähde",notification_source_label:"Lähde-URL (käytä ainoastaan LNbits:iä tai muuta luotettavaa lähdettä)",more:"näytä lisää",more_count:"näytä {count} lisää",less:"supista",releases:"Julkaisut",watchdog:"Watchdog",server_logs:"Palvelimen lokit",ip_blocker:"Palvelimen suojaus IP-osoitesuodattimella",security:"Turvallisuus",security_tools:"Turvallisuus työkalut",block_access_hint:"Estä pääsy IP-osoitteen perusteella",allow_access_hint:"Salli pääsy IP-osoitteen perusteella (ohittaa estot)",enter_ip:"Anna IP ja paina +",rate_limiter:"Toiston rajoitin",callback_url_rules:"Callback URL -säännöt",enter_callback_url_rule:"Anna URL-sääntö regex-muodossa ja paina enter",callback_url_rule_hint:"Callback URL:it (kuten LNURL) tarkistetaan kaikkien näiden sääntöjen mukaisesti. Jos sääntöjä ei ole määritetty, kaikki URL:it ovat sallittuja.",wallet_limiter:"Lompakon käyttörajoitin",wallet_config:"Wallet Config",wallet_charts:"Wallet Charts",wallet_limit_max_withdraw_per_day:"Päivittäin nostettavissa sat maksimi (0 poistaa käytöstä)",wallet_max_ballance:"Maksimisaldo (sat) (0 poistaa käytöstä)",wallet_limit_secs_between_trans:"Tapahtumien välinen minimi (sec) (0 poistaa käytöstä)",only_incoming_payments_allowed:"Vain saapuvat maksut sallittuna",disable_outgoing_payments:"Poista lähtevät maksut käytöstä",number_of_requests:"Pyyntöjen lukumäärä",time_unit:"aikayksikkö",minute:"minuutti",settings:"Asetukset",second:"sekunti",hour:"tunti",disable_server_log:"Piilota palvelimen loki",enable_server_log:"Näytä palvelimen loki",coming_soon:"Ominaisuus on tulossa pian",session_has_expired:"Käyttämätön sessio on vanhentunut. Kirjaudu uudelleen.",instant_access_question:"perinteinen kirjautuminen",login_with_user_id:"Kirjaudu käyttäjä-ID:llä",or:"tai",create_new_wallet:"Avaa uusi lompakko",delete_all_wallets:"Poista kaikki lompakot",confirm_delete_all_wallets:"Oletko todellakin varma, että haluat poistaa käyttäjältä KAIKKI lompakot?",login_to_account:"Kirjaudu käyttäjänimellä",create_account:"Luo tili",account_settings:"Tilin asetukset",signin_with_oauth:"Login with",signin_with_oauth_or:"or Login with",signin_with_nostr:"Kirjaudu Nostr:lla",signin_with_google:"Kirjaudu Google-tunnuksella",signin_with_github:"Kirjaudu GitHub-tunnuksella",signin_with_custom_org:"Kirjaudu {custom_org}-palvelulla",username_or_email:"Käyttäjänimi tai sähköposti",password:"Anna uusi salasana",password_config:"Salasanan määritys",password_repeat:"Toista uusi salasana",update_password:"Päivitä salasana",change_password:"Vaihda salasana",update_credentials:"Päivitä käyttöoikeustiedot",update_pubkey:"Päivitä julkinen avain",nostr_pubkey_tooltip:"Syötä tämän käyttäjän julkinen Nostr avain (hex arvona)",set_password:"Aseta salasana",set_password_tooltip:"Aseta käyttäjätunnukselle salasana",invalid_password:"Salasanassa tulee olla vähintään kahdeksan merkkiä",invalid_password_repeat:"Salasanat eivät täsmää",reset_key_generated:"Salasanan vaihtoavain on luotu.",reset_key_copy:"Kopioi vaihto-URL leikepöydälle painamalla OK.",login:"Kirjaudu",register:"Rekisteröidy",username:"Käyttäjänimi",pubkey:"Julkinen avain",user_id:"Käyttäjä tunnus",id:"tunnus",email:"Sähköposti",first_name:"Etunimi",last_name:"Sukunimi",picture:"Kuva",verify_email:"Vahvista sähköposti",account:"Tili",update_account:"Päivitä tiliä",invalid_username:"Virheellinen käyttäjänimi",auth_provider:"Tunnistamisen toimittaja",my_account:"Tilini",existing_account_question:"Onkohan sinulla jo tili?",background_image:"Taustakuva",back:"Takaisin",logout:"Poistu",look_and_feel:"Kieli ja värit",endpoint:"Endpoint",api:"API",api_token:"API Token",api_tokens:"API Tokens",access_control_list:"Access Control List",access_control_list_admin_warning:"This is an admin account. The generated tokens will have admin privileges.",new_api_acl:"New Access Control List",api_token_id:"Token Id",toggle_gradient:"Toggle Gradient",gradient_background:"Gradient Background",language:"Kieli",color_scheme:"Väriteema",visible_wallet_count:"Näytettävien lompakkojen määrä",admin_settings:"Pääkäyttäjän asetukset",extension_cost:"Tämä laajennus edellyttää vähintään {cost} sat maksua.",extension_paid_sats:"Olet jo maksanut {paid_sats} satsia.",release_details_error:"Ei voi hakea julkaisun tietoja.",pay_from_wallet:"Maksa lompakosta",pay_with:"Maksa {provider}:lla",select_payment_provider:"Valitse maksun välittäjä",wallet_required:"Lompakko *",show_qr:"Näytä QR",retry_install:"Yritä asennusta uudelleen",new_payment:"Luo uusi maksu",update_payment:"Päivitä maksu",already_paid_question:"Kenties maksoit jo?",sell:"Myy",sell_require:"Pyydä maksua laajennuksen käytöstä",sell_info:"{name} -laajennuksen aktivointi edellyttää vähintään {amount} sat maksua.",hide_empty_wallets:"Piilota tyhjät lompakot",recheck:"Tarkista uudelleen",check:"Tarkista",check_connection:"Tarkista yhteys",check_webhook:"Tarkista Webhook",contributors:"Avustajat",license:"Lisenssi",reset_key:"Vaihda avain",reset_password:"Vaihda salasana",border_choices:"Reunuksen vaihtoehdot",select_all:"Valitse kaikki",nfc_supported:"NFC on tuettu",nfc_not_supported:"NFC:tä ei tueta",expire_date:"Vanhenemispäivämäärä:",hash:"Tiiviste:",welcome_lnbits:"Tervetuloa LNbits-palveluun",setup_su_account:"Määritä Superuser-tili alta.",create_ticker_converter:"Luo valuuttamuuntimen Ticker",enable_audit:"Ota seuranta käyttöön",recommended:"Suositeltu",audit_desc:"Tallenna HTTP-pyyntöjä seuraavien suodattimien mukaisesti",audit_record_req:"Tallenna pyynnön Body",audit_record_warning:"Varoitus:",audit_record_req_warning_1:"Luottamukselliset tiedot (kuten salasanat) tallennetaan.",audit_record_req_warning_2:"Body-datamäätä voi olla iso.",audit_record_use:"Käytä varoen!",audit_ip:"Tallenna IP-osoite",audit_ip_desc:"Tallenna asiakkaan IP-osoite",audit_path_params:"Tallenna Path-parametrit",audit_query_params:"Tallenna Query-parametrit",audit_http_methods:"Tallenna HTTP-menetelmät",audit_http_methods_hint:"Luettelo mukaan otettavista HTTP-menetelmistä. Tyhjä luettelo tallettaa kaikki.",audit_http_methods_label:"HTTP-metodit",audit_resp_codes:"Tallenna HTTP-vastauskoodit",audit_resp_codes_hint:"HTTP-koodien lista, jotka sisällytetään (regex-match). Tyhjä luettelo tallettaa kaikki. Esim: 4.*, 5.*",audit_resp_codes_label:"HTTP-vastauskoodi (säännöllinen lauseke)",audit_paths:"Sisällytä polut",audit_paths_hint:"Luettelo poluista, jotka sisällytetään (regex-vastaavuus). Tyhjä luettelo tarkoittaa kaikkia.",audit_paths_label:"HTTP-polku (regex)",audit_paths_exclude:"Ohita polut",audit_paths_exclude_hint:"Lista poluista, jotka jätetään pois (regex-vastaavuus). Tyhjällä listalla mitään ei jätetä pois.",audit_paths_exclude_label:"HTTP-polku (regex)",exchange_providers:"Vaihtokurssin tarjoajat",admin_extensions:"Pääkäyttäjän laajennukset",admin_extensions_label:"Pääkäyttäjän laajennukset",admin_extensions_hint:"Laajennuksia voi käyttää vain käyttäjä, jolla on pääkäyttäjäoikeudet",user_default_extensions:"Käyttäjän oletuslaajennukset",user_default_extensions_label:"Käyttäjän laajennukset",user_default_extensions_hint:"Laajennukset, jotka otetaan oletusarvoisesti käyttöön kaikille käyttäjille.",miscellanous:"Sekalaiset",misc_disable_extensions:"Poista laajennukset käytöstä",misc_disable_extensions_label:"Poista kaikki laajennukset käytöstä",misc_hide_api:"Piilota API",misc_hide_api_label:"Piilottaa lompakon rajapinnan, laajennukset voivat valita välittävätkö tästä asetuksesta",wallets_management:"Lompakoiden hallinta",funding_source_info:"Rahoituslähteen tiedot",funding_source:"Rahoituslähde: {wallet_class}",node_balance:"Solmun saldo: {balance} sats",lnbits_balance:"LNbits-saldo: {balance} sat",funding_reserve_percent:"Omavaraisuusaste: {percent} %",node_management:"Solmun hallinta",node_management_not_supported:"Solmun hallinta ei ole mahdollista valitun rahoituslähteen kanssa.",toggle_node_ui:"Solmun käyttöliittymä",toggle_public_node_ui:"Julkinen näkymä solmun tietoihin",toggle_transactions_node_ui:"Tapahtumat-välilehti (Poista käytöstä suurilla CLN-solmuilla)",invoice_expiry:"Laskun vanhenemisaika",invoice_expiry_label:"Laskun vanhentuminen (sekunteina)",fee_reserve:"Kuluvaraus",fee_reserve_percent:"Kuluvaraus prosentteina",fee_reserve_msats:"Kuluvaraus milli-sat",reserve_fee_in_percent:"Kuluvaraus prosentteina",payment_wait_time:"Maksun odotusaika (sekuntia)",payment_wait_time_desc:"Kuinka pitkään maksua odotetaan saapuvaksi, ennen kuin se merkitään Odotetaan-tilaan. Aseta pidemmäksi käytettäessä HODL-laskuja, Boltz-palvelua, tms",server_management:"Palvelimen hallinta",base_url:"Palvelimen URL-osoite",base_url_label:"Palvelun staattinen pohja-URL",authentication:"Käyttäjän todennus",auth_token_expiry_label:"Kirjautumisen vanhentumisaika minuutteina",auth_token_expiry_hint:"Aika minuuteissa, jossa kirjautuminen vanhenee",auth_allowed_methods_label:"Sallitut kirjautumismenetelmät",auth_allowed_methods_hint:"Valitse kirjautumismenetelmät",auth_nostr_label:"Nostr kutsujen URL",auth_nostr_hint:"Asiakkaiden kirjautumiseen käyttämä absoluuttinen URL-osoite.",auth_google_ci_label:"Google-asiakastunnus",auth_google_ci_hint:"Varmista, että valtuutetut uudelleenohjaus-URI:t sisältävät https://{domain}/api/v1/auth/google/token",auth_google_cs_label:"Google-asiakassalasana",auth_gh_client_id_label:"GitHub-asiakastunnus",auth_gh_client_id_hint:"Varmista, että valtuutuksen paluuosoite-URL on asetettu osoitteeseen https://{domain}/api/v1/auth/github/token",auth_gh_client_secret_label:"GitHub-asiakassalaisuusavain",auth_keycloak_label:"Keycloak-discovery-URL",auth_keycloak_ci_label:"Keycloak-asiakastunnus",auth_keycloak_ci_hint:"Varmista, että valtuutuksen palautus-URL on asetettu muotoon https://{domain}/api/v1/auth/keycloak/token",auth_keycloak_cs_label:"Keycloak-asiakassalasana",auth_keycloak_custom_org_label:"Valinnainen Keycloak-organisaatio",auth_keycloak_custom_icon_label:"Valinnainen Keycloak-kuvake (URL)",auth_oidc_label:"OIDC-discovery-URL",auth_oidc_ci_label:"OIDC-asiakastunnus",auth_oidc_ci_hint:"Varmista, että valtuutuksen palautus-URL on asetettu muotoon https://{domain}/api/v1/auth/oidc/token",auth_oidc_cs_label:"OIDC-asiakassalasana",auth_oidc_custom_org_label:"OIDC mukautetun organisaation nimi (esim. Zitadel, Authentik)",auth_oidc_custom_icon_label:"Valinnainen OIDC-kuvake (URL)",currency_settings:"Valuutta-asetukset",allowed_currencies:"Käytettävät valuutat",allowed_currencies_hint:"Valitse käytettävissä olevat fiat-valuutat",default_account_currency:"Tilin oletusvaluutta",default_account_currency_hint:"Kirjanpidon oletusvaluutta",min_incoming_payment_amount:"Pienin vastaanotettava maksun määrä",min_incoming_payment_amount_desc:"Pienin maksun määrä jolle voi luoda laskun",max_incoming_payment_amount:"Saapuvan maksun enimmäismäärä",max_incoming_payment_amount_desc:"Enimmäismäärä jonka voi laskuttaa",max_outgoing_payment_amount:"Lähtevän maksun enimmäismäärä",max_outgoing_payment_amount_desc:"Enimmäismäärä jonka voi maksaa",service_fee:"Palvelumaksut",service_fee_label:"Palvelumaksu (%)",service_fee_hint:"Tapahtumastakohtainen palvelumaksu (%)",service_fee_max:"Palvelumaksun enimmäismäärä",service_fee_max_label:"Palvelumaksu max (sat)",service_fee_max_hint:"Suurin veloitettava palvelumaksu (sat)",fee_wallet:"Palvelumaksujen lompakko",fee_wallet_label:"Palvelumaksujen tilityslompakko (lompakon tunnus)",fee_wallet_hint:"Lompakon tunnus, johon palvelumaksut tilitetään",disable_fee:"Poista maksu käytöstä",disable_fee_internal:"Poista palvelumaksu sisäisiltä maksuilta",disable_fee_internal_desc:"Poista palvelumaksu sisäisiltä salamaksuilta",ui_management:"Käyttöliittymän hallinta",ui_site_title:"Sivuston nimi",ui_changing_remove_lnbits_elements:" (tämän muuttamalla LNbits elementit poistuvat kotisivulla ja alareunasta)",ui_site_tagline:"Sivuston iskulause",ui_elements_enable:"Ota käyttöön elementit etusivulla/alareunassa",ui_elements_disable:"Poista elementit käytöstä etusivulla/alareunassa",ui_toggle_elements_tip:"Poista kotisivuelementit kuten 'toimii' jne.",ui_site_description:"Sivuston kuvaus",ui_site_description_hint:"Käytä tavallista tekstiä, Markdownia tai puhdasta HTML:ää",ui_default_wallet_name:"Oletuslompakon nimi",ui_default_theme:"Oletusteema",lnbits_wallet:"LNbits-lompakko",denomination:"Valuutan nimi",denomination_hint:"FakeWallet-lompakon valuutan nimi",denomination_error:"Valuutta tunnisssa on oltava 3 merkkiä, tai `sat`",ui_qr_code_logo:"QR- ja Favicon-logo",ui_qr_code_logo_hint:"Anna QR-koodissa ja Faviconissa käytettävän logo-kuvan URL",ui_custom_image:"Yksilöity kuva",ui_custom_image_label:"Anna yksilöidyn kuvan URL-osoite",ui_custom_image_hint:"Yksilöity kuva näytetään aloitus- ja kirjautumissivuilla",ui_custom_badge:"Yksilöity tunnus",ui_custom_badge_label:"Yksilöity tunnus 'KÄYTÄ VAROVAISUUTTA - LNbits-lompakko on edelleen BETA-versiossa'",ui_custom_badge_color_label:"Kustomoidun tunnuksen väri",themes:"Teemat",themes_hint:"Valitse käyttäjille saatavilla olevat teemat",custom_logo:"Mukautettu logo",custom_logo_hint:"Logokuvan sisältävä URL-osoite",ad_space_title:"Mainospaikan otsikko",ad_space_title_label:"Palvelua tukevat ",ad_slots:"Mainospaikat",ad_slots_hint:"Mainoslinkit ja kuvatiedostopolut CSV-muodossa, lisäosat voivat valita välittävätkö asetuksesta",ad_slots_label:"url;img_light_url;img_dark_url, url...",ads_enabled:"Mainokset käytössä",ads_disabled:"Mainokset poistettu käytöstä",user_management:"Käyttäjänhallinta",admin_users:"Pääkäyttäjät",admin_users_hint:"Käyttäjät, joilla on pääkäyttäjän oikeudet",admin_users_label:"Käyttäjätunnus",allowed_users:"Sallitut käyttäjät",allowed_users_hint:"Vain nämä käyttäjät voivat käyttää LNbitsiä",allowed_users_hint_feature:"Ainoastaan nämä käyttäjät voivat käyttää ominaisuutta {feature}",allowed_users_label:"Käyttäjätunnus",allow_creation_user:"Salli uusien käyttäjien luominen",allow_creation_user_desc:"Etusivulta on mahdollisuus luoda uusia käyttäjiä",new_user_not_allowed:"Tunnusten luonti on estetty.",components:"Komponentit",long_running_endpoints:"Top 5 pisimpään yhteydessä ollutta päätepistettä",http_request_methods:"HTTP-pyynnön menetelmät",http_response_codes:"HTTP-vastaukset koodit",request_details:"Pyynnön tiedot",http_request_details:"HTTP-pyynnön tiedot",payment_details:"Maksun yksityiskohdat",payment_details_desc:"Yksityiskohtaisen maksun sisältö",payments:"Maksut",payment_show_internal:"Näytä sisäiset maksut",payment_chart_flow:"Kuukausittainen maksuvirta",payment_chart_status:"Maksun Tila",payment_chart_tx_per_wallet:"Lompakkokohtaiset tapahtumat (saldo/kappaletta)",payment_details_back:"Takaisin Maksuihin",payment_chart_tags:"Maksut Tag:eittäin",payments_balance_in_out:"Saldo Sisään/Ulos",payments_count_in_out:"Tapahtumia Sisään/Ulos",payments_status_chart:"Tilakaavio",payments_tag_chart:"Tag-kaavio",payments_balance_chart:"Saldo-kaavio",payments_wallets_chart:"Lompakko-kaavio",payments_balance_in_out_chart:"Saldo Sisään/Ulos -kaavio",payments_count_in_out_chart:"Lukumäärä Sisään/Ulos -kaavio",reset_wallet_keys:"Uusi API-avaimet",reset_wallet_keys_desc:"Tämän lompakon API-avaimet uusitaan. Edelliset API-avaimet lakkaavat toimimasta ja uudet luodaan niiden tilalle..",view_list:"Näytä lompakot allekain",view_column:"Näytä lompakot rinnakkain",filter_payments:"Suodata maksuja",filter_date:"Suodata päiväyksellä",websocket_example:"Websocket example",client_id:"Client ID",secret_key:"Secret Key",signing_secret:"Signing Secret",signing_secret_hint:"Signing secret for the webhook. Messages will be signed with this secret.",webhook_id:"Webhook ID",webhook_id_hint:"PayPal webhook ID used to verify incoming events.",webhook_paypal_description:"On the PayPal side configure a webhook pointing to your LNbits server.",callback_success_url:"Callback Success URL",callback_success_url_hint:"The user will be redirected to this URL after the payment is successful"},window._lnbitsUtils={url_for(e){const t=new URL(e,window.location.origin);return t.searchParams.set("v",window.g.settings.cacheKey),t.toString()},loadScript(e){return new Promise((t,n)=>{const a=document.createElement("script");a.src=this.url_for(e),a.onload=()=>{t()},a.onerror=()=>{n(new Error(`Failed to load script ${e}`))},document.body.appendChild(a)})},async loadTemplate(e){return fetch(this.url_for(e)).then(t=>{if(!t.ok)throw new Error(`Failed to load template from ${e}`);return t.text()}).then(e=>{const t=document.createElement("div");t.innerHTML=e.trim(),document.body.appendChild(t)})},copyText(e,t,n){Quasar.copyToClipboard(e).then(()=>{Quasar.Notify.create({message:t||"Copied to clipboard!",position:n||"bottom"})})},confirmDialog:e=>Quasar.Dialog.create({message:e,ok:{flat:!0,color:"orange"},cancel:{flat:!0,color:"grey"}}),async logout(){LNbits.utils.confirmDialog('Do you really want to logout? Please visit "My Account" page to check your credentials!').onOk(async()=>{try{await LNbits.api.logout(),window.location="/"}catch(e){LNbits.utils.notifyApiError(e)}})},backupLocalStorage(e,t=!1){const n=Object.entries(Quasar.LocalStorage.getAll()).filter(([t,n])=>t.startsWith("lnbits.")&&t!==`lnbits.${e}`)||[];Quasar.LocalStorage.setItem(`lnbits.${e}`,n),t&&n.forEach(([e,t])=>Quasar.LocalStorage.remove(e))},restoreLocalStorage(e){Object.entries(Quasar.LocalStorage.getAll()).filter(([t,n])=>t.startsWith("lnbits.")&&t!==`lnbits.${e}`).forEach(([e,t])=>Quasar.LocalStorage.remove(e));(Quasar.LocalStorage.getItem(`lnbits.${e}`)||[]).forEach(([e,t])=>Quasar.LocalStorage.setItem(e,t)),Quasar.LocalStorage.remove(`lnbits.${e}`)},async digestMessage(e){const t=(new TextEncoder).encode(e),n=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,"0")).join("")},formatTimestamp:(e,t=null)=>(t=t||window.dateFormat,Quasar.date.formatDate(new Date(1e3*e),t)),formatDateString(e){this.formatDate(e)},formatDate:(e,t=null)=>(t=t||window.dateFormat,Quasar.date.formatDate(new Date(e),t)),formatTimestampFrom:e=>moment.utc(1e3*e).local().fromNow(),formatDateFrom(e){const t=new Date(e).getTime();return moment.utc(t).local().fromNow()},formatBalance:(e,t="sats")=>"sats"===t?LNbits.utils.formatSat(e)+" sats":LNbits.utils.formatCurrency(e/100,t),formatCurrency:(e,t)=>new Intl.NumberFormat(window.i18n.global.locale,{style:"currency",currency:t||"sat"}).format(e),getCurrencySymbol(e){const t=(e||"").toUpperCase();if("BTC"===t||"XBT"===t||"SAT"===t||"SATS"===t)return"₿";try{const e=new Intl.NumberFormat(window.i18n.global.locale,{style:"currency",currency:t}).formatToParts(0).find(e=>"currency"===e.type);return e?.value||t||"¤"}catch(e){return t||"¤"}},formatSat:e=>new Intl.NumberFormat(window.i18n.global.locale).format(e),formatMsat(e){return this.formatSat(e/1e3)},parseJSONSafe(e){try{return JSON.parse(e)}catch(e){return null}},isValidBech32(e){if("string"!=typeof e)return!1;const t=e.trim();if(!t||t!==t.toLowerCase()&&t!==t.toUpperCase())return!1;const n=t.toLowerCase(),a=n.lastIndexOf("1");if(a<=0)return!1;const i=n.substring(0,a),o=n.substring(a+1);if(o.length<6)return!1;if("function"!=typeof bech32ToFiveBitArray||"function"!=typeof verify_checksum)return!1;const r=bech32ToFiveBitArray(o);return!r.some(e=>e<0)&&verify_checksum(i,r)},async notifyApiError(e){if(!e.response)return console.error(e);const t={400:"warning",401:"warning",500:"negative"};let n=e.response.data.detail;if(!n){const t=await(e.response.data?.text());n=this.parseJSONSafe(t)?.detail}n=n?Array.isArray(n)?n.map(e=>e.msg+` (${e.loc?.join("/")})`):n=[n]:[e.response.data.message||e.response.data.detail],n.forEach(n=>Quasar.Notify.create({timeout:5e3,type:t[e.response.status]||"warning",message:n,caption:[e.response.status," ",e.response.statusText].join("").toUpperCase()||null,icon:null,closeBtn:!0}))},search(e,t,n,a){try{const i=t.toLowerCase().split(a||" ");return e.filter(e=>{let t=0;return _.each(i,a=>{-1!==e[n].indexOf(a)&&t++}),t===i.length})}catch(t){return e}},prepareFilterQuery(e,t,n){e.filter=n||e.filter||{},t&&(e.pagination=t.pagination,Object.assign(e.filter,t.filter));const a=e.pagination;e.loading=!0;const i={limit:a.rowsPerPage,offset:(a.page-1)*a.rowsPerPage,sortby:a.sortBy??"",direction:a.descending?"desc":"asc",...e.filter};return e.search&&(i.search=e.search),new URLSearchParams(i)},exportCSV(e,t,n){const a=(e,t)=>{let n=void 0!==t?t(e):e;return n=null==n?"":String(n),n=n.split('"').join('""'),`"${n}"`},i=[e.map(e=>a(e.label))].concat(t.map(t=>e.map(e=>a("function"==typeof e.field?e.field(t):t[void 0===e.field?e.name:e.field],e.format)).join(","))).join("\r\n");!0!==Quasar.exportFile(`${n||"table-export"}.csv`,i,"text/csv")&&Quasar.Notify.create({message:"Browser denied file download...",color:"negative",icon:null})},convertMarkdown(e){const t=new showdown.Converter;return t.setFlavor("github"),t.setOption("simpleLineBreaks",!0),t.makeHtml(e)},async decryptLnurlPayAES(e,t){let n=new Uint8Array(t.match(/[\da-f]{2}/gi).map(e=>parseInt(e,16)));return crypto.subtle.importKey("raw",n,{name:"AES-CBC",length:256},!1,["decrypt"]).then(t=>{let n=Uint8Array.from(window.atob(e.iv),e=>e.charCodeAt(0)),a=Uint8Array.from(window.atob(e.ciphertext),e=>e.charCodeAt(0));return crypto.subtle.decrypt({name:"AES-CBC",iv:n},t,a)}).then(e=>new TextDecoder("utf-8").decode(e))}},window._lnbitsApi={request:(e,t,n,a,i={})=>axios({method:e,url:t,headers:{"X-Api-Key":n},data:a,...i}),getServerHealth(){return this.request("get","/api/v1/health")},async createInvoice(e,t,n,a="sat",i=null,o=null,r=null,s=null){const l={out:!1,amount:t,memo:n,unit:a,lnurl_withdraw:i,fiat_provider:o,payment_hash:s};return r&&(l.extra={internal_memo:String(r)}),this.request("post","/api/v1/payments",e.inkey,l)},payInvoice(e,t,n=null){const a={out:!0,bolt11:t};return n&&(a.extra={internal_memo:String(n)}),this.request("post","/api/v1/payments",e.adminkey,a)},cancelInvoice(e,t){return this.request("post","/api/v1/payments/cancel",e.adminkey,{payment_hash:t})},settleInvoice(e,t){return this.request("post","/api/v1/payments/settle",e.adminkey,{preimage:t})},createAccount(e){return this.request("post","/api/v1/account",null,{name:e})},register:(e,t,n,a,i)=>axios({method:"POST",url:"/api/v1/auth/register",data:{username:e,email:t,password:n,password_repeat:a,invitation_code:i}}),reset:(e,t,n)=>axios({method:"PUT",url:"/api/v1/auth/reset",data:{reset_key:e,password:t,password_repeat:n}}),getAuthUser:()=>axios({method:"GET",url:"/api/v1/auth"}),login:(e,t)=>axios({method:"POST",url:"/api/v1/auth",data:{username:e,password:t}}),loginByProvider:(e,t,n)=>axios({method:"POST",url:`/api/v1/auth/${e}`,headers:t,data:n}),loginUsr:e=>axios({method:"POST",url:"/api/v1/auth/usr",data:{usr:e}}),logout:()=>axios({method:"POST",url:"/api/v1/auth/logout"}),impersonateUser:e=>axios({method:"POST",url:"/api/v1/auth/impersonate",data:{usr:e}}),stopImpersonation:()=>axios({method:"DELETE",url:"/api/v1/auth/impersonate"}),getAuthenticatedUser(){return this.request("get","/api/v1/auth")},getWallet(e){return this.request("get","/api/v1/wallet",e.inkey)},createWallet(e,t,n={}){return this.request("post","/api/v1/wallet",null,{name:e,wallet_type:t,...n})},updateWallet(e,t){return this.request("patch","/api/v1/wallet",t.adminkey,{name:e})},updateUiCustomization(e={}){return this.request("patch","/api/v1/auth/ui",null,e)},resetWalletKeys(e){return this.request("put",`/api/v1/wallet/reset/${e.id}`).then(e=>e.data)},deleteWallet(e){return this.request("delete",`/api/v1/wallet/${e.id}`)},getPayments(e,t){return this.request("get","/api/v1/payments/paginated?"+t,e.inkey)},getPayment(e,t){return this.request("get","/api/v1/payments/"+t,e.inkey)},updateBalance(e,t){return this.request("PUT","/users/api/v1/balance",null,{amount:e,id:t})},getCurrencies(){return this.request("GET","/api/v1/currencies").then(e=>["sats",...e.data])},getDefaultSetting:e=>LNbits.api.request("GET",`/admin/api/v1/settings/default?field_name=${e}`).catch(LNbits.utils.notifyApiError)};const localStore=(e,t)=>{const n=Quasar.LocalStorage.getItem(e);return null!==n&&"null"!==n&&void 0!==n&&"undefined"!==n?n:t};window.g=Vue.reactive({settings:SETTINGS,currencies:CURRENCIES,extensions:SETTINGS.extensions,allowedCurrencies:SETTINGS.allowedCurrencies,denomination:SETTINGS.denomination,isSatsDenomination:"sats"==SETTINGS.denomination,themeChoice:localStore("lnbits.theme",SETTINGS.defaultTheme),borderChoice:localStore("lnbits.border",SETTINGS.defaultBorder),gradientChoice:localStore("lnbits.gradientBg",SETTINGS.defaultGradient),cardRoundedChoice:localStore("lnbits.cardRounded",SETTINGS.defaultCardRounded),cardGradientChoice:localStore("lnbits.cardGradient",SETTINGS.defaultCardGradient),cardShadowChoice:localStore("lnbits.cardShadow",SETTINGS.defaultCardShadow),burgerMenuChoice:localStore("lnbits.burgerMenu",SETTINGS.defaultBurgerMenuBackground),reactionChoice:localStore("lnbits.reactions",SETTINGS.defaultReaction),bgimageChoice:localStore("lnbits.backgroundImage",SETTINGS.defaultBgimage||""),locale:localStore("lnbits.lang",navigator.languages[1]??"en"),disclaimerShown:localStore("lnbits.disclaimerShown",!1),isFiatPriority:localStore("lnbits.isFiatPriority",!1),mobileSimple:localStore("lnbits.mobileSimple",!0),walletFlip:localStore("lnbits.walletFlip",!1),lastActiveWallet:localStore("lnbits.lastActiveWallet",null),darkChoice:localStore("lnbits.darkMode",SETTINGS.defaultDark),isUserAuthorized:!!Quasar.Cookies.get("is_lnbits_user_authorized"),isUserImpersonated:!!Quasar.Cookies.get("is_lnbits_user_impersonated"),errorCode:null,errorMessage:null,user:null,wallet:null,isPublicPage:!0,offline:!navigator.onLine,hasCamera:!1,visibleDrawer:!1,fiatBalance:0,exchangeRate:0,fiatTracking:!1,payments:[],walletEventListeners:[],updatePayments:!1,updatePaymentsHash:!1,scanner:null,newWalletType:null}),window.dateFormat="YYYY-MM-DD HH:mm";const websocketPrefix="http:"===window.location.protocol?"ws://":"wss://",websocketUrl=`${websocketPrefix}${window.location.host}/api/v1/ws`,_access_cookies_for_safari_refresh_do_not_delete=document.cookie;function eventReaction(e){localUrl="";const t=Quasar.LocalStorage.getItem("lnbits.reactions")||SETTINGS.defaultReaction;if(t&&"none"!==t.toLowerCase())try{if(e<0)return;"function"==typeof window[t]&&window[t]()}catch(e){console.log(e)}}function confettiTop(){document.getElementById("vue").disabled=!0;var e=Date.now()+200,t=[localStorage.getItem("lnbits.primaryColor")||"#FFD700",localStorage.getItem("lnbits.secondaryColor")||"E89400","#ffffff"];!function n(){confetti({particleCount:3,angle:270,spread:1e3,origin:{y:0},colors:t,zIndex:999999}),Date.now(){e.substring(0,n.length)===n&&(t=n)}),null==t)throw"Malformed request: unknown prefix";let n=decodeAmount(e.substring(t.length,e.length));return{prefix:t,amount:n}}function decodeData(e,t){let n=e.substring(0,7),a=bech32ToInt(n),i=e.substring(e.length-104,e.length),o=e.substring(7,e.length-104),r=decodeTags(o),s=bech32ToFiveBitArray(n+o);return s=fiveBitArrayTo8BitArray(s,!0),s=textToHexString(t).concat(byteArrayToHexString(s)),{time_stamp:a,tags:r,signature:decodeSignature(i),signing_data:s}}function decodeSignature(e){let t=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(e)),n=t[t.length-1];return{r:byteArrayToHexString(t.slice(0,32)),s:byteArrayToHexString(t.slice(32,t.length-1)),recovery_flag:n}}function decodeAmount(e){let t=e.charAt(e.length-1),n=e.substring(0,e.length-1);if("0"===n.substring(0,1))throw"Malformed request: amount cannot contain leading zeros";if(n=Number(n),n<0||!Number.isInteger(n))throw"Malformed request: amount must be a positive decimal integer";switch(t){case"":return"Any amount";case"p":return n/10;case"n":return 100*n;case"u":return 1e5*n;case"m":return 1e8*n;default:throw"Malformed request: undefined amount multiplier"}}function decodeTags(e){let t=extractTags(e),n=[];return t.forEach(e=>n.push(decodeTag(e.type,e.length,e.data))),n}function extractTags(e){let t=[];for(;e.length>0;){let n=e.charAt(0),a=bech32ToInt(e.substring(1,3)),i=e.substring(3,a+3);t.push({type:n,length:a,data:i}),e=e.substring(3+a,e.length)}return t}function decodeTag(e,t,n){switch(e){case"p":if(52!==t)break;return{type:e,length:t,description:"payment_hash",value:byteArrayToHexString(fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n)))};case"d":return{type:e,length:t,description:"description",value:bech32ToUTF8String(n)};case"n":if(53!==t)break;return{type:e,length:t,description:"payee_public_key",value:byteArrayToHexString(fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n)))};case"h":if(52!==t)break;return{type:e,length:t,description:"description_hash",value:n};case"x":return{type:e,length:t,description:"expiry",value:bech32ToInt(n)};case"c":return{type:e,length:t,description:"min_final_cltv_expiry",value:bech32ToInt(n)};case"f":let a=bech32ToFiveBitArray(n.charAt(0))[0];if(a<0||a>18)break;return{type:e,length:t,description:"fallback_address",value:{version:a,fallback_address:n=n.substring(1,n.length)}};case"r":let i=(n=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n))).slice(0,33),o=n.slice(33,41),r=n.slice(41,45),s=n.slice(45,49),l=n.slice(49,51);return{type:e,length:t,description:"routing_information",value:{public_key:byteArrayToHexString(i),short_channel_id:byteArrayToHexString(o),fee_base_msat:byteArrayToInt(r),fee_proportional_millionths:byteArrayToInt(s),cltv_expiry_delta:byteArrayToInt(l)}}}}function polymod(e){let t=[996825010,642813549,513874426,1027748829,705979059],n=1;return e.forEach(e=>{let a=n>>25;n=(33554431&n)<<5^e;for(let e=0;e<5;e++)n^=1==(a>>e&1)?t[e]:0}),n}function expand(e){let t=[];for(let n=0;n>5);t.push(0);for(let n=0;n{console.log("offline",e),this.g.offline=!0}),addEventListener("online",e=>{console.log("back online",e),this.g.offline=!1}),null!=navigator.serviceWorker&&navigator.serviceWorker.register("/service-worker.js").then(e=>{console.log("Registered events at scope: ",e.scope)}),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices&&navigator.mediaDevices.enumerateDevices().then(e=>{window.g.hasCamera=e.some(e=>"videoinput"===e.kind)}),window.LNbits={g:window.g,utils:window._lnbitsUtils,api:window._lnbitsApi,map:{user(e){const t={id:e.id,username:e.username,admin:e.admin,email:e.email,extensions:e.extensions,wallets:e.wallets,fiat_providers:e.fiat_providers||[],super_user:e.super_user,extra:e.extra??{},hasPassword:e.has_password??!1,uiCustomization:e.ui_customization||{}},n=this.wallet;return t.wallets=t.wallets.map(n).sort((e,t)=>e.extra.pinned!==t.extra.pinned?e.extra.pinned?-1:1:e.name.localeCompare(t.name)),t.walletOptions=t.wallets.map(e=>({label:[e.name," - ",e.id.substring(0,5),"..."].join(""),value:e.id})),t.hiddenWalletsCount=Math.max(0,e.wallets.length-e.extra.visible_wallet_count),t.walletInvitesCount=e.extra.wallet_invite_requests?.length||0,t},wallet(e){if(newWallet={id:e.id,name:e.name,walletType:e.wallet_type,sharePermissions:e.share_permissions,sharedWalletId:e.shared_wallet_id,adminkey:e.adminkey,inkey:e.inkey,currency:e.currency,extra:e.extra,canReceivePayments:!0,canSendPayments:!0},newWallet.msat=e.balance_msat,newWallet.sat=Math.floor(e.balance_msat/1e3),"lightning-shared"===newWallet.walletType){const e=newWallet.sharePermissions;newWallet.canReceivePayments=e.includes("receive-payments"),newWallet.canSendPayments=e.includes("send-payments")}return newWallet.url=`/wallet?&wal=${e.id}`,newWallet.storedPaylinks=e.stored_paylinks.links,newWallet}}},window.windowMixin={},function(e,t){!function e(t,n,a,i){var o=!!(t.Worker&&t.Blob&&t.Promise&&t.OffscreenCanvas&&t.OffscreenCanvasRenderingContext2D&&t.HTMLCanvasElement&&t.HTMLCanvasElement.prototype.transferControlToOffscreen&&t.URL&&t.URL.createObjectURL);function r(){}function s(e){var a=n.exports.Promise,i=void 0!==a?a:t.Promise;return"function"==typeof i?new i(e):(e(r,r),null)}var l,u,c,d,h,p,f,m,_=(c=Math.floor(1e3/60),d={},h=0,"function"==typeof requestAnimationFrame&&"function"==typeof cancelAnimationFrame?(l=function(e){var t=Math.random();return d[t]=requestAnimationFrame(function n(a){h===a||h+c-1{a=(a<<5)+e,n+=5,n>=8&&(i.push(a>>n-8&255),n-=8)}),t&&n>0&&i.push(a<<8-n&255),i}function bech32ToUTF8String(e){let t=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(e)),n="";for(let e=0;e20&&(t-=20,e/=Math.pow(10,t),e+=new Array(t+1).join("0"));return e} \ No newline at end of file diff --git a/lnbits/static/i18n/br.js b/lnbits/static/i18n/br.js index 80ecf478c..fa05f1d3e 100644 --- a/lnbits/static/i18n/br.js +++ b/lnbits/static/i18n/br.js @@ -99,10 +99,6 @@ window.localisation.br = { view_swagger_docs: 'Ver a documentação da API do LNbits Swagger', api_docs: 'Documentação da API', api_keys_api_docs: 'URL do Node, chaves da API e documentação da API', - api_keys_warning: - 'Essas chaves devem ser mantidas em segurança; compartilhá-las pode resultar na perda de fundos.', - admin_key_warning: - 'Sua chave de administrador concede acesso total à sua carteira, incluindo a capacidade de enviar pagamentos. Nunca a compartilhe, a menos que confie plenamente no destinatário.', lnbits_version: 'Versão do LNbits', runs_on: 'Executa em', paste: 'Colar', @@ -828,48 +824,5 @@ window.localisation.br = { payment_labels_updated: 'Rótulos de pagamento atualizados', color: 'Cor', sort: 'Ordenar', - sort_by: 'Ordenar por', - block_explorer: 'Block Explorer', - enable_block_explorer: 'Ativar Block Explorer', - block_explorer_desc: - 'Permite aos usuários explorar transações e endereços Bitcoin via Electrum.', - blockexplorer_public_api: 'Acesso à API pública', - blockexplorer_public_api_desc: - 'Permitir acesso não autenticado aos endpoints da API do explorador de blocos.', - electrum_server_url: 'URL do servidor Electrum', - electrum_server_url_hint: - 'ex. ssl://electrum.blockstream.info:50002 ou tcp://localhost:50001', - blockexplorer_search_label: 'Pesquisar por TXID ou endereço', - blockexplorer_search_hint: - 'Hex de 64 caracteres = transação · qualquer outra coisa = endereço Bitcoin', - recent_blocks: 'Blocos recentes', - chain_tip: 'Ponta da cadeia', - block_height: 'Altura do bloco', - block_fee: 'taxa de bloco', - fee_estimates: 'Estimativas de taxa', - confirmed_balance: 'Saldo confirmado', - unconfirmed_balance: 'Saldo não confirmado', - transaction_history: 'Histórico de transações', - coinbase: 'Coinbase', - inputs: 'Entradas', - outputs: 'Saídas', - confirmations: 'Confirmações', - confirmed: 'Confirmado', - unconfirmed: 'Não confirmado', - history_unavailable: - 'Histórico de transações indisponível (endereço tem transações demais)', - address: 'Endereço', - block_number: 'Bloco #{height}', - block_diff: 'diff {value}', - block_hash: 'Hash', - previous_block: 'Bloco anterior', - merkle_root: 'Raiz de Merkle', - version: 'Versão', - bits: 'Bits', - difficulty: 'Dificuldade', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Tamanho virtual', - weight: 'Peso', - n_block_fee: 'taxa {n} blocos' + sort_by: 'Ordenar por' } diff --git a/lnbits/static/i18n/cn.js b/lnbits/static/i18n/cn.js index 2785a9946..76e6ade63 100644 --- a/lnbits/static/i18n/cn.js +++ b/lnbits/static/i18n/cn.js @@ -68,9 +68,6 @@ window.localisation.cn = { view_swagger_docs: '查看 LNbits Swagger API 文档', api_docs: 'API文档', api_keys_api_docs: '节点URL、API密钥和API文档', - api_keys_warning: '请妥善保管这些密钥,分享它们可能导致资金损失。', - admin_key_warning: - '您的管理员密钥可完全访问您的钱包,包括发送付款的权限。除非您完全信任接收者,否则切勿分享。', lnbits_version: 'LNbits版本', runs_on: '可运行在', paste: '粘贴', @@ -422,44 +419,5 @@ window.localisation.cn = { http_request_methods: 'HTTP请求方法', http_response_codes: 'HTTP响应代码', request_details: '请求详情', - http_request_details: 'HTTP请求详细信息', - block_explorer: '区块浏览器', - enable_block_explorer: '启用区块浏览器', - block_explorer_desc: '允许用户通过 Electrum 浏览比特币交易和地址。', - blockexplorer_public_api: '公开 API 访问', - blockexplorer_public_api_desc: '允许对区块浏览器 API 端点的未认证访问。', - electrum_server_url: 'Electrum 服务器 URL', - electrum_server_url_hint: - '例如 ssl://electrum.blockstream.info:50002 或 tcp://localhost:50001', - blockexplorer_search_label: '按 TXID 或地址搜索', - blockexplorer_search_hint: '64位十六进制 = 交易 · 其他 = 比特币地址', - recent_blocks: '最新区块', - chain_tip: '链尖', - block_height: '区块高度', - block_fee: '区块手续费', - fee_estimates: '手续费估算', - confirmed_balance: '已确认余额', - unconfirmed_balance: '未确认余额', - transaction_history: '交易历史', - coinbase: 'Coinbase', - inputs: '输入', - outputs: '输出', - confirmations: '确认数', - confirmed: '已确认', - unconfirmed: '未确认', - history_unavailable: '交易历史不可用(地址交易过多)', - address: '地址', - block_number: '区块 #{height}', - block_diff: '难度 {value}', - block_hash: '哈希', - previous_block: '上一区块', - merkle_root: 'Merkle 根', - version: '版本', - bits: 'Bits', - difficulty: '难度', - nonce: 'Nonce', - txid: 'TXID', - vsize: '虚拟大小', - weight: '权重', - n_block_fee: '{n} 区块手续费' + http_request_details: 'HTTP请求详细信息' } diff --git a/lnbits/static/i18n/cs.js b/lnbits/static/i18n/cs.js index 331f60692..6f0443922 100644 --- a/lnbits/static/i18n/cs.js +++ b/lnbits/static/i18n/cs.js @@ -72,10 +72,6 @@ window.localisation.cs = { view_swagger_docs: 'Zobrazit LNbits Swagger API dokumentaci', api_docs: 'API dokumentace', api_keys_api_docs: 'Adresa uzlu, API klíče a API dokumentace', - api_keys_warning: - 'Tyto klíče uchovávejte v bezpečí, jejich sdílení může vést ke ztrátě prostředků.', - admin_key_warning: - 'Váš administrátorský klíč poskytuje plný přístup k peněžence včetně možnosti odesílat platby. Nikdy jej nesdílejte, pokud příjemci plně nedůvěřujete.', lnbits_version: 'Verze LNbits', runs_on: 'Běží na', paste: 'Vložit', @@ -443,48 +439,5 @@ window.localisation.cs = { http_request_methods: 'Metody HTTP požadavků', http_response_codes: 'Kódy HTTP odpovědí', request_details: 'Podrobnosti žádosti', - http_request_details: 'Podrobnosti HTTP žádosti', - block_explorer: 'Průzkumník bloků', - enable_block_explorer: 'Povolit průzkumník bloků', - block_explorer_desc: - 'Umožňuje uživatelům procházet bitcoinové transakce a adresy přes Electrum.', - blockexplorer_public_api: 'Veřejný přístup k API', - blockexplorer_public_api_desc: - 'Povolit neověřený přístup k API koncovým bodům průzkumníku bloků.', - electrum_server_url: 'URL Electrum serveru', - electrum_server_url_hint: - 'např. ssl://electrum.blockstream.info:50002 nebo tcp://localhost:50001', - blockexplorer_search_label: 'Hledat podle TXID nebo adresy', - blockexplorer_search_hint: - '64-znakový hex = transakce · cokoli jiného = bitcoinová adresa', - recent_blocks: 'Nedávné bloky', - chain_tip: 'Vrchol řetězu', - block_height: 'Výška bloku', - block_fee: 'poplatek bloku', - fee_estimates: 'Odhady poplatků', - confirmed_balance: 'Potvrzený zůstatek', - unconfirmed_balance: 'Nepotvrzený zůstatek', - transaction_history: 'Historie transakcí', - coinbase: 'Coinbase', - inputs: 'Vstupy', - outputs: 'Výstupy', - confirmations: 'Potvrzení', - confirmed: 'Potvrzeno', - unconfirmed: 'Nepotvrzeno', - history_unavailable: - 'Historie transakcí nedostupná (adresa má příliš mnoho transakcí)', - address: 'Adresa', - block_number: 'Blok #{height}', - block_diff: 'obth. {value}', - block_hash: 'Hash', - previous_block: 'Předchozí blok', - merkle_root: 'Merkle kořen', - version: 'Verze', - bits: 'Bity', - difficulty: 'Obtížnost', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Virtuální velikost', - weight: 'Váha', - n_block_fee: 'poplatek {n} bloků' + http_request_details: 'Podrobnosti HTTP žádosti' } diff --git a/lnbits/static/i18n/de.js b/lnbits/static/i18n/de.js index 30935d3a2..b678d5c3e 100644 --- a/lnbits/static/i18n/de.js +++ b/lnbits/static/i18n/de.js @@ -72,10 +72,6 @@ window.localisation.de = { view_swagger_docs: 'LNbits Swagger API-Dokumentation', api_docs: 'API-Dokumentation', api_keys_api_docs: 'Knoten-URL, API-Schlüssel und API-Dokumentation', - api_keys_warning: - 'Diese Schlüssel sollten sicher aufbewahrt werden; ihre Weitergabe kann zum Verlust von Guthaben führen.', - admin_key_warning: - 'Dein Admin-Schlüssel gewährt vollen Zugriff auf deine Wallet, einschließlich der Möglichkeit, Zahlungen zu senden. Teile ihn niemals, es sei denn, du vertraust dem Empfänger vollständig.', lnbits_version: 'LNbits-Version', runs_on: 'Läuft auf', paste: 'Einfügen', @@ -456,48 +452,5 @@ window.localisation.de = { http_request_methods: 'HTTP-Anfragemethoden', http_response_codes: 'HTTP-Antwortcodes', request_details: 'Anfragedetails', - http_request_details: 'HTTP-Anfragedetails', - block_explorer: 'Block Explorer', - enable_block_explorer: 'Block Explorer aktivieren', - block_explorer_desc: - 'Ermöglicht Nutzern das Durchsuchen von Bitcoin-Transaktionen und -Adressen über Electrum.', - blockexplorer_public_api: 'Öffentlicher API-Zugang', - blockexplorer_public_api_desc: - 'Nicht-authentifizierten Zugriff auf die Block-Explorer-API-Endpunkte erlauben.', - electrum_server_url: 'Electrum-Server-URL', - electrum_server_url_hint: - 'z.B. ssl://electrum.blockstream.info:50002 oder tcp://localhost:50001', - blockexplorer_search_label: 'Nach TXID oder Adresse suchen', - blockexplorer_search_hint: - '64-Zeichen-Hex = Transaktion · Alles andere = Bitcoin-Adresse', - recent_blocks: 'Aktuelle Blöcke', - chain_tip: 'Kettenspitze', - block_height: 'Blockhöhe', - block_fee: 'Blockgebühr', - fee_estimates: 'Gebührenschätzungen', - confirmed_balance: 'Bestätigtes Guthaben', - unconfirmed_balance: 'Unbestätigtes Guthaben', - transaction_history: 'Transaktionsverlauf', - coinbase: 'Coinbase', - inputs: 'Eingaben', - outputs: 'Ausgaben', - confirmations: 'Bestätigungen', - confirmed: 'Bestätigt', - unconfirmed: 'Unbestätigt', - history_unavailable: - 'Transaktionsverlauf nicht verfügbar (Adresse hat zu viele Transaktionen)', - address: 'Adresse', - block_number: 'Block #{height}', - block_diff: 'Schw. {value}', - block_hash: 'Hash', - previous_block: 'Vorheriger Block', - merkle_root: 'Merkle-Wurzel', - version: 'Version', - bits: 'Bits', - difficulty: 'Schwierigkeit', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Virtuelle Größe', - weight: 'Gewicht', - n_block_fee: '{n}-Block-Gebühr' + http_request_details: 'HTTP-Anfragedetails' } diff --git a/lnbits/static/i18n/en.js b/lnbits/static/i18n/en.js index 61ce6b3d8..f9f545bf9 100644 --- a/lnbits/static/i18n/en.js +++ b/lnbits/static/i18n/en.js @@ -44,8 +44,7 @@ window.localisation.en = { reset_defaults_tooltip: 'Delete all settings and reset to defaults.', download_backup: 'Download database backup', name_your_wallet: 'Name your {name} wallet', - paste_invoice_label: - 'Paste an invoice, payment request, Lightning Address or LNURL*', + paste_invoice_label: 'Paste an invoice, payment request or lnurl code *', lnbits_description: 'Easy to set up and lightweight, LNbits can run on any Lightning Network funding source and even LNbits itself! You can run LNbits for yourself, or easily offer a custodian solution for others. Each wallet has its own API keys and there is no limit to the number of wallets you can make. Being able to partition funds makes LNbits a useful tool for money management and as a development tool. Extensions add extra functionality to LNbits so you can experiment with a range of cutting-edge technologies on the lightning network. We have made developing extensions as easy as possible, and as a free and open-source project, we encourage people to develop and submit their own.', export_to_phone: 'Export to Phone with QR Code', @@ -65,7 +64,6 @@ window.localisation.en = { wallets: 'Wallets', exclude_wallets: 'Exclude Wallets', add_wallet: 'Add wallet', - add_field: 'Add field', reject_wallet: 'Reject wallet', add_new_wallet: 'Add a new wallet', pin_wallet: 'Pin wallet', @@ -100,10 +98,6 @@ window.localisation.en = { view_swagger_docs: 'View LNbits Swagger API docs', api_docs: 'API docs', api_keys_api_docs: 'Node URL, API keys and API docs', - api_keys_warning: - 'These keys should be kept safe, sharing them could risk losing funds.', - admin_key_warning: - 'Your admin key grants full access to your wallet, including the ability to send payments. Never share it unless you fully trust the recipient.', lnbits_version: 'LNbits version', runs_on: 'Runs on', paste: 'Paste', @@ -122,7 +116,6 @@ window.localisation.en = { read: 'Read', write: 'Write', pay: 'Pay', - sending: 'Sending', memo: 'Memo', date: 'Date', path: 'Path', @@ -168,10 +161,6 @@ window.localisation.en = { ext_sources_hint: 'Repositories from where the extensions can be downloaded', ext_sources_label: 'Source URL (only use the official LNbits extension source, and sources you can trust)', - wasm_sources_hint: - 'Repositories from where WASM extensions can be downloaded', - wasm_sources_label: - 'WASM source URL (only use WASM extension sources you can trust)', warning: 'Warning', repository: 'Repository', confirm_continue: 'Are you sure you want to continue?', @@ -195,7 +184,6 @@ window.localisation.en = { release_notes: 'Release Notes', activate_extension_details: 'Make extension available/unavailable for users', featured: 'Featured', - categories: 'Categories', all: 'All', only_admins_can_install: '(Only admin accounts can install extensions)', only_admins_can_create_extensions: @@ -493,8 +481,6 @@ window.localisation.en = { access_control_list_admin_warning: 'This is an admin account. The generated tokens will have admin privileges.', new_api_acl: 'New Access Control List', - acl_token_active: 'Active', - acl_token_expired: 'Expired', api_token_id: 'Token Id', toggle_gradient: 'Toggle Gradient', gradient_background: 'Gradient Background', @@ -532,64 +518,6 @@ window.localisation.en = { admin_settings: 'Admin Settings', extension_cost: 'This release requires a payment of minimum {cost} sats.', extension_paid_sats: 'You have already paid {paid_sats} sats.', - extension_permissions_title: 'Grant extension permissions', - extension_permissions_tab: 'Extension Permissions', - user_permissions_tab: 'My Grants', - extension_permissions_none: 'This extension has no install-time permissions.', - user_permissions_none: - 'You have not granted any permissions for this extension.', - user_permissions_max_amount: 'Max payment amount', - user_permissions_destination_policy: 'Allowed destinations', - user_permissions_no_editable_settings: 'This grant has no editable settings.', - extension_permissions_grant_install: 'Grant and install', - extension_permissions_high_risk_warning: - 'This extension requests permissions that can move funds.', - extension_permission_risk_low: 'Low risk', - extension_permission_risk_medium: 'Medium risk', - extension_permission_risk_high: 'High risk', - extension_permission_warning_wallet_pay_invoice: - 'Can spend funds from wallets available to your account.', - extension_permission_warning_wallet_pay_invoice_background: - 'Can spend funds later from approved wallets without an active click.', - extension_permission_warning_wallet_payments_watch: - 'Can read payment metadata for approved wallets.', - extension_permission_warning_extension_api_request_write: - 'Can write data or trigger actions in approved extensions.', - extension_permission_ext_storage_read: 'Read extension storage', - extension_permission_ext_storage_append_public: - 'Append public extension storage', - extension_permission_ext_storage_append_public_sources: - 'Allowed append targets', - extension_permission_ext_storage_append_public_max_rows_per_source: - 'Max rows per source', - extension_permission_ext_storage_read_public: 'Read public extension storage', - extension_permission_ext_storage_read_public_source_required: - 'required to read', - extension_permission_ext_storage_write: 'Write extension storage', - extension_permission_ext_storage_read_write: 'Read & Write extension storage', - extension_permission_extension_api_request: 'Use other extensions', - extension_permission_extension_api_request_extensions: 'Allowed extensions', - extension_permission_access_read: 'Read', - extension_permission_access_write: 'Write', - extension_permission_http_request: 'Connect to external websites', - extension_permission_http_request_hosts: 'Allowed hosts', - extension_permission_utils_basic: 'Use basic LNbits utilities', - extension_permission_ui_camera_scan_qr: 'Scan QR codes', - extension_permission_websocket: 'Use extension websockets', - extension_permission_websocket_publish_limits: 'Publish limits', - extension_permission_websocket_publish_max_messages_per_second: - 'Max messages per second', - extension_permission_websocket_publish: 'Publish websocket messages', - extension_permission_websocket_subscribe: 'Subscribe to websocket messages', - extension_permission_wallet_payments_watch: 'Watch wallet payments', - extension_permission_wallet_create_invoice: 'Create invoices', - extension_permission_wallet_create_invoice_public: - 'Create Lightning invoices from public pages', - extension_permission_wallet_balance_read: 'View wallet balances', - extension_permission_wallet_list: 'List wallets', - extension_permission_wallet_pay_invoice: 'Pay invoices', - extension_permission_wallet_pay_invoice_background: - 'Make background payments', create_extension: 'Create Extension', release_details_error: 'Cannot get the release details.', pay_from_wallet: 'Pay from Wallet', @@ -758,10 +686,7 @@ window.localisation.en = { service_fees: 'Service Fees', service_fee: 'Service Fee', service_fee_label: 'Service Fee Charged Per Transaction', - service_fee_hint: 'Fee charged per transaction (%)', - service_fee_max: 'Maximum Service Fee (sats)', service_fee_max_label: 'Maximum Service Fee Limit', - service_fee_max_hint: 'Maximum service fee to charge in (sats)', fee_wallet_label: 'Service Fee Wallet ID', fee_wallet_hint: 'The ID of the wallet to which to send service funds', disable_fee: 'Disable Service Fees for Internal Payments', @@ -915,80 +840,5 @@ window.localisation.en = { payment_labels_updated: 'Payment labels updated', color: 'Color', sort: 'Sort', - sort_by: 'Sort by', - lightning_address: 'Lightning Address', - lightning_addresses: 'Lightning Addresses', - lightning_address_price: 'Lightning Address price', - enable_lightning_address: 'Enable Lightning Addresses', - ln_address_mode: 'Lightning Address Resolution Mode', - ln_address_core_first: 'Resolve from LNbits Core first', - ln_address_extension_first: 'Resolve from Pay Links extension first', - ln_address_extension_only: 'Resolve from Pay Links extension only', - ln_address_mode_hint: - 'Choose how LNbits should resolve Lightning Addresses. Using both LNbits Core and the Pay Links extension will have a small impact on performance.', - enable_lightning_address_for_all_wallets: - 'Enable Lightning Addresses for all LNbits wallets', - allow_users_specify_lightning_addresses: - 'Allow users to specify Lightning Addresses', - allow_wallet_owners_set_custom_lightning_addresses: - 'Allow wallet owners to set custom Lightning Addresses', - charge_for_lightning_addresses: 'Charge for Lightning Addresses', - charge_users_set_change_lightning_address: - 'Charge users when they set or change a Lightning Address.', - service_fee_wallet_id_must_be_set: - 'Service Fee Wallet ID must be set in the Service Fees section below for this to work.', - lightning_address_blacklist: 'Lightning Address blacklist', - lightning_address_blacklist_instructions: - 'Newline separated reserved words. Users cannot choose a Lightning Address that matches any of these words.', - set_lightning_address: 'Set Lightning Address', - block_explorer: 'Block Explorer', - enable_block_explorer: 'Enable Block Explorer', - block_explorer_desc: - 'Allow users to explore Bitcoin transactions and addresses via Electrum.', - blockexplorer_public_api: 'Public API Access', - blockexplorer_public_api_desc: - 'Allow unauthenticated access to the block explorer API endpoints.', - electrum_compatible_server: 'Electrum compatible server', - electrum_server_url: 'Electrum Server URL', - electrum_server_url_hint: - 'Choose a public Electrum server or enter your own.', - electrum_server_url_custom: 'Custom Electrum Server URL', - view_public_electrum_servers: 'View public Electrum servers', - blockexplorer_network: 'Bitcoin Network', - blockexplorer_network_hint: - 'The network the Electrum server is connected to, used to render addresses correctly.', - blockexplorer_search_label: 'Search by TXID or Address', - blockexplorer_search_hint: - '64-char hex = transaction · anything else = Bitcoin address', - recent_blocks: 'Recent Blocks', - chain_tip: 'Chain Tip', - block_height: 'Block Height', - block_fee: 'block fee', - fee_estimates: 'Fee Estimates', - confirmed_balance: 'Confirmed Balance', - unconfirmed_balance: 'Unconfirmed Balance', - transaction_history: 'Transaction History', - coinbase: 'Coinbase', - inputs: 'Inputs', - outputs: 'Outputs', - confirmations: 'Confirmations', - confirmed: 'Confirmed', - unconfirmed: 'Unconfirmed', - no_transactions: 'No transactions found', - history_unavailable: - 'Transaction history unavailable (address has too many transactions)', - address: 'Address', - block_number: 'Block #{height}', - block_diff: 'diff {value}', - block_hash: 'Hash', - previous_block: 'Previous Block', - merkle_root: 'Merkle Root', - version: 'Version', - bits: 'Bits', - difficulty: 'Difficulty', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Virtual Size', - weight: 'Weight', - n_block_fee: '{n}-block fee' + sort_by: 'Sort by' } diff --git a/lnbits/static/i18n/es.js b/lnbits/static/i18n/es.js index cb7e9d126..38872d9c2 100644 --- a/lnbits/static/i18n/es.js +++ b/lnbits/static/i18n/es.js @@ -72,10 +72,6 @@ window.localisation.es = { view_swagger_docs: 'Ver documentación de API de LNbits Swagger', api_docs: 'Documentación de API', api_keys_api_docs: 'URL del nodo, claves de API y documentación de API', - api_keys_warning: - 'Estas claves deben mantenerse seguras; compartirlas podría provocar la pérdida de fondos.', - admin_key_warning: - 'Tu clave de administrador otorga acceso total a tu billetera, incluida la posibilidad de enviar pagos. Nunca la compartas a menos que confíes plenamente en el destinatario.', lnbits_version: 'Versión de LNbits', runs_on: 'Corre en', paste: 'Pegar', @@ -457,48 +453,5 @@ window.localisation.es = { http_request_methods: 'Métodos de solicitud HTTP', http_response_codes: 'Códigos de Respuesta HTTP', request_details: 'Detalles de la solicitud', - http_request_details: 'Detalles de la Solicitud HTTP', - block_explorer: 'Block Explorer', - enable_block_explorer: 'Activar Block Explorer', - block_explorer_desc: - 'Permite a los usuarios explorar transacciones y direcciones de Bitcoin a través de Electrum.', - blockexplorer_public_api: 'Acceso a la API pública', - blockexplorer_public_api_desc: - 'Permitir acceso no autenticado a los endpoints de la API del explorador de bloques.', - electrum_server_url: 'URL del servidor Electrum', - electrum_server_url_hint: - 'p.ej. ssl://electrum.blockstream.info:50002 o tcp://localhost:50001', - blockexplorer_search_label: 'Buscar por TXID o dirección', - blockexplorer_search_hint: - 'Hex de 64 caracteres = transacción · cualquier otra cosa = dirección Bitcoin', - recent_blocks: 'Bloques recientes', - chain_tip: 'Punta de cadena', - block_height: 'Altura de bloque', - block_fee: 'tarifa de bloque', - fee_estimates: 'Estimaciones de tarifa', - confirmed_balance: 'Saldo confirmado', - unconfirmed_balance: 'Saldo no confirmado', - transaction_history: 'Historial de transacciones', - coinbase: 'Coinbase', - inputs: 'Entradas', - outputs: 'Salidas', - confirmations: 'Confirmaciones', - confirmed: 'Confirmado', - unconfirmed: 'No confirmado', - history_unavailable: - 'Historial de transacciones no disponible (la dirección tiene demasiadas transacciones)', - address: 'Dirección', - block_number: 'Bloque #{height}', - block_diff: 'dif {value}', - block_hash: 'Hash', - previous_block: 'Bloque anterior', - merkle_root: 'Raíz de Merkle', - version: 'Versión', - bits: 'Bits', - difficulty: 'Dificultad', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Tamaño virtual', - weight: 'Peso', - n_block_fee: 'tarifa {n} bloques' + http_request_details: 'Detalles de la Solicitud HTTP' } diff --git a/lnbits/static/i18n/fi.js b/lnbits/static/i18n/fi.js index 58ffe3f55..5486819d3 100644 --- a/lnbits/static/i18n/fi.js +++ b/lnbits/static/i18n/fi.js @@ -81,10 +81,6 @@ window.localisation.fi = { view_swagger_docs: 'Näytä LNbits Swagger API-dokumentit', api_docs: 'API-dokumentaatio', api_keys_api_docs: 'Solmun URL, API-avaimet ja -dokumentaatio', - api_keys_warning: - 'Pidä nämä avaimet turvassa, sillä niiden jakaminen voi johtaa varojen menetykseen.', - admin_key_warning: - 'Ylläpitäjäavaimesi antaa täyden pääsyn lompakkoosi, myös maksujen lähettämiseen. Älä koskaan jaa sitä, ellet täysin luota vastaanottajaan.', lnbits_version: 'LNbits versio', runs_on: 'Mukana menossa', paste: 'Liitä', @@ -651,48 +647,5 @@ window.localisation.fi = { 'On the PayPal side configure a webhook pointing to your LNbits server.', callback_success_url: 'Callback Success URL', callback_success_url_hint: - 'The user will be redirected to this URL after the payment is successful', - block_explorer: 'Lohkoselain', - enable_block_explorer: 'Ota lohkoselain käyttöön', - block_explorer_desc: - 'Salli käyttäjien tutkia Bitcoin-transaktioita ja -osoitteita Electrumin kautta.', - blockexplorer_public_api: 'Julkinen API-pääsy', - blockexplorer_public_api_desc: - 'Salli todentamaton pääsy lohkoselain API-päätteisiin.', - electrum_server_url: 'Electrum-palvelimen URL', - electrum_server_url_hint: - 'esim. ssl://electrum.blockstream.info:50002 tai tcp://localhost:50001', - blockexplorer_search_label: 'Hae TXID:llä tai osoitteella', - blockexplorer_search_hint: - '64 merkin heksa = transaktio · muu = Bitcoin-osoite', - recent_blocks: 'Viimeisimmät lohkot', - chain_tip: 'Ketjun kärki', - block_height: 'Lohkokorkeus', - block_fee: 'lohkomaksu', - fee_estimates: 'Maksuarviot', - confirmed_balance: 'Vahvistettu saldo', - unconfirmed_balance: 'Vahvistamaton saldo', - transaction_history: 'Tapahtumahistoria', - coinbase: 'Coinbase', - inputs: 'Syötteet', - outputs: 'Tulosteet', - confirmations: 'Vahvistukset', - confirmed: 'Vahvistettu', - unconfirmed: 'Vahvistamaton', - history_unavailable: - 'Tapahtumahistoria ei saatavilla (osoitteella on liikaa tapahtumia)', - address: 'Osoite', - block_number: 'Lohko #{height}', - block_diff: 'vaikeus {value}', - block_hash: 'Hash', - previous_block: 'Edellinen lohko', - merkle_root: 'Merkle-juuri', - version: 'Versio', - bits: 'Bitit', - difficulty: 'Vaikeus', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Virtuaalikoko', - weight: 'Paino', - n_block_fee: '{n} lohkon maksu' + 'The user will be redirected to this URL after the payment is successful' } diff --git a/lnbits/static/i18n/fo.js b/lnbits/static/i18n/fo.js deleted file mode 100644 index c40572fff..000000000 --- a/lnbits/static/i18n/fo.js +++ /dev/null @@ -1,901 +0,0 @@ -window.localisation.fo = { - confirm: 'Ja', - server: 'Ambætari', - theme: 'Snið', - site_customisation: 'Vevsíðu tillagingar', - funding: 'Fígging', - users: 'Brúkarar', - audit: 'Slóðfesti', - api_watch: 'API nýtsluyvirlit', - apps: 'Appir', - channels: 'Rásir', - transactions: 'Flytingar', - dashboard: 'Yvirlitssýni', - node: 'Knútur', - export_users: 'Tak brúkarar út', - no_users: 'Eingin brúkari finst', - total_capacity: 'Samlað rásarupphædd', - avg_channel_size: 'Miðal rásarupphædd', - biggest_channel_size: 'Størsta rásarupphædd', - smallest_channel_size: 'Minsta rásarupphædd', - number_of_channels: 'Tal av rásum', - active_channels: 'Virknar rásir', - connect_peer: 'Sambind við javninga', - connect: 'Sambind', - reconnect: 'Sambind aftur', - open_channel: 'Ger rás', - open: 'Lat upp', - clear: 'Tómstilla', - close_channel: 'Loka rás', - close: 'Loka', - restart: 'Endurbyrja ambætara', - image_library: 'Myndasavn', - save: 'Goym', - save_tooltip: 'Goym broytingarnar', - must_save: 'Tú hevur framt broytingar ið enn ikki eru goymdar.', - credit_debit: 'Góðskriva / Skuldskriva', - credit_hint: - 'Trýst á Enter til tess at góðskriva/skuldskriva mappu (negativ viðri eru loyvd)', - credit_label: '{denomination} at góðskriva/skuldskriva', - credit_ok: - 'Tað eydnaðist at góðskriva/skuldskriva tykisligan pening ({amount} sats). Gjøld eru treytaði av veruligum peningi á fíggingarkelduni.', - restart_tooltip: 'Endurbyrja ambætaran fyri at broytingarnar fáa virknað', - add_funds_tooltip: 'Set pening á eina mappu.', - reset_defaults: 'Endurset til forsettar stillingar', - reset_defaults_tooltip: - 'Strika allar stillingar og endurset tær til forsettar.', - download_backup: 'Tak niður dátugrunstrygdaravrit', - name_your_wallet: 'Navngev tína {name} mappu', - paste_invoice_label: 'Innset ein faktura, gjaldsumbøn ella LNURL-kotu *', - lnbits_description: - 'LNbits er kravlítil skipan, ið er løtt at innleggja og uppseta, og kann brúka einhvørja fíggingarkeldu á Lightning netinum. Tú kanst koyra LNbits til egna nýtslu og lættliga veita øðrum eina varðveitsluloysn. Tú fært gjørt eitt óavmarkað tal av mappum har hvør mappa hevur sínar egnu API-lyklar. Við møgulleikanum at býta pening gerst LNbits eitt hent amboð til peningaumsiting og eitt menningaramboð. Ískoytisforrit leggja virkisføri afturat LNbits so at tú kanst royna teg við eini røð av framkomnum tøknum á Lightning netinum. Vit hava gjørt tað so lætt sum møguligt, at menna ískoytisforrit, og sum ein fræls og gjøgnumskygd verkætlan eggja vit fólki, at menna og leggja fram teirra egnu ískoytisforrit.', - export_to_phone: 'Tak út til snildfon við QR-kotu', - export_to_phone_desc: - 'QR-kotan inniheldur eina leinkju ið vísir til og gevur full rættindi til tína mappu. Skannar tú hana, t.d. við tíni snildfon, kanst tú lata upp mappu nýtaramótið har.', - access_wallet_on_mobile: 'Faratgongd', - stored_paylinks: 'Goymdar LNURL-gjaldleinkjur', - wallet: 'Mappa: ', - wallet_name: 'Mappunavn', - wallet_type: 'Slag av mappu', - shared_wallet: 'Deild mappa', - share_wallet: 'Deil mappu', - update_permissions: 'Broyt loyvir', - shared_wallet_id: 'Eyðmerki á deildari mappu', - shared_wallet_desc: 'Tú ert boðin atgongd til aðra mappu.', - wallets: 'Mappur', - exclude_wallets: 'Útiloka mappur', - add_wallet: 'Ger mappu', - reject_wallet: 'Vraka mappuatgongd', - add_new_wallet: 'Legg nýggja mappu afturat', - pin_wallet: 'Fest á mappulista', - delete_wallet: 'Strika mappu', - delete_wallet_desc: - 'Mappan verður strikað og peningurin í henni fæst IKKI AFTUR.', - rename_wallet: 'Nýnevn mappu', - update_name: 'Nýnevn', - fiat_tracking: 'Fiat rekjan', - fiat_providers: 'Fiat meklarir', - fiat_warning_bitcoin: - 'Ber teg undan at brúka orðið "bitcoin" tínum samskifti við fiat meklarar, tí teir hava lyndi at gerast fjálturstungnir um tað ið hevur við Bitcoin at gera!', - currency: 'Gjaldoyra', - update_currency: 'Broyt gjaldoyra', - press_to_claim: 'Trýst til tess at taka ímóti bitcoin', - claim_desc: - 'Tú tykist hava krav á einari bitcoin upphædd men hevur ikki eina mappu enn. Trýst á knøttin niðanfyri fyri at taka ímóti henni. Ein nýggj mappa verður gjørd tær.', - donate: 'Veit fíggjarligan stuðul', - view_github: 'Lat upp LNbits verkætlanina á GitHub', - voidwallet_active: 'VoidWallet er virkin! Gjøld eru óvirkt', - voidwallet_active_user: - 'Fíggingarkelda er ikki tøk. Vinaliga bið skipanarumsitaran um at fáa fíggingarkelduna í rættlag.', - voidwallet_active_admin: - 'Fíggingarkelda er ikki tøk. Trýst á her fyri at uppseta.', - service_fee_badge: 'Tænastuavgjald: {amount} % fyri hvørja flyting', - service_fee_max_badge: - 'Tænastuavgjald: {amount} % fyri hvørja flyting (í mesta lagi {max} {denom})', - service_fee_tooltip: - 'Tænastuavgjald ið LNbits-ambætaraumsitarin krevur fyri hvørt útgjald', - toggle_darkmode: 'Myrkt snið', - payment_reactions: 'Gjaldsviðbrøgd', - view_swagger_docs: 'Lat upp LNbits Swagger API-skjalfestingina', - api_docs: 'API skjalfesting', - api_keys_api_docs: 'Knútaleinkja, API-lyklar og API-skjalfesting', - lnbits_version: 'LNbits útgáva', - runs_on: 'Koyrir á', - paste: 'Innset', - paste_from_clipboard: 'Innset frá setiborði', - paste_request: 'Innset umbøn', - create_invoice: 'Stovna gjaldsumbøn', - camera_tooltip: 'Brúka myntatólið at skanna eina gjaldsumbøn/QR-kotu', - export_csv: 'Tak út sum CSV', - export_csv_details: 'Tak út sum CSV, við smálutum', - chart_tooltip: 'Vís talvu', - pending: 'Ógoldin', - copy_invoice: 'Avrita gjaldsumbøn', - withdraw_from: 'Tak út úr', - cancel: 'Avlýs', - scan: 'Skanna', - read: 'Innles', // This is used both in terms of "reading/loading/parsing an invoice" and in terms of "ACL read rights". The word for those terms is not the same in faroese, but the former was chosen because it is the most visible in LNbits. - write: 'Skriva', - pay: 'Rinda', - sending: 'Sendur', - memo: 'Viðmerking', - date: 'Dagfesting', - path: 'Leið', - internal_memo: 'Egin viðmerking (valfríur)', - internal_memo_hint_receive: - 'Viðmerkingin verður ikki víst rindaranum men verður knýtt at fakturanum, so tú kanst nýta hana sum tilvísing.', - internal_memo_hint_pay: - 'Viðmerkingin verður ikki vist móttakaranum men verður knýtt at gjaldsumbønini, so tú kanst nýta hana sum tilvísing.', - payment_processing: 'Gjald verður avgreitt...', - payment_successful: 'Goldið!', - payment_pending: 'Gjald er ikki goldið enn...', - payment_check: 'Kanna greiðslu', - not_enough_funds: 'Ónøktandi salda!', - search_by_tag_memo_amount: 'Leita eftir spjaldri, viðmerking, upphædd', - search: 'Leita', - invoice_waiting: 'Gjaldsumbøn ið bíðar eftir at verða goldin', - payment_received: 'Inngjald', - payment_sent: 'Útgjald', - payment_failed: 'Gjald miseydnaðist', - receive: 'Móttak', - send: 'Send', - outgoing_payment_pending: 'Útgjald í bíðistøðu', - drain_funds: 'Tøm mappu', - drain_funds_desc: - 'Hendan LNURL-úttøku QR-kotan kann brúkast at taka allan peningin úr mappuni. Ikki deila QR-kotuna við nakran. Hon ger nýtslu av balanceCheck og balanceNotify og kann tí brúkast fleiri ferðir at tøma mappuna.', - i_understand: 'Eg skilji', - copy_wallet_url: 'Avrita mappuleinkju', - disclaimer_dialog_title: 'Gev gætur!', - disclaimer_dialog: - 'Tú *noyðist* at varðveita tínar innritanarupplýsingar til tess at fáa atgongd til mappuna aftur. Missir tú tær missir tú atgongd til mappuna og peningin.\n\nTú finnur tínar innritanarupplýsingar undir "Mín brúkari" > "Brúkara uppsetan".\n\nLNbits tekur ikki ábyrgd fyri mistari atgongd til pening.', - no_transactions: 'Enn eru ongar flytingar gjørdar', - manage: 'Umsit', - exchanges: 'Gjaldoyrakostnaðir', - extensions: 'Ískoytisforrit', - no_extensions: 'Einki ískoytisforrit er innlagt :(', - created: 'Stovnað', - created_at: 'Stovnað', - updated_at: 'Broytt', - search_extensions: 'Leita eftir ískoytisforritum', - search_wallets: 'Leita eftir mappum', - extension_sources: 'Ískoytisforritakeldur', - ext_sources_hint: 'Keldur hiðan ískoytisforrit verða tikin niður', - ext_sources_label: - 'Kelduleinkja (brúka einans almennu LNbits-ískoytisforritakelduna og keldur tú hevur álit á)', - warning: 'Gev gætur', - repository: 'Kelda', - confirm_continue: 'Ynskir tú at halda áfram?', - manage_extension_details: 'Innlegg/Strika ískoytisforritið', - upload: 'Uppsend', - install: 'Innlegg', - uninstall: 'Strika', - drop_db: 'Strika dáturnar', - enable: 'Virkja', - enabled: 'Virktur', - disabled: 'Óvirkt(ur)', - pay_to_enable: 'Rinda til tess at virkja', - enable_extension_details: 'Virkja ískoytisforrit fyri verandi brúkara', - disable: 'Óvirkja', - delete: 'Strika', - installed: 'Innløgd', - activated: 'Virkt(ur)', //used for users and extensions which are different genders in faroese - deactivated: 'Óvirkt', - activate: 'Virkja', - deactivate: 'Óvirkja', - release_notes: 'Sleppingarskriv', - activate_extension_details: - 'Virkja ella óvirkja ískoytisforritið fyri brúkarum', - featured: 'Víðagitin', - categories: 'Flokkar', - all: 'Øll', - only_admins_can_install: '(Einans umsitarar kunnu innleggja ískoytisforrit)', - only_admins_can_create_extensions: - 'Einans umsitarar kunnu gera ískoytisforrit', - admin_only: 'Einans umsitarar', - make_user_admin: 'Játta umsitanarrættindi', - revoke_admin: 'Ógilda umsitanarrættindi', - new_version: 'Nýggj útgáva', - reviews_url: 'Ummælaleinkja', - reviews_url_label: 'Ummælaambætaraleinkja', - reviews_url_hint: - 'Leinkja til PaidReviews/ummælir, íroknað stillingareymerki (t.d. https://example.com/paidreviews/SETTINGS_ID)', - reviews_open: 'Sí ummælir', - reviews_leave: 'Gev ummæli', - reviews_name: 'Títt navn', - reviews_comment: 'Títt ummæli', - reviews_rating: 'Meting', - reviews_submit: 'Send inn ummælið', - reviews_loading: 'Innlesur ummælir...', - reviews_refresh: 'Endurinnlesur ummælir', - reviews_error_load: 'Miseydnaðist at innlesa ummælir', - reviews_url_not_configured: 'Ummælaleinkja ikki ásett', - reviews_pay_invoice: 'Rinda gjaldsumbøn', - reviews_invoice_paid: 'Gjaldsumbøn goldin', - reviews_invoice_title: - 'Rinda hesa gjaldsumbøn til tess at skráseta títt ummæli', - reviews_count: 'Ummælir', - no_reviews: 'Ongin ummælir enn', - extension_has_free_release: 'Hevur ókeypis útgávur', - extension_has_paid_release: 'Hevur útgávur til keyps', - extension_depends_on: 'Er treytað av:', - extension_rating_soon: 'Metingar koma skjótt', - extension_installed_version: 'Innløgd útgáva', - extension_uninstall_warning: - 'Tú ert í ferð við at strika ískoytisforritið fyri allar brúkararnar.', - uninstall_confirm: 'Ja, strika', - extension_db_drop_info: - 'Allar dátur tilhoyrandi ískoytisforritið verða strikaðar. Eftir hesa gerð vendst ikki aftur!', - extension_db_drop_warning: - 'Tú ert í ferð við at strika allar dátur tilhoyrandi ískoytisforritið. Vinaliga skriva navnið á ískoytisforritinum til tess at halda á fram:', - extension_required_lnbits_version: 'Hendan útgávan tørvar LNbits útgávu', - min_version: 'Í minsta lagi', - max_version: 'Upp til (ikki íroknað)', - preimage: 'Frumvirði', - preimage_hint: 'Frumvirði til tess at avrokna varðveitslugjaldsumbøn', - hold_invoice: 'Varðveitslugjaldsumbøn', - hold_invoice_description: - 'Hendan gjaldsumbønin er í varðveitslu og tørvur er á frumvirði til tess at gjalda hana.', - payment_hash: 'Gjalds-hash', - invoice_cancelled: 'Gjaldsumbøn ógilda', - invoice_settled: 'Gjaldsumbøn avroknað', - hold_invoice_payment_hash: - 'Gjalds-hash fyri varðveitslugjaldsumbøn (valfríur)', - settle_invoice: 'Avrokna gjaldsumbøn', - cancel_invoice: 'Ógilda gjaldsumbøn', - fee: 'Avgjald', - amount: 'Upphædd', - amount_limits: 'Upphæddarmørk', - amount_sats: 'Upphædd (sats)', - faucest_wallet: 'Tiltaksmappa', - faucest_wallet_desc_1: - 'Fyri hvørt gjald váttað av {provider} verður upphæddin drigin frá hesi mappuni.', - faucest_wallet_desc_2: - 'Hetta hjálpir at halda skil á øllum {provider} gjøldum og støðum teirra.', - faucest_wallet_desc_3: - 'Mappan skal hava upphædd av sats ið umsitarin bjóðar í býti fyri fiat gjaldoyrað.', - faucest_wallet_desc_4: - 'Er ásetta mappan tóm verða gjøld umvegis {provider} ikki avgreidd.', - faucest_wallet_desc_5: - 'Upphæddin á tiltaksmappuni kann umsíðir gerast negativ í fall fleiri fiat gjøld verða rindaði.', - faucest_wallet_id: 'Tiltaksmappueyðmerki (valfríur)', - faucest_wallet_id_hint: - 'Eyðmerki á mappu við tøkari upphædd at senda til brúkaran.', - tag: 'Spjaldur', - unit: 'Eind', - description: 'Lýsing', - expiry: 'Fyrnar', - webhook: 'Vevongul', - webhook_url: 'Vevongulsleinkja', - webhook_url_hint: - 'Vevongulsleinkja ið gjaldsupplýsingarnir verða sendir til. Tað verður koyrt fyri hvørt gjald.', - copy_webhook_url: 'Avrita vevongulsleinkju', - webhook_events_list: 'Vevongulin noyðist at koyra undir fylgjandi hendingum:', - webhook_stripe_description: - 'Á Stripe síðuni noyðist tú at uppseta ein vevongul við einari leinkju ið peikar á tín LNbits-ambætara.', - webhook_square_description: - 'Á Square síðuni noyðist tú at uppseta ein vevongul ið peikar á hesa LNbits-leinkjuna.', - square_webhook_url_hint: - 'Skal samsvara við fráboðanarleinkjuna hjá Square. LNbits tørvar /api/v1/callback/square slóðina.', - access_token: 'Atgongdarmerki', - location_id: 'Staðsetingareyðmerki', - square_location_id_hint: - 'Square-staðsetingareyðmerkið ið gjaldsumbønarleinkjur verða gjørdar fyri. Brúka endapunktið at velja royndar- ella framleiðsluumhvørvi.', - api_version: 'API útgáva', - payment_proof: 'Gjaldsprógv', - update: 'Dagfør', // This is used in terms of "updating extensions", and in terms of "Saving ACL changes" - update_available: 'Dagføring {version} tøk!', - funding_sources: 'Fíggingarkeldur', - funding_source: 'Fíggingarkelda', - requires_server_restart: - 'Eftir broyting av hesum stillingunum er neyðugt at endurbyrja ambætaran, til tess at broytingarnar fáa virknað.', - funding_source_info: 'Fíggingarkelduupplýsingar', - phoenixd_warning: - 'Phoenixd áminningarramsan kann einans ásetast um phoenixd dátuskjáttan er ásett og LNbits fær lisið hana. Tað er ikki eitt tekin um at phoenixd ikki koyrir. Tað merkir bara at LNbits ikki hevur atgongd at vísa áminningarramsuna her.', - latest_update: 'Tú ert á nýggjastu útgávuni {version}.', - notifications: 'Fráboðanir', - notifications_configure: 'Fráboðanaruppsetan', - notifications_nostr_config: 'Nostr uppsetan', - notifications_enable_nostr: 'Virkja Nostr fráboðanir', - notifications_enable_nostr_desc: 'Send fráboðanir umvegis Nostr', - notifications_nostr_private_key: 'Nostr privatur lykil', - notifications_nostr_private_key_desc: - 'Privatur lykil, í sekstandatal ella nsec skapi, at undirrita boð send til Nostr', - notifications_nostr_identifier: 'Nostr-dátuheiti', - notifications_nostr_identifier_desc: - 'Nip5-dátuheiti ið fráboðanir verða sendar til', - notifications_nostr_identifiers: 'Nostr-dátuheitir', - notifications_nostr_identifiers_desc: - 'Listi av dátuheitum ið fráboðanir verða sendar til', - notifications_telegram_config: 'Telegram-uppsetan', - notifications_enable_telegram: 'Virkja Telegram-fráboðanir', - notifications_enable_telegram_desc: 'Send fráboðanir umvegis Telegram', - notifications_telegram_access_token: 'Atgongdarmerki', - notifications_telegram_access_token_desc: 'Atgongdarmerki til bottin', - notifications_chat_id: 'Telegram-kjatteyðmerki', - notifications_chat_id_desc: - 'Eyðmerkið á Telegram-kjatti ið fráboðanir verða sendar til', - notifications_excluded_wallets_desc: 'Send ikki fráboðanir fyri hesar mappur', - notifications_email_config: 'Teldupost uppsetan', - notifications_enable_email: 'Virkja teldupost', - notifications_enable_email_desc: 'Send fráboðanir o.a. umvegis teldupost', - notifications_send_test_email: 'Send royndar teldubræv', - notifications_send_email: 'Send teldupost frá', - notifications_send_email_desc: 'Teldupostbústaður ið sent verður frá', - notifications_send_email_username: 'Brúkaranavn', - notifications_send_email_username_desc: - 'Brúkaranavn. Verður brúkaranavn ikki tilskila verður teldupostbústaðurin brúktur', - notifications_send_email_password: 'Loyniorð fyri at senda teldupost', - notifications_send_email_password_desc: - 'Loyniorð fyri teldupostbústaðin ið sent verður frá', - notifications_send_email_server_port: 'SMTP-portur', - notifications_send_email_server_port_desc: 'Portur á SMTP-ambætaranum', - notifications_send_email_server: 'SMTP-ambætari', - notifications_send_email_server_desc: - 'SMTP-ambætari ið skal senda teldupostin', - notifications_send_to_emails: 'Send teldubrøv til', - notifications_send_to_emails_desc: - 'Fráboðanir verða sendar, sum teldubrøv, til', - notification_settings_update: 'Broyttar stillingar', - notification_settings_update_desc: 'Fráboða um broyttar ambætarastillingar', - notification_server_start_stop: 'Startaðan/Steðgaðan ambætara', - notification_server_start_stop_desc: - 'Fráboða um startaðan og steðgaðan ambætara', - notification_watchdog_limit: 'Varðhundsmarkfráboðan', - notification_watchdog_limit_desc: - 'Boða frá tá mark varðhundsins er rokkið. Hetta broytir ikki fíggingarkelduna.', - notification_server_status: 'Ambætarastøðu', - notification_server_status_desc: - 'Fráboða regluliga um ambætarastøðuna (tilskila tíðarbil í tímum)', - notification_incoming_payment: 'Inngjøld', - notification_incoming_payment_desc: - 'Fráboða um inngjøld, á mappur, ið er hægri enn tilskillaða upphæddin (sats)', - notification_outgoing_payment: 'Útgjøld', - notification_outgoing_payment_desc: - 'Fráboða um útgjøld, frá mappum, ið er størri enn tilskilaða upphæddin (sats)', - notification_credit_debit: 'Góð- og skuldskrivingar', - notification_credit_debit_desc: - 'Fráboða um mappur góðskrivaðar ella skuldskrivaðar av úrvalsbrúkaranum', - notification_balance_delta_changed: 'Saldumunur broyttur', - notification_balance_delta_changed_desc: - 'Boða frá tá munurin á knútasalduni og LNbits-salduni er broyttur meira enn tað ávístu upphæddina (í sats). Áset 0 fyri at óvirkja. Verður kannað hvønn minutt.', - watchdog_introduction: - 'Varðhundurin er ein funka ið sjálvvirkandi kann skifta fíggingarkelduna til VoidWallet, í fall munurin á saldu fíggingarkeldunnar og saldu LNbits er størri enn eitt vist. Hetta kann hjálpa at fyribyrgja ovurnýtslu og tryggja saldu fíggingarkeldunnar.', - enable_watchdog: 'Varðhundaskifti', - enable_watchdog_desc: - 'Um virkt, og LNbits-saldan gerst hægri enn knútasaldan, so verður fíggingarkeldan sjálvvirkandi broytt til VoidWallet. Eftir dagføringar er neyðugt at virkja hetta aftur.', - watchdog_interval: 'Títtleiki varðhundsins', - watchdog_interval_desc: - 'Títtleikin — í minuttum — har varðhundurin kannar, um skifti, treytað av saldumuninum [knúta_salda - lnbits_salda], er neyðugt.', - watchdog_delta: 'Delta varðhundsins', - watchdog_delta_desc: - 'Mark fyri skifti av fíggingarkeldu til VoidWallet [lnbits_salda - knúta_salda > delta]', - status: 'Støða', - notification_source: 'Fráboðanarkeldur', - notification_source_label: - 'Kelduleinkja (brúka einans almennu LNbits fráboðanarkelduna og keldur tú hevur álit á)', - more: 'Frætt meira', - more_count: '{count} afturat', - less: 'minni', - releases: 'Útgávur', - watchdog: 'Varðhundur', - server_logs: 'Gerðalisti ambætarans', - ip_blocker: 'IP-noktan', - security: 'Trygd', - security_tools: 'Trygdaramboð', - block_access_hint: 'Nokta atgongd frá IP-atsetri', - allow_access_hint: - 'Loyv atgongd frá IP-atsetri (hevur hægri raðfesting enn noktaði IP-atsetur)', - enter_ip: 'Inntøppa IP-atsetur og trýst Enter', - rate_limiter: 'Umbønaravmarkan', - callback_url_rules: 'Afturtøkukallleinkjureglur', - enter_callback_url_rule: - "Inntøppa leinkjuregul í regex forsniði og trýst 'enter'", - callback_url_rule_hint: - 'Afturtøkukallleinkjur, harímillum LNURL-leinkjur, verða kannaðar sambært hesum reglunum. Í minsta lagi ein regla skal lúkast. Eru ongar reglur skrásettir eru allar leinkjur loyvdar.', - wallet_limiter: 'Mappuavmarkingar', - wallet_config: 'Mappustillingar', - wallet_charts: 'Mapputalvur', - wallet_limit_max_withdraw_per_day: - 'Hámark á dagligum útgjøldum í sats (0 merkir óavmarkað, -1 noktar fyri útgjøldum)', - wallet_max_ballance: 'Mappusalduhámark í sats (0 merkir óavmarkað)', - wallet_limit_secs_between_trans: - 'Lágmark fyri sekund ímillum flytingar fyri hvørja mappu (0 merkir einki mark)', - only_incoming_payments_allowed: 'Loyv bert inngjøldum', - disable_outgoing_payments: 'Óvirkja útgjøld', - number_of_requests: 'Tal av umbønum', - number_of_requests_hint: - 'Loyvdar umbønir fyri hvørt "tíðarbil" hjá umbønaravmarkaranum. Áset 0 fyri at óvirkja umbønaravmarkaran.', - time_unit: 'Tíðarbil', - minute: 'minutt', - settings: 'Stillingar', - second: 'sekund', - hour: 'tíma', - disable_server_log: 'Óvirkja gerðalista ambætarans', - enable_server_log: 'Virkja gerðalista ambætarans', - coming_soon: 'Hentleikin er undir menning', - session_has_expired: 'Tín seta er útgingin. Vinaliga rita innaftur.', - instant_access_question: 'ella stundisliga atgongd', - login_with_user_id: 'Rita inn við brúkaraeyðmerki', - or: 'ella', - create_new_wallet: 'Ger nýggja mappu', - delete_all_wallets: 'Strika allar mappur', - confirm_delete_all_wallets: - 'Ynskir tú at strika ALLAR mappurnar hjá hesum brúkaranum?', - login_to_account: 'Rita inn á tín brúkara', - create_account: 'Stovna brúkara', - account_settings: 'Brúkara uppsetan', - signin_with_oauth: 'Rita inn við', - signin_with_oauth_or: 'ella rita inn við', - signin_with_nostr: 'Rita inn við Nostr', - signin_with_google: 'Rita inn við Google', - signin_with_github: 'Rita inn við GitHub', - signin_with_custom_org: 'Rita inn við {custom_org}', - username_or_email: 'Brúkaranavn ella teldupostbústaður', - password: 'Loyniorð', - password_config: 'Loyniorðsuppsetan', - password_repeat: 'Endurtak loyniorðið', - update_password: 'Broyt loyniorðið', - change_password: 'Broyt loyniorð', - update_credentials: 'Dagfør innritanarupplýsingar', - update_pubkey: 'Broyt almenna lykilin', - nostr_pubkey_tooltip: 'Inntøppa almenna Nostr-lykil brúkarans (sekstandatøl)', - set_password: 'Áset loyniorð', - set_password_tooltip: 'Áset hesum brúkaranum eitt loyniorð', - invalid_password: 'Loyniorð skulu hava í minsta lagi 8 tekn', - invalid_password_repeat: 'Loyniorðini eru ikki eins', - reset_key_generated: 'Ein endursetanarlykil er hervið gjørdur.', - reset_key_copy: - 'Trýst á OK fyri at avrita endursetanarleinkjuna til setiborðið.', - login: 'Rita inn', - register: 'Skráset', - username: 'Brúkaranavn', - pubkey: 'Almennur lykil', - user_id: 'Brúkaraeyðmerki', - id: 'Eyðmerki', - email: 'Teldupostbústaður', - email_confirmation_hint: - 'Teldupostbústaður ið váttanarkota skal sendast til.', - nostr_identifier: 'Nostr-dátuheiti', - nostr_identifier_hint: - 'Nostr nip5-dátuheiti ella ið váttanarkota skal sendast til.', - first_name: 'Fornavn', - last_name: 'Eftirnavn', - picture: 'Mynd', - user_picture_desc: - 'Leinkja ið vísur til vangamynd. Tú kanst leggja hana út undir Tilfar.', - verify_email: 'Vátta teldupost umvegis', - account: 'Brúkari', - update_account: 'Broyt brúkara', - invalid_username: 'Ógildigt brúkaranavn', - auth_provider: 'Samgildisveitari', - external_id: 'Ytri eyðmerki', - my_account: 'Mín brúkari', - existing_account_question: 'Hevur tú longu ein brúkara?', - background_image: 'Bakgrundsmynd', - back: 'Aftur', - logout: 'Rita út', - look_and_feel: 'Útsjónd', - endpoint: 'Endapunkt', - api: 'API', - api_stripe: 'API', - api_token: 'API-merki', - api_tokens: 'API-merkir', - access_control_list: 'Atgongdarstýringarlisti', - access_control_list_admin_warning: - 'Hetta er ein umsitanarbrúkari. Framleidd merkir fáa tí umsitanarrættindir.', - new_api_acl: 'Nýggjan atgongdarstýringarlista', - api_token_id: 'API-merki', - toggle_gradient: 'Litskifti', - gradient_background: 'Litskifti á bakgrund', - rounded_ui: 'Avrundaði kort & knøttar', - toggle_rounded_ui: 'Virkja ella óvirkja avrundaði horn á kortum og knøttum', - card_gradient: 'Litskifti á kortum', - toggle_card_gradient: 'Virkja ella óvirkja litskifti á kortum', - card_shadow: 'Kortskuggar', - toggle_card_shadow: 'Virkja ella óvirkja skugga handan kort', - burger_menu_background: 'Bakgrund á síðuteigi', - toggle_burger_menu_background: 'Virkja ella óvirkja bakgrund síðuteigsins', - language: 'Mál', - assets: 'Tilfar', - max_asset_size_mb: 'Hámarksstødd á tilfari (MB)', - max_asset_size_mb_desc: - 'Hámarksstøddin, í megabýtum, á tilfari ið verður uppsent. Møguligt er at nýta desimalar.', - assets_allowed_mime_types: 'Loyvt slag av tilfari', - assets_allowed_mime_types_desc: - '(MIME) Sløg av tilfari ið loyvt verður at uppsenda. Um einki slag er ásett eru øll sløg loyvd.', - thumbnail_width: 'Smámyndavídd', - thumbnail_width_desc: 'Víddin á framleiddu smámyndunum, í piksilum.', - thumbnail_height: 'Smámyndahædd', - thumbnail_height_desc: 'Hæddin á framleiddu smámyndunum, í piksilum.', - thumbnail_format: 'Smámyndaforsnið', - thumbnail_format_desc: - 'Forsnið á framleiddu smámyndunum (PNG, JPEG, o.s.fr.).', - max_assets_per_user: 'Hámark av tilfari fyri hvønn brúkara', - max_assets_per_user_desc: - 'Hámark av tilfari ið hvør brúkari sleppur at uppsenda. Null merkir at uppsending er noktað.', - assets_no_limit_users: 'Brúkarir undantiknir tilfarsmørkum', - assets_no_limit_users_desc: - 'Hesir brúkarir eru undantiknir hámarkinum av uppsendum tilfari (grundað á brúkaraeyðkenni).', - color_scheme: 'Litaval', - visible_wallet_count: 'Nøgd av vístum mappum', - admin_settings: 'Umsit stillingar', - extension_cost: 'Útgávan krevur eitt gjald á í minsta lagi {cost} sats.', - extension_paid_sats: 'Tú hevur longu goldið {paid_sats} sats.', - extension_permissions_title: 'Játta ískoytisforriti rættindir', - extension_permissions_tab: 'Rættindir ískoytisforritsins', - user_permissions_tab: 'Mínar játtanir', - extension_permissions_none: - 'Hetta ískoytisforritið krevur ongi rættindir undir innlegging.', - user_permissions_none: - 'Tú hevur ikki játtað hesum ískoytisforriti nøkur rættindir.', - user_permissions_max_amount: 'Mark á gjaldsupphædd', - user_permissions_destination_policy: 'Loyvi at rinda til', - user_permissions_no_editable_settings: - 'Hendan játtanin hevur einki at tillaga.', - extension_permissions_grant_install: 'Játta og innlegg', - extension_permissions_high_risk_warning: - 'Hetta ískoytisforritið biður um rættindi at flyta pening.', - extension_permission_risk_low: 'Lítil váði', - extension_permission_risk_medium: 'Miðal váði', - extension_permission_risk_high: 'Stórur váði', - extension_permission_warning_wallet_pay_invoice: - 'Kann brúka pening úr mappum ið eru tøkar á tínum brúkara.', - extension_permission_warning_wallet_pay_invoice_background: - 'Kann brúka pening úr ásettum mappum seinni og uttan inntriv frá brúkara.', - extension_permission_warning_wallet_payments_watch: - 'Kann lesa gjaldssmálutir viðvíkjandi ásettum mappum.', - extension_permission_warning_extension_api_request_write: - 'Kann skriva dátur ella koyra tilgongdir í ásettum ískoytisforritum.', - extension_permission_ext_storage_read: 'Lesa ískoytisforritagoymslu', - extension_permission_ext_storage_read_public: - 'Lesa almenna ískoytisforritagoymslu', - extension_permission_ext_storage_write: 'Skriva til ískoytisforritagoymslu', - extension_permission_ext_storage_read_write: - 'Lesa og skriva til ískoytisforritagoymslu', - extension_permission_extension_api_request: 'Brúka onnur ískoytisforrit', - extension_permission_extension_api_request_extensions: 'Loyvd ískoytisforrit', - extension_permission_access_read: 'Lesa', - extension_permission_access_write: 'Skriva', - extension_permission_http_request: 'Sambinda til ytri vevsíður', - extension_permission_http_request_hosts: 'Loyvdir vertir', - extension_permission_utils_basic: 'Brúka grundleggjandi LNbits hentleikar', - extension_permission_ui_camera_scan_qr: 'Skanna QR-kotur', - extension_permission_wallet_payments_watch: 'Eygleiða gjøld á mappum', - extension_permission_wallet_create_invoice: 'Gera gjaldsumbønir', - extension_permission_wallet_create_invoice_public: - 'Gera Lightning-gjaldsumbønir frá almennum síðum', - extension_permission_wallet_balance_read: 'Síggja mappusaldur', - extension_permission_wallet_list: 'Vísa mappur', - extension_permission_wallet_pay_invoice: 'Rinda gjaldsumbønir', - extension_permission_wallet_pay_invoice_background: - 'Rinda í bakgrundini, uttan inntriv frá brúkara', - create_extension: 'Stovna ískoytisforrit', - release_details_error: 'Bar ikki til at útvega sleppingarstaklutir.', - pay_from_wallet: 'Rinda úr mappuni', - pay_with: 'Rinda við {provider}', - select_payment_provider: 'Vel gjaldsmeklara', - wallet_required: 'Mappa *', - show_qr: 'Vís QR-kotu', - retry_install: 'Royn at leggja inn aftur', - new_payment: 'Rinda av nýggjum', - update_payment: 'Goym gjaldsupplýsingar', - already_paid_question: 'Hevur tú longu goldið?', - sell: 'Sel', - sell_require: 'Virkja ískoytisforritið fyri eitt gjald', - sell_info: - 'Eitt gjald á í minsta lagi {amount} sats er kravt fyri at virkja {name}-ískoytisforritið.', - hide_empty_wallets: 'Fjal tómar mappur', - recheck: 'Eftirkanna', - check: 'Kanna', - check_connection: 'Kanna sambinding', - check_webhook: 'Kanna vevongul', - contributors: 'Stigtakarir', - license: 'Loyvi', - reset_key: 'Endursetanarlykil', - reset_password: 'Endurset loyniorð', - border_choices: 'Rammusnið', - select_all: 'Vel øll', - nfc_supported: 'NFC-hentleiki er møguligur', - nfc_not_supported: 'NFC-hentleiki er ikki møguligur', - expire_date: 'Útgongudagfesting: ', - hash: 'Hash: ', - welcome_lnbits: 'Vælkomin til LNbits', - setup_su_account: 'Ger úrvalsbrúkaran niðanfyri.', - first_install_token: 'Merkið fyri fyrstu innlegging', - create_ticker_converter: 'Ger gjaldoyramerkilíka', - enable_audit: 'Virkja slóðfesti', - recommended: 'Viðmælt', - audit_desc: 'Skráset HTTP-umbønirnar sambært fylgjandi ásetingum', - audit_record_req: 'Skráset body-partin av umbønum', - audit_record_warning: 'Gev gætur: ', - audit_record_req_warning_1: - 'trúnaðardátur, teirra millum loyniorð, verða skrásettar.', - audit_record_req_warning_2: 'body-parturin av umbønunum kann fylla nógv.', - audit_record_use: 'Skal brúkast við fyrivarni.', - audit_ip: 'Skráset IP-atsetur', - audit_ip_desc: 'Skráset IP-atsetur viðskiftarans', - audit_path_params: 'Skráset slóðávirkir (Path Parameters)', - audit_query_params: 'Skráset fyrispurningsávirkir (Query Parameters)', - audit_http_methods: 'Íroknaðir HTTP-háttir', - audit_http_methods_hint: - 'Íroknaðir HTTP-háttir. Er listin tómur verða allir háttir íroknaðir.', - audit_http_methods_label: 'HTTP-háttir', - audit_resp_codes: 'Íroknaðar HTTP-svarkotur', - audit_resp_codes_hint: - 'Íroknaðar HTTP-svarkotur (regex forsnið). Er listin tómur verða allar kotur íroknaðar. T.d.: 4.*, 5.*', - audit_resp_codes_label: 'HTTP-svarkotur (regex)', - audit_paths: 'Íroknaðar slóðir', - audit_paths_hint: - 'Íroknaðar slóðir (regex forsnið). Er listin tómur verða allar slóðir íroknaðar.', - audit_paths_label: 'HTTP-slóð (regex)', - audit_paths_exclude: 'Útiloka slóðir', - audit_paths_exclude_hint: - 'Listi av útilokaðum slóðum (regex forsnið). Er listin tómur verða ongar slóðir útilokaðar.', - audit_paths_exclude_label: 'HTTP-slóð (regex)', - exchange_providers: 'Gjaldoyrakursveitarir', - admin_extensions: 'Umsitingarískoytisforrit', - admin_extensions_label: 'Umsitingarískoytisforrit', - admin_extensions_hint: - 'Ískoytisforrit ið einans er tøk fyri brúkarum við umsitingarligum rættindum', - user_default_extensions: 'Brúkaraforsett ískoytisforrit', - user_default_extensions_label: 'Brúkaraforsett ískoytisforrit', - user_default_extensions_hint: - 'Ískoytisforrit ið forsett verða virkt fyri brúkarunum', - extension_builder: 'Ískoytisforritasavnari', - extension_builder_manifest_url: 'Leinkja til ískoytisforritasavnaraskrá', - extension_builder_manifest_url_hint: - 'Leinkja til eina JSON-skrá við ískoytisforritasavnarastaklutum', - miscellanous: 'Ymiskt', - misc_disable_extensions: 'Óvirkja ískoytsiforrit', - misc_disable_extensions_label: 'Óvirkja øll ískoytisforrit', - misc_disable_extensions_builder: 'Virkja ískoytisforritasavnara', - misc_disable_extensions_builder_label: - 'Lova brúkarum ið ikki hava umsitanarrættindi at brúka ískoytisforritasavnaran', - misc_hide_api: 'Fjal API-upplýsingar', - misc_hide_api_label: - 'Fjalur mappu-API. Tað er upp til hvørt ískoytisforrit sær at halda við stillingini', - wallets_management: 'Fíggjaruppsetan', - funding_source_info: 'Fíggingarkeldu upplýsingar', - funding_source: 'Fíggingarkelda: {wallet_class}', - node_balance: 'Salda knútsins: {balance} sats', - lnbits_balance: 'LNbits-salda: {balance} sats', - funding_reserve_percent: 'Tiltakspeningur: {percent} %', - node_management: 'Knútaumsiting', - node_management_not_supported: - 'Knútaumsiting er ikki møgulig við verandi fíggingarkeldu', - toggle_node_ui: 'Knútanýtslumót', - toggle_public_node_ui: 'Alment knútanýtslumót', - toggle_transactions_node_ui: - 'Flytingarskiljiblað (frámælt á størri CLN-knútum vegna ovbyrjan)', - invoice_expiry: 'Loka gjaldsumbøn eftir', - routing_fee_reserve_calculations: 'Beiningaravgjaldstiltaksútrokningar', - routing_fee_reserve_calculations_desc: - 'Fyri hvørt útgjald setur LNbits eina "tiltaksupphædd" til síðis at rinda beiningaravgjøld. Hámarkið á beiningaravgjaldinum ið verður handað fíggingarkelduni er tað hægra av fylgjandi: lágmarkið fyri beiningaravgjald ella beiningaravgjald í prosentum.', - millisats: 'millisats', - fee_reserve: 'Lágmark fyri beiningaravgjald', - fee_reserve_percent: 'Beiningaravgjald í prosentum', - fee_reserve_min_hint: - 'Lágmark fyri beiningariavgjald fyri hvørt gjald.
Hetta riggar sum eitt minstamark - mest loyvda beiningaravgjald verður ongantíð lægri, uttan mun til gjaldsupphæddina.', - fee_reserve_percent_hint: - 'Prosent av gjaldsupphæddini at seta av til beiningaravgjald.', - payment_timeouts: 'Gjaldsfreistir', - payment_wait_time: 'Greiðslubíðitíð (sek.)', - seconds: 'sekund', - payment_pending_interval: 'Greiðslukanningarmillumbil (sek.)', - payment_pending_interval_desc: 'Tíðin ímillum óavgreidd gjøld verða kannaði', - payment_pending_interval_tooltip: - 'Ásetur títtleikan ið LNbits kannar og tillagar støðuna á óavgreiddum gjøldum. Longri millumbil kunnu lætta um byrðu knútsins og elva til skjótari greiðslur, ímeðan støðan á óavgreiddum gjøldum ikki verður dagførd líka títt.', - payment_wait_time_desc: - 'Bíðitíð áðrenn útgjøld verða merkt at verða í bíðistøðu. Forsett: 5 sek.; hækka í fall gjaldsumbønirnar taka langa tíð at avroknað.', - payment_wait_time_tooltip: - 'Ásetur tíðina ið LNbits bíðar eftir váttan fyri eitt útgjáld áðrenn útgjaldið verður sett í bíðistøðu. Longri bíðitíðir eru hóskandi tá ein skal rinda gjaldsumbønir ið taka longri tí at avroknað (t.d. HODL-gjaldsumbønir, Boltz). Møguligt er at kannað útgjaldið seinni og tað verður eisini kannað sjálvvirkandi við jøvnum millumbilum.', - server_management: 'Ambætaraumsiting', - base_url_label: 'Fastbundin rótleinkja til hendan ambætaran', - authentication: 'Samgilding', - auth_token_expiry_label: 'Merkigildistíð í minuttum', - auth_token_expiry_hint: 'Minuttir ið merkir eru gildið', - auth_authentication_cache_label: 'Kovatíð (minuttir)', - auth_authentication_cache_hint: - 'Minuttir ið eydnaðar samgildingar verða goymdar í kovanum (áset 0 fyri at óvirkja)', - auth_allowed_methods_label: 'Loyvdir samgildisháttir', - auth_allowed_methods_hint: 'Vel samgildisháttir', - auth_nostr_label: 'Nostr-umbønarleinkja', - auth_nostr_hint: - 'Fullfíggjaðar leinkjur ið viðskiftarar skulu brúka til innritanir.', - auth_google_ci_label: 'Google-viðskiftaraeyðmerki', - auth_google_ci_hint: - 'Tryggja at góðkenda víðaribeiningin inniheldur https://{domain}/api/v1/auth/google/token', - auth_google_cs_label: 'Google-viðskiftaraloyna', - auth_gh_client_id_label: 'GitHub-viðskiftaraeyðmerki', - auth_gh_client_id_hint: - 'Tryggja at samgildisafturtøkukallsleinkjan er sett til https://{domain}/api/v1/auth/github/token', - auth_gh_client_secret_label: 'GitHub-viðskiftaraloyna', - auth_keycloak_label: 'Keycloak-viðrakanarleinkja', - auth_keycloak_ci_label: 'Keycloak-viðskiftaraeyðmerki', - auth_keycloak_ci_hint: - 'Tryggja at samgildisafturtøkukallsleinkjan er sett til https://{domain}/api/v1/auth/keycloak/token', - auth_keycloak_cs_label: 'Keycloak-viðskiftaraloyna', - auth_keycloak_custom_org_label: 'Tillaga Keycloak-felag', - auth_keycloak_custom_icon_label: 'Tillaga Keycloak ímynd (leinkja)', - auth_oidc_label: 'OIDC-viðrakanarleinkja', - auth_oidc_ci_label: 'OIDC-viðskiftaraeyðmerki', - auth_oidc_ci_hint: - 'Tryggja at samgildisafturtøkukallsleinkjan er sett til https://{domain}/api/v1/auth/oidc/token', - auth_oidc_cs_label: 'OIDC-viðskiftaraloyna', - auth_oidc_custom_org_label: - 'Tillaga OIDC navn á felagi (t.d. Zitadel, Authentik)', - auth_oidc_custom_icon_label: 'Tillaga OIDC ímynd (leinkja)', - currency_settings: 'Gjaldoyrastillingar', - allowed_currencies: 'Loyvd gjaldoyru', - allowed_currencies_hint: 'Avmarka tøk fiat gjaldoyru', - default_account_currency: 'Forsett roknskapargjaldoyra', - default_account_currency_hint: 'Forsett gjaldoyra til roknskaparførslu', - min_incoming_payment_amount: 'Inngjaldslágmark', - min_incoming_payment_amount_desc: - 'Minst loyvda upphædd tá gjaldsumbøn verður gjørd', - max_incoming_payment_amount: 'Inngjaldshámark', - max_incoming_payment_amount_desc: - 'Hægst loyvda upphædd tá gjaldsumbøn verður gjørd', - max_outgoing_payment_amount: 'Útgjaldshámark', - max_outgoing_payment_amount_desc: - 'Hægst loyvda upphædd á hvørjum útgjaldi sær', - service_fees: 'Tænastuavgjøld', - service_fee: 'Tænastuavgjald', - service_fee_label: 'Tænastuavgjald (%)', - service_fee_hint: 'Avgjald kravt fyri hvørja flyting (%)', - service_fee_max: 'Hámark fyri tænastuavgjald', - service_fee_max_label: 'Hámark fyri tænastuavgjald (sats)', - service_fee_max_hint: 'Hámark fyri kravt tænastugjald í satoshis', - fee_wallet: 'Avgjaldsmappa', - fee_wallet_label: 'Avgjaldsmappa (mappueyðmerki)', - fee_wallet_hint: 'Eyðmerki á mappu ið tænastuavgjøld verða góðskrivað á', - disable_fee: 'Óvirkja tænastuavgjald', - disable_fee_internal: 'Óvirkja tænastuavgjald fyri innanknútsins gjøld', - disable_fee_internal_desc: - 'Óvirkja tænastuavgjald fyri innanknútsins Lightning gjøld', - ui_management: 'Nýtslumótumsiting', - ui_site_title: 'Síðuheiti', - ui_changing_remove_lnbits_elements: - ' (tillaging elvir til at LNbits-lutir á forsíðuni og síðufótinum verða strikaðir)', - ui_site_tagline: 'Síðuslagorð', - ui_elements_enable: 'Vís lutir á forsíðufótinum', - ui_elements_disable: 'Fjal lutir á forsíðufótinum', - ui_toggle_elements_tip: - "Strikar lutir so sum LNbits-útgávu og 'Koyrir á' frá forsíðuni", - ui_site_description: 'Síðulýsing', - ui_site_description_hint: 'Nýt vanligan tekst, Markdown, ella rátt HTML', - ui_default_wallet_name: 'Forsett mappunavn', - ui_default_theme: 'Forsett snið', - wallet_featured_button_title: 'Tillagaður knøttur á mappusíðuni', - wallet_featured_button_label: 'Tekstur á tillagaum knøtti', - wallet_featured_button_label_hint: 'Vís sermerktan knøtt á mappusíðuni', - wallet_featured_button_url: 'Leinkja ið tillagi knøtturin peikar á', - wallet_featured_button_url_hint: - 'Leinkjan verður latin upp tá trýst verður á knøttin. Lat teigin verða tóman fyri at fjala knøttin.', - wallet_featured_button_icon: 'Ímynd á tillagaða knøttinum', - wallet_featured_button_icon_hint: - 'Quasar-ímyndarnavnið ið skal vísast á knøttinum (t.d. "bolt")', - lnbits_wallet: 'LNbits-mappa', - denomination: 'Heiti', - denomination_hint: 'Heitið á FakeWallet-myntlíkinum', - denomination_error: 'Heitið skal verða 3 stavir, ella `sats`', - ui_qr_code_logo: 'Ímynd á QR-kotum og snarvegum', - ui_qr_code_logo_hint: - 'Leinkja til ímynd ið skal brúkast á QR-kotum og snarvegum', - ui_apple_touch_icon: 'Apple Touch ímynd', - ui_apple_touch_icon_hint: 'Leinkja til Apple touch ímynd', - ui_custom_image: 'Tillagað mynd', - ui_custom_image_label: 'Leinkja til tillagaða mynd', - ui_custom_image_hint: 'Mynd víst á forsíðu/innritanarsíðu', - ui_custom_badge_title: 'Tillaga spjaldur', - ui_custom_badge_desc: 'Vís tillagaðan spjaldratekst ovast á LNbits síðuni', - ui_custom_badge: 'Tillagaður spjaldratekstur', - ui_custom_badge_label: "Tillagaður spjaldratekstur 'BRÚKA VIÐ FYRIVARNI'", - ui_custom_badge_color_label: 'Litur á spjaldrinum', - themes: 'Snið', - themes_hint: 'Tilskilaði snið ið verða tøk fyri brúkarum', - custom_logo: 'Umsitaravalt búmerki', - custom_logo_hint: 'Leinkja ið peikar til búmerkið', - ad_space_section_title: 'Lýsingarteigur', - ad_space_section_desc: 'Tillaga lýsingarteigin á mappusíðuni.', - ad_space_title: 'Tekstur á lýsingarteigi', - ad_space_title_hint: 'Tekstur vístur omanfyri lýsingarteigin', - ad_slots: 'Lýsingar', - ad_slots_hint: - 'Leinkjur og myndaleinkjur í CSV-forsniði. Tað er upp til hvørt ískoytisforrit sær at halda við stillingini.', - ads_enabled: 'Vís lýsingar', - ads_disabled: 'Fjal lýsingar', - user_management: 'Brúkaraumsiting', - admin_users: 'Umsitarir', - admin_users_hint: 'Brúkarar við umsitingarrættindum', - admin_users_label: 'Brúkaraeyðmerki', - allowed_users: 'Loyvdir brúkarar', - allowed_users_hint: 'Einans fylgjandi brúkarar kunnu nýta LNbits', - allowed_users_hint_feature: '{feature} er avmarkað til hesar brúkararnar', - allowed_users_label: 'Brúkaraeyðmerki', - allow_creation_user: 'Loyv skráseting av nýggjum brúkarum', - allow_creation_user_desc: - 'Loyv stovnan av nýggjum brúkarum umvegis forsíðuna', - require_user_activation: 'Krev virkjan av nýggjum brúkarum', - require_user_activation_desc: - 'Nýggir brúkarir verða virktir við at lúka eina av váttanartreytunum. Umsitarir kunnu virkja brúkarir frá umsitanarsíðuni og harvið skúgva váttanartreytirnar til viks fyri brúkarar.', - reusable_activation_code: 'Endurnýtsluvirkjanarkota', - reusable_activation_code_label: 'Endurnýtsluvirkjanarkota', - reusable_activation_code_hint: - 'Hendan virkjanarkotan kann nýtast fleiri ferðir av ymiskum brúkarum.', - one_time_activation_code: 'Einnýtisvirkjanarkotur', - one_time_activation_code_label: 'Legg virkjanarkotu inn', - one_time_activation_code_hint: - 'Einnýtisvirkjanarkotur. Hvør kota kann bert nýtast einaferð og verður strika úr listanum eftir at hon er brúkt.', - invitation_code: 'Innbjóðingarkota', - invitation_code_hint: 'Innbjóðingarkotan ið tú hevur fingið.', - new_user_not_allowed: 'Skráseting av nýggjum brúkarum er óvirkt.', - start_user_impersonation: 'Lát at vera hesin brúkarin', - stop_user_impersonation: 'Lát ikki longur at vera brúkari', - components: 'Forritsliðir', - long_running_endpoints: '5 endapunktini ið hava koyrt longst', - http_request_methods: 'HTTP-umbønarháttir', - http_response_codes: 'HTTP-svarkotur', - request_details: 'Smálutir umbønarinnar', - http_request_details: 'HTTP-umbønarsmálutir', - payment_details: 'Gjaldssmálutir', - payment_details_desc: 'Nágreiniligir staklutir gjaldsins', - payments: 'Gjøld', - payment_show_internal: 'Vís innanhýsis gjøld', - payment_chart_flow: 'Mánaðarligur peningastreymur', - payment_chart_status: 'Gjaldstøður', - payment_chart_tx_per_wallet: 'Flytingar fyri hvørja mappu (upphædd/nøgd)', - payment_details_back: 'Aftur til gjøld', - payment_chart_tags: 'Gjøld eftir spjøldrum', - payments_balance_in_out: 'Inn- og útgjaldsupphæddir', - payments_count_in_out: 'Nøgd av inn- og útgjøldum', - payments_status_chart: 'Støðumynd', - payments_tag_chart: 'Spjaldrasirkulmynd', - payments_balance_chart: 'Saldulinjumynd', - payments_wallets_chart: 'Mappumynd', - payments_balance_in_out_chart: 'Inn- og útgjaldsupphæddir', - payments_count_in_out_chart: 'Nøgd av inn- og útgjøldum', - reset_wallet_keys: 'Endurset lyklar', - reset_wallet_keys_desc: - 'Endurset API lyklarnar fyri mappuna. Hetta ógildar verandi lyklar og framleiður nýggjar lyklar.', - view_list: 'Vís mappur í lista', - view_column: 'Vís mappur í teigum', - filter_payments: 'Filtrera gjøld', - filter_labels: 'Filtrera spjøldur', - filter_date: 'Filtrera út frá tíðarskeiði', - websocket_example: 'Vevsokkul dømi', - client_id: 'Viðskiftaraeyðmerki', - secret_key: 'Loyniligur lykil', - signing_secret: 'Undirritanarlykil', - signing_secret_hint: - 'Undirritanarlykil fyri vevongulin. Boð verða undirritaði við hesum lyklinum.', - webhook_id: 'Vevongulseyðmerki', - webhook_id_hint: 'PayPal-vevongulseyðmerki ið váttar inngangandi hendingar.', - webhook_paypal_description: - 'Uppset ein vevongul ið peikar á tín LNbits-ambætara á PayPal-síðuni.', - square_webhook_signature_key_hint: - 'Square-vevongulsundirritanarlykil ið váttar inngandi hendingar.', - callback_success_url: 'Afturtøkukallsleinkja', - callback_success_url_hint: - 'Eftir avgreitt gjald verður brúkarin víðaribeindur til hesa leinkjuna', - connected: 'Sambundin', - not_connected: 'Ikki sambundin', - free: 'Ókeypis', - paid: 'Til keyps', - funding_source_retries: 'Hámark av endurroyndum', - funding_source_retries_desc: - 'Hámark av endurroyndum av knýta í fíggingarkelduna áðrenn VoidWallet verður virkt.', - add_label: 'Nýtt spjaldur', - label: 'Spjaldur', - labels: 'Spjøldur', - label_filter: 'Spjaldrafiltur', - no_labels_defined: 'Enn eru eingi spjøldur gjørd', - manage_labels: 'Umsit spjøldur', - update_label: 'Broyt spjaldur', - delete_label: 'Strika spjaldur', - add_remove_labels: 'Áset ella strika spøldur', - payment_labels_updated: 'Spjøldur á gjaldi broytt', - color: 'Litur', - sort: 'Raða', - sort_by: 'Raða eftir' -} diff --git a/lnbits/static/i18n/fr.js b/lnbits/static/i18n/fr.js index 2ee9373cd..58e598747 100644 --- a/lnbits/static/i18n/fr.js +++ b/lnbits/static/i18n/fr.js @@ -75,10 +75,6 @@ window.localisation.fr = { view_swagger_docs: "Voir les documentation de l'API Swagger de LNbits", api_docs: "Documentation de l'API", api_keys_api_docs: 'URL du nœud, clés API et documentation API', - api_keys_warning: - 'Ces clés doivent être conservées en lieu sûr ; les partager pourrait entraîner la perte de fonds.', - admin_key_warning: - "Votre clé d'administrateur donne un accès complet à votre portefeuille, y compris la possibilité d'envoyer des paiements. Ne la partagez jamais, sauf si vous faites entièrement confiance au destinataire.", lnbits_version: 'Version de LNbits', runs_on: 'Fonctionne sur', paste: 'Coller', @@ -460,48 +456,5 @@ window.localisation.fr = { http_request_methods: 'Méthodes de requête HTTP', http_response_codes: 'Codes de réponse HTTP', request_details: 'Détails de la demande', - http_request_details: 'Détails de la requête HTTP', - block_explorer: 'Block Explorer', - enable_block_explorer: 'Activer le Block Explorer', - block_explorer_desc: - "Permet aux utilisateurs d'explorer les transactions et adresses Bitcoin via Electrum.", - blockexplorer_public_api: 'Accès API public', - blockexplorer_public_api_desc: - "Autoriser l'accès non authentifié aux endpoints de l'API de l'explorateur de blocs.", - electrum_server_url: 'URL du serveur Electrum', - electrum_server_url_hint: - 'p.ex. ssl://electrum.blockstream.info:50002 ou tcp://localhost:50001', - blockexplorer_search_label: 'Rechercher par TXID ou adresse', - blockexplorer_search_hint: - 'Hex 64 caractères = transaction · autre chose = adresse Bitcoin', - recent_blocks: 'Blocs récents', - chain_tip: 'Sommet de chaîne', - block_height: 'Hauteur de bloc', - block_fee: 'frais de bloc', - fee_estimates: 'Estimations de frais', - confirmed_balance: 'Solde confirmé', - unconfirmed_balance: 'Solde non confirmé', - transaction_history: 'Historique des transactions', - coinbase: 'Coinbase', - inputs: 'Entrées', - outputs: 'Sorties', - confirmations: 'Confirmations', - confirmed: 'Confirmé', - unconfirmed: 'Non confirmé', - history_unavailable: - 'Historique des transactions indisponible (adresse avec trop de transactions)', - address: 'Adresse', - block_number: 'Bloc #{height}', - block_diff: 'diff {value}', - block_hash: 'Hash', - previous_block: 'Bloc précédent', - merkle_root: 'Racine de Merkle', - version: 'Version', - bits: 'Bits', - difficulty: 'Difficulté', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Taille virtuelle', - weight: 'Poids', - n_block_fee: 'frais {n} blocs' + http_request_details: 'Détails de la requête HTTP' } diff --git a/lnbits/static/i18n/it.js b/lnbits/static/i18n/it.js index db295faa2..eb23c9106 100644 --- a/lnbits/static/i18n/it.js +++ b/lnbits/static/i18n/it.js @@ -73,10 +73,6 @@ window.localisation.it = { view_swagger_docs: "Visualizza i documentazione dell'API Swagger di LNbits", api_docs: "Documentazione dell'API", api_keys_api_docs: 'URL del nodo, chiavi API e documentazione API', - api_keys_warning: - 'Queste chiavi devono essere conservate al sicuro; condividerle potrebbe causare la perdita di fondi.', - admin_key_warning: - 'La tua chiave di amministratore concede accesso completo al tuo portafoglio, inclusa la possibilità di inviare pagamenti. Non condividerla mai, a meno che tu non ti fidi completamente del destinatario.', lnbits_version: 'Versione di LNbits', runs_on: 'Esegue su', paste: 'Incolla', @@ -454,48 +450,5 @@ window.localisation.it = { http_request_methods: 'Metodi di richiesta HTTP', http_response_codes: 'Codici di risposta HTTP', request_details: 'Dettagli della richiesta', - http_request_details: 'Dettagli della richiesta HTTP', - block_explorer: 'Block Explorer', - enable_block_explorer: 'Abilita Block Explorer', - block_explorer_desc: - 'Consenti agli utenti di esplorare transazioni e indirizzi Bitcoin tramite Electrum.', - blockexplorer_public_api: 'Accesso API pubblico', - blockexplorer_public_api_desc: - "Consenti accesso non autenticato agli endpoint API dell'esploratore di blocchi.", - electrum_server_url: 'URL server Electrum', - electrum_server_url_hint: - 'es. ssl://electrum.blockstream.info:50002 o tcp://localhost:50001', - blockexplorer_search_label: 'Cerca per TXID o indirizzo', - blockexplorer_search_hint: - 'Hex 64 caratteri = transazione · altro = indirizzo Bitcoin', - recent_blocks: 'Blocchi recenti', - chain_tip: 'Punta della catena', - block_height: 'Altezza blocco', - block_fee: 'commissione blocco', - fee_estimates: 'Stime delle commissioni', - confirmed_balance: 'Saldo confermato', - unconfirmed_balance: 'Saldo non confermato', - transaction_history: 'Storico transazioni', - coinbase: 'Coinbase', - inputs: 'Input', - outputs: 'Output', - confirmations: 'Conferme', - confirmed: 'Confermato', - unconfirmed: 'Non confermato', - history_unavailable: - "Storico transazioni non disponibile (l'indirizzo ha troppe transazioni)", - address: 'Indirizzo', - block_number: 'Blocco #{height}', - block_diff: 'diff {value}', - block_hash: 'Hash', - previous_block: 'Blocco precedente', - merkle_root: 'Radice di Merkle', - version: 'Versione', - bits: 'Bit', - difficulty: 'Difficoltà', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Dimensione virtuale', - weight: 'Peso', - n_block_fee: 'commissione {n} blocchi' + http_request_details: 'Dettagli della richiesta HTTP' } diff --git a/lnbits/static/i18n/jp.js b/lnbits/static/i18n/jp.js index 23f22c9ae..9752183b8 100644 --- a/lnbits/static/i18n/jp.js +++ b/lnbits/static/i18n/jp.js @@ -69,10 +69,6 @@ window.localisation.jp = { view_swagger_docs: 'Swaggerドキュメントを表示', api_docs: 'APIドキュメント', api_keys_api_docs: 'ノードURL、APIキー、APIドキュメント', - api_keys_warning: - 'これらのキーは安全に保管してください。共有すると資金を失うおそれがあります。', - admin_key_warning: - '管理者キーは、支払いの送信を含むウォレットへの完全なアクセスを許可します。受取人を完全に信頼している場合を除き、決して共有しないでください。', lnbits_version: 'LNbits バージョン', runs_on: 'で実行', paste: '貼り付け', @@ -444,48 +440,5 @@ window.localisation.jp = { http_request_methods: 'HTTPリクエストメソッド', http_response_codes: 'HTTPレスポンスコード', request_details: 'リクエストの詳細', - http_request_details: 'HTTPリクエストの詳細', - block_explorer: 'ブロックエクスプローラー', - enable_block_explorer: 'ブロックエクスプローラーを有効化', - block_explorer_desc: - 'Electrumを介してビットコインのトランザクションとアドレスを探索できます。', - blockexplorer_public_api: 'パブリックAPIアクセス', - blockexplorer_public_api_desc: - 'ブロックエクスプローラーAPIエンドポイントへの非認証アクセスを許可します。', - electrum_server_url: 'ElectrumサーバーURL', - electrum_server_url_hint: - '例: ssl://electrum.blockstream.info:50002 または tcp://localhost:50001', - blockexplorer_search_label: 'TXIDまたはアドレスで検索', - blockexplorer_search_hint: - '64文字の16進数 = トランザクション · それ以外 = ビットコインアドレス', - recent_blocks: '最新ブロック', - chain_tip: 'チェーン先端', - block_height: 'ブロック高さ', - block_fee: 'ブロック手数料', - fee_estimates: '手数料見積もり', - confirmed_balance: '確認済み残高', - unconfirmed_balance: '未確認残高', - transaction_history: 'トランザクション履歴', - coinbase: 'コインベース', - inputs: 'インプット', - outputs: 'アウトプット', - confirmations: '確認数', - confirmed: '確認済み', - unconfirmed: '未確認', - history_unavailable: - 'トランザクション履歴が取得できません(アドレスのトランザクションが多すぎます)', - address: 'アドレス', - block_number: 'ブロック #{height}', - block_diff: 'diff {value}', - block_hash: 'ハッシュ', - previous_block: '前のブロック', - merkle_root: 'マークルルート', - version: 'バージョン', - bits: 'Bits', - difficulty: '難易度', - nonce: 'Nonce', - txid: 'TXID', - vsize: '仮想サイズ', - weight: '重量', - n_block_fee: '{n}ブロック手数料' + http_request_details: 'HTTPリクエストの詳細' } diff --git a/lnbits/static/i18n/kr.js b/lnbits/static/i18n/kr.js index 0bded5c58..d473afc71 100644 --- a/lnbits/static/i18n/kr.js +++ b/lnbits/static/i18n/kr.js @@ -71,10 +71,6 @@ window.localisation.kr = { view_swagger_docs: 'LNbits Swagger API 문서를 봅니다', api_docs: 'API 문서', api_keys_api_docs: '노드 URL, API 키와 API 문서', - api_keys_warning: - '이 키는 안전하게 보관해야 하며, 공유하면 자금을 잃을 위험이 있습니다.', - admin_key_warning: - '관리자 키는 결제 전송을 포함하여 지갑에 대한 모든 권한을 부여합니다. 수신자를 완전히 신뢰하는 경우가 아니라면 절대 공유하지 마세요.', lnbits_version: 'LNbits 버전', runs_on: 'Runs on', paste: '붙여넣기', @@ -439,47 +435,5 @@ window.localisation.kr = { http_request_methods: 'HTTP 요청 메서드', http_response_codes: 'HTTP 응답 코드', request_details: '요청 세부사항', - http_request_details: 'HTTP 요청 세부사항', - block_explorer: '블록 탐색기', - enable_block_explorer: '블록 탐색기 활성화', - block_explorer_desc: - 'Electrum을 통해 비트코인 거래 및 주소를 탐색할 수 있습니다.', - blockexplorer_public_api: '공개 API 접근', - blockexplorer_public_api_desc: - '블록 탐색기 API 엔드포인트에 대한 비인증 접근을 허용합니다.', - electrum_server_url: 'Electrum 서버 URL', - electrum_server_url_hint: - '예: ssl://electrum.blockstream.info:50002 또는 tcp://localhost:50001', - blockexplorer_search_label: 'TXID 또는 주소로 검색', - blockexplorer_search_hint: '64자 16진수 = 거래 · 그 외 = 비트코인 주소', - recent_blocks: '최근 블록', - chain_tip: '체인 끝', - block_height: '블록 높이', - block_fee: '블록 수수료', - fee_estimates: '수수료 추정', - confirmed_balance: '확인된 잔액', - unconfirmed_balance: '미확인 잔액', - transaction_history: '거래 내역', - coinbase: 'Coinbase', - inputs: '입력', - outputs: '출력', - confirmations: '확인 수', - confirmed: '확인됨', - unconfirmed: '미확인', - history_unavailable: - '거래 내역을 불러올 수 없습니다 (주소의 거래가 너무 많음)', - address: '주소', - block_number: '블록 #{height}', - block_diff: 'diff {value}', - block_hash: '해시', - previous_block: '이전 블록', - merkle_root: '머클 루트', - version: '버전', - bits: 'Bits', - difficulty: '난이도', - nonce: 'Nonce', - txid: 'TXID', - vsize: '가상 크기', - weight: '무게', - n_block_fee: '{n}블록 수수료' + http_request_details: 'HTTP 요청 세부사항' } diff --git a/lnbits/static/i18n/nl.js b/lnbits/static/i18n/nl.js index d103db7ec..08bca2c2d 100644 --- a/lnbits/static/i18n/nl.js +++ b/lnbits/static/i18n/nl.js @@ -73,10 +73,6 @@ window.localisation.nl = { view_swagger_docs: 'Bekijk LNbits Swagger API-documentatie', api_docs: 'API-documentatie', api_keys_api_docs: 'Node URL, API-sleutels en API-documentatie', - api_keys_warning: - 'Bewaar deze sleutels veilig; het delen ervan kan leiden tot verlies van tegoeden.', - admin_key_warning: - 'Je beheerderssleutel geeft volledige toegang tot je wallet, inclusief de mogelijkheid om betalingen te versturen. Deel deze nooit, tenzij je de ontvanger volledig vertrouwt.', lnbits_version: 'LNbits-versie', runs_on: 'Draait op', paste: 'Plakken', @@ -454,48 +450,5 @@ window.localisation.nl = { http_request_methods: 'HTTP-aanvraagmethoden', http_response_codes: 'HTTP-responscodes', request_details: 'Aanvraagdetails', - http_request_details: 'HTTP-verzoekdetails', - block_explorer: 'Block Explorer', - enable_block_explorer: 'Block Explorer inschakelen', - block_explorer_desc: - 'Laat gebruikers Bitcoin-transacties en -adressen verkennen via Electrum.', - blockexplorer_public_api: 'Publieke API-toegang', - blockexplorer_public_api_desc: - 'Niet-geauthenticeerde toegang tot de block explorer API-eindpunten toestaan.', - electrum_server_url: 'Electrum-server-URL', - electrum_server_url_hint: - 'bijv. ssl://electrum.blockstream.info:50002 of tcp://localhost:50001', - blockexplorer_search_label: 'Zoeken op TXID of adres', - blockexplorer_search_hint: - '64-karakter hex = transactie · alles anders = Bitcoin-adres', - recent_blocks: 'Recente blokken', - chain_tip: 'Kettingtop', - block_height: 'Blokhoogte', - block_fee: 'blokvergoeding', - fee_estimates: 'Vergoedingsschattingen', - confirmed_balance: 'Bevestigd saldo', - unconfirmed_balance: 'Onbevestigd saldo', - transaction_history: 'Transactiegeschiedenis', - coinbase: 'Coinbase', - inputs: 'Invoer', - outputs: 'Uitvoer', - confirmations: 'Bevestigingen', - confirmed: 'Bevestigd', - unconfirmed: 'Onbevestigd', - history_unavailable: - 'Transactiegeschiedenis niet beschikbaar (adres heeft te veel transacties)', - address: 'Adres', - block_number: 'Blok #{height}', - block_diff: 'moeil. {value}', - block_hash: 'Hash', - previous_block: 'Vorig blok', - merkle_root: 'Merkle-wortel', - version: 'Versie', - bits: 'Bits', - difficulty: 'Moeilijkheid', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Virtuele grootte', - weight: 'Gewicht', - n_block_fee: '{n}-blok vergoeding' + http_request_details: 'HTTP-verzoekdetails' } diff --git a/lnbits/static/i18n/pi.js b/lnbits/static/i18n/pi.js index f3287e6cb..31a00c539 100644 --- a/lnbits/static/i18n/pi.js +++ b/lnbits/static/i18n/pi.js @@ -72,10 +72,6 @@ window.localisation.pi = { view_swagger_docs: 'View LNbits Swagger API docs and learn the secrets', api_docs: 'API docs for the scallywags', api_keys_api_docs: 'Node URL, API keys and API docs', - api_keys_warning: - 'Keep these keys safe, matey; sharing them could lose ye yer doubloons.', - admin_key_warning: - 'Yer admin key gives full access to yer wallet, including sending payments. Never share it unless ye trust the recipient completely.', lnbits_version: 'LNbits version, arr!', runs_on: 'Runs on, matey', paste: 'Stow', @@ -445,48 +441,5 @@ window.localisation.pi = { http_request_methods: 'HTTP Request Methods', http_response_codes: 'HTTP Response Codes', request_details: 'Request Details', - http_request_details: 'HTTP Request Details', - block_explorer: 'Treasure Map', - enable_block_explorer: 'Hoist the Treasure Map', - block_explorer_desc: - "Let scallywags spy on Bitcoin doubloons an' addresses via Electrum.", - blockexplorer_public_api: 'Open Seas API', - blockexplorer_public_api_desc: - 'Allow any landlubber access to the block explorer API ports.', - electrum_server_url: 'Electrum Port URL', - electrum_server_url_hint: - 'e.g. ssl://electrum.blockstream.info:50002 or tcp://localhost:50001', - blockexplorer_search_label: 'Search by TXID or Port', - blockexplorer_search_hint: - '64-char hex = plunder · anything else = Bitcoin port', - recent_blocks: 'Recent Plunder', - chain_tip: "Tip o' the Anchor Chain", - block_height: 'Plunder Height', - block_fee: 'plunder fee', - fee_estimates: 'Booty Estimates', - confirmed_balance: 'Confirmed Booty', - unconfirmed_balance: 'Unconfirmed Booty', - transaction_history: 'Plunder History', - coinbase: 'Coinbase', - inputs: 'Inbound Plunder', - outputs: 'Outbound Plunder', - confirmations: 'Confirmations, arr', - confirmed: 'Confirmed, arr', - unconfirmed: 'Unconfirmed, arr', - history_unavailable: - 'Plunder history lost at sea (too many transactions, matey!)', - address: 'Port', - block_number: 'Block #{height}', - block_diff: 'diff {value}', - block_hash: 'Hash', - previous_block: 'Previous Plunder Block', - merkle_root: 'Merkle Root', - version: 'Version', - bits: 'Bits', - difficulty: 'Difficulty', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Virtual Size', - weight: 'Weight', - n_block_fee: '{n}-block booty' + http_request_details: 'HTTP Request Details' } diff --git a/lnbits/static/i18n/pl.js b/lnbits/static/i18n/pl.js index 363c3cb30..e02f1b5f0 100644 --- a/lnbits/static/i18n/pl.js +++ b/lnbits/static/i18n/pl.js @@ -71,10 +71,6 @@ window.localisation.pl = { view_swagger_docs: 'Dokumentacja Swagger API', api_docs: 'Dokumentacja API', api_keys_api_docs: 'Adres URL węzła, klucze API i dokumentacja API', - api_keys_warning: - 'Te klucze należy przechowywać bezpiecznie; ich udostępnienie może grozić utratą środków.', - admin_key_warning: - 'Twój klucz administratora zapewnia pełny dostęp do portfela, w tym możliwość wysyłania płatności. Nigdy go nie udostępniaj, chyba że całkowicie ufasz odbiorcy.', lnbits_version: 'Wersja LNbits', runs_on: 'Działa na', paste: 'Wklej', @@ -448,48 +444,5 @@ window.localisation.pl = { http_request_methods: 'Metody żądań HTTP', http_response_codes: 'Kody Odpowiedzi HTTP', request_details: 'Szczegóły żądania', - http_request_details: 'Szczegóły żądania HTTP', - block_explorer: 'Przeglądarka bloków', - enable_block_explorer: 'Włącz przeglądarkę bloków', - block_explorer_desc: - 'Umożliwia użytkownikom przeglądanie transakcji i adresów Bitcoin przez Electrum.', - blockexplorer_public_api: 'Publiczny dostęp do API', - blockexplorer_public_api_desc: - 'Zezwól na nieuwierzytelniony dostęp do punktów końcowych API przeglądarki bloków.', - electrum_server_url: 'URL serwera Electrum', - electrum_server_url_hint: - 'np. ssl://electrum.blockstream.info:50002 lub tcp://localhost:50001', - blockexplorer_search_label: 'Szukaj po TXID lub adresie', - blockexplorer_search_hint: - '64-znakowy hex = transakcja · cokolwiek innego = adres Bitcoin', - recent_blocks: 'Ostatnie bloki', - chain_tip: 'Wierzchołek łańcucha', - block_height: 'Wysokość bloku', - block_fee: 'opłata bloku', - fee_estimates: 'Szacunki opłat', - confirmed_balance: 'Potwierdzony saldo', - unconfirmed_balance: 'Niepotwierdzony saldo', - transaction_history: 'Historia transakcji', - coinbase: 'Coinbase', - inputs: 'Wejścia', - outputs: 'Wyjścia', - confirmations: 'Potwierdzenia', - confirmed: 'Potwierdzone', - unconfirmed: 'Niepotwierdzone', - history_unavailable: - 'Historia transakcji niedostępna (adres ma zbyt wiele transakcji)', - address: 'Adres', - block_number: 'Blok #{height}', - block_diff: 'trud. {value}', - block_hash: 'Hash', - previous_block: 'Poprzedni blok', - merkle_root: 'Korzeń Merkle', - version: 'Wersja', - bits: 'Bity', - difficulty: 'Trudność', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Rozmiar wirtualny', - weight: 'Waga', - n_block_fee: 'opłata {n} bloków' + http_request_details: 'Szczegóły żądania HTTP' } diff --git a/lnbits/static/i18n/pt.js b/lnbits/static/i18n/pt.js index aa11d3993..5fc906a0d 100644 --- a/lnbits/static/i18n/pt.js +++ b/lnbits/static/i18n/pt.js @@ -72,10 +72,6 @@ window.localisation.pt = { view_swagger_docs: 'Ver a documentação da API do LNbits Swagger', api_docs: 'Documentação da API', api_keys_api_docs: 'URL do Nó, chaves de API e documentação de API', - api_keys_warning: - 'Estas chaves devem ser mantidas em segurança; partilhá-las pode resultar na perda de fundos.', - admin_key_warning: - 'A sua chave de administrador concede acesso total à sua carteira, incluindo a capacidade de enviar pagamentos. Nunca a partilhe, a menos que confie plenamente no destinatário.', lnbits_version: 'Versão do LNbits', runs_on: 'Executa em', paste: 'Colar', @@ -450,48 +446,5 @@ window.localisation.pt = { http_request_methods: 'Métodos de Requisição HTTP', http_response_codes: 'Códigos de Resposta HTTP', request_details: 'Detalhes da solicitação', - http_request_details: 'Detalhes da Solicitação HTTP', - block_explorer: 'Block Explorer', - enable_block_explorer: 'Ativar Block Explorer', - block_explorer_desc: - 'Permite aos utilizadores explorar transações e endereços Bitcoin via Electrum.', - blockexplorer_public_api: 'Acesso à API pública', - blockexplorer_public_api_desc: - 'Permitir acesso não autenticado aos endpoints da API do explorador de blocos.', - electrum_server_url: 'URL do servidor Electrum', - electrum_server_url_hint: - 'ex. ssl://electrum.blockstream.info:50002 ou tcp://localhost:50001', - blockexplorer_search_label: 'Pesquisar por TXID ou endereço', - blockexplorer_search_hint: - 'Hex de 64 caracteres = transação · qualquer outra coisa = endereço Bitcoin', - recent_blocks: 'Blocos recentes', - chain_tip: 'Ponta da cadeia', - block_height: 'Altura do bloco', - block_fee: 'taxa de bloco', - fee_estimates: 'Estimativas de taxa', - confirmed_balance: 'Saldo confirmado', - unconfirmed_balance: 'Saldo não confirmado', - transaction_history: 'Histórico de transações', - coinbase: 'Coinbase', - inputs: 'Entradas', - outputs: 'Saídas', - confirmations: 'Confirmações', - confirmed: 'Confirmado', - unconfirmed: 'Não confirmado', - history_unavailable: - 'Histórico de transações indisponível (endereço tem demasiadas transações)', - address: 'Endereço', - block_number: 'Bloco #{height}', - block_diff: 'diff {value}', - block_hash: 'Hash', - previous_block: 'Bloco anterior', - merkle_root: 'Raiz de Merkle', - version: 'Versão', - bits: 'Bits', - difficulty: 'Dificuldade', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Tamanho virtual', - weight: 'Peso', - n_block_fee: 'taxa {n} blocos' + http_request_details: 'Detalhes da Solicitação HTTP' } diff --git a/lnbits/static/i18n/sk.js b/lnbits/static/i18n/sk.js index 4809a3146..ec067fdbc 100644 --- a/lnbits/static/i18n/sk.js +++ b/lnbits/static/i18n/sk.js @@ -69,10 +69,6 @@ window.localisation.sk = { view_swagger_docs: 'Zobraziť LNbits Swagger API dokumentáciu', api_docs: 'API dokumentácia', api_keys_api_docs: 'Adresa uzla, API kľúče a API dokumentácia', - api_keys_warning: - 'Tieto kľúče uchovávajte v bezpečí, ich zdieľanie môže viesť k strate prostriedkov.', - admin_key_warning: - 'Váš administrátorský kľúč poskytuje úplný prístup k peňaženke vrátane možnosti odosielať platby. Nikdy ho nezdieľajte, pokiaľ príjemcovi úplne nedôverujete.', lnbits_version: 'Verzia LNbits', runs_on: 'Beží na', paste: 'Vložiť', @@ -448,48 +444,5 @@ window.localisation.sk = { http_request_methods: 'Metódy HTTP žiadostí', http_response_codes: 'Kódy odpovedí HTTP', request_details: 'Podrobnosti žiadosti', - http_request_details: 'Podrobnosti požiadavky HTTP', - block_explorer: 'Prehliadač blokov', - enable_block_explorer: 'Povoliť prehliadač blokov', - block_explorer_desc: - 'Umožňuje používateľom prehliadať bitcoinové transakcie a adresy cez Electrum.', - blockexplorer_public_api: 'Verejný prístup k API', - blockexplorer_public_api_desc: - 'Povoliť neoverený prístup k API koncovým bodom prieskumníka blokov.', - electrum_server_url: 'URL Electrum servera', - electrum_server_url_hint: - 'napr. ssl://electrum.blockstream.info:50002 alebo tcp://localhost:50001', - blockexplorer_search_label: 'Hľadať podľa TXID alebo adresy', - blockexplorer_search_hint: - '64-znakový hex = transakcia · čokoľvek iné = bitcoinová adresa', - recent_blocks: 'Nedávne bloky', - chain_tip: 'Vrchol reťaze', - block_height: 'Výška bloku', - block_fee: 'poplatok bloku', - fee_estimates: 'Odhady poplatkov', - confirmed_balance: 'Potvrdený zostatok', - unconfirmed_balance: 'Nepotvrdený zostatok', - transaction_history: 'História transakcií', - coinbase: 'Coinbase', - inputs: 'Vstupy', - outputs: 'Výstupy', - confirmations: 'Potvrdenia', - confirmed: 'Potvrdené', - unconfirmed: 'Nepotvrdené', - history_unavailable: - 'História transakcií nedostupná (adresa má príliš veľa transakcií)', - address: 'Adresa', - block_number: 'Blok #{height}', - block_diff: 'obth. {value}', - block_hash: 'Hash', - previous_block: 'Predchádzajúci blok', - merkle_root: 'Merkle koreň', - version: 'Verzia', - bits: 'Bity', - difficulty: 'Obťažnosť', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Virtuálna veľkosť', - weight: 'Váha', - n_block_fee: 'poplatok {n} blokov' + http_request_details: 'Podrobnosti požiadavky HTTP' } diff --git a/lnbits/static/i18n/we.js b/lnbits/static/i18n/we.js index 75f1f7da6..4c4ee0add 100644 --- a/lnbits/static/i18n/we.js +++ b/lnbits/static/i18n/we.js @@ -72,10 +72,6 @@ window.localisation.we = { view_swagger_docs: 'Gweld dogfennau API LNbits Swagger', api_docs: 'Dogfennau API', api_keys_api_docs: 'URL y nod, allweddi API a dogfennau API', - api_keys_warning: - "Dylid cadw'r allweddi hyn yn ddiogel; gall eu rhannu arwain at golli arian.", - admin_key_warning: - "Mae eich allwedd weinyddol yn rhoi mynediad llawn i'ch waled, gan gynnwys y gallu i anfon taliadau. Peidiwch byth â'i rhannu oni bai eich bod yn ymddiried yn llwyr yn y derbynnydd.", lnbits_version: 'Fersiwn LNbits', runs_on: 'Yn rhedeg ymlaen', paste: 'Gludo', @@ -446,48 +442,5 @@ window.localisation.we = { http_request_methods: 'Dulliau Cais HTTP', http_response_codes: 'Codau Ymateb HTTP', request_details: 'Manylion y Cais', - http_request_details: 'Manylion Cais HTTP', - block_explorer: 'Archwiliwr Bloc', - enable_block_explorer: "Galluogi'r Archwiliwr Bloc", - block_explorer_desc: - 'Caniatáu i ddefnyddwyr archwilio trafodion a chyfeiriadau Bitcoin drwy Electrum.', - blockexplorer_public_api: 'Mynediad API Cyhoeddus', - blockexplorer_public_api_desc: - 'Caniatáu mynediad heb ddilysu i bwyntiau terfyn API yr archwiliwr bloc.', - electrum_server_url: 'URL Gweinydd Electrum', - electrum_server_url_hint: - 'e.e. ssl://electrum.blockstream.info:50002 neu tcp://localhost:50001', - blockexplorer_search_label: 'Chwilio yn ôl TXID neu Gyfeiriad', - blockexplorer_search_hint: - 'Hex 64 nod = trafodiad · unrhyw beth arall = cyfeiriad Bitcoin', - recent_blocks: 'Blociau Diweddar', - chain_tip: 'Blaen y Gadwyn', - block_height: 'Uchder Bloc', - block_fee: 'ffi bloc', - fee_estimates: 'Amcangyfrifon Ffi', - confirmed_balance: 'Balans Cadarnhawyd', - unconfirmed_balance: 'Balans Heb ei Gadarnhau', - transaction_history: 'Hanes Trafodion', - coinbase: 'Coinbase', - inputs: 'Mewnbynnau', - outputs: 'Allbynnau', - confirmations: 'Cadarnhadau', - confirmed: 'Cadarnhawyd', - unconfirmed: 'Heb ei Gadarnhau', - history_unavailable: - 'Hanes trafodion ar goll (mae cyfeiriad â gormod o drafodion)', - address: 'Cyfeiriad', - block_number: 'Bloc #{height}', - block_diff: 'anhawster {value}', - block_hash: 'Hash', - previous_block: 'Bloc Blaenorol', - merkle_root: 'Gwreiddyn Merkle', - version: 'Fersiwn', - bits: 'Bits', - difficulty: 'Anhawster', - nonce: 'Nonce', - txid: 'TXID', - vsize: 'Maint Rhithwir', - weight: 'Pwysau', - n_block_fee: 'ffi {n} bloc' + http_request_details: 'Manylion Cais HTTP' } diff --git a/lnbits/static/js/api.js b/lnbits/static/js/api.js index abc590801..ba1936790 100644 --- a/lnbits/static/js/api.js +++ b/lnbits/static/js/api.js @@ -175,9 +175,6 @@ window._lnbitsApi = { wallet.inkey ) }, - getPaymentTotalBreakdown(wallet) { - return this.request('get', '/api/v1/payments/stats/breakdown', wallet.inkey) - }, getPayment(wallet, paymentHash) { return this.request('get', '/api/v1/payments/' + paymentHash, wallet.inkey) }, @@ -196,14 +193,5 @@ window._lnbitsApi = { return LNbits.api .request('GET', `/admin/api/v1/settings/default?field_name=${fieldName}`) .catch(LNbits.utils.notifyApiError) - }, - getBlockexplorerAddress(address) { - return this.request('get', `/blockexplorer/api/v1/address/${address}`) - }, - getBlockexplorerTransaction(txid) { - return this.request('get', `/blockexplorer/api/v1/tx/${txid}`) - }, - getBlockexplorerUtxos(address) { - return this.request('get', `/blockexplorer/api/v1/utxos/${address}`) } } diff --git a/lnbits/static/js/base.js b/lnbits/static/js/base.js index 614a5f03f..b5677b91c 100644 --- a/lnbits/static/js/base.js +++ b/lnbits/static/js/base.js @@ -47,7 +47,6 @@ window.LNbits = { adminkey: data.adminkey, inkey: data.inkey, currency: data.currency, - lightningAddress: data.lightning_address, extra: data.extra, canReceivePayments: true, canSendPayments: true @@ -60,9 +59,6 @@ window.LNbits = { newWallet.canSendPayments = perms.includes('send-payments') } newWallet.url = `/wallet?&wal=${data.id}` - newWallet.lightningAddressFull = newWallet.lightningAddress - ? `${newWallet.lightningAddress}@${window.location.host}` - : null newWallet.storedPaylinks = data.stored_paylinks.links return newWallet } diff --git a/lnbits/static/js/components/admin/lnbits-admin-blockexplorer.js b/lnbits/static/js/components/admin/lnbits-admin-blockexplorer.js deleted file mode 100644 index f92d3c388..000000000 --- a/lnbits/static/js/components/admin/lnbits-admin-blockexplorer.js +++ /dev/null @@ -1,40 +0,0 @@ -window.app.component('lnbits-admin-blockexplorer', { - props: ['form-data'], - template: '#lnbits-admin-blockexplorer', - data() { - return { - electrumServers: [ - 'ssl://fulcrum.lnbits.com:50002', - 'ssl://mainnet.nunchuk.io:52002', - 'ssl://fulcrum.grey.pw:50002', - 'ssl://electrum2.bluewallet.io:443', - 'ssl://electrum.acinq.co:50002', - 'ssl://electrum.blockstream.info:50002', - 'ssl://bitcoin.mullvad.net:5010' - ] - } - }, - computed: { - electrumServerOptions() { - return [...this.electrumServers, 'Custom'] - }, - electrumServerPreset: { - get() { - return this.electrumServers.includes( - this.formData.lnbits_blockexplorer_electrum_url - ) - ? this.formData.lnbits_blockexplorer_electrum_url - : 'Custom' - }, - set(value) { - if (value === 'Custom') { - if (this.electrumServerPreset !== 'Custom') { - this.formData.lnbits_blockexplorer_electrum_url = '' - } - return - } - this.formData.lnbits_blockexplorer_electrum_url = value - } - } - } -}) diff --git a/lnbits/static/js/components/admin/lnbits-admin-exchange-providers.js b/lnbits/static/js/components/admin/lnbits-admin-exchange-providers.js index e8b0f729c..1be7a0f8d 100644 --- a/lnbits/static/js/components/admin/lnbits-admin-exchange-providers.js +++ b/lnbits/static/js/components/admin/lnbits-admin-exchange-providers.js @@ -62,6 +62,12 @@ window.app.component('lnbits-admin-exchange-providers', { mounted() { this.getExchangeRateHistory() }, + created() { + const hash = window.location.hash.replace('#', '') + if (hash === 'exchange_providers') { + this.showExchangeProvidersTab(hash) + } + }, methods: { getDefaultSetting(fieldName) { LNbits.api.getDefaultSetting(fieldName).then(response => { @@ -121,21 +127,18 @@ window.app.component('lnbits-admin-exchange-providers', { this.exchangeData.showTickerConversion = true }, initExchangeChart(data) { - if (this.exchangeRatesChart) { - this.exchangeRatesChart.destroy() - this.exchangeRatesChart = null - } const xValues = data.map(d => this.utils.formatTimestamp(d.timestamp, 'HH:mm') ) - const exchanges = this.formData.lnbits_price_aggregator_enabled - ? [{name: 'Aggregator'}] - : [...this.formData.lnbits_exchange_rate_providers, {name: 'LNbits'}] + const exchanges = [ + ...this.formData.lnbits_exchange_rate_providers, + {name: 'LNbits'} + ] const datasets = exchanges.map(exchange => ({ label: exchange.name, data: data.map(d => d.rates[exchange.name]), pointStyle: true, - borderWidth: exchange.name === 'LNbits' ? 4 : 2, + borderWidth: exchange.name === 'LNbits' ? 4 : 1, tension: 0.4 })) this.exchangeRatesChart = new Chart( @@ -145,11 +148,7 @@ window.app.component('lnbits-admin-exchange-providers', { options: { plugins: { legend: { - display: true - }, - title: { - display: true, - text: 'Bitcoin Price History' + display: false } } }, diff --git a/lnbits/static/js/components/admin/lnbits-admin-extensions.js b/lnbits/static/js/components/admin/lnbits-admin-extensions.js index f70de66a5..9245c71b5 100644 --- a/lnbits/static/js/components/admin/lnbits-admin-extensions.js +++ b/lnbits/static/js/components/admin/lnbits-admin-extensions.js @@ -3,44 +3,27 @@ window.app.component('lnbits-admin-extensions', { template: '#lnbits-admin-extensions', data() { return { - formAddExtensionsManifest: '', - formAddWasmManifest: '' + formAddExtensionsManifest: '' } }, methods: { addExtensionsManifest() { - this.addManifest( - 'lnbits_extensions_manifests', - 'formAddExtensionsManifest' - ) - }, - addWasmManifest() { - this.addManifest( - 'lnbits_wasm_extensions_manifests', - 'formAddWasmManifest' - ) - }, - addManifest(manifestField, inputField) { - const addManifest = this[inputField].trim() - const manifests = this.formData[manifestField] || [] + const addManifest = this.formAddExtensionsManifest.trim() + const manifests = this.formData.lnbits_extensions_manifests if ( addManifest && addManifest.length && !manifests.includes(addManifest) ) { - this.formData[manifestField] = [...manifests, addManifest] - this[inputField] = '' + this.formData.lnbits_extensions_manifests = [...manifests, addManifest] + this.formAddExtensionsManifest = '' } }, removeExtensionsManifest(manifest) { - this.removeManifest('lnbits_extensions_manifests', manifest) - }, - removeWasmManifest(manifest) { - this.removeManifest('lnbits_wasm_extensions_manifests', manifest) - }, - removeManifest(manifestField, manifest) { - const manifests = this.formData[manifestField] || [] - this.formData[manifestField] = manifests.filter(m => m !== manifest) + const manifests = this.formData.lnbits_extensions_manifests + this.formData.lnbits_extensions_manifests = manifests.filter( + m => m !== manifest + ) } } }) diff --git a/lnbits/static/js/components/admin/lnbits-admin-funding-seed-backup.js b/lnbits/static/js/components/admin/lnbits-admin-funding-seed-backup.js deleted file mode 100644 index 6c1102c4d..000000000 --- a/lnbits/static/js/components/admin/lnbits-admin-funding-seed-backup.js +++ /dev/null @@ -1,151 +0,0 @@ -window.app.component('lnbits-admin-funding-seed-backup', { - props: ['active', 'is-super-user', 'form-data', 'settings'], - template: '#lnbits-admin-funding-seed-backup', - data() { - return { - dialog: { - show: false, - step: 1, - seed: '', - visible: false, - challenge: [], - answers: {}, - error: '', - confirmField: '' - } - } - }, - watch: { - active(isActive) { - if (isActive) { - this.openIfRequired() - } - }, - 'formData.lnbits_backend_wallet_class'(walletClass, previousWalletClass) { - const source = this.seedBackupSource(walletClass) - if (previousWalletClass && source && this.formData[source.seedField]) { - this.formData[source.confirmField] = false - } - this.openIfRequired() - }, - 'formData.boltz_mnemonic'() { - this.formData.boltz_mnemonic_backup_confirmed = - this.formData.boltz_mnemonic === this.settings.boltz_mnemonic - ? this.settings.boltz_mnemonic_backup_confirmed - : false - this.openIfRequired() - }, - 'formData.phoenixd_mnemonic'() { - this.formData.phoenixd_mnemonic_backup_confirmed = - this.formData.phoenixd_mnemonic === this.settings.phoenixd_mnemonic - ? this.settings.phoenixd_mnemonic_backup_confirmed - : false - this.openIfRequired() - }, - 'formData.spark_l2_mnemonic'() { - this.formData.spark_l2_mnemonic_backup_confirmed = - this.formData.spark_l2_mnemonic === this.settings.spark_l2_mnemonic - ? this.settings.spark_l2_mnemonic_backup_confirmed - : false - this.openIfRequired() - } - }, - computed: { - seedWords() { - return this.dialog.seed - .split(/\s+/) - .filter(Boolean) - .map((word, index) => ({index, word})) - } - }, - created() { - this.openIfRequired() - }, - methods: { - seedBackupSource(walletClass = this.formData.lnbits_backend_wallet_class) { - if (walletClass === 'BoltzWallet') { - return { - seedField: 'boltz_mnemonic', - confirmField: 'boltz_mnemonic_backup_confirmed' - } - } - if (walletClass === 'PhoenixdWallet') { - return { - seedField: 'phoenixd_mnemonic', - confirmField: 'phoenixd_mnemonic_backup_confirmed' - } - } - if (walletClass === 'SparkL2Wallet') { - return { - seedField: 'spark_l2_mnemonic', - confirmField: 'spark_l2_mnemonic_backup_confirmed' - } - } - }, - openIfRequired() { - if (!this.active || !this.isSuperUser) return - - const source = this.seedBackupSource() - if (!source) return - - const seed = (this.formData[source.seedField] || '').trim() - const confirmed = this.formData[source.confirmField] - if (!seed || confirmed || this.dialog.show) return - - this.dialog = { - show: true, - step: 1, - seed, - visible: false, - challenge: [], - answers: {}, - error: '', - confirmField: source.confirmField - } - }, - prepareChallenge() { - const words = this.dialog.seed.split(/\s+/).filter(Boolean) - const count = Math.min(4, words.length) - const indexes = _.shuffle([...Array(words.length).keys()]).slice(0, count) - this.dialog.challenge = indexes - .sort((a, b) => a - b) - .map(index => ({index, word: words[index]})) - this.dialog.answers = {} - this.dialog.error = '' - this.dialog.step = 2 - }, - submitChallenge() { - const isValid = this.dialog.challenge.every(({index, word}) => { - const answer = this.dialog.answers[index] || '' - return answer.trim().toLowerCase() === word.toLowerCase() - }) - if (!isValid) { - this.dialog.error = - 'One or more words are incorrect. Check your backup and try again.' - return - } - - const field = this.dialog.confirmField - LNbits.api - .request( - 'PATCH', - '/admin/api/v1/settings', - this.g.user.wallets[0].adminkey, - { - [field]: true - } - ) - .then(() => { - this.formData[field] = true - this.settings[field] = true - this.dialog.show = false - Quasar.Notify.create({ - type: 'positive', - message: 'Seed backup confirmed', - icon: 'check' - }) - }) - .catch(LNbits.utils.notifyApiError) - } - } -}) diff --git a/lnbits/static/js/components/admin/lnbits-admin-funding-sources.js b/lnbits/static/js/components/admin/lnbits-admin-funding-sources.js index 9a97f596b..69aff263a 100644 --- a/lnbits/static/js/components/admin/lnbits-admin-funding-sources.js +++ b/lnbits/static/js/components/admin/lnbits-admin-funding-sources.js @@ -108,11 +108,7 @@ window.app.component('lnbits-admin-funding-sources', { lnd_grpc_macaroon: 'GRPC Macaroon', lnd_grpc_invoice_macaroon: 'GRPC Invoice Macaroon', lnd_grpc_admin_macaroon: 'GRPC Admin Macaroon', - lnd_grpc_macaroon_encrypted: 'Encrypted Macaroon', - lnd_grpc_allow_self_payment: { - advanced: true, - label: 'Allow Self Payment' - } + lnd_grpc_macaroon_encrypted: 'Encrypted Macaroon' } ], [ @@ -154,12 +150,7 @@ window.app.component('lnbits-admin-funding-sources', { { blink_api_endpoint: 'Endpoint', blink_ws_endpoint: 'WebSocket', - blink_token: 'Key', - blink_send_without_probe: { - advanced: true, - label: 'Send payment if fee probe fails', - hint: 'If enabled (default), payments to destinations that cannot be probed (e.g. fedimints) are still sent. If disabled, such payments fail.' - } + blink_token: 'Key' } ], [ @@ -170,17 +161,6 @@ window.app.component('lnbits-admin-funding-sources', { alby_access_token: 'Key' } ], - [ - 'BarkWallet', - 'Bark', - { - bark_api_endpoint: { - label: 'Endpoint', - value: 'http://localhost:3000' - }, - bark_api_token: 'auth_token' - } - ], [ 'BoltzWallet', 'Boltz', diff --git a/lnbits/static/js/components/admin/lnbits-admin-funding.js b/lnbits/static/js/components/admin/lnbits-admin-funding.js index 1474490d5..6710a8dd4 100644 --- a/lnbits/static/js/components/admin/lnbits-admin-funding.js +++ b/lnbits/static/js/components/admin/lnbits-admin-funding.js @@ -1,5 +1,5 @@ window.app.component('lnbits-admin-funding', { - props: ['active', 'is-super-user', 'form-data', 'settings'], + props: ['is-super-user', 'form-data', 'settings'], template: '#lnbits-admin-funding', data() { return { diff --git a/lnbits/static/js/components/admin/lnbits-admin-server.js b/lnbits/static/js/components/admin/lnbits-admin-server.js index 1da53e79c..552f5e142 100644 --- a/lnbits/static/js/components/admin/lnbits-admin-server.js +++ b/lnbits/static/js/components/admin/lnbits-admin-server.js @@ -1,18 +1,4 @@ window.app.component('lnbits-admin-server', { props: ['form-data'], - template: '#lnbits-admin-server', - computed: { - lightningAddressBlacklistText: { - get() { - const value = this.formData.lnbits_wallet_lightning_address_blacklist - return Array.isArray(value) ? value.join('\n') : value || '' - }, - set(value) { - this.formData.lnbits_wallet_lightning_address_blacklist = value - .split(/[\n,]/) - .map(word => word.trim().toLowerCase()) - .filter(word => word.length) - } - } - } + template: '#lnbits-admin-server' }) diff --git a/lnbits/static/js/components/admin/lnbits-admin-site-customisation.js b/lnbits/static/js/components/admin/lnbits-admin-site-customisation.js index f63e9958a..9a820dd4c 100644 --- a/lnbits/static/js/components/admin/lnbits-admin-site-customisation.js +++ b/lnbits/static/js/components/admin/lnbits-admin-site-customisation.js @@ -31,8 +31,7 @@ window.app.component('lnbits-admin-site-customisation', { 'confettiBothSides', 'confettiFireworks', 'confettiStars', - 'confettiTop', - 'lightningStrike' + 'confettiTop' ], globalBorderOptions: [ 'retro-border', diff --git a/lnbits/static/js/components/admin/lnbits-admin-wasm-limit-config.js b/lnbits/static/js/components/admin/lnbits-admin-wasm-limit-config.js deleted file mode 100644 index 9dd6e6452..000000000 --- a/lnbits/static/js/components/admin/lnbits-admin-wasm-limit-config.js +++ /dev/null @@ -1,380 +0,0 @@ -window.app.component('lnbits-admin-wasm-limit-config', { - props: ['form-data'], - template: '#lnbits-admin-wasm-limit-config', - data() { - return { - selectedWasmExtensionId: null, - wasmExtensionLimitDraft: {}, - wasmExtensionLimitsSaving: false, - wasmRuntimeLimitExtensions: [], - wasmRuntimeLimitExtensionsLoading: false, - wasmLimitInfoDialog: { - show: false, - title: '', - details: '' - }, - wasmRuntimeLimitGroups: [ - { - title: 'Execution', - fields: [ - { - name: 'wasm_runtime_max_execution_ms', - label: 'Max execution time (ms)', - description: - 'Maximum wall-clock time allowed for one WASM invocation.', - details: - 'This is the elapsed time from starting the invocation until the export returns. When the limit is reached LNbits requests an interrupt and records the invocation as timed out if it cannot finish quickly. Use this to stop long sleeps, slow host calls, and CPU loops that run for too long.' - }, - { - name: 'wasm_runtime_max_fuel', - label: 'Max fuel', - description: - 'Maximum Wasmtime instruction budget for one invocation.', - details: - 'Fuel is Wasmtime instruction budgeting. It is more deterministic than wall-clock time for CPU-heavy loops because each executed instruction consumes budget. Set this low enough to stop busy loops, but high enough for legitimate extension startup and JSON processing.' - }, - { - name: 'wasm_runtime_max_wasm_stack_bytes', - label: 'Max WASM stack (bytes)', - description: 'Maximum stack space for WASM calls and recursion.', - details: - 'This limits stack used by WebAssembly function calls. It protects the server from deep recursion or very large call chains in extension code. If legitimate extensions fail with stack overflow traps, raise this carefully.' - } - ] - }, - { - title: 'Memory and Data Size', - fields: [ - { - name: 'wasm_runtime_max_memory_bytes', - label: 'Max memory (bytes)', - description: 'Maximum WASM linear memory per invocation.', - details: - 'This caps the linear memory visible to the WASM module. It limits memory.grow and can make instantiation fail if the module asks for too much memory up front. This does not include every byte used by the Python process or Wasmtime engine internals.' - }, - { - name: 'wasm_runtime_max_request_bytes', - label: 'Max request size (bytes)', - description: - 'Maximum serialized input payload accepted before execution.', - details: - 'This caps the serialized payload passed into a WASM export before execution starts. It protects against huge HTTP bodies, oversized event data, and expensive JSON parsing. Requests above this limit should be rejected before invoking the extension.' - }, - { - name: 'wasm_runtime_max_response_bytes', - label: 'Max response size (bytes)', - description: - 'Maximum serialized response returned by a WASM export.', - details: - 'This caps the JSON or string response returned by the WASM export. It prevents extensions from returning huge responses that consume memory, slow down API calls, or overload the browser. Responses above this limit are treated as invalid.' - } - ] - }, - { - title: 'Wasmtime Objects', - fields: [ - { - name: 'wasm_runtime_max_table_elements', - label: 'Max table elements', - description: 'Maximum total elements allowed in WASM tables.', - details: - 'Tables store references used by WebAssembly, commonly function references. Limiting table elements prevents a module from allocating very large reference tables. Each table element also has host memory overhead.' - }, - { - name: 'wasm_runtime_max_instances', - label: 'Max instances', - description: - 'Maximum WebAssembly instances allowed inside one store.', - details: - 'This limits how many WebAssembly instances can be created inside one Wasmtime store. LNbits normally needs one instance per invocation, so a low value is expected. Raising it should only be needed if the runtime starts supporting modules that instantiate other modules.' - }, - { - name: 'wasm_runtime_max_tables', - label: 'Max tables', - description: - 'Maximum WebAssembly tables allowed inside one store.', - details: - 'This limits the number of WebAssembly tables in the store. It is separate from table elements: one setting limits the number of tables, the other limits their total size. Keep this small unless a component model module legitimately needs more tables.' - }, - { - name: 'wasm_runtime_max_memories', - label: 'Max memories', - description: - 'Maximum WebAssembly linear memories allowed inside one store.', - details: - 'This limits how many separate linear memories a module can create. Most extensions should need only one memory. Keep this small to reduce memory accounting complexity and prevent multi-memory abuse.' - } - ] - }, - { - title: 'Concurrency', - fields: [ - { - name: 'wasm_runtime_max_concurrent_invocations', - label: 'Max concurrent invocations', - description: - 'Maximum running WASM invocations across the server.', - details: - 'This is the global cap for running WASM invocations across all extensions and users. It protects the LNbits process from thread exhaustion, CPU pressure, and too many simultaneous stores. New invocations should be rejected or queued once this is reached.' - }, - { - name: 'wasm_runtime_max_concurrent_invocations_per_extension', - label: 'Max concurrent per extension', - description: - 'Maximum running WASM invocations for one extension.', - details: - 'This caps how many invocations a single extension can run at once. It prevents one malicious or buggy extension from consuming the whole global concurrency budget. Set it lower than the global limit.' - }, - { - name: 'wasm_runtime_max_concurrent_invocations_per_user', - label: 'Max concurrent per user', - description: 'Maximum running WASM invocations for one user.', - details: - 'This caps concurrent invocations attributed to one user. It helps protect against a user repeatedly clicking, refreshing, or scripting extension calls. Invocations without a user can still be governed by the global and per-extension limits.' - } - ] - }, - { - title: 'Host Calls', - fields: [ - { - name: 'wasm_runtime_max_host_calls', - label: 'Max host calls', - description: - 'Maximum total calls from WASM into LNbits host APIs.', - details: - 'This is the total budget for calls from the WASM module into LNbits host APIs during one invocation. It should count all categories together. It limits chatty extensions and prevents tight loops that repeatedly call back into Python.' - }, - { - name: 'wasm_runtime_max_http_calls', - label: 'Max HTTP calls', - description: 'Maximum outbound HTTP host calls per invocation.', - details: - 'This caps outbound HTTP requests made through the host API during one invocation. It reduces SSRF blast radius, protects network resources, and limits slow external dependencies. It should be enforced together with HTTP timeout and response-size limits.' - }, - { - name: 'wasm_runtime_max_storage_calls', - label: 'Max storage calls', - description: 'Maximum storage host calls per invocation.', - details: - 'This caps extension storage operations during one invocation. It protects the database from excessive reads and writes triggered by malicious loops. Use it with storage payload-size limits if those are added later.' - }, - { - name: 'wasm_runtime_max_wallet_calls', - label: 'Max wallet calls', - description: 'Maximum wallet/payment host calls per invocation.', - details: - 'This caps wallet and payment-related host calls during one invocation. These calls are security-sensitive and may touch balances, invoices, or payments. Keep this conservative and rely on explicit permissions for what the extension is allowed to do.' - } - ] - }, - { - title: 'HTTP', - fields: [ - { - name: 'wasm_runtime_http_timeout_ms', - label: 'HTTP timeout (ms)', - description: 'Maximum time allowed for one WASM HTTP request.', - details: - 'This is the per-request timeout for HTTP calls made through the WASM host API. It prevents a slow remote server from holding an invocation open indefinitely. The total invocation timeout still applies across all work.' - }, - { - name: 'wasm_runtime_max_http_response_bytes', - label: 'Max HTTP response size (bytes)', - description: - 'Maximum response body size accepted from one WASM HTTP request.', - details: - 'This caps the response body accepted from each HTTP call made by an extension. It protects memory and parsing time when a remote server returns a very large body. Responses above the limit should fail the host call.' - } - ] - } - ] - } - }, - computed: { - adminKey() { - return this.g.user.wallets[0].adminkey - }, - isExtensionLimitRoute() { - return this.$route.path.startsWith('/admin/extensions/wasm/limits/') - }, - routeWasmExtensionId() { - return this.isExtensionLimitRoute ? this.$route.params.extId : null - }, - backRoute() { - return this.isExtensionLimitRoute - ? '/admin/extensions/wasm/limits' - : '/admin#extensions' - }, - backTooltip() { - return this.isExtensionLimitRoute - ? 'Wasm Limit Config' - : 'Extensions Settings' - }, - pageDescription() { - if (this.isExtensionLimitRoute) { - return 'Customize limits for one installed WASM extension.' - } - return 'These values are global defaults. Use 0 to disable a global limit.' - }, - wasmRuntimeLimitExtensionOptions() { - return this.wasmRuntimeLimitExtensions.map(extension => ({ - label: `${extension.name || extension.id} (${extension.id})`, - value: extension.id - })) - }, - selectedWasmRuntimeLimitExtension() { - return ( - this.wasmRuntimeLimitExtensions.find( - extension => extension.id === this.selectedWasmExtensionId - ) || null - ) - }, - customWasmLimitCount() { - const extension = this.selectedWasmRuntimeLimitExtension - if (!extension || !extension.wasm_runtime_limits) { - return 0 - } - return Object.keys(extension.wasm_runtime_limits).length - } - }, - watch: { - selectedWasmExtensionId() { - this.loadSelectedWasmRuntimeLimitExtension() - }, - routeWasmExtensionId() { - this.syncWasmExtensionLimitRoute() - } - }, - created() { - this.fetchWasmRuntimeLimitExtensions() - }, - methods: { - async fetchWasmRuntimeLimitExtensions() { - this.wasmRuntimeLimitExtensionsLoading = true - try { - const {data} = await LNbits.api.request( - 'GET', - '/api/v1/extension/wasm/runtime-limits/extensions', - this.adminKey - ) - this.wasmRuntimeLimitExtensions = data || [] - if ( - this.selectedWasmExtensionId && - !this.wasmRuntimeLimitExtensions.some( - extension => extension.id === this.selectedWasmExtensionId - ) - ) { - this.selectedWasmExtensionId = null - } - this.syncWasmExtensionLimitRoute() - } catch (error) { - LNbits.utils.notifyApiError(error) - } finally { - this.wasmRuntimeLimitExtensionsLoading = false - } - }, - syncWasmExtensionLimitRoute() { - this.selectedWasmExtensionId = this.routeWasmExtensionId - this.loadSelectedWasmRuntimeLimitExtension() - }, - openWasmExtensionLimit(extensionId) { - this.$router.push( - `/admin/extensions/wasm/limits/${encodeURIComponent(extensionId)}` - ) - }, - loadSelectedWasmRuntimeLimitExtension() { - const extension = this.selectedWasmRuntimeLimitExtension - this.wasmExtensionLimitDraft = extension - ? {...(extension.wasm_runtime_limits || {})} - : {} - }, - wasmExtensionLimitHint(field) { - const globalValue = this.formData[field.name] - return `Inherited global value: ${globalValue}. ${field.description}` - }, - wasmExtensionLimitPlaceholder(field) { - const globalValue = this.formData[field.name] - return globalValue === undefined || globalValue === null - ? '' - : String(globalValue) - }, - normalizedWasmExtensionLimitDraft() { - const limits = {} - this.wasmRuntimeLimitGroups.forEach(group => { - group.fields.forEach(field => { - const value = this.wasmExtensionLimitDraft[field.name] - const cleanValue = typeof value === 'string' ? value.trim() : value - if ( - cleanValue === '' || - cleanValue === null || - cleanValue === undefined - ) { - return - } - const numericValue = Number(cleanValue) - if ( - !Number.isFinite(numericValue) || - !Number.isInteger(numericValue) || - numericValue < 0 - ) { - throw new Error(`${field.label} must be a non-negative integer.`) - } - limits[field.name] = numericValue - }) - }) - return limits - }, - async clearWasmExtensionLimits() { - this.wasmExtensionLimitDraft = {} - await this.saveWasmExtensionLimits() - }, - async saveWasmExtensionLimits() { - if (!this.selectedWasmExtensionId) { - return - } - this.wasmExtensionLimitsSaving = true - try { - const {data} = await LNbits.api.request( - 'PUT', - `/api/v1/extension/wasm/runtime-limits/${encodeURIComponent( - this.selectedWasmExtensionId - )}`, - this.adminKey, - { - limits: this.normalizedWasmExtensionLimitDraft() - } - ) - const index = this.wasmRuntimeLimitExtensions.findIndex( - extension => extension.id === data.id - ) - if (index >= 0) { - this.wasmRuntimeLimitExtensions.splice(index, 1, data) - } - this.loadSelectedWasmRuntimeLimitExtension() - Quasar.Notify.create({ - type: 'positive', - message: 'WASM extension limits saved.' - }) - } catch (error) { - if (error instanceof Error && !error.response) { - Quasar.Notify.create({ - type: 'negative', - message: error.message - }) - } else { - LNbits.utils.notifyApiError(error) - } - } finally { - this.wasmExtensionLimitsSaving = false - } - }, - showWasmLimitInfo(field) { - this.wasmLimitInfoDialog = { - show: true, - title: field.label, - details: field.details - } - } - } -}) diff --git a/lnbits/static/js/components/admin/lnbits-admin-wasm-runtime.js b/lnbits/static/js/components/admin/lnbits-admin-wasm-runtime.js deleted file mode 100644 index 9700be4cb..000000000 --- a/lnbits/static/js/components/admin/lnbits-admin-wasm-runtime.js +++ /dev/null @@ -1,380 +0,0 @@ -window.app.component('lnbits-admin-wasm-runtime', { - props: ['form-data'], - template: '#lnbits-admin-wasm-runtime', - data() { - return { - wasmRuntimeLoading: false, - wasmHistoryLoading: false, - wasmRuntimeTimer: null, - wasmStats: {}, - wasmCurrentInvocations: [], - wasmInvocationHistory: [], - wasmStatItems: [ - {key: 'total', label: 'Total', icon: 'data_usage', color: 'primary'}, - {key: 'running', label: 'Running', icon: 'play_circle', color: 'green'}, - {key: 'completed', label: 'Completed', icon: 'task_alt', color: 'teal'}, - {key: 'failed', label: 'Failed', icon: 'error', color: 'red'}, - { - key: 'stopped', - label: 'Stopped', - icon: 'stop_circle', - color: 'orange' - }, - {key: 'timeout', label: 'Timeouts', icon: 'timer_off', color: 'purple'} - ], - wasmCurrentColumns: [ - { - name: 'extension_id', - label: 'Extension', - field: 'extension_id', - align: 'left', - sortable: true - }, - { - name: 'export_name', - label: 'Export', - field: 'export_name', - align: 'left', - sortable: true - }, - { - name: 'trigger_type', - label: 'Trigger', - field: 'trigger_type', - align: 'left', - sortable: true - }, - { - name: 'status', - label: 'Status', - field: 'status', - align: 'left', - sortable: true - }, - { - name: 'user_id', - label: 'User', - field: 'user_id', - align: 'left', - sortable: true - }, - { - name: 'started_at', - label: 'Started', - field: 'started_at', - align: 'left', - sortable: true - }, - { - name: 'duration_ms', - label: 'Duration', - field: row => row.duration_ms || 0, - align: 'right', - sortable: true - }, - { - name: 'context', - label: 'Context', - field: row => this.wasmContextValue(row), - align: 'left', - sortable: true - }, - {name: 'actions', label: '', field: 'actions', align: 'right'} - ], - wasmHistoryColumns: [ - { - name: 'extension_id', - label: 'Extension', - field: 'extension_id', - align: 'left', - sortable: true - }, - { - name: 'export_name', - label: 'Export', - field: 'export_name', - align: 'left', - sortable: true - }, - { - name: 'trigger_type', - label: 'Trigger', - field: 'trigger_type', - align: 'left', - sortable: true - }, - { - name: 'status', - label: 'Status', - field: 'status', - align: 'left', - sortable: true - }, - { - name: 'user_id', - label: 'User', - field: 'user_id', - align: 'left', - sortable: true - }, - { - name: 'started_at', - label: 'Started', - field: 'started_at', - align: 'left', - sortable: true - }, - { - name: 'duration_ms', - label: 'Duration', - field: row => row.duration_ms || 0, - align: 'right', - sortable: true - }, - { - name: 'calls', - label: 'Calls', - field: row => this.wasmCallCount(row), - align: 'left', - sortable: true - }, - { - name: 'context', - label: 'Context', - field: row => this.wasmContextValue(row), - align: 'left', - sortable: true - }, - { - name: 'error_message', - label: 'Error/Stop Reason', - field: row => row.error_message || row.stop_reason || '', - align: 'left', - sortable: true - } - ] - } - }, - computed: { - adminKey() { - return this.g.user.wallets[0].adminkey - }, - wasmExtensionId() { - return this.$route.params.extId || null - }, - wasmExtensionQuery() { - if (!this.wasmExtensionId) { - return '' - } - return `extension_id=${encodeURIComponent(this.wasmExtensionId)}` - } - }, - watch: { - wasmExtensionId() { - this.fetchWasmRuntime() - } - }, - methods: { - async fetchWasmRuntime() { - await Promise.all([ - this.fetchWasmCurrentInvocations(), - this.fetchWasmInvocationHistory(), - this.fetchWasmInvocationStats() - ]) - }, - async fetchWasmCurrentInvocations() { - this.wasmRuntimeLoading = true - try { - const query = this.wasmExtensionQuery - ? `?${this.wasmExtensionQuery}` - : '' - const {data} = await LNbits.api.request( - 'GET', - `/api/v1/extension/wasm/invocations/current${query}`, - this.adminKey - ) - this.wasmCurrentInvocations = data || [] - } catch (error) { - LNbits.utils.notifyApiError(error) - } finally { - this.wasmRuntimeLoading = false - } - }, - async fetchWasmInvocationHistory() { - this.wasmHistoryLoading = true - try { - const params = ['limit=50'] - if (this.wasmExtensionQuery) { - params.push(this.wasmExtensionQuery) - } - const {data} = await LNbits.api.request( - 'GET', - `/api/v1/extension/wasm/invocations?${params.join('&')}`, - this.adminKey - ) - this.wasmInvocationHistory = data || [] - } catch (error) { - LNbits.utils.notifyApiError(error) - } finally { - this.wasmHistoryLoading = false - } - }, - async fetchWasmInvocationStats() { - try { - const params = ['hours=24'] - if (this.wasmExtensionQuery) { - params.push(this.wasmExtensionQuery) - } - const {data} = await LNbits.api.request( - 'GET', - `/api/v1/extension/wasm/invocations/stats?${params.join('&')}`, - this.adminKey - ) - this.wasmStats = data || {} - } catch (error) { - LNbits.utils.notifyApiError(error) - } - }, - async stopWasmInvocation(invocationId) { - try { - await LNbits.api.request( - 'POST', - `/api/v1/extension/wasm/invocations/${encodeURIComponent(invocationId)}/stop`, - this.adminKey - ) - Quasar.Notify.create({ - type: 'positive', - message: 'WASM invocation stop requested.' - }) - await this.fetchWasmRuntime() - } catch (error) { - LNbits.utils.notifyApiError(error) - } - }, - deactivateWasmExtension(extensionId) { - LNbits.utils - .confirmDialog( - `Deactivate extension '${extensionId}'?`, - 'Deactivate Extension' - ) - .onOk(async () => { - try { - await LNbits.api.request( - 'PUT', - `/api/v1/extension/${encodeURIComponent(extensionId)}/deactivate`, - this.adminKey - ) - Quasar.Notify.create({ - type: 'positive', - message: `Extension '${extensionId}' deactivated.` - }) - await this.fetchWasmRuntime() - } catch (error) { - LNbits.utils.notifyApiError(error) - } - }) - }, - formatWasmStat(key) { - const value = this.wasmStats[key] - return value === undefined || value === null ? '0' : String(value) - }, - formatWasmDate(value) { - return value ? this.utils.formatDate(value) : '' - }, - wasmStatusColor(status) { - return ( - { - running: 'green', - stopping: 'orange', - completed: 'teal', - failed: 'red', - stopped: 'orange', - timeout: 'purple', - abandoned: 'grey' - }[status] || 'grey' - ) - }, - wasmTriggerColor(triggerType) { - return ( - { - http: 'primary', - event: 'purple' - }[triggerType] || 'grey' - ) - }, - formatWasmDuration(row) { - let duration = row.duration_ms - if ( - (row.status === 'running' || row.status === 'stopping') && - row.started_at - ) { - duration = Date.now() - new Date(row.started_at).getTime() - } - if (duration === undefined || duration === null) { - return '' - } - if (duration >= 1000) { - return `${(duration / 1000).toFixed(1)}s` - } - return `${duration}ms` - }, - formatWasmCalls(row) { - return [ - `host ${row.host_call_count || 0}`, - `http ${row.http_call_count || 0}`, - `storage ${row.storage_call_count || 0}`, - `wallet ${row.wallet_call_count || 0}` - ].join(' / ') - }, - wasmCallCount(row) { - return ( - (row.host_call_count || 0) + - (row.http_call_count || 0) + - (row.storage_call_count || 0) + - (row.wallet_call_count || 0) - ) - }, - wasmContextValue(row) { - return [ - row.method, - row.path, - row.event_type, - row.wallet_id, - row.payment_hash - ] - .filter(Boolean) - .join(' ') - }, - formatWasmContext(row) { - const items = [ - row.method, - row.path, - row.event_type, - row.wallet_id ? `wallet ${row.wallet_id}` : '', - row.payment_hash ? `payment ${row.payment_hash.slice(0, 12)}...` : '' - ].filter(Boolean) - return items.join(' | ') - }, - formatWasmUserId(userId) { - if (!userId) { - return '-' - } - const value = String(userId) - if (value.length <= 12) { - return value - } - return `${value.slice(0, 3)}...${value.slice(-3)}` - } - }, - created() { - this.fetchWasmRuntime() - this.wasmRuntimeTimer = setInterval(() => { - this.fetchWasmCurrentInvocations() - }, 5000) - }, - unmounted() { - if (this.wasmRuntimeTimer) { - clearInterval(this.wasmRuntimeTimer) - } - } -}) diff --git a/lnbits/static/js/components/lnbits-extension-permissions.js b/lnbits/static/js/components/lnbits-extension-permissions.js deleted file mode 100644 index 1556a70a1..000000000 --- a/lnbits/static/js/components/lnbits-extension-permissions.js +++ /dev/null @@ -1,474 +0,0 @@ -;(function () { - function translate(translateFn, key) { - return translateFn ? translateFn(key) : key - } - - function permissionI18nKey(permission) { - return `extension_permission_${permission.id.replace(/[^A-Za-z0-9]/g, '_')}` - } - - function permissionLabel(permission, translateFn) { - const key = permissionI18nKey(permission) - const label = translate(translateFn, key) - return label === key ? permission.id : label - } - - function permissionManifestDescription(permission) { - return typeof permission.description === 'string' - ? permission.description - : '' - } - - function lowRisk(translateFn) { - return { - level: 'low', - color: 'grey-6', - label: translate(translateFn, 'extension_permission_risk_low'), - warning: '' - } - } - - function mediumRisk(translateFn, warningKey) { - return { - level: 'medium', - color: 'warning', - label: translate(translateFn, 'extension_permission_risk_medium'), - warning: warningKey ? translate(translateFn, warningKey) : '' - } - } - - function highRisk(translateFn, warningKey) { - return { - level: 'high', - color: 'negative', - label: translate(translateFn, 'extension_permission_risk_high'), - warning: translate(translateFn, warningKey) - } - } - - function extensionDisplayName(extensions, extensionId) { - const extension = (extensions || []).find( - extension => extension.id === extensionId - ) - return extension?.name || extensionId - } - - function extensionApiPermissionTargets(permission, extensions) { - const extensionPolicies = permission.policies - if (!Array.isArray(extensionPolicies)) return [] - return extensionPolicies - .map(extension => { - const extensionId = - typeof extension === 'string' ? extension : extension?.id - if (!extensionId) return null - const access = - typeof extension === 'string' - ? ['read'] - : Array.isArray(extension.access) && extension.access.length - ? extension.access - : ['read'] - return { - id: extensionId, - name: extensionDisplayName(extensions, extensionId), - access - } - }) - .filter(Boolean) - } - - function permissionRiskForPermission(permission, extensions, translateFn) { - if ( - ['wallet.pay_invoice', 'wallet.pay_invoice_background'].includes( - permission.id - ) - ) { - return highRisk( - translateFn, - permission.id === 'wallet.pay_invoice_background' - ? 'extension_permission_warning_wallet_pay_invoice_background' - : 'extension_permission_warning_wallet_pay_invoice' - ) - } - if (permission.id === 'extension.api.request') { - const hasWriteAccess = extensionApiPermissionTargets( - permission, - extensions - ).some(target => target.access.includes('write')) - return hasWriteAccess - ? highRisk( - translateFn, - 'extension_permission_warning_extension_api_request_write' - ) - : mediumRisk(translateFn) - } - if (permission.id === 'http.request') { - return mediumRisk(translateFn) - } - if (permission.id === 'wallet.payments.watch') { - return mediumRisk( - translateFn, - 'extension_permission_warning_wallet_payments_watch' - ) - } - if (['websocket.publish', 'websocket.subscribe'].includes(permission.id)) { - return mediumRisk(translateFn) - } - if ( - [ - 'wallet.list', - 'wallet.balance.read', - 'wallet.create_invoice_public', - 'ext.storage.append_public', - 'ext.storage.read_public' - ].includes(permission.id) - ) { - return mediumRisk(translateFn) - } - return lowRisk(translateFn) - } - - function permissionRisk(permissions, extensions, translateFn) { - const risks = permissions.map(permission => - permissionRiskForPermission(permission, extensions, translateFn) - ) - const highestRisk = risks.find(risk => risk.level === 'high') - if (highestRisk) return highestRisk - return risks.find(risk => risk.level === 'medium') || lowRisk(translateFn) - } - - function permissionOrderIndex(permissionId) { - const order = [ - 'wallet.pay_invoice', - 'wallet.pay_invoice_background', - 'wallet.payments.watch', - 'wallet.list', - 'wallet.balance.read', - 'extension.api.request', - 'http.request', - 'ui.camera.scan_qr', - 'websocket', - 'websocket.publish', - 'websocket.subscribe', - 'ext.storage.read', - 'ext.storage.write', - 'ext.storage.read_public', - 'ext.storage.append_public', - 'wallet.create_invoice_public', - 'wallet.create_invoice', - 'utils.basic' - ] - const index = order.indexOf(permissionId) - return index === -1 ? order.length : index - } - - function publicStorageFieldGroups(permission) { - const tables = permission.policies - if (!Array.isArray(tables)) return [] - return tables - .map(table => { - const tableName = - typeof table === 'string' ? table : table?.table_name || '' - const fields = - typeof table === 'string' || !Array.isArray(table?.public_fields) - ? [] - : table.public_fields.filter( - field => typeof field === 'string' && field - ) - const sourceIdField = - typeof table === 'string' || - typeof table?.source_id_field !== 'string' - ? '' - : table.source_id_field - return tableName ? {table: tableName, fields, sourceIdField} : null - }) - .filter(Boolean) - } - - function httpRequestPermissionHosts(permission) { - const hosts = permission.policies - if (!Array.isArray(hosts)) return [] - return hosts - .map(host => (typeof host === 'string' ? host : host?.host || '')) - .filter(host => typeof host === 'string' && host) - } - - function publicInvoicePolicies(permission) { - const policies = permission.policies - if (!Array.isArray(policies)) return [] - return policies - .map(policy => { - if (!policy || typeof policy !== 'object') return null - const table = policy.table - const walletField = policy.wallet_field - if (typeof table !== 'string' || !table) return null - if (typeof walletField !== 'string' || !walletField) return null - return {table, walletField} - }) - .filter(Boolean) - } - - function publicAppendPolicies(permission) { - const policies = permission.policies - if (!Array.isArray(policies)) return [] - return policies - .map(policy => { - if (!policy || typeof policy !== 'object') return null - const table = policy.table - const sourceTable = policy.source_table - const sourceIdField = policy.source_id_field - const allowedFields = Array.isArray(policy.allowed_fields) - ? policy.allowed_fields.filter( - field => typeof field === 'string' && field - ) - : [] - const maxRowsPerSource = Number.isInteger(policy.max_rows_per_source) - ? policy.max_rows_per_source - : 10000 - if (typeof table !== 'string' || !table) return null - if (typeof sourceTable !== 'string' || !sourceTable) return null - if (typeof sourceIdField !== 'string' || !sourceIdField) return null - return { - table, - sourceTable, - sourceIdField, - allowedFields, - maxRowsPerSource, - rawPolicy: policy - } - }) - .filter(Boolean) - } - - function websocketPublishPolicies(permission) { - const policies = permission.policies - if (!Array.isArray(policies)) return [] - return policies - .map(policy => { - if (!policy || typeof policy !== 'object') return null - const maxMessagesPerSecond = Number.isInteger( - policy.max_messages_per_second - ) - ? policy.max_messages_per_second - : 0 - return { - maxMessagesPerSecond, - rawPolicy: policy - } - }) - .filter(Boolean) - } - - function permissionDisplayItem(permissions, extensions, translateFn) { - const permission = permissions[0] - const isReadWriteStorage = - permissions.length === 2 && - permissions.some(permission => permission.id === 'ext.storage.read') && - permissions.some(permission => permission.id === 'ext.storage.write') - const isWebsocket = - permissions.every(permission => - ['websocket.publish', 'websocket.subscribe'].includes(permission.id) - ) && - permissions.some(permission => permission.id === 'websocket.publish') && - permissions.some(permission => permission.id === 'websocket.subscribe') - const descriptions = permissions - .map(permission => permissionManifestDescription(permission)) - .filter(Boolean) - const item = { - id: isReadWriteStorage - ? 'ext.storage.read_write' - : isWebsocket - ? 'websocket' - : permission.id, - label: isReadWriteStorage - ? translate(translateFn, 'extension_permission_ext_storage_read_write') - : isWebsocket - ? translate(translateFn, 'extension_permission_websocket') - : permissionLabel(permission, translateFn), - risk: permissionRisk(permissions, extensions, translateFn), - badges: [], - descriptions, - fieldGroups: [], - appendPolicies: [], - websocketPublishPolicies: [], - invoicePolicies: [], - extensionAccess: [], - httpHosts: [] - } - - if (permission.id === 'ext.storage.read_public') { - item.fieldGroups = publicStorageFieldGroups(permission) - item.badges = item.fieldGroups.map(group => ({ - key: group.table, - label: group.table - })) - } - - if (permission.id === 'extension.api.request') { - item.extensionAccess = extensionApiPermissionTargets( - permission, - extensions - ) - item.badges = item.extensionAccess.map(target => ({ - key: target.id, - label: target.name - })) - } - - if (permission.id === 'http.request') { - item.httpHosts = httpRequestPermissionHosts(permission) - } - - if (permission.id === 'wallet.create_invoice_public') { - item.invoicePolicies = publicInvoicePolicies(permission) - } - - if (permission.id === 'ext.storage.append_public') { - item.appendPolicies = publicAppendPolicies(permission) - item.badges = item.appendPolicies.map(policy => ({ - key: - policy.table + ':' + policy.sourceTable + ':' + policy.sourceIdField, - label: policy.table - })) - } - - const websocketPublishPermission = permissions.find( - permission => permission.id === 'websocket.publish' - ) - if (websocketPublishPermission) { - item.websocketPublishPolicies = websocketPublishPolicies( - websocketPublishPermission - ) - } - - return item - } - - function displayItems({permissions, extensions, translate}) { - const permissionList = permissions || [] - const permissionsById = new Map( - permissionList.map(permission => [permission.id, permission]) - ) - const hasReadWriteStorage = - permissionsById.has('ext.storage.read') && - permissionsById.has('ext.storage.write') - const hasWebsocket = - permissionsById.has('websocket.publish') && - permissionsById.has('websocket.subscribe') - let addedReadWriteStorage = false - let addedWebsocket = false - - return permissionList - .map((permission, index) => { - if ( - hasReadWriteStorage && - ['ext.storage.read', 'ext.storage.write'].includes(permission.id) - ) { - if (addedReadWriteStorage) return null - addedReadWriteStorage = true - return { - index, - orderId: 'ext.storage.read', - permissions: [ - permissionsById.get('ext.storage.read'), - permissionsById.get('ext.storage.write') - ] - } - } - if ( - hasWebsocket && - ['websocket.publish', 'websocket.subscribe'].includes(permission.id) - ) { - if (addedWebsocket) return null - addedWebsocket = true - return { - index, - orderId: 'websocket', - permissions: [ - permissionsById.get('websocket.publish'), - permissionsById.get('websocket.subscribe') - ] - } - } - return { - index, - orderId: permission.id, - permissions: [permission] - } - }) - .filter(Boolean) - .sort((left, right) => { - const leftOrder = permissionOrderIndex(left.orderId) - const rightOrder = permissionOrderIndex(right.orderId) - return leftOrder === rightOrder - ? left.index - right.index - : leftOrder - rightOrder - }) - .map(group => - permissionDisplayItem(group.permissions, extensions || [], translate) - ) - } - - window.LNbitsExtensionPermissions = { - displayItems, - hasHighRisk({permissions, extensions, translate}) { - return displayItems({permissions, extensions, translate}).some( - permission => permission.risk.level === 'high' - ) - } - } - - window.app.component('lnbits-extension-permissions', { - template: '#lnbits-extension-permissions', - props: { - permissions: { - type: Array, - default: () => [] - }, - extensions: { - type: Array, - default: () => [] - }, - editableAppendPublicLimits: { - type: Boolean, - default: false - }, - maxRowsPerSourceLimit: { - type: Number, - default: 1000000 - }, - editableWebsocketPublishLimits: { - type: Boolean, - default: false - }, - maxMessagesPerSecondLimit: { - type: Number, - default: 100 - } - }, - computed: { - displayItems() { - return window.LNbitsExtensionPermissions.displayItems({ - permissions: this.permissions, - extensions: this.extensions, - translate: key => this.$t(key) - }) - } - }, - methods: { - publicInvoicePolicySentence(policy) { - return `Invoices will be created using ${policy.walletField} from ${policy.table}.` - }, - publicAppendPolicySentence(policy) { - return `${policy.table} rows can be appended for ${policy.sourceTable} using ${policy.sourceIdField}. Limit: ${policy.maxRowsPerSource} rows per source.` - }, - websocketPublishPolicySentence(policy) { - return `Limit: ${policy.maxMessagesPerSecond} messages per second.` - }, - permissionAccessLabel(access) { - const key = `extension_permission_access_${access}` - const label = this.$t(key) - return label === key ? access : label - } - } - }) -})() diff --git a/lnbits/static/js/components/lnbits-language-dropdown.js b/lnbits/static/js/components/lnbits-language-dropdown.js index 7f73b5fac..53d0fe862 100644 --- a/lnbits/static/js/components/lnbits-language-dropdown.js +++ b/lnbits/static/js/components/lnbits-language-dropdown.js @@ -41,8 +41,7 @@ window.app.component('lnbits-language-dropdown', { {value: 'cs', label: 'Česky', display: '🇨🇿 CS'}, {value: 'sk', label: 'Slovensky', display: '🇸🇰 SK'}, {value: 'kr', label: '한국어', display: '🇰🇷 KR'}, - {value: 'fi', label: 'Suomi', display: '🇫🇮 FI'}, - {value: 'fo', label: 'Føroyskt', display: '🇫🇴 FO'} + {value: 'fi', label: 'Suomi', display: '🇫🇮 FI'} ] } } diff --git a/lnbits/static/js/components/lnbits-manage-extension-list.js b/lnbits/static/js/components/lnbits-manage-extension-list.js index 4e41de6a6..77d6a834f 100644 --- a/lnbits/static/js/components/lnbits-manage-extension-list.js +++ b/lnbits/static/js/components/lnbits-manage-extension-list.js @@ -35,18 +35,6 @@ window.app.component('lnbits-manage-extension-list', { .toLocaleLowerCase() .includes(this.searchTerm.toLocaleLowerCase()) }) - }, - extensionUrl(extension) { - if (extension.is_wasm) { - return `/ext/${extension.code}` - } - return `/${extension.code}/` - }, - extensionActive(extension) { - const extensionPath = extension.is_wasm - ? `/ext/${extension.code}` - : `/${extension.code}` - return this.$route.path.startsWith(extensionPath) } }, async created() { diff --git a/lnbits/static/js/components/lnbits-qrcode.js b/lnbits/static/js/components/lnbits-qrcode.js index 55d36f21c..108671471 100644 --- a/lnbits/static/js/components/lnbits-qrcode.js +++ b/lnbits/static/js/components/lnbits-qrcode.js @@ -85,9 +85,6 @@ window.app.component('lnbits-qrcode', { event.preventDefault() event.stopPropagation() return false - } else if (this.href && this.href.startsWith('http')) { - window.open(this.href, '_blank') - event.preventDefault() } }, async writeNfcTag() { diff --git a/lnbits/static/js/components/lnbits-wallet-api-docs.js b/lnbits/static/js/components/lnbits-wallet-api-docs.js index 3072b94d1..b2c857335 100644 --- a/lnbits/static/js/components/lnbits-wallet-api-docs.js +++ b/lnbits/static/js/components/lnbits-wallet-api-docs.js @@ -1,11 +1,6 @@ window.app.component('lnbits-wallet-api-docs', { template: '#lnbits-wallet-api-docs', methods: { - copyAdminKey() { - LNbits.utils - .confirmDialog(this.$t('admin_key_warning')) - .onOk(() => LNbits.utils.copyText(this.g.wallet.adminkey)) - }, resetKeys() { LNbits.utils .confirmDialog('Are you sure you want to reset your API keys?') diff --git a/lnbits/static/js/components/lnbits-wallet-extra.js b/lnbits/static/js/components/lnbits-wallet-extra.js index 53e0a9da7..1d5e0cabf 100644 --- a/lnbits/static/js/components/lnbits-wallet-extra.js +++ b/lnbits/static/js/components/lnbits-wallet-extra.js @@ -1,46 +1,12 @@ window.app.component('lnbits-wallet-extra', { template: '#lnbits-wallet-extra', props: ['chartConfig'], - data() { - return { - lightningAddressInput: '' - } - }, computed: { exportUrl() { return `${window.location.origin}/wallet?usr=${this.g.user.id}&wal=${this.g.wallet.id}` - }, - canEditLightningAddress() { - return ( - this.g.settings.enableWalletLightningAddresses && - this.g.settings.allowCustomWalletLightningAddresses && - this.g.wallet.walletType === 'lightning' - ) - }, - lightningAddressSuffix() { - return `@${window.location.host}` - }, - lightningAddressChanged() { - return ( - this.lightningAddressInput !== (this.g.wallet.lightningAddress || '') - ) - }, - lightningAddressFeeHint() { - if (!this.g.settings.chargeWalletLightningAddresses) return '' - return `Fee: ${this.g.settings.walletLightningAddressPriceSats} sats` } }, - watch: { - 'g.wallet.id': 'resetLightningAddressInput', - 'g.wallet.lightningAddress': 'resetLightningAddressInput' - }, methods: { - resetLightningAddressInput() { - this.lightningAddressInput = this.g.wallet.lightningAddress || '' - }, - saveLightningAddress() { - this.updateWallet({lightning_address: this.lightningAddressInput}) - }, handleSendLnurl(lnurl) { this.$emit('send-lnurl', lnurl) }, @@ -114,7 +80,6 @@ window.app.component('lnbits-wallet-extra', { } }, created() { - this.resetLightningAddressInput() if (this.g.wallet.currency !== '' && this.g.isSatsDenomination) { this.g.fiatTracking = true this.updateFiatBalance() diff --git a/lnbits/static/js/event-reactions.js b/lnbits/static/js/event-reactions.js index 2a80c5ed0..e8fd27982 100644 --- a/lnbits/static/js/event-reactions.js +++ b/lnbits/static/js/event-reactions.js @@ -154,99 +154,6 @@ function confettiStars() { setTimeout(shoot, 100) setTimeout(shoot, 200) } -function lightningStrike() { - const canvas = document.createElement('canvas') - const ctx = canvas.getContext('2d') - const dpr = window.devicePixelRatio || 1 - - canvas.style.position = 'fixed' - canvas.style.inset = '0' - canvas.style.pointerEvents = 'none' - canvas.style.zIndex = 999999 - canvas.width = Math.floor(window.innerWidth * dpr) - canvas.height = Math.floor(window.innerHeight * dpr) - ctx.scale(dpr, dpr) - document.body.appendChild(canvas) - - const startX = Math.random() * window.innerWidth - const endY = window.innerHeight * (0.45 + Math.random() * 0.35) - const segments = 18 + Math.floor(Math.random() * 10) - const points = [{x: startX, y: -20}] - - for (let i = 1; i <= segments; i++) { - const progress = i / segments - const previous = points[i - 1] - points.push({ - x: previous.x + (Math.random() - 0.5) * (34 + progress * 42), - y: progress * endY - }) - } - - const branches = [] - for ( - let i = 4; - i < points.length - 3; - i += 3 + Math.floor(Math.random() * 3) - ) { - const base = points[i] - const branch = [{...base}] - const direction = Math.random() > 0.5 ? 1 : -1 - const length = 3 + Math.floor(Math.random() * 4) - - for (let j = 1; j <= length; j++) { - branch.push({ - x: base.x + direction * j * (18 + Math.random() * 22), - y: base.y + j * (14 + Math.random() * 18) - }) - } - branches.push(branch) - } - - let frame = 0 - const maxFrames = 48 - - function drawBolt(path, width, alpha) { - ctx.beginPath() - ctx.moveTo(path[0].x, path[0].y) - path.slice(1).forEach(point => ctx.lineTo(point.x, point.y)) - ctx.strokeStyle = `rgba(170, 220, 255, ${alpha})` - ctx.lineWidth = width - ctx.lineJoin = 'round' - ctx.lineCap = 'round' - ctx.shadowBlur = 18 - ctx.shadowColor = '#7dd3fc' - ctx.stroke() - - ctx.strokeStyle = `rgba(255, 255, 255, ${Math.min(1, alpha + 0.2)})` - ctx.lineWidth = Math.max(1, width * 0.35) - ctx.shadowBlur = 4 - ctx.stroke() - } - - function animate() { - const alpha = 1 - frame / maxFrames - ctx.clearRect(0, 0, window.innerWidth, window.innerHeight) - - if (frame < 3) { - ctx.fillStyle = `rgba(255, 255, 255, ${0.22 - frame * 0.06})` - ctx.fillRect(0, 0, window.innerWidth, window.innerHeight) - } - - drawBolt(points, 5 * alpha + 1, alpha) - branches.forEach(branch => - drawBolt(branch, 2.5 * alpha + 0.5, alpha * 0.75) - ) - - frame += 1 - if (frame <= maxFrames) { - requestAnimationFrame(animate) - } else { - canvas.remove() - } - } - - animate() -} !(function (t, e) { ;(!(function t(e, n, a, i) { var o = !!( diff --git a/lnbits/static/js/init-app.js b/lnbits/static/js/init-app.js index b57af295b..457b016bc 100644 --- a/lnbits/static/js/init-app.js +++ b/lnbits/static/js/init-app.js @@ -27,14 +27,6 @@ const DynamicComponent = { name: r.name, component: async () => { await LNbits.utils.loadTemplate(r.template) - if (r.i18n) { - const locale = - window.i18n?.global?.locale?.value ?? - window.i18n?.global?.locale ?? - window.g.locale ?? - 'en' - await LNbits.utils.loadExtI18n(r.i18n, locale) - } await LNbits.utils.loadScript(r.component) return window[r.name] } @@ -66,12 +58,6 @@ const routes = [ name: 'NodePublic', component: PageNodePublic }, - { - path: '/blockexplorer/:type(tx|address|block)?/:id?', - name: 'BlockExplorer', - component: PageBlockExplorer, - meta: {stableKey: true} - }, { path: '/payments', name: 'Payments', @@ -105,26 +91,6 @@ const routes = [ name: 'Users', component: PageUsers }, - { - path: '/admin/extensions/wasm', - name: 'AdminWasmRuntime', - component: PageAdmin - }, - { - path: '/admin/extensions/wasm/limits', - name: 'AdminWasmLimitConfig', - component: PageAdmin - }, - { - path: '/admin/extensions/wasm/limits/:extId', - name: 'AdminWasmLimitConfigDetail', - component: PageAdmin - }, - { - path: '/admin/extensions/wasm/:extId', - name: 'AdminWasmRuntimeDetail', - component: PageAdmin - }, { path: '/admin', name: 'Admin', @@ -165,16 +131,6 @@ const routes = [ name: 'PageError', component: PageError }, - { - path: '/ext/:extId', - name: 'WasmExtensionRoot', - component: window.WasmExtensionComponent - }, - { - path: '/ext/:extId/:pathMatch(.*)*', - name: 'WasmExtension', - component: window.WasmExtensionComponent - }, { path: '/:pathMatch(.*)*', name: 'DynamicComponent', @@ -195,30 +151,6 @@ window.i18n = new VueI18n.createI18n({ fallbackLocale: 'en', messages: window.localisation }) -;(function () { - let _applying = false - let _target = null - Vue.watch( - () => window.i18n.global.locale, - async (locale, prevLocale) => { - if (_applying || !LNbits.utils._extI18nDirs.size) return - _target = locale - _applying = true - window.i18n.global.locale = prevLocale - _applying = false - await Promise.all( - [...LNbits.utils._extI18nDirs].map(dir => - LNbits.utils.loadExtI18n(dir, locale) - ) - ) - if (_target !== locale) return - _applying = true - window.i18n.global.locale = locale - _applying = false - }, - {flush: 'sync'} - ) -})() window.app.mixin({ data() { diff --git a/lnbits/static/js/pages/account.js b/lnbits/static/js/pages/account.js index 2edff32bc..28dbc38fc 100644 --- a/lnbits/static/js/pages/account.js +++ b/lnbits/static/js/pages/account.js @@ -51,8 +51,7 @@ window.PageAccount = { 'confettiBothSides', 'confettiFireworks', 'confettiStars', - 'confettiTop', - 'lightningStrike' + 'confettiTop' ], borderOptions: [ 'retro-border', @@ -218,35 +217,6 @@ window.PageAccount = { computed: { isUserTouched() { return !_.isEqual(this.g.user, this.untouchedUser) - }, - selectedApiToken() { - return this.selectedApiAcl.token_id_list.find( - token => token.id === this.apiAcl.selectedTokenId - ) - }, - expiryAt() { - if (this.selectedApiToken.expires_at) { - return `${this.$t('expiry')}: ${LNbits.utils.formatTimestamp(this.selectedApiToken.expires_at)}` - } else { - return '' - } - }, - tokenStatus() { - if (this.selectedApiToken.expires_at) { - const now = new Date() - const expiresAt = new Date(this.selectedApiToken.expires_at * 1000) - let status = '' - let badgeColor = 'positive' - if (expiresAt < now) { - status = this.$t('acl_token_expired') - badgeColor = 'negative' - } else { - status = this.$t('acl_token_active') - } - return {status, badgeColor} - } else { - return '' - } } }, methods: { diff --git a/lnbits/static/js/pages/admin.js b/lnbits/static/js/pages/admin.js index 1368d0141..233740883 100644 --- a/lnbits/static/js/pages/admin.js +++ b/lnbits/static/js/pages/admin.js @@ -16,26 +16,18 @@ window.PageAdmin = { }, watch: { tab(tab) { - if ( - ['wasm-runtime', 'wasm-limit-config'].includes(tab) && - this.$route.path.startsWith('/admin/extensions/wasm') - ) { - return - } - const target = this.adminRouteForTab(tab) - if (this.$route.fullPath !== target) { - this.$router.push(target) - } + this.$router.push(`/admin#${tab}`) }, $route(to) { - const tab = this.adminTabFromRoute(to) - if (this.tab !== tab) { - this.tab = tab + if (to.hash.length > 1) { + this.tab = to.hash.replace('#', '') } } }, async created() { - this.tab = this.adminTabFromRoute(this.$route) + if (this.$route.hash.length > 1) { + this.tab = this.$route.hash.replace('#', '') + } await this.getSettings() }, computed: { @@ -44,27 +36,6 @@ window.PageAdmin = { } }, methods: { - adminTabFromRoute(route) { - if (route.path.startsWith('/admin/extensions/wasm/limits')) { - return 'wasm-limit-config' - } - if (route.path.startsWith('/admin/extensions/wasm')) { - return 'wasm-runtime' - } - if (route.hash.length > 1) { - return route.hash.replace('#', '') - } - return 'funding' - }, - adminRouteForTab(tab) { - if (tab === 'wasm-runtime') { - return '/admin/extensions/wasm' - } - if (tab === 'wasm-limit-config') { - return '/admin/extensions/wasm/limits' - } - return `/admin#${tab}` - }, getDefaultSetting(fieldName) { LNbits.api.getDefaultSetting(fieldName).then(response => { this.formData[fieldName] = response.data.default_value diff --git a/lnbits/static/js/pages/blockexplorer.js b/lnbits/static/js/pages/blockexplorer.js deleted file mode 100644 index d16eae97b..000000000 --- a/lnbits/static/js/pages/blockexplorer.js +++ /dev/null @@ -1,233 +0,0 @@ -window.PageBlockExplorer = { - template: '#page-blockexplorer', - data() { - return { - query: '', - loading: false, - tip: null, - fees: null, - blocks: [], - selectedBlock: null, - blockDialog: false, - txResult: null, - txStatus: null, - addressResult: null, - currentAddress: '' - } - }, - computed: { - feeList() { - if (!this.fees || !this.fees.estimates) return [] - return Object.entries(this.fees.estimates).map(([blocks, rate]) => ({ - label: this.$t('n_block_fee', {n: blocks}), - rate: (rate * 100000).toFixed(1) + ' sat/vB' - })) - }, - formattedBlocks() { - const now = Math.floor(Date.now() / 1000) - return this.blocks.map(b => ({ - ...b, - shortHash: b.hash.slice(0, 8) + '...' + b.hash.slice(-4), - timeAgo: this._timeAgo(now - b.timestamp), - utcTime: new Date(b.timestamp * 1000).toUTCString(), - difficulty: this._difficulty(b.bits) - })) - } - }, - async created() { - await Promise.all([this.loadTip(), this.loadFees(), this.loadBlocks()]) - this._blockWsActive = true - this._connectBlocksWs() - this._loadFromRoute() - }, - beforeUnmount() { - this._blockWsActive = false - if (this._blockWs) this._blockWs.close() - if (this._searchWs) this._searchWs.close() - }, - watch: { - $route(to) { - this._loadFromRoute(to) - }, - blockDialog(val) { - if (!val && this.$route.params.type === 'block') { - this.$router.push('/blockexplorer') - } - } - }, - methods: { - _loadFromRoute(route) { - route = route || this.$route - const {type, id} = route.params - if (type === 'tx') { - this.query = id - this._fetchTx(id) - } else if (type === 'address') { - this.query = id - this._fetchAddress(id) - } else if (type === 'block') { - this._openBlockByHeight(id) - } else { - this._resetResults() - this.blockDialog = false - } - }, - _openBlockByHeight(height) { - const h = parseInt(height, 10) - const block = - this.formattedBlocks.find(b => b.height === h) || - this.blocks.find(b => b.height === h) - if (block) { - this.selectedBlock = block - this.blockDialog = true - } else { - this.selectedBlock = null - this.blockDialog = false - } - }, - _resetResults() { - this.txResult = null - this.txStatus = null - this.addressResult = null - if (this._searchWs) { - this._searchWs.close() - this._searchWs = null - } - }, - _wsUrl(path) { - const proto = window.location.protocol === 'https:' ? 'wss:' : 'ws:' - return `${proto}//${window.location.host}/blockexplorer/api/v1${path}` - }, - _connectBlocksWs() { - const ws = new WebSocket(this._wsUrl('/ws/blocks')) - ws.onmessage = e => { - const block = JSON.parse(e.data) - const rest = this.blocks.filter(b => b.height !== block.height) - this.blocks = [block, ...rest].slice(0, 5) - } - ws.onerror = () => ws.close() - ws.onclose = () => { - if (this._blockWsActive) setTimeout(() => this._connectBlocksWs(), 5000) - } - this._blockWs = ws - }, - _connectSearchWs(path, onMessage) { - if (this._searchWs) { - this._searchWs.close() - this._searchWs = null - } - const ws = new WebSocket(this._wsUrl(path)) - ws.onmessage = e => { - try { - onMessage(JSON.parse(e.data)) - } catch (_) {} - } - ws.onerror = () => ws.close() - this._searchWs = ws - }, - _timeAgo(seconds) { - if (seconds < 60) return seconds + 's ago' - if (seconds < 3600) return Math.floor(seconds / 60) + 'm ago' - return Math.floor(seconds / 3600) + 'h ago' - }, - _difficulty(bitsHex) { - const exp = parseInt(bitsHex.slice(0, 2), 16) - const mantissa = parseInt(bitsHex.slice(2), 16) - const diff1 = 0xffff * Math.pow(2, 208) - const target = mantissa * Math.pow(2, 8 * (exp - 3)) - const d = diff1 / target - if (d >= 1e12) return (d / 1e12).toFixed(2) + 'T' - if (d >= 1e9) return (d / 1e9).toFixed(2) + 'G' - if (d >= 1e6) return (d / 1e6).toFixed(2) + 'M' - return d.toFixed(0) - }, - openBlock(b) { - this.$router.push(`/blockexplorer/block/${b.height}`) - }, - async loadBlocks() { - try { - const r = await LNbits.api.request( - 'GET', - '/blockexplorer/api/v1/blocks' - ) - this.blocks = r.data - } catch (_) {} - }, - async loadTip() { - try { - const r = await LNbits.api.request('GET', '/blockexplorer/api/v1/tip') - this.tip = r.data - } catch (e) { - LNbits.utils.notifyApiError(e) - } - }, - async loadFees() { - try { - const r = await LNbits.api.request('GET', '/blockexplorer/api/v1/fees') - this.fees = r.data - } catch (_) {} - }, - clearResult() { - this.query = '' - if (this.$route.path !== '/blockexplorer') { - this.$router.push('/blockexplorer') - } else { - this._resetResults() - } - }, - search() { - const q = this.query.trim() - if (!q) return - if (/^[0-9a-fA-F]{64}$/.test(q)) { - this.loadTx(q) - } else { - this.loadAddress(q) - } - }, - loadTx(txid) { - this.$router.push(`/blockexplorer/tx/${txid}`) - }, - loadAddress(address) { - this.$router.push(`/blockexplorer/address/${address}`) - }, - async _fetchTx(txid) { - this.loading = true - try { - const r = await LNbits.api.request( - 'GET', - '/blockexplorer/api/v1/tx/' + txid - ) - this.txResult = r.data - this.txStatus = null - this.addressResult = null - this._connectSearchWs(`/ws/tx/${txid}`, data => { - if (!data.error) this.txStatus = data - }) - } catch (e) { - LNbits.utils.notifyApiError(e) - } finally { - this.loading = false - } - }, - async _fetchAddress(address) { - this.loading = true - try { - const r = await LNbits.api.request( - 'GET', - '/blockexplorer/api/v1/address/' + address - ) - this.addressResult = r.data - this.txResult = null - this.txStatus = null - this.currentAddress = address - this._connectSearchWs(`/ws/address/${address}`, data => { - if (!data.error) this.addressResult = data - }) - } catch (e) { - LNbits.utils.notifyApiError(e) - } finally { - this.loading = false - } - } - } -} diff --git a/lnbits/static/js/pages/extensions.js b/lnbits/static/js/pages/extensions.js index b4a14848e..a71160d54 100644 --- a/lnbits/static/js/pages/extensions.js +++ b/lnbits/static/js/pages/extensions.js @@ -1,7 +1,3 @@ -const EXTENSION_PERMISSION_DEFAULT_MAX_ROWS_PER_SOURCE = 10000 -const EXTENSION_PERMISSION_MAX_ROWS_PER_SOURCE_LIMIT = 1000000 -const EXTENSION_PERMISSION_MAX_MESSAGES_PER_SECOND_LIMIT = 100 - window.PageExtensions = { template: '#page-extensions', data() { @@ -14,7 +10,6 @@ window.PageExtensions = { tab: 'installed', manageExtensionTab: 'releases', filteredExtensions: [], - categories: new Set(), updatableExtensions: [], showUninstallDialog: false, showManageExtensionDialog: false, @@ -26,36 +21,8 @@ window.PageExtensions = { selectedExtension: null, selectedImage: null, selectedExtensionDetails: null, - selectedExtensionDetailsDescription: '', selectedExtensionRepos: null, selectedRelease: null, - permissionGrant: { - show: false, - permissions: [], - resolve: null - }, - extensionPermissionMaxRowsPerSourceLimit: - EXTENSION_PERMISSION_MAX_ROWS_PER_SOURCE_LIMIT, - extensionPermissionMaxMessagesPerSecondLimit: - EXTENSION_PERMISSION_MAX_MESSAGES_PER_SECOND_LIMIT, - managedExtensionPermissions: { - loading: false, - extensionPermissions: [], - userPermissions: {}, - savingExtensionPermissions: false, - savingKey: '', - deletingKey: '' - }, - backgroundPaymentDestinationOptions: [ - { - label: 'Only transfers to my wallets', - value: 'own_wallets_only' - }, - { - label: 'Allow external payments', - value: 'external_allowed' - } - ], uninstallAndDropDb: false, maxStars: 5, paylinkWebsocket: null, @@ -125,32 +92,6 @@ window.PageExtensions = { this.filterExtensions(this.searchTerm, val) } }, - computed: { - managedUserPermissionRows() { - const rows = [] - const userPermissions = - this.managedExtensionPermissions.userPermissions || {} - Object.entries(userPermissions).forEach(([permissionId, grants]) => { - if (!Array.isArray(grants)) return - grants.forEach(grant => { - if (!grant || typeof grant !== 'object') return - const grantId = String(grant.id || '') - const walletId = String(grant.wallet_id || '') - if (!grantId || !walletId) return - rows.push({ - key: grantId, - permissionId, - label: this.permissionLabelById(permissionId), - grantId, - walletId, - walletName: this.walletName(walletId), - grant - }) - }) - }) - return rows - } - }, methods: { filterExtensions(term, tab) { // Filter the extensions list @@ -165,10 +106,6 @@ window.PageExtensions = { } } - const isCategoryTab = !['installed', 'all', 'featured'].includes(tab) - const isInSelectedCategory = extension => - extension.categories?.includes(tab) ?? false - this.filteredExtensions = this.extensions .filter(e => (tab === 'all' ? !e.isInstalled : true)) .filter(e => (tab === 'installed' ? e.isInstalled : true)) @@ -176,7 +113,6 @@ window.PageExtensions = { tab === 'installed' ? (e.isActive ? true : !!this.g.user.admin) : true ) .filter(e => (tab === 'featured' ? e.isFeatured : true)) - .filter(e => (isCategoryTab ? isInSelectedCategory(e) : true)) .filter(extensionNameContains(term)) .map(e => ({ ...e, @@ -190,12 +126,6 @@ window.PageExtensions = { // the install logic has been triggered one way or another this.unsubscribeFromPaylinkWs() - const grantedPermissions = - await this.resolveExtensionPermissionGrant(release) - if (grantedPermissions === null) { - return - } - this.selectedExtension.inProgress = true this.showManageExtensionDialog = false release.payment_hash = @@ -207,8 +137,7 @@ window.PageExtensions = { archive: release.archive, source_repo: release.source_repo, payment_hash: release.payment_hash, - version: release.version, - permissions: grantedPermissions + version: release.version }) .then(response => { this.selectedExtension.inProgress = false @@ -217,12 +146,6 @@ window.PageExtensions = { ) extension.isAvailable = true extension.isInstalled = true - extension.isWasm = - response.data.is_wasm === true || - response.data.isWasm === true || - release.extension_type === 'wasm' || - extension.isWasm === true - extension.icon = response.data.icon || extension.icon extension.installedRelease = release this.toggleExtension(extension) extension.inProgress = false @@ -410,18 +333,8 @@ window.PageExtensions = { this.selectedExtension = extension this.selectedRelease = null this.selectedExtensionRepos = null - this.resetManagedExtensionPermissions() - this.manageExtensionTab = this.g.user.admin - ? 'releases' - : 'extension-permissions' + this.manageExtensionTab = 'releases' this.showManageExtensionDialog = true - if (this.canManageExtensionPermissions(extension)) { - this.loadManagedExtensionPermissions(extension) - } - - if (!this.g.user.admin) { - return - } try { const {data} = await LNbits.api.request( @@ -459,195 +372,6 @@ window.PageExtensions = { extension.inProgress = false } }, - canShowManageExtensionButton(extension) { - return ( - this.g.user.admin || - (extension?.isWasm === true && extension?.isInstalled === true) - ) - }, - canManageExtensionPermissions(extension = this.selectedExtension) { - return extension?.isWasm === true && extension?.isInstalled === true - }, - canShowAdminManageTabs() { - return this.g.user.admin === true - }, - resetManagedExtensionPermissions() { - this.managedExtensionPermissions = { - loading: false, - extensionPermissions: [], - userPermissions: {}, - savingExtensionPermissions: false, - savingKey: '', - deletingKey: '' - } - }, - async loadManagedExtensionPermissions(extension = this.selectedExtension) { - if (!this.canManageExtensionPermissions(extension)) return - this.managedExtensionPermissions.loading = true - try { - const {data} = await LNbits.api.request( - 'GET', - `/api/v1/extension/${extension.id}/permissions` - ) - this.managedExtensionPermissions.extensionPermissions = - this.cloneEditableExtensionPermissions( - data.extension_permissions || [] - ) - this.managedExtensionPermissions.userPermissions = - this.cloneUserPermissions(data.user_permissions || {}) - } catch (error) { - console.warn(error) - LNbits.utils.notifyApiError(error) - } finally { - this.managedExtensionPermissions.loading = false - } - }, - cloneEditableExtensionPermissions(permissions) { - return (permissions || []) - .filter(permission => permission && typeof permission === 'object') - .map(permission => ({ - ...permission, - policies: Array.isArray(permission.policies) - ? permission.policies.map(policy => - this.cloneEditablePermissionPolicy(permission.id, policy) - ) - : permission.policies - })) - }, - cloneEditablePermissionPolicy(permissionId, policy) { - if (!policy || typeof policy !== 'object' || Array.isArray(policy)) { - return policy - } - const clonedPolicy = Object.entries(policy).reduce( - (copy, [key, value]) => ({ - ...copy, - [key]: Array.isArray(value) ? value.slice() : value - }), - {} - ) - if (permissionId === 'ext.storage.append_public') { - clonedPolicy.max_rows_per_source = this.maxRowsPerSourceValue( - clonedPolicy.max_rows_per_source, - EXTENSION_PERMISSION_DEFAULT_MAX_ROWS_PER_SOURCE - ) - } - if (permissionId === 'websocket.publish') { - clonedPolicy.max_messages_per_second = Number( - clonedPolicy.max_messages_per_second - ) - } - return clonedPolicy - }, - maxRowsPerSourceValue(value, fallback) { - const number = Number(value) - if (!Number.isInteger(number) || number <= 0) return fallback - return Math.min(number, EXTENSION_PERMISSION_MAX_ROWS_PER_SOURCE_LIMIT) - }, - extensionPermissionLimitError(permissions) { - const appendPermission = (permissions || []).find( - permission => permission?.id === 'ext.storage.append_public' - ) - if (!appendPermission || !Array.isArray(appendPermission.policies)) { - return this.websocketPublishLimitError(permissions) - } - for (const policy of appendPermission.policies) { - if (!policy || typeof policy !== 'object') continue - const number = Number(policy.max_rows_per_source) - if (!Number.isInteger(number) || number <= 0) { - return 'Max rows per source must be a positive integer.' - } - if (number > EXTENSION_PERMISSION_MAX_ROWS_PER_SOURCE_LIMIT) { - return `Max rows per source cannot exceed ${EXTENSION_PERMISSION_MAX_ROWS_PER_SOURCE_LIMIT}.` - } - } - return this.websocketPublishLimitError(permissions) - }, - websocketPublishLimitError(permissions) { - const publishPermission = (permissions || []).find( - permission => permission?.id === 'websocket.publish' - ) - if (!publishPermission) return '' - if ( - !Array.isArray(publishPermission.policies) || - publishPermission.policies.length !== 1 - ) { - return 'Websocket publish requires a max messages per second policy.' - } - const policy = publishPermission.policies[0] - if (!policy || typeof policy !== 'object') { - return 'Websocket publish requires a max messages per second policy.' - } - const number = Number(policy.max_messages_per_second) - if (!Number.isInteger(number) || number <= 0) { - return 'Max messages per second must be a positive integer.' - } - if (number > EXTENSION_PERMISSION_MAX_MESSAGES_PER_SECOND_LIMIT) { - return `Max messages per second cannot exceed ${EXTENSION_PERMISSION_MAX_MESSAGES_PER_SECOND_LIMIT}.` - } - return '' - }, - validateExtensionPermissionLimits(permissions) { - const error = this.extensionPermissionLimitError(permissions) - if (!error) return true - Quasar.Notify.create({ - type: 'negative', - message: error - }) - return false - }, - extensionPermissionsHaveEditableLimits(permissions) { - return (permissions || []).some( - permission => - (permission?.id === 'ext.storage.append_public' && - Array.isArray(permission.policies) && - permission.policies.length > 0) || - permission?.id === 'websocket.publish' - ) - }, - async saveManagedExtensionPermissions() { - const permissions = this.managedExtensionPermissions.extensionPermissions - if (!this.validateExtensionPermissionLimits(permissions)) return - - this.managedExtensionPermissions.savingExtensionPermissions = true - try { - const {data} = await LNbits.api.request( - 'PUT', - `/api/v1/extension/${this.selectedExtension.id}/permissions`, - this.g.user.wallets[0].adminkey, - { - permissions: this.cloneEditableExtensionPermissions(permissions) - } - ) - this.managedExtensionPermissions.extensionPermissions = - this.cloneEditableExtensionPermissions( - data.extension_permissions || [] - ) - Quasar.Notify.create({ - type: 'positive', - message: 'Permission updated.' - }) - } catch (error) { - console.warn(error) - LNbits.utils.notifyApiError(error) - } finally { - this.managedExtensionPermissions.savingExtensionPermissions = false - } - }, - cloneUserPermissions(userPermissions) { - const permissions = {} - Object.entries(userPermissions || {}).forEach( - ([permissionId, grants]) => { - if (!Array.isArray(grants)) return - permissions[permissionId] = grants - .filter(grant => grant && typeof grant === 'object') - .map(grant => ({ - ...grant, - _original: {...grant} - })) - } - ) - return permissions - }, async showExtensionDetails(extId, detailsLink) { if (!detailsLink) { @@ -657,7 +381,6 @@ window.PageExtensions = { this.selectedExtension = this.extensions.find(ext => ext.id === extId) || this.selectedExtension this.selectedExtensionDetails = null - this.selectedExtensionDetailsDescription = '' this.showExtensionDetailsDialog = true this.slide = 0 this.fullscreen = false @@ -669,95 +392,14 @@ window.PageExtensions = { ) this.selectedExtensionDetails = data - this.selectedExtensionDetailsDescription = - this.extensionDescriptionDocument(data.description_md) + this.selectedExtensionDetails.description_md = + LNbits.utils.convertMarkdown(data.description_md) } catch (error) { console.warn(error) } }, - extensionDescriptionDocument(markdown) { - const source = typeof markdown === 'string' ? markdown : '' - const rendered = LNbits.utils.convertMarkdown(source) - const parsed = new DOMParser().parseFromString(rendered, 'text/html') - - parsed.body - .querySelectorAll( - 'applet, base, embed, form, frame, iframe, link, meta, object, portal, script' - ) - .forEach(element => element.remove()) - parsed.body.querySelectorAll('*').forEach(element => { - for (const attribute of [...element.attributes]) { - const attributeName = attribute.name.toLowerCase() - if ( - attributeName.startsWith('on') || - attributeName === 'srcdoc' || - attributeName === 'xlink:href' - ) { - element.removeAttribute(attribute.name) - } - } - }) - parsed.body.querySelectorAll('a[href], area[href]').forEach(link => { - try { - const url = new URL(link.getAttribute('href'), window.location.origin) - if ( - !['http:', 'https:'].includes(url.protocol) || - url.username || - url.password - ) { - link.removeAttribute('href') - return - } - link.setAttribute('href', url.href) - link.setAttribute('target', '_blank') - link.setAttribute('rel', 'noopener noreferrer') - } catch (_error) { - link.removeAttribute('href') - } - }) - - const csp = [ - "default-src 'none'", - 'img-src https: data:', - "style-src 'unsafe-inline'", - "script-src 'none'", - "script-src-attr 'none'", - "base-uri 'none'", - "form-action 'none'", - "frame-src 'none'", - "object-src 'none'" - ].join('; ') - const styles = ` - :root { color-scheme: light dark; font-family: Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } - body { margin: 0; color: CanvasText; background: Canvas; line-height: 1.5; overflow-wrap: anywhere; } - img { max-width: 100%; height: auto; } - pre { overflow: auto; padding: 0.75rem; background: color-mix(in srgb, CanvasText 8%, Canvas); } - code { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; } - table { display: block; max-width: 100%; overflow-x: auto; border-collapse: collapse; } - th, td { padding: 0.35rem 0.6rem; border: 1px solid color-mix(in srgb, CanvasText 20%, Canvas); } - a[href] { color: LinkText; cursor: pointer; } - ` - - return ` - - - - - - - - - - ${parsed.body.innerHTML} - - ` - }, async payAndInstall(release) { try { - if ((await this.resolveExtensionPermissionGrant(release)) === null) { - return - } - this.selectedExtension.inProgress = true this.showManageExtensionDialog = false const paymentInfo = await this.requestPaymentForInstall( @@ -803,10 +445,6 @@ window.PageExtensions = { } }, async showInstallQRCode(release) { - if ((await this.resolveExtensionPermissionGrant(release)) === null) { - return - } - this.selectedRelease = release try { @@ -969,138 +607,6 @@ window.PageExtensions = { return '' }, - extensionOpenUrl(extension) { - return extension.isWasm ? `/ext/${extension.id}` : `/${extension.id}` - }, - permissionLabelById(permissionId) { - const key = `extension_permission_${String(permissionId).replace( - /[^A-Za-z0-9]/g, - '_' - )}` - const label = this.$t(key) - return label === key ? permissionId : label - }, - walletName(walletId) { - const wallet = (this.g.user.wallets || []).find( - wallet => wallet.id === walletId - ) - return wallet ? wallet.name || wallet.id : walletId - }, - userPermissionRowCaption(row) { - return `${row.walletName} (${row.walletId.slice(0, 8)}...)` - }, - isBackgroundPaymentPermission(row) { - return row.permissionId === 'wallet.pay_invoice_background' - }, - userPermissionGrantPayload(row) { - return { - wallet_id: row.walletId, - max_amount: this.positiveInteger(row.grant.max_amount, 0), - destination_policy: this.backgroundPaymentDestinationPolicy( - row.grant.destination_policy - ) - } - }, - positiveInteger(value, fallback) { - const number = Number(value) - if (!Number.isFinite(number) || number <= 0) return fallback - return Math.floor(number) - }, - backgroundPaymentDestinationPolicy(value) { - return value === 'external_allowed' - ? 'external_allowed' - : 'own_wallets_only' - }, - backgroundPaymentGrantIncreased(row, payload) { - const original = row.grant._original || {} - const originalAmount = this.positiveInteger(original.max_amount, 0) - const originalPolicy = this.backgroundPaymentDestinationPolicy( - original.destination_policy - ) - return ( - payload.max_amount > originalAmount || - (originalPolicy === 'own_wallets_only' && - payload.destination_policy === 'external_allowed') - ) - }, - confirmUserPermissionIncrease() { - return new Promise(resolve => { - let resolved = false - const finish = value => { - if (resolved) return - resolved = true - resolve(value) - } - LNbits.utils - .confirmDialog( - 'This increases what the extension can do with this wallet. Continue?' - ) - .onOk(() => finish(true)) - .onCancel(() => finish(false)) - .onDismiss(() => finish(false)) - }) - }, - async saveUserPermissionGrant(row) { - if (!this.isBackgroundPaymentPermission(row)) return - const payload = this.userPermissionGrantPayload(row) - if (!payload.max_amount) { - Quasar.Notify.create({ - type: 'negative', - message: 'Max payment amount must be greater than zero.' - }) - return - } - if ( - this.backgroundPaymentGrantIncreased(row, payload) && - !(await this.confirmUserPermissionIncrease()) - ) { - return - } - - this.managedExtensionPermissions.savingKey = row.key - try { - await LNbits.api.request( - 'POST', - `/api/v1/extension/${this.selectedExtension.id}/permissions/background-payment`, - null, - payload - ) - Quasar.Notify.create({ - type: 'positive', - message: 'Permission updated.' - }) - await this.loadManagedExtensionPermissions() - } catch (error) { - console.warn(error) - LNbits.utils.notifyApiError(error) - } finally { - this.managedExtensionPermissions.savingKey = '' - } - }, - deleteUserPermissionGrant(row) { - LNbits.utils - .confirmDialog('Remove this permission grant?') - .onOk(async () => { - this.managedExtensionPermissions.deletingKey = row.key - try { - const grantId = encodeURIComponent(row.grantId) - await LNbits.api.request( - 'DELETE', - `/api/v1/extension/${this.selectedExtension.id}/permissions/user/${grantId}` - ) - Quasar.Notify.create({ - type: 'positive', - message: 'Permission removed.' - }) - await this.loadManagedExtensionPermissions() - } catch (error) { - console.warn(error) - LNbits.utils.notifyApiError(error) - } finally { - this.managedExtensionPermissions.deletingKey = '' - } - }) - }, async getGitHubReleaseDetails(release) { if (!release.is_github_release || release.loaded) { return @@ -1116,8 +622,6 @@ window.PageExtensions = { release.is_version_compatible = data.is_version_compatible release.min_lnbits_version = data.min_lnbits_version release.warning = data.warning - release.extension_type = data.extension_type - release.permissions = data.permissions || [] } catch (error) { console.warn(error) release.error = error @@ -1126,84 +630,6 @@ window.PageExtensions = { release.inProgress = false } }, - async resolveExtensionPermissionGrant(release) { - const permissions = this.extensionPermissionsForRelease(release) - if ( - !this.releaseRequiresPermissionGrant(release) || - !permissions.length - ) { - return [] - } - if (release.grantedPermissions) { - return release.grantedPermissions - } - const grantedPermissions = - await this.confirmExtensionPermissions(permissions) - if (!grantedPermissions) { - return null - } - release.grantedPermissions = grantedPermissions - return grantedPermissions - }, - extensionPermissionsForRelease(release) { - return release.permissions || this.selectedExtension?.permissions || [] - }, - releaseRequiresPermissionGrant(release) { - return ( - release.extension_type === 'wasm' || - this.selectedExtension?.isWasm === true - ) - }, - confirmExtensionPermissions(permissions) { - return new Promise(resolve => { - this.selectedRelease = null - this.permissionGrant = { - show: true, - permissions: this.cloneEditableExtensionPermissions(permissions), - resolve - } - this.showManageExtensionDialog = true - }) - }, - grantExtensionPermissions() { - if ( - !this.validateExtensionPermissionLimits( - this.permissionGrant.permissions - ) - ) { - return - } - this.resolveExtensionPermissionDialog( - this.cloneEditableExtensionPermissions(this.permissionGrant.permissions) - ) - }, - cancelExtensionPermissions() { - this.resolveExtensionPermissionDialog(null) - }, - onManageExtensionDialogHide() { - if (this.permissionGrant.show) { - this.resolveExtensionPermissionDialog(null) - } - }, - resolveExtensionPermissionDialog(grantedPermissions) { - const resolve = this.permissionGrant.resolve - this.permissionGrant = { - show: false, - permissions: [], - resolve: null - } - this.showManageExtensionDialog = false - if (resolve) { - resolve(grantedPermissions) - } - }, - permissionGrantHasHighRisk() { - return window.LNbitsExtensionPermissions.hasHighRisk({ - permissions: this.permissionGrant.permissions, - extensions: this.extensions, - translate: key => this.$t(key) - }) - }, async selectAllUpdatableExtensionss() { this.updatableExtensions.forEach(e => (e.selectedForUpdate = true)) }, @@ -1214,13 +640,6 @@ window.PageExtensions = { if (!ext.selectedForUpdate) { continue } - if (ext.isWasm) { - Quasar.Notify.create({ - type: 'warning', - message: `Skipping ${ext.id}; this extension update requires permission approval.` - }) - continue - } ext.inProgress = true await LNbits.api.request('POST', `/api/v1/extension`, null, { ext_id: ext.id, @@ -1413,9 +832,6 @@ window.PageExtensions = { async fetchAllExtensions() { try { const {data} = await LNbits.api.request('GET', `/api/v1/extension/all`) - data.forEach(ext => { - ext.categories?.forEach(category => this.categories.add(category)) - }) return data } catch (error) { console.warn(error) diff --git a/lnbits/static/js/pages/users.js b/lnbits/static/js/pages/users.js index 3686cceca..00bef033d 100644 --- a/lnbits/static/js/pages/users.js +++ b/lnbits/static/js/pages/users.js @@ -29,11 +29,6 @@ window.PageUsers = { data: {}, show: false }, - lightningAddressDialog: { - wallet: null, - lightningAddress: '', - show: false - }, walletTable: { columns: [ { @@ -178,11 +173,6 @@ window.PageUsers = { created() { this.fetchUsers() }, - computed: { - lightningAddressSuffix() { - return `@${window.location.host}` - } - }, methods: { formatSat(value) { @@ -358,35 +348,6 @@ window.PageUsers = { const url = `${window.location.origin}/wallet?usr=${this.activeWallet.userId}&wal=${walletId}` this.utils.copyText(url) }, - showLightningAddressDialog(wallet) { - this.lightningAddressDialog.wallet = wallet - this.lightningAddressDialog.lightningAddress = - wallet.lightning_address || '' - this.lightningAddressDialog.show = true - }, - saveLightningAddress() { - const wallet = this.lightningAddressDialog.wallet - if (!wallet) return - LNbits.api - .request( - 'PUT', - `/users/api/v1/user/${wallet.user}/wallet/${wallet.id}/lightning-address`, - null, - { - lightning_address: this.lightningAddressDialog.lightningAddress - } - ) - .then(response => { - Object.assign(wallet, response.data) - this.lightningAddressDialog.show = false - Quasar.Notify.create({ - type: 'positive', - message: this.$t('lightning_address_updated'), - icon: null - }) - }) - .catch(LNbits.utils.notifyApiError) - }, fetchUsers(props) { this.relaxFilterForFields(['username', 'email']) const params = LNbits.utils.prepareFilterQuery(this.usersTable, props) diff --git a/lnbits/static/js/pages/wallet.js b/lnbits/static/js/pages/wallet.js index 2d775d768..e71ec651e 100644 --- a/lnbits/static/js/pages/wallet.js +++ b/lnbits/static/js/pages/wallet.js @@ -7,7 +7,6 @@ window.PageWallet = { invoice: null, lnurlpay: null, lnurlauth: null, - sending: false, data: { request: '', amount: 0, @@ -49,13 +48,6 @@ window.PageWallet = { hasNfc: false, nfcReaderAbortController: null, formattedFiatAmount: 0, - totalBreakdown: { - show: false, - loading: false, - rows: [], - selectedTypes: ['bitcoin', 'fiat'], - selectedTags: [] - }, paymentFilter: { 'status[ne]': 'failed' }, @@ -92,116 +84,9 @@ window.PageWallet = { }, formattedSatAmount() { return LNbits.utils.formatMsat(this.receive.amountMsat) + ' sat' - }, - totalBreakdownTags() { - const tags = this.totalBreakdown.rows.map(row => row.tag || null) - return [...new Set(tags)].sort((a, b) => - this.totalBreakdownTagLabel(a).localeCompare( - this.totalBreakdownTagLabel(b) - ) - ) - }, - hasFiatTotalBreakdown() { - return this.totalBreakdown.rows.some(row => row.is_fiat) - }, - selectedTotalBreakdownRows() { - return this.totalBreakdown.rows.filter(row => { - const type = row.is_fiat ? 'fiat' : 'bitcoin' - return ( - this.totalBreakdown.selectedTypes.includes(type) && - this.totalBreakdown.selectedTags.includes( - this.totalBreakdownTagKey(row.tag) - ) - ) - }) - }, - selectedTotalBreakdownMsat() { - return this.selectedTotalBreakdownRows.reduce( - (total, row) => total + row.total, - 0 - ) - }, - selectedTotalBreakdownSat() { - return Math.round(this.selectedTotalBreakdownMsat / 1000) - }, - selectedTotalBreakdownCount() { - return this.selectedTotalBreakdownRows.reduce( - (total, row) => total + row.payments_count, - 0 - ) - }, - formattedTotalBreakdown() { - return this.utils.formatBalance( - this.selectedTotalBreakdownSat, - this.g.denomination - ) - }, - formattedTotalBreakdownFiat() { - if (!this.g.fiatTracking) return null - const amount = - (this.selectedTotalBreakdownSat / 100000000) * this.g.exchangeRate - return LNbits.utils.formatCurrency(amount, this.g.wallet.currency) - }, - primaryTotalBreakdownValue() { - if (this.g.isFiatPriority && this.g.fiatTracking) { - return this.formattedTotalBreakdownFiat || this.formattedTotalBreakdown - } - return this.formattedTotalBreakdown - }, - secondaryTotalBreakdownValue() { - if (!this.g.fiatTracking) return null - if (this.g.isFiatPriority) { - return this.formattedTotalBreakdown - } - return this.formattedTotalBreakdownFiat } }, methods: { - showWalletTotalBreakdown() { - this.totalBreakdown.show = true - if (!this.totalBreakdown.rows.length) { - this.fetchTotalBreakdown() - } - }, - fetchTotalBreakdown() { - this.totalBreakdown.loading = true - LNbits.api - .getPaymentTotalBreakdown(this.g.wallet) - .then(response => { - this.totalBreakdown.rows = response.data - this.totalBreakdown.selectedTypes = ['bitcoin', 'fiat'] - this.totalBreakdown.selectedTags = this.totalBreakdownTags.map( - this.totalBreakdownTagKey - ) - this.totalBreakdown.loading = false - }) - .catch(err => { - this.totalBreakdown.loading = false - LNbits.utils.notifyApiError(err) - }) - }, - totalBreakdownTagLabel(tag) { - return tag || 'No tag' - }, - totalBreakdownTagKey(tag) { - return tag || '__untagged__' - }, - totalBreakdownTagCount(tag) { - return this.totalBreakdown.rows - .filter(row => (row.tag || null) === tag) - .reduce((total, row) => total + row.payments_count, 0) - }, - totalBreakdownTagMsat(tag) { - return this.totalBreakdown.rows - .filter(row => (row.tag || null) === tag) - .reduce((total, row) => total + row.total, 0) - }, - formatTotalBreakdownMsat(msat) { - return this.utils.formatBalance( - Math.round(msat / 1000), - this.g.denomination - ) - }, handleSendLnurl(lnurl) { this.parse.data.request = lnurl this.parse.show = true @@ -246,7 +131,6 @@ window.PageWallet = { this.parse.data.request = '' this.parse.data.comment = '' this.parse.data.internalMemo = null - this.parse.sending = false this.parse.data.paymentChecker = null this.parse.camera.show = false }, @@ -339,12 +223,6 @@ window.PageWallet = { if (data.tag === 'payRequest') { this.parse.lnurlpay = Object.freeze(data) this.parse.data.amount = data.minSendable / 1000 - this.receive.units = [ - 'sats', - ...(this.g.allowedCurrencies.length > 0 - ? this.g.allowedCurrencies - : this.g.currencies) - ] } else if (data.tag === 'login') { this.parse.lnurlauth = Object.freeze(data) } else if (data.tag === 'withdrawRequest') { @@ -478,9 +356,6 @@ window.PageWallet = { this.parse.invoice = Object.freeze(cleanInvoice) }, payInvoice() { - if (this.parse.sending) return - - this.parse.sending = true const dismissPaymentMsg = Quasar.Notify.create({ timeout: 0, message: this.$t('payment_processing') @@ -493,7 +368,6 @@ window.PageWallet = { this.parse.data.internalMemo ) .then(response => { - this.parse.sending = false dismissPaymentMsg() this.g.updatePayments = !this.g.updatePayments this.parse.show = false @@ -511,16 +385,13 @@ window.PageWallet = { } }) .catch(err => { - this.parse.sending = false dismissPaymentMsg() LNbits.utils.notifyApiError(err) this.g.updatePayments = !this.g.updatePayments + this.parse.show = false }) }, payLnurl() { - if (this.parse.sending) return - - this.parse.sending = true LNbits.api .request('post', '/api/v1/payments/lnurl', this.g.wallet.adminkey, { res: this.parse.lnurlpay, @@ -531,26 +402,18 @@ window.PageWallet = { internalMemo: this.parse.data.internalMemo }) .then(response => { - this.parse.sending = false this.parse.show = false if (response.data.extra.success_action) { const action = JSON.parse(response.data.extra.success_action) switch (action.tag) { case 'url': Quasar.Notify.create({ - message: action.url, + message: `${action.url}`, caption: action.description, - html: false, + html: true, type: 'positive', timeout: 0, - closeBtn: true, - actions: [ - { - label: 'Open link', - color: 'white', - handler: () => this.utils.openUrlInNewTab(action.url) - } - ] + closeBtn: true }) break case 'message': @@ -562,36 +425,19 @@ window.PageWallet = { }) break case 'aes': - this.utils - .decryptLnurlPayAES(action, response.data.preimage) - .then(value => { - Quasar.Notify.create({ - message: value, - caption: action.description, - html: false, - type: 'positive', - timeout: 0, - closeBtn: true - }) - }) - .catch(error => { - Quasar.Notify.create({ - message: action.description || 'Payment successful.', - caption: 'Could not decrypt success action.', - html: false, - type: 'warning', - timeout: 0, - closeBtn: true - }) - }) - break + this.utils.decryptLnurlPayAES(action, response.data.preimage) + Quasar.Notify.create({ + message: value, + caption: extra.success_action.description, + html: true, + type: 'positive', + timeout: 0, + closeBtn: true + }) } } }) - .catch(err => { - this.parse.sending = false - LNbits.utils.notifyApiError(err) - }) + .catch(LNbits.utils.notifyApiError) }, authLnurl() { const dismissAuthMsg = Quasar.Notify.create({ @@ -631,19 +477,14 @@ window.PageWallet = { LNbits.api .request('PATCH', '/api/v1/wallet', this.g.wallet.adminkey, data) .then(response => { - const walletData = {...response.data} - if (walletData.lightning_address) { - walletData.lightningAddress = walletData.lightning_address - walletData.lightningAddressFull = `${walletData.lightning_address}@${window.location.host}` - } - this.g.wallet = {...this.g.wallet, ...walletData} + this.g.wallet = {...this.g.wallet, ...response.data} const walletIndex = this.g.user.wallets.findIndex( wallet => wallet.id === response.data.id ) if (walletIndex !== -1) { this.g.user.wallets[walletIndex] = { ...this.g.user.wallets[walletIndex], - ...walletData + ...response.data } } Quasar.Notify.create({ @@ -729,7 +570,7 @@ window.PageWallet = { const dismissPaymentMsg = Quasar.Notify.create({ timeout: 0, spinner: true, - message: this.$t('payment_processing') + message: this.$t('processing_payment') }) LNbits.api diff --git a/lnbits/static/js/utils.js b/lnbits/static/js/utils.js index 7937c9e02..54315337f 100644 --- a/lnbits/static/js/utils.js +++ b/lnbits/static/js/utils.js @@ -323,20 +323,6 @@ window._lnbitsUtils = { converter.setOption('simpleLineBreaks', true) return converter.makeHtml(text) }, - _extI18nDirs: new Set(), - _extI18nLoaded: {}, - loadExtI18n(dir, locale) { - this._extI18nDirs.add(dir) - const loaded = (this._extI18nLoaded[dir] ??= {}) - if (loaded[locale]) return loaded[locale] - loaded[locale] = this.loadScript(`${dir}/${locale}.js`).catch(() => { - if (locale !== 'en') { - loaded['en'] ??= this.loadScript(`${dir}/en.js`).catch(() => {}) - return loaded['en'] - } - }) - return loaded[locale] - }, async decryptLnurlPayAES(success_action, preimage) { let keyb = new Uint8Array( preimage.match(/[\da-f]{2}/gi).map(h => parseInt(h, 16)) @@ -365,27 +351,5 @@ window._lnbitsUtils = { let decoder = new TextDecoder('utf-8') return decoder.decode(valueb) }) - }, - validateBrowsableUrl(urlString, allowLoopback = false) { - const url = new URL(urlString) - if (url.protocol !== 'http:' && url.protocol !== 'https:') { - throw new Error('Invalid protocol') - } - if (!allowLoopback) { - const host = url.hostname - if ( - host === 'localhost' || - host === '[::1]' || - host === '::1' || - host.startsWith('127.') || - host.startsWith('::ffff:127.') - ) { - throw new Error('Loopback addresses are not allowed') - } - } - }, - openUrlInNewTab(urlString, allowLoopback = false) { - this.validateBrowsableUrl(urlString, allowLoopback) - window.open(urlString, '_blank', 'noopener,noreferrer') } } diff --git a/lnbits/static/js/wasm-extension-component.js b/lnbits/static/js/wasm-extension-component.js deleted file mode 100644 index 9829415c0..000000000 --- a/lnbits/static/js/wasm-extension-component.js +++ /dev/null @@ -1,1420 +0,0 @@ -window.WasmExtensionComponent = { - template: ` -
- - - - - {{ error }} - - - - - -
Camera access
-
- - {{ cameraPrompt.extensionName }} wants to access the camera to scan a QR code. - - - - - - -
-
- - - -
Background payments
-
- -
- {{ backgroundPaymentPrompt.extensionName }} wants permission to make - background payments from - {{ backgroundPaymentPrompt.walletName }}. -
- - This permission can move funds later without an active click. - - - -
- - - - -
-
- - - -
Watch wallet payments
-
- -
- {{ walletPaymentWatchPrompt.extensionName }} wants permission to receive - payment notifications for - {{ walletPaymentWatchPrompt.walletName }}. -
- - This permission exposes payment metadata for this wallet to the extension. - -
- - - - -
-
- - - -
Open link
-
- -
- {{ newTabPrompt.extensionName }} wants to open this link in a new - tab. -
-
- {{ newTabPrompt.url }} -
- - This link is not on the same domain as this LNbits page. - -
- - - - - -
-
-
- `, - data() { - return { - allowedPaymentHashes: new Set(), - bridge: { - apiRoutes: [], - extensionId: '', - permissions: [], - public: false, - query: {}, - routeParams: {} - }, - bridgePort: null, - cameraPrompt: { - extensionName: '', - reject: null, - resolve: null, - show: false - }, - backgroundPaymentDestinationOptions: [ - { - label: 'Only transfers to my wallets', - value: 'own_wallets_only' - }, - { - label: 'Allow external payments', - value: 'external_allowed' - } - ], - backgroundPaymentPrompt: { - extensionName: '', - form: { - destinationPolicy: 'own_wallets_only', - maxAmount: 0 - }, - reject: null, - resolve: null, - show: false, - walletId: '', - walletName: '' - }, - walletPaymentWatchPrompt: { - extensionName: '', - reject: null, - resolve: null, - show: false, - walletId: '', - walletName: '' - }, - newTabPrompt: { - extensionName: '', - external: false, - reject: null, - resolve: null, - show: false, - url: '' - }, - error: '', - extensionName: '', - frameUrl: '', - handleWindowMessage: null, - loading: false, - loadId: 0, - paymentSubscriptions: new Map(), - websocketSubscriptions: new Map() - } - }, - created() { - this.handleWindowMessage = event => this.onWindowMessage(event) - window.addEventListener('message', this.handleWindowMessage) - }, - unmounted() { - window.removeEventListener('message', this.handleWindowMessage) - this.rejectCameraPrompt('Camera scan cancelled.') - this.rejectBackgroundPaymentPrompt( - 'Background payment permission cancelled.' - ) - this.rejectWalletPaymentWatchPrompt( - 'Wallet payment watch permission cancelled.' - ) - this.rejectNewTabPrompt('Open link cancelled.') - this.closeBridgePort() - }, - watch: { - '$route.fullPath': { - immediate: true, - handler() { - this.loadFrameConfig() - } - } - }, - methods: { - emptyBridge() { - return { - apiRoutes: [], - extensionId: '', - permissions: [], - public: false, - query: {}, - routeParams: {} - } - }, - plainBridgeContext() { - return { - extensionId: String(this.bridge.extensionId || ''), - public: Boolean(this.bridge.public), - routeParams: this.plainValue(this.bridge.routeParams || {}), - query: this.plainValue(this.bridge.query || {}) - } - }, - hasBridgePermission(permission) { - return (this.bridge.permissions || []).includes(permission) - }, - cameraPromptStorageKey() { - return `lnbits.ext.permissions.${this.bridge.extensionId}.ui.camera.scan_qr` - }, - emptyBackgroundPaymentPrompt() { - return { - extensionName: '', - form: { - destinationPolicy: 'own_wallets_only', - maxAmount: 0 - }, - reject: null, - resolve: null, - show: false, - walletId: '', - walletName: '' - } - }, - emptyCameraPrompt() { - return { - extensionName: '', - reject: null, - resolve: null, - show: false - } - }, - emptyWalletPaymentWatchPrompt() { - return { - extensionName: '', - reject: null, - resolve: null, - show: false, - walletId: '', - walletName: '' - } - }, - emptyNewTabPrompt() { - return { - extensionName: '', - external: false, - reject: null, - resolve: null, - show: false, - url: '' - } - }, - plainValue(value) { - try { - return JSON.parse(JSON.stringify(value)) - } catch (_error) { - return {} - } - }, - async loadFrameConfig() { - const extId = String(this.$route.params.extId || '') - const loadId = ++this.loadId - this.loading = true - this.error = '' - this.frameUrl = '' - this.bridge = this.emptyBridge() - this.allowedPaymentHashes.clear() - this.rejectCameraPrompt('Camera scan cancelled.') - this.rejectBackgroundPaymentPrompt( - 'Background payment permission cancelled.' - ) - this.rejectWalletPaymentWatchPrompt( - 'Wallet payment watch permission cancelled.' - ) - this.rejectNewTabPrompt('Open link cancelled.') - this.closeBridgePort() - - try { - const response = await fetch( - `/api/v1/ext/${encodeURIComponent(extId)}/_ui/frame`, - { - method: 'POST', - headers: {'content-type': 'application/json'}, - credentials: 'same-origin', - body: JSON.stringify({ - path: this.$route.path, - query: this.$route.query || {} - }) - } - ) - const text = await response.text() - let data = {} - if (text) { - try { - data = JSON.parse(text) - } catch (_error) { - data = {detail: text} - } - } - if (!response.ok) { - throw new Error(data?.detail || 'Failed to load extension page.') - } - if (loadId !== this.loadId) return - - this.bridge = data.bridge || this.emptyBridge() - this.extensionName = data.extension?.name || extId - this.frameUrl = data.frameUrl - } catch (error) { - if (loadId !== this.loadId) return - console.error('[lnbits wasm extension] Failed to load frame.', error) - this.error = error instanceof Error ? error.message : String(error) - } finally { - if (loadId === this.loadId) { - this.loading = false - } - } - }, - extensionFrameWindow() { - return this.$refs.frame?.contentWindow - }, - sendResponse(reply, id, payload) { - reply({ - type: 'lnbits-extension:response', - id, - ...payload - }) - }, - allowedApiRoute(method, path) { - let url - try { - url = new URL(path, window.location.origin) - } catch (_error) { - return false - } - if (url.origin !== window.location.origin) return false - - method = String(method || 'GET').toUpperCase() - return (this.bridge.apiRoutes || []).some(route => { - return ( - route.method === method && - new RegExp(route.pattern).test(url.pathname) - ) - }) - }, - extensionRoute(path) { - let url - try { - url = new URL(String(path || ''), window.location.origin) - } catch (_error) { - throw new Error('Invalid extension route.') - } - if (url.origin !== window.location.origin) { - throw new Error('Extension route must stay on this server.') - } - - const basePath = `/ext/${encodeURIComponent(this.bridge.extensionId)}` - if ( - url.pathname !== basePath && - !url.pathname.startsWith(`${basePath}/`) - ) { - throw new Error('Extension route must stay inside this extension.') - } - return `${url.pathname}${url.search}${url.hash}` - }, - replaceExtensionRoute(message) { - return this.$router.replace(this.extensionRoute(message.path)) - }, - newTabUrl(rawUrl) { - const raw = String(rawUrl || '').trim() - if (!raw) { - throw new Error('Open link needs a URL.') - } - - let url - try { - url = new URL(raw, window.location.href) - } catch (_error) { - throw new Error('Invalid open link URL.') - } - - if (!['http:', 'https:'].includes(url.protocol)) { - throw new Error('Only HTTP and HTTPS links can be opened.') - } - if (url.username || url.password) { - throw new Error('Links with embedded credentials cannot be opened.') - } - - return { - external: url.origin !== window.location.origin, - url: url.href - } - }, - openNewTab(message) { - return this.promptNewTabOpen(this.newTabUrl(message.url || message.href)) - }, - promptNewTabOpen(link) { - if (this.newTabPrompt.show) { - throw new Error('Open link prompt is already open.') - } - - return new Promise((resolve, reject) => { - this.newTabPrompt = { - extensionName: - this.extensionName || this.bridge.extensionId || 'This extension', - external: link.external, - reject, - resolve, - show: true, - url: link.url - } - }) - }, - resolveNewTabPrompt(approved) { - const prompt = this.newTabPrompt - if (!prompt.show) return - this.newTabPrompt = this.emptyNewTabPrompt() - - if (!approved) { - prompt.reject?.(new Error('Open link denied by user.')) - return - } - - try { - window.open(prompt.url, '_blank', 'noopener,noreferrer') - prompt.resolve?.({ - external: prompt.external, - opened: true, - url: prompt.url - }) - } catch (error) { - prompt.reject?.(error) - } - }, - rejectNewTabPrompt(message) { - const reject = this.newTabPrompt.reject - this.newTabPrompt = this.emptyNewTabPrompt() - reject?.(new Error(message)) - }, - async copyNewTabLink() { - const prompt = this.newTabPrompt - if (!prompt.show || !prompt.url) return - - try { - await navigator.clipboard.writeText(prompt.url) - this.notify({ - level: 'positive', - message: 'Link copied.' - }) - } catch (_error) { - this.notify({ - level: 'negative', - message: 'Could not copy link.' - }) - } - }, - bridgeSessionStorageKey(rawKey) { - const key = String(rawKey || '').trim() - if (!key || key.length > 128 || !/^[A-Za-z0-9._:-]+$/.test(key)) { - throw new Error('Invalid extension session key.') - } - return `lnbits.ext.session.${this.bridge.extensionId}.${key}` - }, - getBridgeSessionValue(message) { - const key = this.bridgeSessionStorageKey(message.key) - return {value: window.sessionStorage.getItem(key) || ''} - }, - setBridgeSessionValue(message) { - const key = this.bridgeSessionStorageKey(message.key) - const value = String(message.value || '') - if (value.length > 4096) { - throw new Error('Extension session value is too large.') - } - window.sessionStorage.setItem(key, value) - return {ok: true} - }, - async callApi(message) { - const method = String(message.method || 'GET').toUpperCase() - const path = String(message.path || '') - if (!this.allowedApiRoute(method, path)) { - throw new Error('Extension API route is not allowed.') - } - - const options = { - method, - headers: {}, - credentials: 'same-origin' - } - if (message.body !== undefined && message.body !== null) { - options.headers['content-type'] = 'application/json' - options.body = JSON.stringify(message.body) - } - - const response = await fetch(path, options) - const text = await response.text() - let data = text - if (text) { - try { - data = JSON.parse(text) - } catch (_error) { - data = text - } - } - if (!response.ok) { - throw new Error( - typeof data === 'object' && data.detail ? data.detail : text - ) - } - this.rememberPaymentHashes(data) - return data - }, - notify(message) { - const level = ['positive', 'negative', 'warning', 'info'].includes( - message.level - ) - ? message.level - : 'info' - if (window.Quasar?.Notify) { - window.Quasar.Notify.create({ - color: level, - message: String(message.message || '') - }) - } - }, - async scanQrCode() { - if (!this.hasBridgePermission('ui.camera.scan_qr')) { - throw new Error('Extension is missing scanner permission.') - } - if (!this.g) { - throw new Error('LNbits scanner is not available.') - } - if (this.g.scanner) { - throw new Error('A scanner is already active.') - } - await this.requireCameraScanApproval() - if (this.g.scanner) { - throw new Error('A scanner is already active.') - } - - return new Promise((resolve, reject) => { - let completed = false - - const cleanup = () => { - window.clearTimeout(timeout) - window.clearInterval(cancelPoll) - if (this.g.scanner === onScan) { - this.g.scanner = null - } - } - - const complete = callback => value => { - if (completed) return - completed = true - cleanup() - callback(value) - } - - const onScan = value => { - complete(resolve)({value: String(value || '')}) - } - - const timeout = window.setTimeout(() => { - complete(reject)(new Error('QR scan timed out.')) - }, 120000) - - const cancelPoll = window.setInterval(() => { - if (!completed && this.g.scanner !== onScan) { - complete(reject)(new Error('QR scan cancelled.')) - } - }, 250) - - this.g.scanner = onScan - }) - }, - async requestBackgroundPaymentPermission(message) { - const response = await this.requestExtensionPermissions({ - forcePrompt: message?.forcePrompt === true, - permissions: [ - { - id: 'wallet.pay_invoice_background', - grant: message?.grant || {} - } - ] - }) - return response.permissions?.[0] || response - }, - async requestWalletPaymentWatchPermission(message) { - const response = await this.requestExtensionPermissions({ - permissions: [ - { - id: 'wallet.payments.watch', - grant: message?.grant || {} - } - ] - }) - return response.permissions?.[0] || response - }, - async requestExtensionPermissions(message) { - if (this.bridge.public) { - throw new Error('Public pages cannot request permissions.') - } - const permissions = Array.isArray(message.permissions) - ? message.permissions - : [] - if (!permissions.length) { - throw new Error('No permissions requested.') - } - const forcePrompt = message.forcePrompt === true - - const requestedPermissions = permissions.map(permission => - this.normalizePermissionRequest(permission) - ) - const checkResult = await this.checkExtensionPermissions( - requestedPermissions.map(permission => ({ - id: permission.id, - grant: permission.grant - })) - ) - const checks = Array.isArray(checkResult?.permissions) - ? checkResult.permissions - : [] - const approvedLabels = [] - const results = [] - - for (const [index, permission] of requestedPermissions.entries()) { - const check = checks[index] || {} - if (check.id && check.id !== permission.id) { - throw new Error('Permission check response did not match request.') - } - - if (check.approved && !forcePrompt) { - approvedLabels.push(permission.label) - results.push({ - id: permission.id, - approved: true, - grant: check.grant || permission.grant - }) - continue - } - - const promptPermission = check.grant - ? {...permission, grant: check.grant} - : permission - const granted = await this.promptExtensionPermission(promptPermission) - results.push({ - id: permission.id, - approved: true, - grant: granted?.grant || permission.grant - }) - } - - this.notifyApprovedPermissionUse(approvedLabels) - return {permissions: results} - }, - normalizePermissionRequest(permission) { - const id = String(permission?.id || '') - const grant = permission?.grant || {} - if (id === 'wallet.pay_invoice_background') { - return this.normalizeBackgroundPaymentPermission(grant) - } - if (id === 'wallet.payments.watch') { - return this.normalizeWalletPaymentWatchPermission(grant) - } - throw new Error(`Unsupported permission request: ${id}.`) - }, - normalizeBackgroundPaymentPermission(grant) { - if (!this.hasBridgePermission('wallet.pay_invoice_background')) { - throw new Error('Extension is missing background payment permission.') - } - - const walletId = String(grant.walletId || grant.wallet_id || '') - const wallet = this.walletById(walletId) - if (!wallet) { - throw new Error('Selected wallet is not available.') - } - if (wallet.walletType === 'lightning-shared') { - throw new Error( - 'Background payments are not allowed from shared wallets.' - ) - } - - const requestedGrant = { - wallet_id: walletId, - max_amount: this.positiveInteger( - grant.maxAmount || grant.max_amount, - 1000 - ), - destination_policy: this.backgroundPaymentDestinationPolicy( - grant.destinationPolicy || grant.destination_policy - ) - } - if (!requestedGrant.max_amount) { - throw new Error('Max payment amount must be greater than zero.') - } - - return { - id: 'wallet.pay_invoice_background', - grant: requestedGrant, - label: `Background payments from ${wallet.name || walletId}`, - wallet - } - }, - normalizeWalletPaymentWatchPermission(grant) { - if (!this.hasBridgePermission('wallet.payments.watch')) { - throw new Error('Extension is missing wallet payment watch permission.') - } - - const walletId = String(grant.walletId || grant.wallet_id || '') - const wallet = this.walletById(walletId) - if (!wallet) { - throw new Error('Selected wallet is not available.') - } - - return { - id: 'wallet.payments.watch', - grant: {wallet_id: walletId}, - label: `Watch wallet payments for ${wallet.name || walletId}`, - wallet - } - }, - walletById(walletId) { - return ( - (this.g?.user?.wallets || []).find(wallet => wallet.id === walletId) || - null - ) - }, - async checkExtensionPermissions(permissions) { - return await this.postExtensionPermission( - 'check', - {permissions}, - 'Could not check extension permissions.' - ) - }, - promptExtensionPermission(permission) { - if (permission.id === 'wallet.pay_invoice_background') { - return this.promptBackgroundPaymentPermission(permission) - } - if (permission.id === 'wallet.payments.watch') { - return this.promptWalletPaymentWatchPermission(permission) - } - throw new Error(`Unsupported permission request: ${permission.id}.`) - }, - promptBackgroundPaymentPermission(permission) { - if (this.backgroundPaymentPrompt.show) { - throw new Error('Background payment prompt is already open.') - } - - return new Promise((resolve, reject) => { - this.backgroundPaymentPrompt = { - extensionName: - this.extensionName || this.bridge.extensionId || 'This extension', - form: { - destinationPolicy: permission.grant.destination_policy, - maxAmount: permission.grant.max_amount - }, - reject, - resolve, - show: true, - walletId: permission.grant.wallet_id, - walletName: permission.wallet.name || permission.grant.wallet_id - } - }) - }, - async resolveBackgroundPaymentPrompt(approved) { - const prompt = this.backgroundPaymentPrompt - if (!prompt.show) return - - if (!approved) { - this.backgroundPaymentPrompt = this.emptyBackgroundPaymentPrompt() - prompt.reject?.(new Error('Background payment permission denied.')) - return - } - - try { - const grant = { - wallet_id: prompt.walletId, - max_amount: this.positiveInteger(prompt.form.maxAmount, 0), - destination_policy: this.backgroundPaymentDestinationPolicy( - prompt.form.destinationPolicy - ) - } - if (!grant.max_amount) { - throw new Error('Max payment amount must be greater than zero.') - } - - const data = await this.postExtensionPermission( - 'background-payment', - grant, - 'Could not save permission.' - ) - - this.backgroundPaymentPrompt = this.emptyBackgroundPaymentPrompt() - prompt.resolve?.(data) - } catch (error) { - prompt.reject?.(error) - this.backgroundPaymentPrompt = this.emptyBackgroundPaymentPrompt() - } - }, - rejectBackgroundPaymentPrompt(message) { - const reject = this.backgroundPaymentPrompt.reject - this.backgroundPaymentPrompt = this.emptyBackgroundPaymentPrompt() - reject?.(new Error(message)) - }, - promptWalletPaymentWatchPermission(permission) { - if (this.walletPaymentWatchPrompt.show) { - throw new Error('Wallet payment watch prompt is already open.') - } - - return new Promise((resolve, reject) => { - this.walletPaymentWatchPrompt = { - extensionName: - this.extensionName || this.bridge.extensionId || 'This extension', - reject, - resolve, - show: true, - walletId: permission.grant.wallet_id, - walletName: permission.wallet.name || permission.grant.wallet_id - } - }) - }, - async resolveWalletPaymentWatchPrompt(approved) { - const prompt = this.walletPaymentWatchPrompt - if (!prompt.show) return - - if (!approved) { - this.walletPaymentWatchPrompt = this.emptyWalletPaymentWatchPrompt() - prompt.reject?.(new Error('Wallet payment watch permission denied.')) - return - } - - try { - const data = await this.postExtensionPermission( - 'wallet-payments-watch', - {wallet_id: prompt.walletId}, - 'Could not save permission.' - ) - - this.walletPaymentWatchPrompt = this.emptyWalletPaymentWatchPrompt() - prompt.resolve?.(data) - } catch (error) { - prompt.reject?.(error) - this.walletPaymentWatchPrompt = this.emptyWalletPaymentWatchPrompt() - } - }, - rejectWalletPaymentWatchPrompt(message) { - const reject = this.walletPaymentWatchPrompt.reject - this.walletPaymentWatchPrompt = this.emptyWalletPaymentWatchPrompt() - reject?.(new Error(message)) - }, - positiveInteger(value, fallback) { - const number = Number(value) - if (!Number.isFinite(number) || number <= 0) return fallback - return Math.floor(number) - }, - backgroundPaymentDestinationPolicy(value) { - return value === 'external_allowed' - ? 'external_allowed' - : 'own_wallets_only' - }, - async postExtensionPermission(path, body, fallbackMessage) { - const response = await fetch( - `/api/v1/extension/${encodeURIComponent( - this.bridge.extensionId - )}/permissions/${path}`, - { - method: 'POST', - headers: {'content-type': 'application/json'}, - credentials: 'same-origin', - body: JSON.stringify(body) - } - ) - const text = await response.text() - let data = {} - if (text) { - try { - data = JSON.parse(text) - } catch (_error) { - data = {detail: text} - } - } - if (!response.ok) { - throw new Error(data?.detail || fallbackMessage) - } - return data - }, - notifyApprovedPermissionUse(permissions) { - const permissionList = permissions.filter(Boolean).join(', ') - if (!permissionList) return - this.notify({ - level: 'info', - message: `Using approved permissions: ${permissionList}.` - }) - }, - requireCameraScanApproval() { - if (this.isCameraScanRemembered()) return Promise.resolve() - if (this.cameraPrompt.show) { - return Promise.reject( - new Error('Camera access prompt is already open.') - ) - } - - return new Promise((resolve, reject) => { - this.cameraPrompt = { - extensionName: - this.extensionName || this.bridge.extensionId || 'This extension', - reject, - resolve, - show: true - } - }) - }, - isCameraScanRemembered() { - try { - return ( - this.$q.localStorage.getItem(this.cameraPromptStorageKey()) === - 'allow' - ) - } catch (_error) { - return false - } - }, - rememberCameraScanApproval() { - try { - this.$q.localStorage.set(this.cameraPromptStorageKey(), 'allow') - } catch (_error) {} - }, - resolveCameraPrompt(decision) { - const resolve = this.cameraPrompt.resolve - const reject = this.cameraPrompt.reject - this.cameraPrompt = this.emptyCameraPrompt() - - if (decision === 'allow_remember') { - this.rememberCameraScanApproval() - resolve?.() - return - } - if (decision === 'allow') { - resolve?.() - return - } - reject?.(new Error('Camera scan denied by user.')) - }, - rejectCameraPrompt(message) { - const reject = this.cameraPrompt.reject - this.cameraPrompt = this.emptyCameraPrompt() - reject?.(new Error(message)) - }, - rememberPaymentHashes(value) { - if (!value || typeof value !== 'object') return - - if (Array.isArray(value)) { - value.forEach(item => this.rememberPaymentHashes(item)) - return - } - - for (const [key, item] of Object.entries(value)) { - if ( - ['paymentHash', 'payment_hash'].includes(key) && - this.isPaymentHash(item) - ) { - this.allowedPaymentHashes.add(item) - } - this.rememberPaymentHashes(item) - } - }, - isPaymentHash(value) { - return typeof value === 'string' && /^[a-f0-9]{64}$/i.test(value) - }, - isWebsocketItemId(value) { - return ( - typeof value === 'string' && - /^[A-Za-z0-9][A-Za-z0-9:_-]{0,127}$/.test(value) - ) - }, - websocketUrl(path) { - const url = new URL(window.location.href) - url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:' - url.pathname = path - url.search = '' - url.hash = '' - return url.toString() - }, - sendBridgeEvent(message) { - if (!this.bridgePort) return - this.bridgePort.postMessage({ - type: 'lnbits-extension:event', - ...message - }) - }, - closePaymentSubscription(subscriptionId) { - const subscription = this.paymentSubscriptions.get(subscriptionId) - if (!subscription) return - this.paymentSubscriptions.delete(subscriptionId) - try { - subscription.socket.close() - } catch (_error) {} - }, - closePaymentSubscriptions() { - for (const subscriptionId of Array.from( - this.paymentSubscriptions.keys() - )) { - this.closePaymentSubscription(subscriptionId) - } - }, - closeWebsocketSubscription(subscriptionId) { - const subscription = this.websocketSubscriptions.get(subscriptionId) - if (!subscription) return - this.websocketSubscriptions.delete(subscriptionId) - try { - subscription.socket.close() - } catch (_error) {} - }, - closeWebsocketSubscriptions() { - for (const subscriptionId of Array.from( - this.websocketSubscriptions.keys() - )) { - this.closeWebsocketSubscription(subscriptionId) - } - }, - closeBridgePort() { - this.closePaymentSubscriptions() - this.closeWebsocketSubscriptions() - this.bridgePort?.close() - this.bridgePort = null - }, - subscribePayment(message) { - const subscriptionId = String(message.subscriptionId || '') - const paymentHash = String(message.paymentHash || '') - - if (!subscriptionId || !this.isPaymentHash(paymentHash)) { - throw new Error('Invalid payment subscription.') - } - if (!this.allowedPaymentHashes.has(paymentHash)) { - throw new Error('Payment subscription is not allowed.') - } - - this.closePaymentSubscription(subscriptionId) - - const socket = new WebSocket( - this.websocketUrl(`/api/v1/ws/${encodeURIComponent(paymentHash)}`) - ) - this.paymentSubscriptions.set(subscriptionId, {paymentHash, socket}) - - socket.addEventListener('message', event => { - let data = event.data - try { - data = JSON.parse(event.data) - } catch (_error) {} - - this.sendBridgeEvent({ - event: 'payment.update', - subscriptionId, - paymentHash, - data - }) - - if ( - data && - typeof data === 'object' && - (data.pending === false || - ['success', 'settled', 'paid'].includes(String(data.status || ''))) - ) { - this.sendBridgeEvent({ - event: 'payment.settled', - subscriptionId, - paymentHash, - data - }) - this.closePaymentSubscription(subscriptionId) - } - }) - socket.addEventListener('error', () => { - this.sendBridgeEvent({ - event: 'payment.error', - subscriptionId, - paymentHash - }) - this.closePaymentSubscription(subscriptionId) - }) - socket.addEventListener('close', () => { - this.paymentSubscriptions.delete(subscriptionId) - }) - }, - subscribeWebsocket(message) { - if (!this.hasBridgePermission('websocket.subscribe')) { - throw new Error('Extension is missing websocket subscribe permission.') - } - - const subscriptionId = String(message.subscriptionId || '') - const itemId = String(message.itemId || '') - - if ( - !subscriptionId || - subscriptionId.length > 128 || - !this.isWebsocketItemId(itemId) - ) { - throw new Error('Invalid websocket subscription.') - } - - this.closeWebsocketSubscription(subscriptionId) - - const socket = new WebSocket( - this.websocketUrl( - `/api/v1/ext/ws/${encodeURIComponent( - this.bridge.extensionId - )}/${encodeURIComponent(itemId)}` - ) - ) - this.websocketSubscriptions.set(subscriptionId, {itemId, socket}) - - socket.addEventListener('message', event => { - let data = event.data - try { - data = JSON.parse(event.data) - } catch (_error) {} - - this.sendBridgeEvent({ - event: 'websocket.message', - subscriptionId, - itemId, - data - }) - }) - socket.addEventListener('error', () => { - this.sendBridgeEvent({ - event: 'websocket.error', - subscriptionId, - itemId - }) - this.closeWebsocketSubscription(subscriptionId) - }) - socket.addEventListener('close', () => { - this.websocketSubscriptions.delete(subscriptionId) - }) - }, - sendWebsocket(message) { - if (!this.hasBridgePermission('websocket.subscribe')) { - throw new Error('Extension is missing websocket subscribe permission.') - } - - const subscriptionId = String(message.subscriptionId || '') - if (!subscriptionId) { - throw new Error('Invalid websocket subscription.') - } - - const subscription = this.websocketSubscriptions.get(subscriptionId) - if (!subscription) { - return - } - - if (subscription.socket.readyState !== WebSocket.OPEN) { - if ( - subscription.socket.readyState === WebSocket.CLOSING || - subscription.socket.readyState === WebSocket.CLOSED - ) { - this.closeWebsocketSubscription(subscriptionId) - } - return - } - - const data = - typeof message.data === 'string' - ? message.data - : JSON.stringify(message.data ?? {}) - subscription.socket.send(data) - }, - async handleBridgeRequest(message, reply) { - if (!message || message.type !== 'lnbits-extension:request') return - - try { - if (message.action === 'context') { - this.sendResponse(reply, message.id, { - ok: true, - data: this.plainBridgeContext() - }) - return - } - - if (message.action === 'api') { - this.sendResponse(reply, message.id, { - ok: true, - data: await this.callApi(message) - }) - return - } - - if (message.action === 'ui.notify') { - this.notify(message) - this.sendResponse(reply, message.id, { - ok: true, - data: {ok: true} - }) - return - } - - if (message.action === 'navigation.replace') { - await this.replaceExtensionRoute(message) - this.sendResponse(reply, message.id, { - ok: true, - data: {ok: true} - }) - return - } - - if (message.action === 'navigation.open_new_tab') { - this.sendResponse(reply, message.id, { - ok: true, - data: await this.openNewTab(message) - }) - return - } - - if (message.action === 'storage.session.get') { - this.sendResponse(reply, message.id, { - ok: true, - data: this.getBridgeSessionValue(message) - }) - return - } - - if (message.action === 'storage.session.set') { - this.sendResponse(reply, message.id, { - ok: true, - data: this.setBridgeSessionValue(message) - }) - return - } - - if (message.action === 'ui.scan_qr') { - this.sendResponse(reply, message.id, { - ok: true, - data: await this.scanQrCode() - }) - return - } - - if (message.action === 'permissions.request') { - this.sendResponse(reply, message.id, { - ok: true, - data: await this.requestExtensionPermissions(message) - }) - return - } - - if (message.action === 'permissions.request_background_payment') { - this.sendResponse(reply, message.id, { - ok: true, - data: await this.requestBackgroundPaymentPermission(message) - }) - return - } - - if (message.action === 'permissions.request_wallet_payment_watch') { - this.sendResponse(reply, message.id, { - ok: true, - data: await this.requestWalletPaymentWatchPermission(message) - }) - return - } - - if (message.action === 'payment.subscribe') { - this.subscribePayment(message) - this.sendResponse(reply, message.id, { - ok: true, - data: {ok: true} - }) - return - } - - if (message.action === 'payment.unsubscribe') { - this.closePaymentSubscription(String(message.subscriptionId || '')) - this.sendResponse(reply, message.id, { - ok: true, - data: {ok: true} - }) - return - } - - if (message.action === 'websocket.subscribe') { - this.subscribeWebsocket(message) - this.sendResponse(reply, message.id, { - ok: true, - data: {ok: true} - }) - return - } - - if (message.action === 'websocket.unsubscribe') { - this.closeWebsocketSubscription(String(message.subscriptionId || '')) - this.sendResponse(reply, message.id, { - ok: true, - data: {ok: true} - }) - return - } - - if (message.action === 'websocket.send') { - this.sendWebsocket(message) - this.sendResponse(reply, message.id, { - ok: true, - data: {ok: true} - }) - return - } - - throw new Error('Unknown extension bridge action.') - } catch (error) { - this.sendResponse(reply, message.id, { - ok: false, - error: error instanceof Error ? error.message : String(error) - }) - } - }, - onWindowMessage(event) { - if (event.source !== this.extensionFrameWindow()) return - const message = event.data - if (!message || message.type !== 'lnbits-extension:connect') return - - const port = event.ports?.[0] - if (!port) return - - this.closeBridgePort() - this.bridgePort = port - this.bridgePort.addEventListener('message', portEvent => { - this.handleBridgeRequest(portEvent.data, response => { - port.postMessage(response) - }) - }) - this.bridgePort.start() - this.bridgePort.postMessage({ - type: 'lnbits-extension:connected', - id: message.id - }) - } - } -} diff --git a/lnbits/static/vendor.json b/lnbits/static/vendor.json index 1fc80b98c..41751b9b7 100644 --- a/lnbits/static/vendor.json +++ b/lnbits/static/vendor.json @@ -33,7 +33,6 @@ "i18n/sk.js", "i18n/kr.js", "i18n/fi.js", - "i18n/fo.js", "js/utils.js", "js/api.js", "js/globals.js", @@ -59,7 +58,6 @@ "js/pages/users.js", "js/pages/account.js", "js/pages/admin.js", - "js/components/admin/lnbits-admin-funding-seed-backup.js", "js/components/admin/lnbits-admin-funding.js", "js/components/admin/lnbits-admin-funding-sources.js", "js/components/admin/lnbits-admin-fiat-providers.js", @@ -68,14 +66,10 @@ "js/components/admin/lnbits-admin-users.js", "js/components/admin/lnbits-admin-server.js", "js/components/admin/lnbits-admin-extensions.js", - "js/components/admin/lnbits-admin-wasm-runtime.js", - "js/components/admin/lnbits-admin-wasm-limit-config.js", "js/components/admin/lnbits-admin-notifications.js", "js/components/admin/lnbits-admin-site-customisation.js", "js/components/admin/lnbits-admin-assets-config.js", "js/components/admin/lnbits-admin-audit.js", - "js/components/admin/lnbits-admin-blockexplorer.js", - "js/pages/blockexplorer.js", "js/components/lnbits-wallet-charts.js", "js/components/lnbits-wallet-api-docs.js", "js/components/lnbits-wallet-icon.js", @@ -95,7 +89,6 @@ "js/components/lnbits-theme.js", "js/components/lnbits-qrcode-scanner.js", "js/components/lnbits-manage-extension-list.js", - "js/components/lnbits-extension-permissions.js", "js/components/lnbits-manage-wallet-list.js", "js/components/lnbits-language-dropdown.js", "js/components/lnbits-payment-list.js", @@ -103,7 +96,6 @@ "js/components/extension-settings.js", "js/components/data-fields.js", "js/components.js", - "js/wasm-extension-component.js", "js/init-app.js" ], "css": ["vendor/quasar.css", "css/base.css"] diff --git a/lnbits/static/vendor/axios.js b/lnbits/static/vendor/axios.js index f1142b761..07aee33df 100644 --- a/lnbits/static/vendor/axios.js +++ b/lnbits/static/vendor/axios.js @@ -1,4 +1,4 @@ -/*! Axios v1.18.0 Copyright (c) 2026 Matt Zabriskie and contributors */ +/*! Axios v1.16.0 Copyright (c) 2026 Matt Zabriskie and contributors */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : @@ -463,42 +463,55 @@ }; } function AsyncGenerator(e) { - var t, n; - function resume(t, n) { + var r, t; + function resume(r, t) { try { - var r = e[t](n), - o = r.value, + var n = e[r](t), + o = n.value, u = o instanceof _OverloadYield; - Promise.resolve(u ? o.v : o).then(function (n) { + Promise.resolve(u ? o.v : o).then(function (t) { if (u) { - var i = "return" === t && o.k ? t : "next"; - if (!o.k || n.done) return resume(i, n); - n = e[i](n).value; + var i = "return" === r ? "return" : "next"; + if (!o.k || t.done) return resume(i, t); + t = e[i](t).value; } - settle(!!r.done, n); + settle(n.done ? "return" : "normal", t); }, function (e) { resume("throw", e); }); } catch (e) { - settle(2, e); + settle("throw", e); } } - function settle(e, r) { - 2 === e ? t.reject(r) : t.resolve({ - value: r, - done: e - }), (t = t.next) ? resume(t.key, t.arg) : n = null; + function settle(e, n) { + switch (e) { + case "return": + r.resolve({ + value: n, + done: true + }); + break; + case "throw": + r.reject(n); + break; + default: + r.resolve({ + value: n, + done: false + }); + } + (r = r.next) ? resume(r.key, r.arg) : t = null; } - this._invoke = function (e, r) { + this._invoke = function (e, n) { return new Promise(function (o, u) { var i = { key: e, - arg: r, + arg: n, resolve: o, reject: u, next: null }; - n ? n = n.next = i : (t = n = i, resume(e, r)); + t ? t = t.next = i : (r = t = i, resume(e, n)); }); }, "function" != typeof e.return && (this.return = void 0); } @@ -553,57 +566,6 @@ var getPrototypeOf = Object.getPrototypeOf; var iterator = Symbol.iterator, toStringTag = Symbol.toStringTag; - - /* Creating a function that will check if an object has a property. */ - var hasOwnProperty = function (_ref) { - var hasOwnProperty = _ref.hasOwnProperty; - return function (obj, prop) { - return hasOwnProperty.call(obj, prop); - }; - }(Object.prototype); - - /** - * Walk the prototype chain (excluding the shared Object.prototype) looking for - * an own `prop`. This distinguishes genuine own/inherited members — including - * class accessors and template prototypes — from members injected via - * Object.prototype pollution (e.g. `Object.prototype.username = '...'`), which - * live on Object.prototype itself and are therefore never matched. - * - * @param {*} thing The value whose chain to inspect - * @param {string|symbol} prop The property key to look for - * - * @returns {boolean} True when `prop` is owned below Object.prototype - */ - var hasOwnInPrototypeChain = function hasOwnInPrototypeChain(thing, prop) { - var obj = thing; - var seen = []; - while (obj != null && obj !== Object.prototype) { - if (seen.indexOf(obj) !== -1) { - return false; - } - seen.push(obj); - if (hasOwnProperty(obj, prop)) { - return true; - } - obj = getPrototypeOf(obj); - } - return false; - }; - - /** - * Read `obj[prop]` only when it is safe from Object.prototype pollution. Own - * properties and members inherited from a non-Object.prototype source (a class - * instance or template object) are honored; a value reachable only through a - * polluted Object.prototype is ignored and `undefined` is returned. - * - * @param {*} obj The source object - * @param {string|symbol} prop The property key to read - * - * @returns {*} The resolved value, or undefined when unsafe/absent - */ - var getSafeProp = function getSafeProp(obj, prop) { - return obj != null && hasOwnInPrototypeChain(obj, prop) ? obj[prop] : undefined; - }; var kindOf = function (cache) { return function (thing) { var str = toString.call(thing); @@ -732,15 +694,11 @@ * @returns {boolean} True if value is a plain Object, otherwise false */ var isPlainObject = function isPlainObject(val) { - if (!isObject(val)) { + if (kindOf(val) !== 'object') { return false; } var prototype = getPrototypeOf(val); - return (prototype === null || prototype === Object.prototype || getPrototypeOf(prototype) === null) && - // Treat any genuine (non-Object.prototype-polluted) Symbol.toStringTag or - // Symbol.iterator as evidence the value is a tagged/iterable type rather - // than a plain object, while ignoring keys injected onto Object.prototype. - !hasOwnInPrototypeChain(val, toStringTag) && !hasOwnInPrototypeChain(val, iterator); + return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val); }; /** @@ -908,9 +866,9 @@ * @returns {any} */ function forEach(obj, fn) { - var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref2$allOwnKeys = _ref2.allOwnKeys, - allOwnKeys = _ref2$allOwnKeys === void 0 ? false : _ref2$allOwnKeys; + var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, + _ref$allOwnKeys = _ref.allOwnKeys, + allOwnKeys = _ref$allOwnKeys === void 0 ? false : _ref$allOwnKeys; // Don't bother if no value provided if (obj === null || typeof obj === 'undefined') { return; @@ -997,19 +955,16 @@ * @returns {Object} Result of all merge properties */ function merge() { - var _ref3 = isContextDefined(this) && this || {}, - caseless = _ref3.caseless, - skipUndefined = _ref3.skipUndefined; + var _ref2 = isContextDefined(this) && this || {}, + caseless = _ref2.caseless, + skipUndefined = _ref2.skipUndefined; var result = {}; var assignValue = function assignValue(val, key) { // Skip dangerous property names to prevent prototype pollution if (key === '__proto__' || key === 'constructor' || key === 'prototype') { return; } - - // findKey lowercases the key, so caseless lookup only applies to strings — - // symbol keys are identity-matched. - var targetKey = caseless && typeof key === 'string' && findKey(result, key) || key; + var targetKey = caseless && findKey(result, key) || key; // Read via own-prop only — a bare `result[targetKey]` walks the prototype // chain, so a polluted Object.prototype value could surface here and get // copied into the merged result. @@ -1024,22 +979,11 @@ result[targetKey] = val; } }; - for (var i = 0, l = arguments.length; i < l; i++) { - var source = i < 0 || arguments.length <= i ? undefined : arguments[i]; - if (!source || isBuffer(source)) { - continue; - } - forEach(source, assignValue); - if (_typeof(source) !== 'object' || isArray(source)) { - continue; - } - var symbols = Object.getOwnPropertySymbols(source); - for (var j = 0; j < symbols.length; j++) { - var symbol = symbols[j]; - if (propertyIsEnumerable.call(source, symbol)) { - assignValue(source[symbol], symbol); - } - } + for (var _len = arguments.length, objs = new Array(_len), _key2 = 0; _key2 < _len; _key2++) { + objs[_key2] = arguments[_key2]; + } + for (var i = 0, l = objs.length; i < l; i++) { + objs[i] && forEach(objs[i], assignValue); } return result; } @@ -1056,8 +1000,8 @@ * @returns {Object} The resulting value of object a */ var extend = function extend(a, b, thisArg) { - var _ref4 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}, - allOwnKeys = _ref4.allOwnKeys; + var _ref3 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}, + allOwnKeys = _ref3.allOwnKeys; forEach(b, function (val, key) { if (thisArg && isFunction$1(val)) { Object.defineProperty(a, key, { @@ -1251,7 +1195,14 @@ return p1.toUpperCase() + p2; }); }; - var propertyIsEnumerable = Object.prototype.propertyIsEnumerable; + + /* Creating a function that will check if an object has a property. */ + var hasOwnProperty = function (_ref4) { + var hasOwnProperty = _ref4.hasOwnProperty; + return function (obj, prop) { + return hasOwnProperty.call(obj, prop); + }; + }(Object.prototype); /** * Determine if a value is a RegExp object @@ -1340,10 +1291,10 @@ * @returns {Object} The JSON-compatible object. */ var toJSONObject = function toJSONObject(obj) { - var visited = new WeakSet(); - var _visit = function visit(source) { + var stack = new Array(10); + var _visit = function visit(source, i) { if (isObject(source)) { - if (visited.has(source)) { + if (stack.indexOf(source) >= 0) { return; } @@ -1352,20 +1303,19 @@ return source; } if (!('toJSON' in source)) { - // add-on descent / delete-on-ascent: preserves path semantics, so DAG nodes serialise at every occurrence (see #7230). - visited.add(source); + stack[i] = source; var target = isArray(source) ? [] : {}; forEach(source, function (value, key) { - var reducedValue = _visit(value); + var reducedValue = _visit(value, i + 1); !isUndefined(reducedValue) && (target[key] = reducedValue); }); - visited["delete"](source); + stack[i] = undefined; return target; } } return source; }; - return _visit(obj); + return _visit(obj, 0); }; /** @@ -1431,21 +1381,6 @@ var isIterable = function isIterable(thing) { return thing != null && isFunction$1(thing[iterator]); }; - - /** - * Determine if a value is iterable via an iterator that is NOT sourced solely - * from a polluted Object.prototype. Use this instead of `isIterable` whenever - * the iterable comes from untrusted input (e.g. user-supplied header sources), - * so `Object.prototype[Symbol.iterator] = ...` cannot turn an ordinary object - * into an attacker-controlled entries iterator. - * - * @param {*} thing The value to test - * - * @returns {boolean} True if value has a non-polluted iterator - */ - var isSafeIterable = function isSafeIterable(thing) { - return thing != null && hasOwnInPrototypeChain(thing, iterator) && isIterable(thing); - }; var utils$1 = { isArray: isArray, isArrayBuffer: isArrayBuffer, @@ -1491,8 +1426,6 @@ hasOwnProperty: hasOwnProperty, hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection - hasOwnInPrototypeChain: hasOwnInPrototypeChain, - getSafeProp: getSafeProp, reduceDescriptors: reduceDescriptors, freezeMethods: freezeMethods, toObjectSet: toObjectSet, @@ -1508,8 +1441,7 @@ isThenable: isThenable, setImmediate: _setImmediate, asap: asap, - isIterable: isIterable, - isSafeIterable: isSafeIterable + isIterable: isIterable }; // RawAxiosHeaders whose duplicates are ignored by node @@ -1555,6 +1487,8 @@ return parsed; }); + var $internals = Symbol('internals'); + var INVALID_HEADER_VALUE_CHARS_RE = /[^\x09\x20-\x7E\x80-\xFF]/g; function trimSPorHTAB(str) { var start = 0; var end = str.length; @@ -1574,38 +1508,12 @@ } return start === 0 && end === str.length ? str : str.slice(start, end); } - - // The control-code ranges are intentional: header sanitization strips C0/DEL bytes. - // eslint-disable-next-line no-control-regex - var INVALID_UNICODE_HEADER_VALUE_CHARS = new RegExp("[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+", 'g'); - // eslint-disable-next-line no-control-regex - var INVALID_BYTE_STRING_HEADER_VALUE_CHARS = new RegExp("[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+", 'g'); - function sanitizeValue(value, invalidChars) { - if (utils$1.isArray(value)) { - return value.map(function (item) { - return sanitizeValue(item, invalidChars); - }); - } - return trimSPorHTAB(String(value).replace(invalidChars, '')); - } - var sanitizeHeaderValue = function sanitizeHeaderValue(value) { - return sanitizeValue(value, INVALID_UNICODE_HEADER_VALUE_CHARS); - }; - var sanitizeByteStringHeaderValue = function sanitizeByteStringHeaderValue(value) { - return sanitizeValue(value, INVALID_BYTE_STRING_HEADER_VALUE_CHARS); - }; - function toByteStringHeaderObject(headers) { - var byteStringHeaders = Object.create(null); - utils$1.forEach(headers.toJSON(), function (value, header) { - byteStringHeaders[header] = sanitizeByteStringHeaderValue(value); - }); - return byteStringHeaders; - } - - var $internals = Symbol('internals'); function normalizeHeader(header) { return header && String(header).trim().toLowerCase(); } + function sanitizeHeaderValue(str) { + return trimSPorHTAB(str.replace(INVALID_HEADER_VALUE_CHARS_RE, '')); + } function normalizeValue(value) { if (value === false || value == null) { return value; @@ -1670,7 +1578,7 @@ function setHeader(_value, _header, _rewrite) { var lHeader = normalizeHeader(_header); if (!lHeader) { - return; + throw new Error('header name must be a non-empty string'); } var key = utils$1.findKey(self, lHeader); if (!key || self[key] === undefined || _rewrite === true || _rewrite === undefined && self[key] !== false) { @@ -1686,8 +1594,8 @@ setHeaders(header, valueOrRewrite); } else if (utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { setHeaders(parseHeaders(header), valueOrRewrite); - } else if (utils$1.isObject(header) && utils$1.isSafeIterable(header)) { - var obj = Object.create(null), + } else if (utils$1.isObject(header) && utils$1.isIterable(header)) { + var obj = {}, dest, key; var _iterator = _createForOfIteratorHelper(header), @@ -1696,15 +1604,9 @@ for (_iterator.s(); !(_step = _iterator.n()).done;) { var entry = _step.value; if (!utils$1.isArray(entry)) { - throw new TypeError('Object iterator must return a key-value pair'); - } - key = entry[0]; - if (utils$1.hasOwnProp(obj, key)) { - dest = obj[key]; - obj[key] = utils$1.isArray(dest) ? [].concat(_toConsumableArray(dest), [entry[1]]) : [dest, entry[1]]; - } else { - obj[key] = entry[1]; + throw TypeError('Object iterator must return a key-value pair'); } + obj[key = entry[0]] = (dest = obj[key]) ? utils$1.isArray(dest) ? [].concat(_toConsumableArray(dest), [entry[1]]) : [dest, entry[1]] : entry[1]; } } catch (err) { _iterator.e(err); @@ -2070,10 +1972,6 @@ // eslint-disable-next-line strict var httpAdapter = null; - // Default nesting limit shared with the inverse transform (formDataToJSON) so - // the FormData <-> JSON round-trip stays symmetric. - var DEFAULT_FORM_DATA_MAX_DEPTH = 100; - /** * Determines if the given thing is a array or js object. * @@ -2174,9 +2072,8 @@ var dots = options.dots; var indexes = options.indexes; var _Blob = options.Blob || typeof Blob !== 'undefined' && Blob; - var maxDepth = options.maxDepth === undefined ? DEFAULT_FORM_DATA_MAX_DEPTH : options.maxDepth; + var maxDepth = options.maxDepth === undefined ? 100 : options.maxDepth; var useBlob = _Blob && utils$1.isSpecCompliantForm(formData); - var stack = []; if (!utils$1.isFunction(visitor)) { throw new TypeError('visitor must be a function'); } @@ -2196,28 +2093,6 @@ } return value; } - function throwIfMaxDepthExceeded(depth) { - if (depth > maxDepth) { - throw new AxiosError('Object is too deeply nested (' + depth + ' levels). Max depth: ' + maxDepth, AxiosError.ERR_FORM_DATA_DEPTH_EXCEEDED); - } - } - function stringifyWithDepthLimit(value, depth) { - if (maxDepth === Infinity) { - return JSON.stringify(value); - } - var ancestors = []; - return JSON.stringify(value, function limitDepth(_key, currentValue) { - if (!utils$1.isObject(currentValue)) { - return currentValue; - } - while (ancestors.length && ancestors[ancestors.length - 1] !== this) { - ancestors.pop(); - } - ancestors.push(currentValue); - throwIfMaxDepthExceeded(depth + ancestors.length - 1); - return currentValue; - }); - } /** * Default visitor. @@ -2240,7 +2115,7 @@ // eslint-disable-next-line no-param-reassign key = metaTokens ? key : key.slice(0, -2); // eslint-disable-next-line no-param-reassign - value = stringifyWithDepthLimit(value, 1); + value = JSON.stringify(value); } else if (utils$1.isArray(value) && isFlatArray(value) || (utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.toArray(value))) { // eslint-disable-next-line no-param-reassign key = removeBrackets(key); @@ -2258,6 +2133,7 @@ formData.append(renderKey(path, key, dots), convertValue(value)); return false; } + var stack = []; var exposedHelpers = Object.assign(predicates, { defaultVisitor: defaultVisitor, convertValue: convertValue, @@ -2266,9 +2142,11 @@ function build(value, path) { var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; if (utils$1.isUndefined(value)) return; - throwIfMaxDepthExceeded(depth); + if (depth > maxDepth) { + throw new AxiosError('Object is too deeply nested (' + depth + ' levels). Max depth: ' + maxDepth, AxiosError.ERR_FORM_DATA_DEPTH_EXCEEDED); + } if (stack.indexOf(value) !== -1) { - throw new Error('Circular reference detected in ' + path.join('.')); + throw Error('Circular reference detected in ' + path.join('.')); } stack.push(value); utils$1.forEach(value, function each(el, key) { @@ -2358,15 +2236,11 @@ if (!params) { return url; } + var _encode = options && options.encode || encode; var _options = utils$1.isFunction(options) ? { serialize: options } : options; - - // Read serializer options pollution-safely: own properties and methods on a - // class/template prototype are honored, but values injected onto a polluted - // Object.prototype are ignored. - var _encode = utils$1.getSafeProp(_options, 'encode') || encode; - var serializeFn = utils$1.getSafeProp(_options, 'serialize'); + var serializeFn = _options && _options.serialize; var serializedParams; if (serializeFn) { serializedParams = serializeFn(params, _options); @@ -2464,9 +2338,7 @@ silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false, - legacyInterceptorReqResOrdering: true, - advertiseZstdAcceptEncoding: false, - validateStatusUndefinedResolves: true + legacyInterceptorReqResOrdering: true }; var URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams; @@ -2546,13 +2418,6 @@ }, options)); } - var MAX_DEPTH = DEFAULT_FORM_DATA_MAX_DEPTH; - function throwIfDepthExceeded(index) { - if (index > MAX_DEPTH) { - throw new AxiosError('FormData field is too deeply nested (' + index + ' levels). Max depth: ' + MAX_DEPTH, AxiosError.ERR_FORM_DATA_DEPTH_EXCEEDED); - } - } - /** * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z'] * @@ -2565,14 +2430,9 @@ // foo.x.y.z // foo-x-y-z // foo x y z - var path = []; - var pattern = /\w+|\[(\w*)]/g; - var match; - while ((match = pattern.exec(name)) !== null) { - throwIfDepthExceeded(path.length); - path.push(match[0] === '[]' ? '' : match[1] || match[0]); - } - return path; + return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map(function (match) { + return match[0] === '[]' ? '' : match[1] || match[0]; + }); } /** @@ -2604,7 +2464,6 @@ */ function formDataToJSON(formData) { function buildPath(path, value, target, index) { - throwIfDepthExceeded(index); var name = path[index++]; if (name === '__proto__') return true; var isNumericKey = Number.isFinite(+name); @@ -2618,7 +2477,7 @@ } return !isNumericKey; } - if (!utils$1.hasOwnProp(target, name) || !utils$1.isObject(target[name])) { + if (!target[name] || !utils$1.isObject(target[name])) { target[name] = []; } var result = buildPath(path, value, target[name], index); @@ -2918,9 +2777,6 @@ var bytesNotified = 0; var _speedometer = speedometer(50, 250); return throttle(function (e) { - if (!e || typeof e.loaded !== 'number') { - return; - } var rawLoaded = e.loaded; var total = e.lengthComputable ? e.total : undefined; var loaded = total != null ? Math.min(rawLoaded, total) : rawLoaded; @@ -3052,24 +2908,6 @@ return relativeURL ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL; } - var malformedHttpProtocol = /^https?:(?!\/\/)/i; - var httpProtocolControlCharacters = /[\t\n\r]/g; - function stripLeadingC0ControlOrSpace(url) { - var i = 0; - while (i < url.length && url.charCodeAt(i) <= 0x20) { - i++; - } - return url.slice(i); - } - function normalizeURLForProtocolCheck(url) { - return stripLeadingC0ControlOrSpace(url).replace(httpProtocolControlCharacters, ''); - } - function assertValidHttpProtocolURL(url, config) { - if (typeof url === 'string' && malformedHttpProtocol.test(normalizeURLForProtocolCheck(url))) { - throw new AxiosError('Invalid URL: missing "//" after protocol', AxiosError.ERR_INVALID_URL, config); - } - } - /** * Creates a new URL by combining the baseURL with the requestedURL, * only when the requestedURL is not already an absolute URL. @@ -3080,11 +2918,9 @@ * * @returns {string} The combined full path */ - function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls, config) { - assertValidHttpProtocolURL(requestedURL, config); + function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) { var isRelativeUrl = !isAbsoluteURL(requestedURL); if (baseURL && (isRelativeUrl || allowAbsoluteUrls === false)) { - assertValidHttpProtocolURL(baseURL, config); return combineURLs(baseURL, requestedURL); } return requestedURL; @@ -3156,23 +2992,6 @@ return getMergedValue(undefined, a); } } - function getMergedTransitionalOption(prop) { - var transitional2 = utils$1.hasOwnProp(config2, 'transitional') ? config2.transitional : undefined; - if (!utils$1.isUndefined(transitional2)) { - if (utils$1.isPlainObject(transitional2)) { - if (utils$1.hasOwnProp(transitional2, prop)) { - return transitional2[prop]; - } - } else { - return undefined; - } - } - var transitional1 = utils$1.hasOwnProp(config1, 'transitional') ? config1.transitional : undefined; - if (utils$1.isPlainObject(transitional1) && utils$1.hasOwnProp(transitional1, prop)) { - return transitional1[prop]; - } - return undefined; - } // eslint-disable-next-line consistent-return function mergeDirectKeys(a, b, prop) { @@ -3224,13 +3043,6 @@ var configValue = merge(a, b, prop); utils$1.isUndefined(configValue) && merge !== mergeDirectKeys || (config[prop] = configValue); }); - if (utils$1.hasOwnProp(config2, 'validateStatus') && utils$1.isUndefined(config2.validateStatus) && getMergedTransitionalOption('validateStatusUndefinedResolves') === false) { - if (utils$1.hasOwnProp(config1, 'validateStatus')) { - config.validateStatus = getMergedValue(undefined, config1.validateStatus); - } else { - delete config.validateStatus; - } - } return config; } @@ -3258,12 +3070,12 @@ * * @returns {string} UTF-8 bytes as a Latin-1 string */ - var encodeUTF8$1 = function encodeUTF8(str) { + var encodeUTF8 = function encodeUTF8(str) { return encodeURIComponent(str).replace(/%([0-9A-F]{2})/gi, function (_, hex) { return String.fromCharCode(parseInt(hex, 16)); }); }; - function resolveConfig(config) { + var resolveConfig = (function (config) { var newConfig = mergeConfig({}, config); // Read only own properties to prevent prototype pollution gadgets @@ -3281,17 +3093,15 @@ var allowAbsoluteUrls = own('allowAbsoluteUrls'); var url = own('url'); newConfig.headers = headers = AxiosHeaders.from(headers); - newConfig.url = buildURL(buildFullPath(baseURL, url, allowAbsoluteUrls, newConfig), own('params'), own('paramsSerializer')); + newConfig.url = buildURL(buildFullPath(baseURL, url, allowAbsoluteUrls), config.params, config.paramsSerializer); // HTTP basic authentication if (auth) { - var username = utils$1.getSafeProp(auth, 'username') || ''; - var password = utils$1.getSafeProp(auth, 'password') || ''; - headers.set('Authorization', 'Basic ' + btoa(username + ':' + (password ? encodeUTF8$1(password) : ''))); + headers.set('Authorization', 'Basic ' + btoa((auth.username || '') + ':' + (auth.password ? encodeUTF8(auth.password) : ''))); } if (utils$1.isFormData(data)) { - if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv || utils$1.isReactNative(data)) { - headers.setContentType(undefined); // browser/web worker/RN handles it + if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) { + headers.setContentType(undefined); // browser handles it } else if (utils$1.isFunction(data.getHeaders)) { // Node.js FormData (like form-data package) setFormDataHeaders(headers, data.getHeaders(), own('formDataHeaderPolicy')); @@ -3319,7 +3129,7 @@ } } return newConfig; - } + }); var isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; var xhrAdapter = isXHRAdapterSupported && function (config) { @@ -3439,7 +3249,7 @@ // Add headers to the request if ('setRequestHeader' in request) { - utils$1.forEach(toByteStringHeaderObject(requestHeaders), function setRequestHeader(val, key) { + utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) { request.setRequestHeader(key, val); }); } @@ -3501,43 +3311,42 @@ }; var composeSignals = function composeSignals(signals, timeout) { - signals = signals ? signals.filter(Boolean) : []; - if (!timeout && !signals.length) { - return; - } - var controller = new AbortController(); - var aborted = false; - var onabort = function onabort(reason) { - if (!aborted) { - aborted = true; - unsubscribe(); - var err = reason instanceof Error ? reason : this.reason; - controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err)); - } - }; - var timer = timeout && setTimeout(function () { - timer = null; - onabort(new AxiosError("timeout of ".concat(timeout, "ms exceeded"), AxiosError.ETIMEDOUT)); - }, timeout); - var unsubscribe = function unsubscribe() { - if (!signals) { - return; - } - timer && clearTimeout(timer); - timer = null; + var _signals = signals = signals ? signals.filter(Boolean) : [], + length = _signals.length; + if (timeout || length) { + var controller = new AbortController(); + var aborted; + var onabort = function onabort(reason) { + if (!aborted) { + aborted = true; + unsubscribe(); + var err = reason instanceof Error ? reason : this.reason; + controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err)); + } + }; + var timer = timeout && setTimeout(function () { + timer = null; + onabort(new AxiosError("timeout of ".concat(timeout, "ms exceeded"), AxiosError.ETIMEDOUT)); + }, timeout); + var unsubscribe = function unsubscribe() { + if (signals) { + timer && clearTimeout(timer); + timer = null; + signals.forEach(function (signal) { + signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort); + }); + signals = null; + } + }; signals.forEach(function (signal) { - signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort); + return signal.addEventListener('abort', onabort); }); - signals = null; - }; - signals.forEach(function (signal) { - return signal.addEventListener('abort', onabort); - }); - var signal = controller.signal; - signal.unsubscribe = function () { - return utils$1.asap(unsubscribe); - }; - return signal; + var signal = controller.signal; + signal.unsubscribe = function () { + return utils$1.asap(unsubscribe); + }; + return signal; + } }; var streamChunk = /*#__PURE__*/_regenerator().m(function streamChunk(chunk, chunkSize) { @@ -3747,17 +3556,11 @@ * Estimate decoded byte length of a data:// URL *without* allocating large buffers. * - For base64: compute exact decoded size using length and padding; * handle %XX at the character-count level (no string allocation). - * - For non-base64: compute the exact percent-decoded UTF-8 byte length. + * - For non-base64: use UTF-8 byteLength of the encoded body as a safe upper bound. * * @param {string} url * @returns {number} */ - var isHexDigit = function isHexDigit(charCode) { - return charCode >= 48 && charCode <= 57 || charCode >= 65 && charCode <= 70 || charCode >= 97 && charCode <= 102; - }; - var isPercentEncodedByte = function isPercentEncodedByte(str, i, len) { - return i + 2 < len && isHexDigit(str.charCodeAt(i + 1)) && isHexDigit(str.charCodeAt(i + 2)); - }; function estimateDataURLDecodedBytes(url) { if (!url || typeof url !== 'string') return 0; if (!url.startsWith('data:')) return 0; @@ -3774,7 +3577,7 @@ if (body.charCodeAt(i) === 37 /* '%' */ && i + 2 < len) { var a = body.charCodeAt(i + 1); var b = body.charCodeAt(i + 2); - var isHex = isHexDigit(a) && isHexDigit(b); + var isHex = (a >= 48 && a <= 57 || a >= 65 && a <= 70 || a >= 97 && a <= 102) && (b >= 48 && b <= 57 || b >= 65 && b <= 70 || b >= 97 && b <= 102); if (isHex) { effectiveLen -= 2; i += 2; @@ -3811,18 +3614,18 @@ var _bytes = groups * 3 - (pad || 0); return _bytes > 0 ? _bytes : 0; } + if (typeof Buffer !== 'undefined' && typeof Buffer.byteLength === 'function') { + return Buffer.byteLength(body, 'utf8'); + } // Compute UTF-8 byte length directly from UTF-16 code units without allocating // a byte buffer (TextEncoder.encode would defeat the DoS guard on large bodies). - // Valid %XX triplets count as one decoded byte; this matches the bytes that - // decodeURIComponent(body) would produce before Buffer re-encodes the string. + // Using body.length here would undercount non-ASCII (e.g. '€' is 1 code unit + // but 3 UTF-8 bytes). var bytes = 0; for (var _i = 0, _len = body.length; _i < _len; _i++) { var c = body.charCodeAt(_i); - if (c === 37 /* '%' */ && isPercentEncodedByte(body, _i, _len)) { - bytes += 1; - _i += 2; - } else if (c < 0x80) { + if (c < 0x80) { bytes += 1; } else if (c < 0x800) { bytes += 2; @@ -3841,39 +3644,10 @@ return bytes; } - var VERSION = "1.18.0"; + var VERSION = "1.16.0"; var DEFAULT_CHUNK_SIZE = 64 * 1024; var isFunction = utils$1.isFunction; - - /** - * Encode a UTF-8 string to a Latin-1 byte string for use with btoa(). - * This is a modern replacement for the deprecated unescape(encodeURIComponent(str)) pattern. - * - * @param {string} str The string to encode - * - * @returns {string} UTF-8 bytes as a Latin-1 string - */ - var encodeUTF8 = function encodeUTF8(str) { - return encodeURIComponent(str).replace(/%([0-9A-F]{2})/gi, function (_, hex) { - return String.fromCharCode(parseInt(hex, 16)); - }); - }; - - // Node's WHATWG URL parser returns `username` and `password` percent-encoded. - // Decode before composing the `auth` option so credentials such as - // `my%40email.com:pass` are sent as `my@email.com:pass`. Falls back to the - // original value for malformed input so a bad encoding never throws. - var decodeURIComponentSafe = function decodeURIComponentSafe(value) { - if (!utils$1.isString(value)) { - return value; - } - try { - return decodeURIComponent(value); - } catch (error) { - return value; - } - }; var test = function test(fn) { try { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { @@ -3884,16 +3658,9 @@ return false; } }; - var maybeWithAuthCredentials = function maybeWithAuthCredentials(url) { - var protocolIndex = url.indexOf('://'); - var urlToCheck = url; - if (protocolIndex !== -1) { - urlToCheck = urlToCheck.slice(protocolIndex + 3); - } - return urlToCheck.includes('@') || urlToCheck.includes(':'); - }; var factory = function factory(env) { - var globalObject = utils$1.global !== undefined && utils$1.global !== null ? utils$1.global : globalThis; + var _utils$global; + var globalObject = (_utils$global = utils$1.global) !== null && _utils$global !== void 0 ? _utils$global : globalThis; var ReadableStream = globalObject.ReadableStream, TextEncoder = globalObject.TextEncoder; env = utils$1.merge.call({ @@ -4045,16 +3812,13 @@ }(); return /*#__PURE__*/function () { var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(config) { - var _resolveConfig, url, method, data, signal, cancelToken, timeout, onDownloadProgress, onUploadProgress, responseType, headers, _resolveConfig$withCr, withCredentials, fetchOptions, maxContentLength, maxBodyLength, hasMaxContentLength, hasMaxBodyLength, own, _fetch, composedSignal, request, unsubscribe, requestContentLength, pendingBodyError, maxBodyLengthError, auth, configAuth, username, password, parsedURL, urlUsername, urlPassword, estimated, outboundLength, mustEnforceStreamBody, trackRequestStream, _request, contentTypeHeader, _ref5, _ref6, onProgress, flush, isCredentialsSupported, contentType, resolvedOptions, response, responseHeaders, declaredLength, isStreamResponse, options, responseContentLength, _ref7, _ref8, _onProgress, _flush, bytesRead, onChunkProgress, responseData, materializedSize, canceledError, _t3, _t4; + var _resolveConfig, url, method, data, signal, cancelToken, timeout, onDownloadProgress, onUploadProgress, responseType, headers, _resolveConfig$withCr, withCredentials, fetchOptions, maxContentLength, maxBodyLength, hasMaxContentLength, hasMaxBodyLength, _fetch, composedSignal, request, unsubscribe, requestContentLength, estimated, outboundLength, _request, contentTypeHeader, _progressEventDecorat, _progressEventDecorat2, onProgress, flush, isCredentialsSupported, contentType, resolvedOptions, response, declaredLength, isStreamResponse, options, responseContentLength, _ref5, _ref6, _onProgress, _flush, bytesRead, onChunkProgress, responseData, materializedSize, canceledError, _t3, _t4, _t5; return _regenerator().w(function (_context4) { while (1) switch (_context4.p = _context4.n) { case 0: _resolveConfig = resolveConfig(config), url = _resolveConfig.url, method = _resolveConfig.method, data = _resolveConfig.data, signal = _resolveConfig.signal, cancelToken = _resolveConfig.cancelToken, timeout = _resolveConfig.timeout, onDownloadProgress = _resolveConfig.onDownloadProgress, onUploadProgress = _resolveConfig.onUploadProgress, responseType = _resolveConfig.responseType, headers = _resolveConfig.headers, _resolveConfig$withCr = _resolveConfig.withCredentials, withCredentials = _resolveConfig$withCr === void 0 ? 'same-origin' : _resolveConfig$withCr, fetchOptions = _resolveConfig.fetchOptions, maxContentLength = _resolveConfig.maxContentLength, maxBodyLength = _resolveConfig.maxBodyLength; hasMaxContentLength = utils$1.isNumber(maxContentLength) && maxContentLength > -1; hasMaxBodyLength = utils$1.isNumber(maxBodyLength) && maxBodyLength > -1; - own = function own(key) { - return utils$1.hasOwnProp(config, key) ? config[key] : undefined; - }; _fetch = envFetch || fetch; responseType = responseType ? (responseType + '').toLowerCase() : 'text'; composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout); @@ -4062,50 +3826,7 @@ unsubscribe = composedSignal && composedSignal.unsubscribe && function () { composedSignal.unsubscribe(); }; - // AxiosError we raise while the request body is being streamed. Captured - // by identity so the catch block can surface it directly, regardless of - // how the runtime wraps the resulting fetch rejection (undici exposes it - // as `err.cause`; some browsers drop the original error entirely). - pendingBodyError = null; - maxBodyLengthError = function maxBodyLengthError() { - return new AxiosError('Request body larger than maxBodyLength limit', AxiosError.ERR_BAD_REQUEST, config, request); - }; _context4.p = 1; - // HTTP basic authentication - auth = undefined; - configAuth = own('auth'); - if (configAuth) { - username = utils$1.getSafeProp(configAuth, 'username') || ''; - password = utils$1.getSafeProp(configAuth, 'password') || ''; - auth = { - username: username, - password: password - }; - } - if (maybeWithAuthCredentials(url)) { - parsedURL = new URL(url, platform.origin); - if (!auth && (parsedURL.username || parsedURL.password)) { - urlUsername = decodeURIComponentSafe(parsedURL.username); - urlPassword = decodeURIComponentSafe(parsedURL.password); - auth = { - username: urlUsername, - password: urlPassword - }; - } - if (parsedURL.username || parsedURL.password) { - parsedURL.username = ''; - parsedURL.password = ''; - url = parsedURL.href; - } - } - if (auth) { - headers["delete"]('authorization'); - headers.set('Authorization', 'Basic ' + btoa(encodeUTF8((auth.username || '') + ':' + (auth.password || '')))); - } - - // Enforce maxContentLength for data: URLs up-front so we never materialize - // an oversized payload. The HTTP adapter applies the same check (see http.js - // "if (protocol === 'data:')" branch). if (!(hasMaxContentLength && typeof url === 'string' && url.startsWith('data:'))) { _context4.n = 2; break; @@ -4122,82 +3843,43 @@ break; } _context4.n = 3; - return getBodyLength(data); + return resolveBodyLength(headers, data); case 3: outboundLength = _context4.v; - if (!(typeof outboundLength === 'number' && isFinite(outboundLength))) { + if (!(typeof outboundLength === 'number' && isFinite(outboundLength) && outboundLength > maxBodyLength)) { _context4.n = 4; break; } - requestContentLength = outboundLength; - if (!(outboundLength > maxBodyLength)) { - _context4.n = 4; - break; - } - throw maxBodyLengthError(); + throw new AxiosError('Request body larger than maxBodyLength limit', AxiosError.ERR_BAD_REQUEST, config, request); case 4: - // A streamed body under maxBodyLength must be counted as fetch consumes - // it; its size is never trusted from a caller-declared Content-Length. - mustEnforceStreamBody = hasMaxBodyLength && (utils$1.isReadableStream(data) || utils$1.isStream(data)); - trackRequestStream = function trackRequestStream(stream, onProgress, flush) { - return trackStream(stream, DEFAULT_CHUNK_SIZE, function (loadedBytes) { - if (hasMaxBodyLength && loadedBytes > maxBodyLength) { - throw pendingBodyError = maxBodyLengthError(); - } - onProgress && onProgress(loadedBytes); - }, flush); - }; - if (!(supportsRequestStream && method !== 'get' && method !== 'head' && (onUploadProgress || mustEnforceStreamBody))) { - _context4.n = 8; - break; - } - if (!(requestContentLength == null)) { + _t3 = onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head'; + if (!_t3) { _context4.n = 6; break; } _context4.n = 5; return resolveBodyLength(headers, data); case 5: - _t3 = _context4.v; - _context4.n = 7; - break; + _t4 = requestContentLength = _context4.v; + _t3 = _t4 !== 0; case 6: - _t3 = requestContentLength; + if (!_t3) { + _context4.n = 7; + break; + } + _request = new Request(url, { + method: 'POST', + body: data, + duplex: 'half' + }); + if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) { + headers.setContentType(contentTypeHeader); + } + if (_request.body) { + _progressEventDecorat = progressEventDecorator(requestContentLength, progressEventReducer(asyncDecorator(onUploadProgress))), _progressEventDecorat2 = _slicedToArray(_progressEventDecorat, 2), onProgress = _progressEventDecorat2[0], flush = _progressEventDecorat2[1]; + data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush); + } case 7: - requestContentLength = _t3; - // A declared length of 0 is only trusted to skip the wrap when we are - // not enforcing a stream limit (which must not rely on that header). - if (requestContentLength !== 0 || mustEnforceStreamBody) { - _request = new Request(url, { - method: 'POST', - body: data, - duplex: 'half' - }); - if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) { - headers.setContentType(contentTypeHeader); - } - if (_request.body) { - _ref5 = onUploadProgress && progressEventDecorator(requestContentLength, progressEventReducer(asyncDecorator(onUploadProgress))) || [], _ref6 = _slicedToArray(_ref5, 2), onProgress = _ref6[0], flush = _ref6[1]; - data = trackRequestStream(_request.body, onProgress, flush); - } - } - _context4.n = 10; - break; - case 8: - if (!(mustEnforceStreamBody && !isRequestSupported && isReadableStreamSupported && method !== 'get' && method !== 'head')) { - _context4.n = 9; - break; - } - data = trackRequestStream(data); - _context4.n = 10; - break; - case 9: - if (!(mustEnforceStreamBody && isRequestSupported && !supportsRequestStream && method !== 'get' && method !== 'head')) { - _context4.n = 10; - break; - } - throw new AxiosError('Stream request bodies are not supported by the current fetch implementation', AxiosError.ERR_NOT_SUPPORT, config, request); - case 10: if (!utils$1.isString(withCredentials)) { withCredentials = withCredentials ? 'include' : 'omit'; } @@ -4218,37 +3900,35 @@ resolvedOptions = _objectSpread2(_objectSpread2({}, fetchOptions), {}, { signal: composedSignal, method: method.toUpperCase(), - headers: toByteStringHeaderObject(headers.normalize()), + headers: headers.normalize().toJSON(), body: data, duplex: 'half', credentials: isCredentialsSupported ? withCredentials : undefined }); request = isRequestSupported && new Request(url, resolvedOptions); - _context4.n = 11; + _context4.n = 8; return isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions); - case 11: + case 8: response = _context4.v; - responseHeaders = AxiosHeaders.from(response.headers); // Cheap pre-check: if the server honestly declares a content-length that - // already exceeds the cap, reject before we start streaming. if (!hasMaxContentLength) { - _context4.n = 12; + _context4.n = 9; break; } - declaredLength = utils$1.toFiniteNumber(responseHeaders.getContentLength()); + declaredLength = utils$1.toFiniteNumber(response.headers.get('content-length')); if (!(declaredLength != null && declaredLength > maxContentLength)) { - _context4.n = 12; + _context4.n = 9; break; } throw new AxiosError('maxContentLength size of ' + maxContentLength + ' exceeded', AxiosError.ERR_BAD_RESPONSE, config, request); - case 12: + case 9: isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response'); if (supportsResponseStream && response.body && (onDownloadProgress || hasMaxContentLength || isStreamResponse && unsubscribe)) { options = {}; ['status', 'statusText', 'headers'].forEach(function (prop) { options[prop] = response[prop]; }); - responseContentLength = utils$1.toFiniteNumber(responseHeaders.getContentLength()); - _ref7 = onDownloadProgress && progressEventDecorator(responseContentLength, progressEventReducer(asyncDecorator(onDownloadProgress), true)) || [], _ref8 = _slicedToArray(_ref7, 2), _onProgress = _ref8[0], _flush = _ref8[1]; + responseContentLength = utils$1.toFiniteNumber(response.headers.get('content-length')); + _ref5 = onDownloadProgress && progressEventDecorator(responseContentLength, progressEventReducer(asyncDecorator(onDownloadProgress), true)) || [], _ref6 = _slicedToArray(_ref5, 2), _onProgress = _ref6[0], _flush = _ref6[1]; bytesRead = 0; onChunkProgress = function onChunkProgress(loadedBytes) { if (hasMaxContentLength) { @@ -4265,12 +3945,12 @@ }), options); } responseType = responseType || 'text'; - _context4.n = 13; + _context4.n = 10; return resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config); - case 13: + case 10: responseData = _context4.v; if (!(hasMaxContentLength && !supportsResponseStream && !isStreamResponse)) { - _context4.n = 14; + _context4.n = 11; break; } if (responseData != null) { @@ -4283,13 +3963,13 @@ } } if (!(typeof materializedSize === 'number' && materializedSize > maxContentLength)) { - _context4.n = 14; + _context4.n = 11; break; } throw new AxiosError('maxContentLength size of ' + maxContentLength + ' exceeded', AxiosError.ERR_BAD_RESPONSE, config, request); - case 14: + case 11: !isStreamResponse && unsubscribe && unsubscribe(); - _context4.n = 15; + _context4.n = 12; return new Promise(function (resolve, reject) { settle(resolve, reject, { data: responseData, @@ -4300,53 +3980,39 @@ request: request }); }); - case 15: + case 12: return _context4.a(2, _context4.v); - case 16: - _context4.p = 16; - _t4 = _context4.v; + case 13: + _context4.p = 13; + _t5 = _context4.v; unsubscribe && unsubscribe(); // Safari can surface fetch aborts as a DOMException-like object whose // branded getters throw. Prefer our composed signal reason before reading // the caught error, preserving timeout vs cancellation semantics. if (!(composedSignal && composedSignal.aborted && composedSignal.reason instanceof AxiosError)) { - _context4.n = 17; + _context4.n = 14; break; } canceledError = composedSignal.reason; canceledError.config = config; request && (canceledError.request = request); - _t4 !== canceledError && (canceledError.cause = _t4); + _t5 !== canceledError && (canceledError.cause = _t5); throw canceledError; - case 17: - if (!pendingBodyError) { - _context4.n = 18; + case 14: + if (!(_t5 && _t5.name === 'TypeError' && /Load failed|fetch/i.test(_t5.message))) { + _context4.n = 15; break; } - request && !pendingBodyError.request && (pendingBodyError.request = request); - throw pendingBodyError; - case 18: - if (!(_t4 instanceof AxiosError)) { - _context4.n = 19; - break; - } - request && !_t4.request && (_t4.request = request); - throw _t4; - case 19: - if (!(_t4 && _t4.name === 'TypeError' && /Load failed|fetch/i.test(_t4.message))) { - _context4.n = 20; - break; - } - throw Object.assign(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, _t4 && _t4.response), { - cause: _t4.cause || _t4 + throw Object.assign(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, _t5 && _t5.response), { + cause: _t5.cause || _t5 }); - case 20: - throw AxiosError.from(_t4, _t4 && _t4.code, config, request, _t4 && _t4.response); - case 21: + case 15: + throw AxiosError.from(_t5, _t5 && _t5.code, config, request, _t5 && _t5.response); + case 16: return _context4.a(2); } - }, _callee4, null, [[1, 16]]); + }, _callee4, null, [[1, 13]]); })); return function (_x5) { return _ref4.apply(this, arguments); @@ -4746,9 +4412,7 @@ silentJSONParsing: validators.transitional(validators["boolean"]), forcedJSONParsing: validators.transitional(validators["boolean"]), clarifyTimeoutError: validators.transitional(validators["boolean"]), - legacyInterceptorReqResOrdering: validators.transitional(validators["boolean"]), - advertiseZstdAcceptEncoding: validators.transitional(validators["boolean"]), - validateStatusUndefinedResolves: validators.transitional(validators["boolean"]) + legacyInterceptorReqResOrdering: validators.transitional(validators["boolean"]) }, false); } if (paramsSerializer != null) { @@ -4847,7 +4511,7 @@ key: "getUri", value: function getUri(config) { config = mergeConfig(this.defaults, config); - var fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls, config); + var fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls); return buildURL(fullPath, config.params, config.paramsSerializer); } }]); @@ -4858,7 +4522,7 @@ return this.request(mergeConfig(config || {}, { method: method, url: url, - data: config && utils$1.hasOwnProp(config, 'data') ? config.data : undefined + data: (config || {}).data })); }; }); diff --git a/lnbits/static/vendor/quasar.css b/lnbits/static/vendor/quasar.css index 679b2713f..8d77fbf20 100644 --- a/lnbits/static/vendor/quasar.css +++ b/lnbits/static/vendor/quasar.css @@ -3390,10 +3390,6 @@ body.desktop .q-radio--dense:not(.disabled):focus .q-radio__inner:before, body.d .q-rating__icon-container + .q-rating__icon-container { margin-left: 2px; } -[dir=rtl] .q-rating__icon-container + .q-rating__icon-container { - margin-left: 0 /* rtl:ignore */; - margin-right: 2px /* rtl:ignore */; -} .q-rating__icon { color: currentColor; text-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); @@ -10336,15 +10332,8 @@ body.body--dark .inset-shadow-down { opacity: 0.7; } -.q-document--prevent-scroll { - overscroll-behavior: none !important; -} -.q-document--prevent-scroll body { - position: fixed !important; -} - /* body */ -.q-body--fullscreen-mixin { +.q-body--fullscreen-mixin, .q-body--prevent-scroll { position: fixed !important; } diff --git a/lnbits/static/vendor/quasar.umd.prod.js b/lnbits/static/vendor/quasar.umd.prod.js index 0e11897f8..f1faa9018 100644 --- a/lnbits/static/vendor/quasar.umd.prod.js +++ b/lnbits/static/vendor/quasar.umd.prod.js @@ -1,9 +1,9 @@ /*! -* Quasar Framework v2.22.0 +* Quasar Framework v2.19.3 * (c) 2015-present Razvan Stoenescu * Released under the MIT License. */ -(function(e){var t=Object.defineProperty,n=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r};function r(e,t,n,r){return Object.defineProperty(e,t,{get:n,set:r,enumerable:!0}),e}function i(e,t){for(let n in t)r(e,n,t[n]);return e}let a=(0,e.ref)(!1),o;function s(e,t){let n=/(edg|edge|edga|edgios)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(vivaldi)[\/]([\w.]+)/.exec(e)||/(chrome|crios)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(e)||/(webkit)[\/]([\w.]+).*(version)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(e)||/(firefox|fxios)[\/]([\w.]+)/.exec(e)||/(webkit)[\/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[\/]([\w.]+)/.exec(e)||[];return{browser:n[5]||n[3]||n[1]||``,version:n[4]||n[2]||`0`,platform:t[0]||``}}function c(e){return/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(silk)/.exec(e)||/(android)/.exec(e)||/(win)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||/(playbook)/.exec(e)||/(bb)/.exec(e)||/(blackberry)/.exec(e)||[]}let l=`ontouchstart`in window||window.navigator.maxTouchPoints>0;function u(e){let t=e.toLowerCase(),n=s(t,c(t)),r={mobile:!1,desktop:!1,cordova:!1,capacitor:!1,nativeMobile:!1,electron:!1,bex:!1,linux:!1,mac:!1,win:!1,cros:!1,chrome:!1,firefox:!1,opera:!1,safari:!1,vivaldi:!1,edge:!1,edgeChromium:!1,ie:!1,webkit:!1,android:!1,ios:!1,ipad:!1,iphone:!1,ipod:!1,kindle:!1,winphone:!1,blackberry:!1,playbook:!1,silk:!1};n.browser&&(r[n.browser]=!0,r.version=n.version,r.versionNumber=Number.parseInt(n.version,10)),n.platform&&(r[n.platform]=!0);let i=r.android||r.ios||r.bb||r.blackberry||r.ipad||r.iphone||r.ipod||r.kindle||r.playbook||r.silk||r[`windows phone`];if(i===!0||t.includes(`mobile`)?r.mobile=!0:r.desktop=!0,r[`windows phone`]&&(r.winphone=!0,delete r[`windows phone`]),r.edga||r.edgios||r.edg?(r.edge=!0,n.browser=`edge`):r.crios?(r.chrome=!0,n.browser=`chrome`):r.fxios&&(r.firefox=!0,n.browser=`firefox`),(r.ipod||r.ipad||r.iphone)&&(r.ios=!0),r.vivaldi&&=(n.browser=`vivaldi`,!0),(r.chrome||r.opr||r.safari||r.vivaldi||r.mobile&&!r.ios&&!i)&&(r.webkit=!0),r.opr&&(n.browser=`opera`,r.opera=!0),r.safari&&(r.blackberry||r.bb?(n.browser=`blackberry`,r.blackberry=!0):r.playbook?(n.browser=`playbook`,r.playbook=!0):r.android?(n.browser=`android`,r.android=!0):r.kindle?(n.browser=`kindle`,r.kindle=!0):r.silk&&=(n.browser=`silk`,!0)),r.name=n.browser,r.platform=n.platform,t.includes(`electron`))r.electron=!0;else if(document.location.href.includes(`-extension://`))r.bex=!0;else{if(window.Capacitor===void 0?(window._cordovaNative!==void 0||window.cordova!==void 0)&&(r.cordova=!0,r.nativeMobile=!0,r.nativeMobileWrapper=`cordova`):(r.capacitor=!0,r.nativeMobile=!0,r.nativeMobileWrapper=`capacitor`),a.value&&(o={is:{...r}}),l&&r.mac&&(r.desktop&&r.safari||r.nativeMobile&&!r.android&&!r.ios&&!r.ipad)){delete r.mac,delete r.desktop;let e=Math.min(window.innerHeight,window.innerWidth)>414?`ipad`:`iphone`;Object.assign(r,{mobile:!0,ios:!0,platform:e,[e]:!0})}!r.mobile&&window.navigator.userAgentData&&window.navigator.userAgentData.mobile&&(delete r.desktop,r.mobile=!0)}return r}let d=navigator.userAgent||navigator.vendor||window.opera,f={has:{touch:!1,webStorage:!1},within:{iframe:!1}},p={userAgent:d,is:u(d),has:{touch:l},within:{iframe:window.self!==window.top}},m={install(t){let{$q:n}=t;a.value?(t.onSSRHydrated.push(()=>{Object.assign(n.platform,p),a.value=!1}),n.platform=(0,e.reactive)(this)):n.platform=this}};{let e;r(p.has,`webStorage`,()=>{if(e!==void 0)return e;try{if(window.localStorage)return e=!0,!0}catch{}return e=!1,!1}),Object.assign(m,p),a.value&&(Object.assign(m,o,f),o=null)}function h(t){return(0,e.markRaw)((0,e.defineComponent)(t))}function g(t){return(0,e.markRaw)(t)}let _=(t,n)=>{let i=(0,e.reactive)(t);for(let e in t)r(n,e,()=>i[e],t=>{i[e]=t});return n},v={hasPassive:!1,passiveCapture:!0,notPassiveCapture:!0};try{let e=Object.defineProperty({},"passive",{get(){Object.assign(v,{hasPassive:!0,passive:{passive:!0},notPassive:{passive:!1},passiveCapture:{passive:!0,capture:!0},notPassiveCapture:{passive:!1,capture:!0}})}});window.addEventListener(`qtest`,null,e),window.removeEventListener(`qtest`,null,e)}catch{}function y(){}function b(e){return e.button===0}function x(e){return e.button===1}function S(e){return e.button===2}function C(e){return e.touches&&e.touches[0]?e=e.touches[0]:e.changedTouches&&e.changedTouches[0]?e=e.changedTouches[0]:e.targetTouches&&e.targetTouches[0]&&(e=e.targetTouches[0]),{top:e.clientY,left:e.clientX}}function w(e){if(e.path)return e.path;if(e.composedPath)return e.composedPath();let t=[],n=e.target;for(;n;){if(t.push(n),n.tagName===`HTML`)return t.push(document,window),t;n=n.parentElement}}function T(e){let t=e.deltaX,n=e.deltaY;if((t||n)&&e.deltaMode){let r=e.deltaMode===1?40:800;t*=r,n*=r}return e.shiftKey&&!t&&([n,t]=[t,n]),{x:t,y:n}}function E(e){e.stopPropagation()}function D(e){e.cancelable!==!1&&e.preventDefault()}function O(e){e.cancelable!==!1&&e.preventDefault(),e.stopPropagation()}function k(e,t){if(e===void 0||t&&e.__dragPrevented)return;let n=t?e=>{e.__dragPrevented=!0,e.addEventListener(`dragstart`,D,v.notPassiveCapture)}:e=>{delete e.__dragPrevented,e.removeEventListener(`dragstart`,D,v.notPassiveCapture)};e.querySelectorAll(`a, img`).forEach(n)}function A(e,t,n){let r=`__q_${t}_evt`;e[r]=[...e[r]??[],...n],n.forEach(t=>{t[0].addEventListener(t[1],e[t[2]],v[t[3]])})}function j(e,t){let n=`__q_${t}_evt`;e[n]!==void 0&&(e[n].forEach(t=>{t[0].removeEventListener(t[1],e[t[2]],v[t[3]])}),e[n]=void 0)}var M={listenOpts:v,leftClick:b,middleClick:x,rightClick:S,position:C,getEventPath:w,getMouseWheelDistance:T,stop:E,prevent:D,stopAndPrevent:O,preventDraggable:k};function N(e,t=250,n){let r=null;function i(...i){r===null?n&&e.apply(this,i):clearTimeout(r),r=setTimeout(()=>{r=null,n||e.apply(this,i)},t)}return i.cancel=()=>{r!==null&&clearTimeout(r)},i}let P=[`sm`,`md`,`lg`,`xl`],{passive:F}=v;var I=_({width:0,height:0,name:`xs`,sizes:{sm:600,md:1024,lg:1440,xl:1920},lt:{sm:!0,md:!0,lg:!0,xl:!0},gt:{xs:!1,sm:!1,md:!1,lg:!1},xs:!0,sm:!1,md:!1,lg:!1,xl:!1},{setSizes:y,setDebounce:y,install({$q:e,onSSRHydrated:t}){if(e.screen=this,this.__installed){e.config.screen!==void 0&&(e.config.screen.bodyClasses?this.__update(!0):document.body.classList.remove(`screen--${this.name}`));return}let{visualViewport:n}=window,r=n||window,i=document.scrollingElement||document.documentElement,o=n===void 0||p.is.mobile?()=>[Math.max(window.innerWidth,i.clientWidth),Math.max(window.innerHeight,i.clientHeight)]:()=>[n.width*n.scale+window.innerWidth-i.clientWidth,n.height*n.scale+window.innerHeight-i.clientHeight],s=e.config.screen?.bodyClasses===!0;this.__update=e=>{let[t,n]=o();if(n!==this.height&&(this.height=n),t!==this.width)this.width=t;else if(e!==!0)return;let r=this.sizes;this.gt.xs=t>=r.sm,this.gt.sm=t>=r.md,this.gt.md=t>=r.lg,this.gt.lg=t>=r.xl,this.lt.sm=t{P.forEach(t=>{e[t]!==void 0&&(l[t]=e[t])})},this.setDebounce=e=>{u=e};let d=()=>{let e=getComputedStyle(document.body);e.getPropertyValue(`--q-size-sm`)&&P.forEach(t=>{this.sizes[t]=Number.parseInt(e.getPropertyValue(`--q-size-${t}`),10)}),this.setSizes=e=>{P.forEach(t=>{e[t]&&(this.sizes[t]=e[t])}),this.__update(!0)},this.setDebounce=e=>{c!==void 0&&r.removeEventListener(`resize`,c,F),c=e>0?N(this.__update,e):this.__update,r.addEventListener(`resize`,c,F)},this.setDebounce(u),Object.keys(l).length===0?this.__update():(this.setSizes(l),l=void 0),s&&this.name===`xs`&&document.body.classList.add(`screen--xs`)};a.value?t.push(d):d()}});let L=_({isActive:!1,mode:!1},{__media:void 0,set(e){L.mode=e,e===`auto`?(L.__media===void 0&&(L.__media=window.matchMedia(`(prefers-color-scheme: dark)`),L.__updateMedia=()=>{L.set(`auto`)},L.__media.addListener(L.__updateMedia)),e=L.__media.matches):L.__media!==void 0&&(L.__media.removeListener(L.__updateMedia),L.__media=void 0),L.isActive=e===!0,document.body.classList.remove(`body--${e===!0?`light`:`dark`}`),document.body.classList.add(`body--${e===!0?`dark`:`light`}`)},toggle(){L.set(!L.isActive)},install({$q:e,ssrContext:t}){let n=e.config.dark;e.dark=this,this.__installed||this.set(n!==void 0&&n)}});function R(e,t,n=document.body){if(typeof e!=`string`)throw TypeError(`Expected a string as propName`);if(typeof t!=`string`)throw TypeError(`Expected a string as value`);if(!(n instanceof Element))throw TypeError(`Expected a DOM element`);n.style.setProperty(`--q-${e}`,t)}let ee=!1;function z(e){ee=e.isComposing===!0}function te(e){return ee||e!==Object(e)||e.isComposing||e.qKeyEvent}function B(e,t){return!te(e)&&[t].flat().includes(e.keyCode)}function V(e){if(e.ios)return`ios`;if(e.android)return`android`}function ne({is:e,has:t,within:n},r){let i=[e.desktop?`desktop`:`mobile`,`${t.touch?``:`no-`}touch`];if(e.mobile){let t=V(e);t!==void 0&&i.push(`platform-`+t)}if(e.nativeMobile){let t=e.nativeMobileWrapper;i.push(t,`native-mobile`),e.ios&&(r[t]===void 0||r[t].iosStatusBarPadding)&&i.push(`q-ios-padding`)}else e.electron?i.push(`electron`):e.bex&&i.push(`bex`);return n.iframe&&i.push(`within-iframe`),i}function H(){let{is:e}=p,t=document.body.className,n=new Set(t.replaceAll(/ {2}/g,` `).split(` `));if(!e.nativeMobile&&!e.electron&&!e.bex){if(e.desktop)n.delete(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`),n.add(`desktop`);else if(e.mobile){n.delete(`desktop`),n.add(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`);let t=V(e);t!==void 0&&n.add(`platform-${t}`)}}p.has.touch&&(n.delete(`no-touch`),n.add(`touch`)),p.within.iframe&&n.add(`within-iframe`);let r=[...n].join(` `);t!==r&&(document.body.className=r)}function U(e){for(let t in e)R(t,e[t])}var W={install(e){if(!this.__installed){if(a.value)H();else{let{$q:t}=e;t.config.brand!==void 0&&U(t.config.brand),document.body.classList.add(...ne(p,t.config))}p.is.ios&&document.body.addEventListener(`touchstart`,y),window.addEventListener(`keydown`,z,!0)}}};let G=()=>!0;function K(e){return typeof e==`string`&&e!==``&&e!==`/`&&e!==`#/`}function q(e){return e.startsWith(`#`)&&(e=e.slice(1)),e.startsWith(`/`)||(e=`/`+e),e.endsWith(`/`)&&(e=e.slice(0,-1)),`#`+e}function re(e){if(e.backButtonExit===!1)return()=>!1;if(e.backButtonExit===`*`)return G;let t=[`#/`];return Array.isArray(e.backButtonExit)&&t.push(...e.backButtonExit.filter(K).map(q)),()=>t.includes(window.location.hash)}var ie={__history:[],add:y,remove:y,install({$q:e}){if(this.__installed)return;let{cordova:t,capacitor:n}=p.is;if(!t&&!n)return;let r=e.config[t?`cordova`:`capacitor`];if(r?.backButton===!1||n&&(window.Capacitor===void 0||window.Capacitor.Plugins.App===void 0))return;this.add=e=>{e.condition===void 0&&(e.condition=G),this.__history.push(e)},this.remove=e=>{let t=this.__history.indexOf(e);t!==-1&&this.__history.splice(t,1)};let i=re({backButtonExit:!0,...r}),a=()=>{if(this.__history.length!==0){let e=this.__history.at(-1);e.condition()&&(this.__history.pop(),e.handler())}else i()?navigator.app.exitApp():window.history.back()};t?document.addEventListener(`deviceready`,()=>{document.addEventListener(`backbutton`,a,!1)}):window.Capacitor.Plugins.App.addListener(`backButton`,a)}},ae={isoName:`en-US`,nativeName:`English (US)`,label:{clear:`Clear`,ok:`OK`,cancel:`Cancel`,close:`Close`,set:`Set`,select:`Select`,reset:`Reset`,remove:`Remove`,update:`Update`,create:`Create`,search:`Search`,filter:`Filter`,refresh:`Refresh`,expand:e=>e?`Expand "${e}"`:`Expand`,collapse:e=>e?`Collapse "${e}"`:`Collapse`},date:{days:`Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday`.split(`_`),daysShort:`Sun_Mon_Tue_Wed_Thu_Fri_Sat`.split(`_`),months:`January_February_March_April_May_June_July_August_September_October_November_December`.split(`_`),monthsShort:`Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec`.split(`_`),firstDayOfWeek:0,format24h:!1,pluralDay:`days`,prevMonth:`Previous month`,nextMonth:`Next month`,prevYear:`Previous year`,nextYear:`Next year`,today:`Today`,prevRangeYears:e=>`Previous ${e} years`,nextRangeYears:e=>`Next ${e} years`},table:{noData:`No data available`,noResults:`No matching records found`,loading:`Loading...`,selectedRecords:e=>e===1?`1 record selected.`:(e===0?`No`:e)+` records selected.`,recordsPerPage:`Records per page:`,allRows:`All`,pagination:(e,t,n)=>e+`–`+t+` of `+n,columns:`Columns`},pagination:{first:`First page`,prev:`Previous page`,next:`Next page`,last:`Last page`},editor:{url:`URL`,bold:`Bold`,italic:`Italic`,strikethrough:`Strikethrough`,underline:`Underline`,unorderedList:`Unordered List`,orderedList:`Ordered List`,subscript:`Subscript`,superscript:`Superscript`,hyperlink:`Hyperlink`,toggleFullscreen:`Toggle Fullscreen`,quote:`Quote`,left:`Left align`,center:`Center align`,right:`Right align`,justify:`Justify align`,print:`Print`,outdent:`Decrease indentation`,indent:`Increase indentation`,removeFormat:`Remove formatting`,formatting:`Formatting`,fontSize:`Font Size`,align:`Align`,hr:`Insert Horizontal Rule`,undo:`Undo`,redo:`Redo`,heading1:`Heading 1`,heading2:`Heading 2`,heading3:`Heading 3`,heading4:`Heading 4`,heading5:`Heading 5`,heading6:`Heading 6`,paragraph:`Paragraph`,code:`Code`,size1:`Very small`,size2:`A bit small`,size3:`Normal`,size4:`Medium-large`,size5:`Big`,size6:`Very big`,size7:`Maximum`,defaultFont:`Default Font`,viewSource:`View Source`},tree:{noNodes:`No nodes available`,noResults:`No matching nodes found`}};function oe(){let e=Array.isArray(navigator.languages)&&navigator.languages.length!==0?navigator.languages[0]:navigator.language;if(typeof e==`string`)return e.split(/[-_]/).map((e,t)=>t===0?e.toLowerCase():t>1||e.length<4?e.toUpperCase():e[0].toUpperCase()+e.slice(1).toLowerCase()).join(`-`)}let se=_({__qLang:{}},{getLocale:oe,set(e=ae,t){let n={...e,rtl:e.rtl===!0,getLocale:oe};if(n.set=se.set,se.__langConfig===void 0||!se.__langConfig.noHtmlAttrs){let e=document.documentElement;e.setAttribute(`dir`,n.rtl?`rtl`:`ltr`),e.setAttribute(`lang`,n.isoName)}Object.assign(se.__qLang,n)},install({$q:e,lang:t,ssrContext:n}){e.lang=se.__qLang,se.__langConfig=e.config.lang,this.__installed?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qLang,{get:Reflect.get,ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`&&e!==`getLocale`)}}),this.set(t||ae))}});var ce={name:`material-icons`,type:{positive:`check_circle`,negative:`warning`,info:`info`,warning:`priority_high`},arrow:{up:`arrow_upward`,right:`arrow_forward`,down:`arrow_downward`,left:`arrow_back`,dropdown:`arrow_drop_down`},chevron:{left:`chevron_left`,right:`chevron_right`},colorPicker:{spectrum:`gradient`,tune:`tune`,palette:`style`},pullToRefresh:{icon:`refresh`},carousel:{left:`chevron_left`,right:`chevron_right`,up:`keyboard_arrow_up`,down:`keyboard_arrow_down`,navigationIcon:`lens`},chip:{remove:`cancel`,selected:`check`},datetime:{arrowLeft:`chevron_left`,arrowRight:`chevron_right`,now:`access_time`,today:`today`},editor:{bold:`format_bold`,italic:`format_italic`,strikethrough:`strikethrough_s`,underline:`format_underlined`,unorderedList:`format_list_bulleted`,orderedList:`format_list_numbered`,subscript:`vertical_align_bottom`,superscript:`vertical_align_top`,hyperlink:`link`,toggleFullscreen:`fullscreen`,quote:`format_quote`,left:`format_align_left`,center:`format_align_center`,right:`format_align_right`,justify:`format_align_justify`,print:`print`,outdent:`format_indent_decrease`,indent:`format_indent_increase`,removeFormat:`format_clear`,formatting:`text_format`,fontSize:`format_size`,align:`format_align_left`,hr:`remove`,undo:`undo`,redo:`redo`,heading:`format_size`,code:`code`,size:`format_size`,font:`font_download`,viewSource:`code`},expansionItem:{icon:`keyboard_arrow_down`,denseIcon:`arrow_drop_down`},fab:{icon:`add`,activeIcon:`close`},field:{clear:`cancel`,error:`error`},pagination:{first:`first_page`,prev:`keyboard_arrow_left`,next:`keyboard_arrow_right`,last:`last_page`},rating:{icon:`grade`},stepper:{done:`check`,active:`edit`,error:`warning`},tabs:{left:`chevron_left`,right:`chevron_right`,up:`keyboard_arrow_up`,down:`keyboard_arrow_down`},table:{arrowUp:`arrow_upward`,warning:`warning`,firstPage:`first_page`,prevPage:`chevron_left`,nextPage:`chevron_right`,lastPage:`last_page`},tree:{icon:`play_arrow`},uploader:{done:`done`,clear:`clear`,add:`add_box`,upload:`cloud_upload`,removeQueue:`clear_all`,removeUploaded:`done_all`}};let le=_({iconMapFn:null,__qIconSet:{}},{set(e,t){let n={...e};n.set=le.set,Object.assign(le.__qIconSet,n)},install({$q:e,iconSet:t,ssrContext:n}){e.config.iconMapFn!==void 0&&(this.iconMapFn=e.config.iconMapFn),e.iconSet=this.__qIconSet,r(e,`iconMapFn`,()=>this.iconMapFn,e=>{this.iconMapFn=e}),this.__installed?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qIconSet,{get:Reflect.get,ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`)}}),this.set(t||ce))}}),ue=`_q_t_`,de=`_q_s_`,fe=`_q_l_`,pe=`_q_f_`,me=`_q_fo_`,he=`_q_tabs_`,ge=`_q_u_`;function J(){}function _e(e,t){if(e===t)return!0;if(e!==null&&t!==null&&typeof e==`object`&&typeof t==`object`){if(e.constructor!==t.constructor)return!1;let n,r;if(e.constructor===Array){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!_e(e[r],t[r]))return!1;return!0}if(e.constructor===Map){if(e.size!==t.size)return!1;let n=e.entries();for(r=n.next();!r.done;){if(!t.has(r.value[0]))return!1;r=n.next()}for(n=e.entries(),r=n.next();!r.done;){if(!_e(r.value[1],t.get(r.value[0])))return!1;r=n.next()}return!0}if(e.constructor===Set){if(e.size!==t.size)return!1;let n=e.entries();for(r=n.next();!r.done;){if(!t.has(r.value[0]))return!1;r=n.next()}return!0}if(e.buffer!=null&&e.buffer.constructor===ArrayBuffer){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();let i=Object.keys(e).filter(t=>e[t]!==void 0);if(n=i.length,n!==Object.keys(t).filter(e=>t[e]!==void 0).length)return!1;for(r=n;r--!==0;){let n=i[r];if(!_e(e[n],t[n]))return!1}return!0}return e!==e&&t!==t}function ve(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ye(e){return Object.prototype.toString.call(e)===`[object Date]`}function be(e){return Object.prototype.toString.call(e)===`[object RegExp]`}function xe(e){return typeof e==`number`&&Number.isFinite(e)}var Se={deepEqual:_e,object:ve,date:ye,regexp:be,number:xe};let Ce={},we=!1;function Te(){we=!0}let Ee=[m,W,L,I,ie,se,le];function De(t,n){let r=(0,e.createApp)(t);r.config.globalProperties=n.config.globalProperties;let{reload:i,...a}=n._context;return Object.assign(r._context,a),r}function Oe(e,t){t.forEach(t=>{t.install(e),t.__installed=!0})}function ke(e,t,n){e.config.globalProperties.$q=n.$q,e.provide(`_q_`,n.$q),Oe(n,Ee),t.components!==void 0&&Object.values(t.components).forEach(t=>{ve(t)&&t.name!==void 0&&e.component(t.name,t)}),t.directives!==void 0&&Object.values(t.directives).forEach(t=>{ve(t)&&t.name!==void 0&&e.directive(t.name,t)}),t.plugins!==void 0&&Oe(n,Object.values(t.plugins).filter(e=>typeof e.install==`function`&&!Ee.includes(e))),a.value&&(n.$q.onSSRHydrated=()=>{n.onSSRHydrated.forEach(e=>{e()}),n.$q.onSSRHydrated=()=>{}})}var Ae=function(e,t={}){let n={version:`2.22.0`};we?n.config=t.config||{}:(t.config!==void 0&&Object.assign(Ce,t.config),n.config={...Ce},Te()),ke(e,t,{parentApp:e,$q:n,lang:t.lang,iconSet:t.iconSet,onSSRHydrated:[]})};let je=[`B`,`KB`,`MB`,`GB`,`TB`,`PB`];function Me(e,t=1){let n=0;for(;Number.parseInt(e,10)>=1024&&n1)&&(Le.prototype.open=function(e,t,...n){let r=[];this.addEventListener(`loadstart`,()=>{Be.forEach(e=>{(e.hijackFilter.value===null||e.hijackFilter.value(t))&&(e.start(),r.push(e.stop))})},{once:!0}),this.addEventListener(`loadend`,()=>{r.forEach(e=>{e()})},{once:!0}),Re.call(this,e,t,...n)})}function Ge(e){Be=Be.filter(t=>t.start!==e),Ve=Math.max(0,Ve-1),Ve===0&&(Le.prototype.open=Re)}var Ke=h({name:`QAjaxBar`,props:{position:{type:String,default:`top`,validator:e=>ze.includes(e)},size:{type:String,default:`2px`},color:String,skipHijack:Boolean,reverse:Boolean,hijackFilter:Function},emits:[`start`,`stop`],setup(t,{emit:n}){let{proxy:r}=(0,e.getCurrentInstance)(),i=(0,e.ref)(0),a=(0,e.ref)(!1),o=(0,e.ref)(!0),s=0,c=null,l,u=(0,e.computed)(()=>`q-loading-bar q-loading-bar--${t.position}`+(t.color===void 0?``:` bg-${t.color}`)+(o.value?``:` no-transition`)),d=(0,e.computed)(()=>t.position===`top`||t.position===`bottom`),f=(0,e.computed)(()=>d.value?`height`:`width`),p=(0,e.computed)(()=>{let e=a.value,n=He({p:i.value,pos:t.position,active:e,horiz:d.value,reverse:r.$q.lang.rtl&&[`top`,`bottom`].includes(t.position)?!t.reverse:t.reverse,dir:r.$q.lang.rtl?-1:1});return n[f.value]=t.size,n.opacity=+!!e,n}),m=(0,e.computed)(()=>a.value?{role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":i.value}:{"aria-hidden":`true`});function h(e=300){let t=l;return l=Math.max(0,e)||0,s++,s>1?(t===0&&e>0?v():c!==null&&t>0&&e<=0&&(clearTimeout(c),c=null),s):(c!==null&&clearTimeout(c),n(`start`),i.value=0,c=setTimeout(()=>{c=null,o.value=!0,e>0&&v()},a._value===!0?500:1),a._value!==!0&&(a.value=!0,o.value=!1),s)}function g(e){return s>0&&(i.value=Ue(i.value,e)),s}function _(){if(s=Math.max(0,s-1),s>0)return s;c!==null&&(clearTimeout(c),c=null),n(`stop`);let e=()=>{o.value=!0,i.value=100,c=setTimeout(()=>{c=null,a.value=!1},1e3)};return i.value===0?c=setTimeout(e,1):e(),s}function v(){i.value<100&&(c=setTimeout(()=>{c=null,g(),v()},l))}let y=!1;return(0,e.onMounted)(()=>{t.skipHijack||(y=!0,We({start:h,stop:_,hijackFilter:(0,e.computed)(()=>t.hijackFilter||null)}))}),(0,e.onBeforeUnmount)(()=>{c!==null&&clearTimeout(c),y&&Ge(h)}),Object.assign(r,{start:h,stop:_,increment:g}),()=>(0,e.h)(`div`,{class:u.value,style:p.value,...m.value})}});let qe={xs:18,sm:24,md:32,lg:38,xl:46},Je={size:String};function Ye(t,n=qe){return(0,e.computed)(()=>t.size===void 0?null:{fontSize:t.size in n?`${n[t.size]}px`:t.size})}function X(e,t){return e===void 0?t:e()||t}function Xe(e,t){if(e!==void 0){let t=e();if(t!=null)return[...t]}return t}function Ze(e,t){return e===void 0?t:t.concat(e())}function Qe(e,t){return e===void 0?t:t===void 0?e():t.concat(e())}function $e(t,n,r,i,a,o){n.key=i+a;let s=(0,e.h)(t,n,r);return a?(0,e.withDirectives)(s,o()):s}let et=`0 0 24 24`,tt=e=>e,nt=e=>`ionicons ${e}`,rt={"mdi-":e=>`mdi ${e}`,"icon-":tt,"bt-":e=>`bt ${e}`,"eva-":e=>`eva ${e}`,"ion-md":nt,"ion-ios":nt,"ion-logo":nt,"iconfont ":tt,"ti-":e=>`themify-icon ${e}`,"bi-":e=>`bootstrap-icons ${e}`,"i-":tt},it={o_:`-outlined`,r_:`-round`,s_:`-sharp`},at={sym_o_:`-outlined`,sym_r_:`-rounded`,sym_s_:`-sharp`},ot=RegExp(`^(`+Object.keys(rt).join(`|`)+`)`),st=RegExp(`^(`+Object.keys(it).join(`|`)+`)`),ct=RegExp(`^(`+Object.keys(at).join(`|`)+`)`),lt=/^[Mm]\s?[-+]?\.?\d/,ut=/^img:/,dt=/^svguse:/,ft=/^ion-/,pt=/^(fa-(classic|sharp|solid|regular|light|brands|duotone|thin)|[lf]a[srlbdk]?) /;var Z=h({name:`QIcon`,props:{...Je,tag:{type:String,default:`i`},name:String,color:String,left:Boolean,right:Boolean},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=Ye(t),a=(0,e.computed)(()=>`q-icon`+(t.left?` on-left`:``)+(t.right?` on-right`:``)+(t.color===void 0?``:` text-${t.color}`)),o=(0,e.computed)(()=>{let n,i=t.name;if(i===`none`||!i)return{none:!0};if(r.iconMapFn!==null){let e=r.iconMapFn(i);if(e!==void 0)if(e.icon!==void 0){if(i=e.icon,i===`none`||!i)return{none:!0}}else return{cls:e.cls,content:e.content===void 0?` `:e.content}}if(lt.test(i)){let[t,n=et]=i.split(`|`);return{svg:!0,viewBox:n,nodes:t.split(`&&`).map(t=>{let[n,r,i]=t.split(`@@`);return(0,e.h)(`path`,{style:r,d:n,transform:i})})}}if(ut.test(i))return{img:!0,src:i.slice(4)};if(dt.test(i)){let[e,t=et]=i.split(`|`);return{svguse:!0,src:e.slice(7),viewBox:t}}let a=` `,o=i.match(ot);if(o!==null)n=rt[o[1]](i);else if(pt.test(i))n=i;else if(ft.test(i))n=`ionicons ion-${r.platform.is.ios?`ios`:`md`}${i.slice(3)}`;else if(ct.test(i)){n=`notranslate material-symbols`;let e=i.match(ct);e!==null&&(i=i.slice(6),n+=at[e[1]]),a=i}else{n=`notranslate material-icons`;let e=i.match(st);e!==null&&(i=i.slice(2),n+=it[e[1]]),a=i}return{cls:n,content:a}});return()=>{let r={class:a.value,style:i.value,"aria-hidden":`true`};return o.value.none?(0,e.h)(t.tag,r,X(n.default)):o.value.img?(0,e.h)(t.tag,r,Ze(n.default,[(0,e.h)(`img`,{src:o.value.src})])):o.value.svg?(0,e.h)(t.tag,r,Ze(n.default,[(0,e.h)(`svg`,{viewBox:o.value.viewBox||`0 0 24 24`},o.value.nodes)])):o.value.svguse?(0,e.h)(t.tag,r,Ze(n.default,[(0,e.h)(`svg`,{viewBox:o.value.viewBox},[(0,e.h)(`use`,{"xlink:href":o.value.src})])])):(o.value.cls!==void 0&&(r.class+=` `+o.value.cls),(0,e.h)(t.tag,r,Ze(n.default,[o.value.content])))}}}),mt=h({name:`QAvatar`,props:{...Je,fontSize:String,color:String,textColor:String,icon:String,square:Boolean,rounded:Boolean},setup(t,{slots:n}){let r=Ye(t),i=(0,e.computed)(()=>`q-avatar`+(t.color?` bg-${t.color}`:``)+(t.textColor?` text-${t.textColor} q-chip--colored`:``)+(t.square?` q-avatar--square`:t.rounded?` rounded-borders`:``)),a=(0,e.computed)(()=>t.fontSize?{fontSize:t.fontSize}:null);return()=>{let o=t.icon===void 0?void 0:[(0,e.h)(Z,{name:t.icon})];return(0,e.h)(`div`,{class:i.value,style:r.value},[(0,e.h)(`div`,{class:`q-avatar__content row flex-center overflow-hidden`,style:a.value},Qe(n.default,o))])}}});let ht=[`top`,`middle`,`bottom`];var gt=h({name:`QBadge`,props:{color:String,textColor:String,floating:Boolean,transparent:Boolean,multiLine:Boolean,outline:Boolean,rounded:Boolean,label:[Number,String],align:{type:String,validator:e=>ht.includes(e)}},setup(t,{slots:n}){let r=(0,e.computed)(()=>t.align===void 0?null:{verticalAlign:t.align}),i=(0,e.computed)(()=>{let e=t.outline&&t.color||t.textColor;return`q-badge flex inline items-center no-wrap q-badge--${t.multiLine?`multi`:`single`}-line`+(t.outline?` q-badge--outline`:t.color===void 0?``:` bg-${t.color}`)+(e===void 0?``:` text-${e}`)+(t.floating?` q-badge--floating`:``)+(t.rounded?` q-badge--rounded`:``)+(t.transparent?` q-badge--transparent`:``)});return()=>(0,e.h)(`div`,{class:i.value,style:r.value,role:`status`,"aria-label":t.label},Ze(n.default,t.label===void 0?[]:[t.label]))}});let Q={dark:{type:Boolean,default:null}};function $(t,n){return(0,e.computed)(()=>t.dark===null?n.dark.isActive:t.dark)}var _t=h({name:`QBanner`,props:{...Q,inlineActions:Boolean,dense:Boolean,rounded:Boolean},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=$(t,r),a=(0,e.computed)(()=>`q-banner row items-center`+(t.dense?` q-banner--dense`:``)+(i.value?` q-banner--dark q-dark`:``)+(t.rounded?` rounded-borders`:``)),o=(0,e.computed)(()=>`q-banner__actions row items-center justify-end col-${t.inlineActions?`auto`:`all`}`);return()=>{let r=[(0,e.h)(`div`,{class:`q-banner__avatar col-auto row items-center self-start`},X(n.avatar)),(0,e.h)(`div`,{class:`q-banner__content col text-body2`},X(n.default))],i=X(n.action);return i!==void 0&&r.push((0,e.h)(`div`,{class:o.value},i)),(0,e.h)(`div`,{class:a.value+(!t.inlineActions&&i!==void 0?` q-banner--top-padding`:``),role:`alert`},r)}}}),vt=h({name:`QBar`,props:{...Q,dense:Boolean},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=$(t,r),a=(0,e.computed)(()=>`q-bar row no-wrap items-center q-bar--${t.dense?`dense`:`standard`} q-bar--${i.value?`dark`:`light`}`);return()=>(0,e.h)(`div`,{class:a.value,role:`toolbar`},X(n.default))}});let yt={left:`start`,center:`center`,right:`end`,between:`between`,around:`around`,evenly:`evenly`,stretch:`stretch`},bt=Object.keys(yt),xt={align:{type:String,validator:e=>bt.includes(e)}};function St(t){return(0,e.computed)(()=>{let e=t.align===void 0?t.vertical?`stretch`:`left`:t.align;return`${t.vertical?`items`:`justify`}-${yt[e]}`})}function Ct(e){if(Object(e.$parent)===e.$parent)return e.$parent;let{parent:t}=e.$;for(;Object(t)===t;){if(Object(t.proxy)===t.proxy)return t.proxy;t=t.parent}}function wt(e,t){typeof t.type==`symbol`?Array.isArray(t.children)&&t.children.forEach(t=>{wt(e,t)}):e.add(t)}function Tt(e){let t=new Set;return e.forEach(e=>{wt(t,e)}),[...t]}function Et(e){return e.appContext.config.globalProperties.$router!==void 0}function Dt(e){return e.isUnmounted===!0||e.isDeactivated===!0}let Ot=[``,!0];var kt=h({name:`QBreadcrumbs`,props:{...xt,separator:{type:String,default:`/`},separatorColor:String,activeColor:{type:String,default:`primary`},gutter:{type:String,validator:e=>[`none`,`xs`,`sm`,`md`,`lg`,`xl`].includes(e),default:`sm`}},setup(t,{slots:n}){let r=St(t),i=(0,e.computed)(()=>`flex items-center ${r.value}${t.gutter===`none`?``:` q-gutter-${t.gutter}`}`),a=(0,e.computed)(()=>t.separatorColor?` text-${t.separatorColor}`:``),o=(0,e.computed)(()=>` text-${t.activeColor}`);return()=>{if(n.default===void 0)return;let r=Tt(X(n.default));if(r.length===0)return;let s=1,c=[],l=r.filter(e=>e.type?.name===`QBreadcrumbsEl`).length,u=n.separator===void 0?()=>t.separator:n.separator;return r.forEach(t=>{if(t.type?.name===`QBreadcrumbsEl`){let n=se!==i[t]))return!1}return!0}function Nt(e,t){return Array.isArray(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e.length===1&&e[0]===t}function Pt(e,t){return Array.isArray(e)?Nt(e,t):Array.isArray(t)?Nt(t,e):e===t}function Ft(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(!Pt(e[n],t[n]))return!1;return!0}let It={to:[String,Object],replace:Boolean,href:String,target:String,disable:Boolean},Lt={...It,exact:Boolean,activeClass:{type:String,default:`q-router-link--active`},exactActiveClass:{type:String,default:`q-router-link--exact-active`}};function Rt({fallbackTag:t,useDisableForRouterLinkProps:n=!0}={}){let r=(0,e.getCurrentInstance)(),{props:i,proxy:a,emit:o}=r,s=Et(r),c=(0,e.computed)(()=>!i.disable&&i.href!==void 0),l=n?(0,e.computed)(()=>s&&!i.disable&&!c.value&&i.to!==void 0&&i.to!==null&&i.to!==``):(0,e.computed)(()=>s&&!c.value&&i.to!==void 0&&i.to!==null&&i.to!==``),u=(0,e.computed)(()=>l.value?y(i.to):null),d=(0,e.computed)(()=>u.value!==null),f=(0,e.computed)(()=>c.value||d.value),p=(0,e.computed)(()=>i.type===`a`||f.value?`a`:i.tag||t||`div`),m=(0,e.computed)(()=>c.value?{href:i.href,target:i.target}:d.value?{href:u.value.href,target:i.target}:{}),h=(0,e.computed)(()=>{if(!d.value)return-1;let{matched:e}=u.value,{length:t}=e,n=e[t-1];if(n===void 0)return-1;let r=a.$route.matched;if(r.length===0)return-1;let i=r.findIndex(jt.bind(null,n));if(i!==-1)return i;let o=At(e[t-2]);return t>1&&At(n)===o&&r.at(-1).path!==o?r.findIndex(jt.bind(null,e[t-2])):i}),g=(0,e.computed)(()=>d.value&&h.value!==-1&&Mt(a.$route.params,u.value.params)),_=(0,e.computed)(()=>g.value&&h.value===a.$route.matched.length-1&&Ft(a.$route.params,u.value.params)),v=(0,e.computed)(()=>d.value?_.value?` ${i.exactActiveClass} ${i.activeClass}`:i.exact?``:g.value?` ${i.activeClass}`:``:``);function y(e){try{return a.$router.resolve(e)}catch{}return null}function b(e,{returnRouterError:t,to:n=i.to,replace:r=i.replace}={}){if(i.disable)return e.preventDefault(),Promise.resolve(!1);if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||e.button!==void 0&&e.button!==0||i.target===`_blank`)return Promise.resolve(!1);e.preventDefault();let o=a.$router[r?`replace`:`push`](n);return t?o:o.then(()=>{}).catch(()=>{})}function x(e){if(d.value){let t=t=>b(e,t);o(`click`,e,t),e.defaultPrevented||t()}else o(`click`,e)}return{hasRouterLink:d,hasHrefLink:c,hasLink:f,linkTag:p,resolvedLink:u,linkIsActive:g,linkIsExactActive:_,linkClass:v,linkAttrs:m,getLink:y,navigateToRouterLink:b,navigateOnClick:x}}var zt=h({name:`QBreadcrumbsEl`,props:{...Lt,label:String,icon:String,tag:{type:String,default:`span`}},emits:[`click`],setup(t,{slots:n}){let{linkTag:r,linkAttrs:i,linkClass:a,navigateOnClick:o}=Rt(),s=(0,e.computed)(()=>({class:`q-breadcrumbs__el q-link flex inline items-center relative-position `+(t.disable?`q-breadcrumbs__el--disable`:`q-link--focusable`+a.value),...i.value,onClick:o})),c=(0,e.computed)(()=>`q-breadcrumbs__el-icon`+(t.label===void 0?``:` q-breadcrumbs__el-icon--with-label`));return()=>{let i=[];return t.icon!==void 0&&i.push((0,e.h)(Z,{class:c.value,name:t.icon})),t.label!==void 0&&i.push(t.label),(0,e.h)(r.value,{...s.value},Ze(n.default,i))}}});let Bt={size:{type:[String,Number],default:`1em`},color:String};function Vt(t){return{cSize:(0,e.computed)(()=>t.size in qe?`${qe[t.size]}px`:t.size),classes:(0,e.computed)(()=>`q-spinner`+(t.color?` text-${t.color}`:``))}}var Ht=h({name:`QSpinner`,props:{...Bt,thickness:{type:Number,default:5}},setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value+` q-spinner-mat`,width:n.value,height:n.value,viewBox:`25 25 50 50`},[(0,e.h)(`circle`,{class:`path`,cx:`50`,cy:`50`,r:`20`,fill:`none`,stroke:`currentColor`,"stroke-width":t.thickness,"stroke-miterlimit":`10`})])}});function Ut(e){if(e===window)return{top:0,left:0};let{top:t,left:n}=e.getBoundingClientRect();return{top:t,left:n}}function Wt(e,t){return window.getComputedStyle(e).getPropertyValue(t)}function Gt(e){return e===window?window.innerHeight:e.getBoundingClientRect().height}function Kt(e){return e===window?window.innerWidth:e.getBoundingClientRect().width}function qt(e,t){let n=e.style;for(let e in t)n[e]=t[e]}function Jt(e,t){e.forEach(e=>qt(e,t))}function Yt(e){if(typeof e==`function`){if(document.readyState!==`loading`)return e();document.addEventListener(`DOMContentLoaded`,e,!1)}}function Xt(t){if(t==null)return;if(typeof t==`string`)try{return document.querySelector(t)||void 0}catch{return}let n=(0,e.unref)(t);if(n)return n.$el||n}function Zt(e,t){if(e==null||e.contains(t))return!0;for(let n=e.nextElementSibling;n!==null;n=n.nextElementSibling)if(n.contains(t))return!0;return!1}var Qt={offset:Ut,style:Wt,height:Gt,width:Kt,css:qt,cssBatch:Jt,ready:Yt};function $t(e,t=250){let n=!1,r;return function(...i){return n||(n=!0,setTimeout(()=>{n=!1},t),r=e.apply(this,i)),r}}function en(e,t,n,r){n.modifiers.stop&&E(e);let i=n.modifiers.color,a=n.modifiers.center||r===!0,o=document.createElement(`span`),s=document.createElement(`span`),c=C(e),{left:l,top:u,width:d,height:f}=t.getBoundingClientRect(),p=Math.hypot(d,f),m=p/2,h=`${(d-p)/2}px`,g=a?h:`${c.left-l-m}px`,_=`${(f-p)/2}px`,v=a?_:`${c.top-u-m}px`;s.className=`q-ripple__inner`,qt(s,{height:`${p}px`,width:`${p}px`,transform:`translate3d(${g},${v},0) scale3d(.2,.2,1)`,opacity:0}),o.className=`q-ripple${i?` text-`+i:``}`,o.setAttribute(`dir`,`ltr`),o.append(s),t.append(o);let y=()=>{o.remove(),clearTimeout(b)};n.abort.push(y);let b=setTimeout(()=>{s.classList.add(`q-ripple__inner--enter`),s.style.transform=`translate3d(${h},${_},0) scale3d(1,1,1)`,s.style.opacity=.2,b=setTimeout(()=>{s.classList.remove(`q-ripple__inner--enter`),s.classList.add(`q-ripple__inner--leave`),s.style.opacity=0,b=setTimeout(()=>{o.remove(),n.abort.splice(n.abort.indexOf(y),1)},275)},250)},50)}function tn(e,{modifiers:t,value:n,arg:r}){let i={...e.cfg.ripple,...t,...n};e.modifiers={early:i.early===!0,stop:i.stop===!0,center:i.center===!0,color:i.color||r,keyCodes:[i.keyCodes||13].flat()}}var nn=g({name:`ripple`,beforeMount(e,t){let n=t.instance.$.appContext.config.globalProperties.$q.config||{};if(n.ripple===!1)return;let r={cfg:n,enabled:t.value!==!1,modifiers:{},abort:[],start(t){r.enabled&&!t.qSkipRipple&&t.type===(r.modifiers.early?`pointerdown`:`click`)&&en(t,e,r,t.qKeyEvent===!0)},keystart:$t(t=>{r.enabled&&!t.qSkipRipple&&B(t,r.modifiers.keyCodes)&&t.type===`key${r.modifiers.early?`down`:`up`}`&&en(t,e,r,!0)},300)};tn(r,t),e.__qripple=r,A(r,`main`,[[e,`pointerdown`,`start`,`passive`],[e,`click`,`start`,`passive`],[e,`keydown`,`keystart`,`passive`],[e,`keyup`,`keystart`,`passive`]])},updated(e,t){if(t.oldValue!==t.value){let n=e.__qripple;n!==void 0&&(n.enabled=t.value!==!1,n.enabled&&Object(t.value)===t.value&&tn(n,t))}},beforeUnmount(e){let t=e.__qripple;t!==void 0&&(t.abort.forEach(e=>{e()}),j(t,`main`),delete e.__qripple)}});let rn={none:0,xs:4,sm:8,md:16,lg:24,xl:32},an={xs:8,sm:10,md:14,lg:20,xl:24},on=[`button`,`submit`,`reset`],sn=/[^\s]\/[^\s]/,cn=[`flat`,`outline`,`push`,`unelevated`];function ln(e,t){return e.flat?`flat`:e.outline?`outline`:e.push?`push`:e.unelevated?`unelevated`:t}function un(e){let t=ln(e);return t===void 0?{}:{[t]:!0}}let dn={...Je,...It,type:{type:String,default:`button`},label:[Number,String],icon:String,iconRight:String,...cn.reduce((e,t)=>(e[t]=Boolean)&&e,{}),square:Boolean,rounded:Boolean,glossy:Boolean,size:String,fab:Boolean,fabMini:Boolean,padding:String,color:String,textColor:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,tabindex:[Number,String],ripple:{type:[Boolean,Object],default:!0},align:{...xt.align,default:`center`},stack:Boolean,stretch:Boolean,loading:{type:Boolean,default:null},disable:Boolean},fn={...dn,round:Boolean};function pn(t){let n=Ye(t,an),r=St(t),{hasRouterLink:i,hasLink:a,linkTag:o,linkAttrs:s,navigateOnClick:c}=Rt({fallbackTag:`button`}),l=(0,e.computed)(()=>{let e=t.fab||t.fabMini?{}:n.value;return t.padding===void 0?e:{...e,padding:t.padding.split(/\s+/).map(e=>e in rn?rn[e]+`px`:e).join(` `),minWidth:`0`,minHeight:`0`}}),u=(0,e.computed)(()=>t.rounded||t.fab||t.fabMini),d=(0,e.computed)(()=>!t.disable&&!t.loading),f=(0,e.computed)(()=>d.value?t.tabindex||0:-1),p=(0,e.computed)(()=>ln(t,`standard`)),m=(0,e.computed)(()=>{let e={tabindex:f.value};return a.value?Object.assign(e,s.value):on.includes(t.type)&&(e.type=t.type),o.value===`a`?(t.disable?e[`aria-disabled`]=`true`:e.href===void 0&&(e.role=`button`),!i.value&&sn.test(t.type)&&(e.type=t.type)):t.disable&&(e.disabled=``,e[`aria-disabled`]=`true`),t.loading&&t.percentage!==void 0&&Object.assign(e,{role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":t.percentage}),e});return{classes:(0,e.computed)(()=>{let e;t.color===void 0?t.textColor&&(e=`text-${t.textColor}`):e=t.flat||t.outline?`text-${t.textColor||t.color}`:`bg-${t.color} text-${t.textColor||`white`}`;let n=t.round?`round`:`rectangle${u.value?` q-btn--rounded`:t.square?` q-btn--square`:``}`;return`q-btn--${p.value} q-btn--${n}`+(e===void 0?``:` `+e)+(d.value?` q-btn--actionable q-focusable q-hoverable`:t.disable?` disabled`:``)+(t.fab?` q-btn--fab`:t.fabMini?` q-btn--fab-mini`:``)+(t.noCaps?` q-btn--no-uppercase`:``)+(t.dense?` q-btn--dense`:``)+(t.stretch?` no-border-radius self-stretch`:``)+(t.glossy?` glossy`:``)+(t.square?` q-btn--square`:``)}),style:l,innerClasses:(0,e.computed)(()=>r.value+(t.stack?` column`:` row`)+(t.noWrap?` no-wrap text-no-wrap`:``)+(t.loading?` q-btn__content--hidden`:``)),attributes:m,hasLink:a,linkTag:o,navigateOnClick:c,isActionable:d}}let{passiveCapture:mn}=v,hn=null,gn=null,_n=null;function vn(e){O(e),e.qSkipRipple=!0}var yn=h({name:`QBtn`,props:{...fn,percentage:Number,darkPercentage:Boolean,onTouchstart:[Function,Array]},emits:[`click`,`keydown`,`mousedown`,`keyup`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{classes:a,style:o,innerClasses:s,attributes:c,hasLink:l,linkTag:u,navigateOnClick:d,isActionable:f}=pn(t),p=(0,e.ref)(null),m=(0,e.ref)(null),h=null,g,_=null,v=(0,e.computed)(()=>t.label!==void 0&&t.label!==null&&t.label!==``),y=(0,e.computed)(()=>t.disable||t.ripple===!1?!1:{keyCodes:l.value?[13,32]:[13],...t.ripple===!0?{}:t.ripple}),b=(0,e.computed)(()=>({center:t.round})),x=(0,e.computed)(()=>{let e=Math.max(0,Math.min(100,t.percentage));return e>0?{transition:`transform 0.6s`,transform:`translateX(${e-100}%)`}:{}}),S=(0,e.computed)(()=>{if(t.loading)return{onMousedown:vn,onTouchstart:vn,onClick:vn,onKeydown:vn,onKeyup:vn};if(f.value){let e={onClick:w,onKeydown:T,onMousedown:A};if(i.$q.platform.has.touch){let n=t.onTouchstart===void 0?`Passive`:``;e[`onTouchstart${n}`]=k}return e}return{onClick:O}}),C=(0,e.computed)(()=>({ref:p,class:`q-btn q-btn-item non-selectable no-outline `+a.value,style:o.value,...c.value,...S.value}));function w(e){if(p.value!==null){if(e!==void 0){if(e.defaultPrevented)return;let n=document.activeElement;if(t.type===`submit`&&n!==document.body&&!p.value.contains(n)&&!n.contains(p.value)){e.qAvoidFocus||p.value.focus();let t=()=>{document.removeEventListener(`keydown`,O,!0),document.removeEventListener(`keyup`,t,mn),p.value?.removeEventListener(`blur`,t,mn)};document.addEventListener(`keydown`,O,!0),document.addEventListener(`keyup`,t,mn),p.value.addEventListener(`blur`,t,mn)}}d(e)}}function T(e){p.value!==null&&(r(`keydown`,e),B(e,[13,32])&&gn!==p.value&&(gn!==null&&M(),e.defaultPrevented||(e.qAvoidFocus||p.value.focus(),gn=p.value,p.value.classList.add(`q-btn--active`),document.addEventListener(`keyup`,j,!0),p.value.addEventListener(`blur`,j,mn)),O(e)))}function k(e){p.value!==null&&(r(`touchstart`,e),!e.defaultPrevented&&(hn!==p.value&&(hn!==null&&M(),hn=p.value,h=e.target,h.addEventListener(`touchcancel`,j,mn),h.addEventListener(`touchend`,j,mn)),g=!0,_!==null&&clearTimeout(_),_=setTimeout(()=>{_=null,g=!1},200)))}function A(e){p.value!==null&&(e.qSkipRipple=g===!0,r(`mousedown`,e),!e.defaultPrevented&&_n!==p.value&&(_n!==null&&M(),_n=p.value,p.value.classList.add(`q-btn--active`),document.addEventListener(`mouseup`,j,mn)))}function j(e){if(p.value!==null&&(e?.type!==`blur`||document.activeElement!==p.value)){if(e?.type===`keyup`){if(gn===p.value&&B(e,[13,32])){let t=new MouseEvent(`click`,e);t.qKeyEvent=!0,e.defaultPrevented&&D(t),e.cancelBubble&&E(t),p.value.dispatchEvent(t),O(e),e.qKeyEvent=!0}r(`keyup`,e)}M()}}function M(e){let t=m.value;!e&&(hn===p.value||_n===p.value)&&t!==null&&t!==document.activeElement&&(t.setAttribute(`tabindex`,-1),t.focus()),hn===p.value&&(h!==null&&(h.removeEventListener(`touchcancel`,j,mn),h.removeEventListener(`touchend`,j,mn)),hn=h=null),_n===p.value&&(document.removeEventListener(`mouseup`,j,mn),_n=null),gn===p.value&&(document.removeEventListener(`keyup`,j,!0),p.value?.removeEventListener(`blur`,j,mn),gn=null),p.value?.classList.remove(`q-btn--active`)}return(0,e.onBeforeUnmount)(()=>{M(!0)}),Object.assign(i,{click:e=>{f.value&&w(e)}}),()=>{let r=[];t.icon!==void 0&&r.push((0,e.h)(Z,{name:t.icon,left:!t.stack&&v.value,role:`img`})),v.value&&r.push((0,e.h)(`span`,{class:`block`},[t.label])),r=Ze(n.default,r),t.iconRight!==void 0&&!t.round&&r.push((0,e.h)(Z,{name:t.iconRight,right:!t.stack&&v.value,role:`img`}));let i=[(0,e.h)(`span`,{class:`q-focus-helper`,ref:m})];return t.loading&&t.percentage!==void 0&&i.push((0,e.h)(`span`,{class:`q-btn__progress absolute-full overflow-hidden`+(t.darkPercentage?` q-btn__progress--dark`:``)},[(0,e.h)(`span`,{class:`q-btn__progress-indicator fit block`,style:x.value})])),i.push((0,e.h)(`span`,{class:`q-btn__content text-center col items-center q-anchor--skip `+s.value},r)),t.loading!==null&&i.push((0,e.h)(e.Transition,{name:`q-transition--fade`},()=>t.loading?[(0,e.h)(`span`,{key:`loading`,class:`absolute-full flex flex-center`},n.loading===void 0?[(0,e.h)(Ht)]:n.loading())]:null)),(0,e.withDirectives)((0,e.h)(u.value,C.value,i),[[nn,y.value,void 0,b.value]])}}}),bn=h({name:`QBtnGroup`,props:{unelevated:Boolean,outline:Boolean,flat:Boolean,rounded:Boolean,square:Boolean,push:Boolean,stretch:Boolean,glossy:Boolean,spread:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>{let e=[`unelevated`,`outline`,`flat`,`rounded`,`square`,`push`,`stretch`,`glossy`].filter(e=>t[e]).map(e=>`q-btn-group--${e}`).join(` `);return`q-btn-group row no-wrap${e.length===0?``:` `+e}`+(t.spread?` q-btn-group--spread`:` inline`)});return()=>(0,e.h)(`div`,{class:r.value},X(n.default))}});function xn(){if(window.getSelection!==void 0){let e=window.getSelection();e.empty===void 0?e.removeAllRanges!==void 0&&(e.removeAllRanges(),m.is.mobile||e.addRange(document.createRange())):e.empty()}else document.selection!==void 0&&document.selection.empty()}let Sn={target:{type:[Boolean,String,Element],default:!0},noParentEvent:Boolean},Cn={...Sn,contextMenu:Boolean};function wn({showing:t,avoidEmit:n,configureAnchorEl:r}){let{props:i,proxy:a,emit:o}=(0,e.getCurrentInstance)(),s=(0,e.ref)(null),c=null;function l(e){return s.value===null?!1:e===void 0||e.touches===void 0||e.touches.length<=1}let u={};r===void 0&&(Object.assign(u,{hide(e){a.hide(e)},toggle(e){a.toggle(e),e.qAnchorHandled=!0},toggleKey(e){B(e,13)&&u.toggle(e)},contextClick(t){a.hide(t),D(t),(0,e.nextTick)(()=>{a.show(t),t.qAnchorHandled=!0})},prevent:D,mobileTouch(e){if(u.mobileCleanup(e),!l(e))return;a.hide(e),s.value.classList.add(`non-selectable`);let t=e.target;A(u,`anchor`,[[t,`touchmove`,`mobileCleanup`,`passive`],[t,`touchend`,`mobileCleanup`,`passive`],[t,`touchcancel`,`mobileCleanup`,`passive`],[s.value,`contextmenu`,`prevent`,`notPassive`]]),c=setTimeout(()=>{c=null,a.show(e),e.qAnchorHandled=!0},300)},mobileCleanup(e){s.value.classList.remove(`non-selectable`),c!==null&&(clearTimeout(c),c=null),t.value&&e!==void 0&&xn()}}),r=function(e=i.contextMenu){if(i.noParentEvent||s.value===null)return;let t=e?a.$q.platform.is.mobile?[[s.value,`touchstart`,`mobileTouch`,`passive`]]:[[s.value,`mousedown`,`hide`,`passive`],[s.value,`contextmenu`,`contextClick`,`notPassive`]]:[[s.value,`click`,`toggle`,`passive`],[s.value,`keyup`,`toggleKey`,`passive`]];A(u,`anchor`,t)});function d(){j(u,`anchor`)}function f(e){for(s.value=e;s.value.classList.contains(`q-anchor--skip`);)s.value=s.value.parentNode;r()}function p(){if(i.target===!1||i.target===``||a.$el.parentNode===null)s.value=null;else if(i.target===!0)f(a.$el.parentNode);else{let e=i.target;if(typeof i.target==`string`)try{e=document.querySelector(i.target)}catch{e=void 0}e==null?(s.value=null,console.error(`Anchor: target "${i.target}" not found`)):(s.value=e.$el||e,r())}}return(0,e.watch)(()=>i.contextMenu,e=>{s.value!==null&&(d(),r(e))}),(0,e.watch)(()=>i.target,()=>{s.value!==null&&d(),p()}),(0,e.watch)(()=>i.noParentEvent,e=>{s.value!==null&&(e?d():r())}),(0,e.onMounted)(()=>{p(),!n&&i.modelValue&&s.value===null&&o(`update:modelValue`,!1)}),(0,e.onBeforeUnmount)(()=>{c!==null&&clearTimeout(c),d()}),{anchorEl:s,canShow:l,anchorEvents:u}}function Tn(t,n){let r=(0,e.ref)(null),i;function a(e,t){let n=`${t===void 0?`remove`:`add`}EventListener`,r=t===void 0?i:t;e!==window&&e[n](`scroll`,r,v.passive),window[n](`scroll`,r,v.passive),i=t}function o(){r.value!==null&&(a(r.value),r.value=null)}return(0,e.onBeforeUnmount)((0,e.watch)(()=>t.noParentEvent,()=>{r.value!==null&&(o(),n())})),{localScrollTarget:r,unconfigureScrollTarget:o,changeScrollEvent:a}}let En={modelValue:{type:Boolean,default:null},"onUpdate:modelValue":[Function,Array]},Dn=[`beforeShow`,`show`,`beforeHide`,`hide`];function On({showing:t,canShow:n,hideOnRouteChange:r,handleShow:i,handleHide:a,handleRouteChange:o,processOnMount:s}){let c=(0,e.getCurrentInstance)(),{props:l,emit:u,proxy:d}=c,f;function p(e){t.value?g(e):m(e)}function m(t){if(l.disable||t?.qAnchorHandled===!0||n!==void 0&&!n(t))return;let r=l[`onUpdate:modelValue`]!==void 0;r&&(u(`update:modelValue`,!0),f=t,(0,e.nextTick)(()=>{f===t&&(f=void 0)})),(l.modelValue===null||!r)&&h(t)}function h(e){t.value||(t.value=!0,u(`beforeShow`,e),i===void 0?u(`show`,e):i(e))}function g(t){if(l.disable)return;let n=l[`onUpdate:modelValue`]!==void 0;n&&(u(`update:modelValue`,!1),f=t,(0,e.nextTick)(()=>{f===t&&(f=void 0)})),(l.modelValue===null||!n)&&_(t)}function _(e){t.value&&(t.value=!1,u(`beforeHide`,e),a===void 0?u(`hide`,e):a(e))}function v(e){l.disable&&e?l[`onUpdate:modelValue`]!==void 0&&u(`update:modelValue`,!1):e===!0!==t.value&&(e?h:_)(f)}(0,e.watch)(()=>l.modelValue,v),r!==void 0&&Et(c)&&(0,e.watch)(()=>d.$route.fullPath,()=>{r.value&&t.value&&(o?.(),g())}),s&&(0,e.onMounted)(()=>{v(l.modelValue)});let y={show:m,hide:g,toggle:p};return Object.assign(d,y),y}let kn=[];function An(e){return kn.find(t=>t.contentEl!==null&&t.contentEl.contains(e))}function jn(e,t){do{if(e.$options.name===`QMenu`){if(e.hide(t),e.$props.separateClosePopup)return Ct(e)}else if(e.__qPortal){let n=Ct(e);return n?.$options.name===`QPopupProxy`?(e.hide(t),n):e}e=Ct(e)}while(e!=null)}function Mn(e,t,n){for(;n!==0&&e!=null;){if(e.__qPortal){if(n--,e.$options.name===`QMenu`){e=jn(e,t);continue}e.hide(t)}e=Ct(e)}}let Nn=[],Pn=[];function Fn(e){Pn=Pn.filter(t=>t!==e)}function In(e){Fn(e),Pn.push(e)}function Ln(e){Fn(e),Pn.length===0&&Nn.length!==0&&(Nn.at(-1)(),Nn=[])}function Rn(e){Pn.length===0?e():Nn.push(e)}function zn(e){Nn=Nn.filter(t=>t!==e)}let Bn=[],Vn=[],Hn=1,Un=document.body;function Wn(e,t){let n=document.createElement(`div`);if(n.id=t===void 0?e:`q-portal--${t}--${Hn++}`,Ce.globalNodes!==void 0){let e=Ce.globalNodes.class;e!==void 0&&(n.className=e)}return Un.append(n),Bn.push(n),Vn.push(t),n}function Gn(e){let t=Bn.indexOf(e);Bn.splice(t,1),Vn.splice(t,1),e.remove()}function Kn(e){if(e===Un)return;if(Un=e,Un===document.body||Vn.reduce((e,t)=>t===`dialog`?e+1:e,0)<2){Bn.forEach(e=>{e.contains(Un)||Un.append(e)});return}let t=Vn.lastIndexOf(`dialog`);for(let e=0;et.default()}});function Jn(e){for(e=e.parent;e!=null;){if(e.type.name===`QGlobalDialog`)return!0;if(e.type.name===`QDialog`||e.type.name===`QMenu`)return!1;e=e.parent}return!1}function Yn(t,n,i,a){let o=(0,e.ref)(!1),s=(0,e.ref)(!1),c=null,l={},u=a===`dialog`&&Jn(t);function d(e){if(e){Ln(l),s.value=!0;return}s.value=!1,o.value||(!u&&c===null&&(c=Wn(!1,a)),o.value=!0,kn.push(t.proxy),In(l))}function f(e){if(s.value=!1,!e)return;Ln(l),o.value=!1;let n=kn.indexOf(t.proxy);n!==-1&&kn.splice(n,1),c!==null&&(Gn(c),c=null)}return(0,e.onUnmounted)(()=>{f(!0)}),t.proxy.__qPortal=!0,r(t.proxy,`contentEl`,()=>n.value),{showPortal:d,hidePortal:f,portalIsActive:o,portalIsAccessible:s,renderPortal:()=>u?i():o.value?[(0,e.h)(e.Teleport,{to:c},(0,e.h)(qn,i))]:void 0}}let Xn={transitionShow:{type:String,default:`fade`},transitionHide:{type:String,default:`fade`},transitionDuration:{type:[String,Number],default:300}};function Zn(t,n=()=>{},r=()=>{}){return{transitionProps:(0,e.computed)(()=>{let e=`q-transition--${t.transitionShow||n()}`,i=`q-transition--${t.transitionHide||r()}`;return{appear:!0,enterFromClass:`${e}-enter-from`,enterActiveClass:`${e}-enter-active`,enterToClass:`${e}-enter-to`,leaveFromClass:`${i}-leave-from`,leaveActiveClass:`${i}-leave-active`,leaveToClass:`${i}-leave-to`}}),transitionStyle:(0,e.computed)(()=>`--q-transition-duration: ${t.transitionDuration}ms`)}}function Qn(){let t,n=(0,e.getCurrentInstance)();function r(){t=void 0}return(0,e.onDeactivated)(r),(0,e.onBeforeUnmount)(r),{removeTick:r,registerTick(r){t=r,(0,e.nextTick)(()=>{t===r&&(Dt(n)||t(),t=void 0)})}}}function $n(){let t=null,n=(0,e.getCurrentInstance)();function r(){t!==null&&(clearTimeout(t),t=null)}return(0,e.onDeactivated)(r),(0,e.onBeforeUnmount)(r),{removeTimeout:r,registerTimeout(e,i){r(),Dt(n)||(t=setTimeout(()=>{t=null,e()},i))}}}let er=[Element,String],tr=[null,document,document.body,document.scrollingElement,document.documentElement];function nr(e,t){let n=Xt(t);if(n===void 0){if(e==null)return window;n=e.closest(`.scroll,.scroll-y,.overflow-auto`)}return tr.includes(n)?window:n}function rr(e){return(e===window?document.body:e).scrollHeight}function ir(e){return(e===window?document.body:e).scrollWidth}function ar(e){return e===window?window.pageYOffset||window.scrollY||document.body.scrollTop||0:e.scrollTop}function or(e){return e===window?window.pageXOffset||window.scrollX||document.body.scrollLeft||0:e.scrollLeft}function sr(e,t,n=0,r){let i=r===void 0?performance.now():r,a=ar(e);if(n<=0){a!==t&&lr(e,t);return}requestAnimationFrame(r=>{let o=r-i,s=a+(t-a)/Math.max(o,n)*o;lr(e,s),s!==t&&sr(e,t,n-o,r)})}function cr(e,t,n=0,r){let i=r===void 0?performance.now():r,a=or(e);if(n<=0){a!==t&&ur(e,t);return}requestAnimationFrame(r=>{let o=r-i,s=a+(t-a)/Math.max(o,n)*o;ur(e,s),s!==t&&cr(e,t,n-o,r)})}function lr(e,t){if(e===window){window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,t);return}e.scrollTop=t}function ur(e,t){if(e===window){window.scrollTo(t,window.pageYOffset||window.scrollY||document.body.scrollTop||0);return}e.scrollLeft=t}function dr(e,t,n){if(n){sr(e,t,n);return}lr(e,t)}function fr(e,t,n){if(n){cr(e,t,n);return}ur(e,t)}let pr;function mr(){if(pr!==void 0)return pr;let e=document.createElement(`p`),t=document.createElement(`div`);qt(e,{width:`100%`,height:`200px`}),qt(t,{position:`absolute`,top:`0px`,left:`0px`,visibility:`hidden`,width:`200px`,height:`150px`,overflow:`hidden`}),t.append(e),document.body.append(t);let n=e.offsetWidth;t.style.overflow=`scroll`;let r=e.offsetWidth;return n===r&&(r=t.clientWidth),t.remove(),pr=n-r,pr}let hr=[`auto`,`scroll`];function gr(e,t=!0){return!e||e.nodeType!==Node.ELEMENT_NODE?!1:t?e.scrollHeight>e.clientHeight&&(e.classList.contains(`scroll`)||e.classList.contains(`overflow-auto`)||hr.includes(window.getComputedStyle(e)[`overflow-y`])):e.scrollWidth>e.clientWidth&&(e.classList.contains(`scroll`)||e.classList.contains(`overflow-auto`)||hr.includes(window.getComputedStyle(e)[`overflow-x`]))}var _r={getScrollTarget:nr,getScrollHeight:rr,getScrollWidth:ir,getVerticalScrollPosition:ar,getHorizontalScrollPosition:or,animVerticalScrollTo:sr,animHorizontalScrollTo:cr,setVerticalScrollPosition:dr,setHorizontalScrollPosition:fr,getScrollbarWidth:mr,hasScrollbar:gr};let vr=[],yr;function br(e){yr=e.keyCode===27}function xr(){yr&&=!1}function Sr(e){yr&&(yr=!1,B(e,27)&&vr.at(-1)(e))}function Cr(e){window[e](`keydown`,br),window[e](`blur`,xr),window[e](`keyup`,Sr),yr=!1}function wr(e){p.is.desktop&&(vr.push(e),vr.length===1&&Cr(`addEventListener`))}function Tr(e){let t=vr.indexOf(e);t!==-1&&(vr.splice(t,1),vr.length===0&&Cr(`removeEventListener`))}let Er=[];function Dr(e){Er.at(-1)(e)}function Or(e){p.is.desktop&&(Er.push(e),Er.length===1&&document.body.addEventListener(`focusin`,Dr))}function kr(e){let t=Er.indexOf(e);t!==-1&&(Er.splice(t,1),Er.length===0&&document.body.removeEventListener(`focusin`,Dr))}let Ar=null,{notPassiveCapture:jr}=v,Mr=[];function Nr(e){Ar!==null&&(clearTimeout(Ar),Ar=null);let t=e.target;if(t===void 0||t.nodeType===8||t.classList.contains(`no-pointer-events`))return;let n=kn.length-1;for(;n>=0;){let e=kn[n].$;if(e.type.name===`QTooltip`){n--;continue}if(e.type.name!==`QDialog`)break;if(!e.props.seamless)return;n--}for(let n=Mr.length-1;n>=0;n--){let r=Mr[n];if((r.anchorEl.value===null||!r.anchorEl.value.contains(t))&&(t===document.body||r.innerRef.value!==null&&!r.innerRef.value.contains(t)))e.qClickOutside=!0,r.onClickOutside(e);else return}}function Pr(e){Mr.push(e),Mr.length===1&&(document.addEventListener(`mousedown`,Nr,jr),document.addEventListener(`touchstart`,Nr,jr))}function Fr(e){let t=Mr.indexOf(e);t!==-1&&(Mr.splice(t,1),Mr.length===0&&(Ar!==null&&(clearTimeout(Ar),Ar=null),document.removeEventListener(`mousedown`,Nr,jr),document.removeEventListener(`touchstart`,Nr,jr)))}let Ir,Lr,Rr=[`top`,`center`,`bottom`],zr=[`left`,`middle`,`right`,`start`,`end`];function Br(e){let t=e.split(` `);return t.length===2?Rr.includes(t[0])?zr.includes(t[1])?!0:(console.error(`Anchor/Self position must end with one of left/middle/right/start/end`),!1):(console.error(`Anchor/Self position must start with one of top/center/bottom`),!1):!1}function Vr(e){return!e||e.length===2&&typeof e[0]==`number`&&typeof e[1]==`number`}let Hr={"start#ltr":`left`,"start#rtl":`right`,"end#ltr":`right`,"end#rtl":`left`};[`left`,`middle`,`right`].forEach(e=>{Hr[`${e}#ltr`]=e,Hr[`${e}#rtl`]=e});function Ur(e,t){let n=e.split(` `);return{vertical:n[0],horizontal:Hr[`${n[1]}#${t?`rtl`:`ltr`}`]}}function Wr(e,t){let{top:n,left:r,right:i,bottom:a,width:o,height:s}=e.getBoundingClientRect();return t!==void 0&&(n-=t[1],r-=t[0],a+=t[1],i+=t[0],o+=t[0],s+=t[1]),{top:n,bottom:a,height:s,left:r,right:i,width:o,middle:r+(i-r)/2,center:n+(a-n)/2}}function Gr(e,t,n){let{top:r,left:i}=e.getBoundingClientRect();return r+=t.top,i+=t.left,n!==void 0&&(r+=n[1],i+=n[0]),{top:r,bottom:r+1,height:1,left:i,right:i+1,width:1,middle:i,center:r}}function Kr(e,t){return{top:0,center:t/2,bottom:t,left:0,middle:e/2,right:e}}function qr(e,t,n,r){return{top:e[n.vertical]-t[r.vertical],left:e[n.horizontal]-t[r.horizontal]}}function Jr(e,t=0){if(e.targetEl===null||e.anchorEl===null||t>5)return;if(e.targetEl.offsetHeight===0||e.targetEl.offsetWidth===0){setTimeout(()=>{Jr(e,t+1)},10);return}let{targetEl:n,offset:r,anchorEl:i,anchorOrigin:a,selfOrigin:o,absoluteOffset:s,fit:c,cover:l,maxHeight:u,maxWidth:d}=e;if(p.is.ios&&window.visualViewport!==void 0){let e=document.body.style,{offsetLeft:t,offsetTop:n}=window.visualViewport;t!==Ir&&(e.setProperty(`--q-pe-left`,t+`px`),Ir=t),n!==Lr&&(e.setProperty(`--q-pe-top`,n+`px`),Lr=n)}let{scrollLeft:f,scrollTop:m}=n,h=s===void 0?Wr(i,l?[0,0]:r):Gr(i,s,r);Object.assign(n.style,{top:0,left:0,minWidth:null,minHeight:null,maxWidth:d,maxHeight:u,visibility:`visible`});let{offsetWidth:g,offsetHeight:_}=n,{elWidth:v,elHeight:y}=c||l?{elWidth:Math.max(h.width,g),elHeight:l?Math.max(h.height,_):_}:{elWidth:g,elHeight:_},b={maxWidth:d,maxHeight:u};(c||l)&&(b.minWidth=h.width+`px`,l&&(b.minHeight=h.height+`px`)),Object.assign(n.style,b);let x=Kr(v,y),S=qr(h,x,a,o);if(s===void 0||r===void 0)Yr(S,h,x,a,o);else{let{top:e,left:t}=S;Yr(S,h,x,a,o);let n=!1;if(S.top!==e){n=!0;let e=2*r[1];h.center=h.top-=e,h.bottom-=e+2}if(S.left!==t){n=!0;let e=2*r[0];h.middle=h.left-=e,h.right-=e+2}n&&(S=qr(h,x,a,o),Yr(S,h,x,a,o))}b={top:S.top+`px`,left:S.left+`px`},S.maxHeight!==void 0&&(b.maxHeight=S.maxHeight+`px`,h.height>S.maxHeight&&(b.minHeight=b.maxHeight)),S.maxWidth!==void 0&&(b.maxWidth=S.maxWidth+`px`,h.width>S.maxWidth&&(b.minWidth=b.maxWidth)),Object.assign(n.style,b),n.scrollTop!==m&&(n.scrollTop=m),n.scrollLeft!==f&&(n.scrollLeft=f)}function Yr(e,t,n,r,i){let a=n.bottom,o=n.right,s=mr(),c=window.innerHeight-s,l=document.body.clientWidth;if(e.top<0||e.top+a>c)if(i.vertical===`center`)e.top=t[r.vertical]>c/2?Math.max(0,c-a):0,e.maxHeight=Math.min(a,c);else if(t[r.vertical]>c/2){let n=Math.min(c,r.vertical===`center`?t.center:r.vertical===i.vertical?t.bottom:t.top);e.maxHeight=Math.min(a,n),e.top=Math.max(0,n-a)}else e.top=Math.max(0,r.vertical===`center`?t.center:r.vertical===i.vertical?t.top:t.bottom),e.maxHeight=Math.min(a,c-e.top);if(e.left<0||e.left+o>l)if(e.maxWidth=Math.min(o,l),i.horizontal===`middle`)e.left=t[r.horizontal]>l/2?Math.max(0,l-o):0;else if(t[r.horizontal]>l/2){let n=Math.min(l,r.horizontal===`middle`?t.middle:r.horizontal===i.horizontal?t.right:t.left);e.maxWidth=Math.min(o,n),e.left=Math.max(0,n-e.maxWidth)}else e.left=Math.max(0,r.horizontal===`middle`?t.middle:r.horizontal===i.horizontal?t.left:t.right),e.maxWidth=Math.min(o,l-e.left)}var Xr=h({name:`QMenu`,inheritAttrs:!1,props:{...Cn,...En,...Q,...Xn,persistent:Boolean,autoClose:Boolean,separateClosePopup:Boolean,noEscDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,fit:Boolean,cover:Boolean,square:Boolean,anchor:{type:String,validator:Br},self:{type:String,validator:Br},offset:{type:Array,validator:Vr},scrollTarget:er,touchPosition:Boolean,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null}},emits:[...Dn,`click`,`escapeKey`],setup(t,{slots:n,emit:r,attrs:i}){let a=null,o,s,c,l=(0,e.getCurrentInstance)(),{proxy:u}=l,{$q:d}=u,f=(0,e.ref)(null),p=(0,e.ref)(!1),m=(0,e.computed)(()=>!t.persistent&&!t.noRouteDismiss),h=$(t,d),{registerTick:g,removeTick:_}=Qn(),{registerTimeout:v}=$n(),{transitionProps:y,transitionStyle:b}=Zn(t),{localScrollTarget:x,changeScrollEvent:S,unconfigureScrollTarget:w}=Tn(t,V),{anchorEl:T,canShow:E}=wn({showing:p}),{hide:D}=On({showing:p,canShow:E,handleShow:ee,handleHide:z,handleRouteChange:te,hideOnRouteChange:m,processOnMount:!0}),{showPortal:k,hidePortal:A,renderPortal:j}=Yn(l,f,G,`menu`),M={anchorEl:T,innerRef:f,onClickOutside(e){if(!t.persistent&&p.value)return D(e),(e.type===`touchstart`||e.target.classList.contains(`q-dialog__backdrop`))&&O(e),!0}},N=(0,e.computed)(()=>Ur(t.anchor||(t.cover?`center middle`:`bottom start`),d.lang.rtl)),P=(0,e.computed)(()=>t.cover?N.value:Ur(t.self||`top start`,d.lang.rtl)),F=(0,e.computed)(()=>(t.square?` q-menu--square`:``)+(h.value?` q-menu--dark q-dark`:``)),I=(0,e.computed)(()=>t.autoClose?{onClick:ne}:{}),L=(0,e.computed)(()=>p.value&&!t.persistent);(0,e.watch)(L,e=>{e?(wr(U),Pr(M)):(Tr(U),Fr(M))});function R(){Rn(()=>{let e=f.value;e&&!e.contains(document.activeElement)&&(e=e.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||e.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||e.querySelector(`[autofocus], [data-autofocus]`)||e,e.focus({preventScroll:!0}))})}function ee(n){if(a=t.noRefocus?null:document.activeElement,Or(H),k(),V(),o=void 0,n!==void 0&&(t.touchPosition||t.contextMenu)){let e=C(n);if(e.left!==void 0){let{top:t,left:n}=T.value.getBoundingClientRect();o={left:e.left-n,top:e.top-t}}}s===void 0&&(s=(0,e.watch)(()=>d.screen.width+`|`+d.screen.height+`|`+t.self+`|`+t.anchor+`|`+d.lang.rtl,W)),t.noFocus||document.activeElement.blur(),g(()=>{W(),t.noFocus||R()}),v(()=>{d.platform.is.ios&&(c=t.autoClose,f.value.click()),W(),k(!0),r(`show`,n)},t.transitionDuration)}function z(e){if(_(),A(),B(!0),a!==null&&(e===void 0||!e.qClickOutside)){let t=(e?.type.indexOf(`key`)===0?a.closest(`[tabindex]:not([tabindex^="-"])`):void 0)||a;a=null,Rn(()=>{t.isConnected&&t.focus()})}v(()=>{A(!0),r(`hide`,e)},t.transitionDuration)}function te(){a=null}function B(e){o=void 0,s!==void 0&&(s(),s=void 0),(e||p.value)&&(kr(H),w(),Fr(M),Tr(U)),e||(a=null)}function V(){(T.value!==null||t.scrollTarget!==void 0)&&(x.value=nr(T.value,t.scrollTarget),S(x.value,W))}function ne(e){c?c=!1:(jn(u,e),r(`click`,e))}function H(e){L.value&&!t.noFocus&&!Zt(f.value,e.target)&&R()}function U(e){t.noEscDismiss||(r(`escapeKey`),D(e))}function W(){Jr({targetEl:f.value,offset:t.offset,anchorEl:T.value,anchorOrigin:N.value,selfOrigin:P.value,absoluteOffset:o,fit:t.fit,cover:t.cover,maxHeight:t.maxHeight,maxWidth:t.maxWidth})}function G(){return(0,e.h)(e.Transition,y.value,()=>p.value?(0,e.h)(`div`,{role:`menu`,...i,ref:f,tabindex:-1,class:[`q-menu q-position-engine scroll`+F.value,i.class],style:[i.style,b.value],...I.value},X(n.default)):null)}return(0,e.onBeforeUnmount)(()=>{B()}),Object.assign(u,{focus:R,updatePosition:W}),j}});function Zr(){if(typeof crypto>`u`)return()=>{throw Error(`[Quasar uid()] Secure RNG not available. Cannot generate collision-resistant UUID.`)};if(crypto.randomUUID)return()=>crypto.randomUUID();let e=Array.from({length:256},(e,t)=>(t+256).toString(16).slice(1)),t,n;return()=>{(t===void 0||n+16>4096)&&(n=0,t=new Uint8Array(4096),crypto.getRandomValues(t));let r=n;return n+=16,t[r+6]=t[r+6]&15|64,t[r+8]=t[r+8]&63|128,e[t[r]]+e[t[r+1]]+e[t[r+2]]+e[t[r+3]]+`-`+e[t[r+4]]+e[t[r+5]]+`-`+e[t[r+6]]+e[t[r+7]]+`-`+e[t[r+8]]+e[t[r+9]]+`-`+e[t[r+10]]+e[t[r+11]]+e[t[r+12]]+e[t[r+13]]+e[t[r+14]]+e[t[r+15]]}}var Qr=Zr();function $r(e){return e??null}function ei(e,t){return e??(t?`f_${Qr()}`:null)}function ti({getValue:t,required:n=!0}={}){if(a.value){let r=t===void 0?(0,e.ref)(null):(0,e.ref)($r(t()));return n&&r.value===null&&(0,e.onMounted)(()=>{r.value=`f_${Qr()}`}),t!==void 0&&(0,e.watch)(t,e=>{r.value=ei(e,n)}),r}return t===void 0?(0,e.ref)(`f_${Qr()}`):(0,e.computed)(()=>ei(t(),n))}let ni=Object.keys(dn);function ri(e){return ni.reduce((t,n)=>{let r=e[n];return r!==void 0&&(t[n]=r),t},{})}var ii=h({name:`QBtnDropdown`,props:{...dn,...Xn,modelValue:Boolean,split:Boolean,dropdownIcon:String,contentClass:[Array,String,Object],contentStyle:[Array,String,Object],cover:Boolean,persistent:Boolean,noEscDismiss:Boolean,noRouteDismiss:Boolean,autoClose:Boolean,noRefocus:Boolean,noFocus:Boolean,menuAnchor:{type:String,default:`bottom end`},menuSelf:{type:String,default:`top end`},menuOffset:Array,disableMainBtn:Boolean,disableDropdown:Boolean,noIconAnimation:Boolean,toggleAriaLabel:String},emits:[`update:modelValue`,`click`,`beforeShow`,`show`,`beforeHide`,`hide`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),a=(0,e.ref)(t.modelValue),o=(0,e.ref)(null),s=ti(),c=(0,e.computed)(()=>{let e={"aria-expanded":a.value?`true`:`false`,"aria-haspopup":`true`,"aria-controls":s.value,"aria-label":t.toggleAriaLabel||i.$q.lang.label[a.value?`collapse`:`expand`](t.label)};return(t.disable||!t.split&&t.disableMainBtn||t.disableDropdown)&&(e[`aria-disabled`]=`true`),e}),l=(0,e.computed)(()=>`q-btn-dropdown__arrow`+(a.value&&!t.noIconAnimation?` rotate-180`:``)+(t.split?``:` q-btn-dropdown__arrow-container`)),u=(0,e.computed)(()=>un(t)),d=(0,e.computed)(()=>ri(t));(0,e.watch)(()=>t.modelValue,e=>{o.value?.[e?`show`:`hide`]()}),(0,e.watch)(()=>t.split,b);function f(e){a.value=!0,r(`beforeShow`,e)}function p(e){r(`show`,e),r(`update:modelValue`,!0)}function m(e){a.value=!1,r(`beforeHide`,e)}function h(e){r(`hide`,e),r(`update:modelValue`,!1)}function g(e){r(`click`,e)}function _(e){E(e),b(),r(`click`,e)}function v(e){o.value?.toggle(e)}function y(e){o.value?.show(e)}function b(e){o.value?.hide(e)}return Object.assign(i,{show:y,hide:b,toggle:v}),(0,e.onMounted)(()=>{t.modelValue&&y()}),()=>{let r=[(0,e.h)(Z,{class:l.value,name:t.dropdownIcon||i.$q.iconSet.arrow.dropdown})];return t.disableDropdown||r.push((0,e.h)(Xr,{ref:o,id:s.value,class:t.contentClass,style:t.contentStyle,cover:t.cover,fit:!0,persistent:t.persistent,noEscDismiss:t.noEscDismiss,noRouteDismiss:t.noRouteDismiss,autoClose:t.autoClose,noFocus:t.noFocus,noRefocus:t.noRefocus,anchor:t.menuAnchor,self:t.menuSelf,offset:t.menuOffset,separateClosePopup:!0,transitionShow:t.transitionShow,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,onBeforeShow:f,onShow:p,onBeforeHide:m,onHide:h},n.default)),t.split?(0,e.h)(bn,{class:`q-btn-dropdown q-btn-dropdown--split no-wrap q-btn-item`,rounded:t.rounded,square:t.square,...u.value,glossy:t.glossy,stretch:t.stretch},()=>[(0,e.h)(yn,{class:`q-btn-dropdown--current`,...d.value,disable:t.disable||t.disableMainBtn,noWrap:!0,round:!1,onClick:_},{default:n.label,loading:n.loading}),(0,e.h)(yn,{class:`q-btn-dropdown__arrow-container q-anchor--skip`,...c.value,...u.value,disable:t.disable||t.disableDropdown,rounded:t.rounded,color:t.color,textColor:t.textColor,dense:t.dense,size:t.size,padding:t.padding,ripple:t.ripple},()=>r)]):(0,e.h)(yn,{class:`q-btn-dropdown q-btn-dropdown--simple`,...d.value,...c.value,disable:t.disable||t.disableMainBtn,noWrap:!0,round:!1,onClick:g},{default:()=>X(n.label,[]).concat(r),loading:n.loading})}}});let ai={name:String};function oi(t){return(0,e.computed)(()=>({type:`hidden`,name:t.name,value:t.modelValue}))}function si(t={}){return(n,r,i)=>{n[r]((0,e.h)(`input`,{class:`hidden`+(i||``),...t.value}))}}function ci(t){return(0,e.computed)(()=>t.name||t.for)}var li=h({name:`QBtnToggle`,props:{...ai,modelValue:{required:!0},options:{type:Array,required:!0,validator:e=>e.every(e=>(`label`in e||`icon`in e||`slot`in e)&&`value`in e)},color:String,textColor:String,toggleColor:{type:String,default:`primary`},toggleTextColor:String,outline:Boolean,flat:Boolean,unelevated:Boolean,rounded:Boolean,push:Boolean,glossy:Boolean,size:String,padding:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,readonly:Boolean,disable:Boolean,stack:Boolean,stretch:Boolean,spread:Boolean,clearable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:[`update:modelValue`,`clear`,`click`],setup(t,{slots:n,emit:r}){let i=(0,e.computed)(()=>t.options.find(e=>e.value===t.modelValue)!==void 0),a=si((0,e.computed)(()=>({type:`hidden`,name:t.name,value:t.modelValue}))),o=(0,e.computed)(()=>un(t)),s=(0,e.computed)(()=>({rounded:t.rounded,dense:t.dense,...o.value})),c=(0,e.computed)(()=>t.options.map((e,n)=>{let{attrs:r,value:i,slot:a,...o}=e;return{slot:a,props:{key:n,"aria-pressed":i===t.modelValue?`true`:`false`,...r,...o,...s.value,disable:t.disable||o.disable===!0,color:i===t.modelValue?u(o,`toggleColor`):u(o,`color`),textColor:i===t.modelValue?u(o,`toggleTextColor`):u(o,`textColor`),noCaps:u(o,`noCaps`)===!0,noWrap:u(o,`noWrap`)===!0,size:u(o,`size`),padding:u(o,`padding`),ripple:u(o,`ripple`),stack:u(o,`stack`)===!0,stretch:u(o,`stretch`)===!0,onClick(t){l(i,e,t)}}}}));function l(e,n,i){t.readonly||(t.modelValue===e?t.clearable&&(r(`update:modelValue`,null,null),r(`clear`)):r(`update:modelValue`,e,n),r(`click`,i))}function u(e,n){return e[n]===void 0?t[n]:e[n]}function d(){let r=c.value.map(t=>(0,e.h)(yn,t.props,t.slot===void 0?void 0:n[t.slot]));return t.name!==void 0&&!t.disable&&i.value&&a(r,`push`),Ze(n.default,r)}return()=>(0,e.h)(bn,{class:`q-btn-toggle`,...o.value,rounded:t.rounded,stretch:t.stretch,glossy:t.glossy,spread:t.spread},d)}}),ui=h({name:`QCard`,props:{...Q,tag:{type:String,default:`div`},square:Boolean,flat:Boolean,bordered:Boolean},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=$(t,r),a=(0,e.computed)(()=>`q-card`+(i.value?` q-card--dark q-dark`:``)+(t.bordered?` q-card--bordered`:``)+(t.square?` q-card--square no-border-radius`:``)+(t.flat?` q-card--flat no-shadow`:``));return()=>(0,e.h)(t.tag,{class:a.value},X(n.default))}}),di=h({name:`QCardSection`,props:{tag:{type:String,default:`div`},horizontal:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-card__section q-card__section--${t.horizontal?`horiz row no-wrap`:`vert`}`);return()=>(0,e.h)(t.tag,{class:r.value},X(n.default))}}),fi=h({name:`QCardActions`,props:{...xt,vertical:Boolean},setup(t,{slots:n}){let r=St(t),i=(0,e.computed)(()=>`q-card__actions ${r.value} q-card__actions--${t.vertical?`vert column`:`horiz row`}`);return()=>(0,e.h)(`div`,{class:i.value},X(n.default))}});let pi={left:!0,right:!0,up:!0,down:!0,horizontal:!0,vertical:!0},mi=Object.keys(pi);pi.all=!0;function hi(e){let t={};for(let n of mi)e[n]&&(t[n]=!0);return Object.keys(t).length===0?pi:(t.horizontal?t.left=t.right=!0:t.left&&t.right&&(t.horizontal=!0),t.vertical?t.up=t.down=!0:t.up&&t.down&&(t.vertical=!0),t.horizontal&&t.vertical&&(t.all=!0),t)}let gi=[`INPUT`,`TEXTAREA`];function _i(e,t){return t.event===void 0&&e.target!==void 0&&!e.target.draggable&&typeof t.handler==`function`&&!gi.includes(e.target.nodeName.toUpperCase())&&(e.qClonedBy===void 0||!e.qClonedBy.includes(t.uid))}function vi(e){let t=[.06,6,50];return typeof e==`string`&&e.length!==0&&e.split(`:`).forEach((e,n)=>{let r=Number.parseFloat(e);r&&(t[n]=r)}),t}function yi(){document.body.classList.remove(`no-pointer-events--children`)}var bi=g({name:`touch-swipe`,beforeMount(e,{value:t,arg:n,modifiers:r}){if(!r.mouse&&!p.has.touch)return;let i=r.mouseCapture||r.mousecapture?`Capture`:``,a={handler:t,sensitivity:vi(n),direction:hi(r),noop:y,mouseStart(e){_i(e,a)&&b(e)&&(A(a,`temp`,[[document,`mousemove`,`move`,`notPassive${i}`],[document,`mouseup`,`end`,`notPassiveCapture`]]),a.start(e,!0))},touchStart(e){if(_i(e,a)){let t=e.target;A(a,`temp`,[[t,`touchmove`,`move`,`notPassiveCapture`],[t,`touchcancel`,`end`,`notPassiveCapture`],[t,`touchend`,`end`,`notPassiveCapture`]]),a.start(e)}},start(t,n){p.is.firefox&&k(e,!0);let r=C(t);a.event={x:r.left,y:r.top,time:Date.now(),mouse:n===!0,dir:!1}},move(e){if(a.event===void 0)return;if(a.event.dir!==!1){O(e);return}let t=Date.now()-a.event.time;if(t===0)return;let n=C(e),r=n.left-a.event.x,i=Math.abs(r),o=n.top-a.event.y,s=Math.abs(o);if(!a.event.mouse){if(ia.sensitivity[0]&&(a.event.dir=o<0?`up`:`down`),a.direction.horizontal&&i>s&&s<100&&c>a.sensitivity[0]&&(a.event.dir=r<0?`left`:`right`),a.direction.up&&ia.sensitivity[0]&&(a.event.dir=`up`),a.direction.down&&i0&&i<100&&l>a.sensitivity[0]&&(a.event.dir=`down`),a.direction.left&&i>s&&r<0&&s<100&&c>a.sensitivity[0]&&(a.event.dir=`left`),a.direction.right&&i>s&&r>0&&s<100&&c>a.sensitivity[0]&&(a.event.dir=`right`),a.event.dir===!1?a.end(e):(O(e),a.event.mouse&&(document.body.classList.add(`no-pointer-events--children`,`non-selectable`),xn(),a.styleCleanup=e=>{a.styleCleanup=void 0,document.body.classList.remove(`non-selectable`),e===!0?setTimeout(yi,50):yi()}),a.handler({evt:e,touch:a.event.mouse!==!0,mouse:a.event.mouse,direction:a.event.dir,duration:t,distance:{x:i,y:s}}))},end(t){a.event!==void 0&&(j(a,`temp`),p.is.firefox&&k(e,!1),a.styleCleanup?.(!0),t!==void 0&&a.event.dir!==!1&&O(t),a.event=void 0)}};e.__qtouchswipe=a,r.mouse&&A(a,`main`,[[e,`mousedown`,`mouseStart`,`passive${r.mouseCapture||r.mousecapture?`Capture`:``}`]]),p.has.touch&&A(a,`main`,[[e,`touchstart`,`touchStart`,`passive${r.capture?`Capture`:``}`],[e,`touchmove`,`noop`,`notPassiveCapture`]])},updated(e,t){let n=e.__qtouchswipe;n!==void 0&&(t.oldValue!==t.value&&(typeof t.value!=`function`&&n.end(),n.handler=t.value),n.direction=hi(t.modifiers))},beforeUnmount(e){let t=e.__qtouchswipe;t!==void 0&&(j(t,`main`),j(t,`temp`),p.is.firefox&&k(e,!1),t.styleCleanup?.(),delete e.__qtouchswipe)}});function xi(){let e=Object.create(null);return{getCache:(t,n)=>Object.hasOwn(e,t)?e[t]:e[t]=typeof n==`function`?n():n,setCache(t,n){e[t]=n},hasCache(t){return Object.hasOwn(e,t)},clearCache(t){t===void 0?e=Object.create(null):delete e[t]}}}let Si={name:{required:!0},disable:Boolean},Ci={setup(t,{slots:n}){return()=>(0,e.h)(`div`,{class:`q-panel scroll`,role:`tabpanel`},X(n.default))}},wi={modelValue:{required:!0},animated:Boolean,infinite:Boolean,swipeable:Boolean,vertical:Boolean,transitionPrev:String,transitionNext:String,transitionDuration:{type:[String,Number],default:300},keepAlive:Boolean,keepAliveInclude:[String,Array,RegExp],keepAliveExclude:[String,Array,RegExp],keepAliveMax:Number},Ti=[`update:modelValue`,`beforeTransition`,`transition`];function Ei(e){return e!=null&&e!==``}function Di(){let{props:t,emit:n,proxy:r}=(0,e.getCurrentInstance)(),{getCache:i}=xi(),{registerTimeout:a}=$n(),o,s,c=(0,e.ref)(null),l={value:null};function u(e){let n=t.vertical?`up`:`left`;w((r.$q.lang.rtl?-1:1)*(e.direction===n?1:-1))}let d=(0,e.computed)(()=>[[bi,u,void 0,{horizontal:!t.vertical,vertical:t.vertical,mouse:!0}]]),f=(0,e.computed)(()=>t.transitionPrev||`slide-${t.vertical?`down`:r.$q.lang.rtl?`left`:`right`}`),p=(0,e.computed)(()=>t.transitionNext||`slide-${t.vertical?`up`:r.$q.lang.rtl?`right`:`left`}`),m=(0,e.computed)(()=>`--q-transition-duration: ${t.transitionDuration}ms`),h=(0,e.computed)(()=>typeof t.modelValue==`string`||typeof t.modelValue==`number`?t.modelValue:String(t.modelValue)),g=(0,e.computed)(()=>({include:t.keepAliveInclude,exclude:t.keepAliveExclude,max:t.keepAliveMax})),_=(0,e.computed)(()=>t.keepAliveInclude!==void 0||t.keepAliveExclude!==void 0);(0,e.watch)(()=>t.modelValue,(e,r)=>{let i=Ei(e)?x(e):-1;s||C(i===-1?0:i{n(`transition`,e,r)},t.transitionDuration))});function v(){w(1)}function y(){w(-1)}function b(e){n(`update:modelValue`,e)}function x(e){return o.findIndex(t=>t.props.name===e&&t.props.disable!==``&&t.props.disable!==!0)}function S(){return o.filter(e=>e.props.disable!==``&&e.props.disable!==!0)}function C(e){let n=e!==0&&t.animated&&l.value!==-1?`q-transition--`+(e===-1?f.value:p.value):null;c.value!==n&&(c.value=n)}function w(e,r=l.value){let i=r+e;for(;i!==-1&&i{s=!1},0);return}i+=e}t.infinite&&o.length!==0&&r!==-1&&r!==o.length&&w(e,e===-1?o.length:-1)}function T(){let e=x(t.modelValue);return l.value!==e&&(l.value=e),!0}function E(){let n=Ei(t.modelValue)&&T()&&o[l.value];return t.keepAlive?[(0,e.h)(e.KeepAlive,g.value,[(0,e.h)(_.value?i(h.value,()=>({...Ci,name:h.value})):Ci,{key:h.value,style:m.value},()=>n)])]:[(0,e.h)(`div`,{class:`q-panel scroll`,style:m.value,key:h.value,role:`tabpanel`},[n])]}function D(){if(o.length!==0)return t.animated?[(0,e.h)(e.Transition,{name:c.value},E)]:E()}function O(e){return o=Tt(X(e.default,[])).filter(e=>e.props!==null&&e.props.slot===void 0&&Ei(e.props.name)),o.length}function k(){return o}return Object.assign(r,{next:v,previous:y,goTo:b}),{panelIndex:l,panelDirectives:d,updatePanelsList:O,updatePanelIndex:T,getPanelContent:D,getEnabledPanels:S,getPanels:k,isValidPanelName:Ei,keepAliveProps:g,needsUniqueKeepAliveWrapper:_,goToPanelByOffset:w,goToPanel:b,nextPanel:v,previousPanel:y}}let Oi=0,ki={fullscreen:Boolean,noRouteFullscreenExit:Boolean},Ai=[`update:fullscreen`,`fullscreen`];function ji(){let t=(0,e.getCurrentInstance)(),{props:n,emit:r,proxy:i}=t,a,o,s=!1,c=(0,e.ref)(!1);Et(t)&&(0,e.watch)(()=>i.$route.fullPath,()=>{n.noRouteFullscreenExit||d()}),(0,e.watch)(()=>n.fullscreen,e=>{c.value!==e&&l()}),(0,e.watch)(c,e=>{r(`update:fullscreen`,e),r(`fullscreen`,e)});function l(){c.value?d():u()}function u(){c.value||(c.value=!0,i.$el.replaceWith(o),document.body.append(i.$el),Oi++,Oi===1&&document.body.classList.add(`q-body--fullscreen-mixin`),a={handler:d},ie.add(a))}function d(){c.value&&(a!==void 0&&(ie.remove(a),a=void 0),o.replaceWith(i.$el),c.value=!1,Oi=Math.max(0,Oi-1),Oi===0&&(document.body.classList.remove(`q-body--fullscreen-mixin`),!s&&i.$el.scrollIntoView!==void 0&&setTimeout(()=>{i.$el.scrollIntoView()},0)))}return(0,e.onBeforeMount)(()=>{o=document.createElement(`span`)}),(0,e.onMounted)(()=>{n.fullscreen&&u()}),(0,e.onBeforeUnmount)(()=>{s=!0,d()}),Object.assign(i,{toggleFullscreen:l,setFullscreen:u,exitFullscreen:d}),{inFullscreen:c,toggleFullscreen:l}}let Mi=[`top`,`right`,`bottom`,`left`],Ni=[`regular`,`flat`,`outline`,`push`,`unelevated`];var Pi=h({name:`QCarousel`,props:{...Q,...wi,...ki,transitionPrev:{type:String,default:`fade`},transitionNext:{type:String,default:`fade`},height:String,padding:Boolean,controlColor:String,controlTextColor:String,controlType:{type:String,validator:e=>Ni.includes(e),default:`flat`},autoplay:[Number,Boolean],arrows:Boolean,prevIcon:String,nextIcon:String,navigation:Boolean,navigationPosition:{type:String,validator:e=>Mi.includes(e)},navigationIcon:String,navigationActiveIcon:String,thumbnails:Boolean},emits:[...Ai,...Ti],setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=$(t,r),a=null,o,{updatePanelsList:s,updatePanelIndex:c,getPanelContent:l,panelDirectives:u,goToPanel:d,previousPanel:f,nextPanel:p,getEnabledPanels:m,panelIndex:h}=Di(),{inFullscreen:g}=ji(),_=(0,e.computed)(()=>!g.value&&t.height!==void 0?{height:t.height}:{}),v=(0,e.computed)(()=>t.vertical?`vertical`:`horizontal`),y=(0,e.computed)(()=>t.navigationPosition||(t.vertical?`right`:`bottom`)),b=(0,e.computed)(()=>`q-carousel q-panel-parent q-carousel--with${t.padding?``:`out`}-padding`+(g.value?` fullscreen`:``)+(i.value?` q-carousel--dark q-dark`:``)+(t.arrows?` q-carousel--arrows-${v.value}`:``)+(t.navigation?` q-carousel--navigation-${y.value}`:``)),x=(0,e.computed)(()=>{let e=[t.prevIcon||r.iconSet.carousel[t.vertical?`up`:`left`],t.nextIcon||r.iconSet.carousel[t.vertical?`down`:`right`]];return!t.vertical&&r.lang.rtl?e.reverse():e}),S=(0,e.computed)(()=>t.navigationIcon||r.iconSet.carousel.navigationIcon),C=(0,e.computed)(()=>t.navigationActiveIcon||S.value),w=(0,e.computed)(()=>({color:t.controlColor,textColor:t.controlTextColor,round:!0,[t.controlType]:!0,dense:!0}));(0,e.watch)(()=>t.modelValue,()=>{t.autoplay&&T()}),(0,e.watch)(()=>t.autoplay,e=>{e?T():a!==null&&(clearTimeout(a),a=null)});function T(){let e=xe(t.autoplay)?Math.abs(t.autoplay):5e3;a!==null&&clearTimeout(a),a=setTimeout(()=>{a=null,e>=0?p():f()},e)}(0,e.onMounted)(()=>{t.autoplay&&T()}),(0,e.onBeforeUnmount)(()=>{a!==null&&clearTimeout(a)});function E(n,r){return(0,e.h)(`div`,{class:`q-carousel__control q-carousel__navigation no-wrap absolute flex q-carousel__navigation--${n} q-carousel__navigation--${y.value}`+(t.controlColor===void 0?``:` text-${t.controlColor}`)},[(0,e.h)(`div`,{class:`q-carousel__navigation-inner flex flex-center no-wrap`},m().map(r))])}function D(){let r=[];if(t.navigation){let t=n[`navigation-icon`]===void 0?t=>(0,e.h)(yn,{key:`nav`+t.name,class:`q-carousel__navigation-icon q-carousel__navigation-icon--${t.active===!0?``:`in`}active`,...t.btnProps,onClick:t.onClick}):n[`navigation-icon`],i=o-1;r.push(E(`buttons`,(e,n)=>{let r=e.props.name,a=h.value===n;return t({index:n,maxIndex:i,name:r,active:a,btnProps:{icon:a?C.value:S.value,size:`sm`,...w.value},onClick:()=>{d(r)}})}))}else if(t.thumbnails){let n=t.controlColor===void 0?``:` text-${t.controlColor}`;r.push(E(`thumbnails`,r=>{let i=r.props;return(0,e.h)(`img`,{key:`tmb#`+i.name,class:`q-carousel__thumbnail q-carousel__thumbnail--${i.name===t.modelValue?``:`in`}active`+n,src:i.imgSrc||i[`img-src`],onClick:()=>{d(i.name)}})}))}return t.arrows&&h.value>=0&&((t.infinite||h.value>0)&&r.push((0,e.h)(`div`,{key:`prev`,class:`q-carousel__control q-carousel__arrow q-carousel__prev-arrow q-carousel__prev-arrow--${v.value} absolute flex flex-center`},[(0,e.h)(yn,{icon:x.value[0],...w.value,onClick:f})])),(t.infinite||h.value(o=s(n),c(),(0,e.h)(`div`,{class:b.value,style:_.value},[$e(`div`,{class:`q-carousel__slides-container`},l(),`sl-cont`,t.swipeable,()=>u.value),...D()]))}}),Fi=h({name:`QCarouselSlide`,props:{...Si,imgSrc:String},setup(t,{slots:n}){let r=(0,e.computed)(()=>t.imgSrc?{backgroundImage:`url("${t.imgSrc}")`}:{});return()=>(0,e.h)(`div`,{class:`q-carousel__slide`,style:r.value},X(n.default))}}),Ii=h({name:`QCarouselControl`,props:{position:{type:String,default:`bottom-right`,validator:e=>[`top-right`,`top-left`,`bottom-right`,`bottom-left`,`top`,`right`,`bottom`,`left`].includes(e)},offset:{type:Array,default:()=>[18,18],validator:e=>e.length===2}},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-carousel__control absolute absolute-${t.position}`),i=(0,e.computed)(()=>({margin:`${t.offset[1]}px ${t.offset[0]}px`}));return()=>(0,e.h)(`div`,{class:r.value,style:i.value},X(n.default))}}),Li=h({name:`QChatMessage`,props:{sent:Boolean,label:String,bgColor:String,textColor:String,name:String,avatar:String,text:Array,stamp:String,size:String,labelHtml:Boolean,nameHtml:Boolean,textHtml:Boolean,stampHtml:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>t.sent?`sent`:`received`),i=(0,e.computed)(()=>`q-message-text-content q-message-text-content--${r.value}`+(t.textColor===void 0?``:` text-${t.textColor}`)),a=(0,e.computed)(()=>`q-message-text q-message-text--${r.value}`+(t.bgColor===void 0?``:` text-${t.bgColor}`)),o=(0,e.computed)(()=>`q-message-container row items-end no-wrap`+(t.sent?` reverse`:``)),s=(0,e.computed)(()=>t.size===void 0?``:`col-${t.size}`),c=(0,e.computed)(()=>({msg:t.textHtml?`innerHTML`:`textContent`,stamp:t.stampHtml?`innerHTML`:`textContent`,name:t.nameHtml?`innerHTML`:`textContent`,label:t.labelHtml?`innerHTML`:`textContent`}));function l(r){return n.stamp===void 0?t.stamp?[r,(0,e.h)(`div`,{class:`q-message-stamp`,[c.value.stamp]:t.stamp})]:[r]:[r,(0,e.h)(`div`,{class:`q-message-stamp`},n.stamp())]}function u(t,n){let r=n?t.length>1?e=>e:t=>(0,e.h)(`div`,[t]):t=>(0,e.h)(`div`,{[c.value.msg]:t});return t.map((t,n)=>(0,e.h)(`div`,{key:n,class:a.value},[(0,e.h)(`div`,{class:i.value},l(r(t)))]))}return()=>{let i=[];n.avatar===void 0?t.avatar!==void 0&&i.push((0,e.h)(`img`,{class:`q-message-avatar q-message-avatar--${r.value}`,src:t.avatar,"aria-hidden":`true`})):i.push(n.avatar());let a=[];n.name===void 0?t.name!==void 0&&a.push((0,e.h)(`div`,{class:`q-message-name q-message-name--${r.value}`,[c.value.name]:t.name})):a.push((0,e.h)(`div`,{class:`q-message-name q-message-name--${r.value}`},n.name())),n.default===void 0?t.text!==void 0&&a.push(u(t.text,!1)):a.push(u(Tt(n.default()),!0)),i.push((0,e.h)(`div`,{class:s.value},a));let l=[];return n.label===void 0?t.label!==void 0&&l.push((0,e.h)(`div`,{class:`q-message-label`,[c.value.label]:t.label})):l.push((0,e.h)(`div`,{class:`q-message-label`},n.label())),l.push((0,e.h)(`div`,{class:o.value},i)),(0,e.h)(`div`,{class:`q-message q-message-${r.value}`},l)}}});function Ri(t,n){let r=(0,e.ref)(null),i=(0,e.computed)(()=>t.disable?null:(0,e.h)(`span`,{ref:r,class:`no-outline`,tabindex:-1}));function a(e){let t=n.value;e?.qAvoidFocus!==!0&&(e?.type.indexOf(`key`)===0?document.activeElement!==t&&t?.contains(document.activeElement)===!0&&t.focus():r.value!==null&&(e===void 0||t?.contains(e.target)===!0)&&r.value.focus())}return{refocusTargetEl:i,refocusTarget:a}}var zi={xs:30,sm:35,md:40,lg:50,xl:60};let Bi={...Q,...Je,...ai,modelValue:{required:!0,default:null},val:{},trueValue:{default:!0},falseValue:{default:!1},indeterminateValue:{default:null},checkedIcon:String,uncheckedIcon:String,indeterminateIcon:String,toggleOrder:{type:String,validator:e=>e===`tf`||e===`ft`},toggleIndeterminate:Boolean,label:String,leftLabel:Boolean,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},Vi=[`update:modelValue`];function Hi(e){(e.keyCode===13||e.keyCode===32)&&O(e)}function Ui(t,n){let{props:r,slots:i,emit:a,proxy:o}=(0,e.getCurrentInstance)(),{$q:s}=o,c=$(r,s),l=(0,e.ref)(null),{refocusTargetEl:u,refocusTarget:d}=Ri(r,l),f=Ye(r,zi),p=(0,e.computed)(()=>r.val!==void 0&&Array.isArray(r.modelValue)),m=(0,e.computed)(()=>{let t=(0,e.toRaw)(r.val);return p.value?r.modelValue.findIndex(n=>(0,e.toRaw)(n)===t):-1}),h=(0,e.computed)(()=>p.value?m.value!==-1:(0,e.toRaw)(r.modelValue)===(0,e.toRaw)(r.trueValue)),g=(0,e.computed)(()=>p.value?m.value===-1:(0,e.toRaw)(r.modelValue)===(0,e.toRaw)(r.falseValue)),_=(0,e.computed)(()=>!h.value&&!g.value),v=(0,e.computed)(()=>r.disable?-1:r.tabindex||0),y=(0,e.computed)(()=>`q-${t} cursor-pointer no-outline row inline no-wrap items-center`+(r.disable?` disabled`:``)+(c.value?` q-${t}--dark`:``)+(r.dense?` q-${t}--dense`:``)+(r.leftLabel?` reverse`:``)),b=(0,e.computed)(()=>`q-${t}__inner relative-position non-selectable q-${t}__inner--${h.value?`truthy`:g.value?`falsy`:`indet`}${r.color!==void 0&&(r.keepColor||(t===`toggle`?h.value:!g.value))?` text-${r.color}`:``}`),x=si((0,e.computed)(()=>{let e={type:`checkbox`};return r.name!==void 0&&Object.assign(e,{".checked":h.value,"^checked":h.value?`checked`:void 0,name:r.name,value:p.value?r.val:r.trueValue}),e})),S=(0,e.computed)(()=>{let e={tabindex:v.value,role:t===`toggle`?`switch`:`checkbox`,"aria-label":r.label,"aria-checked":_.value?`mixed`:h.value?`true`:`false`};return r.disable&&(e[`aria-disabled`]=`true`),e});function C(e){e!==void 0&&(O(e),d(e)),r.disable||a(`update:modelValue`,w(),e)}function w(){if(p.value){if(h.value){let e=[...r.modelValue];return e.splice(m.value,1),e}return[...r.modelValue,r.val]}if(h.value){if(r.toggleOrder!==`ft`||!r.toggleIndeterminate)return r.falseValue}else if(g.value){if(r.toggleOrder===`ft`||!r.toggleIndeterminate)return r.trueValue}else return r.toggleOrder===`ft`?r.falseValue:r.trueValue;return r.indeterminateValue}function T(e){(e.keyCode===13||e.keyCode===32)&&C(e)}let E=n(h,_);return Object.assign(o,{toggle:C}),()=>{let n=E();r.disable||x(n,`unshift`,` q-${t}__native absolute q-ma-none q-pa-none`);let a=[(0,e.h)(`div`,{class:b.value,style:f.value,"aria-hidden":`true`},n)];u.value!==null&&a.push(u.value);let o=r.label===void 0?X(i.default):Ze(i.default,[r.label]);return o!==void 0&&a.push((0,e.h)(`div`,{class:`q-${t}__label q-anchor--skip`},o)),(0,e.h)(`div`,{ref:l,class:y.value,...S.value,onClick:C,onKeydown:Hi,onKeyup:T},a)}}let Wi=()=>(0,e.h)(`div`,{key:`svg`,class:`q-checkbox__bg absolute`},[(0,e.h)(`svg`,{class:`q-checkbox__svg fit absolute-full`,viewBox:`0 0 24 24`},[(0,e.h)(`path`,{class:`q-checkbox__truthy`,fill:`none`,d:`M1.73,12.91 8.1,19.28 22.79,4.59`}),(0,e.h)(`path`,{class:`q-checkbox__indet`,d:`M4,14H20V10H4`})])]);var Gi=h({name:`QCheckbox`,props:Bi,emits:Vi,setup(t){let n=Wi();function r(r,i){let a=(0,e.computed)(()=>(r.value?t.checkedIcon:i.value?t.indeterminateIcon:t.uncheckedIcon)||null);return()=>a.value===null?[n]:[(0,e.h)(`div`,{key:`icon`,class:`q-checkbox__icon-container absolute-full flex flex-center no-wrap`},[(0,e.h)(Z,{class:`q-checkbox__icon`,name:a.value})])]}return Ui(`checkbox`,r)}});function Ki(e){e.keyCode===32&&O(e)}let qi={xs:8,sm:10,md:14,lg:20,xl:24};var Ji=h({name:`QChip`,props:{...Q,...Je,dense:Boolean,icon:String,iconRight:String,iconRemove:String,iconSelected:String,label:[String,Number],color:String,textColor:String,modelValue:{type:Boolean,default:!0},selected:{type:Boolean,default:null},square:Boolean,outline:Boolean,clickable:Boolean,removable:Boolean,removeAriaLabel:String,tabindex:[String,Number],disable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:[`update:modelValue`,`update:selected`,`remove`,`click`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=$(t,i),o=Ye(t,qi),s=(0,e.computed)(()=>t.selected||t.icon!==void 0),c=(0,e.computed)(()=>t.selected?t.iconSelected||i.iconSet.chip.selected:t.icon),l=(0,e.computed)(()=>t.iconRemove||i.iconSet.chip.remove),u=(0,e.computed)(()=>!t.disable&&(t.clickable||t.selected!==null)),d=(0,e.computed)(()=>{let e=t.outline&&t.color||t.textColor;return`q-chip row inline no-wrap items-center`+(!t.outline&&t.color!==void 0?` bg-${t.color}`:``)+(e?` text-${e} q-chip--colored`:``)+(t.disable?` disabled`:``)+(t.dense?` q-chip--dense`:``)+(t.outline?` q-chip--outline`:``)+(t.selected?` q-chip--selected`:``)+(u.value?` q-chip--clickable cursor-pointer non-selectable q-hoverable`:``)+(t.square?` q-chip--square`:``)+(a.value?` q-chip--dark q-dark`:``)}),f=(0,e.computed)(()=>{let e=t.disable?{tabindex:-1,"aria-disabled":`true`}:{tabindex:t.tabindex||0,role:`button`,"aria-pressed":t.selected?`true`:`false`};return{chip:e,remove:{...e,role:`button`,"aria-hidden":`false`,"aria-label":t.removeAriaLabel||i.lang.label.remove}}});function p(e){[13,32].includes(e.keyCode)&&(m(e),O(e))}function m(e){t.disable||(r(`update:selected`,!t.selected),r(`click`,e))}function h(e){(e.keyCode===void 0||[13,32].includes(e.keyCode))&&(O(e),t.disable||(r(`update:modelValue`,!1),r(`remove`)))}function g(){let r=[];u.value&&r.push((0,e.h)(`div`,{class:`q-focus-helper`})),s.value&&r.push((0,e.h)(Z,{class:`q-chip__icon q-chip__icon--left`,name:c.value}));let i=t.label===void 0?void 0:[(0,e.h)(`div`,{class:`ellipsis`},[t.label])];return r.push((0,e.h)(`div`,{class:`q-chip__content col row no-wrap items-center q-anchor--skip`},Qe(n.default,i))),t.iconRight&&r.push((0,e.h)(Z,{class:`q-chip__icon q-chip__icon--right`,name:t.iconRight})),t.removable&&r.push((0,e.h)(Z,{class:`q-chip__icon q-chip__icon--remove cursor-pointer`,name:l.value,...f.value.remove,onClick:h,onKeydown:Ki,onKeyup:h})),r}return()=>{if(!t.modelValue)return;let e={class:d.value,style:o.value};return u.value&&Object.assign(e,f.value.chip,{onClick:m,onKeydown:Ki,onKeyup:p}),$e(`div`,e,g(),`ripple`,t.ripple!==!1&&!t.disable,()=>[[nn,t.ripple]])}}});let Yi={...Je,min:{type:Number,default:0},max:{type:Number,default:100},color:String,centerColor:String,trackColor:String,fontSize:String,rounded:Boolean,thickness:{type:Number,default:.2,validator:e=>e>=0&&e<=1},angle:{type:Number,default:0},showValue:Boolean,reverse:Boolean,instantFeedback:Boolean},Xi=100*Math.PI,Zi=Math.round(Xi*1e3)/1e3;var Qi=h({name:`QCircularProgress`,props:{...Yi,value:{type:Number,default:0},animationSpeed:{type:[String,Number],default:600},indeterminate:Boolean},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=Ye(t),a=(0,e.computed)(()=>{let e=(r.lang.rtl?-1:1)*t.angle;return{transform:t.reverse===(r.lang.rtl===!0)?`rotate3d(0, 0, 1, ${e-90}deg)`:`scale3d(-1, 1, 1) rotate3d(0, 0, 1, ${-90-e}deg)`}}),o=(0,e.computed)(()=>!t.instantFeedback&&!t.indeterminate?{transition:`stroke-dashoffset ${t.animationSpeed}ms ease 0s, stroke ${t.animationSpeed}ms ease`}:``),s=(0,e.computed)(()=>100/(1-t.thickness/2)),c=(0,e.computed)(()=>`${s.value/2} ${s.value/2} ${s.value} ${s.value}`),l=(0,e.computed)(()=>Pe(t.value,t.min,t.max)),u=(0,e.computed)(()=>t.max-t.min),d=(0,e.computed)(()=>t.thickness/2*s.value),f=(0,e.computed)(()=>{let e=(t.max-l.value)/u.value,n=t.rounded&&l.value{let r=[];t.centerColor!==void 0&&t.centerColor!==`transparent`&&r.push((0,e.h)(`circle`,{class:`q-circular-progress__center text-${t.centerColor}`,fill:`currentColor`,r:50-d.value/2,cx:s.value,cy:s.value})),t.trackColor!==void 0&&t.trackColor!==`transparent`&&r.push(p({cls:`track`,thickness:d.value,offset:0,color:t.trackColor})),r.push(p({cls:`circle`,thickness:d.value,offset:f.value,color:t.color,rounded:t.rounded?`round`:void 0}));let o=[(0,e.h)(`svg`,{class:`q-circular-progress__svg`,style:a.value,viewBox:c.value,"aria-hidden":`true`},r)];return t.showValue&&o.push((0,e.h)(`div`,{class:`q-circular-progress__text absolute-full row flex-center content-center`,style:{fontSize:t.fontSize}},n.default===void 0?[(0,e.h)(`div`,l.value)]:n.default())),(0,e.h)(`div`,{class:`q-circular-progress q-circular-progress--${t.indeterminate?`in`:``}determinate`,style:i.value,role:`progressbar`,"aria-valuemin":t.min,"aria-valuemax":t.max,"aria-valuenow":t.indeterminate?void 0:l.value},Qe(n.internal,o))}}});function $i(e,t,n){let r=C(e),i,a=r.left-t.event.x,o=r.top-t.event.y,s=Math.abs(a),c=Math.abs(o),l=t.direction;l.horizontal&&!l.vertical?i=a<0?`left`:`right`:!l.horizontal&&l.vertical?i=o<0?`up`:`down`:l.up&&o<0?(i=`up`,s>c&&(l.left&&a<0?i=`left`:l.right&&a>0&&(i=`right`))):l.down&&o>0?(i=`down`,s>c&&(l.left&&a<0?i=`left`:l.right&&a>0&&(i=`right`))):l.left&&a<0?(i=`left`,s0&&(i=`down`))):l.right&&a>0&&(i=`right`,s0&&(i=`down`)));let u=!1;if(i===void 0&&n===!1){if(t.event.isFirst||t.event.lastDir===void 0)return{};i=t.event.lastDir,u=!0,i===`left`||i===`right`?(r.left-=a,s=0,a=0):(r.top-=o,c=0,o=0)}return{synthetic:u,payload:{evt:e,touch:t.event.mouse!==!0,mouse:t.event.mouse===!0,position:r,direction:i,isFirst:t.event.isFirst,isFinal:n===!0,duration:Date.now()-t.event.time,distance:{x:s,y:c},offset:{x:a,y:o},delta:{x:r.left-t.event.lastX,y:r.top-t.event.lastY}}}}function ea(){document.body.classList.remove(`no-pointer-events--children`)}let ta=0;var na=g({name:`touch-pan`,beforeMount(e,{value:t,modifiers:n}){if(!n.mouse&&!p.has.touch)return;function r(e,t){n.mouse&&t?O(e):(n.stop&&E(e),n.prevent&&D(e))}let i={uid:`qvtp_`+ta++,handler:t,modifiers:n,direction:hi(n),noop:y,mouseStart(e){_i(e,i)&&b(e)&&(A(i,`temp`,[[document,`mousemove`,`move`,`notPassiveCapture`],[document,`mouseup`,`end`,`passiveCapture`]]),i.start(e,!0))},touchStart(e){if(_i(e,i)){let t=e.target;A(i,`temp`,[[t,`touchmove`,`move`,`notPassiveCapture`],[t,`touchcancel`,`end`,`passiveCapture`],[t,`touchend`,`end`,`passiveCapture`]]),i.start(e)}},start(t,r){if(p.is.firefox&&k(e,!0),i.lastEvt=t,r||n.stop){if(!i.direction.all&&(!r||!i.modifiers.mouseAllDir&&!i.modifiers.mousealldir)){let e=t.type.includes(`mouse`)?new MouseEvent(t.type,t):new TouchEvent(t.type,t);t.defaultPrevented&&D(e),t.cancelBubble&&E(e),Object.assign(e,{qKeyEvent:t.qKeyEvent,qClickOutside:t.qClickOutside,qAnchorHandled:t.qAnchorHandled,qClonedBy:t.qClonedBy===void 0?[i.uid]:t.qClonedBy.concat(i.uid)}),i.initialEvent={target:t.target,event:e}}E(t)}let{left:a,top:o}=C(t);i.event={x:a,y:o,time:Date.now(),mouse:r===!0,detected:!1,isFirst:!0,isFinal:!1,lastX:a,lastY:o}},move(e){if(i.event===void 0)return;let t=C(e),a=t.left-i.event.x,o=t.top-i.event.y;if(a===0&&o===0)return;i.lastEvt=e;let s=i.event.mouse===!0,c=()=>{r(e,s);let t;!n.preserveCursor&&!n.preservecursor&&(t=document.documentElement.style.cursor||``,document.documentElement.style.cursor=`grabbing`),s&&document.body.classList.add(`no-pointer-events--children`),document.body.classList.add(`non-selectable`),xn(),i.styleCleanup=e=>{i.styleCleanup=void 0,t!==void 0&&(document.documentElement.style.cursor=t),document.body.classList.remove(`non-selectable`),s?e===void 0?ea():setTimeout(()=>{ea(),e()},50):e!==void 0&&e()}};if(i.event.detected){i.event.isFirst||r(e,i.event.mouse);let{payload:t,synthetic:n}=$i(e,i,!1);t!==void 0&&(i.handler(t)===!1?i.end(e):(i.styleCleanup===void 0&&i.event.isFirst&&c(),i.event.lastX=t.position.left,i.event.lastY=t.position.top,i.event.lastDir=n?void 0:t.direction,i.event.isFirst=!1));return}if(i.direction.all||s&&(i.modifiers.mouseAllDir||i.modifiers.mousealldir)){c(),i.event.detected=!0,i.move(e);return}let l=Math.abs(a),u=Math.abs(o);l!==u&&(i.direction.horizontal&&l>u||i.direction.vertical&&l0||i.direction.left&&l>u&&a<0||i.direction.right&&l>u&&a>0?(i.event.detected=!0,i.move(e)):i.end(e,!0))},end(t,n){if(i.event!==void 0){if(j(i,`temp`),p.is.firefox&&k(e,!1),n)i.styleCleanup?.(),!i.event.detected&&i.initialEvent!==void 0&&i.initialEvent.target.dispatchEvent(i.initialEvent.event);else if(i.event.detected){i.event.isFirst&&i.handler($i(t===void 0?i.lastEvt:t,i).payload);let{payload:e}=$i(t===void 0?i.lastEvt:t,i,!0),n=()=>{i.handler(e)};i.styleCleanup===void 0?n():i.styleCleanup(n)}i.event=void 0,i.initialEvent=void 0,i.lastEvt=void 0}}};e.__qtouchpan=i,n.mouse&&A(i,`main`,[[e,`mousedown`,`mouseStart`,`passive${n.mouseCapture||n.mousecapture?`Capture`:``}`]]),p.has.touch&&A(i,`main`,[[e,`touchstart`,`touchStart`,`passive${n.capture?`Capture`:``}`],[e,`touchmove`,`noop`,`notPassiveCapture`]])},updated(e,t){let n=e.__qtouchpan;n!==void 0&&(t.oldValue!==t.value&&(typeof value!=`function`&&n.end(),n.handler=t.value),n.direction=hi(t.modifiers))},beforeUnmount(e){let t=e.__qtouchpan;t!==void 0&&(t.event!==void 0&&t.end(),j(t,`main`),j(t,`temp`),p.is.firefox&&k(e,!1),t.styleCleanup?.(),delete e.__qtouchpan)}});let ra=e=>({value:e}),ia=({marker:t})=>(0,e.h)(`div`,{key:t.value,style:t.style,class:t.classes},t.label),aa=[34,37,40,33,39,38],oa={...Q,...ai,min:{type:Number,default:0},max:{type:Number,default:100},innerMin:Number,innerMax:Number,step:{type:Number,default:1,validator:e=>e>=0},snap:Boolean,vertical:Boolean,reverse:Boolean,color:String,markerLabelsClass:String,label:Boolean,labelColor:String,labelTextColor:String,labelAlways:Boolean,switchLabelSide:Boolean,markers:[Boolean,Number],markerLabels:[Boolean,Array,Object,Function],switchMarkerLabelsSide:Boolean,trackImg:String,trackColor:String,innerTrackImg:String,innerTrackColor:String,selectionColor:String,selectionImg:String,thumbSize:{type:String,default:`20px`},trackSize:{type:String,default:`4px`},disable:Boolean,readonly:Boolean,dense:Boolean,tabindex:[String,Number],thumbColor:String,thumbPath:{type:String,default:`M 4, 10 a 6,6 0 1,0 12,0 a 6,6 0 1,0 -12,0`}},sa=[`pan`,`update:modelValue`,`change`];function ca({updateValue:t,updatePosition:n,getDragging:r,formAttrs:i}){let{props:a,emit:o,slots:s,proxy:{$q:c}}=(0,e.getCurrentInstance)(),l=$(a,c),u=si(i),d=(0,e.ref)(!1),f=(0,e.ref)(!1),p=(0,e.ref)(!1),m=(0,e.ref)(!1),h=(0,e.computed)(()=>a.vertical?`--v`:`--h`),g=(0,e.computed)(()=>`-`+(a.switchLabelSide?`switched`:`standard`)),_=(0,e.computed)(()=>a.vertical?a.reverse:a.reverse!==(c.lang.rtl===!0)),v=(0,e.computed)(()=>!Number.isFinite(a.innerMin)||a.innerMin!Number.isFinite(a.innerMax)||a.innerMax>a.max?a.max:a.innerMax),b=(0,e.computed)(()=>!a.disable&&!a.readonly&&v.value{if(a.step===0)return e=>e;let e=(String(a.step).trim().split(`.`)[1]||``).length;return t=>Number.parseFloat(t.toFixed(e))}),S=(0,e.computed)(()=>a.step===0?1:a.step),w=(0,e.computed)(()=>b.value?a.tabindex||0:-1),T=(0,e.computed)(()=>a.max-a.min),E=(0,e.computed)(()=>y.value-v.value),D=(0,e.computed)(()=>K(v.value)),O=(0,e.computed)(()=>K(y.value)),k=(0,e.computed)(()=>a.vertical?_.value?`bottom`:`top`:_.value?`right`:`left`),A=(0,e.computed)(()=>a.vertical?`height`:`width`),j=(0,e.computed)(()=>a.vertical?`width`:`height`),M=(0,e.computed)(()=>a.vertical?`vertical`:`horizontal`),N=(0,e.computed)(()=>{let e={role:`slider`,"aria-valuemin":v.value,"aria-valuemax":y.value,"aria-orientation":M.value,"data-step":a.step};return a.disable?e[`aria-disabled`]=`true`:a.readonly&&(e[`aria-readonly`]=`true`),e}),P=(0,e.computed)(()=>`q-slider q-slider${h.value} q-slider--${d.value?``:`in`}active inline no-wrap `+(a.vertical?`row`:`column`)+(a.disable?` disabled`:` q-slider--enabled`+(b.value?` q-slider--editable`:``))+(p.value===`both`?` q-slider--focus`:``)+(a.label||a.labelAlways?` q-slider--label`:``)+(a.labelAlways?` q-slider--label-always`:``)+(l.value?` q-slider--dark`:``)+(a.dense?` q-slider--dense q-slider--dense`+h.value:``));function F(e){let t=`q-slider__`+e;return`${t} ${t}${h.value} ${t}${h.value}${g.value}`}function I(e){let t=`q-slider__`+e;return`${t} ${t}${h.value}`}let L=(0,e.computed)(()=>{let e=a.selectionColor||a.color;return`q-slider__selection absolute`+(e===void 0?``:` text-${e}`)}),R=(0,e.computed)(()=>I(`markers`)+` absolute overflow-hidden`),ee=(0,e.computed)(()=>I(`track-container`)),z=(0,e.computed)(()=>F(`pin`)),te=(0,e.computed)(()=>F(`label`)),B=(0,e.computed)(()=>F(`text-container`)),V=(0,e.computed)(()=>F(`marker-labels-container`)+(a.markerLabelsClass===void 0?``:` ${a.markerLabelsClass}`)),ne=(0,e.computed)(()=>`q-slider__track relative-position no-outline`+(a.trackColor===void 0?``:` bg-${a.trackColor}`)),H=(0,e.computed)(()=>{let e={[j.value]:a.trackSize};return a.trackImg!==void 0&&(e.backgroundImage=`url(${a.trackImg}) !important`),e}),U=(0,e.computed)(()=>`q-slider__inner absolute`+(a.innerTrackColor===void 0?``:` bg-${a.innerTrackColor}`)),W=(0,e.computed)(()=>{let e=O.value-D.value,t={[k.value]:`${100*D.value}%`,[A.value]:e===0?`2px`:`${100*e}%`};return a.innerTrackImg!==void 0&&(t.backgroundImage=`url(${a.innerTrackImg}) !important`),t});function G(e){let{min:t,max:n,step:r}=a,i=t+e*(n-t);if(r>0){let e=(i-v.value)%r;i+=(Math.abs(e)>=r/2?(e<0?-1:1)*r:0)-e}return i=x.value(i),Pe(i,v.value,y.value)}function K(e){return T.value===0?0:(e-a.min)/T.value}function q(e,t){let n=C(e),r=a.vertical?Pe((n.top-t.top)/t.height,0,1):Pe((n.left-t.left)/t.width,0,1);return Pe(_.value?1-r:r,D.value,O.value)}let re=(0,e.computed)(()=>xe(a.markers)?a.markers:S.value),ie=(0,e.computed)(()=>{let e=[],t=re.value,n=a.max,r=a.min;do e.push(r),r+=t;while(r{let e=` q-slider__marker-labels${h.value}-`;return`q-slider__marker-labels${e}${a.switchMarkerLabelsSide?`switched`:`standard`}${e}${_.value?`rtl`:`ltr`}`}),oe=(0,e.computed)(()=>a.markerLabels===!1?null:le(a.markerLabels).map((e,t)=>({index:t,value:e.value,label:e.label||e.value,classes:ae.value+(e.classes===void 0?``:` `+e.classes),style:{...ue(e.value),...e.style}}))),se=(0,e.computed)(()=>({markerList:oe.value,markerMap:de.value,classes:ae.value,getStyle:ue})),ce=(0,e.computed)(()=>{let e=E.value===0?`2px`:100*re.value/E.value;return{...W.value,backgroundSize:a.vertical?`2px ${e}%`:`${e}% 2px`}});function le(e){if(e===!1)return null;if(e===!0)return ie.value.map(ra);if(typeof e==`function`)return ie.value.map(t=>{let n=e(t);return ve(n)?{...n,value:t}:{value:t,label:n}});let t=({value:e})=>e>=a.min&&e<=a.max;return Array.isArray(e)?e.map(e=>ve(e)?e:{value:e}).filter(t):Object.keys(e).map(t=>{let n=e[t],r=Number(t);return ve(n)?{...n,value:r}:{value:r,label:n}}).filter(t)}function ue(e){return{[k.value]:`${100*(e-a.min)/T.value}%`}}let de=(0,e.computed)(()=>{if(a.markerLabels===!1)return null;let e={};return oe.value.forEach(t=>{e[t.value]=t}),e});function fe(){if(s[`marker-label-group`]!==void 0)return s[`marker-label-group`](se.value);let e=s[`marker-label`]||ia;return oe.value.map(t=>e({marker:t,...se.value}))}let pe=(0,e.computed)(()=>[[na,me,void 0,{[M.value]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]);function me(e){e.isFinal?(m.value!==void 0&&(n(e.evt),e.touch&&t(!0),m.value=void 0,o(`pan`,`end`)),d.value=!1,p.value=!1):e.isFirst?(m.value=r(e.evt),n(e.evt),t(),d.value=!0,o(`pan`,`start`)):(n(e.evt),t())}function he(){p.value=!1}function ge(e){n(e,r(e)),t(),f.value=!0,d.value=!0,document.addEventListener(`mouseup`,J,!0)}function J(){f.value=!1,d.value=!1,t(!0),he(),document.removeEventListener(`mouseup`,J,!0)}function _e(e){n(e,r(e)),t(!0)}function ye(e){aa.includes(e.keyCode)&&t(!0)}function be(e){if(a.vertical)return null;let t=c.lang.rtl===a.reverse?e:1-e;return{transform:`translateX(calc(${2*t-1} * ${a.thumbSize} / 2 + ${50-100*t}%))`}}function Se(t){let n=(0,e.computed)(()=>!f.value&&(p.value===t.focusValue||p.value===`both`)?` q-slider--focus`:``),r=(0,e.computed)(()=>`q-slider__thumb q-slider__thumb${h.value} q-slider__thumb${h.value}-${_.value?`rtl`:`ltr`} absolute non-selectable`+n.value+(t.thumbColor.value===void 0?``:` text-${t.thumbColor.value}`)),i=(0,e.computed)(()=>({width:a.thumbSize,height:a.thumbSize,[k.value]:`${100*t.ratio.value}%`,zIndex:p.value===t.focusValue?2:void 0})),o=(0,e.computed)(()=>t.labelColor.value===void 0?``:` text-${t.labelColor.value}`),s=(0,e.computed)(()=>be(t.ratio.value)),c=(0,e.computed)(()=>`q-slider__text`+(t.labelTextColor.value===void 0?``:` text-${t.labelTextColor.value}`));return()=>{let n=[(0,e.h)(`svg`,{class:`q-slider__thumb-shape absolute-full`,viewBox:`0 0 20 20`,"aria-hidden":`true`},[(0,e.h)(`path`,{d:a.thumbPath})]),(0,e.h)(`div`,{class:`q-slider__focus-ring fit`})];return(a.label||a.labelAlways)&&n.push((0,e.h)(`div`,{class:z.value+` absolute fit no-pointer-events`+o.value},[(0,e.h)(`div`,{class:te.value,style:{minWidth:a.thumbSize}},[(0,e.h)(`div`,{class:B.value,style:s.value},[(0,e.h)(`span`,{class:c.value},t.label.value)])])])),t.injectFormInput!==!1&&a.name!==void 0&&!a.disable&&u(n,`push`),(0,e.h)(`div`,{class:r.value,style:i.value,...t.getNodeData()},n)}}function Ce(t,n,r,i){let o=[];a.innerTrackColor!==`transparent`&&o.push((0,e.h)(`div`,{key:`inner`,class:U.value,style:W.value})),a.selectionColor!==`transparent`&&o.push((0,e.h)(`div`,{key:`selection`,class:L.value,style:t.value})),a.markers!==!1&&o.push((0,e.h)(`div`,{key:`marker`,class:R.value,style:ce.value})),i(o);let s=[$e(`div`,{key:`trackC`,class:ee.value,tabindex:n.value,...r.value},[(0,e.h)(`div`,{class:ne.value,style:H.value},o)],`slide`,b.value,()=>pe.value)];return a.markerLabels!==!1&&s[a.switchMarkerLabelsSide?`unshift`:`push`]((0,e.h)(`div`,{key:`markerL`,class:V.value},fe())),s}return(0,e.onBeforeUnmount)(()=>{document.removeEventListener(`mouseup`,J,!0)}),{state:{active:d,focus:p,preventFocus:f,dragging:m,editable:b,classes:P,tabindex:w,attributes:N,roundValueFn:x,keyStep:S,trackLen:T,innerMin:v,innerMinRatio:D,innerMax:y,innerMaxRatio:O,positionProp:k,sizeProp:A,isReversed:_},methods:{onActivate:ge,onMobileClick:_e,onBlur:he,onKeyup:ye,getContent:Ce,getThumbRenderFn:Se,convertRatioToModel:G,convertModelToRatio:K,getDraggingRatio:q}}}let la=()=>({});var ua=h({name:`QSlider`,props:{...oa,modelValue:{required:!0,default:null,validator:e=>typeof e==`number`||e===null},labelValue:[String,Number]},emits:sa,setup(t,{emit:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),{state:i,methods:a}=ca({updateValue:h,updatePosition:_,getDragging:g,formAttrs:oi(t)}),o=(0,e.ref)(null),s=(0,e.ref)(0),c=(0,e.ref)(0);function l(){c.value=t.modelValue===null?i.innerMin.value:Pe(t.modelValue,i.innerMin.value,i.innerMax.value)}(0,e.watch)(()=>`${t.modelValue}|${i.innerMin.value}|${i.innerMax.value}`,l,{immediate:!0});let u=(0,e.computed)(()=>a.convertModelToRatio(c.value)),d=(0,e.computed)(()=>i.active.value?s.value:u.value),f=(0,e.computed)(()=>{let e={[i.positionProp.value]:`${100*i.innerMinRatio.value}%`,[i.sizeProp.value]:`${100*(d.value-i.innerMinRatio.value)}%`};return t.selectionImg!==void 0&&(e.backgroundImage=`url(${t.selectionImg}) !important`),e}),p=a.getThumbRenderFn({focusValue:!0,getNodeData:la,ratio:d,label:(0,e.computed)(()=>t.labelValue===void 0?c.value:t.labelValue),thumbColor:(0,e.computed)(()=>t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.labelColor),labelTextColor:(0,e.computed)(()=>t.labelTextColor)}),m=(0,e.computed)(()=>i.editable.value?r.platform.is.mobile?{onClick:a.onMobileClick}:{onMousedown:a.onActivate,onFocus:v,onBlur:a.onBlur,onKeydown:y,onKeyup:a.onKeyup}:{});function h(e){c.value!==t.modelValue&&n(`update:modelValue`,c.value),e&&n(`change`,c.value)}function g(){return o.value.getBoundingClientRect()}function _(e,n=i.dragging.value){let r=a.getDraggingRatio(e,n);c.value=a.convertRatioToModel(r),s.value=!t.snap||t.step===0?r:a.convertModelToRatio(c.value)}function v(){i.focus.value=!0}function y(e){if(!aa.includes(e.keyCode))return;O(e);let n=([34,33].includes(e.keyCode)?10:1)*i.keyStep.value,r=([34,37,40].includes(e.keyCode)?-1:1)*(i.isReversed.value?-1:1)*(t.vertical?-1:1)*n;c.value=Pe(i.roundValueFn.value(c.value+r),i.innerMin.value,i.innerMax.value),h()}return()=>{let n=a.getContent(f,i.tabindex,m,e=>{e.push(p())});return(0,e.h)(`div`,{ref:o,class:i.classes.value+(t.modelValue===null?` q-slider--no-value`:``),...i.attributes.value,"aria-valuenow":t.modelValue},n)}}});function da(){let t=(0,e.ref)(!a.value);return t.value||(0,e.onMounted)(()=>{t.value=!0}),{isHydrated:t}}let fa=typeof ResizeObserver<`u`,pa=fa?{}:{style:`display:block;position:absolute;top:0;left:0;right:0;bottom:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1;`,url:`about:blank`};var ma=h({name:`QResizeObserver`,props:{debounce:{type:[String,Number],default:100}},emits:[`resize`],setup(t,{emit:n}){let r=null,i,a={width:-1,height:-1};function o(e){e===!0||t.debounce===0||t.debounce===`0`?s():r===null&&(r=setTimeout(s,t.debounce))}function s(){if(r!==null&&(clearTimeout(r),r=null),i){let{offsetWidth:e,offsetHeight:t}=i;(e!==a.width||t!==a.height)&&(a={width:e,height:t},n(`resize`,a))}}let{proxy:c}=(0,e.getCurrentInstance)();if(c.trigger=o,fa){let t,n=!1,a=r=>{n||(i=c.$el.parentNode,i?(t=new ResizeObserver(o),t.observe(i),s()):r||(0,e.nextTick)(()=>{a(!0)}))};return(0,e.onMounted)(()=>{a()}),(0,e.onBeforeUnmount)(()=>{n=!0,r!==null&&clearTimeout(r),t!==void 0&&(t.disconnect===void 0?i&&t.unobserve(i):t.disconnect())}),y}let{isHydrated:l}=da(),u,d=!1,f=()=>{r!==null&&(clearTimeout(r),r=null),u!==void 0&&(u.removeEventListener!==void 0&&u.removeEventListener(`resize`,o,v.passive),u=void 0)},p=()=>{f(),i?.contentDocument&&(u=i.contentDocument.defaultView,u.addEventListener(`resize`,o,v.passive),s())};return(0,e.onMounted)(()=>{(0,e.nextTick)(()=>{d||(i=c.$el,i&&p())})}),(0,e.onBeforeUnmount)(()=>{d=!0,f()}),()=>{if(l.value)return(0,e.h)(`object`,{class:`q--avoid-card-border`,style:pa.style,tabindex:-1,type:`text/html`,data:pa.url,"aria-hidden":`true`,onLoad:p})}}});let ha=!1;{let e=document.createElement(`div`);e.setAttribute(`dir`,`rtl`),Object.assign(e.style,{width:`1px`,height:`1px`,overflow:`auto`});let t=document.createElement(`div`);Object.assign(t.style,{width:`1000px`,height:`1px`}),document.body.append(e),e.append(t),e.scrollLeft=-1e3,ha=e.scrollLeft>=0,e.remove()}function ga(e,t,n){let r=n?[`left`,`right`]:[`top`,`bottom`];return`absolute-${t?r[0]:r[1]}${e?` text-${e}`:``}`}function _a(e,t){for(let n in e)if(e[n]!==t[n])return!1;return!0}let va=[`left`,`center`,`right`,`justify`];var ya=h({name:`QTabs`,props:{modelValue:[Number,String],align:{type:String,default:`center`,validator:e=>va.includes(e)},breakpoint:{type:[String,Number],default:600},vertical:Boolean,shrink:Boolean,stretch:Boolean,activeClass:String,activeColor:String,activeBgColor:String,indicatorColor:String,leftIcon:String,rightIcon:String,outsideArrows:Boolean,mobileArrows:Boolean,switchIndicator:Boolean,narrowIndicator:Boolean,inlineLabel:Boolean,noCaps:Boolean,dense:Boolean,contentClass:String,"onUpdate:modelValue":[Function,Array]},setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,{registerTick:o}=Qn(),{registerTick:s}=Qn(),{registerTick:c}=Qn(),{registerTimeout:l,removeTimeout:u}=$n(),{registerTimeout:d,removeTimeout:f}=$n(),p=(0,e.ref)(null),m=(0,e.ref)(null),h=(0,e.ref)(t.modelValue),g=(0,e.ref)(!1),_=(0,e.ref)(!0),v=(0,e.ref)(!1),y=(0,e.ref)(!1),b=[],x=(0,e.ref)(0),S=(0,e.ref)(!1),C=null,w=null,T,E=(0,e.computed)(()=>({activeClass:t.activeClass,activeColor:t.activeColor,activeBgColor:t.activeBgColor,indicatorClass:ga(t.indicatorColor,t.switchIndicator,t.vertical),narrowIndicator:t.narrowIndicator,inlineLabel:t.inlineLabel,noCaps:t.noCaps})),D=(0,e.computed)(()=>{let e=x.value,t=h.value;for(let n=0;n`q-tabs__content--align-${g.value?`left`:y.value?`justify`:t.align}`),k=(0,e.computed)(()=>`q-tabs row no-wrap items-center q-tabs--${g.value?``:`not-`}scrollable q-tabs--${t.vertical?`vertical`:`horizontal`} q-tabs__arrows--${t.outsideArrows?`outside`:`inside`} q-tabs--mobile-with${t.mobileArrows?``:`out`}-arrows`+(t.dense?` q-tabs--dense`:``)+(t.shrink?` col-shrink`:``)+(t.stretch?` self-stretch`:``)),A=(0,e.computed)(()=>`q-tabs__content scroll--mobile row no-wrap items-center self-stretch hide-scrollbar relative-position `+O.value+(t.contentClass===void 0?``:` ${t.contentClass}`)),j=(0,e.computed)(()=>t.vertical?{container:`height`,content:`offsetHeight`,scroll:`scrollHeight`}:{container:`width`,content:`offsetWidth`,scroll:`scrollWidth`}),M=(0,e.computed)(()=>!t.vertical&&a.lang.rtl===!0),N=(0,e.computed)(()=>!ha&&M.value);(0,e.watch)(M,ee),(0,e.watch)(()=>t.modelValue,e=>{P({name:e,setCurrent:!0,skipEmit:!0})}),(0,e.watch)(()=>t.outsideArrows,F);function P({name:e,setCurrent:n,skipEmit:i}){h.value!==e&&(!i&&t[`onUpdate:modelValue`]!==void 0&&r(`update:modelValue`,e),(n||t[`onUpdate:modelValue`]===void 0)&&(L(h.value,e),h.value=e))}function F(){o(()=>{p.value&&I({width:p.value.offsetWidth,height:p.value.offsetHeight})})}function I(e){if(j.value===void 0||m.value===null)return;let n=e[j.value.container],r=Math.min(m.value[j.value.scroll],Array.prototype.reduce.call(m.value.children,(e,t)=>e+(t[j.value.content]||0),0)),i=n>0&&r>n;g.value=i,i&&s(ee),y.value=nt.name.value===e):null,i=n!=null&&n!==``?b.find(e=>e.name.value===n):null;if(le)le=!1;else if(r&&i){let e=r.tabIndicatorRef.value,n=i.tabIndicatorRef.value;C!==null&&(clearTimeout(C),C=null),e.style.transition=`none`,e.style.transform=`none`,n.style.transition=`none`,n.style.transform=`none`;let a=e.getBoundingClientRect(),o=n.getBoundingClientRect();n.style.transform=t.vertical?`translate3d(0,${a.top-o.top}px,0) scale3d(1,${o.height?a.height/o.height:1},1)`:`translate3d(${a.left-o.left}px,0,0) scale3d(${o.width?a.width/o.width:1},1,1)`,c(()=>{C=setTimeout(()=>{C=null,n.style.transition=`transform .25s cubic-bezier(.4, 0, .2, 1)`,n.style.transform=`none`},70)})}i&&g.value&&R(i.rootRef.value)}function R(e){let{left:n,width:r,top:i,height:a}=m.value.getBoundingClientRect(),o=e.getBoundingClientRect(),s=t.vertical?o.top-i:o.left-n;if(s<0){m.value[t.vertical?`scrollTop`:`scrollLeft`]+=Math.floor(s),ee();return}s+=t.vertical?o.height-a:o.width-r,s>0&&(m.value[t.vertical?`scrollTop`:`scrollLeft`]+=Math.ceil(s),ee())}function ee(){let e=m.value;if(e===null)return;let n=e.getBoundingClientRect(),r=t.vertical?e.scrollTop:Math.abs(e.scrollLeft);M.value?(_.value=Math.ceil(r+n.width)0):(_.value=r>0,v.value=t.vertical?Math.ceil(r+n.height){U(e)&&V()},5)}function te(){z(N.value?2**53-1:0)}function B(){z(N.value?0:2**53-1)}function V(){w!==null&&(clearInterval(w),w=null)}function ne(e,n){let r=Array.prototype.filter.call(m.value.children,e=>e===n||e.matches?.(`.q-tab.q-focusable`)),i=r.length;if(i===0)return;if(e===36)return R(r[0]),r[0].focus(),!0;if(e===35)return R(r[i-1]),r[i-1].focus(),!0;let a=e===(t.vertical?38:37),o=e===(t.vertical?40:39),s=a?-1:o?1:void 0;if(s!==void 0){let e=t.vertical!==!0&&M.value?-1:1,a=(r.indexOf(n)+s*e+i)%i;return R(r[a]),r[a].focus({preventScroll:!0}),!0}}let H=(0,e.computed)(()=>N.value?{get:e=>Math.abs(e.scrollLeft),set:(e,t)=>{e.scrollLeft=-t}}:t.vertical?{get:e=>e.scrollTop,set:(e,t)=>{e.scrollTop=t}}:{get:e=>e.scrollLeft,set:(e,t)=>{e.scrollLeft=t}});function U(e){let t=m.value,{get:n,set:r}=H.value,i=!1,a=n(t),o=e=e)&&(i=!0,a=e),r(t,a),ee(),i}function W(){let e=null,t={matchedLen:0,queryDiff:9999,hrefLen:0},n=b.filter(e=>e.routeData?.hasRouterLink.value===!0),{hash:r,query:a}=i.$route,o=Object.keys(a).length;for(let i of n){let n=i.routeData.exact.value===!0;if(!i.routeData[n?`linkIsExactActive`:`linkIsActive`].value)continue;let{hash:s,query:c,matched:l,href:u}=i.routeData.resolvedLink.value,d=Object.keys(c).length;if(n){if(s!==r||d!==o||!_a(a,c))continue;e=i.name.value;break}if(s!==``&&s!==r||d!==0&&!_a(c,a))continue;let f={matchedLen:l.length,queryDiff:o-d,hrefLen:u.length-s.length};if(f.matchedLen>t.matchedLen){e=i.name.value,t=f;continue}else if(f.matchedLen!==t.matchedLen)continue;if(f.queryDifft.hrefLen&&(e=i.name.value,t=f)}if(e===null&&b.some(e=>e.routeData===void 0&&e.name.value===h.value)){le=!1;return}P({name:e,setCurrent:!0})}function G(e){if(u(),!S.value&&p.value!==null&&e.target&&typeof e.target.closest==`function`){let t=e.target.closest(`.q-tab`);t&&p.value.contains(t)&&(S.value=!0,g.value&&R(t))}}function K(){l(()=>{S.value=!1},30)}function q(){oe.avoidRouteWatcher===!1?d(W):f()}function re(){if(T===void 0){let t=(0,e.watch)(()=>i.$route.fullPath,q);T=()=>{t(),T=void 0}}}function ie(e){b.push(e),x.value++,F(),e.routeData===void 0||i.$route===void 0?d(()=>{if(g.value){let e=h.value,t=e!=null&&e!==``?b.find(t=>t.name.value===e):null;t&&R(t.rootRef.value)}}):(re(),e.routeData.hasRouterLink.value&&q())}function ae(e){b.splice(b.indexOf(e),1),x.value--,F(),T!==void 0&&e.routeData!==void 0&&(b.every(e=>e.routeData===void 0)&&T(),q())}let oe={currentModel:h,tabProps:E,hasFocus:S,hasActiveTab:D,registerTab:ie,unregisterTab:ae,verifyRouteModel:q,updateModel:P,onKbdNavigate:ne,avoidRouteWatcher:!1};(0,e.provide)(he,oe);function se(){C!==null&&clearTimeout(C),V(),T?.()}let ce=!1,le=!1;return(0,e.onBeforeUnmount)(se),(0,e.onDeactivated)(()=>{ce=T!==void 0,se()}),(0,e.onActivated)(()=>{ce&&(re(),le=!0,q()),F()}),()=>(0,e.h)(`div`,{ref:p,class:k.value,role:`tablist`,"aria-orientation":t.vertical?`vertical`:`horizontal`,onFocusin:G,onFocusout:K},[(0,e.h)(ma,{onResize:I}),(0,e.h)(`div`,{ref:m,class:A.value,onScroll:ee},X(n.default)),(0,e.h)(Z,{class:`q-tabs__arrow q-tabs__arrow--left absolute q-tab__icon`+(_.value?``:` q-tabs__arrow--faded`),name:t.leftIcon||a.iconSet.tabs[t.vertical?`up`:`left`],onMousedownPassive:te,onTouchstartPassive:te,onMouseupPassive:V,onMouseleavePassive:V,onTouchendPassive:V}),(0,e.h)(Z,{class:`q-tabs__arrow q-tabs__arrow--right absolute q-tab__icon`+(v.value?``:` q-tabs__arrow--faded`),name:t.rightIcon||a.iconSet.tabs[t.vertical?`down`:`right`],onMousedownPassive:B,onTouchstartPassive:B,onMouseupPassive:V,onMouseleavePassive:V,onTouchendPassive:V})])}});let ba=0,xa=[`click`,`keydown`],Sa={icon:String,label:[Number,String],alert:[Boolean,String],alertIcon:String,name:{type:[Number,String],default:()=>`t_${ba++}`},noCaps:Boolean,tabindex:[String,Number],disable:Boolean,contentClass:String,ripple:{type:[Boolean,Object],default:!0}};function Ca(t,n,r,i){let a=(0,e.inject)(he,J);if(a===J)return console.error(`QTab/QRouteTab component needs to be child of QTabs`),J;let{proxy:o}=(0,e.getCurrentInstance)(),s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.ref)(null),u=(0,e.computed)(()=>t.disable||t.ripple===!1?!1:{keyCodes:[13,32],early:!0,...t.ripple===!0?{}:t.ripple}),d=(0,e.computed)(()=>a.currentModel.value===t.name),f=(0,e.computed)(()=>`q-tab relative-position self-stretch flex flex-center text-center`+(d.value?` q-tab--active`+(a.tabProps.value.activeClass?` `+a.tabProps.value.activeClass:``)+(a.tabProps.value.activeColor?` text-${a.tabProps.value.activeColor}`:``)+(a.tabProps.value.activeBgColor?` bg-${a.tabProps.value.activeBgColor}`:``):` q-tab--inactive`)+(t.icon&&t.label&&!a.tabProps.value.inlineLabel?` q-tab--full`:``)+(t.noCaps||a.tabProps.value.noCaps?` q-tab--no-caps`:``)+(t.disable?` disabled`:` q-focusable q-hoverable cursor-pointer`)+(i===void 0?``:i.linkClass.value)),p=(0,e.computed)(()=>`q-tab__content self-stretch flex-center relative-position q-anchor--skip non-selectable `+(a.tabProps.value.inlineLabel?`row no-wrap q-tab__content--inline`:`column`)+(t.contentClass===void 0?``:` ${t.contentClass}`)),m=(0,e.computed)(()=>t.disable||a.hasFocus.value||!d.value&&a.hasActiveTab.value?-1:t.tabindex||0);function h(e,n){if(!n&&!e?.qAvoidFocus&&s.value?.focus(),t.disable){i?.hasRouterLink.value===!0&&O(e);return}if(i===void 0){a.updateModel({name:t.name}),r(`click`,e);return}if(i.hasRouterLink.value){let n=(n={})=>{let r,o=n.to===void 0||_e(n.to,t.to)?a.avoidRouteWatcher=Qr():null;return i.navigateToRouterLink(e,{...n,returnRouterError:!0}).catch(e=>{r=e}).then(e=>{if(o===a.avoidRouteWatcher&&(a.avoidRouteWatcher=!1,r===void 0&&(e===void 0||e.message?.startsWith(`Avoided redundant navigation`)===!0)&&a.updateModel({name:t.name})),n.returnRouterError)return r===void 0?e:Promise.reject(r)})};r(`click`,e,n),e.defaultPrevented||n();return}r(`click`,e)}function g(e){B(e,[13,32])?h(e,!0):!te(e)&&e.keyCode>=35&&e.keyCode<=40&&!e.altKey&&!e.metaKey&&a.onKbdNavigate(e.keyCode,o.$el)&&O(e),r(`keydown`,e)}function _(){let r=a.tabProps.value.narrowIndicator,i=[],o=(0,e.h)(`div`,{ref:l,class:[`q-tab__indicator`,a.tabProps.value.indicatorClass]});t.icon!==void 0&&i.push((0,e.h)(Z,{class:`q-tab__icon`,name:t.icon})),t.label!==void 0&&i.push((0,e.h)(`div`,{class:`q-tab__label`},t.label)),t.alert&&i.push(t.alertIcon===void 0?(0,e.h)(`div`,{class:`q-tab__alert`+(t.alert===!0?``:` text-${t.alert}`)}):(0,e.h)(Z,{class:`q-tab__alert-icon`,color:t.alert===!0?void 0:t.alert,name:t.alertIcon})),r&&i.push(o);let c=[(0,e.h)(`div`,{class:`q-focus-helper`,tabindex:-1,ref:s}),(0,e.h)(`div`,{class:p.value},Ze(n.default,i))];return r||c.push(o),c}let v={name:(0,e.computed)(()=>t.name),rootRef:c,tabIndicatorRef:l,routeData:i};(0,e.onBeforeUnmount)(()=>{a.unregisterTab(v)}),(0,e.onMounted)(()=>{a.registerTab(v)});function y(n,r){return(0,e.withDirectives)((0,e.h)(n,{ref:c,class:f.value,tabindex:m.value,role:`tab`,"aria-selected":d.value?`true`:`false`,"aria-disabled":t.disable?`true`:void 0,onClick:h,onKeydown:g,...r},_()),[[nn,u.value]])}return{renderTab:y,$tabs:a}}var wa=h({name:`QTab`,props:Sa,emits:xa,setup(e,{slots:t,emit:n}){let{renderTab:r}=Ca(e,t,n);return()=>r(`div`)}}),Ta=h({name:`QTabPanels`,props:{...wi,...Q},emits:Ti,setup(t,{slots:n}){let r=$(t,(0,e.getCurrentInstance)().proxy.$q),{updatePanelsList:i,getPanelContent:a,panelDirectives:o}=Di(),s=(0,e.computed)(()=>`q-tab-panels q-panel-parent`+(r.value?` q-tab-panels--dark q-dark`:``));return()=>(i(n),$e(`div`,{class:s.value},a(),`pan`,t.swipeable,()=>o.value))}}),Ea=h({name:`QTabPanel`,props:Si,setup(t,{slots:n}){return()=>(0,e.h)(`div`,{class:`q-tab-panel`,role:`tabpanel`},X(n.default))}});let Da=/^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/,Oa=/^#[0-9a-fA-F]{4}([0-9a-fA-F]{4})?$/,ka=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,Aa=/^rgb\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5])\)$/,ja=/^rgba\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),(0|0\.[0-9]+[1-9]|0\.[1-9]+|1)\)$/,Ma=/^-?[\d]+\/[0-1]\d\/[0-3]\d$/,Na=/^([0-1]?\d|2[0-3]):[0-5]\d$/,Pa=/^([0-1]?\d|2[0-3]):[0-5]\d:[0-5]\d$/,Fa=/^([0-1]?\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/,Ia=/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,La={date:e=>Ma.test(e),time:e=>Na.test(e),fulltime:e=>Pa.test(e),timeOrFulltime:e=>Fa.test(e),email:e=>Ia.test(e),hexColor:e=>Da.test(e),hexaColor:e=>Oa.test(e),hexOrHexaColor:e=>ka.test(e),rgbColor:e=>Aa.test(e),rgbaColor:e=>ja.test(e),rgbOrRgbaColor:e=>Aa.test(e)||ja.test(e),hexOrRgbColor:e=>Da.test(e)||Aa.test(e),hexaOrRgbaColor:e=>Oa.test(e)||ja.test(e),anyColor:e=>ka.test(e)||Aa.test(e)||ja.test(e)};var Ra={testPattern:La};let za=/^rgb(a)?\((\d{1,3}),(\d{1,3}),(\d{1,3}),?([01]?\.?\d*?)?\)$/;function Ba({r:e,g:t,b:n,a:r}){let i=r!==void 0;if(e=Math.round(e),t=Math.round(t),n=Math.round(n),e>255||t>255||n>255||i&&r>100)throw TypeError(`Expected 3 numbers below 256 (and optionally one below 100)`);return r=i?(Math.round(255*r/100)|256).toString(16).slice(1):``,`#`+(n|t<<8|e<<16|1<<24).toString(16).slice(1)+r}function Va({r:e,g:t,b:n,a:r}){return`rgb${r===void 0?``:`a`}(${e},${t},${n}${r===void 0?``:`,`+r/100})`}function Ha(e){if(typeof e!=`string`)throw TypeError(`Expected a string`);e=e.replace(/^#/,``),e.length===3?e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]:e.length===4&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]+e[3]+e[3]);let t=Number.parseInt(e,16);return e.length>6?{r:t>>24&255,g:t>>16&255,b:t>>8&255,a:Math.round((t&255)/2.55)}:{r:t>>16,g:t>>8&255,b:t&255}}function Ua({h:e,s:t,v:n,a:r}){let i,a,o;t/=100,n/=100,e/=360;let s=Math.floor(e*6),c=e*6-s,l=n*(1-t),u=n*(1-c*t),d=n*(1-(1-c)*t);switch(s%6){case 0:i=n,a=d,o=l;break;case 1:i=u,a=n,o=l;break;case 2:i=l,a=n,o=d;break;case 3:i=l,a=u,o=n;break;case 4:i=d,a=l,o=n;break;case 5:i=n,a=l,o=u;break}return{r:Math.round(i*255),g:Math.round(a*255),b:Math.round(o*255),a:r}}function Wa({r:e,g:t,b:n,a:r}){let i=Math.max(e,t,n),a=Math.min(e,t,n),o=i-a,s=i===0?0:o/i,c=i/255,l;switch(i){case a:l=0;break;case e:l=t-n+o*(t1)throw TypeError(`Expected offset to be between -1 and 1`);let{r:n,g:r,b:i,a}=Ga(e),o=a===void 0?0:a/100;return Ba({r:n,g:r,b:i,a:Math.round(Math.min(1,Math.max(0,o+t))*100)})}function Za(e){if(typeof e!=`string`)throw TypeError(`Expected a string as color`);let t=document.createElement(`div`);t.className=`text-${e} invisible fixed no-pointer-events`,document.body.append(t);let n=getComputedStyle(t).getPropertyValue(`color`);return t.remove(),Ba(Ga(n))}var Qa={rgbToHex:Ba,hexToRgb:Ha,hsvToRgb:Ua,rgbToHsv:Wa,textToRgb:Ga,lighten:Ka,luminosity:qa,brightness:Ja,blend:Ya,changeAlpha:Xa,getPaletteColor:Za};let $a=`rgb(255,204,204).rgb(255,230,204).rgb(255,255,204).rgb(204,255,204).rgb(204,255,230).rgb(204,255,255).rgb(204,230,255).rgb(204,204,255).rgb(230,204,255).rgb(255,204,255).rgb(255,153,153).rgb(255,204,153).rgb(255,255,153).rgb(153,255,153).rgb(153,255,204).rgb(153,255,255).rgb(153,204,255).rgb(153,153,255).rgb(204,153,255).rgb(255,153,255).rgb(255,102,102).rgb(255,179,102).rgb(255,255,102).rgb(102,255,102).rgb(102,255,179).rgb(102,255,255).rgb(102,179,255).rgb(102,102,255).rgb(179,102,255).rgb(255,102,255).rgb(255,51,51).rgb(255,153,51).rgb(255,255,51).rgb(51,255,51).rgb(51,255,153).rgb(51,255,255).rgb(51,153,255).rgb(51,51,255).rgb(153,51,255).rgb(255,51,255).rgb(255,0,0).rgb(255,128,0).rgb(255,255,0).rgb(0,255,0).rgb(0,255,128).rgb(0,255,255).rgb(0,128,255).rgb(0,0,255).rgb(128,0,255).rgb(255,0,255).rgb(245,0,0).rgb(245,123,0).rgb(245,245,0).rgb(0,245,0).rgb(0,245,123).rgb(0,245,245).rgb(0,123,245).rgb(0,0,245).rgb(123,0,245).rgb(245,0,245).rgb(214,0,0).rgb(214,108,0).rgb(214,214,0).rgb(0,214,0).rgb(0,214,108).rgb(0,214,214).rgb(0,108,214).rgb(0,0,214).rgb(108,0,214).rgb(214,0,214).rgb(163,0,0).rgb(163,82,0).rgb(163,163,0).rgb(0,163,0).rgb(0,163,82).rgb(0,163,163).rgb(0,82,163).rgb(0,0,163).rgb(82,0,163).rgb(163,0,163).rgb(92,0,0).rgb(92,46,0).rgb(92,92,0).rgb(0,92,0).rgb(0,92,46).rgb(0,92,92).rgb(0,46,92).rgb(0,0,92).rgb(46,0,92).rgb(92,0,92).rgb(255,255,255).rgb(205,205,205).rgb(178,178,178).rgb(153,153,153).rgb(127,127,127).rgb(102,102,102).rgb(76,76,76).rgb(51,51,51).rgb(25,25,25).rgb(0,0,0)`.split(`.`),eo=`M5 5 h10 v10 h-10 v-10 z`,to=/^[0-9]+$/,no=/^#[0-9A-Fa-f]+$/,ro=/^rgb\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3}\)$/,io=/^rgba\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},(0|0\.[0-9]+[1-9]|0\.[1-9]+|1)\)$/;var ao=h({name:`QColor`,props:{...Q,...ai,modelValue:String,defaultValue:String,defaultView:{type:String,default:`spectrum`,validator:e=>[`spectrum`,`tune`,`palette`].includes(e)},formatModel:{type:String,default:`auto`,validator:e=>[`auto`,`hex`,`rgb`,`hexa`,`rgba`].includes(e)},palette:Array,noHeader:Boolean,noHeaderTabs:Boolean,noFooter:Boolean,square:Boolean,flat:Boolean,bordered:Boolean,disable:Boolean,readonly:Boolean},emits:[`update:modelValue`,`change`],setup(t,{emit:n}){let{proxy:r}=(0,e.getCurrentInstance)(),{$q:i}=r,a=$(t,i),{getCache:o}=xi(),s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.computed)(()=>t.formatModel===`auto`?null:t.formatModel.includes(`hex`)),u=(0,e.computed)(()=>t.formatModel===`auto`?null:t.formatModel.includes(`a`)),d=(0,e.ref)(t.formatModel===`auto`?t.modelValue===void 0||t.modelValue===null||t.modelValue===``||t.modelValue.startsWith(`#`)?`hex`:`rgb`:t.formatModel.startsWith(`hex`)?`hex`:`rgb`),f=(0,e.ref)(t.defaultView),p=(0,e.ref)(k(t.modelValue||t.defaultValue)),m=(0,e.computed)(()=>!t.disable&&!t.readonly),h=(0,e.computed)(()=>t.modelValue===void 0||t.modelValue===null||t.modelValue===``||t.modelValue.startsWith(`#`)),g=(0,e.computed)(()=>l.value===null?h.value:l.value),_=si((0,e.computed)(()=>({type:`hidden`,name:t.name,value:p.value[g.value?`hex`:`rgb`]}))),v=(0,e.computed)(()=>u.value===null?p.value.a!==void 0:u.value),y=(0,e.computed)(()=>({backgroundColor:p.value.rgb||`#000`})),b=(0,e.computed)(()=>`q-color-picker__header-content q-color-picker__header-content--${p.value.a!==void 0&&p.value.a<65||qa(p.value)>.4?`light`:`dark`}`),x=(0,e.computed)(()=>({background:`hsl(${p.value.h},100%,50%)`})),S=(0,e.computed)(()=>({top:`${100-p.value.v}%`,[i.lang.rtl?`right`:`left`]:`${p.value.s}%`})),C=(0,e.computed)(()=>t.palette!==void 0&&t.palette.length!==0?t.palette:$a),w=(0,e.computed)(()=>`q-color-picker`+(t.bordered?` q-color-picker--bordered`:``)+(t.square?` q-color-picker--square no-border-radius`:``)+(t.flat?` q-color-picker--flat no-shadow`:``)+(t.disable?` disabled`:``)+(a.value?` q-color-picker--dark q-dark`:``)),T=(0,e.computed)(()=>t.disable?{"aria-disabled":`true`}:{}),D=(0,e.computed)(()=>[[na,I,void 0,{prevent:!0,stop:!0,mouse:!0}]]);(0,e.watch)(()=>t.modelValue,e=>{let n=k(e||t.defaultValue);n.hex!==p.value.hex&&(p.value=n)}),(0,e.watch)(()=>t.defaultValue,e=>{if(!t.modelValue&&e){let t=k(e);t.hex!==p.value.hex&&(p.value=t)}});function O(e,t){p.value.hex=Ba(e),p.value.rgb=Va(e),p.value.r=e.r,p.value.g=e.g,p.value.b=e.b,p.value.a=e.a;let r=p.value[g.value?`hex`:`rgb`];n(`update:modelValue`,r),t&&n(`change`,r)}function k(e){let n=u.value===void 0?t.formatModel===`auto`?null:t.formatModel.includes(`a`):u.value;if(typeof e!=`string`||e.length===0||!La.anyColor(e.replaceAll(` `,``)))return{h:0,s:0,v:0,r:0,g:0,b:0,a:n?100:void 0,hex:void 0,rgb:void 0};let r=Ga(e);return n&&r.a===void 0&&(r.a=100),r.hex=Ba(r),r.rgb=Va(r),Object.assign(r,Wa(r))}function A(e,t,n){let r=s.value;if(r===null)return;let a=r.clientWidth,o=r.clientHeight,c=r.getBoundingClientRect(),l=Math.min(a,Math.max(0,e-c.left));i.lang.rtl&&(l=a-l);let u=Math.min(o,Math.max(0,t-c.top)),d=Math.round(100*l/a),f=Math.round(100*Math.max(0,Math.min(1,-(u/o)+1))),m=Ua({h:p.value.h,s:d,v:f,a:v.value?p.value.a:void 0});p.value.s=d,p.value.v=f,O(m,n)}function j(e,t){let n=Math.round(e),r=Ua({h:n,s:p.value.s,v:p.value.v,a:v.value?p.value.a:void 0});p.value.h=n,O(r,t)}function M(e){j(e,!0)}function N(t,n,i,a,o){if(a!==void 0&&E(a),!to.test(t)){o&&r.$forceUpdate();return}let s=Math.floor(Number(t));if(s<0||s>i){o&&r.$forceUpdate();return}let c={r:n===`r`?s:p.value.r,g:n===`g`?s:p.value.g,b:n===`b`?s:p.value.b,a:v.value?n===`a`?s:p.value.a:void 0};if(n!==`a`){let e=Wa(c);p.value.h=e.h,p.value.s=e.s,p.value.v=e.v}if(O(c,o),!o&&a?.target.selectionEnd!==void 0){let t=a.target.selectionEnd;(0,e.nextTick)(()=>{a.target.setSelectionRange(t,t)})}}function P(t,n){let r,i=t.target.value;if(E(t),d.value===`hex`){if(i.length!==(v.value?9:7)||!no.test(i))return!0;r=Ha(i)}else{let e;if(!i.endsWith(`)`))return!0;if(!v.value&&i.startsWith(`rgb(`)){if(e=i.slice(4,-1).split(`,`).map(e=>Number.parseInt(e,10)),e.length!==3||!ro.test(i))return!0}else if(v.value&&i.startsWith(`rgba(`)){if(e=i.slice(5,-1).split(`,`),e.length!==4||!io.test(i))return!0;for(let t=0;t<3;t++){let n=Number.parseInt(e[t],10);if(n<0||n>255)return!0;e[t]=n}let t=Number.parseFloat(e[3]);if(t<0||t>1)return!0;e[3]=t}else return!0;if(e[0]<0||e[0]>255||e[1]<0||e[1]>255||e[2]<0||e[2]>255||v.value&&(e[3]<0||e[3]>1))return!0;r={r:e[0],g:e[1],b:e[2],a:v.value?e[3]*100:void 0}}let a=Wa(r);if(p.value.h=a.h,p.value.s=a.s,p.value.v=a.v,O(r,n),!n){let n=t.target.selectionEnd;(0,e.nextTick)(()=>{t.target.setSelectionRange(n,n)})}}function F(e){let t=k(e),n={r:t.r,g:t.g,b:t.b,a:t.a};n.a===void 0&&(n.a=p.value.a),p.value.h=t.h,p.value.s=t.s,p.value.v=t.v,O(n,!0)}function I(e){e.isFinal?A(e.position.left,e.position.top,!0):L(e)}let L=$t(e=>{A(e.position.left,e.position.top)},20);function R(e){A(e.pageX-window.pageXOffset,e.pageY-window.pageYOffset,!0)}function ee(e){A(e.pageX-window.pageXOffset,e.pageY-window.pageYOffset)}function z(e){c.value!==null&&(c.value.$el.style.opacity=+!!e)}function te(e){d.value=e}function B(){let n=[];return t.noHeaderTabs||n.push((0,e.h)(ya,{class:`q-color-picker__header-tabs`,modelValue:d.value,dense:!0,align:`justify`,"onUpdate:modelValue":te},()=>[(0,e.h)(wa,{label:`HEX`+(v.value?`A`:``),name:`hex`,ripple:!1}),(0,e.h)(wa,{label:`RGB`+(v.value?`A`:``),name:`rgb`,ripple:!1})])),n.push((0,e.h)(`div`,{class:`q-color-picker__header-banner row flex-center no-wrap`},[(0,e.h)(`input`,{class:`fit`,value:p.value[d.value],...m.value?{}:{readonly:!0},...o(`topIn`,{onInput:e=>{z(P(e))},onChange:E,onBlur:e=>{P(e,!0)&&r.$forceUpdate(),z(!1)}})}),(0,e.h)(Z,{ref:c,class:`q-color-picker__error-icon absolute no-pointer-events`,name:i.iconSet.type.negative})])),(0,e.h)(`div`,{class:`q-color-picker__header relative-position overflow-hidden`},[(0,e.h)(`div`,{class:`q-color-picker__header-bg absolute-full`}),(0,e.h)(`div`,{class:b.value,style:y.value},n)])}function V(){return(0,e.h)(Ta,{modelValue:f.value,animated:!0},()=>[(0,e.h)(Ea,{class:`q-color-picker__spectrum-tab overflow-hidden`,name:`spectrum`},U),(0,e.h)(Ea,{class:`q-pa-md q-color-picker__tune-tab`,name:`tune`},W),(0,e.h)(Ea,{class:`q-color-picker__palette-tab`,name:`palette`},G)])}function ne(e){f.value=e}function H(){return(0,e.h)(`div`,{class:`q-color-picker__footer relative-position overflow-hidden`},[(0,e.h)(ya,{class:`absolute-full`,modelValue:f.value,dense:!0,align:`justify`,"onUpdate:modelValue":ne},()=>[(0,e.h)(wa,{icon:i.iconSet.colorPicker.spectrum,name:`spectrum`,ripple:!1}),(0,e.h)(wa,{icon:i.iconSet.colorPicker.tune,name:`tune`,ripple:!1}),(0,e.h)(wa,{icon:i.iconSet.colorPicker.palette,name:`palette`,ripple:!1})])])}function U(){let t={ref:s,class:`q-color-picker__spectrum non-selectable relative-position cursor-pointer`+(m.value?``:` readonly`),style:x.value,...m.value?{onClick:R,onMousedown:ee}:{}},n=[(0,e.h)(`div`,{style:{paddingBottom:`100%`}}),(0,e.h)(`div`,{class:`q-color-picker__spectrum-white absolute-full`}),(0,e.h)(`div`,{class:`q-color-picker__spectrum-black absolute-full`}),(0,e.h)(`div`,{class:`absolute`,style:S.value},[p.value.hex===void 0?null:(0,e.h)(`div`,{class:`q-color-picker__spectrum-circle`})])],r=[(0,e.h)(ua,{class:`q-color-picker__hue non-selectable`,modelValue:p.value.h,min:0,max:360,trackSize:`8px`,innerTrackColor:`transparent`,selectionColor:`transparent`,readonly:!m.value,thumbPath:eo,"onUpdate:modelValue":j,onChange:M})];return v.value&&r.push((0,e.h)(ua,{class:`q-color-picker__alpha non-selectable`,modelValue:p.value.a,min:0,max:100,trackSize:`8px`,trackColor:`white`,innerTrackColor:`transparent`,selectionColor:`transparent`,trackImg:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAH0lEQVQoU2NkYGAwZkAFZ5G5jPRRgOYEVDeB3EBjBQBOZwTVugIGyAAAAABJRU5ErkJggg==`,readonly:!m.value,hideSelection:!0,thumbPath:eo,...o(`alphaSlide`,{"onUpdate:modelValue":e=>N(e,`a`,100),onChange:e=>N(e,`a`,100,void 0,!0)})})),[$e(`div`,t,n,`spec`,m.value,()=>D.value),(0,e.h)(`div`,{class:`q-color-picker__sliders`},r)]}function W(){return[(0,e.h)(`div`,{class:`row items-center no-wrap`},[(0,e.h)(`div`,`R`),(0,e.h)(ua,{modelValue:p.value.r,min:0,max:255,color:`red`,dark:a.value,readonly:!m.value,...o(`rSlide`,{"onUpdate:modelValue":e=>N(e,`r`,255),onChange:e=>N(e,`r`,255,void 0,!0)})}),(0,e.h)(`input`,{value:p.value.r,maxlength:3,readonly:!m.value,onChange:E,...o(`rIn`,{onInput:e=>N(e.target.value,`r`,255,e),onBlur:e=>N(e.target.value,`r`,255,e,!0)})})]),(0,e.h)(`div`,{class:`row items-center no-wrap`},[(0,e.h)(`div`,`G`),(0,e.h)(ua,{modelValue:p.value.g,min:0,max:255,color:`green`,dark:a.value,readonly:!m.value,...o(`gSlide`,{"onUpdate:modelValue":e=>N(e,`g`,255),onChange:e=>N(e,`g`,255,void 0,!0)})}),(0,e.h)(`input`,{value:p.value.g,maxlength:3,readonly:!m.value,onChange:E,...o(`gIn`,{onInput:e=>N(e.target.value,`g`,255,e),onBlur:e=>N(e.target.value,`g`,255,e,!0)})})]),(0,e.h)(`div`,{class:`row items-center no-wrap`},[(0,e.h)(`div`,`B`),(0,e.h)(ua,{modelValue:p.value.b,min:0,max:255,color:`blue`,readonly:!m.value,dark:a.value,...o(`bSlide`,{"onUpdate:modelValue":e=>N(e,`b`,255),onChange:e=>N(e,`b`,255,void 0,!0)})}),(0,e.h)(`input`,{value:p.value.b,maxlength:3,readonly:!m.value,onChange:E,...o(`bIn`,{onInput:e=>N(e.target.value,`b`,255,e),onBlur:e=>N(e.target.value,`b`,255,e,!0)})})]),v.value?(0,e.h)(`div`,{class:`row items-center no-wrap`},[(0,e.h)(`div`,`A`),(0,e.h)(ua,{modelValue:p.value.a,color:`grey`,readonly:!m.value,dark:a.value,...o(`aSlide`,{"onUpdate:modelValue":e=>N(e,`a`,100),onChange:e=>N(e,`a`,100,void 0,!0)})}),(0,e.h)(`input`,{value:p.value.a,maxlength:3,readonly:!m.value,onChange:E,...o(`aIn`,{onInput:e=>N(e.target.value,`a`,100,e),onBlur:e=>N(e.target.value,`a`,100,e,!0)})})]):null]}function G(){return[(0,e.h)(`div`,{class:`row items-center q-color-picker__palette-rows`+(m.value?` q-color-picker__palette-rows--editable`:``)},C.value.map(t=>(0,e.h)(`div`,{class:`q-color-picker__cube col-auto`,style:{backgroundColor:t},...m.value?o(`palette#`+t,{onClick:()=>{F(t)}}):{}})))]}return()=>{let n=[V()];return t.name!==void 0&&!t.disable&&_(n,`push`),t.noHeader||n.unshift(B()),t.noFooter||n.push(H()),(0,e.h)(`div`,{class:w.value,...T.value},n)}}});let oo=[-61,9,38,199,426,686,756,818,1111,1181,1210,1635,2060,2097,2192,2262,2324,2394,2456,3178];function so(e,t,n){return Object.prototype.toString.call(e)===`[object Date]`&&(n=e.getDate(),t=e.getMonth()+1,e=e.getFullYear()),ho(go(e,t,n))}function co(e,t,n){return _o(mo(e,t,n))}function lo(e){return fo(e)===0}function uo(e,t){return t<=6?31:t<=11||lo(e)?30:29}function fo(e){let t=oo.length,n=oo[0],r,i,a,o,s;if(e=oo[t-1])throw Error(`Invalid Jalaali year `+e);for(s=1;s=oo[n-1])throw Error(`Invalid Jalaali year `+e);for(u=1;u=0){if(a<=185)return i=1+vo(a,31),r=yo(a,31)+1,{jy:n,jm:i,jd:r};a-=186}else--n,a+=179,o.leap===1&&(a+=1);return i=7+vo(a,30),r=yo(a,30)+1,{jy:n,jm:i,jd:r}}function go(e,t,n){let r=vo((e+vo(t-8,6)+100100)*1461,4)+vo(153*yo(t+9,12)+2,5)+n-34840408;return r=r-vo(vo(e+100100+vo(t-8,6),100)*3,4)+752,r}function _o(e){let t=4*e+139361631;t=t+vo(vo(4*e+183187720,146097)*3,4)*4-3908;let n=vo(yo(t,1461),4)*5+308,r=vo(yo(n,153),5)+1,i=yo(vo(n,153),12)+1;return{gy:vo(t,1461)-100100+vo(8-i,6),gm:i,gd:r}}function vo(e,t){return Math.trunc(e/t)}function yo(e,t){return e-Math.trunc(e/t)*t}let bo=[`gregorian`,`persian`],xo={mask:{type:String},locale:Object,calendar:{type:String,validator:e=>bo.includes(e),default:`gregorian`},landscape:Boolean,color:String,textColor:String,square:Boolean,flat:Boolean,bordered:Boolean,readonly:Boolean,disable:Boolean},So=[`update:modelValue`];function Co(e){return e.year+`/`+Y(e.month)+`/`+Y(e.day)}function wo(t,n){let r=(0,e.computed)(()=>!t.disable&&!t.readonly),i=(0,e.computed)(()=>r.value?0:-1),a=(0,e.computed)(()=>{let e=[];return t.color!==void 0&&e.push(`bg-${t.color}`),t.textColor!==void 0&&e.push(`text-${t.textColor}`),e.join(` `)});function o(){return t.locale===void 0?n.lang.date:{...n.lang.date,...t.locale}}function s(e){let n=new Date,r=e?null:0;if(t.calendar===`persian`){let e=so(n);return{year:e.jy,month:e.jm,day:e.jd}}return{year:n.getFullYear(),month:n.getMonth()+1,day:n.getDate(),hour:r,minute:r,second:r,millisecond:r}}return{editable:r,tabindex:i,headerClass:a,getLocale:o,getCurrentDate:s}}let To=864e5,Eo=6e4,Do=`YYYY-MM-DDTHH:mm:ss.SSSZ`,Oo=/\[((?:[^\]\\]|\\]|\\)*)\]|do|d{1,4}|Mo|M{1,4}|m{1,2}|wo|w{1,2}|Qo|Do|DDDo|D{1,4}|YY(?:YY)?|H{1,2}|h{1,2}|s{1,2}|S{1,3}|Z{1,2}|a{1,2}|[AQExX]/g,ko=/(\[[^\]]*\])|do|d{1,4}|Mo|M{1,4}|m{1,2}|wo|w{1,2}|Qo|Do|DDDo|D{1,4}|YY(?:YY)?|H{1,2}|h{1,2}|s{1,2}|S{1,3}|Z{1,2}|a{1,2}|[AQExX]|([.*+:?^,\s${}()|\\]+)/g,Ao={};function jo(e,t){let n=`(`+t.days.join(`|`)+`)`,r=e+n;if(Ao[r]!==void 0)return Ao[r];let i=`(`+t.daysShort.join(`|`)+`)`,a=`(`+t.months.join(`|`)+`)`,o=`(`+t.monthsShort.join(`|`)+`)`,s={},c=0,l=e.replace(ko,e=>{switch(c++,e){case`YY`:return s.YY=c,String.raw`(-?\d{1,2})`;case`YYYY`:return s.YYYY=c,String.raw`(-?\d{1,4})`;case`M`:return s.M=c,String.raw`(\d{1,2})`;case`Mo`:return s.M=c++,String.raw`(\d{1,2}(st|nd|rd|th))`;case`MM`:return s.M=c,String.raw`(\d{2})`;case`MMM`:return s.MMM=c,o;case`MMMM`:return s.MMMM=c,a;case`D`:return s.D=c,String.raw`(\d{1,2})`;case`Do`:return s.D=c++,String.raw`(\d{1,2}(st|nd|rd|th))`;case`DD`:return s.D=c,String.raw`(\d{2})`;case`H`:return s.H=c,String.raw`(\d{1,2})`;case`HH`:return s.H=c,String.raw`(\d{2})`;case`h`:return s.h=c,String.raw`(\d{1,2})`;case`hh`:return s.h=c,String.raw`(\d{2})`;case`m`:return s.m=c,String.raw`(\d{1,2})`;case`mm`:return s.m=c,String.raw`(\d{2})`;case`s`:return s.s=c,String.raw`(\d{1,2})`;case`ss`:return s.s=c,String.raw`(\d{2})`;case`S`:return s.S=c,String.raw`(\d{1})`;case`SS`:return s.S=c,String.raw`(\d{2})`;case`SSS`:return s.S=c,String.raw`(\d{3})`;case`A`:return s.A=c,`(AM|PM)`;case`a`:return s.a=c,`(am|pm)`;case`aa`:return s.aa=c,String.raw`(a\.m\.|p\.m\.)`;case`ddd`:return i;case`dddd`:return n;case`Q`:case`d`:case`E`:return String.raw`(\d{1})`;case`do`:return c++,String.raw`(\d{1}(st|nd|rd|th))`;case`Qo`:return`(1st|2nd|3rd|4th)`;case`DDD`:case`DDDD`:return String.raw`(\d{1,3})`;case`DDDo`:return c++,String.raw`(\d{1,3}(st|nd|rd|th))`;case`w`:return String.raw`(\d{1,2})`;case`wo`:return c++,String.raw`(\d{1,2}(st|nd|rd|th))`;case`ww`:return String.raw`(\d{2})`;case`Z`:return s.Z=c,String.raw`(Z|[+-]\d{2}:\d{2})`;case`ZZ`:return s.ZZ=c,String.raw`(Z|[+-]\d{2}\d{2})`;case`X`:return s.X=c,String.raw`(-?\d+)`;case`x`:return s.x=c,String.raw`(-?\d{4,})`;default:return c--,e[0]===`[`&&(e=e.slice(1,-1)),e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}}),u={map:s,regex:RegExp(`^`+l)};return Ao[r]=u,u}function Mo(e,t){return e===void 0?t===void 0?ae.date:t.date:e}function No(e,t=``){let n=e>0?`-`:`+`,r=Math.abs(e),i=Math.floor(r/60),a=r%60;return n+Y(i)+t+Y(a)}function Po(e,t,n){let r=e.getFullYear(),i=e.getMonth(),a=e.getDate();return t.year!==void 0&&(r+=n*t.year,delete t.year),t.month!==void 0&&(i+=n*t.month,delete t.month),e.setDate(1),e.setMonth(2),e.setFullYear(r),e.setMonth(i),e.setDate(Math.min(a,os(e))),t.date!==void 0&&(e.setDate(e.getDate()+n*t.date),delete t.date),e}function Fo(e,t,n){let r=t.year===void 0?e[`get${n}FullYear`]():t.year,i=t.month===void 0?e[`get${n}Month`]():t.month-1,a=new Date(r,i+1,0).getDate(),o=Math.min(a,t.date===void 0?e[`get${n}Date`]():t.date);return e[`set${n}Date`](1),e[`set${n}Month`](2),e[`set${n}FullYear`](r),e[`set${n}Month`](i),e[`set${n}Date`](o),delete t.year,delete t.month,delete t.date,e}function Io(e,t,n){let r=Lo(t),i=new Date(e),a=r.year!==void 0||r.month!==void 0||r.date!==void 0?Po(i,r,n):i;for(let e in r){let t=Ne(e);a[`set${t}`](a[`get${t}`]()+n*r[e])}return a}function Lo(e){let t={...e};return e.years!==void 0&&(t.year=e.years,delete t.years),e.months!==void 0&&(t.month=e.months,delete t.months),e.days!==void 0&&(t.date=e.days,delete t.days),e.day!==void 0&&(t.date=e.day,delete t.day),e.hour!==void 0&&(t.hours=e.hour,delete t.hour),e.minute!==void 0&&(t.minutes=e.minute,delete t.minute),e.second!==void 0&&(t.seconds=e.second,delete t.second),e.millisecond!==void 0&&(t.milliseconds=e.millisecond,delete t.millisecond),t}function Ro(e,t,n){let r=Lo(t),i=n?`UTC`:``,a=new Date(e),o=r.year!==void 0||r.month!==void 0||r.date!==void 0?Fo(a,r,i):a;for(let e in r)o[`set${i}${e.at(0).toUpperCase()+e.slice(1)}`](r[e]);return o}function zo(e,t,n){let r=Bo(e,t,n),i=new Date(r.year,r.month===null?null:r.month-1,r.day===null?1:r.day,r.hour,r.minute,r.second,r.millisecond),a=i.getTimezoneOffset();return r.timezoneOffset===null||r.timezoneOffset===a?i:Io(i,{minutes:r.timezoneOffset-a},1)}function Bo(e,t,n,r,i){let a={year:null,month:null,day:null,hour:null,minute:null,second:null,millisecond:null,timezoneOffset:null,dateHash:null,timeHash:null};if(i!==void 0&&Object.assign(a,i),e==null||e===``||typeof e!=`string`)return a;t===void 0&&(t=Do);let o=Mo(n,se.props),s=o.months,c=o.monthsShort,{regex:l,map:u}=jo(t,o),d=e.match(l);if(d===null)return a;let f=``;if(u.X!==void 0||u.x!==void 0){let e=Number.parseInt(d[u.X??u.x],10);if(Number.isNaN(e)||e<0)return a;let t=new Date(e*(u.X===void 0?1:1e3));a.year=t.getFullYear(),a.month=t.getMonth()+1,a.day=t.getDate(),a.hour=t.getHours(),a.minute=t.getMinutes(),a.second=t.getSeconds(),a.millisecond=t.getMilliseconds()}else{if(u.YYYY!==void 0)a.year=Number.parseInt(d[u.YYYY],10);else if(u.YY!==void 0){let e=Number.parseInt(d[u.YY],10);a.year=e<0?e:2e3+e}if(u.M!==void 0){if(a.month=Number.parseInt(d[u.M],10),a.month<1||a.month>12)return a}else u.MMM===void 0?u.MMMM!==void 0&&(a.month=s.indexOf(d[u.MMMM])+1):a.month=c.indexOf(d[u.MMM])+1;if(u.D!==void 0){if(a.day=Number.parseInt(d[u.D],10),a.year===null||a.month===null||a.day<1)return a;let e=r===`persian`?uo(a.year,a.month):new Date(a.year,a.month,0).getDate();if(a.day>e)return a}u.H===void 0?u.h!==void 0&&(a.hour=Number.parseInt(d[u.h],10)%12,(u.A&&d[u.A]===`PM`||u.a&&d[u.a]===`pm`||u.aa&&d[u.aa]===`p.m.`)&&(a.hour+=12),a.hour%=24):a.hour=Number.parseInt(d[u.H],10)%24,u.m!==void 0&&(a.minute=Number.parseInt(d[u.m],10)%60),u.s!==void 0&&(a.second=Number.parseInt(d[u.s],10)%60),u.S!==void 0&&(a.millisecond=Number.parseInt(d[u.S],10)*10**(3-d[u.S].length)),(u.Z!==void 0||u.ZZ!==void 0)&&(f=u.Z===void 0?d[u.ZZ]:d[u.Z].replace(`:`,``),a.timezoneOffset=(f[0]===`+`?-1:1)*(60*f.slice(1,3)+Number(f.slice(3,5))))}return a.dateHash=Y(a.year,4)+`/`+Y(a.month)+`/`+Y(a.day),a.timeHash=Y(a.hour)+`:`+Y(a.minute)+`:`+Y(a.second)+f,a}function Vo(e){return Number.isFinite(e)||Number.isFinite(Date.parse(e))}function Ho(e,t){return Ro(new Date,e,t)}function Uo(e){let t=new Date(e).getDay();return t===0?7:t}function Wo(e){let t=new Date(e.getFullYear(),e.getMonth(),e.getDate());t.setDate(t.getDate()-(t.getDay()+6)%7+3);let n=new Date(t.getFullYear(),0,4);n.setDate(n.getDate()-(n.getDay()+6)%7+3);let r=t.getTimezoneOffset()-n.getTimezoneOffset();t.setHours(t.getHours()-r);let i=(t-n)/(To*7);return 1+Math.floor(i)}function Go(e){return e.getFullYear()*1e4+e.getMonth()*100+e.getDate()}function Ko(e,t){let n=new Date(e);return t?Go(n):n.getTime()}function qo(e,t,n,r={}){let i=Ko(t,r.onlyDate),a=Ko(n,r.onlyDate),o=Ko(e,r.onlyDate);return(o>i||r.inclusiveFrom&&o===i)&&(onew Date(e).getTime()));return new Date(n)}function $o(e,...t){let n=Math.min(new Date(e).getTime(),...t.map(e=>new Date(e).getTime()));return new Date(n)}function es(e,t,n){return(e.getTime()-e.getTimezoneOffset()*Eo-(t.getTime()-t.getTimezoneOffset()*Eo))/n}function ts(e,t,n=`days`){let r=new Date(e),i=new Date(t);switch(n){case`years`:case`year`:return r.getFullYear()-i.getFullYear();case`months`:case`month`:return(r.getFullYear()-i.getFullYear())*12+r.getMonth()-i.getMonth();case`days`:case`day`:case`date`:return es(Xo(r,`day`),Xo(i,`day`),To);case`hours`:case`hour`:return es(Xo(r,`hour`),Xo(i,`hour`),36e5);case`minutes`:case`minute`:return es(Xo(r,`minute`),Xo(i,`minute`),Eo);case`seconds`:case`second`:return es(Xo(r,`second`),Xo(i,`second`),1e3)}}function ns(e){return ts(e,Xo(e,`year`),`days`)+1}function rs(e){return ye(e)?`date`:typeof e==`number`?`number`:`string`}function is(e,t,n){let r=new Date(e);if(t){let e=new Date(t);if(re)return e}return r}function as(e,t,n){let r=new Date(e),i=new Date(t);if(n===void 0)return r.getTime()===i.getTime();switch(n){case`second`:case`seconds`:if(r.getSeconds()!==i.getSeconds())return!1;case`minute`:case`minutes`:if(r.getMinutes()!==i.getMinutes())return!1;case`hour`:case`hours`:if(r.getHours()!==i.getHours())return!1;case`day`:case`days`:case`date`:if(r.getDate()!==i.getDate())return!1;case`month`:case`months`:if(r.getMonth()!==i.getMonth())return!1;case`year`:case`years`:if(r.getFullYear()!==i.getFullYear())return!1;break;default:throw Error(`date isSameDate unknown unit ${n}`)}return!0}function os(e){return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()}function ss(e){if(e>=11&&e<=13)return`${e}th`;switch(e%10){case 1:return`${e}st`;case 2:return`${e}nd`;case 3:return`${e}rd`}return`${e}th`}let cs={YY(e,t,n){let r=this.YYYY(e,t,n)%100;return r>=0?Y(r):`-`+Y(Math.abs(r))},YYYY(e,t,n){return n??e.getFullYear()},M(e){return e.getMonth()+1},Mo(e){return ss(e.getMonth()+1)},MM(e){return Y(e.getMonth()+1)},MMM(e,t){return t.monthsShort[e.getMonth()]},MMMM(e,t){return t.months[e.getMonth()]},Q(e){return Math.ceil((e.getMonth()+1)/3)},Qo(e){return ss(this.Q(e))},D(e){return e.getDate()},Do(e){return ss(e.getDate())},DD(e){return Y(e.getDate())},DDD(e){return ns(e)},DDDo(e){return ss(ns(e))},DDDD(e){return Y(ns(e),3)},d(e){return e.getDay()},do(e){return ss(e.getDay())},dd(e,t){return t.days[e.getDay()].slice(0,2)},ddd(e,t){return t.daysShort[e.getDay()]},dddd(e,t){return t.days[e.getDay()]},E(e){return e.getDay()||7},w(e){return Wo(e)},wo(e){return ss(Wo(e))},ww(e){return Y(Wo(e))},H(e){return e.getHours()},HH(e){return Y(e.getHours())},h(e){let t=e.getHours();return t===0?12:t>12?t%12:t},hh(e){return Y(this.h(e))},m(e){return e.getMinutes()},mm(e){return Y(e.getMinutes())},s(e){return e.getSeconds()},ss(e){return Y(e.getSeconds())},S(e){return Math.floor(e.getMilliseconds()/100)},SS(e){return Y(Math.floor(e.getMilliseconds()/10))},SSS(e){return Y(e.getMilliseconds(),3)},A(e){return e.getHours()<12?`AM`:`PM`},a(e){return e.getHours()<12?`am`:`pm`},aa(e){return e.getHours()<12?`a.m.`:`p.m.`},Z(e,t,n,r){return No(r??e.getTimezoneOffset(),`:`)},ZZ(e,t,n,r){return No(r??e.getTimezoneOffset())},X(e){return Math.floor(e.getTime()/1e3)},x(e){return e.getTime()}};function ls(e,t,n,r,i){if(e!==0&&!e||e===1/0||e===-1/0)return;let a=new Date(e);if(Number.isNaN(a))return;t===void 0&&(t=Do);let o=Mo(n,se.props);return t.replace(Oo,(e,t)=>e in cs?cs[e](a,o,r,i):t===void 0?e:t.split(String.raw`\]`).join(`]`))}function us(e){return ye(e)?new Date(e):e}var ds={isValid:Vo,extractDate:zo,buildDate:Ho,getDayOfWeek:Uo,getWeekOfYear:Wo,isBetweenDates:qo,addToDate:Jo,subtractFromDate:Yo,adjustDate:Ro,startOfDate:Xo,endOfDate:Zo,getMaxDate:Qo,getMinDate:$o,getDateDiff:ts,getDayOfYear:ns,inferDateFormat:rs,getDateBetween:is,isSameDate:as,daysInMonth:os,formatDate:ls,clone:us};let fs=[`Calendar`,`Years`,`Months`],ps=e=>fs.includes(e),ms=/^-?[\d]+\/[0-1]\d$/,hs=e=>ms.test(e),gs=` — `;function _s(e){return e.year+`/`+Y(e.month)}function vs(e){return{year:e.year,month:e.month,day:e.day}}var ys=h({name:`QDate`,props:{...xo,...ai,...Q,modelValue:{required:!0,validator:e=>typeof e==`string`||Array.isArray(e)||Object(e)===e||e===null},multiple:Boolean,range:Boolean,title:String,subtitle:String,mask:{...xo.mask,default:`YYYY/MM/DD`},defaultYearMonth:{type:String,validator:hs},yearsInMonthView:Boolean,events:[Array,Function],eventColor:[String,Function],emitImmediately:Boolean,options:[Array,Function],navigationMinYearMonth:{type:String,validator:hs},navigationMaxYearMonth:{type:String,validator:hs},noUnset:Boolean,firstDayOfWeek:[String,Number],todayBtn:Boolean,minimal:Boolean,defaultView:{type:String,default:`Calendar`,validator:ps}},emits:[...So,`rangeStart`,`rangeEnd`,`navigation`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=$(t,a),{getCache:s}=xi(),{isHydrated:c}=da(),{tabindex:l,headerClass:u,getLocale:d,getCurrentDate:f}=wo(t,a),p,m=si(oi(t)),h=(0,e.ref)(null),g=(0,e.ref)(_e()),_=(0,e.ref)(d()),v=(0,e.computed)(()=>_e()),y=(0,e.computed)(()=>d()),b=(0,e.computed)(()=>f()),x=(0,e.ref)(be(g.value,_.value)),S=(0,e.ref)(t.defaultView),C=(0,e.computed)(()=>a.lang.rtl?`right`:`left`),w=(0,e.ref)(C.value),T=(0,e.ref)(C.value),E=x.value.year,D=(0,e.ref)(E-E%20-(E<0?20:0)),O=(0,e.ref)(null),k=(0,e.computed)(()=>{let e=t.landscape?`landscape`:`portrait`;return`q-date q-date--${e} q-date--${e}-${t.minimal?`minimal`:`standard`}`+(o.value?` q-date--dark q-dark`:``)+(t.bordered?` q-date--bordered`:``)+(t.square?` q-date--square no-border-radius`:``)+(t.flat?` q-date--flat no-shadow`:``)+(t.disable?` disabled`:t.readonly?` q-date--readonly`:``)}),A=(0,e.computed)(()=>t.color||`primary`),j=(0,e.computed)(()=>t.textColor||`white`),M=(0,e.computed)(()=>t.emitImmediately&&!t.multiple&&!t.range),N=(0,e.computed)(()=>Array.isArray(t.modelValue)?t.modelValue:t.modelValue!==null&&t.modelValue!==void 0?[t.modelValue]:[]),P=(0,e.computed)(()=>N.value.filter(e=>typeof e==`string`).map(e=>ye(e,g.value,_.value)).filter(e=>e.dateHash!==null&&e.day!==null&&e.month!==null&&e.year!==null)),F=(0,e.computed)(()=>{let e=e=>ye(e,g.value,_.value);return N.value.filter(e=>ve(e)&&e.from!==void 0&&e.to!==void 0).map(t=>({from:e(t.from),to:e(t.to)})).filter(e=>e.from.dateHash!==null&&e.to.dateHash!==null&&e.from.dateHasht.calendar===`persian`?e=>{let t=co(e.year,e.month,e.day);return new Date(t.gy,t.gm-1,t.gd)}:e=>new Date(e.year,e.month-1,e.day)),L=(0,e.computed)(()=>t.calendar===`persian`?Co:(e,t,n)=>ls(new Date(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond),t===void 0?g.value:t,n===void 0?_.value:n,e.year,e.timezoneOffset)),R=(0,e.computed)(()=>P.value.length+F.value.reduce((e,t)=>e+1+ts(I.value(t.to),I.value(t.from)),0)),ee=(0,e.computed)(()=>{if(t.title!==void 0&&t.title!==null&&t.title.length!==0)return t.title;if(O.value!==null){let e=O.value.init,t=I.value(e);return _.value.daysShort[t.getDay()]+`, `+_.value.monthsShort[e.month-1]+` `+e.day+` — ?`}if(R.value===0)return gs;if(R.value>1)return`${R.value} ${_.value.pluralDay}`;let e=P.value[0],n=I.value(e);return Number.isNaN(n.valueOf())?gs:_.value.headerTitle===void 0?_.value.daysShort[n.getDay()]+`, `+_.value.monthsShort[e.month-1]+` `+e.day:_.value.headerTitle(n,e)}),z=(0,e.computed)(()=>[...P.value,...F.value.map(e=>e.from)].sort((e,t)=>e.year-t.year||e.month-t.month)[0]),te=(0,e.computed)(()=>[...P.value,...F.value.map(e=>e.to)].sort((e,t)=>t.year-e.year||t.month-e.month)[0]),B=(0,e.computed)(()=>{if(t.subtitle!==void 0&&t.subtitle!==null&&t.subtitle.length!==0)return t.subtitle;if(R.value===0)return gs;if(R.value>1){let e=z.value,t=te.value,n=_.value.monthsShort;return n[e.month-1]+(e.year===t.year?e.month===t.month?``:gs+n[t.month-1]:` `+e.year+gs+n[t.month-1]+` `)+` `+t.year}return P.value[0].year}),V=(0,e.computed)(()=>{let e=[a.iconSet.datetime.arrowLeft,a.iconSet.datetime.arrowRight];return a.lang.rtl?e.reverse():e}),ne=(0,e.computed)(()=>t.firstDayOfWeek===void 0?_.value.firstDayOfWeek:Number(t.firstDayOfWeek)),H=(0,e.computed)(()=>{let e=_.value.daysShort,t=ne.value;return t>0?[...e.slice(t,7),...e.slice(0,t)]:e}),U=(0,e.computed)(()=>{let e=x.value;return t.calendar===`persian`?uo(e.year,e.month):new Date(e.year,e.month,0).getDate()}),W=(0,e.computed)(()=>typeof t.eventColor==`function`?t.eventColor:()=>t.eventColor),G=(0,e.computed)(()=>{if(t.navigationMinYearMonth===void 0)return null;let e=t.navigationMinYearMonth.split(`/`);return{year:Number.parseInt(e[0],10),month:Number.parseInt(e[1],10)}}),K=(0,e.computed)(()=>{if(t.navigationMaxYearMonth===void 0)return null;let e=t.navigationMaxYearMonth.split(`/`);return{year:Number.parseInt(e[0],10),month:Number.parseInt(e[1],10)}}),q=(0,e.computed)(()=>{let e={month:{prev:!0,next:!0},year:{prev:!0,next:!0}};return G.value!==null&&G.value.year>=x.value.year&&(e.year.prev=!1,G.value.year===x.value.year&&G.value.month>=x.value.month&&(e.month.prev=!1)),K.value!==null&&K.value.year<=x.value.year&&(e.year.next=!1,K.value.year===x.value.year&&K.value.month<=x.value.month&&(e.month.next=!1)),e}),re=(0,e.computed)(()=>{let e={};return P.value.forEach(t=>{let n=_s(t);e[n]===void 0&&(e[n]=[]),e[n].push(t.day)}),e}),ie=(0,e.computed)(()=>{let e={};return F.value.forEach(t=>{let n=_s(t.from),r=_s(t.to);if(e[n]===void 0&&(e[n]=[]),e[n].push({from:t.from.day,to:n===r?t.to.day:void 0,range:t}),n12&&(o.year++,o.month=1)}}),e}),ae=(0,e.computed)(()=>{if(O.value===null)return;let{init:e,initHash:t,final:n,finalHash:r}=O.value,[i,a]=t<=r?[e,n]:[n,e],o=_s(i),s=_s(a);if(o!==oe.value&&s!==oe.value)return;let c={};return o===oe.value?(c.from=i.day,c.includeFrom=!0):c.from=1,s===oe.value?(c.to=a.day,c.includeTo=!0):c.to=U.value,c}),oe=(0,e.computed)(()=>_s(x.value)),se=(0,e.computed)(()=>{let e={};if(t.options===void 0){for(let t=1;t<=U.value;t++)e[t]=!0;return e}let n=typeof t.options==`function`?t.options:e=>t.options.includes(e);for(let t=1;t<=U.value;t++)e[t]=n(oe.value+`/`+Y(t));return e}),ce=(0,e.computed)(()=>{let e={};if(t.events===void 0)for(let t=1;t<=U.value;t++)e[t]=!1;else{let n=typeof t.events==`function`?t.events:e=>t.events.includes(e);for(let t=1;t<=U.value;t++){let r=oe.value+`/`+Y(t);e[t]=n(r)&&W.value(r)}}return e}),le=(0,e.computed)(()=>{let e,n,{year:r,month:i}=x.value;if(t.calendar!==`persian`)e=new Date(r,i-1,1),n=new Date(r,i-1,0).getDate();else{let t=co(r,i,1);e=new Date(t.gy,t.gm-1,t.gd);let a=i-1,o=r;a===0&&(a=12,o--),n=uo(o,a)}return{days:e.getDay()-ne.value-1,endDay:n}}),ue=(0,e.computed)(()=>{let e=[],{days:t,endDay:n}=le.value,r=t<0?t+7:t;if(r<6)for(let t=n-r;t<=n;t++)e.push({i:t,fill:!0});let i=e.length;for(let t=1;t<=U.value;t++){let n={i:t,event:ce.value[t],classes:[]};se.value[t]&&(n.in=!0,n.flat=!0),e.push(n)}if(re.value[oe.value]!==void 0&&re.value[oe.value].forEach(t=>{let n=i+t-1;Object.assign(e[n],{selected:!0,unelevated:!0,flat:!1,color:A.value,textColor:j.value})}),ie.value[oe.value]!==void 0&&ie.value[oe.value].forEach(t=>{if(t.from!==void 0){let n=i+t.from-1,r=i+(t.to||U.value)-1;for(let i=n;i<=r;i++)Object.assign(e[i],{range:t.range,unelevated:!0,color:A.value,textColor:j.value});Object.assign(e[n],{rangeFrom:!0,flat:!1}),t.to!==void 0&&Object.assign(e[r],{rangeTo:!0,flat:!1})}else if(t.to!==void 0){let n=i+t.to-1;for(let r=i;r<=n;r++)Object.assign(e[r],{range:t.range,unelevated:!0,color:A.value,textColor:j.value});Object.assign(e[n],{flat:!1,rangeTo:!0})}else{let n=i+U.value-1;for(let r=i;r<=n;r++)Object.assign(e[r],{range:t.range,unelevated:!0,color:A.value,textColor:j.value})}}),ae.value!==void 0){let t=i+ae.value.from-1,n=i+ae.value.to-1;for(let r=t;r<=n;r++)e[r].color=A.value,e[r].editRange=!0;ae.value.includeFrom&&(e[t].editRangeFrom=!0),ae.value.includeTo&&(e[n].editRangeTo=!0)}c.value&&x.value.year===b.value.year&&x.value.month===b.value.month&&(e[i+b.value.day-1].today=!0);let a=e.length%7;if(a>0){let t=7-a;for(let n=1;n<=t;n++)e.push({i:n,fill:!0})}return e.forEach(e=>{let t=`q-date__calendar-item `;e.fill?t+=`q-date__calendar-item--fill`:(t+=`q-date__calendar-item--${e.in?`in`:`out`}`,e.range!==void 0&&(t+=` q-date__range${e.rangeTo?`-to`:e.rangeFrom?`-from`:``}`),e.editRange&&(t+=` q-date__edit-range${e.editRangeFrom?`-from`:``}${e.editRangeTo?`-to`:``}`),(e.range!==void 0||e.editRange)&&(t+=` text-${e.color}`)),e.classes=t}),e}),de=(0,e.computed)(()=>t.disable?{"aria-disabled":`true`}:{});(0,e.watch)(()=>t.modelValue,e=>{if(p===JSON.stringify(e))p=0;else{let e=be(g.value,_.value);De(e.year,e.month,e)}}),(0,e.watch)(S,()=>{h.value!==null&&i.$el.contains(document.activeElement)&&h.value.focus()}),(0,e.watch)(()=>x.value.year+`|`+x.value.month,()=>{r(`navigation`,{year:x.value.year,month:x.value.month})}),(0,e.watch)(v,e=>{Pe(e,_.value,`mask`),g.value=e}),(0,e.watch)(y,e=>{Pe(g.value,e,`locale`),_.value=e});function fe(e){p=JSON.stringify(e)}function pe(){let{year:e,month:t,day:n}=b.value,r={...x.value,year:e,month:t,day:n},i=re.value[_s(r)];(i===void 0||!i.includes(r.day))&&Me(r),ge(r.year,r.month)}function me(e){ps(e)&&(S.value=e)}function he(e,t){[`month`,`year`].includes(e)&&(e===`month`?Se:Ce)(t?-1:1)}function ge(e,t){S.value=`Calendar`,De(e,t)}function J(e,n){if(!t.range||!e){O.value=null;return}let r={...x.value,...e},i=n===void 0?r:{...x.value,...n};O.value={init:r,initHash:Co(r),final:i,finalHash:Co(i)},ge(r.year,r.month)}function _e(){return t.calendar===`persian`?`YYYY/MM/DD`:t.mask}function ye(e,n,r){return Bo(e,n,r,t.calendar,{hour:0,minute:0,second:0,millisecond:0})}function be(e,n){let r=Array.isArray(t.modelValue)?t.modelValue:t.modelValue?[t.modelValue]:[];if(r.length===0)return xe();let i=r.at(-1),a=ye(i.from===void 0?i:i.from,e,n);return a.dateHash===null?xe():a}function xe(){let e,n;if(t.defaultYearMonth!==void 0){let r=t.defaultYearMonth.split(`/`);e=Number.parseInt(r[0],10),n=Number.parseInt(r[1],10)}else{let t=b.value===void 0?f():b.value;e=t.year,n=t.month}return{year:e,month:n,day:1,hour:0,minute:0,second:0,millisecond:0,dateHash:e+`/`+Y(n)+`/01`}}function Se(e){let t=x.value.year,n=Number(x.value.month)+e;n===13?(n=1,t++):n===0&&(n=12,t--),De(t,n),M.value&&ke(`month`)}function Ce(e){De(Number(x.value.year)+e,x.value.month),M.value&&ke(`year`)}function we(e){De(e,x.value.month),S.value=t.defaultView===`Years`?`Months`:`Calendar`,M.value&&ke(`year`)}function Te(e){De(x.value.year,e),S.value=`Calendar`,M.value&&ke(`month`)}function Ee(e,t){(re.value[t]?.includes(e.day)===!0?Ne:Me)(e)}function De(t,n,r){if(G.value!==null&&t<=G.value.year&&((n=K.value.year&&((n>K.value.month||t>K.value.year)&&(n=K.value.month),t=K.value.year),r!==void 0){let{hour:e,minute:t,second:n,millisecond:i,timezoneOffset:a,timeHash:o}=r;Object.assign(x.value,{hour:e,minute:t,second:n,millisecond:i,timezoneOffset:a,timeHash:o})}let i=t+`/`+Y(n)+`/01`;i!==x.value.dateHash&&(w.value=x.value.dateHash{D.value=t-t%20-(t<0?20:0),Object.assign(x.value,{year:t,month:n,day:1,dateHash:i})}))}function Oe(e,n,i){let a=e!==null&&e.length===1&&!t.multiple?e[0]:e,{reason:o,details:s}=Ae(n,i);fe(a),r(`update:modelValue`,a,o,s)}function ke(n){let i=P.value[0]!==void 0&&P.value[0].dateHash!==null?{...P.value[0]}:{...x.value};(0,e.nextTick)(()=>{i.year=x.value.year,i.month=x.value.month;let e=t.calendar===`persian`?uo(i.year,i.month):new Date(i.year,i.month,0).getDate();i.day=Math.min(Math.max(1,i.day),e);let a=je(i),{details:o}=Ae(``,i);fe(a),r(`update:modelValue`,a,n,o)})}function Ae(e,t){return t.from===void 0?{reason:`${e}-day`,details:vs(t)}:{reason:`${e}-range`,details:{...vs(t.target),from:vs(t.from),to:vs(t.to)}}}function je(e,t,n){return e.from===void 0?L.value(e,t,n):{from:L.value(e.from,t,n),to:L.value(e.to,t,n)}}function Me(e){let n;if(t.multiple)if(e.from!==void 0){let t=Co(e.from),r=Co(e.to),i=P.value.filter(e=>e.dateHashr),a=F.value.filter(({from:e,to:n})=>n.dateHashr);n=[...i,...a,e].map(e=>je(e))}else n=[...N.value,je(e)];else n=je(e);Oe(n,`add`,e)}function Ne(e){if(t.noUnset)return;let n=null;if(t.multiple&&Array.isArray(t.modelValue)){let r=je(e);n=e.from===void 0?t.modelValue.filter(e=>e!==r):t.modelValue.filter(e=>e.from===void 0||e.from!==r.from&&e.to!==r.to),n.length===0&&(n=null)}Oe(n,`remove`,e)}function Pe(e,n,i){let a=[...P.value,...F.value].map(t=>je(t,e,n)).filter(e=>e.from===void 0?e.dateHash!==null:e.from.dateHash!==null&&e.to.dateHash!==null),o=(t.multiple?a:a[0])||null;fe(o),r(`update:modelValue`,o,i)}function Fe(){if(!t.minimal)return(0,e.h)(`div`,{class:`q-date__header `+u.value},[(0,e.h)(`div`,{class:`relative-position`},[(0,e.h)(e.Transition,{name:`q-transition--fade`},()=>(0,e.h)(`div`,{key:`h-yr-`+B.value,class:`q-date__header-subtitle q-date__header-link `+(S.value===`Years`?`q-date__header-link--active`:`cursor-pointer`),tabindex:l.value,...s(`vY`,{onClick(){S.value=`Years`},onKeyup(e){e.keyCode===13&&(S.value=`Years`)}})},[B.value]))]),(0,e.h)(`div`,{class:`q-date__header-title relative-position flex no-wrap`},[(0,e.h)(`div`,{class:`relative-position col`},[(0,e.h)(e.Transition,{name:`q-transition--fade`},()=>(0,e.h)(`div`,{key:`h-sub`+ee.value,class:`q-date__header-title-label q-date__header-link `+(S.value===`Calendar`?`q-date__header-link--active`:`cursor-pointer`),tabindex:l.value,...s(`vC`,{onClick(){S.value=`Calendar`},onKeyup(e){e.keyCode===13&&(S.value=`Calendar`)}})},[ee.value]))]),t.todayBtn?(0,e.h)(yn,{class:`q-date__header-today self-start`,icon:a.iconSet.datetime.today,"aria-label":a.lang.date.today,flat:!0,size:`sm`,round:!0,tabindex:l.value,onClick:pe}):null])])}function Ie({label:t,type:n,key:r,dir:i,goTo:o,boundaries:c,cls:u}){return[(0,e.h)(`div`,{class:`row items-center q-date__arrow`},[(0,e.h)(yn,{round:!0,dense:!0,size:`sm`,flat:!0,icon:V.value[0],"aria-label":n===`Years`?a.lang.date.prevYear:a.lang.date.prevMonth,tabindex:l.value,disable:!c.prev,...s(`go-#`+n,{onClick(){o(-1)}})})]),(0,e.h)(`div`,{class:`relative-position overflow-hidden flex flex-center`+u},[(0,e.h)(e.Transition,{name:`q-transition--jump-`+i},()=>(0,e.h)(`div`,{key:r},[(0,e.h)(yn,{flat:!0,dense:!0,noCaps:!0,label:t,tabindex:l.value,...s(`view#`+n,{onClick:()=>{S.value=n}})})]))]),(0,e.h)(`div`,{class:`row items-center q-date__arrow`},[(0,e.h)(yn,{round:!0,dense:!0,size:`sm`,flat:!0,icon:V.value[1],"aria-label":n===`Years`?a.lang.date.nextYear:a.lang.date.nextMonth,tabindex:l.value,disable:!c.next,...s(`go+#`+n,{onClick(){o(1)}})})])]}let Le={Calendar:()=>[(0,e.h)(`div`,{key:`calendar-view`,class:`q-date__view q-date__calendar`},[(0,e.h)(`div`,{class:`q-date__navigation row items-center no-wrap`},[...Ie({label:_.value.months[x.value.month-1],type:`Months`,key:x.value.month,dir:w.value,goTo:Se,boundaries:q.value.month,cls:` col`}),...Ie({label:x.value.year,type:`Years`,key:x.value.year,dir:T.value,goTo:Ce,boundaries:q.value.year,cls:``})]),(0,e.h)(`div`,{class:`q-date__calendar-weekdays row items-center no-wrap`},H.value.map(t=>(0,e.h)(`div`,{class:`q-date__calendar-item`},[(0,e.h)(`div`,t)]))),(0,e.h)(`div`,{class:`q-date__calendar-days-container relative-position overflow-hidden`},[(0,e.h)(e.Transition,{name:`q-transition--slide-`+w.value},()=>(0,e.h)(`div`,{key:oe.value,class:`q-date__calendar-days fit`},ue.value.map(t=>(0,e.h)(`div`,{class:t.classes},[t.in?(0,e.h)(yn,{class:t.today?`q-date__today`:``,dense:!0,flat:t.flat,unelevated:t.unelevated,color:t.color,textColor:t.textColor,label:t.i,tabindex:l.value,...s(`day#`+t.i,{onClick:()=>{Re(t.i)},onMouseover:()=>{ze(t.i)}})},t.event?()=>(0,e.h)(`div`,{class:`q-date__event bg-`+t.event}):null):(0,e.h)(`div`,String(t.i))]))))])])],Months(){let n=c.value&&x.value.year===b.value.year,r=e=>G.value!==null&&x.value.year===G.value.year&&G.value.month>e||K.value!==null&&x.value.year===K.value.year&&K.value.month{let a=x.value.month===i+1;return(0,e.h)(`div`,{class:`q-date__months-item flex flex-center`},[(0,e.h)(yn,{class:n&&b.value.month===i+1?`q-date__today`:null,flat:!a,label:t,unelevated:a,color:a?A.value:null,textColor:a?j.value:null,tabindex:l.value,disable:r(i+1),...s(`month#`+i,{onClick:()=>{Te(i+1)}})})])});return t.yearsInMonthView&&i.unshift((0,e.h)(`div`,{class:`row no-wrap full-width`},[Ie({label:x.value.year,type:`Years`,key:x.value.year,dir:T.value,goTo:Ce,boundaries:q.value.year,cls:` col`})])),(0,e.h)(`div`,{key:`months-view`,class:`q-date__view q-date__months flex flex-center`},i)},Years(){let t=D.value,n=t+20,r=[],i=e=>G.value!==null&&G.value.year>e||K.value!==null&&K.value.year{we(a)}})})]))}return(0,e.h)(`div`,{class:`q-date__view q-date__years flex flex-center`},[(0,e.h)(`div`,{class:`col-auto`},[(0,e.h)(yn,{round:!0,dense:!0,flat:!0,icon:V.value[0],"aria-label":a.lang.date.prevRangeYears(20),tabindex:l.value,disable:i(t),...s(`y-`,{onClick:()=>{D.value-=20}})})]),(0,e.h)(`div`,{class:`q-date__years-content col self-stretch row items-center`},r),(0,e.h)(`div`,{class:`col-auto`},[(0,e.h)(yn,{round:!0,dense:!0,flat:!0,icon:V.value[1],"aria-label":a.lang.date.nextRangeYears(20),tabindex:l.value,disable:i(n),...s(`y+`,{onClick:()=>{D.value+=20}})})])])}};function Re(e){let n={...x.value,day:e};if(!t.range){Ee(n,oe.value);return}if(O.value===null){let i=ue.value.find(t=>!t.fill&&t.i===e);if(!t.noUnset&&i.range!==void 0){Ne({target:n,from:i.range.from,to:i.range.to});return}if(i.selected){Ne(n);return}let a=Co(n);O.value={init:n,initHash:a,final:n,finalHash:a},r(`rangeStart`,vs(n))}else{let e=O.value.initHash,t=Co(n),i=e<=t?{from:O.value.init,to:n}:{from:n,to:O.value.init};O.value=null,Me(e===t?n:{target:n,...i}),r(`rangeEnd`,{from:vs(i.from),to:vs(i.to)})}}function ze(e){if(O.value!==null){let t={...x.value,day:e};Object.assign(O.value,{final:t,finalHash:Co(t)})}}return Object.assign(i,{setToday:pe,setView:me,offsetCalendar:he,setCalendarTo:ge,setEditingRange:J}),()=>{let r=[(0,e.h)(`div`,{class:`q-date__content col relative-position`},[(0,e.h)(e.Transition,{name:`q-transition--fade`},Le[S.value])])],i=X(n.default);return i!==void 0&&r.push((0,e.h)(`div`,{class:`q-date__actions`},i)),t.name!==void 0&&!t.disable&&m(r,`push`),(0,e.h)(`div`,{class:k.value,...de.value},[Fe(),(0,e.h)(`div`,{ref:h,class:`q-date__main col column`,tabindex:-1},r)])}}});function bs(t,n,r){let i;function a(){i!==void 0&&(ie.remove(i),i=void 0)}return(0,e.onBeforeUnmount)(()=>{t.value&&a()}),{removeFromHistory:a,addToHistory(){i={condition:()=>r.value,handler:n},ie.add(i)}}}let xs=0,Ss,Cs,ws,Ts=!1,Es,Ds,Os,ks=null;function As(e){e.target===document&&(document.scrollingElement.scrollTop=document.scrollingElement.scrollTop)}function js(e){Ts||(Ts=!0,requestAnimationFrame(()=>{Ts=!1;let{height:t}=e.target,{clientHeight:n,scrollTop:r}=document.scrollingElement;(ws===void 0||t!==window.innerHeight)&&(ws=n-t,document.scrollingElement.scrollTop=r),r>ws&&(document.scrollingElement.scrollTop-=Math.ceil((r-ws)/8))}))}function Ms(e){let t=document.body,n=window.visualViewport!==void 0;if(e===`add`){let{overflowY:e,overflowX:r}=window.getComputedStyle(t);Ss=or(window),Cs=ar(window),Es=t.style.left,Ds=t.style.top,Os=window.location.pathname,t.style.left=`-${Ss}px`,t.style.top=`-${Cs}px`,r!==`hidden`&&(r===`scroll`||t.scrollWidth>window.innerWidth)&&t.classList.add(`q-body--force-scrollbar-x`),e!==`hidden`&&(e===`scroll`||t.scrollHeight>window.innerHeight)&&t.classList.add(`q-body--force-scrollbar-y`),document.documentElement.classList.add(`q-document--prevent-scroll`),document.qScrollPrevented=!0,p.is.ios&&(n?(window.scrollTo(0,0),window.visualViewport.addEventListener(`resize`,js,v.passiveCapture),window.visualViewport.addEventListener(`scroll`,js,v.passiveCapture),window.scrollTo(0,0)):window.addEventListener(`scroll`,As,v.passiveCapture))}else p.is.ios&&(n?(window.visualViewport.removeEventListener(`resize`,js,v.passiveCapture),window.visualViewport.removeEventListener(`scroll`,js,v.passiveCapture)):window.removeEventListener(`scroll`,As,v.passiveCapture)),document.documentElement.classList.remove(`q-document--prevent-scroll`),t.classList.remove(`q-body--force-scrollbar-x`,`q-body--force-scrollbar-y`),document.qScrollPrevented=!1,t.style.left=Es,t.style.top=Ds,window.location.pathname===Os&&window.scrollTo(Ss,Cs),ws=void 0}function Ns(e){let t=`add`;if(e===!0){if(xs++,ks!==null){clearTimeout(ks),ks=null;return}if(xs>1)return}else{if(xs===0||(xs--,xs>0))return;if(t=`remove`,p.is.ios&&p.is.nativeMobile){ks!==null&&clearTimeout(ks),ks=setTimeout(()=>{Ms(t),ks=null},100);return}}Ms(t)}function Ps(){let e;return{preventBodyScroll(t){t!==e&&(e!==void 0||t)&&(e=t,Ns(t))}}}let Fs=0,Is={standard:`fixed-full flex-center`,top:`fixed-top justify-center`,bottom:`fixed-bottom justify-center`,right:`fixed-right items-center`,left:`fixed-left items-center`},Ls={standard:[`scale`,`scale`],top:[`slide-down`,`slide-up`],bottom:[`slide-up`,`slide-down`],right:[`slide-left`,`slide-right`],left:[`slide-right`,`slide-left`]};var Rs=h({name:`QDialog`,inheritAttrs:!1,props:{...En,...Xn,transitionShow:String,transitionHide:String,persistent:Boolean,autoClose:Boolean,allowFocusOutside:Boolean,noEscDismiss:Boolean,noBackdropDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,noShake:Boolean,seamless:Boolean,maximized:Boolean,fullWidth:Boolean,fullHeight:Boolean,square:Boolean,backdropFilter:String,position:{type:String,default:`standard`,validator:e=>[`standard`,`top`,`bottom`,`left`,`right`].includes(e)}},emits:[...Dn,`shake`,`click`,`escapeKey`],setup(t,{slots:n,emit:r,attrs:i}){let a=(0,e.getCurrentInstance)(),o=(0,e.ref)(null),s=(0,e.ref)(!1),c=(0,e.ref)(!1),l=null,u=null,d=!1,f=!1,p=(0,e.computed)(()=>!t.persistent&&!t.noRouteDismiss&&!t.seamless),{preventBodyScroll:m}=Ps(),{registerTimeout:h}=$n(),{registerTick:g,removeTick:_}=Qn(),{transitionProps:v,transitionStyle:y}=Zn(t,()=>Ls[t.position][0],()=>Ls[t.position][1]),b=(0,e.computed)(()=>y.value+(t.backdropFilter===void 0?``:`;backdrop-filter:${t.backdropFilter};-webkit-backdrop-filter:${t.backdropFilter}`)),{showPortal:x,hidePortal:S,portalIsAccessible:C,renderPortal:w}=Yn(a,o,V,`dialog`),{hide:T}=On({showing:s,hideOnRouteChange:p,handleShow:M,handleHide:N,handleRouteChange:P,processOnMount:!0}),{addToHistory:E,removeFromHistory:D}=bs(s,T,p),O=(0,e.computed)(()=>`q-dialog__inner flex no-pointer-events q-dialog__inner--${t.maximized?`maximized`:`minimized`} q-dialog__inner--${t.position} ${Is[t.position]}`+(c.value?` q-dialog__inner--animating`:``)+(t.fullWidth?` q-dialog__inner--fullwidth`:``)+(t.fullHeight?` q-dialog__inner--fullheight`:``)+(t.square?` q-dialog__inner--square`:``)),k=(0,e.computed)(()=>s.value&&!t.seamless),A=(0,e.computed)(()=>t.autoClose?{onClick:z}:{}),j=(0,e.computed)(()=>[`q-dialog fullscreen no-pointer-events q-dialog--${k.value?`modal`:`seamless`}`,i.class]);(0,e.watch)(()=>t.maximized,e=>{s.value&&ee(e)}),(0,e.watch)(k,e=>{m(e),e?(Or(B),wr(L)):(kr(B),Tr(L))});function M(e){E(),u=!t.noRefocus&&document.activeElement!==null?document.activeElement:null,ee(t.maximized),x(),c.value=!0,t.noFocus?_():(document.activeElement?.blur(),g(F)),h(()=>{if(a.proxy.$q.platform.is.ios){if(!t.seamless&&document.activeElement){let{top:e,bottom:t}=document.activeElement.getBoundingClientRect(),{innerHeight:n}=window,r=window.visualViewport===void 0?n:window.visualViewport.height;e>0&&t>r/2&&(document.scrollingElement.scrollTop=Math.min(document.scrollingElement.scrollHeight-r,t>=n?1/0:Math.ceil(document.scrollingElement.scrollTop+t-r/2))),document.activeElement.scrollIntoView()}f=!0,o.value.click(),f=!1}x(!0),c.value=!1,r(`show`,e)},t.transitionDuration)}function N(e){if(_(),D(),R(!0),c.value=!0,S(),u!==null){let t=(e?.type.indexOf(`key`)===0?u.closest(`[tabindex]:not([tabindex^="-"])`):void 0)||u;u=null,Rn(()=>{t.isConnected&&t.focus()})}h(()=>{S(!0),c.value=!1,r(`hide`,e)},t.transitionDuration)}function P(){u=null}function F(e){Rn(()=>{let t=o.value;if(t!==null){if(e!==void 0){let n=t.querySelector(e);if(n!==null){n.focus({preventScroll:!0});return}}t.contains(document.activeElement)||(t=t.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||t.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||t.querySelector(`[autofocus], [data-autofocus]`)||t,t.focus({preventScroll:!0}))}})}function I(e){e&&typeof e.focus==`function`?e.focus({preventScroll:!0}):F(),r(`shake`);let t=o.value;t!==null&&(t.classList.remove(`q-animate--scale`),t.classList.add(`q-animate--scale`),l!==null&&clearTimeout(l),l=setTimeout(()=>{l=null,o.value!==null&&(t.classList.remove(`q-animate--scale`),F())},170))}function L(){t.seamless||(t.persistent||t.noEscDismiss?!t.maximized&&!t.noShake&&I():(r(`escapeKey`),T()))}function R(e){l!==null&&(clearTimeout(l),l=null),(e||s.value)&&(ee(!1),t.seamless||(m(!1),kr(B),Tr(L))),e||(u=null)}function ee(e){e?d||=(Fs<1&&document.body.classList.add(`q-body--dialog`),Fs++,!0):d&&=(Fs<2&&document.body.classList.remove(`q-body--dialog`),Fs--,!1)}function z(e){f||(T(e),r(`click`,e))}function te(e){!t.persistent&&!t.noBackdropDismiss?T(e):t.noShake||I()}function B(e){!t.allowFocusOutside&&C.value&&!Zt(o.value,e.target)&&F(`[tabindex]:not([tabindex="-1"])`)}Object.assign(a.proxy,{focus:F,shake:I,__updateRefocusTarget(e){u=e||null}}),(0,e.onBeforeUnmount)(R);function V(){return(0,e.h)(`div`,{role:`dialog`,"aria-modal":k.value?`true`:`false`,...i,class:j.value},[(0,e.h)(e.Transition,{name:`q-transition--fade`,appear:!0},()=>k.value?(0,e.h)(`div`,{class:`q-dialog__backdrop fixed-full`,style:b.value,"aria-hidden":`true`,onClick:te}):null),(0,e.h)(e.Transition,v.value,()=>s.value?(0,e.h)(`div`,{ref:o,class:O.value,style:y.value,tabindex:-1,...A.value},X(n.default)):null)])}return w}});function zs(e,t){e.value!==t&&(e.value=t)}var Bs=h({name:`QDrawer`,inheritAttrs:!1,props:{...En,...Q,side:{type:String,default:`left`,validator:e=>[`left`,`right`].includes(e)},width:{type:Number,default:300},mini:Boolean,miniToOverlay:Boolean,miniWidth:{type:Number,default:57},noMiniAnimation:Boolean,breakpoint:{type:Number,default:1023},showIfAbove:Boolean,behavior:{type:String,validator:e=>[`default`,`desktop`,`mobile`].includes(e),default:`default`},bordered:Boolean,elevated:Boolean,overlay:Boolean,persistent:Boolean,noSwipeOpen:Boolean,noSwipeClose:Boolean,noSwipeBackdrop:Boolean},emits:[...Dn,`onLayout`,`miniState`],setup(t,{slots:n,emit:r,attrs:i}){let a=(0,e.getCurrentInstance)(),{proxy:{$q:o}}=a,s=$(t,o),{preventBodyScroll:c}=Ps(),{registerTimeout:l,removeTimeout:u}=$n(),d=(0,e.inject)(fe,J);if(d===J)return console.error(`QDrawer needs to be child of QLayout`),J;let f,p=null,m,h=(0,e.ref)(t.behavior===`mobile`||t.behavior!==`desktop`&&d.totalWidth.value<=t.breakpoint),g=(0,e.computed)(()=>t.mini&&!h.value),_=(0,e.computed)(()=>g.value?t.miniWidth:t.width),v=(0,e.computed)(()=>t.overlay||t.miniToOverlay||d.view.value.includes(A.value?`R`:`L`)||o.platform.is.ios&&d.isContainer.value),y=(0,e.ref)(t.showIfAbove&&!h.value||t.modelValue===!0),b=(0,e.computed)(()=>!t.overlay&&y.value&&!h.value),x=(0,e.computed)(()=>t.overlay&&y.value&&!h.value),S=(0,e.computed)(()=>!t.persistent&&(h.value||x.value));function C(e,t){if(D(),e!==!1&&d.animate(),q(0),h.value){let e=d.instances[I.value];e?.belowBreakpoint===!0&&e.hide(!1),re(1),d.isContainer.value||c(!0)}else re(0),e!==!1&&ie(!1);l(()=>{e!==!1&&ie(!0),t||r(`show`,e)},150)}function w(e,t){O(),e!==!1&&d.animate(),re(0),q(j.value*_.value),ce(),t?u():l(()=>{r(`hide`,e)},150)}let{show:T,hide:E}=On({showing:y,hideOnRouteChange:S,handleShow:C,handleHide:w}),{addToHistory:D,removeFromHistory:O}=bs(y,E,S),k={belowBreakpoint:h,hide:E},A=(0,e.computed)(()=>t.side===`right`),j=(0,e.computed)(()=>(o.lang.rtl?-1:1)*(A.value?1:-1)),M=(0,e.ref)(0),N=(0,e.ref)(!1),P=(0,e.ref)(!1),F=(0,e.ref)(_.value*j.value),I=(0,e.computed)(()=>A.value?`left`:`right`),L=(0,e.computed)(()=>y.value&&!h.value&&!t.overlay?t.miniToOverlay?t.miniWidth:_.value:0),R=(0,e.computed)(()=>`fullscreen q-drawer__backdrop`+(!y.value&&!N.value?` hidden`:``)),ee=(0,e.computed)(()=>({backgroundColor:`rgba(0,0,0,${M.value*.4})`})),z=(0,e.computed)(()=>A.value?d.rows.value.top[2]===`r`:d.rows.value.top[0]===`l`),te=(0,e.computed)(()=>A.value?d.rows.value.bottom[2]===`r`:d.rows.value.bottom[0]===`l`),B=(0,e.computed)(()=>{let e={};return d.header.space&&!z.value&&(v.value?e.top=`${d.header.offset}px`:d.header.space&&(e.top=`${d.header.size}px`)),d.footer.space&&!te.value&&(v.value?e.bottom=`${d.footer.offset}px`:d.footer.space&&(e.bottom=`${d.footer.size}px`)),e}),V=(0,e.computed)(()=>{let e={width:`${_.value}px`,transform:`translateX(${F.value}px)`};return h.value?e:Object.assign(e,B.value)}),ne=(0,e.computed)(()=>`q-drawer__content fit `+(d.isContainer.value?`overflow-auto`:`scroll`)),H=(0,e.computed)(()=>`q-drawer q-drawer--${t.side}`+(P.value?` q-drawer--mini-animate`:``)+(t.bordered?` q-drawer--bordered`:``)+(s.value?` q-drawer--dark q-dark`:``)+(N.value?` no-transition`:y.value?``:` q-layout--prevent-focus`)+(h.value?` fixed q-drawer--on-top q-drawer--mobile q-drawer--top-padding`:` q-drawer--${g.value?`mini`:`standard`}`+(v.value||!b.value?` fixed`:``)+(t.overlay||t.miniToOverlay?` q-drawer--on-top`:``)+(z.value?` q-drawer--top-padding`:``))),U=(0,e.computed)(()=>[[na,oe,void 0,{[o.lang.rtl?t.side:I.value]:!0,mouse:!0}]]),W=(0,e.computed)(()=>[[na,se,void 0,{[o.lang.rtl?I.value:t.side]:!0,mouse:!0}]]),G=(0,e.computed)(()=>[[na,se,void 0,{[o.lang.rtl?I.value:t.side]:!0,mouse:!0,mouseAllDir:!0}]]);function K(){zs(h,t.behavior===`mobile`||t.behavior!==`desktop`&&d.totalWidth.value<=t.breakpoint)}(0,e.watch)(h,e=>{e?(f=y.value,y.value&&E(!1)):!t.overlay&&t.behavior!==`mobile`&&f!==!1&&(y.value?(q(0),re(0),ce()):T(!1))}),(0,e.watch)(()=>t.side,(e,t)=>{d.instances[t]===k&&(d.instances[t]=void 0,d[t].space=!1,d[t].offset=0),d.instances[e]=k,d[e].size=_.value,d[e].space=b.value,d[e].offset=L.value}),(0,e.watch)(d.totalWidth,()=>{(d.isContainer.value||!document.qScrollPrevented)&&K()}),(0,e.watch)(()=>t.behavior+t.breakpoint,K),(0,e.watch)(d.isContainer,e=>{y.value&&c(!e),e&&K()}),(0,e.watch)(d.scrollbarWidth,()=>{q(y.value?0:void 0)}),(0,e.watch)(L,e=>{le(`offset`,e)}),(0,e.watch)(b,e=>{r(`onLayout`,e),le(`space`,e)}),(0,e.watch)(A,()=>{q()}),(0,e.watch)(_,e=>{q(),ue(t.miniToOverlay,e)}),(0,e.watch)(()=>t.miniToOverlay,e=>{ue(e,_.value)}),(0,e.watch)(()=>o.lang.rtl,()=>{q()}),(0,e.watch)(()=>t.mini,()=>{t.noMiniAnimation||t.modelValue&&(ae(),d.animate())}),(0,e.watch)(g,e=>{r(`miniState`,e)});function q(t){t===void 0?(0,e.nextTick)(()=>{t=y.value?0:_.value,q(j.value*t)}):(d.isContainer.value&&A.value&&(h.value||Math.abs(t)===_.value)&&(t+=j.value*d.scrollbarWidth.value),F.value=t)}function re(e){M.value=e}function ie(e){let t=e?`remove`:d.isContainer.value?``:`add`;t!==``&&document.body.classList[t](`q-body--drawer-toggle`)}function ae(){p!==null&&clearTimeout(p),a.proxy&&a.proxy.$el&&a.proxy.$el.classList.add(`q-drawer--mini-animate`),P.value=!0,p=setTimeout(()=>{p=null,P.value=!1,a?.proxy?.$el?.classList.remove(`q-drawer--mini-animate`)},150)}function oe(e){if(y.value)return;let t=_.value,n=Pe(e.distance.x,0,t);if(e.isFinal){n>=Math.min(75,t)?T():(d.animate(),re(0),q(j.value*t)),N.value=!1;return}q((o.lang.rtl?!A.value:A.value)?Math.max(t-n,0):Math.min(0,n-t)),re(Pe(n/t,0,1)),e.isFirst&&(N.value=!0)}function se(e){if(!y.value)return;let n=_.value,r=e.direction===t.side,i=(o.lang.rtl?!r:r)?Pe(e.distance.x,0,n):0;if(e.isFinal){Math.abs(i){r(`onLayout`,b.value),r(`miniState`,g.value),f=t.showIfAbove;let n=()=>{(y.value?C:w)(!1,!0)};if(d.totalWidth.value!==0){(0,e.nextTick)(n);return}m=(0,e.watch)(d.totalWidth,()=>{m(),m=void 0,!y.value&&t.showIfAbove&&!h.value?T(!1):n()})}),(0,e.onBeforeUnmount)(()=>{m?.(),p!==null&&(clearTimeout(p),p=null),y.value&&ce(),d.instances[t.side]===k&&(d.instances[t.side]=void 0,le(`size`,0),le(`offset`,0),le(`space`,!1))}),()=>{let r=[];h.value&&(t.noSwipeOpen||r.push((0,e.withDirectives)((0,e.h)(`div`,{key:`open`,class:`q-drawer__opener fixed-${t.side}`,"aria-hidden":`true`}),U.value)),r.push($e(`div`,{ref:`backdrop`,class:R.value,style:ee.value,"aria-hidden":`true`,onClick:E},void 0,`backdrop`,!t.noSwipeBackdrop&&y.value,()=>G.value)));let a=g.value&&n.mini!==void 0,o=[(0,e.h)(`div`,{...i,key:String(a),class:[ne.value,i.class]},a?n.mini():X(n.default))];return t.elevated&&y.value&&o.push((0,e.h)(`div`,{class:`q-layout__shadow absolute-full overflow-hidden no-pointer-events`})),r.push($e(`aside`,{ref:`content`,class:H.value,style:V.value},o,`contentclose`,!t.noSwipeClose&&h.value,()=>W.value)),(0,e.h)(`div`,{class:`q-drawer-container`},r)}}});let Vs=[`div`,`li`,`ul`,`ol`,`blockquote`];function Hs(e,t){if(t&&e===t)return null;let n=e.nodeName.toLowerCase();if(Vs.includes(n))return e;let r=(window.getComputedStyle?window.getComputedStyle(e):e.currentStyle).display;return r===`block`||r===`table`?e:Hs(e.parentNode)}function Us(e,t,n){return!e||e===document.body?!1:n&&e===t||(t===document?document.body:t).contains(e.parentNode)}function Ws(e,t,n){if(n||(n=document.createRange(),n.selectNode(e),n.setStart(e,0)),t.count===0)n.setEnd(e,t.count);else if(t.count>0)if(e.nodeType===Node.TEXT_NODE)e.textContent.length0&&this.savedPos{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r};function r(e,t,n,r){return Object.defineProperty(e,t,{get:n,set:r,enumerable:!0}),e}function i(e,t){for(let n in t)r(e,n,t[n]);return e}let a=(0,e.ref)(!1),o;function s(e,t){let n=/(edg|edge|edga|edgios)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(vivaldi)[\/]([\w.]+)/.exec(e)||/(chrome|crios)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(e)||/(webkit)[\/]([\w.]+).*(version)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(e)||/(firefox|fxios)[\/]([\w.]+)/.exec(e)||/(webkit)[\/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[\/]([\w.]+)/.exec(e)||[];return{browser:n[5]||n[3]||n[1]||``,version:n[4]||n[2]||`0`,platform:t[0]||``}}function c(e){return/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(silk)/.exec(e)||/(android)/.exec(e)||/(win)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||/(playbook)/.exec(e)||/(bb)/.exec(e)||/(blackberry)/.exec(e)||[]}let l=`ontouchstart`in window||window.navigator.maxTouchPoints>0;function u(e){let t=e.toLowerCase(),n=s(t,c(t)),r={mobile:!1,desktop:!1,cordova:!1,capacitor:!1,nativeMobile:!1,electron:!1,bex:!1,linux:!1,mac:!1,win:!1,cros:!1,chrome:!1,firefox:!1,opera:!1,safari:!1,vivaldi:!1,edge:!1,edgeChromium:!1,ie:!1,webkit:!1,android:!1,ios:!1,ipad:!1,iphone:!1,ipod:!1,kindle:!1,winphone:!1,blackberry:!1,playbook:!1,silk:!1};n.browser&&(r[n.browser]=!0,r.version=n.version,r.versionNumber=parseInt(n.version,10)),n.platform&&(r[n.platform]=!0);let i=r.android||r.ios||r.bb||r.blackberry||r.ipad||r.iphone||r.ipod||r.kindle||r.playbook||r.silk||r[`windows phone`];if(i===!0||t.indexOf(`mobile`)!==-1?r.mobile=!0:r.desktop=!0,r[`windows phone`]&&(r.winphone=!0,delete r[`windows phone`]),r.edga||r.edgios||r.edg?(r.edge=!0,n.browser=`edge`):r.crios?(r.chrome=!0,n.browser=`chrome`):r.fxios&&(r.firefox=!0,n.browser=`firefox`),(r.ipod||r.ipad||r.iphone)&&(r.ios=!0),r.vivaldi&&=(n.browser=`vivaldi`,!0),(r.chrome||r.opr||r.safari||r.vivaldi||r.mobile===!0&&r.ios!==!0&&i!==!0)&&(r.webkit=!0),r.opr&&(n.browser=`opera`,r.opera=!0),r.safari&&(r.blackberry||r.bb?(n.browser=`blackberry`,r.blackberry=!0):r.playbook?(n.browser=`playbook`,r.playbook=!0):r.android?(n.browser=`android`,r.android=!0):r.kindle?(n.browser=`kindle`,r.kindle=!0):r.silk&&=(n.browser=`silk`,!0)),r.name=n.browser,r.platform=n.platform,t.indexOf(`electron`)!==-1)r.electron=!0;else if(document.location.href.indexOf(`-extension://`)!==-1)r.bex=!0;else{if(window.Capacitor===void 0?(window._cordovaNative!==void 0||window.cordova!==void 0)&&(r.cordova=!0,r.nativeMobile=!0,r.nativeMobileWrapper=`cordova`):(r.capacitor=!0,r.nativeMobile=!0,r.nativeMobileWrapper=`capacitor`),a.value===!0&&(o={is:{...r}}),l===!0&&r.mac===!0&&(r.desktop===!0&&r.safari===!0||r.nativeMobile===!0&&r.android!==!0&&r.ios!==!0&&r.ipad!==!0)){delete r.mac,delete r.desktop;let e=Math.min(window.innerHeight,window.innerWidth)>414?`ipad`:`iphone`;Object.assign(r,{mobile:!0,ios:!0,platform:e,[e]:!0})}r.mobile!==!0&&window.navigator.userAgentData&&window.navigator.userAgentData.mobile&&(delete r.desktop,r.mobile=!0)}return r}let d=navigator.userAgent||navigator.vendor||window.opera,f={has:{touch:!1,webStorage:!1},within:{iframe:!1}},p={userAgent:d,is:u(d),has:{touch:l},within:{iframe:window.self!==window.top}},m={install(t){let{$q:n}=t;a.value===!0?(t.onSSRHydrated.push(()=>{Object.assign(n.platform,p),a.value=!1}),n.platform=(0,e.reactive)(this)):n.platform=this}};{let e;r(p.has,`webStorage`,()=>{if(e!==void 0)return e;try{if(window.localStorage)return e=!0,!0}catch{}return e=!1,!1}),Object.assign(m,p),a.value===!0&&(Object.assign(m,o,f),o=null)}function h(t){return(0,e.markRaw)((0,e.defineComponent)(t))}function g(t){return(0,e.markRaw)(t)}let _=(t,n)=>{let i=(0,e.reactive)(t);for(let e in t)r(n,e,()=>i[e],t=>{i[e]=t});return n},v={hasPassive:!1,passiveCapture:!0,notPassiveCapture:!0};try{let e=Object.defineProperty({},`passive`,{get(){Object.assign(v,{hasPassive:!0,passive:{passive:!0},notPassive:{passive:!1},passiveCapture:{passive:!0,capture:!0},notPassiveCapture:{passive:!1,capture:!0}})}});window.addEventListener(`qtest`,null,e),window.removeEventListener(`qtest`,null,e)}catch{}function y(){}function b(e){return e.button===0}function x(e){return e.button===1}function S(e){return e.button===2}function C(e){return e.touches&&e.touches[0]?e=e.touches[0]:e.changedTouches&&e.changedTouches[0]?e=e.changedTouches[0]:e.targetTouches&&e.targetTouches[0]&&(e=e.targetTouches[0]),{top:e.clientY,left:e.clientX}}function w(e){if(e.path)return e.path;if(e.composedPath)return e.composedPath();let t=[],n=e.target;for(;n;){if(t.push(n),n.tagName===`HTML`)return t.push(document),t.push(window),t;n=n.parentElement}}function T(e){let t=e.deltaX,n=e.deltaY;if((t||n)&&e.deltaMode){let r=e.deltaMode===1?40:800;t*=r,n*=r}return e.shiftKey&&!t&&([n,t]=[t,n]),{x:t,y:n}}function E(e){e.stopPropagation()}function D(e){e.cancelable!==!1&&e.preventDefault()}function O(e){e.cancelable!==!1&&e.preventDefault(),e.stopPropagation()}function k(e,t){if(e===void 0||t===!0&&e.__dragPrevented===!0)return;let n=t===!0?e=>{e.__dragPrevented=!0,e.addEventListener(`dragstart`,D,v.notPassiveCapture)}:e=>{delete e.__dragPrevented,e.removeEventListener(`dragstart`,D,v.notPassiveCapture)};e.querySelectorAll(`a, img`).forEach(n)}function A(e,t,n){let r=`__q_${t}_evt`;e[r]=e[r]===void 0?n:e[r].concat(n),n.forEach(t=>{t[0].addEventListener(t[1],e[t[2]],v[t[3]])})}function j(e,t){let n=`__q_${t}_evt`;e[n]!==void 0&&(e[n].forEach(t=>{t[0].removeEventListener(t[1],e[t[2]],v[t[3]])}),e[n]=void 0)}var M={listenOpts:v,leftClick:b,middleClick:x,rightClick:S,position:C,getEventPath:w,getMouseWheelDistance:T,stop:E,prevent:D,stopAndPrevent:O,preventDraggable:k};function N(e,t=250,n){let r=null;function i(){let i=arguments;r===null?n===!0&&e.apply(this,i):clearTimeout(r),r=setTimeout(()=>{r=null,n!==!0&&e.apply(this,i)},t)}return i.cancel=()=>{r!==null&&clearTimeout(r)},i}let P=[`sm`,`md`,`lg`,`xl`],{passive:F}=v;var I=_({width:0,height:0,name:`xs`,sizes:{sm:600,md:1024,lg:1440,xl:1920},lt:{sm:!0,md:!0,lg:!0,xl:!0},gt:{xs:!1,sm:!1,md:!1,lg:!1},xs:!0,sm:!1,md:!1,lg:!1,xl:!1},{setSizes:y,setDebounce:y,install({$q:e,onSSRHydrated:t}){if(e.screen=this,this.__installed===!0){e.config.screen!==void 0&&(e.config.screen.bodyClasses===!1?document.body.classList.remove(`screen--${this.name}`):this.__update(!0));return}let{visualViewport:n}=window,r=n||window,i=document.scrollingElement||document.documentElement,o=n===void 0||p.is.mobile===!0?()=>[Math.max(window.innerWidth,i.clientWidth),Math.max(window.innerHeight,i.clientHeight)]:()=>[n.width*n.scale+window.innerWidth-i.clientWidth,n.height*n.scale+window.innerHeight-i.clientHeight],s=e.config.screen?.bodyClasses===!0;this.__update=e=>{let[t,n]=o();if(n!==this.height&&(this.height=n),t!==this.width)this.width=t;else if(e!==!0)return;let r=this.sizes;this.gt.xs=t>=r.sm,this.gt.sm=t>=r.md,this.gt.md=t>=r.lg,this.gt.lg=t>=r.xl,this.lt.sm=t{P.forEach(t=>{e[t]!==void 0&&(l[t]=e[t])})},this.setDebounce=e=>{u=e};let d=()=>{let e=getComputedStyle(document.body);e.getPropertyValue(`--q-size-sm`)&&P.forEach(t=>{this.sizes[t]=parseInt(e.getPropertyValue(`--q-size-${t}`),10)}),this.setSizes=e=>{P.forEach(t=>{e[t]&&(this.sizes[t]=e[t])}),this.__update(!0)},this.setDebounce=e=>{c!==void 0&&r.removeEventListener(`resize`,c,F),c=e>0?N(this.__update,e):this.__update,r.addEventListener(`resize`,c,F)},this.setDebounce(u),Object.keys(l).length===0?this.__update():(this.setSizes(l),l=void 0),s===!0&&this.name===`xs`&&document.body.classList.add(`screen--xs`)};a.value===!0?t.push(d):d()}});let L=_({isActive:!1,mode:!1},{__media:void 0,set(e){L.mode=e,e===`auto`?(L.__media===void 0&&(L.__media=window.matchMedia(`(prefers-color-scheme: dark)`),L.__updateMedia=()=>{L.set(`auto`)},L.__media.addListener(L.__updateMedia)),e=L.__media.matches):L.__media!==void 0&&(L.__media.removeListener(L.__updateMedia),L.__media=void 0),L.isActive=e===!0,document.body.classList.remove(`body--${e===!0?`light`:`dark`}`),document.body.classList.add(`body--${e===!0?`dark`:`light`}`)},toggle(){L.set(L.isActive===!1)},install({$q:e,ssrContext:t}){let n=e.config.dark;e.dark=this,this.__installed!==!0&&this.set(n===void 0?!1:n)}});function R(e,t,n=document.body){if(typeof e!=`string`)throw TypeError(`Expected a string as propName`);if(typeof t!=`string`)throw TypeError(`Expected a string as value`);if(!(n instanceof Element))throw TypeError(`Expected a DOM element`);n.style.setProperty(`--q-${e}`,t)}let z=!1;function B(e){z=e.isComposing===!0}function ee(e){return z===!0||e!==Object(e)||e.isComposing===!0||e.qKeyEvent===!0}function V(e,t){return ee(e)===!0?!1:[].concat(t).includes(e.keyCode)}function H(e){if(e.ios===!0)return`ios`;if(e.android===!0)return`android`}function te({is:e,has:t,within:n},r){let i=[e.desktop===!0?`desktop`:`mobile`,`${t.touch===!1?`no-`:``}touch`];if(e.mobile===!0){let t=H(e);t!==void 0&&i.push(`platform-`+t)}if(e.nativeMobile===!0){let t=e.nativeMobileWrapper;i.push(t),i.push(`native-mobile`),e.ios===!0&&(r[t]===void 0||r[t].iosStatusBarPadding!==!1)&&i.push(`q-ios-padding`)}else e.electron===!0?i.push(`electron`):e.bex===!0&&i.push(`bex`);return n.iframe===!0&&i.push(`within-iframe`),i}function U(){let{is:e}=p,t=document.body.className,n=new Set(t.replace(/ {2}/g,` `).split(` `));if(e.nativeMobile!==!0&&e.electron!==!0&&e.bex!==!0){if(e.desktop===!0)n.delete(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`),n.add(`desktop`);else if(e.mobile===!0){n.delete(`desktop`),n.add(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`);let t=H(e);t!==void 0&&n.add(`platform-${t}`)}}p.has.touch===!0&&(n.delete(`no-touch`),n.add(`touch`)),p.within.iframe===!0&&n.add(`within-iframe`);let r=Array.from(n).join(` `);t!==r&&(document.body.className=r)}function ne(e){for(let t in e)R(t,e[t])}var W={install(e){if(this.__installed!==!0){if(a.value===!0)U();else{let{$q:t}=e;t.config.brand!==void 0&&ne(t.config.brand);let n=te(p,t.config);document.body.classList.add.apply(document.body.classList,n)}p.is.ios===!0&&document.body.addEventListener(`touchstart`,y),window.addEventListener(`keydown`,B,!0)}}};let G=()=>!0;function re(e){return typeof e==`string`&&e!==``&&e!==`/`&&e!==`#/`}function K(e){return e.startsWith(`#`)===!0&&(e=e.substring(1)),e.startsWith(`/`)===!1&&(e=`/`+e),e.endsWith(`/`)===!0&&(e=e.substring(0,e.length-1)),`#`+e}function ie(e){if(e.backButtonExit===!1)return()=>!1;if(e.backButtonExit===`*`)return G;let t=[`#/`];return Array.isArray(e.backButtonExit)===!0&&t.push(...e.backButtonExit.filter(re).map(K)),()=>t.includes(window.location.hash)}var ae={__history:[],add:y,remove:y,install({$q:e}){if(this.__installed===!0)return;let{cordova:t,capacitor:n}=p.is;if(t!==!0&&n!==!0)return;let r=e.config[t===!0?`cordova`:`capacitor`];if(r?.backButton===!1||n===!0&&(window.Capacitor===void 0||window.Capacitor.Plugins.App===void 0))return;this.add=e=>{e.condition===void 0&&(e.condition=G),this.__history.push(e)},this.remove=e=>{let t=this.__history.indexOf(e);t>=0&&this.__history.splice(t,1)};let i=ie(Object.assign({backButtonExit:!0},r)),a=()=>{if(this.__history.length){let e=this.__history[this.__history.length-1];e.condition()===!0&&(this.__history.pop(),e.handler())}else i()===!0?navigator.app.exitApp():window.history.back()};t===!0?document.addEventListener(`deviceready`,()=>{document.addEventListener(`backbutton`,a,!1)}):window.Capacitor.Plugins.App.addListener(`backButton`,a)}},oe={isoName:`en-US`,nativeName:`English (US)`,label:{clear:`Clear`,ok:`OK`,cancel:`Cancel`,close:`Close`,set:`Set`,select:`Select`,reset:`Reset`,remove:`Remove`,update:`Update`,create:`Create`,search:`Search`,filter:`Filter`,refresh:`Refresh`,expand:e=>e?`Expand "${e}"`:`Expand`,collapse:e=>e?`Collapse "${e}"`:`Collapse`},date:{days:`Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday`.split(`_`),daysShort:`Sun_Mon_Tue_Wed_Thu_Fri_Sat`.split(`_`),months:`January_February_March_April_May_June_July_August_September_October_November_December`.split(`_`),monthsShort:`Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec`.split(`_`),firstDayOfWeek:0,format24h:!1,pluralDay:`days`,prevMonth:`Previous month`,nextMonth:`Next month`,prevYear:`Previous year`,nextYear:`Next year`,today:`Today`,prevRangeYears:e=>`Previous ${e} years`,nextRangeYears:e=>`Next ${e} years`},table:{noData:`No data available`,noResults:`No matching records found`,loading:`Loading...`,selectedRecords:e=>e===1?`1 record selected.`:(e===0?`No`:e)+` records selected.`,recordsPerPage:`Records per page:`,allRows:`All`,pagination:(e,t,n)=>e+`-`+t+` of `+n,columns:`Columns`},pagination:{first:`First page`,prev:`Previous page`,next:`Next page`,last:`Last page`},editor:{url:`URL`,bold:`Bold`,italic:`Italic`,strikethrough:`Strikethrough`,underline:`Underline`,unorderedList:`Unordered List`,orderedList:`Ordered List`,subscript:`Subscript`,superscript:`Superscript`,hyperlink:`Hyperlink`,toggleFullscreen:`Toggle Fullscreen`,quote:`Quote`,left:`Left align`,center:`Center align`,right:`Right align`,justify:`Justify align`,print:`Print`,outdent:`Decrease indentation`,indent:`Increase indentation`,removeFormat:`Remove formatting`,formatting:`Formatting`,fontSize:`Font Size`,align:`Align`,hr:`Insert Horizontal Rule`,undo:`Undo`,redo:`Redo`,heading1:`Heading 1`,heading2:`Heading 2`,heading3:`Heading 3`,heading4:`Heading 4`,heading5:`Heading 5`,heading6:`Heading 6`,paragraph:`Paragraph`,code:`Code`,size1:`Very small`,size2:`A bit small`,size3:`Normal`,size4:`Medium-large`,size5:`Big`,size6:`Very big`,size7:`Maximum`,defaultFont:`Default Font`,viewSource:`View Source`},tree:{noNodes:`No nodes available`,noResults:`No matching nodes found`}};function se(){let e=Array.isArray(navigator.languages)===!0&&navigator.languages.length!==0?navigator.languages[0]:navigator.language;if(typeof e==`string`)return e.split(/[-_]/).map((e,t)=>t===0?e.toLowerCase():t>1||e.length<4?e.toUpperCase():e[0].toUpperCase()+e.slice(1).toLowerCase()).join(`-`)}let ce=_({__qLang:{}},{getLocale:se,set(e=oe,t){let n={...e,rtl:e.rtl===!0,getLocale:se};if(n.set=ce.set,ce.__langConfig===void 0||ce.__langConfig.noHtmlAttrs!==!0){let e=document.documentElement;e.setAttribute(`dir`,n.rtl===!0?`rtl`:`ltr`),e.setAttribute(`lang`,n.isoName)}Object.assign(ce.__qLang,n)},install({$q:e,lang:t,ssrContext:n}){e.lang=ce.__qLang,ce.__langConfig=e.config.lang,this.__installed===!0?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qLang,{get(){return Reflect.get(...arguments)},ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`&&e!==`getLocale`)}}),this.set(t||oe))}});var le={name:`material-icons`,type:{positive:`check_circle`,negative:`warning`,info:`info`,warning:`priority_high`},arrow:{up:`arrow_upward`,right:`arrow_forward`,down:`arrow_downward`,left:`arrow_back`,dropdown:`arrow_drop_down`},chevron:{left:`chevron_left`,right:`chevron_right`},colorPicker:{spectrum:`gradient`,tune:`tune`,palette:`style`},pullToRefresh:{icon:`refresh`},carousel:{left:`chevron_left`,right:`chevron_right`,up:`keyboard_arrow_up`,down:`keyboard_arrow_down`,navigationIcon:`lens`},chip:{remove:`cancel`,selected:`check`},datetime:{arrowLeft:`chevron_left`,arrowRight:`chevron_right`,now:`access_time`,today:`today`},editor:{bold:`format_bold`,italic:`format_italic`,strikethrough:`strikethrough_s`,underline:`format_underlined`,unorderedList:`format_list_bulleted`,orderedList:`format_list_numbered`,subscript:`vertical_align_bottom`,superscript:`vertical_align_top`,hyperlink:`link`,toggleFullscreen:`fullscreen`,quote:`format_quote`,left:`format_align_left`,center:`format_align_center`,right:`format_align_right`,justify:`format_align_justify`,print:`print`,outdent:`format_indent_decrease`,indent:`format_indent_increase`,removeFormat:`format_clear`,formatting:`text_format`,fontSize:`format_size`,align:`format_align_left`,hr:`remove`,undo:`undo`,redo:`redo`,heading:`format_size`,code:`code`,size:`format_size`,font:`font_download`,viewSource:`code`},expansionItem:{icon:`keyboard_arrow_down`,denseIcon:`arrow_drop_down`},fab:{icon:`add`,activeIcon:`close`},field:{clear:`cancel`,error:`error`},pagination:{first:`first_page`,prev:`keyboard_arrow_left`,next:`keyboard_arrow_right`,last:`last_page`},rating:{icon:`grade`},stepper:{done:`check`,active:`edit`,error:`warning`},tabs:{left:`chevron_left`,right:`chevron_right`,up:`keyboard_arrow_up`,down:`keyboard_arrow_down`},table:{arrowUp:`arrow_upward`,warning:`warning`,firstPage:`first_page`,prevPage:`chevron_left`,nextPage:`chevron_right`,lastPage:`last_page`},tree:{icon:`play_arrow`},uploader:{done:`done`,clear:`clear`,add:`add_box`,upload:`cloud_upload`,removeQueue:`clear_all`,removeUploaded:`done_all`}};let ue=_({iconMapFn:null,__qIconSet:{}},{set(e,t){let n={...e};n.set=ue.set,Object.assign(ue.__qIconSet,n)},install({$q:e,iconSet:t,ssrContext:n}){e.config.iconMapFn!==void 0&&(this.iconMapFn=e.config.iconMapFn),e.iconSet=this.__qIconSet,r(e,`iconMapFn`,()=>this.iconMapFn,e=>{this.iconMapFn=e}),this.__installed===!0?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qIconSet,{get(){return Reflect.get(...arguments)},ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`)}}),this.set(t||le))}}),de=`_q_t_`,fe=`_q_s_`,pe=`_q_l_`,me=`_q_f_`,he=`_q_fo_`,ge=`_q_tabs_`,_e=`_q_u_`;function q(){}let ve={},ye=!1;function be(){ye=!0}function xe(e,t){if(e===t)return!0;if(e!==null&&t!==null&&typeof e==`object`&&typeof t==`object`){if(e.constructor!==t.constructor)return!1;let n,r;if(e.constructor===Array){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(xe(e[r],t[r])!==!0)return!1;return!0}if(e.constructor===Map){if(e.size!==t.size)return!1;let n=e.entries();for(r=n.next();r.done!==!0;){if(t.has(r.value[0])!==!0)return!1;r=n.next()}for(n=e.entries(),r=n.next();r.done!==!0;){if(xe(r.value[1],t.get(r.value[0]))!==!0)return!1;r=n.next()}return!0}if(e.constructor===Set){if(e.size!==t.size)return!1;let n=e.entries();for(r=n.next();r.done!==!0;){if(t.has(r.value[0])!==!0)return!1;r=n.next()}return!0}if(e.buffer!=null&&e.buffer.constructor===ArrayBuffer){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();let i=Object.keys(e).filter(t=>e[t]!==void 0);if(n=i.length,n!==Object.keys(t).filter(e=>t[e]!==void 0).length)return!1;for(r=n;r--!==0;){let n=i[r];if(xe(e[n],t[n])!==!0)return!1}return!0}return e!==e&&t!==t}function Se(e){return typeof e==`object`&&!!e&&Array.isArray(e)!==!0}function Ce(e){return Object.prototype.toString.call(e)===`[object Date]`}function we(e){return Object.prototype.toString.call(e)===`[object RegExp]`}function Te(e){return typeof e==`number`&&isFinite(e)}var Ee={deepEqual:xe,object:Se,date:Ce,regexp:we,number:Te};let De=[m,W,L,I,ae,ce,ue];function Oe(t,n){let r=(0,e.createApp)(t);r.config.globalProperties=n.config.globalProperties;let{reload:i,...a}=n._context;return Object.assign(r._context,a),r}function ke(e,t){t.forEach(t=>{t.install(e),t.__installed=!0})}function Ae(e,t,n){e.config.globalProperties.$q=n.$q,e.provide(`_q_`,n.$q),ke(n,De),t.components!==void 0&&Object.values(t.components).forEach(t=>{Se(t)===!0&&t.name!==void 0&&e.component(t.name,t)}),t.directives!==void 0&&Object.values(t.directives).forEach(t=>{Se(t)===!0&&t.name!==void 0&&e.directive(t.name,t)}),t.plugins!==void 0&&ke(n,Object.values(t.plugins).filter(e=>typeof e.install==`function`&&De.includes(e)===!1)),a.value===!0&&(n.$q.onSSRHydrated=()=>{n.onSSRHydrated.forEach(e=>{e()}),n.$q.onSSRHydrated=()=>{}})}var je=function(e,t={}){let n={version:`2.19.3`};ye===!1?(t.config!==void 0&&Object.assign(ve,t.config),n.config={...ve},be()):n.config=t.config||{},Ae(e,t,{parentApp:e,$q:n,lang:t.lang,iconSet:t.iconSet,onSSRHydrated:[]})};let Me=[`B`,`KB`,`MB`,`GB`,`TB`,`PB`];function Ne(e,t=1){let n=0;for(;parseInt(e,10)>=1024&&n=t?r:Array(t-r.length+1).join(n)+r}var Le={humanStorageSize:Ne,capitalize:Pe,between:Fe,normalizeToInterval:Ie,pad:J};let Re=XMLHttpRequest,ze=Re.prototype.open,Be=[`top`,`right`,`bottom`,`left`],Ve=[],He=0;function Ue({p:e,pos:t,active:n,horiz:r,reverse:i,dir:a}){let o=1,s=1;return r===!0?(i===!0&&(o=-1),t===`bottom`&&(s=-1),{transform:`translate3d(${o*(e-100)}%,${n?0:s*-200}%,0)`}):(i===!0&&(s=-1),t===`right`&&(o=-1),{transform:`translate3d(${n?0:a*o*-200}%,${s*(e-100)}%,0)`})}function We(e,t){return typeof t!=`number`&&(t=e<25?Math.random()*3+3:e<65?Math.random()*3:e<85?Math.random()*2:e<99?.6:0),Fe(e+t,0,100)}function Ge(e){He++,Ve.push(e),!(He>1)&&(Re.prototype.open=function(e,t){let n=[];this.addEventListener(`loadstart`,()=>{Ve.forEach(e=>{(e.hijackFilter.value===null||e.hijackFilter.value(t)===!0)&&(e.start(),n.push(e.stop))})},{once:!0}),this.addEventListener(`loadend`,()=>{n.forEach(e=>{e()})},{once:!0}),ze.apply(this,arguments)})}function Ke(e){Ve=Ve.filter(t=>t.start!==e),He=Math.max(0,He-1),He===0&&(Re.prototype.open=ze)}var qe=h({name:`QAjaxBar`,props:{position:{type:String,default:`top`,validator:e=>Be.includes(e)},size:{type:String,default:`2px`},color:String,skipHijack:Boolean,reverse:Boolean,hijackFilter:Function},emits:[`start`,`stop`],setup(t,{emit:n}){let{proxy:r}=(0,e.getCurrentInstance)(),i=(0,e.ref)(0),a=(0,e.ref)(!1),o=(0,e.ref)(!0),s=0,c=null,l,u=(0,e.computed)(()=>`q-loading-bar q-loading-bar--${t.position}`+(t.color===void 0?``:` bg-${t.color}`)+(o.value===!0?``:` no-transition`)),d=(0,e.computed)(()=>t.position===`top`||t.position===`bottom`),f=(0,e.computed)(()=>d.value===!0?`height`:`width`),p=(0,e.computed)(()=>{let e=a.value,n=Ue({p:i.value,pos:t.position,active:e,horiz:d.value,reverse:r.$q.lang.rtl===!0&&[`top`,`bottom`].includes(t.position)?t.reverse===!1:t.reverse,dir:r.$q.lang.rtl===!0?-1:1});return n[f.value]=t.size,n.opacity=+!!e,n}),m=(0,e.computed)(()=>a.value===!0?{role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":i.value}:{"aria-hidden":`true`});function h(e=300){let t=l;return l=Math.max(0,e)||0,s++,s>1?(t===0&&e>0?v():c!==null&&t>0&&e<=0&&(clearTimeout(c),c=null),s):(c!==null&&clearTimeout(c),n(`start`),i.value=0,c=setTimeout(()=>{c=null,o.value=!0,e>0&&v()},a._value===!0?500:1),a._value!==!0&&(a.value=!0,o.value=!1),s)}function g(e){return s>0&&(i.value=We(i.value,e)),s}function _(){if(s=Math.max(0,s-1),s>0)return s;c!==null&&(clearTimeout(c),c=null),n(`stop`);let e=()=>{o.value=!0,i.value=100,c=setTimeout(()=>{c=null,a.value=!1},1e3)};return i.value===0?c=setTimeout(e,1):e(),s}function v(){i.value<100&&(c=setTimeout(()=>{c=null,g(),v()},l))}let y;return(0,e.onMounted)(()=>{t.skipHijack!==!0&&(y=!0,Ge({start:h,stop:_,hijackFilter:(0,e.computed)(()=>t.hijackFilter||null)}))}),(0,e.onBeforeUnmount)(()=>{c!==null&&clearTimeout(c),y===!0&&Ke(h)}),Object.assign(r,{start:h,stop:_,increment:g}),()=>(0,e.h)(`div`,{class:u.value,style:p.value,...m.value})}});let Je={xs:18,sm:24,md:32,lg:38,xl:46},Ye={size:String};function Xe(t,n=Je){return(0,e.computed)(()=>t.size===void 0?null:{fontSize:t.size in n?`${n[t.size]}px`:t.size})}function Y(e,t){return e===void 0?t:e()||t}function Ze(e,t){if(e!==void 0){let t=e();if(t!=null)return t.slice()}return t}function Qe(e,t){return e===void 0?t:t.concat(e())}function $e(e,t){return e===void 0?t:t===void 0?e():t.concat(e())}function et(t,n,r,i,a,o){n.key=i+a;let s=(0,e.h)(t,n,r);return a===!0?(0,e.withDirectives)(s,o()):s}let tt=`0 0 24 24`,nt=e=>e,rt=e=>`ionicons ${e}`,it={"mdi-":e=>`mdi ${e}`,"icon-":nt,"bt-":e=>`bt ${e}`,"eva-":e=>`eva ${e}`,"ion-md":rt,"ion-ios":rt,"ion-logo":rt,"iconfont ":nt,"ti-":e=>`themify-icon ${e}`,"bi-":e=>`bootstrap-icons ${e}`,"i-":nt},at={o_:`-outlined`,r_:`-round`,s_:`-sharp`},ot={sym_o_:`-outlined`,sym_r_:`-rounded`,sym_s_:`-sharp`},st=RegExp(`^(`+Object.keys(it).join(`|`)+`)`),ct=RegExp(`^(`+Object.keys(at).join(`|`)+`)`),lt=RegExp(`^(`+Object.keys(ot).join(`|`)+`)`),ut=/^[Mm]\s?[-+]?\.?\d/,dt=/^img:/,ft=/^svguse:/,pt=/^ion-/,mt=/^(fa-(classic|sharp|solid|regular|light|brands|duotone|thin)|[lf]a[srlbdk]?) /;var X=h({name:`QIcon`,props:{...Ye,tag:{type:String,default:`i`},name:String,color:String,left:Boolean,right:Boolean},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=Xe(t),a=(0,e.computed)(()=>`q-icon`+(t.left===!0?` on-left`:``)+(t.right===!0?` on-right`:``)+(t.color===void 0?``:` text-${t.color}`)),o=(0,e.computed)(()=>{let n,i=t.name;if(i===`none`||!i)return{none:!0};if(r.iconMapFn!==null){let e=r.iconMapFn(i);if(e!==void 0)if(e.icon!==void 0){if(i=e.icon,i===`none`||!i)return{none:!0}}else return{cls:e.cls,content:e.content===void 0?` `:e.content}}if(ut.test(i)===!0){let[t,n=tt]=i.split(`|`);return{svg:!0,viewBox:n,nodes:t.split(`&&`).map(t=>{let[n,r,i]=t.split(`@@`);return(0,e.h)(`path`,{style:r,d:n,transform:i})})}}if(dt.test(i)===!0)return{img:!0,src:i.substring(4)};if(ft.test(i)===!0){let[e,t=tt]=i.split(`|`);return{svguse:!0,src:e.substring(7),viewBox:t}}let a=` `,o=i.match(st);if(o!==null)n=it[o[1]](i);else if(mt.test(i)===!0)n=i;else if(pt.test(i)===!0)n=`ionicons ion-${r.platform.is.ios===!0?`ios`:`md`}${i.substring(3)}`;else if(lt.test(i)===!0){n=`notranslate material-symbols`;let e=i.match(lt);e!==null&&(i=i.substring(6),n+=ot[e[1]]),a=i}else{n=`notranslate material-icons`;let e=i.match(ct);e!==null&&(i=i.substring(2),n+=at[e[1]]),a=i}return{cls:n,content:a}});return()=>{let r={class:a.value,style:i.value,"aria-hidden":`true`};return o.value.none===!0?(0,e.h)(t.tag,r,Y(n.default)):o.value.img===!0?(0,e.h)(t.tag,r,Qe(n.default,[(0,e.h)(`img`,{src:o.value.src})])):o.value.svg===!0?(0,e.h)(t.tag,r,Qe(n.default,[(0,e.h)(`svg`,{viewBox:o.value.viewBox||`0 0 24 24`},o.value.nodes)])):o.value.svguse===!0?(0,e.h)(t.tag,r,Qe(n.default,[(0,e.h)(`svg`,{viewBox:o.value.viewBox},[(0,e.h)(`use`,{"xlink:href":o.value.src})])])):(o.value.cls!==void 0&&(r.class+=` `+o.value.cls),(0,e.h)(t.tag,r,Qe(n.default,[o.value.content])))}}}),ht=h({name:`QAvatar`,props:{...Ye,fontSize:String,color:String,textColor:String,icon:String,square:Boolean,rounded:Boolean},setup(t,{slots:n}){let r=Xe(t),i=(0,e.computed)(()=>`q-avatar`+(t.color?` bg-${t.color}`:``)+(t.textColor?` text-${t.textColor} q-chip--colored`:``)+(t.square===!0?` q-avatar--square`:t.rounded===!0?` rounded-borders`:``)),a=(0,e.computed)(()=>t.fontSize?{fontSize:t.fontSize}:null);return()=>{let o=t.icon===void 0?void 0:[(0,e.h)(X,{name:t.icon})];return(0,e.h)(`div`,{class:i.value,style:r.value},[(0,e.h)(`div`,{class:`q-avatar__content row flex-center overflow-hidden`,style:a.value},$e(n.default,o))])}}});let gt=[`top`,`middle`,`bottom`];var _t=h({name:`QBadge`,props:{color:String,textColor:String,floating:Boolean,transparent:Boolean,multiLine:Boolean,outline:Boolean,rounded:Boolean,label:[Number,String],align:{type:String,validator:e=>gt.includes(e)}},setup(t,{slots:n}){let r=(0,e.computed)(()=>t.align===void 0?null:{verticalAlign:t.align}),i=(0,e.computed)(()=>{let e=t.outline===!0&&t.color||t.textColor;return`q-badge flex inline items-center no-wrap q-badge--${t.multiLine===!0?`multi`:`single`}-line`+(t.outline===!0?` q-badge--outline`:t.color===void 0?``:` bg-${t.color}`)+(e===void 0?``:` text-${e}`)+(t.floating===!0?` q-badge--floating`:``)+(t.rounded===!0?` q-badge--rounded`:``)+(t.transparent===!0?` q-badge--transparent`:``)});return()=>(0,e.h)(`div`,{class:i.value,style:r.value,role:`status`,"aria-label":t.label},Qe(n.default,t.label===void 0?[]:[t.label]))}});let Z={dark:{type:Boolean,default:null}};function Q(t,n){return(0,e.computed)(()=>t.dark===null?n.dark.isActive:t.dark)}var vt=h({name:`QBanner`,props:{...Z,inlineActions:Boolean,dense:Boolean,rounded:Boolean},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=Q(t,r),a=(0,e.computed)(()=>`q-banner row items-center`+(t.dense===!0?` q-banner--dense`:``)+(i.value===!0?` q-banner--dark q-dark`:``)+(t.rounded===!0?` rounded-borders`:``)),o=(0,e.computed)(()=>`q-banner__actions row items-center justify-end col-${t.inlineActions===!0?`auto`:`all`}`);return()=>{let r=[(0,e.h)(`div`,{class:`q-banner__avatar col-auto row items-center self-start`},Y(n.avatar)),(0,e.h)(`div`,{class:`q-banner__content col text-body2`},Y(n.default))],i=Y(n.action);return i!==void 0&&r.push((0,e.h)(`div`,{class:o.value},i)),(0,e.h)(`div`,{class:a.value+(t.inlineActions===!1&&i!==void 0?` q-banner--top-padding`:``),role:`alert`},r)}}}),yt=h({name:`QBar`,props:{...Z,dense:Boolean},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=Q(t,r),a=(0,e.computed)(()=>`q-bar row no-wrap items-center q-bar--${t.dense===!0?`dense`:`standard`} q-bar--${i.value===!0?`dark`:`light`}`);return()=>(0,e.h)(`div`,{class:a.value,role:`toolbar`},Y(n.default))}});let bt={left:`start`,center:`center`,right:`end`,between:`between`,around:`around`,evenly:`evenly`,stretch:`stretch`},xt=Object.keys(bt),St={align:{type:String,validator:e=>xt.includes(e)}};function Ct(t){return(0,e.computed)(()=>{let e=t.align===void 0?t.vertical===!0?`stretch`:`left`:t.align;return`${t.vertical===!0?`items`:`justify`}-${bt[e]}`})}function wt(e){if(Object(e.$parent)===e.$parent)return e.$parent;let{parent:t}=e.$;for(;Object(t)===t;){if(Object(t.proxy)===t.proxy)return t.proxy;t=t.parent}}function Tt(e,t){typeof t.type==`symbol`?Array.isArray(t.children)===!0&&t.children.forEach(t=>{Tt(e,t)}):e.add(t)}function Et(e){let t=new Set;return e.forEach(e=>{Tt(t,e)}),Array.from(t)}function Dt(e){return e.appContext.config.globalProperties.$router!==void 0}function Ot(e){return e.isUnmounted===!0||e.isDeactivated===!0}let kt=[``,!0];var At=h({name:`QBreadcrumbs`,props:{...St,separator:{type:String,default:`/`},separatorColor:String,activeColor:{type:String,default:`primary`},gutter:{type:String,validator:e=>[`none`,`xs`,`sm`,`md`,`lg`,`xl`].includes(e),default:`sm`}},setup(t,{slots:n}){let r=Ct(t),i=(0,e.computed)(()=>`flex items-center ${r.value}${t.gutter===`none`?``:` q-gutter-${t.gutter}`}`),a=(0,e.computed)(()=>t.separatorColor?` text-${t.separatorColor}`:``),o=(0,e.computed)(()=>` text-${t.activeColor}`);return()=>{if(n.default===void 0)return;let r=Et(Y(n.default));if(r.length===0)return;let s=1,c=[],l=r.filter(e=>e.type?.name===`QBreadcrumbsEl`).length,u=n.separator===void 0?()=>t.separator:n.separator;return r.forEach(t=>{if(t.type?.name===`QBreadcrumbsEl`){let n=se!==i[t]))return!1}return!0}function Pt(e,t){return Array.isArray(t)===!0?e.length===t.length&&e.every((e,n)=>e===t[n]):e.length===1&&e[0]===t}function Ft(e,t){return Array.isArray(e)===!0?Pt(e,t):Array.isArray(t)===!0?Pt(t,e):e===t}function It(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(Ft(e[n],t[n])===!1)return!1;return!0}let Lt={to:[String,Object],replace:Boolean,href:String,target:String,disable:Boolean},Rt={...Lt,exact:Boolean,activeClass:{type:String,default:`q-router-link--active`},exactActiveClass:{type:String,default:`q-router-link--exact-active`}};function zt({fallbackTag:t,useDisableForRouterLinkProps:n=!0}={}){let r=(0,e.getCurrentInstance)(),{props:i,proxy:a,emit:o}=r,s=Dt(r),c=(0,e.computed)(()=>i.disable!==!0&&i.href!==void 0),l=n===!0?(0,e.computed)(()=>s===!0&&i.disable!==!0&&c.value!==!0&&i.to!==void 0&&i.to!==null&&i.to!==``):(0,e.computed)(()=>s===!0&&c.value!==!0&&i.to!==void 0&&i.to!==null&&i.to!==``),u=(0,e.computed)(()=>l.value===!0?y(i.to):null),d=(0,e.computed)(()=>u.value!==null),f=(0,e.computed)(()=>c.value===!0||d.value===!0),p=(0,e.computed)(()=>i.type===`a`||f.value===!0?`a`:i.tag||t||`div`),m=(0,e.computed)(()=>c.value===!0?{href:i.href,target:i.target}:d.value===!0?{href:u.value.href,target:i.target}:{}),h=(0,e.computed)(()=>{if(d.value===!1)return-1;let{matched:e}=u.value,{length:t}=e,n=e[t-1];if(n===void 0)return-1;let r=a.$route.matched;if(r.length===0)return-1;let i=r.findIndex(Mt.bind(null,n));if(i!==-1)return i;let o=jt(e[t-2]);return t>1&&jt(n)===o&&r[r.length-1].path!==o?r.findIndex(Mt.bind(null,e[t-2])):i}),g=(0,e.computed)(()=>d.value===!0&&h.value!==-1&&Nt(a.$route.params,u.value.params)),_=(0,e.computed)(()=>g.value===!0&&h.value===a.$route.matched.length-1&&It(a.$route.params,u.value.params)),v=(0,e.computed)(()=>d.value===!0?_.value===!0?` ${i.exactActiveClass} ${i.activeClass}`:i.exact===!0?``:g.value===!0?` ${i.activeClass}`:``:``);function y(e){try{return a.$router.resolve(e)}catch{}return null}function b(e,{returnRouterError:t,to:n=i.to,replace:r=i.replace}={}){if(i.disable===!0)return e.preventDefault(),Promise.resolve(!1);if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||e.button!==void 0&&e.button!==0||i.target===`_blank`)return Promise.resolve(!1);e.preventDefault();let o=a.$router[r===!0?`replace`:`push`](n);return t===!0?o:o.then(()=>{}).catch(()=>{})}function x(e){if(d.value===!0){let t=t=>b(e,t);o(`click`,e,t),e.defaultPrevented!==!0&&t()}else o(`click`,e)}return{hasRouterLink:d,hasHrefLink:c,hasLink:f,linkTag:p,resolvedLink:u,linkIsActive:g,linkIsExactActive:_,linkClass:v,linkAttrs:m,getLink:y,navigateToRouterLink:b,navigateOnClick:x}}var Bt=h({name:`QBreadcrumbsEl`,props:{...Rt,label:String,icon:String,tag:{type:String,default:`span`}},emits:[`click`],setup(t,{slots:n}){let{linkTag:r,linkAttrs:i,linkClass:a,navigateOnClick:o}=zt(),s=(0,e.computed)(()=>({class:`q-breadcrumbs__el q-link flex inline items-center relative-position `+(t.disable===!0?`q-breadcrumbs__el--disable`:`q-link--focusable`+a.value),...i.value,onClick:o})),c=(0,e.computed)(()=>`q-breadcrumbs__el-icon`+(t.label===void 0?``:` q-breadcrumbs__el-icon--with-label`));return()=>{let i=[];return t.icon!==void 0&&i.push((0,e.h)(X,{class:c.value,name:t.icon})),t.label!==void 0&&i.push(t.label),(0,e.h)(r.value,{...s.value},Qe(n.default,i))}}});let Vt={size:{type:[String,Number],default:`1em`},color:String};function Ht(t){return{cSize:(0,e.computed)(()=>t.size in Je?`${Je[t.size]}px`:t.size),classes:(0,e.computed)(()=>`q-spinner`+(t.color?` text-${t.color}`:``))}}var Ut=h({name:`QSpinner`,props:{...Vt,thickness:{type:Number,default:5}},setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value+` q-spinner-mat`,width:n.value,height:n.value,viewBox:`25 25 50 50`},[(0,e.h)(`circle`,{class:`path`,cx:`50`,cy:`50`,r:`20`,fill:`none`,stroke:`currentColor`,"stroke-width":t.thickness,"stroke-miterlimit":`10`})])}});function Wt(e){if(e===window)return{top:0,left:0};let{top:t,left:n}=e.getBoundingClientRect();return{top:t,left:n}}function Gt(e,t){return window.getComputedStyle(e).getPropertyValue(t)}function Kt(e){return e===window?window.innerHeight:e.getBoundingClientRect().height}function qt(e){return e===window?window.innerWidth:e.getBoundingClientRect().width}function Jt(e,t){let n=e.style;for(let e in t)n[e]=t[e]}function Yt(e,t){e.forEach(e=>Jt(e,t))}function Xt(e){if(typeof e==`function`){if(document.readyState!==`loading`)return e();document.addEventListener(`DOMContentLoaded`,e,!1)}}function Zt(t){if(t==null)return;if(typeof t==`string`)try{return document.querySelector(t)||void 0}catch{return}let n=(0,e.unref)(t);if(n)return n.$el||n}function Qt(e,t){if(e==null||e.contains(t)===!0)return!0;for(let n=e.nextElementSibling;n!==null;n=n.nextElementSibling)if(n.contains(t))return!0;return!1}var $t={offset:Wt,style:Gt,height:Kt,width:qt,css:Jt,cssBatch:Yt,ready:Xt};function en(e,t=250){let n=!1,r;return function(){return n===!1&&(n=!0,setTimeout(()=>{n=!1},t),r=e.apply(this,arguments)),r}}function tn(e,t,n,r){n.modifiers.stop===!0&&E(e);let i=n.modifiers.color,a=n.modifiers.center;a=a===!0||r===!0;let o=document.createElement(`span`),s=document.createElement(`span`),c=C(e),{left:l,top:u,width:d,height:f}=t.getBoundingClientRect(),p=Math.sqrt(d*d+f*f),m=p/2,h=`${(d-p)/2}px`,g=a?h:`${c.left-l-m}px`,_=`${(f-p)/2}px`,v=a?_:`${c.top-u-m}px`;s.className=`q-ripple__inner`,Jt(s,{height:`${p}px`,width:`${p}px`,transform:`translate3d(${g},${v},0) scale3d(.2,.2,1)`,opacity:0}),o.className=`q-ripple${i?` text-`+i:``}`,o.setAttribute(`dir`,`ltr`),o.appendChild(s),t.appendChild(o);let y=()=>{o.remove(),clearTimeout(b)};n.abort.push(y);let b=setTimeout(()=>{s.classList.add(`q-ripple__inner--enter`),s.style.transform=`translate3d(${h},${_},0) scale3d(1,1,1)`,s.style.opacity=.2,b=setTimeout(()=>{s.classList.remove(`q-ripple__inner--enter`),s.classList.add(`q-ripple__inner--leave`),s.style.opacity=0,b=setTimeout(()=>{o.remove(),n.abort.splice(n.abort.indexOf(y),1)},275)},250)},50)}function nn(e,{modifiers:t,value:n,arg:r}){let i=Object.assign({},e.cfg.ripple,t,n);e.modifiers={early:i.early===!0,stop:i.stop===!0,center:i.center===!0,color:i.color||r,keyCodes:[].concat(i.keyCodes||13)}}var rn=g({name:`ripple`,beforeMount(e,t){let n=t.instance.$.appContext.config.globalProperties.$q.config||{};if(n.ripple===!1)return;let r={cfg:n,enabled:t.value!==!1,modifiers:{},abort:[],start(t){r.enabled===!0&&t.qSkipRipple!==!0&&t.type===(r.modifiers.early===!0?`pointerdown`:`click`)&&tn(t,e,r,t.qKeyEvent===!0)},keystart:en(t=>{r.enabled===!0&&t.qSkipRipple!==!0&&V(t,r.modifiers.keyCodes)===!0&&t.type===`key${r.modifiers.early===!0?`down`:`up`}`&&tn(t,e,r,!0)},300)};nn(r,t),e.__qripple=r,A(r,`main`,[[e,`pointerdown`,`start`,`passive`],[e,`click`,`start`,`passive`],[e,`keydown`,`keystart`,`passive`],[e,`keyup`,`keystart`,`passive`]])},updated(e,t){if(t.oldValue!==t.value){let n=e.__qripple;n!==void 0&&(n.enabled=t.value!==!1,n.enabled===!0&&Object(t.value)===t.value&&nn(n,t))}},beforeUnmount(e){let t=e.__qripple;t!==void 0&&(t.abort.forEach(e=>{e()}),j(t,`main`),delete e._qripple)}});let an={none:0,xs:4,sm:8,md:16,lg:24,xl:32},on={xs:8,sm:10,md:14,lg:20,xl:24},sn=[`button`,`submit`,`reset`],cn=/[^\s]\/[^\s]/,ln=[`flat`,`outline`,`push`,`unelevated`];function un(e,t){return e.flat===!0?`flat`:e.outline===!0?`outline`:e.push===!0?`push`:e.unelevated===!0?`unelevated`:t}function dn(e){let t=un(e);return t===void 0?{}:{[t]:!0}}let fn={...Ye,...Lt,type:{type:String,default:`button`},label:[Number,String],icon:String,iconRight:String,...ln.reduce((e,t)=>(e[t]=Boolean)&&e,{}),square:Boolean,rounded:Boolean,glossy:Boolean,size:String,fab:Boolean,fabMini:Boolean,padding:String,color:String,textColor:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,tabindex:[Number,String],ripple:{type:[Boolean,Object],default:!0},align:{...St.align,default:`center`},stack:Boolean,stretch:Boolean,loading:{type:Boolean,default:null},disable:Boolean},pn={...fn,round:Boolean};function mn(t){let n=Xe(t,on),r=Ct(t),{hasRouterLink:i,hasLink:a,linkTag:o,linkAttrs:s,navigateOnClick:c}=zt({fallbackTag:`button`}),l=(0,e.computed)(()=>{let e=t.fab===!1&&t.fabMini===!1?n.value:{};return t.padding===void 0?e:Object.assign({},e,{padding:t.padding.split(/\s+/).map(e=>e in an?an[e]+`px`:e).join(` `),minWidth:`0`,minHeight:`0`})}),u=(0,e.computed)(()=>t.rounded===!0||t.fab===!0||t.fabMini===!0),d=(0,e.computed)(()=>t.disable!==!0&&t.loading!==!0),f=(0,e.computed)(()=>d.value===!0?t.tabindex||0:-1),p=(0,e.computed)(()=>un(t,`standard`)),m=(0,e.computed)(()=>{let e={tabindex:f.value};return a.value===!0?Object.assign(e,s.value):sn.includes(t.type)===!0&&(e.type=t.type),o.value===`a`?(t.disable===!0?e[`aria-disabled`]=`true`:e.href===void 0&&(e.role=`button`),i.value!==!0&&cn.test(t.type)===!0&&(e.type=t.type)):t.disable===!0&&(e.disabled=``,e[`aria-disabled`]=`true`),t.loading===!0&&t.percentage!==void 0&&Object.assign(e,{role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":t.percentage}),e});return{classes:(0,e.computed)(()=>{let e;t.color===void 0?t.textColor&&(e=`text-${t.textColor}`):e=t.flat===!0||t.outline===!0?`text-${t.textColor||t.color}`:`bg-${t.color} text-${t.textColor||`white`}`;let n=t.round===!0?`round`:`rectangle${u.value===!0?` q-btn--rounded`:t.square===!0?` q-btn--square`:``}`;return`q-btn--${p.value} q-btn--${n}`+(e===void 0?``:` `+e)+(d.value===!0?` q-btn--actionable q-focusable q-hoverable`:t.disable===!0?` disabled`:``)+(t.fab===!0?` q-btn--fab`:t.fabMini===!0?` q-btn--fab-mini`:``)+(t.noCaps===!0?` q-btn--no-uppercase`:``)+(t.dense===!0?` q-btn--dense`:``)+(t.stretch===!0?` no-border-radius self-stretch`:``)+(t.glossy===!0?` glossy`:``)+(t.square?` q-btn--square`:``)}),style:l,innerClasses:(0,e.computed)(()=>r.value+(t.stack===!0?` column`:` row`)+(t.noWrap===!0?` no-wrap text-no-wrap`:``)+(t.loading===!0?` q-btn__content--hidden`:``)),attributes:m,hasLink:a,linkTag:o,navigateOnClick:c,isActionable:d}}let{passiveCapture:hn}=v,gn=null,_n=null,vn=null;var $=h({name:`QBtn`,props:{...pn,percentage:Number,darkPercentage:Boolean,onTouchstart:[Function,Array]},emits:[`click`,`keydown`,`mousedown`,`keyup`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{classes:a,style:o,innerClasses:s,attributes:c,hasLink:l,linkTag:u,navigateOnClick:d,isActionable:f}=mn(t),p=(0,e.ref)(null),m=(0,e.ref)(null),h=null,g,_=null,v=(0,e.computed)(()=>t.label!==void 0&&t.label!==null&&t.label!==``),y=(0,e.computed)(()=>t.disable===!0||t.ripple===!1?!1:{keyCodes:l.value===!0?[13,32]:[13],...t.ripple===!0?{}:t.ripple}),b=(0,e.computed)(()=>({center:t.round})),x=(0,e.computed)(()=>{let e=Math.max(0,Math.min(100,t.percentage));return e>0?{transition:`transform 0.6s`,transform:`translateX(${e-100}%)`}:{}}),S=(0,e.computed)(()=>{if(t.loading===!0)return{onMousedown:N,onTouchstart:N,onClick:N,onKeydown:N,onKeyup:N};if(f.value===!0){let e={onClick:w,onKeydown:T,onMousedown:A};if(i.$q.platform.has.touch===!0){let n=t.onTouchstart===void 0?`Passive`:``;e[`onTouchstart${n}`]=k}return e}return{onClick:O}}),C=(0,e.computed)(()=>({ref:p,class:`q-btn q-btn-item non-selectable no-outline `+a.value,style:o.value,...c.value,...S.value}));function w(e){if(p.value!==null){if(e!==void 0){if(e.defaultPrevented===!0)return;let n=document.activeElement;if(t.type===`submit`&&n!==document.body&&p.value.contains(n)===!1&&n.contains(p.value)===!1){e.qAvoidFocus!==!0&&p.value.focus();let t=()=>{document.removeEventListener(`keydown`,O,!0),document.removeEventListener(`keyup`,t,hn),p.value?.removeEventListener(`blur`,t,hn)};document.addEventListener(`keydown`,O,!0),document.addEventListener(`keyup`,t,hn),p.value.addEventListener(`blur`,t,hn)}}d(e)}}function T(e){p.value!==null&&(r(`keydown`,e),V(e,[13,32])===!0&&_n!==p.value&&(_n!==null&&M(),e.defaultPrevented!==!0&&(e.qAvoidFocus!==!0&&p.value.focus(),_n=p.value,p.value.classList.add(`q-btn--active`),document.addEventListener(`keyup`,j,!0),p.value.addEventListener(`blur`,j,hn)),O(e)))}function k(e){p.value!==null&&(r(`touchstart`,e),e.defaultPrevented!==!0&&(gn!==p.value&&(gn!==null&&M(),gn=p.value,h=e.target,h.addEventListener(`touchcancel`,j,hn),h.addEventListener(`touchend`,j,hn)),g=!0,_!==null&&clearTimeout(_),_=setTimeout(()=>{_=null,g=!1},200)))}function A(e){p.value!==null&&(e.qSkipRipple=g===!0,r(`mousedown`,e),e.defaultPrevented!==!0&&vn!==p.value&&(vn!==null&&M(),vn=p.value,p.value.classList.add(`q-btn--active`),document.addEventListener(`mouseup`,j,hn)))}function j(e){if(p.value!==null&&!(e?.type===`blur`&&document.activeElement===p.value)){if(e?.type===`keyup`){if(_n===p.value&&V(e,[13,32])===!0){let t=new MouseEvent(`click`,e);t.qKeyEvent=!0,e.defaultPrevented===!0&&D(t),e.cancelBubble===!0&&E(t),p.value.dispatchEvent(t),O(e),e.qKeyEvent=!0}r(`keyup`,e)}M()}}function M(e){let t=m.value;e!==!0&&(gn===p.value||vn===p.value)&&t!==null&&t!==document.activeElement&&(t.setAttribute(`tabindex`,-1),t.focus()),gn===p.value&&(h!==null&&(h.removeEventListener(`touchcancel`,j,hn),h.removeEventListener(`touchend`,j,hn)),gn=h=null),vn===p.value&&(document.removeEventListener(`mouseup`,j,hn),vn=null),_n===p.value&&(document.removeEventListener(`keyup`,j,!0),p.value?.removeEventListener(`blur`,j,hn),_n=null),p.value?.classList.remove(`q-btn--active`)}function N(e){O(e),e.qSkipRipple=!0}return(0,e.onBeforeUnmount)(()=>{M(!0)}),Object.assign(i,{click:e=>{f.value===!0&&w(e)}}),()=>{let r=[];t.icon!==void 0&&r.push((0,e.h)(X,{name:t.icon,left:t.stack!==!0&&v.value===!0,role:`img`})),v.value===!0&&r.push((0,e.h)(`span`,{class:`block`},[t.label])),r=Qe(n.default,r),t.iconRight!==void 0&&t.round===!1&&r.push((0,e.h)(X,{name:t.iconRight,right:t.stack!==!0&&v.value===!0,role:`img`}));let i=[(0,e.h)(`span`,{class:`q-focus-helper`,ref:m})];return t.loading===!0&&t.percentage!==void 0&&i.push((0,e.h)(`span`,{class:`q-btn__progress absolute-full overflow-hidden`+(t.darkPercentage===!0?` q-btn__progress--dark`:``)},[(0,e.h)(`span`,{class:`q-btn__progress-indicator fit block`,style:x.value})])),i.push((0,e.h)(`span`,{class:`q-btn__content text-center col items-center q-anchor--skip `+s.value},r)),t.loading!==null&&i.push((0,e.h)(e.Transition,{name:`q-transition--fade`},()=>t.loading===!0?[(0,e.h)(`span`,{key:`loading`,class:`absolute-full flex flex-center`},n.loading===void 0?[(0,e.h)(Ut)]:n.loading())]:null)),(0,e.withDirectives)((0,e.h)(u.value,C.value,i),[[rn,y.value,void 0,b.value]])}}}),yn=h({name:`QBtnGroup`,props:{unelevated:Boolean,outline:Boolean,flat:Boolean,rounded:Boolean,square:Boolean,push:Boolean,stretch:Boolean,glossy:Boolean,spread:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>{let e=[`unelevated`,`outline`,`flat`,`rounded`,`square`,`push`,`stretch`,`glossy`].filter(e=>t[e]===!0).map(e=>`q-btn-group--${e}`).join(` `);return`q-btn-group row no-wrap${e.length===0?``:` `+e}`+(t.spread===!0?` q-btn-group--spread`:` inline`)});return()=>(0,e.h)(`div`,{class:r.value},Y(n.default))}});function bn(){if(window.getSelection!==void 0){let e=window.getSelection();e.empty===void 0?e.removeAllRanges!==void 0&&(e.removeAllRanges(),m.is.mobile!==!0&&e.addRange(document.createRange())):e.empty()}else document.selection!==void 0&&document.selection.empty()}let xn={target:{type:[Boolean,String,Element],default:!0},noParentEvent:Boolean},Sn={...xn,contextMenu:Boolean};function Cn({showing:t,avoidEmit:n,configureAnchorEl:r}){let{props:i,proxy:a,emit:o}=(0,e.getCurrentInstance)(),s=(0,e.ref)(null),c=null;function l(e){return s.value===null?!1:e===void 0||e.touches===void 0||e.touches.length<=1}let u={};r===void 0&&(Object.assign(u,{hide(e){a.hide(e)},toggle(e){a.toggle(e),e.qAnchorHandled=!0},toggleKey(e){V(e,13)===!0&&u.toggle(e)},contextClick(t){a.hide(t),D(t),(0,e.nextTick)(()=>{a.show(t),t.qAnchorHandled=!0})},prevent:D,mobileTouch(e){if(u.mobileCleanup(e),l(e)!==!0)return;a.hide(e),s.value.classList.add(`non-selectable`);let t=e.target;A(u,`anchor`,[[t,`touchmove`,`mobileCleanup`,`passive`],[t,`touchend`,`mobileCleanup`,`passive`],[t,`touchcancel`,`mobileCleanup`,`passive`],[s.value,`contextmenu`,`prevent`,`notPassive`]]),c=setTimeout(()=>{c=null,a.show(e),e.qAnchorHandled=!0},300)},mobileCleanup(e){s.value.classList.remove(`non-selectable`),c!==null&&(clearTimeout(c),c=null),t.value===!0&&e!==void 0&&bn()}}),r=function(e=i.contextMenu){if(i.noParentEvent===!0||s.value===null)return;let t;t=e===!0?a.$q.platform.is.mobile===!0?[[s.value,`touchstart`,`mobileTouch`,`passive`]]:[[s.value,`mousedown`,`hide`,`passive`],[s.value,`contextmenu`,`contextClick`,`notPassive`]]:[[s.value,`click`,`toggle`,`passive`],[s.value,`keyup`,`toggleKey`,`passive`]],A(u,`anchor`,t)});function d(){j(u,`anchor`)}function f(e){for(s.value=e;s.value.classList.contains(`q-anchor--skip`);)s.value=s.value.parentNode;r()}function p(){if(i.target===!1||i.target===``||a.$el.parentNode===null)s.value=null;else if(i.target===!0)f(a.$el.parentNode);else{let e=i.target;if(typeof i.target==`string`)try{e=document.querySelector(i.target)}catch{e=void 0}e==null?(s.value=null,console.error(`Anchor: target "${i.target}" not found`)):(s.value=e.$el||e,r())}}return(0,e.watch)(()=>i.contextMenu,e=>{s.value!==null&&(d(),r(e))}),(0,e.watch)(()=>i.target,()=>{s.value!==null&&d(),p()}),(0,e.watch)(()=>i.noParentEvent,e=>{s.value!==null&&(e===!0?d():r())}),(0,e.onMounted)(()=>{p(),n!==!0&&i.modelValue===!0&&s.value===null&&o(`update:modelValue`,!1)}),(0,e.onBeforeUnmount)(()=>{c!==null&&clearTimeout(c),d()}),{anchorEl:s,canShow:l,anchorEvents:u}}function wn(t,n){let r=(0,e.ref)(null),i;function a(e,t){let n=`${t===void 0?`remove`:`add`}EventListener`,r=t===void 0?i:t;e!==window&&e[n](`scroll`,r,v.passive),window[n](`scroll`,r,v.passive),i=t}function o(){r.value!==null&&(a(r.value),r.value=null)}return(0,e.onBeforeUnmount)((0,e.watch)(()=>t.noParentEvent,()=>{r.value!==null&&(o(),n())})),{localScrollTarget:r,unconfigureScrollTarget:o,changeScrollEvent:a}}let Tn={modelValue:{type:Boolean,default:null},"onUpdate:modelValue":[Function,Array]},En=[`beforeShow`,`show`,`beforeHide`,`hide`];function Dn({showing:t,canShow:n,hideOnRouteChange:r,handleShow:i,handleHide:a,processOnMount:o}){let s=(0,e.getCurrentInstance)(),{props:c,emit:l,proxy:u}=s,d;function f(e){t.value===!0?h(e):p(e)}function p(t){if(c.disable===!0||t?.qAnchorHandled===!0||n!==void 0&&n(t)!==!0)return;let r=c[`onUpdate:modelValue`]!==void 0;r===!0&&(l(`update:modelValue`,!0),d=t,(0,e.nextTick)(()=>{d===t&&(d=void 0)})),(c.modelValue===null||r===!1)&&m(t)}function m(e){t.value!==!0&&(t.value=!0,l(`beforeShow`,e),i===void 0?l(`show`,e):i(e))}function h(t){if(c.disable===!0)return;let n=c[`onUpdate:modelValue`]!==void 0;n===!0&&(l(`update:modelValue`,!1),d=t,(0,e.nextTick)(()=>{d===t&&(d=void 0)})),(c.modelValue===null||n===!1)&&g(t)}function g(e){t.value!==!1&&(t.value=!1,l(`beforeHide`,e),a===void 0?l(`hide`,e):a(e))}function _(e){c.disable===!0&&e===!0?c[`onUpdate:modelValue`]!==void 0&&l(`update:modelValue`,!1):e===!0!==t.value&&(e===!0?m:g)(d)}(0,e.watch)(()=>c.modelValue,_),r!==void 0&&Dt(s)===!0&&(0,e.watch)(()=>u.$route.fullPath,()=>{r.value===!0&&t.value===!0&&h()}),o===!0&&(0,e.onMounted)(()=>{_(c.modelValue)});let v={show:p,hide:h,toggle:f};return Object.assign(u,v),v}let On=[],kn=[];function An(e){kn=kn.filter(t=>t!==e)}function jn(e){An(e),kn.push(e)}function Mn(e){An(e),kn.length===0&&On.length!==0&&(On[On.length-1](),On=[])}function Nn(e){kn.length===0?e():On.push(e)}function Pn(e){On=On.filter(t=>t!==e)}let Fn=[],In=[],Ln=1,Rn=document.body;function zn(e,t){let n=document.createElement(`div`);if(n.id=t===void 0?e:`q-portal--${t}--${Ln++}`,ve.globalNodes!==void 0){let e=ve.globalNodes.class;e!==void 0&&(n.className=e)}return Rn.appendChild(n),Fn.push(n),In.push(t),n}function Bn(e){let t=Fn.indexOf(e);Fn.splice(t,1),In.splice(t,1),e.remove()}function Vn(e){if(e===Rn)return;if(Rn=e,Rn===document.body||In.reduce((e,t)=>t===`dialog`?e+1:e,0)<2){Fn.forEach(e=>{e.contains(Rn)===!1&&Rn.appendChild(e)});return}let t=In.lastIndexOf(`dialog`);for(let e=0;et.contentEl!==null&&t.contentEl.contains(e))}function Wn(e,t){do{if(e.$options.name===`QMenu`){if(e.hide(t),e.$props.separateClosePopup===!0)return wt(e)}else if(e.__qPortal===!0){let n=wt(e);return n?.$options.name===`QPopupProxy`?(e.hide(t),n):e}e=wt(e)}while(e!=null)}function Gn(e,t,n){for(;n!==0&&e!=null;){if(e.__qPortal===!0){if(n--,e.$options.name===`QMenu`){e=Wn(e,t);continue}e.hide(t)}e=wt(e)}}let Kn=h({name:`QPortal`,setup(e,{slots:t}){return()=>t.default()}});function qn(e){for(e=e.parent;e!=null;){if(e.type.name===`QGlobalDialog`)return!0;if(e.type.name===`QDialog`||e.type.name===`QMenu`)return!1;e=e.parent}return!1}function Jn(t,n,i,a){let o=(0,e.ref)(!1),s=(0,e.ref)(!1),c=null,l={},u=a===`dialog`&&qn(t);function d(e){if(e===!0){Mn(l),s.value=!0;return}s.value=!1,o.value===!1&&(u===!1&&c===null&&(c=zn(!1,a)),o.value=!0,Hn.push(t.proxy),jn(l))}function f(e){if(s.value=!1,e!==!0)return;Mn(l),o.value=!1;let n=Hn.indexOf(t.proxy);n!==-1&&Hn.splice(n,1),c!==null&&(Bn(c),c=null)}return(0,e.onUnmounted)(()=>{f(!0)}),t.proxy.__qPortal=!0,r(t.proxy,`contentEl`,()=>n.value),{showPortal:d,hidePortal:f,portalIsActive:o,portalIsAccessible:s,renderPortal:()=>u===!0?i():o.value===!0?[(0,e.h)(e.Teleport,{to:c},(0,e.h)(Kn,i))]:void 0}}let Yn={transitionShow:{type:String,default:`fade`},transitionHide:{type:String,default:`fade`},transitionDuration:{type:[String,Number],default:300}};function Xn(t,n=()=>{},r=()=>{}){return{transitionProps:(0,e.computed)(()=>{let e=`q-transition--${t.transitionShow||n()}`,i=`q-transition--${t.transitionHide||r()}`;return{appear:!0,enterFromClass:`${e}-enter-from`,enterActiveClass:`${e}-enter-active`,enterToClass:`${e}-enter-to`,leaveFromClass:`${i}-leave-from`,leaveActiveClass:`${i}-leave-active`,leaveToClass:`${i}-leave-to`}}),transitionStyle:(0,e.computed)(()=>`--q-transition-duration: ${t.transitionDuration}ms`)}}function Zn(){let t,n=(0,e.getCurrentInstance)();function r(){t=void 0}return(0,e.onDeactivated)(r),(0,e.onBeforeUnmount)(r),{removeTick:r,registerTick(r){t=r,(0,e.nextTick)(()=>{t===r&&(Ot(n)===!1&&t(),t=void 0)})}}}function Qn(){let t=null,n=(0,e.getCurrentInstance)();function r(){t!==null&&(clearTimeout(t),t=null)}return(0,e.onDeactivated)(r),(0,e.onBeforeUnmount)(r),{removeTimeout:r,registerTimeout(e,i){r(),Ot(n)===!1&&(t=setTimeout(()=>{t=null,e()},i))}}}let $n=[Element,String],er=[null,document,document.body,document.scrollingElement,document.documentElement];function tr(e,t){let n=Zt(t);if(n===void 0){if(e==null)return window;n=e.closest(`.scroll,.scroll-y,.overflow-auto`)}return er.includes(n)?window:n}function nr(e){return(e===window?document.body:e).scrollHeight}function rr(e){return(e===window?document.body:e).scrollWidth}function ir(e){return e===window?window.pageYOffset||window.scrollY||document.body.scrollTop||0:e.scrollTop}function ar(e){return e===window?window.pageXOffset||window.scrollX||document.body.scrollLeft||0:e.scrollLeft}function or(e,t,n=0){let r=arguments[3]===void 0?performance.now():arguments[3],i=ir(e);if(n<=0){i!==t&&cr(e,t);return}requestAnimationFrame(a=>{let o=a-r,s=i+(t-i)/Math.max(o,n)*o;cr(e,s),s!==t&&or(e,t,n-o,a)})}function sr(e,t,n=0){let r=arguments[3]===void 0?performance.now():arguments[3],i=ar(e);if(n<=0){i!==t&&lr(e,t);return}requestAnimationFrame(a=>{let o=a-r,s=i+(t-i)/Math.max(o,n)*o;lr(e,s),s!==t&&sr(e,t,n-o,a)})}function cr(e,t){if(e===window){window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,t);return}e.scrollTop=t}function lr(e,t){if(e===window){window.scrollTo(t,window.pageYOffset||window.scrollY||document.body.scrollTop||0);return}e.scrollLeft=t}function ur(e,t,n){if(n){or(e,t,n);return}cr(e,t)}function dr(e,t,n){if(n){sr(e,t,n);return}lr(e,t)}let fr;function pr(){if(fr!==void 0)return fr;let e=document.createElement(`p`),t=document.createElement(`div`);Jt(e,{width:`100%`,height:`200px`}),Jt(t,{position:`absolute`,top:`0px`,left:`0px`,visibility:`hidden`,width:`200px`,height:`150px`,overflow:`hidden`}),t.appendChild(e),document.body.appendChild(t);let n=e.offsetWidth;t.style.overflow=`scroll`;let r=e.offsetWidth;return n===r&&(r=t.clientWidth),t.remove(),fr=n-r,fr}function mr(e,t=!0){return!e||e.nodeType!==Node.ELEMENT_NODE?!1:t?e.scrollHeight>e.clientHeight&&(e.classList.contains(`scroll`)||e.classList.contains(`overflow-auto`)||[`auto`,`scroll`].includes(window.getComputedStyle(e)[`overflow-y`])):e.scrollWidth>e.clientWidth&&(e.classList.contains(`scroll`)||e.classList.contains(`overflow-auto`)||[`auto`,`scroll`].includes(window.getComputedStyle(e)[`overflow-x`]))}var hr={getScrollTarget:tr,getScrollHeight:nr,getScrollWidth:rr,getVerticalScrollPosition:ir,getHorizontalScrollPosition:ar,animVerticalScrollTo:or,animHorizontalScrollTo:sr,setVerticalScrollPosition:ur,setHorizontalScrollPosition:dr,getScrollbarWidth:pr,hasScrollbar:mr};let gr=[],_r;function vr(e){_r=e.keyCode===27}function yr(){_r===!0&&(_r=!1)}function br(e){_r===!0&&(_r=!1,V(e,27)===!0&&gr[gr.length-1](e))}function xr(e){window[e](`keydown`,vr),window[e](`blur`,yr),window[e](`keyup`,br),_r=!1}function Sr(e){p.is.desktop===!0&&(gr.push(e),gr.length===1&&xr(`addEventListener`))}function Cr(e){let t=gr.indexOf(e);t!==-1&&(gr.splice(t,1),gr.length===0&&xr(`removeEventListener`))}let wr=[];function Tr(e){wr[wr.length-1](e)}function Er(e){p.is.desktop===!0&&(wr.push(e),wr.length===1&&document.body.addEventListener(`focusin`,Tr))}function Dr(e){let t=wr.indexOf(e);t!==-1&&(wr.splice(t,1),wr.length===0&&document.body.removeEventListener(`focusin`,Tr))}let Or=null,{notPassiveCapture:kr}=v,Ar=[];function jr(e){Or!==null&&(clearTimeout(Or),Or=null);let t=e.target;if(t===void 0||t.nodeType===8||t.classList.contains(`no-pointer-events`)===!0)return;let n=Hn.length-1;for(;n>=0;){let e=Hn[n].$;if(e.type.name===`QTooltip`){n--;continue}if(e.type.name!==`QDialog`)break;if(e.props.seamless!==!0)return;n--}for(let n=Ar.length-1;n>=0;n--){let r=Ar[n];if((r.anchorEl.value===null||r.anchorEl.value.contains(t)===!1)&&(t===document.body||r.innerRef.value!==null&&r.innerRef.value.contains(t)===!1))e.qClickOutside=!0,r.onClickOutside(e);else return}}function Mr(e){Ar.push(e),Ar.length===1&&(document.addEventListener(`mousedown`,jr,kr),document.addEventListener(`touchstart`,jr,kr))}function Nr(e){let t=Ar.findIndex(t=>t===e);t!==-1&&(Ar.splice(t,1),Ar.length===0&&(Or!==null&&(clearTimeout(Or),Or=null),document.removeEventListener(`mousedown`,jr,kr),document.removeEventListener(`touchstart`,jr,kr)))}let Pr,Fr;function Ir(e){let t=e.split(` `);return t.length===2?[`top`,`center`,`bottom`].includes(t[0])===!0?[`left`,`middle`,`right`,`start`,`end`].includes(t[1])===!0?!0:(console.error(`Anchor/Self position must end with one of left/middle/right/start/end`),!1):(console.error(`Anchor/Self position must start with one of top/center/bottom`),!1):!1}function Lr(e){return e?!(e.length!==2||typeof e[0]!=`number`||typeof e[1]!=`number`):!0}let Rr={"start#ltr":`left`,"start#rtl":`right`,"end#ltr":`right`,"end#rtl":`left`};[`left`,`middle`,`right`].forEach(e=>{Rr[`${e}#ltr`]=e,Rr[`${e}#rtl`]=e});function zr(e,t){let n=e.split(` `);return{vertical:n[0],horizontal:Rr[`${n[1]}#${t===!0?`rtl`:`ltr`}`]}}function Br(e,t){let{top:n,left:r,right:i,bottom:a,width:o,height:s}=e.getBoundingClientRect();return t!==void 0&&(n-=t[1],r-=t[0],a+=t[1],i+=t[0],o+=t[0],s+=t[1]),{top:n,bottom:a,height:s,left:r,right:i,width:o,middle:r+(i-r)/2,center:n+(a-n)/2}}function Vr(e,t,n){let{top:r,left:i}=e.getBoundingClientRect();return r+=t.top,i+=t.left,n!==void 0&&(r+=n[1],i+=n[0]),{top:r,bottom:r+1,height:1,left:i,right:i+1,width:1,middle:i,center:r}}function Hr(e,t){return{top:0,center:t/2,bottom:t,left:0,middle:e/2,right:e}}function Ur(e,t,n,r){return{top:e[n.vertical]-t[r.vertical],left:e[n.horizontal]-t[r.horizontal]}}function Wr(e,t=0){if(e.targetEl===null||e.anchorEl===null||t>5)return;if(e.targetEl.offsetHeight===0||e.targetEl.offsetWidth===0){setTimeout(()=>{Wr(e,t+1)},10);return}let{targetEl:n,offset:r,anchorEl:i,anchorOrigin:a,selfOrigin:o,absoluteOffset:s,fit:c,cover:l,maxHeight:u,maxWidth:d}=e;if(p.is.ios===!0&&window.visualViewport!==void 0){let e=document.body.style,{offsetLeft:t,offsetTop:n}=window.visualViewport;t!==Pr&&(e.setProperty(`--q-pe-left`,t+`px`),Pr=t),n!==Fr&&(e.setProperty(`--q-pe-top`,n+`px`),Fr=n)}let{scrollLeft:f,scrollTop:m}=n,h=s===void 0?Br(i,l===!0?[0,0]:r):Vr(i,s,r);Object.assign(n.style,{top:0,left:0,minWidth:null,minHeight:null,maxWidth:d,maxHeight:u,visibility:`visible`});let{offsetWidth:g,offsetHeight:_}=n,{elWidth:v,elHeight:y}=c===!0||l===!0?{elWidth:Math.max(h.width,g),elHeight:l===!0?Math.max(h.height,_):_}:{elWidth:g,elHeight:_},b={maxWidth:d,maxHeight:u};(c===!0||l===!0)&&(b.minWidth=h.width+`px`,l===!0&&(b.minHeight=h.height+`px`)),Object.assign(n.style,b);let x=Hr(v,y),S=Ur(h,x,a,o);if(s===void 0||r===void 0)Gr(S,h,x,a,o);else{let{top:e,left:t}=S;Gr(S,h,x,a,o);let n=!1;if(S.top!==e){n=!0;let e=2*r[1];h.center=h.top-=e,h.bottom-=e+2}if(S.left!==t){n=!0;let e=2*r[0];h.middle=h.left-=e,h.right-=e+2}n===!0&&(S=Ur(h,x,a,o),Gr(S,h,x,a,o))}b={top:S.top+`px`,left:S.left+`px`},S.maxHeight!==void 0&&(b.maxHeight=S.maxHeight+`px`,h.height>S.maxHeight&&(b.minHeight=b.maxHeight)),S.maxWidth!==void 0&&(b.maxWidth=S.maxWidth+`px`,h.width>S.maxWidth&&(b.minWidth=b.maxWidth)),Object.assign(n.style,b),n.scrollTop!==m&&(n.scrollTop=m),n.scrollLeft!==f&&(n.scrollLeft=f)}function Gr(e,t,n,r,i){let a=n.bottom,o=n.right,s=pr(),c=window.innerHeight-s,l=document.body.clientWidth;if(e.top<0||e.top+a>c)if(i.vertical===`center`)e.top=t[r.vertical]>c/2?Math.max(0,c-a):0,e.maxHeight=Math.min(a,c);else if(t[r.vertical]>c/2){let n=Math.min(c,r.vertical===`center`?t.center:r.vertical===i.vertical?t.bottom:t.top);e.maxHeight=Math.min(a,n),e.top=Math.max(0,n-a)}else e.top=Math.max(0,r.vertical===`center`?t.center:r.vertical===i.vertical?t.top:t.bottom),e.maxHeight=Math.min(a,c-e.top);if(e.left<0||e.left+o>l)if(e.maxWidth=Math.min(o,l),i.horizontal===`middle`)e.left=t[r.horizontal]>l/2?Math.max(0,l-o):0;else if(t[r.horizontal]>l/2){let n=Math.min(l,r.horizontal===`middle`?t.middle:r.horizontal===i.horizontal?t.right:t.left);e.maxWidth=Math.min(o,n),e.left=Math.max(0,n-e.maxWidth)}else e.left=Math.max(0,r.horizontal===`middle`?t.middle:r.horizontal===i.horizontal?t.left:t.right),e.maxWidth=Math.min(o,l-e.left)}var Kr=h({name:`QMenu`,inheritAttrs:!1,props:{...Sn,...Tn,...Z,...Yn,persistent:Boolean,autoClose:Boolean,separateClosePopup:Boolean,noEscDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,fit:Boolean,cover:Boolean,square:Boolean,anchor:{type:String,validator:Ir},self:{type:String,validator:Ir},offset:{type:Array,validator:Lr},scrollTarget:$n,touchPosition:Boolean,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null}},emits:[...En,`click`,`escapeKey`],setup(t,{slots:n,emit:r,attrs:i}){let a=null,o,s,c,l=(0,e.getCurrentInstance)(),{proxy:u}=l,{$q:d}=u,f=(0,e.ref)(null),p=(0,e.ref)(!1),m=(0,e.computed)(()=>t.persistent!==!0&&t.noRouteDismiss!==!0),h=Q(t,d),{registerTick:g,removeTick:_}=Zn(),{registerTimeout:v}=Qn(),{transitionProps:y,transitionStyle:b}=Xn(t),{localScrollTarget:x,changeScrollEvent:S,unconfigureScrollTarget:w}=wn(t,V),{anchorEl:T,canShow:E}=Cn({showing:p}),{hide:D}=Dn({showing:p,canShow:E,handleShow:z,handleHide:B,hideOnRouteChange:m,processOnMount:!0}),{showPortal:k,hidePortal:A,renderPortal:j}=Jn(l,f,W,`menu`),M={anchorEl:T,innerRef:f,onClickOutside(e){if(t.persistent!==!0&&p.value===!0)return D(e),(e.type===`touchstart`||e.target.classList.contains(`q-dialog__backdrop`))&&O(e),!0}},N=(0,e.computed)(()=>zr(t.anchor||(t.cover===!0?`center middle`:`bottom start`),d.lang.rtl)),P=(0,e.computed)(()=>t.cover===!0?N.value:zr(t.self||`top start`,d.lang.rtl)),F=(0,e.computed)(()=>(t.square===!0?` q-menu--square`:``)+(h.value===!0?` q-menu--dark q-dark`:``)),I=(0,e.computed)(()=>t.autoClose===!0?{onClick:H}:{}),L=(0,e.computed)(()=>p.value===!0&&t.persistent!==!0);(0,e.watch)(L,e=>{e===!0?(Sr(U),Mr(M)):(Cr(U),Nr(M))});function R(){Nn(()=>{let e=f.value;e&&e.contains(document.activeElement)!==!0&&(e=e.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||e.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||e.querySelector(`[autofocus], [data-autofocus]`)||e,e.focus({preventScroll:!0}))})}function z(n){if(a=t.noRefocus===!1?document.activeElement:null,Er(te),k(),V(),o=void 0,n!==void 0&&(t.touchPosition||t.contextMenu)){let e=C(n);if(e.left!==void 0){let{top:t,left:n}=T.value.getBoundingClientRect();o={left:e.left-n,top:e.top-t}}}s===void 0&&(s=(0,e.watch)(()=>d.screen.width+`|`+d.screen.height+`|`+t.self+`|`+t.anchor+`|`+d.lang.rtl,ne)),t.noFocus!==!0&&document.activeElement.blur(),g(()=>{ne(),t.noFocus!==!0&&R()}),v(()=>{d.platform.is.ios===!0&&(c=t.autoClose,f.value.click()),ne(),k(!0),r(`show`,n)},t.transitionDuration)}function B(e){_(),A(),ee(!0),a!==null&&(e===void 0||e.qClickOutside!==!0)&&(((e?.type.indexOf(`key`)===0?a.closest(`[tabindex]:not([tabindex^="-"])`):void 0)||a).focus(),a=null),v(()=>{A(!0),r(`hide`,e)},t.transitionDuration)}function ee(e){o=void 0,s!==void 0&&(s(),s=void 0),(e===!0||p.value===!0)&&(Dr(te),w(),Nr(M),Cr(U)),e!==!0&&(a=null)}function V(){(T.value!==null||t.scrollTarget!==void 0)&&(x.value=tr(T.value,t.scrollTarget),S(x.value,ne))}function H(e){c===!0?c=!1:(Wn(u,e),r(`click`,e))}function te(e){L.value===!0&&t.noFocus!==!0&&Qt(f.value,e.target)!==!0&&R()}function U(e){t.noEscDismiss!==!0&&(r(`escapeKey`),D(e))}function ne(){Wr({targetEl:f.value,offset:t.offset,anchorEl:T.value,anchorOrigin:N.value,selfOrigin:P.value,absoluteOffset:o,fit:t.fit,cover:t.cover,maxHeight:t.maxHeight,maxWidth:t.maxWidth})}function W(){return(0,e.h)(e.Transition,y.value,()=>p.value===!0?(0,e.h)(`div`,{role:`menu`,...i,ref:f,tabindex:-1,class:[`q-menu q-position-engine scroll`+F.value,i.class],style:[i.style,b.value],...I.value},Y(n.default)):null)}return(0,e.onBeforeUnmount)(ee),Object.assign(u,{focus:R,updatePosition:ne}),j}});let qr,Jr=0,Yr=Array(256);for(let e=0;e<256;e++)Yr[e]=(e+256).toString(16).substring(1);let Xr=(()=>{let e=typeof crypto<`u`?crypto:typeof window<`u`?window.crypto||window.msCrypto:void 0;if(e!==void 0){if(e.randomBytes!==void 0)return e.randomBytes;if(e.getRandomValues!==void 0)return t=>{let n=new Uint8Array(t);return e.getRandomValues(n),n}}return e=>{let t=[];for(let n=e;n>0;n--)t.push(Math.floor(Math.random()*256));return t}})(),Zr=4096;function Qr(){(qr===void 0||Jr+16>Zr)&&(Jr=0,qr=Xr(Zr));let e=Array.prototype.slice.call(qr,Jr,Jr+=16);return e[6]=e[6]&15|64,e[8]=e[8]&63|128,Yr[e[0]]+Yr[e[1]]+Yr[e[2]]+Yr[e[3]]+`-`+Yr[e[4]]+Yr[e[5]]+`-`+Yr[e[6]]+Yr[e[7]]+`-`+Yr[e[8]]+Yr[e[9]]+`-`+Yr[e[10]]+Yr[e[11]]+Yr[e[12]]+Yr[e[13]]+Yr[e[14]]+Yr[e[15]]}function $r(e){return e??null}function ei(e,t){return e??(t===!0?`f_${Qr()}`:null)}function ti({getValue:t,required:n=!0}={}){if(a.value===!0){let r=t===void 0?(0,e.ref)(null):(0,e.ref)($r(t()));return n===!0&&r.value===null&&(0,e.onMounted)(()=>{r.value=`f_${Qr()}`}),t!==void 0&&(0,e.watch)(t,e=>{r.value=ei(e,n)}),r}return t===void 0?(0,e.ref)(`f_${Qr()}`):(0,e.computed)(()=>ei(t(),n))}let ni=Object.keys(fn);function ri(e){return ni.reduce((t,n)=>{let r=e[n];return r!==void 0&&(t[n]=r),t},{})}var ii=h({name:`QBtnDropdown`,props:{...fn,...Yn,modelValue:Boolean,split:Boolean,dropdownIcon:String,contentClass:[Array,String,Object],contentStyle:[Array,String,Object],cover:Boolean,persistent:Boolean,noEscDismiss:Boolean,noRouteDismiss:Boolean,autoClose:Boolean,noRefocus:Boolean,noFocus:Boolean,menuAnchor:{type:String,default:`bottom end`},menuSelf:{type:String,default:`top end`},menuOffset:Array,disableMainBtn:Boolean,disableDropdown:Boolean,noIconAnimation:Boolean,toggleAriaLabel:String},emits:[`update:modelValue`,`click`,`beforeShow`,`show`,`beforeHide`,`hide`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),a=(0,e.ref)(t.modelValue),o=(0,e.ref)(null),s=ti(),c=(0,e.computed)(()=>{let e={"aria-expanded":a.value===!0?`true`:`false`,"aria-haspopup":`true`,"aria-controls":s.value,"aria-label":t.toggleAriaLabel||i.$q.lang.label[a.value===!0?`collapse`:`expand`](t.label)};return(t.disable===!0||t.split===!1&&t.disableMainBtn===!0||t.disableDropdown===!0)&&(e[`aria-disabled`]=`true`),e}),l=(0,e.computed)(()=>`q-btn-dropdown__arrow`+(a.value===!0&&t.noIconAnimation===!1?` rotate-180`:``)+(t.split===!1?` q-btn-dropdown__arrow-container`:``)),u=(0,e.computed)(()=>dn(t)),d=(0,e.computed)(()=>ri(t));(0,e.watch)(()=>t.modelValue,e=>{o.value?.[e?`show`:`hide`]()}),(0,e.watch)(()=>t.split,b);function f(e){a.value=!0,r(`beforeShow`,e)}function p(e){r(`show`,e),r(`update:modelValue`,!0)}function m(e){a.value=!1,r(`beforeHide`,e)}function h(e){r(`hide`,e),r(`update:modelValue`,!1)}function g(e){r(`click`,e)}function _(e){E(e),b(),r(`click`,e)}function v(e){o.value?.toggle(e)}function y(e){o.value?.show(e)}function b(e){o.value?.hide(e)}return Object.assign(i,{show:y,hide:b,toggle:v}),(0,e.onMounted)(()=>{t.modelValue===!0&&y()}),()=>{let r=[(0,e.h)(X,{class:l.value,name:t.dropdownIcon||i.$q.iconSet.arrow.dropdown})];return t.disableDropdown!==!0&&r.push((0,e.h)(Kr,{ref:o,id:s.value,class:t.contentClass,style:t.contentStyle,cover:t.cover,fit:!0,persistent:t.persistent,noEscDismiss:t.noEscDismiss,noRouteDismiss:t.noRouteDismiss,autoClose:t.autoClose,noFocus:t.noFocus,noRefocus:t.noRefocus,anchor:t.menuAnchor,self:t.menuSelf,offset:t.menuOffset,separateClosePopup:!0,transitionShow:t.transitionShow,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,onBeforeShow:f,onShow:p,onBeforeHide:m,onHide:h},n.default)),t.split===!1?(0,e.h)($,{class:`q-btn-dropdown q-btn-dropdown--simple`,...d.value,...c.value,disable:t.disable===!0||t.disableMainBtn===!0,noWrap:!0,round:!1,onClick:g},{default:()=>Y(n.label,[]).concat(r),loading:n.loading}):(0,e.h)(yn,{class:`q-btn-dropdown q-btn-dropdown--split no-wrap q-btn-item`,rounded:t.rounded,square:t.square,...u.value,glossy:t.glossy,stretch:t.stretch},()=>[(0,e.h)($,{class:`q-btn-dropdown--current`,...d.value,disable:t.disable===!0||t.disableMainBtn===!0,noWrap:!0,round:!1,onClick:_},{default:n.label,loading:n.loading}),(0,e.h)($,{class:`q-btn-dropdown__arrow-container q-anchor--skip`,...c.value,...u.value,disable:t.disable===!0||t.disableDropdown===!0,rounded:t.rounded,color:t.color,textColor:t.textColor,dense:t.dense,size:t.size,padding:t.padding,ripple:t.ripple},()=>r)])}}});let ai={name:String};function oi(t){return(0,e.computed)(()=>({type:`hidden`,name:t.name,value:t.modelValue}))}function si(t={}){return(n,r,i)=>{n[r]((0,e.h)(`input`,{class:`hidden`+(i||``),...t.value}))}}function ci(t){return(0,e.computed)(()=>t.name||t.for)}var li=h({name:`QBtnToggle`,props:{...ai,modelValue:{required:!0},options:{type:Array,required:!0,validator:e=>e.every(e=>(`label`in e||`icon`in e||`slot`in e)&&`value`in e)},color:String,textColor:String,toggleColor:{type:String,default:`primary`},toggleTextColor:String,outline:Boolean,flat:Boolean,unelevated:Boolean,rounded:Boolean,push:Boolean,glossy:Boolean,size:String,padding:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,readonly:Boolean,disable:Boolean,stack:Boolean,stretch:Boolean,spread:Boolean,clearable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:[`update:modelValue`,`clear`,`click`],setup(t,{slots:n,emit:r}){let i=(0,e.computed)(()=>t.options.find(e=>e.value===t.modelValue)!==void 0),a=si((0,e.computed)(()=>({type:`hidden`,name:t.name,value:t.modelValue}))),o=(0,e.computed)(()=>dn(t)),s=(0,e.computed)(()=>({rounded:t.rounded,dense:t.dense,...o.value})),c=(0,e.computed)(()=>t.options.map((e,n)=>{let{attrs:r,value:i,slot:a,...o}=e;return{slot:a,props:{key:n,"aria-pressed":i===t.modelValue?`true`:`false`,...r,...o,...s.value,disable:t.disable===!0||o.disable===!0,color:i===t.modelValue?u(o,`toggleColor`):u(o,`color`),textColor:i===t.modelValue?u(o,`toggleTextColor`):u(o,`textColor`),noCaps:u(o,`noCaps`)===!0,noWrap:u(o,`noWrap`)===!0,size:u(o,`size`),padding:u(o,`padding`),ripple:u(o,`ripple`),stack:u(o,`stack`)===!0,stretch:u(o,`stretch`)===!0,onClick(t){l(i,e,t)}}}}));function l(e,n,i){t.readonly!==!0&&(t.modelValue===e?t.clearable===!0&&(r(`update:modelValue`,null,null),r(`clear`)):r(`update:modelValue`,e,n),r(`click`,i))}function u(e,n){return e[n]===void 0?t[n]:e[n]}function d(){let r=c.value.map(t=>(0,e.h)($,t.props,t.slot===void 0?void 0:n[t.slot]));return t.name!==void 0&&t.disable!==!0&&i.value===!0&&a(r,`push`),Qe(n.default,r)}return()=>(0,e.h)(yn,{class:`q-btn-toggle`,...o.value,rounded:t.rounded,stretch:t.stretch,glossy:t.glossy,spread:t.spread},d)}}),ui=h({name:`QCard`,props:{...Z,tag:{type:String,default:`div`},square:Boolean,flat:Boolean,bordered:Boolean},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=Q(t,r),a=(0,e.computed)(()=>`q-card`+(i.value===!0?` q-card--dark q-dark`:``)+(t.bordered===!0?` q-card--bordered`:``)+(t.square===!0?` q-card--square no-border-radius`:``)+(t.flat===!0?` q-card--flat no-shadow`:``));return()=>(0,e.h)(t.tag,{class:a.value},Y(n.default))}}),di=h({name:`QCardSection`,props:{tag:{type:String,default:`div`},horizontal:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-card__section q-card__section--${t.horizontal===!0?`horiz row no-wrap`:`vert`}`);return()=>(0,e.h)(t.tag,{class:r.value},Y(n.default))}}),fi=h({name:`QCardActions`,props:{...St,vertical:Boolean},setup(t,{slots:n}){let r=Ct(t),i=(0,e.computed)(()=>`q-card__actions ${r.value} q-card__actions--${t.vertical===!0?`vert column`:`horiz row`}`);return()=>(0,e.h)(`div`,{class:i.value},Y(n.default))}});let pi={left:!0,right:!0,up:!0,down:!0,horizontal:!0,vertical:!0},mi=Object.keys(pi);pi.all=!0;function hi(e){let t={};for(let n of mi)e[n]===!0&&(t[n]=!0);return Object.keys(t).length===0?pi:(t.horizontal===!0?t.left=t.right=!0:t.left===!0&&t.right===!0&&(t.horizontal=!0),t.vertical===!0?t.up=t.down=!0:t.up===!0&&t.down===!0&&(t.vertical=!0),t.horizontal===!0&&t.vertical===!0&&(t.all=!0),t)}let gi=[`INPUT`,`TEXTAREA`];function _i(e,t){return t.event===void 0&&e.target!==void 0&&e.target.draggable!==!0&&typeof t.handler==`function`&&gi.includes(e.target.nodeName.toUpperCase())===!1&&(e.qClonedBy===void 0||e.qClonedBy.indexOf(t.uid)===-1)}function vi(e){let t=[.06,6,50];return typeof e==`string`&&e.length&&e.split(`:`).forEach((e,n)=>{let r=parseFloat(e);r&&(t[n]=r)}),t}var yi=g({name:`touch-swipe`,beforeMount(e,{value:t,arg:n,modifiers:r}){if(r.mouse!==!0&&p.has.touch!==!0)return;let i=r.mouseCapture===!0?`Capture`:``,a={handler:t,sensitivity:vi(n),direction:hi(r),noop:y,mouseStart(e){_i(e,a)&&b(e)&&(A(a,`temp`,[[document,`mousemove`,`move`,`notPassive${i}`],[document,`mouseup`,`end`,`notPassiveCapture`]]),a.start(e,!0))},touchStart(e){if(_i(e,a)){let t=e.target;A(a,`temp`,[[t,`touchmove`,`move`,`notPassiveCapture`],[t,`touchcancel`,`end`,`notPassiveCapture`],[t,`touchend`,`end`,`notPassiveCapture`]]),a.start(e)}},start(t,n){p.is.firefox===!0&&k(e,!0);let r=C(t);a.event={x:r.left,y:r.top,time:Date.now(),mouse:n===!0,dir:!1}},move(e){if(a.event===void 0)return;if(a.event.dir!==!1){O(e);return}let t=Date.now()-a.event.time;if(t===0)return;let n=C(e),r=n.left-a.event.x,i=Math.abs(r),o=n.top-a.event.y,s=Math.abs(o);if(a.event.mouse!==!0){if(ia.sensitivity[0]&&(a.event.dir=o<0?`up`:`down`),a.direction.horizontal===!0&&i>s&&s<100&&c>a.sensitivity[0]&&(a.event.dir=r<0?`left`:`right`),a.direction.up===!0&&ia.sensitivity[0]&&(a.event.dir=`up`),a.direction.down===!0&&i0&&i<100&&l>a.sensitivity[0]&&(a.event.dir=`down`),a.direction.left===!0&&i>s&&r<0&&s<100&&c>a.sensitivity[0]&&(a.event.dir=`left`),a.direction.right===!0&&i>s&&r>0&&s<100&&c>a.sensitivity[0]&&(a.event.dir=`right`),a.event.dir===!1?a.end(e):(O(e),a.event.mouse===!0&&(document.body.classList.add(`no-pointer-events--children`),document.body.classList.add(`non-selectable`),bn(),a.styleCleanup=e=>{a.styleCleanup=void 0,document.body.classList.remove(`non-selectable`);let t=()=>{document.body.classList.remove(`no-pointer-events--children`)};e===!0?setTimeout(t,50):t()}),a.handler({evt:e,touch:a.event.mouse!==!0,mouse:a.event.mouse,direction:a.event.dir,duration:t,distance:{x:i,y:s}}))},end(t){a.event!==void 0&&(j(a,`temp`),p.is.firefox===!0&&k(e,!1),a.styleCleanup?.(!0),t!==void 0&&a.event.dir!==!1&&O(t),a.event=void 0)}};e.__qtouchswipe=a,r.mouse===!0&&A(a,`main`,[[e,`mousedown`,`mouseStart`,`passive${r.mouseCapture===!0||r.mousecapture===!0?`Capture`:``}`]]),p.has.touch===!0&&A(a,`main`,[[e,`touchstart`,`touchStart`,`passive${r.capture===!0?`Capture`:``}`],[e,`touchmove`,`noop`,`notPassiveCapture`]])},updated(e,t){let n=e.__qtouchswipe;n!==void 0&&(t.oldValue!==t.value&&(typeof t.value!=`function`&&n.end(),n.handler=t.value),n.direction=hi(t.modifiers))},beforeUnmount(e){let t=e.__qtouchswipe;t!==void 0&&(j(t,`main`),j(t,`temp`),p.is.firefox===!0&&k(e,!1),t.styleCleanup?.(),delete e.__qtouchswipe)}});function bi(){let e=Object.create(null);return{getCache:(t,n)=>e[t]===void 0?e[t]=typeof n==`function`?n():n:e[t],setCache(t,n){e[t]=n},hasCache(t){return Object.hasOwnProperty.call(e,t)},clearCache(t){t===void 0?e=Object.create(null):delete e[t]}}}let xi={name:{required:!0},disable:Boolean},Si={setup(t,{slots:n}){return()=>(0,e.h)(`div`,{class:`q-panel scroll`,role:`tabpanel`},Y(n.default))}},Ci={modelValue:{required:!0},animated:Boolean,infinite:Boolean,swipeable:Boolean,vertical:Boolean,transitionPrev:String,transitionNext:String,transitionDuration:{type:[String,Number],default:300},keepAlive:Boolean,keepAliveInclude:[String,Array,RegExp],keepAliveExclude:[String,Array,RegExp],keepAliveMax:Number},wi=[`update:modelValue`,`beforeTransition`,`transition`];function Ti(){let{props:t,emit:n,proxy:r}=(0,e.getCurrentInstance)(),{getCache:i}=bi(),{registerTimeout:a}=Qn(),o,s,c=(0,e.ref)(null),l={value:null};function u(e){let n=t.vertical===!0?`up`:`left`;T((r.$q.lang.rtl===!0?-1:1)*(e.direction===n?1:-1))}let d=(0,e.computed)(()=>[[yi,u,void 0,{horizontal:t.vertical!==!0,vertical:t.vertical,mouse:!0}]]),f=(0,e.computed)(()=>t.transitionPrev||`slide-${t.vertical===!0?`down`:`right`}`),p=(0,e.computed)(()=>t.transitionNext||`slide-${t.vertical===!0?`up`:`left`}`),m=(0,e.computed)(()=>`--q-transition-duration: ${t.transitionDuration}ms`),h=(0,e.computed)(()=>typeof t.modelValue==`string`||typeof t.modelValue==`number`?t.modelValue:String(t.modelValue)),g=(0,e.computed)(()=>({include:t.keepAliveInclude,exclude:t.keepAliveExclude,max:t.keepAliveMax})),_=(0,e.computed)(()=>t.keepAliveInclude!==void 0||t.keepAliveExclude!==void 0);(0,e.watch)(()=>t.modelValue,(e,r)=>{let i=x(e)===!0?S(e):-1;s!==!0&&w(i===-1?0:i{n(`transition`,e,r)},t.transitionDuration))});function v(){T(1)}function y(){T(-1)}function b(e){n(`update:modelValue`,e)}function x(e){return e!=null&&e!==``}function S(e){return o.findIndex(t=>t.props.name===e&&t.props.disable!==``&&t.props.disable!==!0)}function C(){return o.filter(e=>e.props.disable!==``&&e.props.disable!==!0)}function w(e){let n=e!==0&&t.animated===!0&&l.value!==-1?`q-transition--`+(e===-1?f.value:p.value):null;c.value!==n&&(c.value=n)}function T(e,r=l.value){let i=r+e;for(;i!==-1&&i{s=!1});return}i+=e}t.infinite===!0&&o.length!==0&&r!==-1&&r!==o.length&&T(e,e===-1?o.length:-1)}function E(){let e=S(t.modelValue);return l.value!==e&&(l.value=e),!0}function D(){let n=x(t.modelValue)===!0&&E()&&o[l.value];return t.keepAlive===!0?[(0,e.h)(e.KeepAlive,g.value,[(0,e.h)(_.value===!0?i(h.value,()=>({...Si,name:h.value})):Si,{key:h.value,style:m.value},()=>n)])]:[(0,e.h)(`div`,{class:`q-panel scroll`,style:m.value,key:h.value,role:`tabpanel`},[n])]}function O(){if(o.length!==0)return t.animated===!0?[(0,e.h)(e.Transition,{name:c.value},D)]:D()}function k(e){return o=Et(Y(e.default,[])).filter(e=>e.props!==null&&e.props.slot===void 0&&x(e.props.name)===!0),o.length}function A(){return o}return Object.assign(r,{next:v,previous:y,goTo:b}),{panelIndex:l,panelDirectives:d,updatePanelsList:k,updatePanelIndex:E,getPanelContent:O,getEnabledPanels:C,getPanels:A,isValidPanelName:x,keepAliveProps:g,needsUniqueKeepAliveWrapper:_,goToPanelByOffset:T,goToPanel:b,nextPanel:v,previousPanel:y}}let Ei=0,Di={fullscreen:Boolean,noRouteFullscreenExit:Boolean},Oi=[`update:fullscreen`,`fullscreen`];function ki(){let t=(0,e.getCurrentInstance)(),{props:n,emit:r,proxy:i}=t,a,o,s,c=(0,e.ref)(!1);Dt(t)===!0&&(0,e.watch)(()=>i.$route.fullPath,()=>{n.noRouteFullscreenExit!==!0&&d()}),(0,e.watch)(()=>n.fullscreen,e=>{c.value!==e&&l()}),(0,e.watch)(c,e=>{r(`update:fullscreen`,e),r(`fullscreen`,e)});function l(){c.value===!0?d():u()}function u(){c.value!==!0&&(c.value=!0,s=i.$el.parentNode,s.replaceChild(o,i.$el),document.body.appendChild(i.$el),Ei++,Ei===1&&document.body.classList.add(`q-body--fullscreen-mixin`),a={handler:d},ae.add(a))}function d(){c.value===!0&&(a!==void 0&&(ae.remove(a),a=void 0),s.replaceChild(i.$el,o),c.value=!1,Ei=Math.max(0,Ei-1),Ei===0&&(document.body.classList.remove(`q-body--fullscreen-mixin`),i.$el.scrollIntoView!==void 0&&setTimeout(()=>{i.$el.scrollIntoView()})))}return(0,e.onBeforeMount)(()=>{o=document.createElement(`span`)}),(0,e.onMounted)(()=>{n.fullscreen===!0&&u()}),(0,e.onBeforeUnmount)(d),Object.assign(i,{toggleFullscreen:l,setFullscreen:u,exitFullscreen:d}),{inFullscreen:c,toggleFullscreen:l}}let Ai=[`top`,`right`,`bottom`,`left`],ji=[`regular`,`flat`,`outline`,`push`,`unelevated`];var Mi=h({name:`QCarousel`,props:{...Z,...Ci,...Di,transitionPrev:{type:String,default:`fade`},transitionNext:{type:String,default:`fade`},height:String,padding:Boolean,controlColor:String,controlTextColor:String,controlType:{type:String,validator:e=>ji.includes(e),default:`flat`},autoplay:[Number,Boolean],arrows:Boolean,prevIcon:String,nextIcon:String,navigation:Boolean,navigationPosition:{type:String,validator:e=>Ai.includes(e)},navigationIcon:String,navigationActiveIcon:String,thumbnails:Boolean},emits:[...Oi,...wi],setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=Q(t,r),a=null,o,{updatePanelsList:s,getPanelContent:c,panelDirectives:l,goToPanel:u,previousPanel:d,nextPanel:f,getEnabledPanels:p,panelIndex:m}=Ti(),{inFullscreen:h}=ki(),g=(0,e.computed)(()=>h.value!==!0&&t.height!==void 0?{height:t.height}:{}),_=(0,e.computed)(()=>t.vertical===!0?`vertical`:`horizontal`),v=(0,e.computed)(()=>t.navigationPosition||(t.vertical===!0?`right`:`bottom`)),y=(0,e.computed)(()=>`q-carousel q-panel-parent q-carousel--with${t.padding===!0?``:`out`}-padding`+(h.value===!0?` fullscreen`:``)+(i.value===!0?` q-carousel--dark q-dark`:``)+(t.arrows===!0?` q-carousel--arrows-${_.value}`:``)+(t.navigation===!0?` q-carousel--navigation-${v.value}`:``)),b=(0,e.computed)(()=>{let e=[t.prevIcon||r.iconSet.carousel[t.vertical===!0?`up`:`left`],t.nextIcon||r.iconSet.carousel[t.vertical===!0?`down`:`right`]];return t.vertical===!1&&r.lang.rtl===!0?e.reverse():e}),x=(0,e.computed)(()=>t.navigationIcon||r.iconSet.carousel.navigationIcon),S=(0,e.computed)(()=>t.navigationActiveIcon||x.value),C=(0,e.computed)(()=>({color:t.controlColor,textColor:t.controlTextColor,round:!0,[t.controlType]:!0,dense:!0}));(0,e.watch)(()=>t.modelValue,()=>{t.autoplay&&w()}),(0,e.watch)(()=>t.autoplay,e=>{e?w():a!==null&&(clearTimeout(a),a=null)});function w(){let e=Te(t.autoplay)===!0?Math.abs(t.autoplay):5e3;a!==null&&clearTimeout(a),a=setTimeout(()=>{a=null,e>=0?f():d()},e)}(0,e.onMounted)(()=>{t.autoplay&&w()}),(0,e.onBeforeUnmount)(()=>{a!==null&&clearTimeout(a)});function T(n,r){return(0,e.h)(`div`,{class:`q-carousel__control q-carousel__navigation no-wrap absolute flex q-carousel__navigation--${n} q-carousel__navigation--${v.value}`+(t.controlColor===void 0?``:` text-${t.controlColor}`)},[(0,e.h)(`div`,{class:`q-carousel__navigation-inner flex flex-center no-wrap`},p().map(r))])}function E(){let r=[];if(t.navigation===!0){let t=n[`navigation-icon`]===void 0?t=>(0,e.h)($,{key:`nav`+t.name,class:`q-carousel__navigation-icon q-carousel__navigation-icon--${t.active===!0?``:`in`}active`,...t.btnProps,onClick:t.onClick}):n[`navigation-icon`],i=o-1;r.push(T(`buttons`,(e,n)=>{let r=e.props.name,a=m.value===n;return t({index:n,maxIndex:i,name:r,active:a,btnProps:{icon:a===!0?S.value:x.value,size:`sm`,...C.value},onClick:()=>{u(r)}})}))}else if(t.thumbnails===!0){let n=t.controlColor===void 0?``:` text-${t.controlColor}`;r.push(T(`thumbnails`,r=>{let i=r.props;return(0,e.h)(`img`,{key:`tmb#`+i.name,class:`q-carousel__thumbnail q-carousel__thumbnail--${i.name===t.modelValue?``:`in`}active`+n,src:i.imgSrc||i[`img-src`],onClick:()=>{u(i.name)}})}))}return t.arrows===!0&&m.value>=0&&((t.infinite===!0||m.value>0)&&r.push((0,e.h)(`div`,{key:`prev`,class:`q-carousel__control q-carousel__arrow q-carousel__prev-arrow q-carousel__prev-arrow--${_.value} absolute flex flex-center`},[(0,e.h)($,{icon:b.value[0],...C.value,onClick:d})])),(t.infinite===!0||m.value(o=s(n),(0,e.h)(`div`,{class:y.value,style:g.value},[et(`div`,{class:`q-carousel__slides-container`},c(),`sl-cont`,t.swipeable,()=>l.value)].concat(E())))}}),Ni=h({name:`QCarouselSlide`,props:{...xi,imgSrc:String},setup(t,{slots:n}){let r=(0,e.computed)(()=>t.imgSrc?{backgroundImage:`url("${t.imgSrc}")`}:{});return()=>(0,e.h)(`div`,{class:`q-carousel__slide`,style:r.value},Y(n.default))}}),Pi=h({name:`QCarouselControl`,props:{position:{type:String,default:`bottom-right`,validator:e=>[`top-right`,`top-left`,`bottom-right`,`bottom-left`,`top`,`right`,`bottom`,`left`].includes(e)},offset:{type:Array,default:()=>[18,18],validator:e=>e.length===2}},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-carousel__control absolute absolute-${t.position}`),i=(0,e.computed)(()=>({margin:`${t.offset[1]}px ${t.offset[0]}px`}));return()=>(0,e.h)(`div`,{class:r.value,style:i.value},Y(n.default))}}),Fi=h({name:`QChatMessage`,props:{sent:Boolean,label:String,bgColor:String,textColor:String,name:String,avatar:String,text:Array,stamp:String,size:String,labelHtml:Boolean,nameHtml:Boolean,textHtml:Boolean,stampHtml:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>t.sent===!0?`sent`:`received`),i=(0,e.computed)(()=>`q-message-text-content q-message-text-content--${r.value}`+(t.textColor===void 0?``:` text-${t.textColor}`)),a=(0,e.computed)(()=>`q-message-text q-message-text--${r.value}`+(t.bgColor===void 0?``:` text-${t.bgColor}`)),o=(0,e.computed)(()=>`q-message-container row items-end no-wrap`+(t.sent===!0?` reverse`:``)),s=(0,e.computed)(()=>t.size===void 0?``:`col-${t.size}`),c=(0,e.computed)(()=>({msg:t.textHtml===!0?`innerHTML`:`textContent`,stamp:t.stampHtml===!0?`innerHTML`:`textContent`,name:t.nameHtml===!0?`innerHTML`:`textContent`,label:t.labelHtml===!0?`innerHTML`:`textContent`}));function l(r){return n.stamp===void 0?t.stamp?[r,(0,e.h)(`div`,{class:`q-message-stamp`,[c.value.stamp]:t.stamp})]:[r]:[r,(0,e.h)(`div`,{class:`q-message-stamp`},n.stamp())]}function u(t,n){let r=n===!0?t.length>1?e=>e:t=>(0,e.h)(`div`,[t]):t=>(0,e.h)(`div`,{[c.value.msg]:t});return t.map((t,n)=>(0,e.h)(`div`,{key:n,class:a.value},[(0,e.h)(`div`,{class:i.value},l(r(t)))]))}return()=>{let i=[];n.avatar===void 0?t.avatar!==void 0&&i.push((0,e.h)(`img`,{class:`q-message-avatar q-message-avatar--${r.value}`,src:t.avatar,"aria-hidden":`true`})):i.push(n.avatar());let a=[];n.name===void 0?t.name!==void 0&&a.push((0,e.h)(`div`,{class:`q-message-name q-message-name--${r.value}`,[c.value.name]:t.name})):a.push((0,e.h)(`div`,{class:`q-message-name q-message-name--${r.value}`},n.name())),n.default===void 0?t.text!==void 0&&a.push(u(t.text)):a.push(u(Et(n.default()),!0)),i.push((0,e.h)(`div`,{class:s.value},a));let l=[];return n.label===void 0?t.label!==void 0&&l.push((0,e.h)(`div`,{class:`q-message-label`,[c.value.label]:t.label})):l.push((0,e.h)(`div`,{class:`q-message-label`},n.label())),l.push((0,e.h)(`div`,{class:o.value},i)),(0,e.h)(`div`,{class:`q-message q-message-${r.value}`},l)}}});function Ii(t,n){let r=(0,e.ref)(null),i=(0,e.computed)(()=>t.disable===!0?null:(0,e.h)(`span`,{ref:r,class:`no-outline`,tabindex:-1}));function a(e){let t=n.value;e?.qAvoidFocus!==!0&&(e?.type.indexOf(`key`)===0?document.activeElement!==t&&t?.contains(document.activeElement)===!0&&t.focus():r.value!==null&&(e===void 0||t?.contains(e.target)===!0)&&r.value.focus())}return{refocusTargetEl:i,refocusTarget:a}}var Li={xs:30,sm:35,md:40,lg:50,xl:60};let Ri={...Z,...Ye,...ai,modelValue:{required:!0,default:null},val:{},trueValue:{default:!0},falseValue:{default:!1},indeterminateValue:{default:null},checkedIcon:String,uncheckedIcon:String,indeterminateIcon:String,toggleOrder:{type:String,validator:e=>e===`tf`||e===`ft`},toggleIndeterminate:Boolean,label:String,leftLabel:Boolean,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},zi=[`update:modelValue`];function Bi(t,n){let{props:r,slots:i,emit:a,proxy:o}=(0,e.getCurrentInstance)(),{$q:s}=o,c=Q(r,s),l=(0,e.ref)(null),{refocusTargetEl:u,refocusTarget:d}=Ii(r,l),f=Xe(r,Li),p=(0,e.computed)(()=>r.val!==void 0&&Array.isArray(r.modelValue)),m=(0,e.computed)(()=>{let t=(0,e.toRaw)(r.val);return p.value===!0?r.modelValue.findIndex(n=>(0,e.toRaw)(n)===t):-1}),h=(0,e.computed)(()=>p.value===!0?m.value!==-1:(0,e.toRaw)(r.modelValue)===(0,e.toRaw)(r.trueValue)),g=(0,e.computed)(()=>p.value===!0?m.value===-1:(0,e.toRaw)(r.modelValue)===(0,e.toRaw)(r.falseValue)),_=(0,e.computed)(()=>h.value===!1&&g.value===!1),v=(0,e.computed)(()=>r.disable===!0?-1:r.tabindex||0),y=(0,e.computed)(()=>`q-${t} cursor-pointer no-outline row inline no-wrap items-center`+(r.disable===!0?` disabled`:``)+(c.value===!0?` q-${t}--dark`:``)+(r.dense===!0?` q-${t}--dense`:``)+(r.leftLabel===!0?` reverse`:``)),b=(0,e.computed)(()=>`q-${t}__inner relative-position non-selectable q-${t}__inner--${h.value===!0?`truthy`:g.value===!0?`falsy`:`indet`}${r.color!==void 0&&(r.keepColor===!0||(t===`toggle`?h.value===!0:g.value!==!0))?` text-${r.color}`:``}`),x=si((0,e.computed)(()=>{let e={type:`checkbox`};return r.name!==void 0&&Object.assign(e,{".checked":h.value,"^checked":h.value===!0?`checked`:void 0,name:r.name,value:p.value===!0?r.val:r.trueValue}),e})),S=(0,e.computed)(()=>{let e={tabindex:v.value,role:t===`toggle`?`switch`:`checkbox`,"aria-label":r.label,"aria-checked":_.value===!0?`mixed`:h.value===!0?`true`:`false`};return r.disable===!0&&(e[`aria-disabled`]=`true`),e});function C(e){e!==void 0&&(O(e),d(e)),r.disable!==!0&&a(`update:modelValue`,w(),e)}function w(){if(p.value===!0){if(h.value===!0){let e=r.modelValue.slice();return e.splice(m.value,1),e}return r.modelValue.concat([r.val])}if(h.value===!0){if(r.toggleOrder!==`ft`||r.toggleIndeterminate===!1)return r.falseValue}else if(g.value===!0){if(r.toggleOrder===`ft`||r.toggleIndeterminate===!1)return r.trueValue}else return r.toggleOrder===`ft`?r.falseValue:r.trueValue;return r.indeterminateValue}function T(e){(e.keyCode===13||e.keyCode===32)&&O(e)}function E(e){(e.keyCode===13||e.keyCode===32)&&C(e)}let D=n(h,_);return Object.assign(o,{toggle:C}),()=>{let n=D();r.disable!==!0&&x(n,`unshift`,` q-${t}__native absolute q-ma-none q-pa-none`);let a=[(0,e.h)(`div`,{class:b.value,style:f.value,"aria-hidden":`true`},n)];u.value!==null&&a.push(u.value);let o=r.label===void 0?Y(i.default):Qe(i.default,[r.label]);return o!==void 0&&a.push((0,e.h)(`div`,{class:`q-${t}__label q-anchor--skip`},o)),(0,e.h)(`div`,{ref:l,class:y.value,...S.value,onClick:C,onKeydown:T,onKeyup:E},a)}}let Vi=()=>(0,e.h)(`div`,{key:`svg`,class:`q-checkbox__bg absolute`},[(0,e.h)(`svg`,{class:`q-checkbox__svg fit absolute-full`,viewBox:`0 0 24 24`},[(0,e.h)(`path`,{class:`q-checkbox__truthy`,fill:`none`,d:`M1.73,12.91 8.1,19.28 22.79,4.59`}),(0,e.h)(`path`,{class:`q-checkbox__indet`,d:`M4,14H20V10H4`})])]);var Hi=h({name:`QCheckbox`,props:Ri,emits:zi,setup(t){let n=Vi();function r(r,i){let a=(0,e.computed)(()=>(r.value===!0?t.checkedIcon:i.value===!0?t.indeterminateIcon:t.uncheckedIcon)||null);return()=>a.value===null?[n]:[(0,e.h)(`div`,{key:`icon`,class:`q-checkbox__icon-container absolute-full flex flex-center no-wrap`},[(0,e.h)(X,{class:`q-checkbox__icon`,name:a.value})])]}return Bi(`checkbox`,r)}});let Ui={xs:8,sm:10,md:14,lg:20,xl:24};var Wi=h({name:`QChip`,props:{...Z,...Ye,dense:Boolean,icon:String,iconRight:String,iconRemove:String,iconSelected:String,label:[String,Number],color:String,textColor:String,modelValue:{type:Boolean,default:!0},selected:{type:Boolean,default:null},square:Boolean,outline:Boolean,clickable:Boolean,removable:Boolean,removeAriaLabel:String,tabindex:[String,Number],disable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:[`update:modelValue`,`update:selected`,`remove`,`click`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=Q(t,i),o=Xe(t,Ui),s=(0,e.computed)(()=>t.selected===!0||t.icon!==void 0),c=(0,e.computed)(()=>t.selected===!0?t.iconSelected||i.iconSet.chip.selected:t.icon),l=(0,e.computed)(()=>t.iconRemove||i.iconSet.chip.remove),u=(0,e.computed)(()=>t.disable===!1&&(t.clickable===!0||t.selected!==null)),d=(0,e.computed)(()=>{let e=t.outline===!0&&t.color||t.textColor;return`q-chip row inline no-wrap items-center`+(t.outline===!1&&t.color!==void 0?` bg-${t.color}`:``)+(e?` text-${e} q-chip--colored`:``)+(t.disable===!0?` disabled`:``)+(t.dense===!0?` q-chip--dense`:``)+(t.outline===!0?` q-chip--outline`:``)+(t.selected===!0?` q-chip--selected`:``)+(u.value===!0?` q-chip--clickable cursor-pointer non-selectable q-hoverable`:``)+(t.square===!0?` q-chip--square`:``)+(a.value===!0?` q-chip--dark q-dark`:``)}),f=(0,e.computed)(()=>{let e=t.disable===!0?{tabindex:-1,"aria-disabled":`true`}:{tabindex:t.tabindex||0};return{chip:e,remove:{...e,role:`button`,"aria-hidden":`false`,"aria-label":t.removeAriaLabel||i.lang.label.remove}}});function p(e){e.keyCode===13&&m(e)}function m(e){t.disable||(r(`update:selected`,!t.selected),r(`click`,e))}function h(e){(e.keyCode===void 0||e.keyCode===13)&&(O(e),t.disable===!1&&(r(`update:modelValue`,!1),r(`remove`)))}function g(){let r=[];u.value===!0&&r.push((0,e.h)(`div`,{class:`q-focus-helper`})),s.value===!0&&r.push((0,e.h)(X,{class:`q-chip__icon q-chip__icon--left`,name:c.value}));let i=t.label===void 0?void 0:[(0,e.h)(`div`,{class:`ellipsis`},[t.label])];return r.push((0,e.h)(`div`,{class:`q-chip__content col row no-wrap items-center q-anchor--skip`},$e(n.default,i))),t.iconRight&&r.push((0,e.h)(X,{class:`q-chip__icon q-chip__icon--right`,name:t.iconRight})),t.removable===!0&&r.push((0,e.h)(X,{class:`q-chip__icon q-chip__icon--remove cursor-pointer`,name:l.value,...f.value.remove,onClick:h,onKeyup:h})),r}return()=>{if(t.modelValue===!1)return;let e={class:d.value,style:o.value};return u.value===!0&&Object.assign(e,f.value.chip,{onClick:m,onKeyup:p}),et(`div`,e,g(),`ripple`,t.ripple!==!1&&t.disable!==!0,()=>[[rn,t.ripple]])}}});let Gi={...Ye,min:{type:Number,default:0},max:{type:Number,default:100},color:String,centerColor:String,trackColor:String,fontSize:String,rounded:Boolean,thickness:{type:Number,default:.2,validator:e=>e>=0&&e<=1},angle:{type:Number,default:0},showValue:Boolean,reverse:Boolean,instantFeedback:Boolean},Ki=100*Math.PI,qi=Math.round(Ki*1e3)/1e3;var Ji=h({name:`QCircularProgress`,props:{...Gi,value:{type:Number,default:0},animationSpeed:{type:[String,Number],default:600},indeterminate:Boolean},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=Xe(t),a=(0,e.computed)(()=>{let e=(r.lang.rtl===!0?-1:1)*t.angle;return{transform:t.reverse===(r.lang.rtl===!0)?`rotate3d(0, 0, 1, ${e-90}deg)`:`scale3d(-1, 1, 1) rotate3d(0, 0, 1, ${-90-e}deg)`}}),o=(0,e.computed)(()=>t.instantFeedback!==!0&&t.indeterminate!==!0?{transition:`stroke-dashoffset ${t.animationSpeed}ms ease 0s, stroke ${t.animationSpeed}ms ease`}:``),s=(0,e.computed)(()=>100/(1-t.thickness/2)),c=(0,e.computed)(()=>`${s.value/2} ${s.value/2} ${s.value} ${s.value}`),l=(0,e.computed)(()=>Fe(t.value,t.min,t.max)),u=(0,e.computed)(()=>t.max-t.min),d=(0,e.computed)(()=>t.thickness/2*s.value),f=(0,e.computed)(()=>{let e=(t.max-l.value)/u.value,n=t.rounded===!0&&l.value{let r=[];t.centerColor!==void 0&&t.centerColor!==`transparent`&&r.push((0,e.h)(`circle`,{class:`q-circular-progress__center text-${t.centerColor}`,fill:`currentColor`,r:50-d.value/2,cx:s.value,cy:s.value})),t.trackColor!==void 0&&t.trackColor!==`transparent`&&r.push(p({cls:`track`,thickness:d.value,offset:0,color:t.trackColor})),r.push(p({cls:`circle`,thickness:d.value,offset:f.value,color:t.color,rounded:t.rounded===!0?`round`:void 0}));let o=[(0,e.h)(`svg`,{class:`q-circular-progress__svg`,style:a.value,viewBox:c.value,"aria-hidden":`true`},r)];return t.showValue===!0&&o.push((0,e.h)(`div`,{class:`q-circular-progress__text absolute-full row flex-center content-center`,style:{fontSize:t.fontSize}},n.default===void 0?[(0,e.h)(`div`,l.value)]:n.default())),(0,e.h)(`div`,{class:`q-circular-progress q-circular-progress--${t.indeterminate===!0?`in`:``}determinate`,style:i.value,role:`progressbar`,"aria-valuemin":t.min,"aria-valuemax":t.max,"aria-valuenow":t.indeterminate===!0?void 0:l.value},$e(n.internal,o))}}});function Yi(e,t,n){let r=C(e),i,a=r.left-t.event.x,o=r.top-t.event.y,s=Math.abs(a),c=Math.abs(o),l=t.direction;l.horizontal===!0&&l.vertical!==!0?i=a<0?`left`:`right`:l.horizontal!==!0&&l.vertical===!0?i=o<0?`up`:`down`:l.up===!0&&o<0?(i=`up`,s>c&&(l.left===!0&&a<0?i=`left`:l.right===!0&&a>0&&(i=`right`))):l.down===!0&&o>0?(i=`down`,s>c&&(l.left===!0&&a<0?i=`left`:l.right===!0&&a>0&&(i=`right`))):l.left===!0&&a<0?(i=`left`,s0&&(i=`down`))):l.right===!0&&a>0&&(i=`right`,s0&&(i=`down`)));let u=!1;if(i===void 0&&n===!1){if(t.event.isFirst===!0||t.event.lastDir===void 0)return{};i=t.event.lastDir,u=!0,i===`left`||i===`right`?(r.left-=a,s=0,a=0):(r.top-=o,c=0,o=0)}return{synthetic:u,payload:{evt:e,touch:t.event.mouse!==!0,mouse:t.event.mouse===!0,position:r,direction:i,isFirst:t.event.isFirst,isFinal:n===!0,duration:Date.now()-t.event.time,distance:{x:s,y:c},offset:{x:a,y:o},delta:{x:r.left-t.event.lastX,y:r.top-t.event.lastY}}}}let Xi=0;var Zi=g({name:`touch-pan`,beforeMount(e,{value:t,modifiers:n}){if(n.mouse!==!0&&p.has.touch!==!0)return;function r(e,t){n.mouse===!0&&t===!0?O(e):(n.stop===!0&&E(e),n.prevent===!0&&D(e))}let i={uid:`qvtp_`+ Xi++,handler:t,modifiers:n,direction:hi(n),noop:y,mouseStart(e){_i(e,i)&&b(e)&&(A(i,`temp`,[[document,`mousemove`,`move`,`notPassiveCapture`],[document,`mouseup`,`end`,`passiveCapture`]]),i.start(e,!0))},touchStart(e){if(_i(e,i)){let t=e.target;A(i,`temp`,[[t,`touchmove`,`move`,`notPassiveCapture`],[t,`touchcancel`,`end`,`passiveCapture`],[t,`touchend`,`end`,`passiveCapture`]]),i.start(e)}},start(t,r){if(p.is.firefox===!0&&k(e,!0),i.lastEvt=t,r===!0||n.stop===!0){if(i.direction.all!==!0&&(r!==!0||i.modifiers.mouseAllDir!==!0&&i.modifiers.mousealldir!==!0)){let e=t.type.indexOf(`mouse`)===-1?new TouchEvent(t.type,t):new MouseEvent(t.type,t);t.defaultPrevented===!0&&D(e),t.cancelBubble===!0&&E(e),Object.assign(e,{qKeyEvent:t.qKeyEvent,qClickOutside:t.qClickOutside,qAnchorHandled:t.qAnchorHandled,qClonedBy:t.qClonedBy===void 0?[i.uid]:t.qClonedBy.concat(i.uid)}),i.initialEvent={target:t.target,event:e}}E(t)}let{left:a,top:o}=C(t);i.event={x:a,y:o,time:Date.now(),mouse:r===!0,detected:!1,isFirst:!0,isFinal:!1,lastX:a,lastY:o}},move(e){if(i.event===void 0)return;let t=C(e),a=t.left-i.event.x,o=t.top-i.event.y;if(a===0&&o===0)return;i.lastEvt=e;let s=i.event.mouse===!0,c=()=>{r(e,s);let t;n.preserveCursor!==!0&&n.preservecursor!==!0&&(t=document.documentElement.style.cursor||``,document.documentElement.style.cursor=`grabbing`),s===!0&&document.body.classList.add(`no-pointer-events--children`),document.body.classList.add(`non-selectable`),bn(),i.styleCleanup=e=>{if(i.styleCleanup=void 0,t!==void 0&&(document.documentElement.style.cursor=t),document.body.classList.remove(`non-selectable`),s===!0){let t=()=>{document.body.classList.remove(`no-pointer-events--children`)};e===void 0?t():setTimeout(()=>{t(),e()},50)}else e!==void 0&&e()}};if(i.event.detected===!0){i.event.isFirst!==!0&&r(e,i.event.mouse);let{payload:t,synthetic:n}=Yi(e,i,!1);t!==void 0&&(i.handler(t)===!1?i.end(e):(i.styleCleanup===void 0&&i.event.isFirst===!0&&c(),i.event.lastX=t.position.left,i.event.lastY=t.position.top,i.event.lastDir=n===!0?void 0:t.direction,i.event.isFirst=!1));return}if(i.direction.all===!0||s===!0&&(i.modifiers.mouseAllDir===!0||i.modifiers.mousealldir===!0)){c(),i.event.detected=!0,i.move(e);return}let l=Math.abs(a),u=Math.abs(o);l!==u&&(i.direction.horizontal===!0&&l>u||i.direction.vertical===!0&&l0||i.direction.left===!0&&l>u&&a<0||i.direction.right===!0&&l>u&&a>0?(i.event.detected=!0,i.move(e)):i.end(e,!0))},end(t,n){if(i.event!==void 0){if(j(i,`temp`),p.is.firefox===!0&&k(e,!1),n===!0)i.styleCleanup?.(),i.event.detected!==!0&&i.initialEvent!==void 0&&i.initialEvent.target.dispatchEvent(i.initialEvent.event);else if(i.event.detected===!0){i.event.isFirst===!0&&i.handler(Yi(t===void 0?i.lastEvt:t,i).payload);let{payload:e}=Yi(t===void 0?i.lastEvt:t,i,!0),n=()=>{i.handler(e)};i.styleCleanup===void 0?n():i.styleCleanup(n)}i.event=void 0,i.initialEvent=void 0,i.lastEvt=void 0}}};e.__qtouchpan=i,n.mouse===!0&&A(i,`main`,[[e,`mousedown`,`mouseStart`,`passive${n.mouseCapture===!0||n.mousecapture===!0?`Capture`:``}`]]),p.has.touch===!0&&A(i,`main`,[[e,`touchstart`,`touchStart`,`passive${n.capture===!0?`Capture`:``}`],[e,`touchmove`,`noop`,`notPassiveCapture`]])},updated(e,t){let n=e.__qtouchpan;n!==void 0&&(t.oldValue!==t.value&&(typeof value!=`function`&&n.end(),n.handler=t.value),n.direction=hi(t.modifiers))},beforeUnmount(e){let t=e.__qtouchpan;t!==void 0&&(t.event!==void 0&&t.end(),j(t,`main`),j(t,`temp`),p.is.firefox===!0&&k(e,!1),t.styleCleanup?.(),delete e.__qtouchpan)}});let Qi=e=>({value:e}),$i=({marker:t})=>(0,e.h)(`div`,{key:t.value,style:t.style,class:t.classes},t.label),ea=[34,37,40,33,39,38],ta={...Z,...ai,min:{type:Number,default:0},max:{type:Number,default:100},innerMin:Number,innerMax:Number,step:{type:Number,default:1,validator:e=>e>=0},snap:Boolean,vertical:Boolean,reverse:Boolean,color:String,markerLabelsClass:String,label:Boolean,labelColor:String,labelTextColor:String,labelAlways:Boolean,switchLabelSide:Boolean,markers:[Boolean,Number],markerLabels:[Boolean,Array,Object,Function],switchMarkerLabelsSide:Boolean,trackImg:String,trackColor:String,innerTrackImg:String,innerTrackColor:String,selectionColor:String,selectionImg:String,thumbSize:{type:String,default:`20px`},trackSize:{type:String,default:`4px`},disable:Boolean,readonly:Boolean,dense:Boolean,tabindex:[String,Number],thumbColor:String,thumbPath:{type:String,default:`M 4, 10 a 6,6 0 1,0 12,0 a 6,6 0 1,0 -12,0`}},na=[`pan`,`update:modelValue`,`change`];function ra({updateValue:t,updatePosition:n,getDragging:r,formAttrs:i}){let{props:a,emit:o,slots:s,proxy:{$q:c}}=(0,e.getCurrentInstance)(),l=Q(a,c),u=si(i),d=(0,e.ref)(!1),f=(0,e.ref)(!1),p=(0,e.ref)(!1),m=(0,e.ref)(!1),h=(0,e.computed)(()=>a.vertical===!0?`--v`:`--h`),g=(0,e.computed)(()=>`-`+(a.switchLabelSide===!0?`switched`:`standard`)),_=(0,e.computed)(()=>a.vertical===!0?a.reverse===!0:a.reverse!==(c.lang.rtl===!0)),v=(0,e.computed)(()=>isNaN(a.innerMin)===!0||a.innerMinisNaN(a.innerMax)===!0||a.innerMax>a.max?a.max:a.innerMax),b=(0,e.computed)(()=>a.disable!==!0&&a.readonly!==!0&&v.value{if(a.step===0)return e=>e;let e=(String(a.step).trim().split(`.`)[1]||``).length;return t=>parseFloat(t.toFixed(e))}),S=(0,e.computed)(()=>a.step===0?1:a.step),w=(0,e.computed)(()=>b.value===!0?a.tabindex||0:-1),T=(0,e.computed)(()=>a.max-a.min),E=(0,e.computed)(()=>y.value-v.value),D=(0,e.computed)(()=>re(v.value)),O=(0,e.computed)(()=>re(y.value)),k=(0,e.computed)(()=>a.vertical===!0?_.value===!0?`bottom`:`top`:_.value===!0?`right`:`left`),A=(0,e.computed)(()=>a.vertical===!0?`height`:`width`),j=(0,e.computed)(()=>a.vertical===!0?`width`:`height`),M=(0,e.computed)(()=>a.vertical===!0?`vertical`:`horizontal`),N=(0,e.computed)(()=>{let e={role:`slider`,"aria-valuemin":v.value,"aria-valuemax":y.value,"aria-orientation":M.value,"data-step":a.step};return a.disable===!0?e[`aria-disabled`]=`true`:a.readonly===!0&&(e[`aria-readonly`]=`true`),e}),P=(0,e.computed)(()=>`q-slider q-slider${h.value} q-slider--${d.value===!0?``:`in`}active inline no-wrap `+(a.vertical===!0?`row`:`column`)+(a.disable===!0?` disabled`:` q-slider--enabled`+(b.value===!0?` q-slider--editable`:``))+(p.value===`both`?` q-slider--focus`:``)+(a.label||a.labelAlways===!0?` q-slider--label`:``)+(a.labelAlways===!0?` q-slider--label-always`:``)+(l.value===!0?` q-slider--dark`:``)+(a.dense===!0?` q-slider--dense q-slider--dense`+h.value:``));function F(e){let t=`q-slider__`+e;return`${t} ${t}${h.value} ${t}${h.value}${g.value}`}function I(e){let t=`q-slider__`+e;return`${t} ${t}${h.value}`}let L=(0,e.computed)(()=>{let e=a.selectionColor||a.color;return`q-slider__selection absolute`+(e===void 0?``:` text-${e}`)}),R=(0,e.computed)(()=>I(`markers`)+` absolute overflow-hidden`),z=(0,e.computed)(()=>I(`track-container`)),B=(0,e.computed)(()=>F(`pin`)),ee=(0,e.computed)(()=>F(`label`)),V=(0,e.computed)(()=>F(`text-container`)),H=(0,e.computed)(()=>F(`marker-labels-container`)+(a.markerLabelsClass===void 0?``:` ${a.markerLabelsClass}`)),te=(0,e.computed)(()=>`q-slider__track relative-position no-outline`+(a.trackColor===void 0?``:` bg-${a.trackColor}`)),U=(0,e.computed)(()=>{let e={[j.value]:a.trackSize};return a.trackImg!==void 0&&(e.backgroundImage=`url(${a.trackImg}) !important`),e}),ne=(0,e.computed)(()=>`q-slider__inner absolute`+(a.innerTrackColor===void 0?``:` bg-${a.innerTrackColor}`)),W=(0,e.computed)(()=>{let e=O.value-D.value,t={[k.value]:`${100*D.value}%`,[A.value]:e===0?`2px`:`${100*e}%`};return a.innerTrackImg!==void 0&&(t.backgroundImage=`url(${a.innerTrackImg}) !important`),t});function G(e){let{min:t,max:n,step:r}=a,i=t+e*(n-t);if(r>0){let e=(i-v.value)%r;i+=(Math.abs(e)>=r/2?(e<0?-1:1)*r:0)-e}return i=x.value(i),Fe(i,v.value,y.value)}function re(e){return T.value===0?0:(e-a.min)/T.value}function K(e,t){let n=C(e),r=a.vertical===!0?Fe((n.top-t.top)/t.height,0,1):Fe((n.left-t.left)/t.width,0,1);return Fe(_.value===!0?1-r:r,D.value,O.value)}let ie=(0,e.computed)(()=>Te(a.markers)===!0?a.markers:S.value),ae=(0,e.computed)(()=>{let e=[],t=ie.value,n=a.max,r=a.min;do e.push(r),r+=t;while(r{let e=` q-slider__marker-labels${h.value}-`;return`q-slider__marker-labels${e}${a.switchMarkerLabelsSide===!0?`switched`:`standard`}${e}${_.value===!0?`rtl`:`ltr`}`}),se=(0,e.computed)(()=>a.markerLabels===!1?null:ue(a.markerLabels).map((e,t)=>({index:t,value:e.value,label:e.label||e.value,classes:oe.value+(e.classes===void 0?``:` `+e.classes),style:{...de(e.value),...e.style||{}}}))),ce=(0,e.computed)(()=>({markerList:se.value,markerMap:fe.value,classes:oe.value,getStyle:de})),le=(0,e.computed)(()=>{let e=E.value===0?`2px`:100*ie.value/E.value;return{...W.value,backgroundSize:a.vertical===!0?`2px ${e}%`:`${e}% 2px`}});function ue(e){if(e===!1)return null;if(e===!0)return ae.value.map(Qi);if(typeof e==`function`)return ae.value.map(t=>{let n=e(t);return Se(n)===!0?{...n,value:t}:{value:t,label:n}});let t=({value:e})=>e>=a.min&&e<=a.max;return Array.isArray(e)===!0?e.map(e=>Se(e)===!0?e:{value:e}).filter(t):Object.keys(e).map(t=>{let n=e[t],r=Number(t);return Se(n)===!0?{...n,value:r}:{value:r,label:n}}).filter(t)}function de(e){return{[k.value]:`${100*(e-a.min)/T.value}%`}}let fe=(0,e.computed)(()=>{if(a.markerLabels===!1)return null;let e={};return se.value.forEach(t=>{e[t.value]=t}),e});function pe(){if(s[`marker-label-group`]!==void 0)return s[`marker-label-group`](ce.value);let e=s[`marker-label`]||$i;return se.value.map(t=>e({marker:t,...ce.value}))}let me=(0,e.computed)(()=>[[Zi,he,void 0,{[M.value]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]);function he(e){e.isFinal===!0?(m.value!==void 0&&(n(e.evt),e.touch===!0&&t(!0),m.value=void 0,o(`pan`,`end`)),d.value=!1,p.value=!1):e.isFirst===!0?(m.value=r(e.evt),n(e.evt),t(),d.value=!0,o(`pan`,`start`)):(n(e.evt),t())}function ge(){p.value=!1}function _e(e){n(e,r(e)),t(),f.value=!0,d.value=!0,document.addEventListener(`mouseup`,q,!0)}function q(){f.value=!1,d.value=!1,t(!0),ge(),document.removeEventListener(`mouseup`,q,!0)}function ve(e){n(e,r(e)),t(!0)}function ye(e){ea.includes(e.keyCode)&&t(!0)}function be(e){if(a.vertical===!0)return null;let t=c.lang.rtl===a.reverse?e:1-e;return{transform:`translateX(calc(${2*t-1} * ${a.thumbSize} / 2 + ${50-100*t}%))`}}function xe(t){let n=(0,e.computed)(()=>f.value===!1&&(p.value===t.focusValue||p.value===`both`)?` q-slider--focus`:``),r=(0,e.computed)(()=>`q-slider__thumb q-slider__thumb${h.value} q-slider__thumb${h.value}-${_.value===!0?`rtl`:`ltr`} absolute non-selectable`+n.value+(t.thumbColor.value===void 0?``:` text-${t.thumbColor.value}`)),i=(0,e.computed)(()=>({width:a.thumbSize,height:a.thumbSize,[k.value]:`${100*t.ratio.value}%`,zIndex:p.value===t.focusValue?2:void 0})),o=(0,e.computed)(()=>t.labelColor.value===void 0?``:` text-${t.labelColor.value}`),s=(0,e.computed)(()=>be(t.ratio.value)),c=(0,e.computed)(()=>`q-slider__text`+(t.labelTextColor.value===void 0?``:` text-${t.labelTextColor.value}`));return()=>{let n=[(0,e.h)(`svg`,{class:`q-slider__thumb-shape absolute-full`,viewBox:`0 0 20 20`,"aria-hidden":`true`},[(0,e.h)(`path`,{d:a.thumbPath})]),(0,e.h)(`div`,{class:`q-slider__focus-ring fit`})];return(a.label===!0||a.labelAlways===!0)&&(n.push((0,e.h)(`div`,{class:B.value+` absolute fit no-pointer-events`+o.value},[(0,e.h)(`div`,{class:ee.value,style:{minWidth:a.thumbSize}},[(0,e.h)(`div`,{class:V.value,style:s.value},[(0,e.h)(`span`,{class:c.value},t.label.value)])])])),a.name!==void 0&&a.disable!==!0&&u(n,`push`)),(0,e.h)(`div`,{class:r.value,style:i.value,...t.getNodeData()},n)}}function Ce(t,n,r,i){let o=[];a.innerTrackColor!==`transparent`&&o.push((0,e.h)(`div`,{key:`inner`,class:ne.value,style:W.value})),a.selectionColor!==`transparent`&&o.push((0,e.h)(`div`,{key:`selection`,class:L.value,style:t.value})),a.markers!==!1&&o.push((0,e.h)(`div`,{key:`marker`,class:R.value,style:le.value})),i(o);let s=[et(`div`,{key:`trackC`,class:z.value,tabindex:n.value,...r.value},[(0,e.h)(`div`,{class:te.value,style:U.value},o)],`slide`,b.value,()=>me.value)];return a.markerLabels!==!1&&s[a.switchMarkerLabelsSide===!0?`unshift`:`push`]((0,e.h)(`div`,{key:`markerL`,class:H.value},pe())),s}return(0,e.onBeforeUnmount)(()=>{document.removeEventListener(`mouseup`,q,!0)}),{state:{active:d,focus:p,preventFocus:f,dragging:m,editable:b,classes:P,tabindex:w,attributes:N,roundValueFn:x,keyStep:S,trackLen:T,innerMin:v,innerMinRatio:D,innerMax:y,innerMaxRatio:O,positionProp:k,sizeProp:A,isReversed:_},methods:{onActivate:_e,onMobileClick:ve,onBlur:ge,onKeyup:ye,getContent:Ce,getThumbRenderFn:xe,convertRatioToModel:G,convertModelToRatio:re,getDraggingRatio:K}}}let ia=()=>({});var aa=h({name:`QSlider`,props:{...ta,modelValue:{required:!0,default:null,validator:e=>typeof e==`number`||e===null},labelValue:[String,Number]},emits:na,setup(t,{emit:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),{state:i,methods:a}=ra({updateValue:h,updatePosition:_,getDragging:g,formAttrs:oi(t)}),o=(0,e.ref)(null),s=(0,e.ref)(0),c=(0,e.ref)(0);function l(){c.value=t.modelValue===null?i.innerMin.value:Fe(t.modelValue,i.innerMin.value,i.innerMax.value)}(0,e.watch)(()=>`${t.modelValue}|${i.innerMin.value}|${i.innerMax.value}`,l),l();let u=(0,e.computed)(()=>a.convertModelToRatio(c.value)),d=(0,e.computed)(()=>i.active.value===!0?s.value:u.value),f=(0,e.computed)(()=>{let e={[i.positionProp.value]:`${100*i.innerMinRatio.value}%`,[i.sizeProp.value]:`${100*(d.value-i.innerMinRatio.value)}%`};return t.selectionImg!==void 0&&(e.backgroundImage=`url(${t.selectionImg}) !important`),e}),p=a.getThumbRenderFn({focusValue:!0,getNodeData:ia,ratio:d,label:(0,e.computed)(()=>t.labelValue===void 0?c.value:t.labelValue),thumbColor:(0,e.computed)(()=>t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.labelColor),labelTextColor:(0,e.computed)(()=>t.labelTextColor)}),m=(0,e.computed)(()=>i.editable.value===!0?r.platform.is.mobile===!0?{onClick:a.onMobileClick}:{onMousedown:a.onActivate,onFocus:v,onBlur:a.onBlur,onKeydown:y,onKeyup:a.onKeyup}:{});function h(e){c.value!==t.modelValue&&n(`update:modelValue`,c.value),e===!0&&n(`change`,c.value)}function g(){return o.value.getBoundingClientRect()}function _(e,n=i.dragging.value){let r=a.getDraggingRatio(e,n);c.value=a.convertRatioToModel(r),s.value=t.snap!==!0||t.step===0?r:a.convertModelToRatio(c.value)}function v(){i.focus.value=!0}function y(e){if(ea.includes(e.keyCode)===!1)return;O(e);let n=([34,33].includes(e.keyCode)?10:1)*i.keyStep.value,r=([34,37,40].includes(e.keyCode)?-1:1)*(i.isReversed.value===!0?-1:1)*(t.vertical===!0?-1:1)*n;c.value=Fe(i.roundValueFn.value(c.value+r),i.innerMin.value,i.innerMax.value),h()}return()=>{let n=a.getContent(f,i.tabindex,m,e=>{e.push(p())});return(0,e.h)(`div`,{ref:o,class:i.classes.value+(t.modelValue===null?` q-slider--no-value`:``),...i.attributes.value,"aria-valuenow":t.modelValue},n)}}});function oa(){let t=(0,e.ref)(!a.value);return t.value===!1&&(0,e.onMounted)(()=>{t.value=!0}),{isHydrated:t}}let sa=typeof ResizeObserver<`u`,ca=sa===!0?{}:{style:`display:block;position:absolute;top:0;left:0;right:0;bottom:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1;`,url:`about:blank`};var la=h({name:`QResizeObserver`,props:{debounce:{type:[String,Number],default:100}},emits:[`resize`],setup(t,{emit:n}){let r=null,i,a={width:-1,height:-1};function o(e){e===!0||t.debounce===0||t.debounce===`0`?s():r===null&&(r=setTimeout(s,t.debounce))}function s(){if(r!==null&&(clearTimeout(r),r=null),i){let{offsetWidth:e,offsetHeight:t}=i;(e!==a.width||t!==a.height)&&(a={width:e,height:t},n(`resize`,a))}}let{proxy:c}=(0,e.getCurrentInstance)();if(c.trigger=o,sa===!0){let t,n=r=>{i=c.$el.parentNode,i?(t=new ResizeObserver(o),t.observe(i),s()):r!==!0&&(0,e.nextTick)(()=>{n(!0)})};return(0,e.onMounted)(()=>{n()}),(0,e.onBeforeUnmount)(()=>{r!==null&&clearTimeout(r),t!==void 0&&(t.disconnect===void 0?i&&t.unobserve(i):t.disconnect())}),y}else{let{isHydrated:t}=oa(),n;function l(){r!==null&&(clearTimeout(r),r=null),n!==void 0&&(n.removeEventListener!==void 0&&n.removeEventListener(`resize`,o,v.passive),n=void 0)}function u(){l(),i?.contentDocument&&(n=i.contentDocument.defaultView,n.addEventListener(`resize`,o,v.passive),s())}return(0,e.onMounted)(()=>{(0,e.nextTick)(()=>{i=c.$el,i&&u()})}),(0,e.onBeforeUnmount)(l),()=>{if(t.value===!0)return(0,e.h)(`object`,{class:`q--avoid-card-border`,style:ca.style,tabindex:-1,type:`text/html`,data:ca.url,"aria-hidden":`true`,onLoad:u})}}}});let ua=!1;{let e=document.createElement(`div`);e.setAttribute(`dir`,`rtl`),Object.assign(e.style,{width:`1px`,height:`1px`,overflow:`auto`});let t=document.createElement(`div`);Object.assign(t.style,{width:`1000px`,height:`1px`}),document.body.appendChild(e),e.appendChild(t),e.scrollLeft=-1e3,ua=e.scrollLeft>=0,e.remove()}function da(e,t,n){let r=n===!0?[`left`,`right`]:[`top`,`bottom`];return`absolute-${t===!0?r[0]:r[1]}${e?` text-${e}`:``}`}let fa=[`left`,`center`,`right`,`justify`];var pa=h({name:`QTabs`,props:{modelValue:[Number,String],align:{type:String,default:`center`,validator:e=>fa.includes(e)},breakpoint:{type:[String,Number],default:600},vertical:Boolean,shrink:Boolean,stretch:Boolean,activeClass:String,activeColor:String,activeBgColor:String,indicatorColor:String,leftIcon:String,rightIcon:String,outsideArrows:Boolean,mobileArrows:Boolean,switchIndicator:Boolean,narrowIndicator:Boolean,inlineLabel:Boolean,noCaps:Boolean,dense:Boolean,contentClass:String,"onUpdate:modelValue":[Function,Array]},setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,{registerTick:o}=Zn(),{registerTick:s}=Zn(),{registerTick:c}=Zn(),{registerTimeout:l,removeTimeout:u}=Qn(),{registerTimeout:d,removeTimeout:f}=Qn(),p=(0,e.ref)(null),m=(0,e.ref)(null),h=(0,e.ref)(t.modelValue),g=(0,e.ref)(!1),_=(0,e.ref)(!0),v=(0,e.ref)(!1),y=(0,e.ref)(!1),b=[],x=(0,e.ref)(0),S=(0,e.ref)(!1),C=null,w=null,T,E=(0,e.computed)(()=>({activeClass:t.activeClass,activeColor:t.activeColor,activeBgColor:t.activeBgColor,indicatorClass:da(t.indicatorColor,t.switchIndicator,t.vertical),narrowIndicator:t.narrowIndicator,inlineLabel:t.inlineLabel,noCaps:t.noCaps})),D=(0,e.computed)(()=>{let e=x.value,t=h.value;for(let n=0;n`q-tabs__content--align-${g.value===!0?`left`:y.value===!0?`justify`:t.align}`),k=(0,e.computed)(()=>`q-tabs row no-wrap items-center q-tabs--${g.value===!0?``:`not-`}scrollable q-tabs--${t.vertical===!0?`vertical`:`horizontal`} q-tabs__arrows--${t.outsideArrows===!0?`outside`:`inside`} q-tabs--mobile-with${t.mobileArrows===!0?``:`out`}-arrows`+(t.dense===!0?` q-tabs--dense`:``)+(t.shrink===!0?` col-shrink`:``)+(t.stretch===!0?` self-stretch`:``)),A=(0,e.computed)(()=>`q-tabs__content scroll--mobile row no-wrap items-center self-stretch hide-scrollbar relative-position `+O.value+(t.contentClass===void 0?``:` ${t.contentClass}`)),j=(0,e.computed)(()=>t.vertical===!0?{container:`height`,content:`offsetHeight`,scroll:`scrollHeight`}:{container:`width`,content:`offsetWidth`,scroll:`scrollWidth`}),M=(0,e.computed)(()=>t.vertical!==!0&&a.lang.rtl===!0),N=(0,e.computed)(()=>ua===!1&&M.value===!0);(0,e.watch)(M,z),(0,e.watch)(()=>t.modelValue,e=>{P({name:e,setCurrent:!0,skipEmit:!0})}),(0,e.watch)(()=>t.outsideArrows,F);function P({name:e,setCurrent:n,skipEmit:i}){h.value!==e&&(i!==!0&&t[`onUpdate:modelValue`]!==void 0&&r(`update:modelValue`,e),(n===!0||t[`onUpdate:modelValue`]===void 0)&&(L(h.value,e),h.value=e))}function F(){o(()=>{p.value&&I({width:p.value.offsetWidth,height:p.value.offsetHeight})})}function I(e){if(j.value===void 0||m.value===null)return;let n=e[j.value.container],r=Math.min(m.value[j.value.scroll],Array.prototype.reduce.call(m.value.children,(e,t)=>e+(t[j.value.content]||0),0)),i=n>0&&r>n;g.value=i,i===!0&&s(z),y.value=nt.name.value===e):null,i=n!=null&&n!==``?b.find(e=>e.name.value===n):null;if(de===!0)de=!1;else if(r&&i){let e=r.tabIndicatorRef.value,n=i.tabIndicatorRef.value;C!==null&&(clearTimeout(C),C=null),e.style.transition=`none`,e.style.transform=`none`,n.style.transition=`none`,n.style.transform=`none`;let a=e.getBoundingClientRect(),o=n.getBoundingClientRect();n.style.transform=t.vertical===!0?`translate3d(0,${a.top-o.top}px,0) scale3d(1,${o.height?a.height/o.height:1},1)`:`translate3d(${a.left-o.left}px,0,0) scale3d(${o.width?a.width/o.width:1},1,1)`,c(()=>{C=setTimeout(()=>{C=null,n.style.transition=`transform .25s cubic-bezier(.4, 0, .2, 1)`,n.style.transform=`none`},70)})}i&&g.value===!0&&R(i.rootRef.value)}function R(e){let{left:n,width:r,top:i,height:a}=m.value.getBoundingClientRect(),o=e.getBoundingClientRect(),s=t.vertical===!0?o.top-i:o.left-n;if(s<0){m.value[t.vertical===!0?`scrollTop`:`scrollLeft`]+=Math.floor(s),z();return}s+=t.vertical===!0?o.height-a:o.width-r,s>0&&(m.value[t.vertical===!0?`scrollTop`:`scrollLeft`]+=Math.ceil(s),z())}function z(){let e=m.value;if(e===null)return;let n=e.getBoundingClientRect(),r=t.vertical===!0?e.scrollTop:Math.abs(e.scrollLeft);M.value===!0?(_.value=Math.ceil(r+n.width)0):(_.value=r>0,v.value=t.vertical===!0?Math.ceil(r+n.height){ne(e)===!0&&H()},5)}function ee(){B(N.value===!0?2**53-1:0)}function V(){B(N.value===!0?0:2**53-1)}function H(){w!==null&&(clearInterval(w),w=null)}function te(e,n){let r=Array.prototype.filter.call(m.value.children,e=>e===n||e.matches&&e.matches(`.q-tab.q-focusable`)===!0),i=r.length;if(i===0)return;if(e===36)return R(r[0]),r[0].focus(),!0;if(e===35)return R(r[i-1]),r[i-1].focus(),!0;let a=e===(t.vertical===!0?38:37),o=e===(t.vertical===!0?40:39),s=a===!0?-1:o===!0?1:void 0;if(s!==void 0){let e=M.value===!0?-1:1,t=r.indexOf(n)+s*e;return t>=0&&tN.value===!0?{get:e=>Math.abs(e.scrollLeft),set:(e,t)=>{e.scrollLeft=-t}}:t.vertical===!0?{get:e=>e.scrollTop,set:(e,t)=>{e.scrollTop=t}}:{get:e=>e.scrollLeft,set:(e,t)=>{e.scrollLeft=t}});function ne(e){let t=m.value,{get:n,set:r}=U.value,i=!1,a=n(t),o=e=e)&&(i=!0,a=e),r(t,a),z(),i}function W(e,t){for(let n in e)if(e[n]!==t[n])return!1;return!0}function G(){let e=null,t={matchedLen:0,queryDiff:9999,hrefLen:0},n=b.filter(e=>e.routeData?.hasRouterLink.value===!0),{hash:r,query:a}=i.$route,o=Object.keys(a).length;for(let i of n){let n=i.routeData.exact.value===!0;if(i.routeData[n===!0?`linkIsExactActive`:`linkIsActive`].value!==!0)continue;let{hash:s,query:c,matched:l,href:u}=i.routeData.resolvedLink.value,d=Object.keys(c).length;if(n===!0){if(s!==r||d!==o||W(a,c)===!1)continue;e=i.name.value;break}if(s!==``&&s!==r||d!==0&&W(c,a)===!1)continue;let f={matchedLen:l.length,queryDiff:o-d,hrefLen:u.length-s.length};if(f.matchedLen>t.matchedLen){e=i.name.value,t=f;continue}else if(f.matchedLen!==t.matchedLen)continue;if(f.queryDifft.hrefLen&&(e=i.name.value,t=f)}if(e===null&&b.some(e=>e.routeData===void 0&&e.name.value===h.value)===!0){de=!1;return}P({name:e,setCurrent:!0})}function re(e){if(u(),S.value!==!0&&p.value!==null&&e.target&&typeof e.target.closest==`function`){let t=e.target.closest(`.q-tab`);t&&p.value.contains(t)===!0&&(S.value=!0,g.value===!0&&R(t))}}function K(){l(()=>{S.value=!1},30)}function ie(){ce.avoidRouteWatcher===!1?d(G):f()}function ae(){if(T===void 0){let t=(0,e.watch)(()=>i.$route.fullPath,ie);T=()=>{t(),T=void 0}}}function oe(e){b.push(e),x.value++,F(),e.routeData===void 0||i.$route===void 0?d(()=>{if(g.value===!0){let e=h.value,t=e!=null&&e!==``?b.find(t=>t.name.value===e):null;t&&R(t.rootRef.value)}}):(ae(),e.routeData.hasRouterLink.value===!0&&ie())}function se(e){b.splice(b.indexOf(e),1),x.value--,F(),T!==void 0&&e.routeData!==void 0&&(b.every(e=>e.routeData===void 0)===!0&&T(),ie())}let ce={currentModel:h,tabProps:E,hasFocus:S,hasActiveTab:D,registerTab:oe,unregisterTab:se,verifyRouteModel:ie,updateModel:P,onKbdNavigate:te,avoidRouteWatcher:!1};(0,e.provide)(ge,ce);function le(){C!==null&&clearTimeout(C),H(),T?.()}let ue,de;return(0,e.onBeforeUnmount)(le),(0,e.onDeactivated)(()=>{ue=T!==void 0,le()}),(0,e.onActivated)(()=>{ue===!0&&(ae(),de=!0,ie()),F()}),()=>(0,e.h)(`div`,{ref:p,class:k.value,role:`tablist`,onFocusin:re,onFocusout:K},[(0,e.h)(la,{onResize:I}),(0,e.h)(`div`,{ref:m,class:A.value,onScroll:z},Y(n.default)),(0,e.h)(X,{class:`q-tabs__arrow q-tabs__arrow--left absolute q-tab__icon`+(_.value===!0?``:` q-tabs__arrow--faded`),name:t.leftIcon||a.iconSet.tabs[t.vertical===!0?`up`:`left`],onMousedownPassive:ee,onTouchstartPassive:ee,onMouseupPassive:H,onMouseleavePassive:H,onTouchendPassive:H}),(0,e.h)(X,{class:`q-tabs__arrow q-tabs__arrow--right absolute q-tab__icon`+(v.value===!0?``:` q-tabs__arrow--faded`),name:t.rightIcon||a.iconSet.tabs[t.vertical===!0?`down`:`right`],onMousedownPassive:V,onTouchstartPassive:V,onMouseupPassive:H,onMouseleavePassive:H,onTouchendPassive:H})])}});let ma=0,ha=[`click`,`keydown`],ga={icon:String,label:[Number,String],alert:[Boolean,String],alertIcon:String,name:{type:[Number,String],default:()=>`t_${ma++}`},noCaps:Boolean,tabindex:[String,Number],disable:Boolean,contentClass:String,ripple:{type:[Boolean,Object],default:!0}};function _a(t,n,r,i){let a=(0,e.inject)(ge,q);if(a===q)return console.error(`QTab/QRouteTab component needs to be child of QTabs`),q;let{proxy:o}=(0,e.getCurrentInstance)(),s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.ref)(null),u=(0,e.computed)(()=>t.disable===!0||t.ripple===!1?!1:Object.assign({keyCodes:[13,32],early:!0},t.ripple===!0?{}:t.ripple)),d=(0,e.computed)(()=>a.currentModel.value===t.name),f=(0,e.computed)(()=>`q-tab relative-position self-stretch flex flex-center text-center`+(d.value===!0?` q-tab--active`+(a.tabProps.value.activeClass?` `+a.tabProps.value.activeClass:``)+(a.tabProps.value.activeColor?` text-${a.tabProps.value.activeColor}`:``)+(a.tabProps.value.activeBgColor?` bg-${a.tabProps.value.activeBgColor}`:``):` q-tab--inactive`)+(t.icon&&t.label&&a.tabProps.value.inlineLabel===!1?` q-tab--full`:``)+(t.noCaps===!0||a.tabProps.value.noCaps===!0?` q-tab--no-caps`:``)+(t.disable===!0?` disabled`:` q-focusable q-hoverable cursor-pointer`)+(i===void 0?``:i.linkClass.value)),p=(0,e.computed)(()=>`q-tab__content self-stretch flex-center relative-position q-anchor--skip non-selectable `+(a.tabProps.value.inlineLabel===!0?`row no-wrap q-tab__content--inline`:`column`)+(t.contentClass===void 0?``:` ${t.contentClass}`)),m=(0,e.computed)(()=>t.disable===!0||a.hasFocus.value===!0||d.value===!1&&a.hasActiveTab.value===!0?-1:t.tabindex||0);function h(e,n){if(n!==!0&&e?.qAvoidFocus!==!0&&s.value?.focus(),t.disable===!0){i?.hasRouterLink.value===!0&&O(e);return}if(i===void 0){a.updateModel({name:t.name}),r(`click`,e);return}if(i.hasRouterLink.value===!0){let n=(n={})=>{let r,o=n.to===void 0||xe(n.to,t.to)===!0?a.avoidRouteWatcher=Qr():null;return i.navigateToRouterLink(e,{...n,returnRouterError:!0}).catch(e=>{r=e}).then(e=>{if(o===a.avoidRouteWatcher&&(a.avoidRouteWatcher=!1,r===void 0&&(e===void 0||e.message?.startsWith(`Avoided redundant navigation`)===!0)&&a.updateModel({name:t.name})),n.returnRouterError===!0)return r===void 0?e:Promise.reject(r)})};r(`click`,e,n),e.defaultPrevented!==!0&&n();return}r(`click`,e)}function g(e){V(e,[13,32])?h(e,!0):ee(e)!==!0&&e.keyCode>=35&&e.keyCode<=40&&e.altKey!==!0&&e.metaKey!==!0&&a.onKbdNavigate(e.keyCode,o.$el)===!0&&O(e),r(`keydown`,e)}function _(){let r=a.tabProps.value.narrowIndicator,i=[],o=(0,e.h)(`div`,{ref:l,class:[`q-tab__indicator`,a.tabProps.value.indicatorClass]});t.icon!==void 0&&i.push((0,e.h)(X,{class:`q-tab__icon`,name:t.icon})),t.label!==void 0&&i.push((0,e.h)(`div`,{class:`q-tab__label`},t.label)),t.alert!==!1&&i.push(t.alertIcon===void 0?(0,e.h)(`div`,{class:`q-tab__alert`+(t.alert===!0?``:` text-${t.alert}`)}):(0,e.h)(X,{class:`q-tab__alert-icon`,color:t.alert===!0?void 0:t.alert,name:t.alertIcon})),r===!0&&i.push(o);let c=[(0,e.h)(`div`,{class:`q-focus-helper`,tabindex:-1,ref:s}),(0,e.h)(`div`,{class:p.value},Qe(n.default,i))];return r===!1&&c.push(o),c}let v={name:(0,e.computed)(()=>t.name),rootRef:c,tabIndicatorRef:l,routeData:i};(0,e.onBeforeUnmount)(()=>{a.unregisterTab(v)}),(0,e.onMounted)(()=>{a.registerTab(v)});function y(n,r){return(0,e.withDirectives)((0,e.h)(n,{ref:c,class:f.value,tabindex:m.value,role:`tab`,"aria-selected":d.value===!0?`true`:`false`,"aria-disabled":t.disable===!0?`true`:void 0,onClick:h,onKeydown:g,...r},_()),[[rn,u.value]])}return{renderTab:y,$tabs:a}}var va=h({name:`QTab`,props:ga,emits:ha,setup(e,{slots:t,emit:n}){let{renderTab:r}=_a(e,t,n);return()=>r(`div`)}}),ya=h({name:`QTabPanels`,props:{...Ci,...Z},emits:wi,setup(t,{slots:n}){let r=Q(t,(0,e.getCurrentInstance)().proxy.$q),{updatePanelsList:i,getPanelContent:a,panelDirectives:o}=Ti(),s=(0,e.computed)(()=>`q-tab-panels q-panel-parent`+(r.value===!0?` q-tab-panels--dark q-dark`:``));return()=>(i(n),et(`div`,{class:s.value},a(),`pan`,t.swipeable,()=>o.value))}}),ba=h({name:`QTabPanel`,props:xi,setup(t,{slots:n}){return()=>(0,e.h)(`div`,{class:`q-tab-panel`,role:`tabpanel`},Y(n.default))}});let xa=/^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/,Sa=/^#[0-9a-fA-F]{4}([0-9a-fA-F]{4})?$/,Ca=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,wa=/^rgb\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5])\)$/,Ta=/^rgba\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),(0|0\.[0-9]+[1-9]|0\.[1-9]+|1)\)$/,Ea={date:e=>/^-?[\d]+\/[0-1]\d\/[0-3]\d$/.test(e),time:e=>/^([0-1]?\d|2[0-3]):[0-5]\d$/.test(e),fulltime:e=>/^([0-1]?\d|2[0-3]):[0-5]\d:[0-5]\d$/.test(e),timeOrFulltime:e=>/^([0-1]?\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/.test(e),email:e=>/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e),hexColor:e=>xa.test(e),hexaColor:e=>Sa.test(e),hexOrHexaColor:e=>Ca.test(e),rgbColor:e=>wa.test(e),rgbaColor:e=>Ta.test(e),rgbOrRgbaColor:e=>wa.test(e)||Ta.test(e),hexOrRgbColor:e=>xa.test(e)||wa.test(e),hexaOrRgbaColor:e=>Sa.test(e)||Ta.test(e),anyColor:e=>Ca.test(e)||wa.test(e)||Ta.test(e)};var Da={testPattern:Ea};let Oa=/^rgb(a)?\((\d{1,3}),(\d{1,3}),(\d{1,3}),?([01]?\.?\d*?)?\)$/;function ka({r:e,g:t,b:n,a:r}){let i=r!==void 0;if(e=Math.round(e),t=Math.round(t),n=Math.round(n),e>255||t>255||n>255||i&&r>100)throw TypeError(`Expected 3 numbers below 256 (and optionally one below 100)`);return r=i?(Math.round(255*r/100)|256).toString(16).slice(1):``,`#`+(n|t<<8|e<<16|1<<24).toString(16).slice(1)+r}function Aa({r:e,g:t,b:n,a:r}){return`rgb${r===void 0?``:`a`}(${e},${t},${n}${r===void 0?``:`,`+r/100})`}function ja(e){if(typeof e!=`string`)throw TypeError(`Expected a string`);e=e.replace(/^#/,``),e.length===3?e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]:e.length===4&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]+e[3]+e[3]);let t=parseInt(e,16);return e.length>6?{r:t>>24&255,g:t>>16&255,b:t>>8&255,a:Math.round((t&255)/2.55)}:{r:t>>16,g:t>>8&255,b:t&255}}function Ma({h:e,s:t,v:n,a:r}){let i,a,o;t/=100,n/=100,e/=360;let s=Math.floor(e*6),c=e*6-s,l=n*(1-t),u=n*(1-c*t),d=n*(1-(1-c)*t);switch(s%6){case 0:i=n,a=d,o=l;break;case 1:i=u,a=n,o=l;break;case 2:i=l,a=n,o=d;break;case 3:i=l,a=u,o=n;break;case 4:i=d,a=l,o=n;break;case 5:i=n,a=l,o=u;break}return{r:Math.round(i*255),g:Math.round(a*255),b:Math.round(o*255),a:r}}function Na({r:e,g:t,b:n,a:r}){let i=Math.max(e,t,n),a=Math.min(e,t,n),o=i-a,s=i===0?0:o/i,c=i/255,l;switch(i){case a:l=0;break;case e:l=t-n+o*(t1)throw TypeError(`Expected offset to be between -1 and 1`);let{r:n,g:r,b:i,a}=Pa(e),o=a===void 0?0:a/100;return ka({r:n,g:r,b:i,a:Math.round(Math.min(1,Math.max(0,o+t))*100)})}function Ba(e){if(typeof e!=`string`)throw TypeError(`Expected a string as color`);let t=document.createElement(`div`);t.className=`text-${e} invisible fixed no-pointer-events`,document.body.appendChild(t);let n=getComputedStyle(t).getPropertyValue(`color`);return t.remove(),ka(Pa(n))}var Va={rgbToHex:ka,hexToRgb:ja,hsvToRgb:Ma,rgbToHsv:Na,textToRgb:Pa,lighten:Fa,luminosity:Ia,brightness:La,blend:Ra,changeAlpha:za,getPaletteColor:Ba};let Ha=`rgb(255,204,204).rgb(255,230,204).rgb(255,255,204).rgb(204,255,204).rgb(204,255,230).rgb(204,255,255).rgb(204,230,255).rgb(204,204,255).rgb(230,204,255).rgb(255,204,255).rgb(255,153,153).rgb(255,204,153).rgb(255,255,153).rgb(153,255,153).rgb(153,255,204).rgb(153,255,255).rgb(153,204,255).rgb(153,153,255).rgb(204,153,255).rgb(255,153,255).rgb(255,102,102).rgb(255,179,102).rgb(255,255,102).rgb(102,255,102).rgb(102,255,179).rgb(102,255,255).rgb(102,179,255).rgb(102,102,255).rgb(179,102,255).rgb(255,102,255).rgb(255,51,51).rgb(255,153,51).rgb(255,255,51).rgb(51,255,51).rgb(51,255,153).rgb(51,255,255).rgb(51,153,255).rgb(51,51,255).rgb(153,51,255).rgb(255,51,255).rgb(255,0,0).rgb(255,128,0).rgb(255,255,0).rgb(0,255,0).rgb(0,255,128).rgb(0,255,255).rgb(0,128,255).rgb(0,0,255).rgb(128,0,255).rgb(255,0,255).rgb(245,0,0).rgb(245,123,0).rgb(245,245,0).rgb(0,245,0).rgb(0,245,123).rgb(0,245,245).rgb(0,123,245).rgb(0,0,245).rgb(123,0,245).rgb(245,0,245).rgb(214,0,0).rgb(214,108,0).rgb(214,214,0).rgb(0,214,0).rgb(0,214,108).rgb(0,214,214).rgb(0,108,214).rgb(0,0,214).rgb(108,0,214).rgb(214,0,214).rgb(163,0,0).rgb(163,82,0).rgb(163,163,0).rgb(0,163,0).rgb(0,163,82).rgb(0,163,163).rgb(0,82,163).rgb(0,0,163).rgb(82,0,163).rgb(163,0,163).rgb(92,0,0).rgb(92,46,0).rgb(92,92,0).rgb(0,92,0).rgb(0,92,46).rgb(0,92,92).rgb(0,46,92).rgb(0,0,92).rgb(46,0,92).rgb(92,0,92).rgb(255,255,255).rgb(205,205,205).rgb(178,178,178).rgb(153,153,153).rgb(127,127,127).rgb(102,102,102).rgb(76,76,76).rgb(51,51,51).rgb(25,25,25).rgb(0,0,0)`.split(`.`),Ua=`M5 5 h10 v10 h-10 v-10 z`;var Wa=h({name:`QColor`,props:{...Z,...ai,modelValue:String,defaultValue:String,defaultView:{type:String,default:`spectrum`,validator:e=>[`spectrum`,`tune`,`palette`].includes(e)},formatModel:{type:String,default:`auto`,validator:e=>[`auto`,`hex`,`rgb`,`hexa`,`rgba`].includes(e)},palette:Array,noHeader:Boolean,noHeaderTabs:Boolean,noFooter:Boolean,square:Boolean,flat:Boolean,bordered:Boolean,disable:Boolean,readonly:Boolean},emits:[`update:modelValue`,`change`],setup(t,{emit:n}){let{proxy:r}=(0,e.getCurrentInstance)(),{$q:i}=r,a=Q(t,i),{getCache:o}=bi(),s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.computed)(()=>t.formatModel===`auto`?null:t.formatModel.indexOf(`hex`)!==-1),u=(0,e.computed)(()=>t.formatModel===`auto`?null:t.formatModel.indexOf(`a`)!==-1),d=(0,e.ref)(t.formatModel===`auto`?t.modelValue===void 0||t.modelValue===null||t.modelValue===``||t.modelValue.startsWith(`#`)?`hex`:`rgb`:t.formatModel.startsWith(`hex`)?`hex`:`rgb`),f=(0,e.ref)(t.defaultView),p=(0,e.ref)(k(t.modelValue||t.defaultValue)),m=(0,e.computed)(()=>t.disable!==!0&&t.readonly!==!0),h=(0,e.computed)(()=>t.modelValue===void 0||t.modelValue===null||t.modelValue===``||t.modelValue.startsWith(`#`)),g=(0,e.computed)(()=>l.value===null?h.value:l.value),_=si((0,e.computed)(()=>({type:`hidden`,name:t.name,value:p.value[g.value===!0?`hex`:`rgb`]}))),v=(0,e.computed)(()=>u.value===null?p.value.a!==void 0:u.value),y=(0,e.computed)(()=>({backgroundColor:p.value.rgb||`#000`})),b=(0,e.computed)(()=>`q-color-picker__header-content q-color-picker__header-content--${p.value.a!==void 0&&p.value.a<65||Ia(p.value)>.4?`light`:`dark`}`),x=(0,e.computed)(()=>({background:`hsl(${p.value.h},100%,50%)`})),S=(0,e.computed)(()=>({top:`${100-p.value.v}%`,[i.lang.rtl===!0?`right`:`left`]:`${p.value.s}%`})),C=(0,e.computed)(()=>t.palette!==void 0&&t.palette.length!==0?t.palette:Ha),w=(0,e.computed)(()=>`q-color-picker`+(t.bordered===!0?` q-color-picker--bordered`:``)+(t.square===!0?` q-color-picker--square no-border-radius`:``)+(t.flat===!0?` q-color-picker--flat no-shadow`:``)+(t.disable===!0?` disabled`:``)+(a.value===!0?` q-color-picker--dark q-dark`:``)),T=(0,e.computed)(()=>t.disable===!0?{"aria-disabled":`true`}:{}),D=(0,e.computed)(()=>[[Zi,I,void 0,{prevent:!0,stop:!0,mouse:!0}]]);(0,e.watch)(()=>t.modelValue,e=>{let n=k(e||t.defaultValue);n.hex!==p.value.hex&&(p.value=n)}),(0,e.watch)(()=>t.defaultValue,e=>{if(!t.modelValue&&e){let t=k(e);t.hex!==p.value.hex&&(p.value=t)}});function O(e,t){p.value.hex=ka(e),p.value.rgb=Aa(e),p.value.r=e.r,p.value.g=e.g,p.value.b=e.b,p.value.a=e.a;let r=p.value[g.value===!0?`hex`:`rgb`];n(`update:modelValue`,r),t===!0&&n(`change`,r)}function k(e){let n=u.value===void 0?t.formatModel===`auto`?null:t.formatModel.indexOf(`a`)!==-1:u.value;if(typeof e!=`string`||e.length===0||Ea.anyColor(e.replace(/ /g,``))!==!0)return{h:0,s:0,v:0,r:0,g:0,b:0,a:n===!0?100:void 0,hex:void 0,rgb:void 0};let r=Pa(e);return n===!0&&r.a===void 0&&(r.a=100),r.hex=ka(r),r.rgb=Aa(r),Object.assign(r,Na(r))}function A(e,t,n){let r=s.value;if(r===null)return;let a=r.clientWidth,o=r.clientHeight,c=r.getBoundingClientRect(),l=Math.min(a,Math.max(0,e-c.left));i.lang.rtl===!0&&(l=a-l);let u=Math.min(o,Math.max(0,t-c.top)),d=Math.round(100*l/a),f=Math.round(100*Math.max(0,Math.min(1,-(u/o)+1))),m=Ma({h:p.value.h,s:d,v:f,a:v.value===!0?p.value.a:void 0});p.value.s=d,p.value.v=f,O(m,n)}function j(e,t){let n=Math.round(e),r=Ma({h:n,s:p.value.s,v:p.value.v,a:v.value===!0?p.value.a:void 0});p.value.h=n,O(r,t)}function M(e){j(e,!0)}function N(t,n,i,a,o){if(a!==void 0&&E(a),!/^[0-9]+$/.test(t)){o===!0&&r.$forceUpdate();return}let s=Math.floor(Number(t));if(s<0||s>i){o===!0&&r.$forceUpdate();return}let c={r:n===`r`?s:p.value.r,g:n===`g`?s:p.value.g,b:n===`b`?s:p.value.b,a:v.value===!0?n===`a`?s:p.value.a:void 0};if(n!==`a`){let e=Na(c);p.value.h=e.h,p.value.s=e.s,p.value.v=e.v}if(O(c,o),o!==!0&&a?.target.selectionEnd!==void 0){let t=a.target.selectionEnd;(0,e.nextTick)(()=>{a.target.setSelectionRange(t,t)})}}function P(t,n){let r,i=t.target.value;if(E(t),d.value===`hex`){if(i.length!==(v.value===!0?9:7)||!/^#[0-9A-Fa-f]+$/.test(i))return!0;r=ja(i)}else{let e;if(!i.endsWith(`)`))return!0;if(v.value!==!0&&i.startsWith(`rgb(`)){if(e=i.substring(4,i.length-1).split(`,`).map(e=>parseInt(e,10)),e.length!==3||!/^rgb\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3}\)$/.test(i))return!0}else if(v.value===!0&&i.startsWith(`rgba(`)){if(e=i.substring(5,i.length-1).split(`,`),e.length!==4||!/^rgba\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},(0|0\.[0-9]+[1-9]|0\.[1-9]+|1)\)$/.test(i))return!0;for(let t=0;t<3;t++){let n=parseInt(e[t],10);if(n<0||n>255)return!0;e[t]=n}let t=parseFloat(e[3]);if(t<0||t>1)return!0;e[3]=t}else return!0;if(e[0]<0||e[0]>255||e[1]<0||e[1]>255||e[2]<0||e[2]>255||v.value===!0&&(e[3]<0||e[3]>1))return!0;r={r:e[0],g:e[1],b:e[2],a:v.value===!0?e[3]*100:void 0}}let a=Na(r);if(p.value.h=a.h,p.value.s=a.s,p.value.v=a.v,O(r,n),n!==!0){let n=t.target.selectionEnd;(0,e.nextTick)(()=>{t.target.setSelectionRange(n,n)})}}function F(e){let t=k(e),n={r:t.r,g:t.g,b:t.b,a:t.a};n.a===void 0&&(n.a=p.value.a),p.value.h=t.h,p.value.s=t.s,p.value.v=t.v,O(n,!0)}function I(e){e.isFinal?A(e.position.left,e.position.top,!0):L(e)}let L=en(e=>{A(e.position.left,e.position.top)},20);function R(e){A(e.pageX-window.pageXOffset,e.pageY-window.pageYOffset,!0)}function z(e){A(e.pageX-window.pageXOffset,e.pageY-window.pageYOffset)}function B(e){c.value!==null&&(c.value.$el.style.opacity=+!!e)}function ee(e){d.value=e}function V(){let n=[];return t.noHeaderTabs!==!0&&n.push((0,e.h)(pa,{class:`q-color-picker__header-tabs`,modelValue:d.value,dense:!0,align:`justify`,"onUpdate:modelValue":ee},()=>[(0,e.h)(va,{label:`HEX`+(v.value===!0?`A`:``),name:`hex`,ripple:!1}),(0,e.h)(va,{label:`RGB`+(v.value===!0?`A`:``),name:`rgb`,ripple:!1})])),n.push((0,e.h)(`div`,{class:`q-color-picker__header-banner row flex-center no-wrap`},[(0,e.h)(`input`,{class:`fit`,value:p.value[d.value],...m.value===!0?{}:{readonly:!0},...o(`topIn`,{onInput:e=>{B(P(e)===!0)},onChange:E,onBlur:e=>{P(e,!0)===!0&&r.$forceUpdate(),B(!1)}})}),(0,e.h)(X,{ref:c,class:`q-color-picker__error-icon absolute no-pointer-events`,name:i.iconSet.type.negative})])),(0,e.h)(`div`,{class:`q-color-picker__header relative-position overflow-hidden`},[(0,e.h)(`div`,{class:`q-color-picker__header-bg absolute-full`}),(0,e.h)(`div`,{class:b.value,style:y.value},n)])}function H(){return(0,e.h)(ya,{modelValue:f.value,animated:!0},()=>[(0,e.h)(ba,{class:`q-color-picker__spectrum-tab overflow-hidden`,name:`spectrum`},ne),(0,e.h)(ba,{class:`q-pa-md q-color-picker__tune-tab`,name:`tune`},W),(0,e.h)(ba,{class:`q-color-picker__palette-tab`,name:`palette`},G)])}function te(e){f.value=e}function U(){return(0,e.h)(`div`,{class:`q-color-picker__footer relative-position overflow-hidden`},[(0,e.h)(pa,{class:`absolute-full`,modelValue:f.value,dense:!0,align:`justify`,"onUpdate:modelValue":te},()=>[(0,e.h)(va,{icon:i.iconSet.colorPicker.spectrum,name:`spectrum`,ripple:!1}),(0,e.h)(va,{icon:i.iconSet.colorPicker.tune,name:`tune`,ripple:!1}),(0,e.h)(va,{icon:i.iconSet.colorPicker.palette,name:`palette`,ripple:!1})])])}function ne(){let t={ref:s,class:`q-color-picker__spectrum non-selectable relative-position cursor-pointer`+(m.value===!0?``:` readonly`),style:x.value,...m.value===!0?{onClick:R,onMousedown:z}:{}},n=[(0,e.h)(`div`,{style:{paddingBottom:`100%`}}),(0,e.h)(`div`,{class:`q-color-picker__spectrum-white absolute-full`}),(0,e.h)(`div`,{class:`q-color-picker__spectrum-black absolute-full`}),(0,e.h)(`div`,{class:`absolute`,style:S.value},[p.value.hex===void 0?null:(0,e.h)(`div`,{class:`q-color-picker__spectrum-circle`})])],r=[(0,e.h)(aa,{class:`q-color-picker__hue non-selectable`,modelValue:p.value.h,min:0,max:360,trackSize:`8px`,innerTrackColor:`transparent`,selectionColor:`transparent`,readonly:m.value!==!0,thumbPath:Ua,"onUpdate:modelValue":j,onChange:M})];return v.value===!0&&r.push((0,e.h)(aa,{class:`q-color-picker__alpha non-selectable`,modelValue:p.value.a,min:0,max:100,trackSize:`8px`,trackColor:`white`,innerTrackColor:`transparent`,selectionColor:`transparent`,trackImg:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAH0lEQVQoU2NkYGAwZkAFZ5G5jPRRgOYEVDeB3EBjBQBOZwTVugIGyAAAAABJRU5ErkJggg==`,readonly:m.value!==!0,hideSelection:!0,thumbPath:Ua,...o(`alphaSlide`,{"onUpdate:modelValue":e=>N(e,`a`,100),onChange:e=>N(e,`a`,100,void 0,!0)})})),[et(`div`,t,n,`spec`,m.value,()=>D.value),(0,e.h)(`div`,{class:`q-color-picker__sliders`},r)]}function W(){return[(0,e.h)(`div`,{class:`row items-center no-wrap`},[(0,e.h)(`div`,`R`),(0,e.h)(aa,{modelValue:p.value.r,min:0,max:255,color:`red`,dark:a.value,readonly:m.value!==!0,...o(`rSlide`,{"onUpdate:modelValue":e=>N(e,`r`,255),onChange:e=>N(e,`r`,255,void 0,!0)})}),(0,e.h)(`input`,{value:p.value.r,maxlength:3,readonly:m.value!==!0,onChange:E,...o(`rIn`,{onInput:e=>N(e.target.value,`r`,255,e),onBlur:e=>N(e.target.value,`r`,255,e,!0)})})]),(0,e.h)(`div`,{class:`row items-center no-wrap`},[(0,e.h)(`div`,`G`),(0,e.h)(aa,{modelValue:p.value.g,min:0,max:255,color:`green`,dark:a.value,readonly:m.value!==!0,...o(`gSlide`,{"onUpdate:modelValue":e=>N(e,`g`,255),onChange:e=>N(e,`g`,255,void 0,!0)})}),(0,e.h)(`input`,{value:p.value.g,maxlength:3,readonly:m.value!==!0,onChange:E,...o(`gIn`,{onInput:e=>N(e.target.value,`g`,255,e),onBlur:e=>N(e.target.value,`g`,255,e,!0)})})]),(0,e.h)(`div`,{class:`row items-center no-wrap`},[(0,e.h)(`div`,`B`),(0,e.h)(aa,{modelValue:p.value.b,min:0,max:255,color:`blue`,readonly:m.value!==!0,dark:a.value,...o(`bSlide`,{"onUpdate:modelValue":e=>N(e,`b`,255),onChange:e=>N(e,`b`,255,void 0,!0)})}),(0,e.h)(`input`,{value:p.value.b,maxlength:3,readonly:m.value!==!0,onChange:E,...o(`bIn`,{onInput:e=>N(e.target.value,`b`,255,e),onBlur:e=>N(e.target.value,`b`,255,e,!0)})})]),v.value===!0?(0,e.h)(`div`,{class:`row items-center no-wrap`},[(0,e.h)(`div`,`A`),(0,e.h)(aa,{modelValue:p.value.a,color:`grey`,readonly:m.value!==!0,dark:a.value,...o(`aSlide`,{"onUpdate:modelValue":e=>N(e,`a`,100),onChange:e=>N(e,`a`,100,void 0,!0)})}),(0,e.h)(`input`,{value:p.value.a,maxlength:3,readonly:m.value!==!0,onChange:E,...o(`aIn`,{onInput:e=>N(e.target.value,`a`,100,e),onBlur:e=>N(e.target.value,`a`,100,e,!0)})})]):null]}function G(){return[(0,e.h)(`div`,{class:`row items-center q-color-picker__palette-rows`+(m.value===!0?` q-color-picker__palette-rows--editable`:``)},C.value.map(t=>(0,e.h)(`div`,{class:`q-color-picker__cube col-auto`,style:{backgroundColor:t},...m.value===!0?o(`palette#`+t,{onClick:()=>{F(t)}}):{}})))]}return()=>{let n=[H()];return t.name!==void 0&&t.disable!==!0&&_(n,`push`),t.noHeader!==!0&&n.unshift(V()),t.noFooter!==!0&&n.push(U()),(0,e.h)(`div`,{class:w.value,...T.value},n)}}});let Ga=[-61,9,38,199,426,686,756,818,1111,1181,1210,1635,2060,2097,2192,2262,2324,2394,2456,3178];function Ka(e,t,n){return Object.prototype.toString.call(e)===`[object Date]`&&(n=e.getDate(),t=e.getMonth()+1,e=e.getFullYear()),$a(eo(e,t,n))}function qa(e,t,n){return to(Qa(e,t,n))}function Ja(e){return Xa(e)===0}function Ya(e,t){return t<=6?31:t<=11||Ja(e)?30:29}function Xa(e){let t=Ga.length,n=Ga[0],r,i,a,o,s;if(e=Ga[t-1])throw Error(`Invalid Jalaali year `+e);for(s=1;s=Ga[n-1])throw Error(`Invalid Jalaali year `+e);for(u=1;u=0){if(a<=185)return i=1+no(a,31),r=ro(a,31)+1,{jy:n,jm:i,jd:r};a-=186}else --n,a+=179,o.leap===1&&(a+=1);return i=7+no(a,30),r=ro(a,30)+1,{jy:n,jm:i,jd:r}}function eo(e,t,n){let r=no((e+no(t-8,6)+100100)*1461,4)+no(153*ro(t+9,12)+2,5)+n-34840408;return r=r-no(no(e+100100+no(t-8,6),100)*3,4)+752,r}function to(e){let t=4*e+139361631;t=t+no(no(4*e+183187720,146097)*3,4)*4-3908;let n=no(ro(t,1461),4)*5+308,r=no(ro(n,153),5)+1,i=ro(no(n,153),12)+1;return{gy:no(t,1461)-100100+no(8-i,6),gm:i,gd:r}}function no(e,t){return~~(e/t)}function ro(e,t){return e-~~(e/t)*t}let io=[`gregorian`,`persian`],ao={mask:{type:String},locale:Object,calendar:{type:String,validator:e=>io.includes(e),default:`gregorian`},landscape:Boolean,color:String,textColor:String,square:Boolean,flat:Boolean,bordered:Boolean,readonly:Boolean,disable:Boolean},oo=[`update:modelValue`];function so(e){return e.year+`/`+J(e.month)+`/`+J(e.day)}function co(t,n){let r=(0,e.computed)(()=>t.disable!==!0&&t.readonly!==!0),i=(0,e.computed)(()=>r.value===!0?0:-1),a=(0,e.computed)(()=>{let e=[];return t.color!==void 0&&e.push(`bg-${t.color}`),t.textColor!==void 0&&e.push(`text-${t.textColor}`),e.join(` `)});function o(){return t.locale===void 0?n.lang.date:{...n.lang.date,...t.locale}}function s(e){let n=new Date,r=e===!0?null:0;if(t.calendar===`persian`){let e=Ka(n);return{year:e.jy,month:e.jm,day:e.jd}}return{year:n.getFullYear(),month:n.getMonth()+1,day:n.getDate(),hour:r,minute:r,second:r,millisecond:r}}return{editable:r,tabindex:i,headerClass:a,getLocale:o,getCurrentDate:s}}let lo=864e5,uo=6e4,fo=`YYYY-MM-DDTHH:mm:ss.SSSZ`,po=/\[((?:[^\]\\]|\\]|\\)*)\]|do|d{1,4}|Mo|M{1,4}|m{1,2}|wo|w{1,2}|Qo|Do|DDDo|D{1,4}|YY(?:YY)?|H{1,2}|h{1,2}|s{1,2}|S{1,3}|Z{1,2}|a{1,2}|[AQExX]/g,mo=/(\[[^\]]*\])|do|d{1,4}|Mo|M{1,4}|m{1,2}|wo|w{1,2}|Qo|Do|DDDo|D{1,4}|YY(?:YY)?|H{1,2}|h{1,2}|s{1,2}|S{1,3}|Z{1,2}|a{1,2}|[AQExX]|([.*+:?^,\s${}()|\\]+)/g,ho={};function go(e,t){let n=`(`+t.days.join(`|`)+`)`,r=e+n;if(ho[r]!==void 0)return ho[r];let i=`(`+t.daysShort.join(`|`)+`)`,a=`(`+t.months.join(`|`)+`)`,o=`(`+t.monthsShort.join(`|`)+`)`,s={},c=0,l=e.replace(mo,e=>{switch(c++,e){case`YY`:return s.YY=c,`(-?\\d{1,2})`;case`YYYY`:return s.YYYY=c,`(-?\\d{1,4})`;case`M`:return s.M=c,`(\\d{1,2})`;case`Mo`:return s.M=c++,`(\\d{1,2}(st|nd|rd|th))`;case`MM`:return s.M=c,`(\\d{2})`;case`MMM`:return s.MMM=c,o;case`MMMM`:return s.MMMM=c,a;case`D`:return s.D=c,`(\\d{1,2})`;case`Do`:return s.D=c++,`(\\d{1,2}(st|nd|rd|th))`;case`DD`:return s.D=c,`(\\d{2})`;case`H`:return s.H=c,`(\\d{1,2})`;case`HH`:return s.H=c,`(\\d{2})`;case`h`:return s.h=c,`(\\d{1,2})`;case`hh`:return s.h=c,`(\\d{2})`;case`m`:return s.m=c,`(\\d{1,2})`;case`mm`:return s.m=c,`(\\d{2})`;case`s`:return s.s=c,`(\\d{1,2})`;case`ss`:return s.s=c,`(\\d{2})`;case`S`:return s.S=c,`(\\d{1})`;case`SS`:return s.S=c,`(\\d{2})`;case`SSS`:return s.S=c,`(\\d{3})`;case`A`:return s.A=c,`(AM|PM)`;case`a`:return s.a=c,`(am|pm)`;case`aa`:return s.aa=c,`(a\\.m\\.|p\\.m\\.)`;case`ddd`:return i;case`dddd`:return n;case`Q`:case`d`:case`E`:return`(\\d{1})`;case`do`:return c++,`(\\d{1}(st|nd|rd|th))`;case`Qo`:return`(1st|2nd|3rd|4th)`;case`DDD`:case`DDDD`:return`(\\d{1,3})`;case`DDDo`:return c++,`(\\d{1,3}(st|nd|rd|th))`;case`w`:return`(\\d{1,2})`;case`wo`:return c++,`(\\d{1,2}(st|nd|rd|th))`;case`ww`:return`(\\d{2})`;case`Z`:return s.Z=c,`(Z|[+-]\\d{2}:\\d{2})`;case`ZZ`:return s.ZZ=c,`(Z|[+-]\\d{2}\\d{2})`;case`X`:return s.X=c,`(-?\\d+)`;case`x`:return s.x=c,`(-?\\d{4,})`;default:return c--,e[0]===`[`&&(e=e.substring(1,e.length-1)),e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}}),u={map:s,regex:RegExp(`^`+l)};return ho[r]=u,u}function _o(e,t){return e===void 0?t===void 0?oe.date:t.date:e}function vo(e,t=``){let n=e>0?`-`:`+`,r=Math.abs(e),i=Math.floor(r/60),a=r%60;return n+J(i)+t+J(a)}function yo(e,t,n){let r=e.getFullYear(),i=e.getMonth(),a=e.getDate();return t.year!==void 0&&(r+=n*t.year,delete t.year),t.month!==void 0&&(i+=n*t.month,delete t.month),e.setDate(1),e.setMonth(2),e.setFullYear(r),e.setMonth(i),e.setDate(Math.min(a,Go(e))),t.date!==void 0&&(e.setDate(e.getDate()+n*t.date),delete t.date),e}function bo(e,t,n){let r=t.year===void 0?e[`get${n}FullYear`]():t.year,i=t.month===void 0?e[`get${n}Month`]():t.month-1,a=new Date(r,i+1,0).getDate(),o=Math.min(a,t.date===void 0?e[`get${n}Date`]():t.date);return e[`set${n}Date`](1),e[`set${n}Month`](2),e[`set${n}FullYear`](r),e[`set${n}Month`](i),e[`set${n}Date`](o),delete t.year,delete t.month,delete t.date,e}function xo(e,t,n){let r=So(t),i=new Date(e),a=r.year!==void 0||r.month!==void 0||r.date!==void 0?yo(i,r,n):i;for(let e in r){let t=Pe(e);a[`set${t}`](a[`get${t}`]()+n*r[e])}return a}function So(e){let t={...e};return e.years!==void 0&&(t.year=e.years,delete t.years),e.months!==void 0&&(t.month=e.months,delete t.months),e.days!==void 0&&(t.date=e.days,delete t.days),e.day!==void 0&&(t.date=e.day,delete t.day),e.hour!==void 0&&(t.hours=e.hour,delete t.hour),e.minute!==void 0&&(t.minutes=e.minute,delete t.minute),e.second!==void 0&&(t.seconds=e.second,delete t.second),e.millisecond!==void 0&&(t.milliseconds=e.millisecond,delete t.millisecond),t}function Co(e,t,n){let r=So(t),i=n===!0?`UTC`:``,a=new Date(e),o=r.year!==void 0||r.month!==void 0||r.date!==void 0?bo(a,r,i):a;for(let e in r)o[`set${i}${e.charAt(0).toUpperCase()+e.slice(1)}`](r[e]);return o}function wo(e,t,n){let r=To(e,t,n),i=new Date(r.year,r.month===null?null:r.month-1,r.day===null?1:r.day,r.hour,r.minute,r.second,r.millisecond),a=i.getTimezoneOffset();return r.timezoneOffset===null||r.timezoneOffset===a?i:xo(i,{minutes:r.timezoneOffset-a},1)}function To(e,t,n,r,i){let a={year:null,month:null,day:null,hour:null,minute:null,second:null,millisecond:null,timezoneOffset:null,dateHash:null,timeHash:null};if(i!==void 0&&Object.assign(a,i),e==null||e===``||typeof e!=`string`)return a;t===void 0&&(t=fo);let o=_o(n,ce.props),s=o.months,c=o.monthsShort,{regex:l,map:u}=go(t,o),d=e.match(l);if(d===null)return a;let f=``;if(u.X!==void 0||u.x!==void 0){let e=parseInt(d[u.X===void 0?u.x:u.X],10);if(isNaN(e)===!0||e<0)return a;let t=new Date(e*(u.X===void 0?1:1e3));a.year=t.getFullYear(),a.month=t.getMonth()+1,a.day=t.getDate(),a.hour=t.getHours(),a.minute=t.getMinutes(),a.second=t.getSeconds(),a.millisecond=t.getMilliseconds()}else{if(u.YYYY!==void 0)a.year=parseInt(d[u.YYYY],10);else if(u.YY!==void 0){let e=parseInt(d[u.YY],10);a.year=e<0?e:2e3+e}if(u.M!==void 0){if(a.month=parseInt(d[u.M],10),a.month<1||a.month>12)return a}else u.MMM===void 0?u.MMMM!==void 0&&(a.month=s.indexOf(d[u.MMMM])+1):a.month=c.indexOf(d[u.MMM])+1;if(u.D!==void 0){if(a.day=parseInt(d[u.D],10),a.year===null||a.month===null||a.day<1)return a;let e=r===`persian`?Ya(a.year,a.month):new Date(a.year,a.month,0).getDate();if(a.day>e)return a}u.H===void 0?u.h!==void 0&&(a.hour=parseInt(d[u.h],10)%12,(u.A&&d[u.A]===`PM`||u.a&&d[u.a]===`pm`||u.aa&&d[u.aa]===`p.m.`)&&(a.hour+=12),a.hour%=24):a.hour=parseInt(d[u.H],10)%24,u.m!==void 0&&(a.minute=parseInt(d[u.m],10)%60),u.s!==void 0&&(a.second=parseInt(d[u.s],10)%60),u.S!==void 0&&(a.millisecond=parseInt(d[u.S],10)*10**(3-d[u.S].length)),(u.Z!==void 0||u.ZZ!==void 0)&&(f=u.Z===void 0?d[u.ZZ]:d[u.Z].replace(`:`,``),a.timezoneOffset=(f[0]===`+`?-1:1)*(60*f.slice(1,3)+Number(f.slice(3,5))))}return a.dateHash=J(a.year,4)+`/`+J(a.month)+`/`+J(a.day),a.timeHash=J(a.hour)+`:`+J(a.minute)+`:`+J(a.second)+f,a}function Eo(e){return typeof e==`number`?!0:isNaN(Date.parse(e))===!1}function Do(e,t){return Co(new Date,e,t)}function Oo(e){let t=new Date(e).getDay();return t===0?7:t}function ko(e){let t=new Date(e.getFullYear(),e.getMonth(),e.getDate());t.setDate(t.getDate()-(t.getDay()+6)%7+3);let n=new Date(t.getFullYear(),0,4);n.setDate(n.getDate()-(n.getDay()+6)%7+3);let r=t.getTimezoneOffset()-n.getTimezoneOffset();t.setHours(t.getHours()-r);let i=(t-n)/(lo*7);return 1+Math.floor(i)}function Ao(e){return e.getFullYear()*1e4+e.getMonth()*100+e.getDate()}function jo(e,t){let n=new Date(e);return t===!0?Ao(n):n.getTime()}function Mo(e,t,n,r={}){let i=jo(t,r.onlyDate),a=jo(n,r.onlyDate),o=jo(e,r.onlyDate);return(o>i||r.inclusiveFrom===!0&&o===i)&&(o{t=Math.max(t,new Date(e))}),new Date(t)}function Ro(e){let t=new Date(e);return Array.prototype.slice.call(arguments,1).forEach(e=>{t=Math.min(t,new Date(e))}),new Date(t)}function zo(e,t,n){return(e.getTime()-e.getTimezoneOffset()*uo-(t.getTime()-t.getTimezoneOffset()*uo))/n}function Bo(e,t,n=`days`){let r=new Date(e),i=new Date(t);switch(n){case`years`:case`year`:return r.getFullYear()-i.getFullYear();case`months`:case`month`:return(r.getFullYear()-i.getFullYear())*12+r.getMonth()-i.getMonth();case`days`:case`day`:case`date`:return zo(Fo(r,`day`),Fo(i,`day`),lo);case`hours`:case`hour`:return zo(Fo(r,`hour`),Fo(i,`hour`),36e5);case`minutes`:case`minute`:return zo(Fo(r,`minute`),Fo(i,`minute`),uo);case`seconds`:case`second`:return zo(Fo(r,`second`),Fo(i,`second`),1e3)}}function Vo(e){return Bo(e,Fo(e,`year`),`days`)+1}function Ho(e){return Ce(e)===!0?`date`:typeof e==`number`?`number`:`string`}function Uo(e,t,n){let r=new Date(e);if(t){let e=new Date(t);if(re)return e}return r}function Wo(e,t,n){let r=new Date(e),i=new Date(t);if(n===void 0)return r.getTime()===i.getTime();switch(n){case`second`:case`seconds`:if(r.getSeconds()!==i.getSeconds())return!1;case`minute`:case`minutes`:if(r.getMinutes()!==i.getMinutes())return!1;case`hour`:case`hours`:if(r.getHours()!==i.getHours())return!1;case`day`:case`days`:case`date`:if(r.getDate()!==i.getDate())return!1;case`month`:case`months`:if(r.getMonth()!==i.getMonth())return!1;case`year`:case`years`:if(r.getFullYear()!==i.getFullYear())return!1;break;default:throw Error(`date isSameDate unknown unit ${n}`)}return!0}function Go(e){return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()}function Ko(e){if(e>=11&&e<=13)return`${e}th`;switch(e%10){case 1:return`${e}st`;case 2:return`${e}nd`;case 3:return`${e}rd`}return`${e}th`}let qo={YY(e,t,n){let r=this.YYYY(e,t,n)%100;return r>=0?J(r):`-`+J(Math.abs(r))},YYYY(e,t,n){return n??e.getFullYear()},M(e){return e.getMonth()+1},Mo(e){return Ko(e.getMonth()+1)},MM(e){return J(e.getMonth()+1)},MMM(e,t){return t.monthsShort[e.getMonth()]},MMMM(e,t){return t.months[e.getMonth()]},Q(e){return Math.ceil((e.getMonth()+1)/3)},Qo(e){return Ko(this.Q(e))},D(e){return e.getDate()},Do(e){return Ko(e.getDate())},DD(e){return J(e.getDate())},DDD(e){return Vo(e)},DDDo(e){return Ko(Vo(e))},DDDD(e){return J(Vo(e),3)},d(e){return e.getDay()},do(e){return Ko(e.getDay())},dd(e,t){return t.days[e.getDay()].slice(0,2)},ddd(e,t){return t.daysShort[e.getDay()]},dddd(e,t){return t.days[e.getDay()]},E(e){return e.getDay()||7},w(e){return ko(e)},wo(e){return Ko(ko(e))},ww(e){return J(ko(e))},H(e){return e.getHours()},HH(e){return J(e.getHours())},h(e){let t=e.getHours();return t===0?12:t>12?t%12:t},hh(e){return J(this.h(e))},m(e){return e.getMinutes()},mm(e){return J(e.getMinutes())},s(e){return e.getSeconds()},ss(e){return J(e.getSeconds())},S(e){return Math.floor(e.getMilliseconds()/100)},SS(e){return J(Math.floor(e.getMilliseconds()/10))},SSS(e){return J(e.getMilliseconds(),3)},A(e){return e.getHours()<12?`AM`:`PM`},a(e){return e.getHours()<12?`am`:`pm`},aa(e){return e.getHours()<12?`a.m.`:`p.m.`},Z(e,t,n,r){return vo(r??e.getTimezoneOffset(),`:`)},ZZ(e,t,n,r){return vo(r??e.getTimezoneOffset())},X(e){return Math.floor(e.getTime()/1e3)},x(e){return e.getTime()}};function Jo(e,t,n,r,i){if(e!==0&&!e||e===1/0||e===-1/0)return;let a=new Date(e);if(isNaN(a))return;t===void 0&&(t=fo);let o=_o(n,ce.props);return t.replace(po,(e,t)=>e in qo?qo[e](a,o,r,i):t===void 0?e:t.split(`\\]`).join(`]`))}function Yo(e){return Ce(e)===!0?new Date(e.getTime()):e}var Xo={isValid:Eo,extractDate:wo,buildDate:Do,getDayOfWeek:Oo,getWeekOfYear:ko,isBetweenDates:Mo,addToDate:No,subtractFromDate:Po,adjustDate:Co,startOfDate:Fo,endOfDate:Io,getMaxDate:Lo,getMinDate:Ro,getDateDiff:Bo,getDayOfYear:Vo,inferDateFormat:Ho,getDateBetween:Uo,isSameDate:Wo,daysInMonth:Go,formatDate:Jo,clone:Yo};let Zo=[`Calendar`,`Years`,`Months`],Qo=e=>Zo.includes(e),$o=e=>/^-?[\d]+\/[0-1]\d$/.test(e),es=` — `;function ts(e){return e.year+`/`+J(e.month)}var ns=h({name:`QDate`,props:{...ao,...ai,...Z,modelValue:{required:!0,validator:e=>typeof e==`string`||Array.isArray(e)===!0||Object(e)===e||e===null},multiple:Boolean,range:Boolean,title:String,subtitle:String,mask:{...ao.mask,default:`YYYY/MM/DD`},defaultYearMonth:{type:String,validator:$o},yearsInMonthView:Boolean,events:[Array,Function],eventColor:[String,Function],emitImmediately:Boolean,options:[Array,Function],navigationMinYearMonth:{type:String,validator:$o},navigationMaxYearMonth:{type:String,validator:$o},noUnset:Boolean,firstDayOfWeek:[String,Number],todayBtn:Boolean,minimal:Boolean,defaultView:{type:String,default:`Calendar`,validator:Qo}},emits:[...oo,`rangeStart`,`rangeEnd`,`navigation`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=Q(t,a),{getCache:s}=bi(),{tabindex:c,headerClass:l,getLocale:u,getCurrentDate:d}=co(t,a),f,p=si(oi(t)),m=(0,e.ref)(null),h=(0,e.ref)(q()),g=(0,e.ref)(u()),_=(0,e.computed)(()=>q()),v=(0,e.computed)(()=>u()),y=(0,e.computed)(()=>d()),b=(0,e.ref)(ye(h.value,g.value)),x=(0,e.ref)(t.defaultView),S=(0,e.computed)(()=>a.lang.rtl===!0?`right`:`left`),C=(0,e.ref)(S.value),w=(0,e.ref)(S.value),T=b.value.year,E=(0,e.ref)(T-T%20-(T<0?20:0)),D=(0,e.ref)(null),O=(0,e.computed)(()=>{let e=t.landscape===!0?`landscape`:`portrait`;return`q-date q-date--${e} q-date--${e}-${t.minimal===!0?`minimal`:`standard`}`+(o.value===!0?` q-date--dark q-dark`:``)+(t.bordered===!0?` q-date--bordered`:``)+(t.square===!0?` q-date--square no-border-radius`:``)+(t.flat===!0?` q-date--flat no-shadow`:``)+(t.disable===!0?` disabled`:t.readonly===!0?` q-date--readonly`:``)}),k=(0,e.computed)(()=>t.color||`primary`),A=(0,e.computed)(()=>t.textColor||`white`),j=(0,e.computed)(()=>t.emitImmediately===!0&&t.multiple!==!0&&t.range!==!0),M=(0,e.computed)(()=>Array.isArray(t.modelValue)===!0?t.modelValue:t.modelValue!==null&&t.modelValue!==void 0?[t.modelValue]:[]),N=(0,e.computed)(()=>M.value.filter(e=>typeof e==`string`).map(e=>ve(e,h.value,g.value)).filter(e=>e.dateHash!==null&&e.day!==null&&e.month!==null&&e.year!==null)),P=(0,e.computed)(()=>{let e=e=>ve(e,h.value,g.value);return M.value.filter(e=>Se(e)===!0&&e.from!==void 0&&e.to!==void 0).map(t=>({from:e(t.from),to:e(t.to)})).filter(e=>e.from.dateHash!==null&&e.to.dateHash!==null&&e.from.dateHasht.calendar===`persian`?e=>{let t=qa(e.year,e.month,e.day);return new Date(t.gy,t.gm-1,t.gd)}:e=>new Date(e.year,e.month-1,e.day)),I=(0,e.computed)(()=>t.calendar===`persian`?so:(e,t,n)=>Jo(new Date(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond),t===void 0?h.value:t,n===void 0?g.value:n,e.year,e.timezoneOffset)),L=(0,e.computed)(()=>N.value.length+P.value.reduce((e,t)=>e+1+Bo(F.value(t.to),F.value(t.from)),0)),R=(0,e.computed)(()=>{if(t.title!==void 0&&t.title!==null&&t.title.length!==0)return t.title;if(D.value!==null){let e=D.value.init,t=F.value(e);return g.value.daysShort[t.getDay()]+`, `+g.value.monthsShort[e.month-1]+` `+e.day+es+`?`}if(L.value===0)return es;if(L.value>1)return`${L.value} ${g.value.pluralDay}`;let e=N.value[0],n=F.value(e);return isNaN(n.valueOf())===!0?es:g.value.headerTitle===void 0?g.value.daysShort[n.getDay()]+`, `+g.value.monthsShort[e.month-1]+` `+e.day:g.value.headerTitle(n,e)}),z=(0,e.computed)(()=>N.value.concat(P.value.map(e=>e.from)).sort((e,t)=>e.year-t.year||e.month-t.month)[0]),B=(0,e.computed)(()=>N.value.concat(P.value.map(e=>e.to)).sort((e,t)=>t.year-e.year||t.month-e.month)[0]),ee=(0,e.computed)(()=>{if(t.subtitle!==void 0&&t.subtitle!==null&&t.subtitle.length!==0)return t.subtitle;if(L.value===0)return es;if(L.value>1){let e=z.value,t=B.value,n=g.value.monthsShort;return n[e.month-1]+(e.year===t.year?e.month===t.month?``:es+n[t.month-1]:` `+e.year+es+n[t.month-1]+` `)+` `+t.year}return N.value[0].year}),V=(0,e.computed)(()=>{let e=[a.iconSet.datetime.arrowLeft,a.iconSet.datetime.arrowRight];return a.lang.rtl===!0?e.reverse():e}),H=(0,e.computed)(()=>t.firstDayOfWeek===void 0?g.value.firstDayOfWeek:Number(t.firstDayOfWeek)),te=(0,e.computed)(()=>{let e=g.value.daysShort,t=H.value;return t>0?e.slice(t,7).concat(e.slice(0,t)):e}),U=(0,e.computed)(()=>{let e=b.value;return t.calendar===`persian`?Ya(e.year,e.month):new Date(e.year,e.month,0).getDate()}),ne=(0,e.computed)(()=>typeof t.eventColor==`function`?t.eventColor:()=>t.eventColor),W=(0,e.computed)(()=>{if(t.navigationMinYearMonth===void 0)return null;let e=t.navigationMinYearMonth.split(`/`);return{year:parseInt(e[0],10),month:parseInt(e[1],10)}}),G=(0,e.computed)(()=>{if(t.navigationMaxYearMonth===void 0)return null;let e=t.navigationMaxYearMonth.split(`/`);return{year:parseInt(e[0],10),month:parseInt(e[1],10)}}),re=(0,e.computed)(()=>{let e={month:{prev:!0,next:!0},year:{prev:!0,next:!0}};return W.value!==null&&W.value.year>=b.value.year&&(e.year.prev=!1,W.value.year===b.value.year&&W.value.month>=b.value.month&&(e.month.prev=!1)),G.value!==null&&G.value.year<=b.value.year&&(e.year.next=!1,G.value.year===b.value.year&&G.value.month<=b.value.month&&(e.month.next=!1)),e}),K=(0,e.computed)(()=>{let e={};return N.value.forEach(t=>{let n=ts(t);e[n]===void 0&&(e[n]=[]),e[n].push(t.day)}),e}),ie=(0,e.computed)(()=>{let e={};return P.value.forEach(t=>{let n=ts(t.from),r=ts(t.to);if(e[n]===void 0&&(e[n]=[]),e[n].push({from:t.from.day,to:n===r?t.to.day:void 0,range:t}),n12&&(o.year++,o.month=1)}}),e}),ae=(0,e.computed)(()=>{if(D.value===null)return;let{init:e,initHash:t,final:n,finalHash:r}=D.value,[i,a]=t<=r?[e,n]:[n,e],o=ts(i),s=ts(a);if(o!==oe.value&&s!==oe.value)return;let c={};return o===oe.value?(c.from=i.day,c.includeFrom=!0):c.from=1,s===oe.value?(c.to=a.day,c.includeTo=!0):c.to=U.value,c}),oe=(0,e.computed)(()=>ts(b.value)),se=(0,e.computed)(()=>{let e={};if(t.options===void 0){for(let t=1;t<=U.value;t++)e[t]=!0;return e}let n=typeof t.options==`function`?t.options:e=>t.options.includes(e);for(let t=1;t<=U.value;t++)e[t]=n(oe.value+`/`+J(t));return e}),ce=(0,e.computed)(()=>{let e={};if(t.events===void 0)for(let t=1;t<=U.value;t++)e[t]=!1;else{let n=typeof t.events==`function`?t.events:e=>t.events.includes(e);for(let t=1;t<=U.value;t++){let r=oe.value+`/`+J(t);e[t]=n(r)===!0&&ne.value(r)}}return e}),le=(0,e.computed)(()=>{let e,n,{year:r,month:i}=b.value;if(t.calendar!==`persian`)e=new Date(r,i-1,1),n=new Date(r,i-1,0).getDate();else{let t=qa(r,i,1);e=new Date(t.gy,t.gm-1,t.gd);let a=i-1,o=r;a===0&&(a=12,o--),n=Ya(o,a)}return{days:e.getDay()-H.value-1,endDay:n}}),ue=(0,e.computed)(()=>{let e=[],{days:t,endDay:n}=le.value,r=t<0?t+7:t;if(r<6)for(let t=n-r;t<=n;t++)e.push({i:t,fill:!0});let i=e.length;for(let t=1;t<=U.value;t++){let n={i:t,event:ce.value[t],classes:[]};se.value[t]===!0&&(n.in=!0,n.flat=!0),e.push(n)}if(K.value[oe.value]!==void 0&&K.value[oe.value].forEach(t=>{let n=i+t-1;Object.assign(e[n],{selected:!0,unelevated:!0,flat:!1,color:k.value,textColor:A.value})}),ie.value[oe.value]!==void 0&&ie.value[oe.value].forEach(t=>{if(t.from!==void 0){let n=i+t.from-1,r=i+(t.to||U.value)-1;for(let i=n;i<=r;i++)Object.assign(e[i],{range:t.range,unelevated:!0,color:k.value,textColor:A.value});Object.assign(e[n],{rangeFrom:!0,flat:!1}),t.to!==void 0&&Object.assign(e[r],{rangeTo:!0,flat:!1})}else if(t.to!==void 0){let n=i+t.to-1;for(let r=i;r<=n;r++)Object.assign(e[r],{range:t.range,unelevated:!0,color:k.value,textColor:A.value});Object.assign(e[n],{flat:!1,rangeTo:!0})}else{let n=i+U.value-1;for(let r=i;r<=n;r++)Object.assign(e[r],{range:t.range,unelevated:!0,color:k.value,textColor:A.value})}}),ae.value!==void 0){let t=i+ae.value.from-1,n=i+ae.value.to-1;for(let r=t;r<=n;r++)e[r].color=k.value,e[r].editRange=!0;ae.value.includeFrom===!0&&(e[t].editRangeFrom=!0),ae.value.includeTo===!0&&(e[n].editRangeTo=!0)}b.value.year===y.value.year&&b.value.month===y.value.month&&(e[i+y.value.day-1].today=!0);let a=e.length%7;if(a>0){let t=7-a;for(let n=1;n<=t;n++)e.push({i:n,fill:!0})}return e.forEach(e=>{let t=`q-date__calendar-item `;e.fill===!0?t+=`q-date__calendar-item--fill`:(t+=`q-date__calendar-item--${e.in===!0?`in`:`out`}`,e.range!==void 0&&(t+=` q-date__range${e.rangeTo===!0?`-to`:e.rangeFrom===!0?`-from`:``}`),e.editRange===!0&&(t+=` q-date__edit-range${e.editRangeFrom===!0?`-from`:``}${e.editRangeTo===!0?`-to`:``}`),(e.range!==void 0||e.editRange===!0)&&(t+=` text-${e.color}`)),e.classes=t}),e}),de=(0,e.computed)(()=>t.disable===!0?{"aria-disabled":`true`}:{});(0,e.watch)(()=>t.modelValue,e=>{if(f===JSON.stringify(e))f=0;else{let e=ye(h.value,g.value);Oe(e.year,e.month,e)}}),(0,e.watch)(x,()=>{m.value!==null&&i.$el.contains(document.activeElement)===!0&&m.value.focus()}),(0,e.watch)(()=>b.value.year+`|`+b.value.month,()=>{r(`navigation`,{year:b.value.year,month:b.value.month})}),(0,e.watch)(_,e=>{Fe(e,g.value,`mask`),h.value=e}),(0,e.watch)(v,e=>{Fe(h.value,e,`locale`),g.value=e});function fe(e){f=JSON.stringify(e)}function pe(){let{year:e,month:t,day:n}=y.value,r={...b.value,year:e,month:t,day:n},i=K.value[ts(r)];(i===void 0||i.includes(r.day)===!1)&&Ne(r),ge(r.year,r.month)}function me(e){Qo(e)===!0&&(x.value=e)}function he(e,t){[`month`,`year`].includes(e)&&(e===`month`?xe:Ce)(t===!0?-1:1)}function ge(e,t){x.value=`Calendar`,Oe(e,t)}function _e(e,n){if(t.range===!1||!e){D.value=null;return}let r=Object.assign({...b.value},e),i=n===void 0?r:Object.assign({...b.value},n);D.value={init:r,initHash:so(r),final:i,finalHash:so(i)},ge(r.year,r.month)}function q(){return t.calendar===`persian`?`YYYY/MM/DD`:t.mask}function ve(e,n,r){return To(e,n,r,t.calendar,{hour:0,minute:0,second:0,millisecond:0})}function ye(e,n){let r=Array.isArray(t.modelValue)===!0?t.modelValue:t.modelValue?[t.modelValue]:[];if(r.length===0)return be();let i=r[r.length-1],a=ve(i.from===void 0?i:i.from,e,n);return a.dateHash===null?be():a}function be(){let e,n;if(t.defaultYearMonth!==void 0){let r=t.defaultYearMonth.split(`/`);e=parseInt(r[0],10),n=parseInt(r[1],10)}else{let t=y.value===void 0?d():y.value;e=t.year,n=t.month}return{year:e,month:n,day:1,hour:0,minute:0,second:0,millisecond:0,dateHash:e+`/`+J(n)+`/01`}}function xe(e){let t=b.value.year,n=Number(b.value.month)+e;n===13?(n=1,t++):n===0&&(n=12,t--),Oe(t,n),j.value===!0&&Ae(`month`)}function Ce(e){Oe(Number(b.value.year)+e,b.value.month),j.value===!0&&Ae(`year`)}function we(e){Oe(e,b.value.month),x.value=t.defaultView===`Years`?`Months`:`Calendar`,j.value===!0&&Ae(`year`)}function Te(e){Oe(b.value.year,e),x.value=`Calendar`,j.value===!0&&Ae(`month`)}function Ee(e,t){(K.value[t]?.includes(e.day)===!0?Pe:Ne)(e)}function De(e){return{year:e.year,month:e.month,day:e.day}}function Oe(t,n,r){if(W.value!==null&&t<=W.value.year&&((n=G.value.year&&((n>G.value.month||t>G.value.year)&&(n=G.value.month),t=G.value.year),r!==void 0){let{hour:e,minute:t,second:n,millisecond:i,timezoneOffset:a,timeHash:o}=r;Object.assign(b.value,{hour:e,minute:t,second:n,millisecond:i,timezoneOffset:a,timeHash:o})}let i=t+`/`+J(n)+`/01`;i!==b.value.dateHash&&(C.value=b.value.dateHash{E.value=t-t%20-(t<0?20:0),Object.assign(b.value,{year:t,month:n,day:1,dateHash:i})}))}function ke(e,n,i){let a=e!==null&&e.length===1&&t.multiple===!1?e[0]:e,{reason:o,details:s}=je(n,i);fe(a),r(`update:modelValue`,a,o,s)}function Ae(n){let i=N.value[0]!==void 0&&N.value[0].dateHash!==null?{...N.value[0]}:{...b.value};(0,e.nextTick)(()=>{i.year=b.value.year,i.month=b.value.month;let e=t.calendar===`persian`?Ya(i.year,i.month):new Date(i.year,i.month,0).getDate();i.day=Math.min(Math.max(1,i.day),e);let a=Me(i),{details:o}=je(``,i);fe(a),r(`update:modelValue`,a,n,o)})}function je(e,t){return t.from===void 0?{reason:`${e}-day`,details:De(t)}:{reason:`${e}-range`,details:{...De(t.target),from:De(t.from),to:De(t.to)}}}function Me(e,t,n){return e.from===void 0?I.value(e,t,n):{from:I.value(e.from,t,n),to:I.value(e.to,t,n)}}function Ne(e){let n;if(t.multiple===!0)if(e.from!==void 0){let t=so(e.from),r=so(e.to),i=N.value.filter(e=>e.dateHashr),a=P.value.filter(({from:e,to:n})=>n.dateHashr);n=i.concat(a).concat(e).map(e=>Me(e))}else{let t=M.value.slice();t.push(Me(e)),n=t}else n=Me(e);ke(n,`add`,e)}function Pe(e){if(t.noUnset===!0)return;let n=null;if(t.multiple===!0&&Array.isArray(t.modelValue)===!0){let r=Me(e);n=e.from===void 0?t.modelValue.filter(e=>e!==r):t.modelValue.filter(e=>e.from===void 0?!0:e.from!==r.from&&e.to!==r.to),n.length===0&&(n=null)}ke(n,`remove`,e)}function Fe(e,n,i){let a=N.value.concat(P.value).map(t=>Me(t,e,n)).filter(e=>e.from===void 0?e.dateHash!==null:e.from.dateHash!==null&&e.to.dateHash!==null),o=(t.multiple===!0?a:a[0])||null;fe(o),r(`update:modelValue`,o,i)}function Ie(){if(t.minimal!==!0)return(0,e.h)(`div`,{class:`q-date__header `+l.value},[(0,e.h)(`div`,{class:`relative-position`},[(0,e.h)(e.Transition,{name:`q-transition--fade`},()=>(0,e.h)(`div`,{key:`h-yr-`+ee.value,class:`q-date__header-subtitle q-date__header-link `+(x.value===`Years`?`q-date__header-link--active`:`cursor-pointer`),tabindex:c.value,...s(`vY`,{onClick(){x.value=`Years`},onKeyup(e){e.keyCode===13&&(x.value=`Years`)}})},[ee.value]))]),(0,e.h)(`div`,{class:`q-date__header-title relative-position flex no-wrap`},[(0,e.h)(`div`,{class:`relative-position col`},[(0,e.h)(e.Transition,{name:`q-transition--fade`},()=>(0,e.h)(`div`,{key:`h-sub`+R.value,class:`q-date__header-title-label q-date__header-link `+(x.value===`Calendar`?`q-date__header-link--active`:`cursor-pointer`),tabindex:c.value,...s(`vC`,{onClick(){x.value=`Calendar`},onKeyup(e){e.keyCode===13&&(x.value=`Calendar`)}})},[R.value]))]),t.todayBtn===!0?(0,e.h)($,{class:`q-date__header-today self-start`,icon:a.iconSet.datetime.today,"aria-label":a.lang.date.today,flat:!0,size:`sm`,round:!0,tabindex:c.value,onClick:pe}):null])])}function Le({label:t,type:n,key:r,dir:i,goTo:o,boundaries:l,cls:u}){return[(0,e.h)(`div`,{class:`row items-center q-date__arrow`},[(0,e.h)($,{round:!0,dense:!0,size:`sm`,flat:!0,icon:V.value[0],"aria-label":n===`Years`?a.lang.date.prevYear:a.lang.date.prevMonth,tabindex:c.value,disable:l.prev===!1,...s(`go-#`+n,{onClick(){o(-1)}})})]),(0,e.h)(`div`,{class:`relative-position overflow-hidden flex flex-center`+u},[(0,e.h)(e.Transition,{name:`q-transition--jump-`+i},()=>(0,e.h)(`div`,{key:r},[(0,e.h)($,{flat:!0,dense:!0,noCaps:!0,label:t,tabindex:c.value,...s(`view#`+n,{onClick:()=>{x.value=n}})})]))]),(0,e.h)(`div`,{class:`row items-center q-date__arrow`},[(0,e.h)($,{round:!0,dense:!0,size:`sm`,flat:!0,icon:V.value[1],"aria-label":n===`Years`?a.lang.date.nextYear:a.lang.date.nextMonth,tabindex:c.value,disable:l.next===!1,...s(`go+#`+n,{onClick(){o(1)}})})])]}let Re={Calendar:()=>[(0,e.h)(`div`,{key:`calendar-view`,class:`q-date__view q-date__calendar`},[(0,e.h)(`div`,{class:`q-date__navigation row items-center no-wrap`},Le({label:g.value.months[b.value.month-1],type:`Months`,key:b.value.month,dir:C.value,goTo:xe,boundaries:re.value.month,cls:` col`}).concat(Le({label:b.value.year,type:`Years`,key:b.value.year,dir:w.value,goTo:Ce,boundaries:re.value.year,cls:``}))),(0,e.h)(`div`,{class:`q-date__calendar-weekdays row items-center no-wrap`},te.value.map(t=>(0,e.h)(`div`,{class:`q-date__calendar-item`},[(0,e.h)(`div`,t)]))),(0,e.h)(`div`,{class:`q-date__calendar-days-container relative-position overflow-hidden`},[(0,e.h)(e.Transition,{name:`q-transition--slide-`+C.value},()=>(0,e.h)(`div`,{key:oe.value,class:`q-date__calendar-days fit`},ue.value.map(t=>(0,e.h)(`div`,{class:t.classes},[t.in===!0?(0,e.h)($,{class:t.today===!0?`q-date__today`:``,dense:!0,flat:t.flat,unelevated:t.unelevated,color:t.color,textColor:t.textColor,label:t.i,tabindex:c.value,...s(`day#`+t.i,{onClick:()=>{ze(t.i)},onMouseover:()=>{Be(t.i)}})},t.event===!1?null:()=>(0,e.h)(`div`,{class:`q-date__event bg-`+t.event})):(0,e.h)(`div`,String(t.i))]))))])])],Months(){let n=b.value.year===y.value.year,r=e=>W.value!==null&&b.value.year===W.value.year&&W.value.month>e||G.value!==null&&b.value.year===G.value.year&&G.value.month{let a=b.value.month===i+1;return(0,e.h)(`div`,{class:`q-date__months-item flex flex-center`},[(0,e.h)($,{class:n===!0&&y.value.month===i+1?`q-date__today`:null,flat:a!==!0,label:t,unelevated:a,color:a===!0?k.value:null,textColor:a===!0?A.value:null,tabindex:c.value,disable:r(i+1),...s(`month#`+i,{onClick:()=>{Te(i+1)}})})])});return t.yearsInMonthView===!0&&i.unshift((0,e.h)(`div`,{class:`row no-wrap full-width`},[Le({label:b.value.year,type:`Years`,key:b.value.year,dir:w.value,goTo:Ce,boundaries:re.value.year,cls:` col`})])),(0,e.h)(`div`,{key:`months-view`,class:`q-date__view q-date__months flex flex-center`},i)},Years(){let t=E.value,n=t+20,r=[],i=e=>W.value!==null&&W.value.year>e||G.value!==null&&G.value.year{we(a)}})})]))}return(0,e.h)(`div`,{class:`q-date__view q-date__years flex flex-center`},[(0,e.h)(`div`,{class:`col-auto`},[(0,e.h)($,{round:!0,dense:!0,flat:!0,icon:V.value[0],"aria-label":a.lang.date.prevRangeYears(20),tabindex:c.value,disable:i(t),...s(`y-`,{onClick:()=>{E.value-=20}})})]),(0,e.h)(`div`,{class:`q-date__years-content col self-stretch row items-center`},r),(0,e.h)(`div`,{class:`col-auto`},[(0,e.h)($,{round:!0,dense:!0,flat:!0,icon:V.value[1],"aria-label":a.lang.date.nextRangeYears(20),tabindex:c.value,disable:i(n),...s(`y+`,{onClick:()=>{E.value+=20}})})])])}};function ze(e){let n={...b.value,day:e};if(t.range===!1){Ee(n,oe.value);return}if(D.value===null){let i=ue.value.find(t=>t.fill!==!0&&t.i===e);if(t.noUnset!==!0&&i.range!==void 0){Pe({target:n,from:i.range.from,to:i.range.to});return}if(i.selected===!0){Pe(n);return}let a=so(n);D.value={init:n,initHash:a,final:n,finalHash:a},r(`rangeStart`,De(n))}else{let e=D.value.initHash,t=so(n),i=e<=t?{from:D.value.init,to:n}:{from:n,to:D.value.init};D.value=null,Ne(e===t?n:{target:n,...i}),r(`rangeEnd`,{from:De(i.from),to:De(i.to)})}}function Be(e){if(D.value!==null){let t={...b.value,day:e};Object.assign(D.value,{final:t,finalHash:so(t)})}}return Object.assign(i,{setToday:pe,setView:me,offsetCalendar:he,setCalendarTo:ge,setEditingRange:_e}),()=>{let r=[(0,e.h)(`div`,{class:`q-date__content col relative-position`},[(0,e.h)(e.Transition,{name:`q-transition--fade`},Re[x.value])])],i=Y(n.default);return i!==void 0&&r.push((0,e.h)(`div`,{class:`q-date__actions`},i)),t.name!==void 0&&t.disable!==!0&&p(r,`push`),(0,e.h)(`div`,{class:O.value,...de.value},[Ie(),(0,e.h)(`div`,{ref:m,class:`q-date__main col column`,tabindex:-1},r)])}}});function rs(t,n,r){let i;function a(){i!==void 0&&(ae.remove(i),i=void 0)}return(0,e.onBeforeUnmount)(()=>{t.value===!0&&a()}),{removeFromHistory:a,addToHistory(){i={condition:()=>r.value===!0,handler:n},ae.add(i)}}}let is=0,as,os,ss,cs=!1,ls,us,ds,fs=null;function ps(e){ms(e)&&O(e)}function ms(e){if(e.target===document.body||e.target.classList.contains(`q-layout__backdrop`))return!0;let t=w(e),n=e.shiftKey&&!e.deltaX,r=!n&&Math.abs(e.deltaX)<=Math.abs(e.deltaY),i=n||r?e.deltaY:e.deltaX;for(let e=0;e0&&n.scrollTop+n.clientHeight===n.scrollHeight:i<0&&n.scrollLeft===0?!0:i>0&&n.scrollLeft+n.clientWidth===n.scrollWidth}return!0}function hs(e){e.target===document&&(document.scrollingElement.scrollTop=document.scrollingElement.scrollTop)}function gs(e){cs!==!0&&(cs=!0,requestAnimationFrame(()=>{cs=!1;let{height:t}=e.target,{clientHeight:n,scrollTop:r}=document.scrollingElement;(ss===void 0||t!==window.innerHeight)&&(ss=n-t,document.scrollingElement.scrollTop=r),r>ss&&(document.scrollingElement.scrollTop-=Math.ceil((r-ss)/8))}))}function _s(e){let t=document.body,n=window.visualViewport!==void 0;if(e===`add`){let{overflowY:e,overflowX:r}=window.getComputedStyle(t);as=ar(window),os=ir(window),ls=t.style.left,us=t.style.top,ds=window.location.href,t.style.left=`-${as}px`,t.style.top=`-${os}px`,r!==`hidden`&&(r===`scroll`||t.scrollWidth>window.innerWidth)&&t.classList.add(`q-body--force-scrollbar-x`),e!==`hidden`&&(e===`scroll`||t.scrollHeight>window.innerHeight)&&t.classList.add(`q-body--force-scrollbar-y`),t.classList.add(`q-body--prevent-scroll`),document.qScrollPrevented=!0,p.is.ios===!0&&(n===!0?(window.scrollTo(0,0),window.visualViewport.addEventListener(`resize`,gs,v.passiveCapture),window.visualViewport.addEventListener(`scroll`,gs,v.passiveCapture),window.scrollTo(0,0)):window.addEventListener(`scroll`,hs,v.passiveCapture))}p.is.desktop===!0&&p.is.mac===!0&&window[`${e}EventListener`](`wheel`,ps,v.notPassive),e===`remove`&&(p.is.ios===!0&&(n===!0?(window.visualViewport.removeEventListener(`resize`,gs,v.passiveCapture),window.visualViewport.removeEventListener(`scroll`,gs,v.passiveCapture)):window.removeEventListener(`scroll`,hs,v.passiveCapture)),t.classList.remove(`q-body--prevent-scroll`),t.classList.remove(`q-body--force-scrollbar-x`),t.classList.remove(`q-body--force-scrollbar-y`),document.qScrollPrevented=!1,t.style.left=ls,t.style.top=us,window.location.href===ds&&window.scrollTo(as,os),ss=void 0)}function vs(e){let t=`add`;if(e===!0){if(is++,fs!==null){clearTimeout(fs),fs=null;return}if(is>1)return}else{if(is===0||(is--,is>0))return;if(t=`remove`,p.is.ios===!0&&p.is.nativeMobile===!0){fs!==null&&clearTimeout(fs),fs=setTimeout(()=>{_s(t),fs=null},100);return}}_s(t)}function ys(){let e;return{preventBodyScroll(t){t!==e&&(e!==void 0||t===!0)&&(e=t,vs(t))}}}let bs=0,xs={standard:`fixed-full flex-center`,top:`fixed-top justify-center`,bottom:`fixed-bottom justify-center`,right:`fixed-right items-center`,left:`fixed-left items-center`},Ss={standard:[`scale`,`scale`],top:[`slide-down`,`slide-up`],bottom:[`slide-up`,`slide-down`],right:[`slide-left`,`slide-right`],left:[`slide-right`,`slide-left`]};var Cs=h({name:`QDialog`,inheritAttrs:!1,props:{...Tn,...Yn,transitionShow:String,transitionHide:String,persistent:Boolean,autoClose:Boolean,allowFocusOutside:Boolean,noEscDismiss:Boolean,noBackdropDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,noShake:Boolean,seamless:Boolean,maximized:Boolean,fullWidth:Boolean,fullHeight:Boolean,square:Boolean,backdropFilter:String,position:{type:String,default:`standard`,validator:e=>[`standard`,`top`,`bottom`,`left`,`right`].includes(e)}},emits:[...En,`shake`,`click`,`escapeKey`],setup(t,{slots:n,emit:r,attrs:i}){let a=(0,e.getCurrentInstance)(),o=(0,e.ref)(null),s=(0,e.ref)(!1),c=(0,e.ref)(!1),l=null,u=null,d,f,p=(0,e.computed)(()=>t.persistent!==!0&&t.noRouteDismiss!==!0&&t.seamless!==!0),{preventBodyScroll:m}=ys(),{registerTimeout:h}=Qn(),{registerTick:g,removeTick:_}=Zn(),{transitionProps:v,transitionStyle:y}=Xn(t,()=>Ss[t.position][0],()=>Ss[t.position][1]),b=(0,e.computed)(()=>y.value+(t.backdropFilter===void 0?``:`;backdrop-filter:${t.backdropFilter};-webkit-backdrop-filter:${t.backdropFilter}`)),{showPortal:x,hidePortal:S,portalIsAccessible:C,renderPortal:w}=Jn(a,o,V,`dialog`),{hide:T}=Dn({showing:s,hideOnRouteChange:p,handleShow:M,handleHide:N,processOnMount:!0}),{addToHistory:E,removeFromHistory:D}=rs(s,T,p),O=(0,e.computed)(()=>`q-dialog__inner flex no-pointer-events q-dialog__inner--${t.maximized===!0?`maximized`:`minimized`} q-dialog__inner--${t.position} ${xs[t.position]}`+(c.value===!0?` q-dialog__inner--animating`:``)+(t.fullWidth===!0?` q-dialog__inner--fullwidth`:``)+(t.fullHeight===!0?` q-dialog__inner--fullheight`:``)+(t.square===!0?` q-dialog__inner--square`:``)),k=(0,e.computed)(()=>s.value===!0&&t.seamless!==!0),A=(0,e.computed)(()=>t.autoClose===!0?{onClick:z}:{}),j=(0,e.computed)(()=>[`q-dialog fullscreen no-pointer-events q-dialog--${k.value===!0?`modal`:`seamless`}`,i.class]);(0,e.watch)(()=>t.maximized,e=>{s.value===!0&&R(e)}),(0,e.watch)(k,e=>{m(e),e===!0?(Er(ee),Sr(I)):(Dr(ee),Cr(I))});function M(e){E(),u=t.noRefocus===!1&&document.activeElement!==null?document.activeElement:null,R(t.maximized),x(),c.value=!0,t.noFocus===!0?_():(document.activeElement?.blur(),g(P)),h(()=>{if(a.proxy.$q.platform.is.ios===!0){if(t.seamless!==!0&&document.activeElement){let{top:e,bottom:t}=document.activeElement.getBoundingClientRect(),{innerHeight:n}=window,r=window.visualViewport===void 0?n:window.visualViewport.height;e>0&&t>r/2&&(document.scrollingElement.scrollTop=Math.min(document.scrollingElement.scrollHeight-r,t>=n?1/0:Math.ceil(document.scrollingElement.scrollTop+t-r/2))),document.activeElement.scrollIntoView()}f=!0,o.value.click(),f=!1}x(!0),c.value=!1,r(`show`,e)},t.transitionDuration)}function N(e){_(),D(),L(!0),c.value=!0,S(),u!==null&&(((e?.type.indexOf(`key`)===0?u.closest(`[tabindex]:not([tabindex^="-"])`):void 0)||u).focus(),u=null),h(()=>{S(!0),c.value=!1,r(`hide`,e)},t.transitionDuration)}function P(e){Nn(()=>{let t=o.value;if(t!==null){if(e!==void 0){let n=t.querySelector(e);if(n!==null){n.focus({preventScroll:!0});return}}t.contains(document.activeElement)!==!0&&(t=t.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||t.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||t.querySelector(`[autofocus], [data-autofocus]`)||t,t.focus({preventScroll:!0}))}})}function F(e){e&&typeof e.focus==`function`?e.focus({preventScroll:!0}):P(),r(`shake`);let t=o.value;t!==null&&(t.classList.remove(`q-animate--scale`),t.classList.add(`q-animate--scale`),l!==null&&clearTimeout(l),l=setTimeout(()=>{l=null,o.value!==null&&(t.classList.remove(`q-animate--scale`),P())},170))}function I(){t.seamless!==!0&&(t.persistent===!0||t.noEscDismiss===!0?t.maximized!==!0&&t.noShake!==!0&&F():(r(`escapeKey`),T()))}function L(e){l!==null&&(clearTimeout(l),l=null),(e===!0||s.value===!0)&&(R(!1),t.seamless!==!0&&(m(!1),Dr(ee),Cr(I))),e!==!0&&(u=null)}function R(e){e===!0?d!==!0&&(bs<1&&document.body.classList.add(`q-body--dialog`),bs++,d=!0):d===!0&&(bs<2&&document.body.classList.remove(`q-body--dialog`),bs--,d=!1)}function z(e){f!==!0&&(T(e),r(`click`,e))}function B(e){t.persistent!==!0&&t.noBackdropDismiss!==!0?T(e):t.noShake!==!0&&F()}function ee(e){t.allowFocusOutside!==!0&&C.value===!0&&Qt(o.value,e.target)!==!0&&P(`[tabindex]:not([tabindex="-1"])`)}Object.assign(a.proxy,{focus:P,shake:F,__updateRefocusTarget(e){u=e||null}}),(0,e.onBeforeUnmount)(L);function V(){return(0,e.h)(`div`,{role:`dialog`,"aria-modal":k.value===!0?`true`:`false`,...i,class:j.value},[(0,e.h)(e.Transition,{name:`q-transition--fade`,appear:!0},()=>k.value===!0?(0,e.h)(`div`,{class:`q-dialog__backdrop fixed-full`,style:b.value,"aria-hidden":`true`,tabindex:-1,onClick:B}):null),(0,e.h)(e.Transition,v.value,()=>s.value===!0?(0,e.h)(`div`,{ref:o,class:O.value,style:y.value,tabindex:-1,...A.value},Y(n.default)):null)])}return w}}),ws=h({name:`QDrawer`,inheritAttrs:!1,props:{...Tn,...Z,side:{type:String,default:`left`,validator:e=>[`left`,`right`].includes(e)},width:{type:Number,default:300},mini:Boolean,miniToOverlay:Boolean,miniWidth:{type:Number,default:57},noMiniAnimation:Boolean,breakpoint:{type:Number,default:1023},showIfAbove:Boolean,behavior:{type:String,validator:e=>[`default`,`desktop`,`mobile`].includes(e),default:`default`},bordered:Boolean,elevated:Boolean,overlay:Boolean,persistent:Boolean,noSwipeOpen:Boolean,noSwipeClose:Boolean,noSwipeBackdrop:Boolean},emits:[...En,`onLayout`,`miniState`],setup(t,{slots:n,emit:r,attrs:i}){let a=(0,e.getCurrentInstance)(),{proxy:{$q:o}}=a,s=Q(t,o),{preventBodyScroll:c}=ys(),{registerTimeout:l,removeTimeout:u}=Qn(),d=(0,e.inject)(pe,q);if(d===q)return console.error(`QDrawer needs to be child of QLayout`),q;let f,p=null,m,h=(0,e.ref)(t.behavior===`mobile`||t.behavior!==`desktop`&&d.totalWidth.value<=t.breakpoint),g=(0,e.computed)(()=>t.mini===!0&&h.value!==!0),_=(0,e.computed)(()=>g.value===!0?t.miniWidth:t.width),v=(0,e.ref)(t.showIfAbove===!0&&h.value===!1?!0:t.modelValue===!0),y=(0,e.computed)(()=>t.persistent!==!0&&(h.value===!0||L.value===!0));function b(e,t){if(w(),e!==!1&&d.animate(),K(0),h.value===!0){let e=d.instances[N.value];e?.belowBreakpoint===!0&&e.hide(!1),ie(1),d.isContainer.value!==!0&&c(!0)}else ie(0),e!==!1&&ae(!1);l(()=>{e!==!1&&ae(!0),t!==!0&&r(`show`,e)},150)}function x(e,t){T(),e!==!1&&d.animate(),ie(0),K(O.value*_.value),le(),t===!0?u():l(()=>{r(`hide`,e)},150)}let{show:S,hide:C}=Dn({showing:v,hideOnRouteChange:y,handleShow:b,handleHide:x}),{addToHistory:w,removeFromHistory:T}=rs(v,C,y),E={belowBreakpoint:h,hide:C},D=(0,e.computed)(()=>t.side===`right`),O=(0,e.computed)(()=>(o.lang.rtl===!0?-1:1)*(D.value===!0?1:-1)),k=(0,e.ref)(0),A=(0,e.ref)(!1),j=(0,e.ref)(!1),M=(0,e.ref)(_.value*O.value),N=(0,e.computed)(()=>D.value===!0?`left`:`right`),P=(0,e.computed)(()=>v.value===!0&&h.value===!1&&t.overlay===!1?t.miniToOverlay===!0?t.miniWidth:_.value:0),F=(0,e.computed)(()=>t.overlay===!0||t.miniToOverlay===!0||d.view.value.indexOf(D.value?`R`:`L`)!==-1||o.platform.is.ios===!0&&d.isContainer.value===!0),I=(0,e.computed)(()=>t.overlay===!1&&v.value===!0&&h.value===!1),L=(0,e.computed)(()=>t.overlay===!0&&v.value===!0&&h.value===!1),R=(0,e.computed)(()=>`fullscreen q-drawer__backdrop`+(v.value===!1&&A.value===!1?` hidden`:``)),z=(0,e.computed)(()=>({backgroundColor:`rgba(0,0,0,${k.value*.4})`})),B=(0,e.computed)(()=>D.value===!0?d.rows.value.top[2]===`r`:d.rows.value.top[0]===`l`),ee=(0,e.computed)(()=>D.value===!0?d.rows.value.bottom[2]===`r`:d.rows.value.bottom[0]===`l`),V=(0,e.computed)(()=>{let e={};return d.header.space===!0&&B.value===!1&&(F.value===!0?e.top=`${d.header.offset}px`:d.header.space===!0&&(e.top=`${d.header.size}px`)),d.footer.space===!0&&ee.value===!1&&(F.value===!0?e.bottom=`${d.footer.offset}px`:d.footer.space===!0&&(e.bottom=`${d.footer.size}px`)),e}),H=(0,e.computed)(()=>{let e={width:`${_.value}px`,transform:`translateX(${M.value}px)`};return h.value===!0?e:Object.assign(e,V.value)}),te=(0,e.computed)(()=>`q-drawer__content fit `+(d.isContainer.value===!0?`overflow-auto`:`scroll`)),U=(0,e.computed)(()=>`q-drawer q-drawer--${t.side}`+(j.value===!0?` q-drawer--mini-animate`:``)+(t.bordered===!0?` q-drawer--bordered`:``)+(s.value===!0?` q-drawer--dark q-dark`:``)+(A.value===!0?` no-transition`:v.value===!0?``:` q-layout--prevent-focus`)+(h.value===!0?` fixed q-drawer--on-top q-drawer--mobile q-drawer--top-padding`:` q-drawer--${g.value===!0?`mini`:`standard`}`+(F.value===!0||I.value!==!0?` fixed`:``)+(t.overlay===!0||t.miniToOverlay===!0?` q-drawer--on-top`:``)+(B.value===!0?` q-drawer--top-padding`:``))),ne=(0,e.computed)(()=>[[Zi,se,void 0,{[o.lang.rtl===!0?t.side:N.value]:!0,mouse:!0}]]),W=(0,e.computed)(()=>[[Zi,ce,void 0,{[o.lang.rtl===!0?N.value:t.side]:!0,mouse:!0}]]),G=(0,e.computed)(()=>[[Zi,ce,void 0,{[o.lang.rtl===!0?N.value:t.side]:!0,mouse:!0,mouseAllDir:!0}]]);function re(){de(h,t.behavior===`mobile`||t.behavior!==`desktop`&&d.totalWidth.value<=t.breakpoint)}(0,e.watch)(h,e=>{e===!0?(f=v.value,v.value===!0&&C(!1)):t.overlay===!1&&t.behavior!==`mobile`&&f!==!1&&(v.value===!0?(K(0),ie(0),le()):S(!1))}),(0,e.watch)(()=>t.side,(e,t)=>{d.instances[t]===E&&(d.instances[t]=void 0,d[t].space=!1,d[t].offset=0),d.instances[e]=E,d[e].size=_.value,d[e].space=I.value,d[e].offset=P.value}),(0,e.watch)(d.totalWidth,()=>{(d.isContainer.value===!0||document.qScrollPrevented!==!0)&&re()}),(0,e.watch)(()=>t.behavior+t.breakpoint,re),(0,e.watch)(d.isContainer,e=>{v.value===!0&&c(e!==!0),e===!0&&re()}),(0,e.watch)(d.scrollbarWidth,()=>{K(v.value===!0?0:void 0)}),(0,e.watch)(P,e=>{ue(`offset`,e)}),(0,e.watch)(I,e=>{r(`onLayout`,e),ue(`space`,e)}),(0,e.watch)(D,()=>{K()}),(0,e.watch)(_,e=>{K(),fe(t.miniToOverlay,e)}),(0,e.watch)(()=>t.miniToOverlay,e=>{fe(e,_.value)}),(0,e.watch)(()=>o.lang.rtl,()=>{K()}),(0,e.watch)(()=>t.mini,()=>{t.noMiniAnimation||t.modelValue===!0&&(oe(),d.animate())}),(0,e.watch)(g,e=>{r(`miniState`,e)});function K(t){t===void 0?(0,e.nextTick)(()=>{t=v.value===!0?0:_.value,K(O.value*t)}):(d.isContainer.value===!0&&D.value===!0&&(h.value===!0||Math.abs(t)===_.value)&&(t+=O.value*d.scrollbarWidth.value),M.value=t)}function ie(e){k.value=e}function ae(e){let t=e===!0?`remove`:d.isContainer.value===!0?``:`add`;t!==``&&document.body.classList[t](`q-body--drawer-toggle`)}function oe(){p!==null&&clearTimeout(p),a.proxy&&a.proxy.$el&&a.proxy.$el.classList.add(`q-drawer--mini-animate`),j.value=!0,p=setTimeout(()=>{p=null,j.value=!1,a?.proxy?.$el?.classList.remove(`q-drawer--mini-animate`)},150)}function se(e){if(v.value!==!1)return;let t=_.value,n=Fe(e.distance.x,0,t);if(e.isFinal===!0){n>=Math.min(75,t)?S():(d.animate(),ie(0),K(O.value*t)),A.value=!1;return}K((o.lang.rtl===!0?D.value!==!0:D.value)?Math.max(t-n,0):Math.min(0,n-t)),ie(Fe(n/t,0,1)),e.isFirst===!0&&(A.value=!0)}function ce(e){if(v.value!==!0)return;let n=_.value,r=e.direction===t.side,i=(o.lang.rtl===!0?r!==!0:r)?Fe(e.distance.x,0,n):0;if(e.isFinal===!0){Math.abs(i){r(`onLayout`,I.value),r(`miniState`,g.value),f=t.showIfAbove===!0;let n=()=>{(v.value===!0?b:x)(!1,!0)};if(d.totalWidth.value!==0){(0,e.nextTick)(n);return}m=(0,e.watch)(d.totalWidth,()=>{m(),m=void 0,v.value===!1&&t.showIfAbove===!0&&h.value===!1?S(!1):n()})}),(0,e.onBeforeUnmount)(()=>{m?.(),p!==null&&(clearTimeout(p),p=null),v.value===!0&&le(),d.instances[t.side]===E&&(d.instances[t.side]=void 0,ue(`size`,0),ue(`offset`,0),ue(`space`,!1))}),()=>{let r=[];h.value===!0&&(t.noSwipeOpen===!1&&r.push((0,e.withDirectives)((0,e.h)(`div`,{key:`open`,class:`q-drawer__opener fixed-${t.side}`,"aria-hidden":`true`}),ne.value)),r.push(et(`div`,{ref:`backdrop`,class:R.value,style:z.value,"aria-hidden":`true`,onClick:C},void 0,`backdrop`,t.noSwipeBackdrop!==!0&&v.value===!0,()=>G.value)));let a=g.value===!0&&n.mini!==void 0,o=[(0,e.h)(`div`,{...i,key:String(a),class:[te.value,i.class]},a===!0?n.mini():Y(n.default))];return t.elevated===!0&&v.value===!0&&o.push((0,e.h)(`div`,{class:`q-layout__shadow absolute-full overflow-hidden no-pointer-events`})),r.push(et(`aside`,{ref:`content`,class:U.value,style:H.value},o,`contentclose`,t.noSwipeClose!==!0&&h.value===!0,()=>W.value)),(0,e.h)(`div`,{class:`q-drawer-container`},r)}}});function Ts(e,t){if(t&&e===t)return null;let n=e.nodeName.toLowerCase();if([`div`,`li`,`ul`,`ol`,`blockquote`].includes(n)===!0)return e;let r=(window.getComputedStyle?window.getComputedStyle(e):e.currentStyle).display;return r===`block`||r===`table`?e:Ts(e.parentNode)}function Es(e,t,n){return!e||e===document.body?!1:n===!0&&e===t||(t===document?document.body:t).contains(e.parentNode)}function Ds(e,t,n){if(n||(n=document.createRange(),n.selectNode(e),n.setStart(e,0)),t.count===0)n.setEnd(e,t.count);else if(t.count>0)if(e.nodeType===Node.TEXT_NODE)e.textContent.length0&&this.savedPos @@ -13,21 +13,21 @@
${this.el.innerHTML}
- `),e.print(),e.close();return}else if(e===`link`){let e=this.getParentAttribute(`href`);if(e===null){let e=this.selectWord(this.selection),t=e?e.toString():``;if(t.length===0&&(!this.range||!this.range.cloneContents().querySelector(`img`)))return;this.eVm.editLinkUrl.value=Gs.test(t)?t:`https://`,this.save(e.getRangeAt(0)),document.execCommand(`createLink`,!1,this.eVm.editLinkUrl.value)}else this.eVm.editLinkUrl.value=e,this.range.selectNodeContents(this.parent),this.save();return}else if(e===`fullscreen`){this.eVm.toggleFullscreen(),n();return}else if(e===`viewsource`){this.eVm.isViewingSource.value=!this.eVm.isViewingSource.value,this.eVm.setContent(this.eVm.props.modelValue),n();return}document.execCommand(e,!1,t),n()}selectWord(e){if(e===null||!e.isCollapsed)return e;let t=document.createRange();t.setStart(e.anchorNode,e.anchorOffset),t.setEnd(e.focusNode,e.focusOffset);let n=t.collapsed?[`backward`,`forward`]:[`forward`,`backward`];t.detach();let r=e.focusNode,i=e.focusOffset;return e.collapse(e.anchorNode,e.anchorOffset),e.modify(`move`,n[0],`character`),e.modify(`move`,n[1],`word`),e.extend(r,i),e.modify(`extend`,n[1],`character`),e.modify(`extend`,n[0],`word`),e}};let qs=0;var Js=h({name:`QTooltip`,inheritAttrs:!1,props:{...Sn,...En,...Xn,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null},transitionShow:{...Xn.transitionShow,default:`jump-down`},transitionHide:{...Xn.transitionHide,default:`jump-up`},anchor:{type:String,default:`bottom middle`,validator:Br},self:{type:String,default:`top middle`,validator:Br},offset:{type:Array,default:()=>[14,14],validator:Vr},scrollTarget:er,delay:{type:Number,default:0},hideDelay:{type:Number,default:0},persistent:Boolean},emits:[...Dn],setup(t,{slots:n,emit:r,attrs:i}){let a,o,s,c=!1,l,u=(0,e.getCurrentInstance)(),{proxy:{$q:d}}=u,f=(0,e.ref)(null),p=(0,e.ref)(!1),m=ti(),h=(0,e.computed)(()=>i.id||m.value),g=(0,e.computed)(()=>Ur(t.anchor,d.lang.rtl)),_=(0,e.computed)(()=>Ur(t.self,d.lang.rtl)),v=(0,e.computed)(()=>!t.persistent),{registerTick:y,removeTick:b}=Qn(),{registerTimeout:x}=$n(),{transitionProps:S,transitionStyle:C}=Zn(t),{localScrollTarget:w,changeScrollEvent:T,unconfigureScrollTarget:E}=Tn(t,q),{anchorEl:D,canShow:k,anchorEvents:M}=wn({showing:p,configureAnchorEl:U}),{show:N,hide:P}=On({showing:p,canShow:k,handleShow:R,handleHide:ee,hideOnRouteChange:v,processOnMount:!0});Object.assign(M,{delayShow:B,delayHide:V,onFocusin:ne});let{showPortal:F,hidePortal:I,renderPortal:L}=Yn(u,f,ie,`tooltip`);if(d.platform.is.mobile){let n={anchorEl:D,innerRef:f,onClickOutside(e){return P(e),e.target.classList.contains(`q-dialog__backdrop`)&&O(e),!0}};(0,e.watch)((0,e.computed)(()=>t.modelValue===null&&!t.persistent&&p.value),e=>{(e?Pr:Fr)(n)}),(0,e.onBeforeUnmount)(()=>{Fr(n)})}else(0,e.watch)(()=>(t.modelValue===null||t[`onUpdate:modelValue`])&&p.value===!0&&t.persistent!==!0,e=>{(e===!0?wr:Tr)(H)});function R(n){F(),G(),y(()=>{if(o?.disconnect(),f.value===null){o=void 0;return}o=new MutationObserver(()=>te()),o.observe(f.value,{attributes:!1,childList:!0,characterData:!0,subtree:!0}),te(),q()}),a===void 0&&(a=(0,e.watch)(()=>d.screen.width+`|`+d.screen.height+`|`+t.self+`|`+t.anchor+`|`+d.lang.rtl,te)),x(()=>{F(!0),r(`show`,n)},t.transitionDuration)}function ee(e){b(),I(),z(),x(()=>{I(!0),r(`hide`,e)},t.transitionDuration)}function z(){o!==void 0&&(o.disconnect(),o=void 0),a!==void 0&&(a(),a=void 0),E(),Tr(H),j(M,`tooltipTemp`),K(),W(!1)}function te(){Jr({targetEl:f.value,offset:t.offset,anchorEl:D.value,anchorOrigin:g.value,selfOrigin:_.value,maxHeight:t.maxHeight,maxWidth:t.maxWidth})}function B(e){if(d.platform.is.mobile){s!==void 0&&(clearTimeout(s),s=void 0),xn(),W(!0);let e=D.value,t=[`touchmove`,`touchcancel`,`touchend`,`click`].map(t=>[e,t,`delayHide`,`passiveCapture`]);A(M,`tooltipTemp`,t)}x(()=>{N(e)},t.delay)}function V(e){d.platform.is.mobile&&(j(M,`tooltipTemp`),xn(),s=setTimeout(()=>{s=void 0,W(!1)},10)),x(()=>{P(e)},t.hideDelay)}function ne(e){let t=e.target;if(t){try{if(t.matches(`:focus-visible`)===!1)return}catch{}B(e)}}function H(e){P(e)}function U(){if(t.noParentEvent||D.value===null)return;let e=d.platform.is.mobile?[[D.value,`touchstart`,`delayShow`,`passive`]]:[[D.value,`mouseenter`,`delayShow`,`passive`],[D.value,`mouseleave`,`delayHide`,`passive`],[D.value,`focusin`,`onFocusin`,`passive`],[D.value,`focusout`,`delayHide`,`passive`]];A(M,`anchor`,e)}function W(e){c!==e&&(c=e,qs+=e?1:-1,document.body.classList.toggle(`non-selectable`,qs>0),!e&&s!==void 0&&(clearTimeout(s),s=void 0))}function G(){let e=D.value,t=h.value;if(e===null||t===void 0)return;let n=(e.getAttribute(`aria-describedby`)||``).split(/\s+/).filter(Boolean);l={el:e,id:t,added:!n.includes(t)},l.added&&(n.push(t),e.setAttribute(`aria-describedby`,n.join(` `)))}function K(){if(l?.added===!0){let{el:e,id:t}=l,n=(e.getAttribute(`aria-describedby`)||``).split(/\s+/).filter(e=>e!==``&&e!==t);n.length===0?e.removeAttribute(`aria-describedby`):e.setAttribute(`aria-describedby`,n.join(` `))}l=void 0}function q(){if(D.value!==null||t.scrollTarget!==void 0){w.value=nr(D.value,t.scrollTarget);let e=t.noParentEvent?te:P;T(w.value,e)}}function re(){return p.value?(0,e.h)(`div`,{...i,id:h.value,ref:f,class:[`q-tooltip q-tooltip--style q-position-engine no-pointer-events`,i.class],style:[i.style,C.value],role:`tooltip`},X(n.default)):null}function ie(){return(0,e.h)(e.Transition,S.value,re)}return(0,e.onBeforeUnmount)(z),Object.assign(u.proxy,{updatePosition:te}),L}}),Ys=h({name:`QItem`,props:{...Q,...Lt,tag:{type:String,default:`div`},active:{type:Boolean,default:null},clickable:Boolean,dense:Boolean,insetLevel:Number,tabindex:[String,Number],focused:Boolean,manualFocus:Boolean},emits:[`click`,`keyup`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=$(t,i),{hasLink:o,linkAttrs:s,linkClass:c,linkTag:l,navigateOnClick:u}=Rt(),d=(0,e.ref)(null),f=(0,e.ref)(null),p=(0,e.computed)(()=>t.clickable||o.value||t.tag===`label`),m=(0,e.computed)(()=>!t.disable&&p.value),h=(0,e.computed)(()=>`q-item q-item-type row no-wrap`+(t.dense?` q-item--dense`:``)+(a.value?` q-item--dark`:``)+(o.value&&t.active===null?c.value:t.active?` q-item--active${t.activeClass===void 0?``:` ${t.activeClass}`}`:``)+(t.disable?` disabled`:``)+(m.value?` q-item--clickable q-link cursor-pointer `+(t.manualFocus?`q-manual-focusable`:`q-focusable q-hoverable`)+(t.focused?` q-manual-focusable--focused`:``):``)),g=(0,e.computed)(()=>t.insetLevel===void 0?null:{[`padding`+(i.lang.rtl?`Right`:`Left`)]:16+t.insetLevel*56+`px`});function _(e){m.value&&(f.value!==null&&!e.qAvoidFocus&&(!e.qKeyEvent&&document.activeElement===d.value?f.value.focus():document.activeElement===f.value&&d.value.focus()),u(e))}function v(e){if(m.value&&B(e,[13,32])){O(e),e.qKeyEvent=!0;let t=new MouseEvent(`click`,e);t.qKeyEvent=!0,d.value.dispatchEvent(t)}r(`keyup`,e)}function y(e){m.value&&e.keyCode===32&&O(e)}function b(){let t=Xe(n.default,[]);return m.value&&t.unshift((0,e.h)(`div`,{class:`q-focus-helper`,tabindex:-1,ref:f})),t}return()=>{let n={ref:d,class:h.value,style:g.value,role:o.value?void 0:m.value?`button`:`listitem`,onClick:_,onKeydown:y,onKeyup:v};return m.value?(n.tabindex=t.tabindex||`0`,Object.assign(n,s.value)):p.value&&(n[`aria-disabled`]=`true`),(0,e.h)(l.value,n,b())}}}),Xs=h({name:`QItemSection`,props:{avatar:Boolean,thumbnail:Boolean,side:Boolean,top:Boolean,noWrap:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-item__section column q-item__section--${t.avatar||t.side||t.thumbnail?`side`:`main`}`+(t.top?` q-item__section--top justify-start`:` justify-center`)+(t.avatar?` q-item__section--avatar`:``)+(t.thumbnail?` q-item__section--thumbnail`:``)+(t.noWrap?` q-item__section--nowrap`:``));return()=>(0,e.h)(`div`,{class:r.value},X(n.default))}});function Zs(e,t,n){t.handler?t.handler(e,n,n.caret):n.runCmd(t.cmd,t.param)}function Qs(t){return(0,e.h)(`div`,{class:`q-editor__toolbar-group`},t)}function $s(t,n,r,i=!1){let a=i||(n.type===`toggle`?n.toggled?n.toggled(t):n.cmd&&t.caret.is(n.cmd,n.param):!1),o=[];if(t.$q.platform.is.desktop&&(n.tip||n.htmlTip)){let t=n.key?(0,e.h)(`div`,[(0,e.h)(`small`,`(CTRL + ${String.fromCodePoint(n.key)})`)]):null;o.push((0,e.h)(Js,{delay:1e3},()=>[(0,e.h)(`div`,n.htmlTip?{innerHTML:n.htmlTip}:n.tip),t]))}return(0,e.h)(yn,{...t.buttonProps.value,icon:n.icon===null?void 0:n.icon,color:a?n.toggleColor||t.props.toolbarToggleColor:n.color||t.props.toolbarColor,textColor:a&&!t.props.toolbarPush?null:n.textColor||t.props.toolbarTextColor,label:n.label,"aria-label":n.label===null?n.tip:void 0,disable:n.disable?typeof n.disable!=`function`||n.disable(t):!1,size:`sm`,onClick(e){r?.(),Zs(e,n,t)}},()=>o)}function ec(t,n){let r=n.list===`only-icons`,i=n.label,a=n.icon===null?void 0:n.icon,o,s;function c(){u.component.proxy.hide()}if(r)s=n.options.map(e=>{let n=e.type===void 0&&t.caret.is(e.cmd,e.param);return n&&(i=e.tip,a=e.icon===null?void 0:e.icon),$s(t,e,c,n)}),o=t.toolbarBackgroundClass.value,s=[Qs(s)];else{let r=t.props.toolbarToggleColor===void 0?null:`text-${t.props.toolbarToggleColor}`,l=t.props.toolbarTextColor===void 0?null:`text-${t.props.toolbarTextColor}`,u=n.list===`no-icons`;s=n.options.map(n=>{let o=n.disable?n.disable(t):!1,s=n.type===void 0&&t.caret.is(n.cmd,n.param);s&&(i=n.tip,a=n.icon===null?void 0:n.icon);let d=n.htmlTip;return(0,e.h)(Ys,{active:s,activeClass:r,clickable:!0,disable:o,dense:!0,onClick(e){c(),e?.qAvoidFocus!==!0&&t.contentRef.value?.focus(),t.caret.restore(),Zs(e,n,t)}},()=>[u?null:(0,e.h)(Xs,{class:s?r:l,side:!0},()=>(0,e.h)(Z,{name:n.icon===null?void 0:n.icon})),(0,e.h)(Xs,d?()=>(0,e.h)(`div`,{class:`text-no-wrap`,innerHTML:n.htmlTip}):n.tip?()=>(0,e.h)(`div`,{class:`text-no-wrap`},n.tip):void 0)])}),o=[t.toolbarBackgroundClass.value,l]}let l=n.highlight&&i!==n.label,u=(0,e.h)(ii,{...t.buttonProps.value,noCaps:!0,noWrap:!0,color:l?t.props.toolbarToggleColor:t.props.toolbarColor,textColor:l&&!t.props.toolbarPush?null:t.props.toolbarTextColor,label:n.fixedLabel?n.label:i,icon:n.fixedIcon?n.icon===null?void 0:n.icon:a,contentClass:o,onShow:e=>t.emit(`dropdownShow`,e),onHide:e=>t.emit(`dropdownHide`,e),onBeforeShow:e=>t.emit(`dropdownBeforeShow`,e),onBeforeHide:e=>t.emit(`dropdownBeforeHide`,e)},()=>s);return u}function tc(e){if(e.caret)return e.buttons.value.filter(t=>!e.isViewingSource.value||t.find(e=>e.cmd===`viewsource`)).map(t=>Qs(t.map(t=>e.isViewingSource.value&&t.cmd!==`viewsource`?!1:t.type===`slot`?X(e.slots[t.slot]):t.type===`dropdown`?ec(e,t):$s(e,t))))}function nc(e,t,n,r={}){let i=Object.keys(r);if(i.length===0)return{};let a={default_font:{cmd:`fontName`,param:e,icon:n,tip:t}};return i.forEach(e=>{let t=r[e];a[e]={cmd:`fontName`,param:t,icon:n,tip:t,htmlTip:`${t}`}}),a}function rc(t){if(t.caret){let n=t.props.toolbarColor||t.props.toolbarTextColor,r=t.editLinkUrl.value,i=()=>{t.caret.restore(),r!==t.editLinkUrl.value&&document.execCommand(`createLink`,!1,r===``?` `:r),t.editLinkUrl.value=null};return[(0,e.h)(`div`,{class:`q-mx-xs text-${n}`},`${t.$q.lang.editor.url}: `),(0,e.h)(`input`,{key:`qedt_btm_input`,class:`col q-editor__link-input`,value:r,onInput:e=>{E(e),r=e.target.value},onKeydown:e=>{if(!te(e))switch(e.keyCode){case 13:return D(e),i();case 27:D(e),t.caret.restore(),(!t.editLinkUrl.value||t.editLinkUrl.value===`https://`)&&document.execCommand(`unlink`),t.editLinkUrl.value=null;break}}}),Qs([(0,e.h)(yn,{key:`qedt_btm_rem`,...t.buttonProps.value,label:t.$q.lang.label.remove,noCaps:!0,onClick:()=>{t.caret.restore(),document.execCommand(`unlink`),t.editLinkUrl.value=null}}),(0,e.h)(yn,{key:`qedt_btm_upd`,...t.buttonProps.value,label:t.$q.lang.label.update,noCaps:!0,onClick:i})])]}}let ic=/^on[A-Z]/;function ac(){let{attrs:t,vnode:n}=(0,e.getCurrentInstance)(),r={listeners:(0,e.ref)({}),attributes:(0,e.ref)({})};function i(){let e={},i={};for(let n in t)n!==`class`&&n!==`style`&&!ic.test(n)&&(e[n]=t[n]);for(let e in n.props)ic.test(e)&&(i[e]=n.props[e]);r.attributes.value=e,r.listeners.value=i}return(0,e.onBeforeUpdate)(i),i(),r}let oc=Object.prototype.toString,sc=Object.prototype.hasOwnProperty,cc=new Set([`Boolean`,`Number`,`String`,`Function`,`Array`,`Date`,`RegExp`].map(e=>`[object `+e+`]`));function lc(e){if(e!==Object(e)||cc.has(oc.call(e))||e.constructor&&!sc.call(e,`constructor`)&&!sc.call(e.constructor.prototype,`isPrototypeOf`))return!1;let t;for(t in e);return t===void 0||sc.call(e,t)}function uc(...e){let t,n,r,i,a,o,s=e[0]||{},c=1,l=!1,u=e.length;for(typeof s==`boolean`&&(l=s,s=e[1]||{},c=2),Object(s)!==s&&typeof s!=`function`&&(s={}),u===c&&(s=this,c--);ce.every(e=>e.length),default:()=>[[`left`,`center`,`right`,`justify`],[`bold`,`italic`,`underline`,`strike`],[`undo`,`redo`]]},toolbarColor:String,toolbarBg:String,toolbarTextColor:String,toolbarToggleColor:{type:String,default:`primary`},toolbarOutline:Boolean,toolbarPush:Boolean,toolbarRounded:Boolean,paragraphTag:{type:String,validator:e=>[`div`,`p`].includes(e),default:`div`},contentStyle:Object,contentClass:[Object,Array,String],square:Boolean,flat:Boolean,dense:Boolean},emits:[...Ai,`update:modelValue`,`keydown`,`click`,`focus`,`blur`,`dropdownShow`,`dropdownHide`,`dropdownBeforeShow`,`dropdownBeforeHide`,`linkShow`,`linkHide`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:o}=i,s=$(t,o),{inFullscreen:c,toggleFullscreen:l}=ji(),u=ac(),d=(0,e.ref)(null),f=(0,e.ref)(null),p=(0,e.ref)(null),m=(0,e.ref)(!1),h=(0,e.computed)(()=>!t.readonly&&!t.disable),g,_,v=null,y=t.modelValue,b=a.value;document.execCommand(`defaultParagraphSeparator`,!1,t.paragraphTag),g=window.getComputedStyle(document.body).fontFamily;let x=(0,e.computed)(()=>t.toolbarBg?` bg-${t.toolbarBg}`:``),S=(0,e.computed)(()=>({type:`a`,flat:!t.toolbarOutline&&!t.toolbarPush,noWrap:!0,outline:t.toolbarOutline,push:t.toolbarPush,rounded:t.toolbarRounded,dense:!0,color:t.toolbarColor,disable:!h.value,size:`sm`})),C=(0,e.computed)(()=>{let e=o.lang.editor,n=o.iconSet.editor;return{bold:{cmd:`bold`,icon:n.bold,tip:e.bold,key:66},italic:{cmd:`italic`,icon:n.italic,tip:e.italic,key:73},strike:{cmd:`strikeThrough`,icon:n.strikethrough,tip:e.strikethrough,key:83},underline:{cmd:`underline`,icon:n.underline,tip:e.underline,key:85},unordered:{cmd:`insertUnorderedList`,icon:n.unorderedList,tip:e.unorderedList},ordered:{cmd:`insertOrderedList`,icon:n.orderedList,tip:e.orderedList},subscript:{cmd:`subscript`,icon:n.subscript,tip:e.subscript,htmlTip:`x2`},superscript:{cmd:`superscript`,icon:n.superscript,tip:e.superscript,htmlTip:`x2`},link:{cmd:`link`,disable:e=>e.caret&&!e.caret.can(`link`),icon:n.hyperlink,tip:e.hyperlink,key:76},fullscreen:{cmd:`fullscreen`,icon:n.toggleFullscreen,tip:e.toggleFullscreen,key:70},viewsource:{cmd:`viewsource`,icon:n.viewSource,tip:e.viewSource},quote:{cmd:`formatBlock`,param:`BLOCKQUOTE`,icon:n.quote,tip:e.quote,key:81},left:{cmd:`justifyLeft`,icon:n.left,tip:e.left},center:{cmd:`justifyCenter`,icon:n.center,tip:e.center},right:{cmd:`justifyRight`,icon:n.right,tip:e.right},justify:{cmd:`justifyFull`,icon:n.justify,tip:e.justify},print:{type:`no-state`,cmd:`print`,icon:n.print,tip:e.print,key:80},outdent:{type:`no-state`,disable:e=>e.caret&&!e.caret.can(`outdent`),cmd:`outdent`,icon:n.outdent,tip:e.outdent},indent:{type:`no-state`,disable:e=>e.caret&&!e.caret.can(`indent`),cmd:`indent`,icon:n.indent,tip:e.indent},removeFormat:{type:`no-state`,cmd:`removeFormat`,icon:n.removeFormat,tip:e.removeFormat},hr:{type:`no-state`,cmd:`insertHorizontalRule`,icon:n.hr,tip:e.hr},undo:{type:`no-state`,cmd:`undo`,icon:n.undo,tip:e.undo,key:90},redo:{type:`no-state`,cmd:`redo`,icon:n.redo,tip:e.redo,key:89},h1:{cmd:`formatBlock`,param:`H1`,icon:n.heading1||n.heading,tip:e.heading1,htmlTip:`

${e.heading1}

`},h2:{cmd:`formatBlock`,param:`H2`,icon:n.heading2||n.heading,tip:e.heading2,htmlTip:`

${e.heading2}

`},h3:{cmd:`formatBlock`,param:`H3`,icon:n.heading3||n.heading,tip:e.heading3,htmlTip:`

${e.heading3}

`},h4:{cmd:`formatBlock`,param:`H4`,icon:n.heading4||n.heading,tip:e.heading4,htmlTip:`

${e.heading4}

`},h5:{cmd:`formatBlock`,param:`H5`,icon:n.heading5||n.heading,tip:e.heading5,htmlTip:`
${e.heading5}
`},h6:{cmd:`formatBlock`,param:`H6`,icon:n.heading6||n.heading,tip:e.heading6,htmlTip:`
${e.heading6}
`},p:{cmd:`formatBlock`,param:t.paragraphTag,icon:n.heading,tip:e.paragraph},code:{cmd:`formatBlock`,param:`PRE`,icon:n.code,htmlTip:`${e.code}`},"size-1":{cmd:`fontSize`,param:`1`,icon:n.size1||n.size,tip:e.size1,htmlTip:`${e.size1}`},"size-2":{cmd:`fontSize`,param:`2`,icon:n.size2||n.size,tip:e.size2,htmlTip:`${e.size2}`},"size-3":{cmd:`fontSize`,param:`3`,icon:n.size3||n.size,tip:e.size3,htmlTip:`${e.size3}`},"size-4":{cmd:`fontSize`,param:`4`,icon:n.size4||n.size,tip:e.size4,htmlTip:`${e.size4}`},"size-5":{cmd:`fontSize`,param:`5`,icon:n.size5||n.size,tip:e.size5,htmlTip:`${e.size5}`},"size-6":{cmd:`fontSize`,param:`6`,icon:n.size6||n.size,tip:e.size6,htmlTip:`${e.size6}`},"size-7":{cmd:`fontSize`,param:`7`,icon:n.size7||n.size,tip:e.size7,htmlTip:`${e.size7}`}}}),w=(0,e.computed)(()=>{let e=t.definitions||{},n=t.definitions||t.fonts?uc(!0,{},C.value,e,nc(g,o.lang.editor.defaultFont,o.iconSet.editor.font,t.fonts)):C.value;return t.toolbar.map(t=>t.map(t=>{if(t.options)return{type:`dropdown`,icon:t.icon,label:t.label,size:`sm`,dense:!0,fixedLabel:t.fixedLabel,fixedIcon:t.fixedIcon,highlight:t.highlight,list:t.list,options:t.options.map(e=>n[e])};let r=n[t];return r?r.type===`no-state`||e[t]&&(r.cmd===void 0||C.value[r.cmd]&&C.value[r.cmd].type===`no-state`)?r:{type:`toggle`,...r}:{type:`slot`,slot:t}}))}),T={$q:o,props:t,slots:n,emit:r,inFullscreen:c,toggleFullscreen:l,runCmd:ne,isViewingSource:m,editLinkUrl:p,toolbarBackgroundClass:x,buttonProps:S,contentRef:f,buttons:w,setContent:V};(0,e.watch)(()=>t.modelValue,e=>{y!==e&&(y=e,V(e,!0))}),(0,e.watch)(p,e=>{r(`link${e?`Show`:`Hide`}`)});let E=(0,e.computed)(()=>t.toolbar&&t.toolbar.length!==0),D=(0,e.computed)(()=>{let e={},t=t=>{t.key&&(e[t.key]={cmd:t.cmd,param:t.param})};return w.value.forEach(e=>{e.forEach(e=>{e.options?e.options.forEach(t):t(e)})}),e}),k=(0,e.computed)(()=>c.value?t.contentStyle:[{minHeight:t.minHeight,height:t.height,maxHeight:t.maxHeight},t.contentStyle]),A=(0,e.computed)(()=>`q-editor q-editor--${m.value?`source`:`default`}`+(t.disable?` disabled`:``)+(c.value?` fullscreen column`:``)+(t.square?` q-editor--square no-border-radius`:``)+(t.flat?` q-editor--flat`:``)+(t.dense?` q-editor--dense`:``)+(s.value?` q-editor--dark q-dark`:``)),j=(0,e.computed)(()=>[t.contentClass,`q-editor__content`,{col:c.value,"overflow-auto":c.value||t.maxHeight}]),M=(0,e.computed)(()=>t.disable?{"aria-disabled":`true`}:{});function N(){if(f.value!==null){let e=`inner${m.value?`Text`:`HTML`}`,n=f.value[e];n!==t.modelValue&&(y=n,r(`update:modelValue`,n))}}function P(e){if(r(`keydown`,e),!e.ctrlKey||te(e)){H();return}let t=e.keyCode,n=D.value[t];if(n!==void 0){let{cmd:t,param:r}=n;O(e),ne(t,r,!1)}}function F(e){H(),r(`click`,e)}function I(e){if(f.value!==null){let{scrollTop:e,scrollHeight:t}=f.value;_=t-e}T.caret.save(),r(`blur`,e)}function L(t){(0,e.nextTick)(()=>{f.value!==null&&_!==void 0&&(f.value.scrollTop=f.value.scrollHeight-_)}),r(`focus`,t)}function R(e){let t=d.value;if(t!==null&&t.contains(e.target)&&(e.relatedTarget===null||!t.contains(e.relatedTarget))){let e=`inner${m.value?`Text`:`HTML`}`;T.caret.restorePosition(f.value[e].length),H()}}function ee(e){let t=d.value;t!==null&&t.contains(e.target)&&(e.relatedTarget===null||!t.contains(e.relatedTarget))&&(T.caret.savePosition(),H())}function z(){_=void 0}function B(){T.caret.save()}function V(e,t){if(f.value!==null){t&&T.caret.savePosition();let n=`inner${m.value?`Text`:`HTML`}`;f.value[n]=e,t&&(T.caret.restorePosition(f.value[n].length),H())}}function ne(e,t,n=!0){U(),T.caret.restore(),T.caret.apply(e,t,()=>{U(),T.caret.save(),n&&H()})}function H(){v!==null&&clearTimeout(v),v=setTimeout(()=>{v=null,p.value=null,i.$forceUpdate()},1)}function U(){Rn(()=>{f.value?.focus({preventScroll:!0})})}function W(){return f.value}return(0,e.onMounted)(()=>{T.caret=i.caret=new Ks(f.value,T),V(t.modelValue),H(),document.addEventListener(`selectionchange`,B)}),(0,e.onBeforeUnmount)(()=>{v!==null&&clearTimeout(v),document.removeEventListener(`selectionchange`,B)}),Object.assign(i,{runCmd:ne,refreshToolbar:H,focus:U,getContentEl:W}),()=>{let n;if(E.value){let t=[(0,e.h)(`div`,{key:`qedt_top`,class:`q-editor__toolbar row no-wrap scroll-x`+x.value},tc(T))];p.value!==null&&t.push((0,e.h)(`div`,{key:`qedt_btm`,class:`q-editor__toolbar row no-wrap items-center scroll-x`+x.value},rc(T))),n=(0,e.h)(`div`,{key:`toolbar_ctainer`,class:`q-editor__toolbars-container`},t)}return(0,e.h)(`div`,{ref:d,class:A.value,style:{height:c.value?`100%`:null},...M.value,onFocusin:R,onFocusout:ee},[n,(0,e.h)(`div`,{ref:f,style:k.value,class:j.value,contenteditable:h.value,placeholder:t.placeholder,...b?{innerHTML:t.modelValue}:{},...u.listeners.value,onInput:N,onKeydown:P,onClick:F,onBlur:I,onFocus:L,onMousedown:z,onTouchstartPassive:z})])}}}),fc=h({name:`QItemLabel`,props:{overline:Boolean,caption:Boolean,header:Boolean,lines:[Number,String]},setup(t,{slots:n}){let r=(0,e.computed)(()=>Number.parseInt(t.lines,10)),i=(0,e.computed)(()=>`q-item__label`+(t.overline?` q-item__label--overline text-overline`:``)+(t.caption?` q-item__label--caption text-caption`:``)+(t.header?` q-item__label--header`:``)+(r.value===1?` ellipsis`:``)),a=(0,e.computed)(()=>t.lines!==void 0&&r.value>1?{overflow:`hidden`,display:`-webkit-box`,"-webkit-box-orient":`vertical`,"-webkit-line-clamp":r.value}:null);return()=>(0,e.h)(`div`,{style:a.value,class:i.value},X(n.default))}}),pc=h({name:`QSlideTransition`,props:{appear:Boolean,duration:{type:Number,default:300}},emits:[`show`,`hide`],setup(t,{slots:n,emit:r}){let i=!1,a,o,s=null,c=null,l,u;function d(){a?.(),a=null,i=!1,s!==null&&(clearTimeout(s),s=null),c!==null&&(clearTimeout(c),c=null),o?.removeEventListener(`transitionend`,l),l=null}function f(e,n,r){n!==void 0&&(e.style.height=`${n}px`),e.style.transition=`height ${t.duration}ms cubic-bezier(.25, .8, .50, 1)`,i=!0,a=r}function p(e,t){e.style.overflowY=null,e.style.height=null,e.style.transition=null,d(),t!==u&&r(t)}function m(e,n){let r=0;o=e,i?(d(),r=e.offsetHeight===e.scrollHeight?0:void 0):(u=`hide`,e.style.overflowY=`hidden`),f(e,r,n),s=setTimeout(()=>{s=null,e.style.height=`${e.scrollHeight}px`,l=t=>{c=null,(Object(t)!==t||t.target===e)&&p(e,`show`)},e.addEventListener(`transitionend`,l),c=setTimeout(l,t.duration*1.1)},100)}function h(e,n){let r;o=e,i?d():(u=`show`,e.style.overflowY=`hidden`,r=e.scrollHeight),f(e,r,n),s=setTimeout(()=>{s=null,e.style.height=0,l=t=>{c=null,(Object(t)!==t||t.target===e)&&p(e,`hide`)},e.addEventListener(`transitionend`,l),c=setTimeout(l,t.duration*1.1)},100)}return(0,e.onBeforeUnmount)(()=>{i&&d()}),()=>(0,e.h)(e.Transition,{css:!1,appear:t.appear,onEnter:m,onLeave:h},n.default)}});let mc={true:`inset`,item:`item-inset`,"item-thumbnail":`item-thumbnail-inset`},hc={xs:2,sm:4,md:8,lg:16,xl:24};var gc=h({name:`QSeparator`,props:{...Q,spaced:[Boolean,String],inset:[Boolean,String],vertical:Boolean,color:String,size:String},setup(t){let n=$(t,(0,e.getCurrentInstance)().proxy.$q),r=(0,e.computed)(()=>t.vertical?`vertical`:`horizontal`),i=(0,e.computed)(()=>` q-separator--${r.value}`),a=(0,e.computed)(()=>t.inset?`${i.value}-${mc[t.inset]}`:``),o=(0,e.computed)(()=>`q-separator${i.value}${a.value}`+(t.color===void 0?``:` bg-${t.color}`)+(n.value?` q-separator--dark`:``)),s=(0,e.computed)(()=>{let e={};if(t.size!==void 0&&(e[t.vertical?`width`:`height`]=t.size),t.spaced){let n=t.spaced===!0?`${hc.md}px`:t.spaced in hc?`${hc[t.spaced]}px`:t.spaced,r=t.vertical?[`Left`,`Right`]:[`Top`,`Bottom`];e[`margin${r[0]}`]=e[`margin${r[1]}`]=n}return e});return()=>(0,e.h)(`hr`,{class:o.value,style:s.value,"aria-orientation":r.value})}});let _c=(0,e.shallowReactive)({});function vc(e){e.keyCode===32&&O(e)}let yc=Object.keys(Lt);var bc=h({name:`QExpansionItem`,props:{...Lt,...En,...Q,icon:String,label:String,labelLines:[Number,String],caption:String,captionLines:[Number,String],dense:Boolean,toggleAriaLabel:String,expandIcon:String,expandedIcon:String,expandIconClass:[Array,String,Object],duration:{},headerInsetLevel:Number,contentInsetLevel:Number,expandSeparator:Boolean,defaultOpened:Boolean,hideExpandIcon:Boolean,expandIconToggle:Boolean,switchToggleSide:Boolean,denseToggle:Boolean,group:String,popup:Boolean,headerStyle:[Array,String,Object],headerClass:[Array,String,Object]},emits:[...Dn,`click`,`afterShow`,`afterHide`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=$(t,i),o=(0,e.ref)(t.modelValue===null?t.defaultOpened:t.modelValue),s=(0,e.ref)(null),c=ti(),{show:l,hide:u,toggle:d}=On({showing:o}),f,p,m=(0,e.computed)(()=>`q-expansion-item q-item-type q-expansion-item--${o.value?`expanded`:`collapsed`} q-expansion-item--${t.popup?`popup`:`standard`}`),h=(0,e.computed)(()=>t.contentInsetLevel===void 0?null:{[`padding`+(i.lang.rtl?`Right`:`Left`)]:t.contentInsetLevel*56+`px`}),g=(0,e.computed)(()=>!t.disable&&(t.href!==void 0||t.to!==void 0&&t.to!==null&&t.to!==``)),_=(0,e.computed)(()=>{let e={};return yc.forEach(n=>{e[n]=t[n]}),e}),v=(0,e.computed)(()=>g.value||!t.expandIconToggle),y=(0,e.computed)(()=>t.expandedIcon!==void 0&&o.value?t.expandedIcon:t.expandIcon||i.iconSet.expansionItem[t.denseToggle?`denseIcon`:`icon`]),b=(0,e.computed)(()=>!t.disable&&(g.value||t.expandIconToggle)),x=(0,e.computed)(()=>({expanded:o.value,detailsId:c.value,toggle:d,show:l,hide:u})),S=(0,e.computed)(()=>{let e=t.toggleAriaLabel===void 0?i.lang.label[o.value?`collapse`:`expand`](t.label):t.toggleAriaLabel;return{role:`button`,"aria-expanded":o.value?`true`:`false`,"aria-controls":c.value,"aria-label":e}});(0,e.watch)(()=>t.group,e=>{p?.(),e!==void 0&&k()});function C(e){g.value||d(e),r(`click`,e)}function w(e){[13,32].includes(e.keyCode)&&T(e,!0)}function T(e,t){!t&&!e.qAvoidFocus&&s.value?.focus(),d(e),O(e)}function E(){r(`afterShow`)}function D(){r(`afterHide`)}function k(){f===void 0&&(f=Qr()),o.value&&(_c[t.group]=f);let n=(0,e.watch)(o,e=>{e?_c[t.group]=f:_c[t.group]===f&&delete _c[t.group]}),r=(0,e.watch)(()=>_c[t.group],(e,t)=>{t===f&&e!==void 0&&e!==f&&u()});p=()=>{n(),r(),_c[t.group]===f&&delete _c[t.group],p=void 0}}function A(){let n={class:[`q-focusable relative-position cursor-pointer${t.denseToggle&&t.switchToggleSide?` items-end`:``}`,t.expandIconClass],side:!t.switchToggleSide,avatar:t.switchToggleSide},r=[(0,e.h)(Z,{class:`q-expansion-item__toggle-icon`+(t.expandedIcon===void 0&&o.value?` q-expansion-item__toggle-icon--rotated`:``),name:y.value})];return b.value&&(Object.assign(n,{tabindex:0,...S.value,onClick:T,onKeydown:vc,onKeyup:w}),r.unshift((0,e.h)(`div`,{ref:s,class:`q-expansion-item__toggle-focus q-icon q-focus-helper q-focus-helper--rounded`,tabindex:-1}))),(0,e.h)(Xs,n,()=>r)}function j(){let r;return n.header===void 0?(r=[(0,e.h)(Xs,()=>[(0,e.h)(fc,{lines:t.labelLines},()=>t.label||``),t.caption?(0,e.h)(fc,{lines:t.captionLines,caption:!0},()=>t.caption):null])],t.icon&&r[t.switchToggleSide?`push`:`unshift`]((0,e.h)(Xs,{side:t.switchToggleSide,avatar:!t.switchToggleSide},()=>(0,e.h)(Z,{name:t.icon})))):r=[n.header(x.value)].flat(),!t.disable&&!t.hideExpandIcon&&r[t.switchToggleSide?`unshift`:`push`](A()),r}function M(){let n={ref:`item`,style:t.headerStyle,class:t.headerClass,dark:a.value,disable:t.disable,dense:t.dense,insetLevel:t.headerInsetLevel};return v.value&&(n.clickable=!0,n.onClick=C,Object.assign(n,g.value?_.value:S.value)),(0,e.h)(Ys,n,j)}function N(){return(0,e.withDirectives)((0,e.h)(`div`,{key:`e-content`,class:`q-expansion-item__content relative-position`,style:h.value,id:c.value},X(n.default)),[[e.vShow,o.value]])}function P(){let n=[M(),(0,e.h)(pc,{duration:t.duration,onShow:E,onHide:D},N)];return t.expandSeparator&&n.push((0,e.h)(gc,{class:`q-expansion-item__border q-expansion-item__border--top absolute-top`,dark:a.value}),(0,e.h)(gc,{class:`q-expansion-item__border q-expansion-item__border--bottom absolute-bottom`,dark:a.value})),n}return t.group!==void 0&&k(),(0,e.onBeforeUnmount)(()=>{p?.()}),()=>(0,e.h)(`div`,{class:m.value},[(0,e.h)(`div`,{class:`q-expansion-item__container relative-position`},P())])}});let xc=[`top`,`right`,`bottom`,`left`],Sc={type:{type:String,default:`a`},outline:Boolean,push:Boolean,flat:Boolean,unelevated:Boolean,color:String,textColor:String,glossy:Boolean,square:Boolean,padding:String,label:{type:[String,Number],default:``},labelPosition:{type:String,default:`right`,validator:e=>xc.includes(e)},externalLabel:Boolean,hideLabel:{type:Boolean},labelClass:[Array,String,Object],labelStyle:[Array,String,Object],disable:Boolean,tabindex:[Number,String]};function Cc(t,n){return{formClass:(0,e.computed)(()=>`q-fab--form-${t.square?`square`:`rounded`}`),stacked:(0,e.computed)(()=>!t.externalLabel&&[`top`,`bottom`].includes(t.labelPosition)),labelProps:(0,e.computed)(()=>{if(t.externalLabel){let e=t.hideLabel===null?!n.value:t.hideLabel;return{action:`push`,data:{class:[t.labelClass,`q-fab__label q-tooltip--style q-fab__label--external q-fab__label--external-${t.labelPosition}`+(e?` q-fab__label--external-hidden`:``)],style:t.labelStyle}}}return{action:[`left`,`top`].includes(t.labelPosition)?`unshift`:`push`,data:{class:[t.labelClass,`q-fab__label q-fab__label--internal q-fab__label--internal-${t.labelPosition}`+(t.hideLabel?` q-fab__label--internal-hidden`:``)],style:t.labelStyle}}})}}let wc=[`up`,`right`,`down`,`left`],Tc=[`left`,`center`,`right`];var Ec=h({name:`QFab`,props:{...Sc,...En,icon:String,activeIcon:String,hideIcon:Boolean,hideLabel:{...Sc.hideLabel,default:null},direction:{type:String,default:`right`,validator:e=>wc.includes(e)},persistent:Boolean,verticalActionsAlign:{type:String,default:`center`,validator:e=>Tc.includes(e)}},emits:Dn,setup(t,{slots:n}){let r=(0,e.ref)(null),i=(0,e.ref)(t.modelValue===!0),a=ti(),{proxy:{$q:o}}=(0,e.getCurrentInstance)(),{formClass:s,labelProps:c}=Cc(t,i),{hide:l,toggle:u}=On({showing:i,hideOnRouteChange:(0,e.computed)(()=>!t.persistent)}),d=(0,e.computed)(()=>({opened:i.value})),f=(0,e.computed)(()=>`q-fab z-fab row inline justify-center q-fab--align-${t.verticalActionsAlign} ${s.value}`+(i.value?` q-fab--opened`:` q-fab--closed`)),p=(0,e.computed)(()=>`q-fab__actions flex no-wrap inline q-fab__actions--${t.direction} q-fab__actions--${i.value?`opened`:`closed`}`),m=(0,e.computed)(()=>{let e={id:a.value,role:`menu`};return i.value||(e[`aria-hidden`]=`true`),e}),h=(0,e.computed)(()=>`q-fab__icon-holder q-fab__icon-holder--${i.value?`opened`:`closed`}`);function g(r,i){let a=n[r],s=`q-fab__${r} absolute-full`;return a===void 0?(0,e.h)(Z,{class:s,name:t[i]||o.iconSet.fab[i]}):(0,e.h)(`div`,{class:s},a(d.value))}function _(){let r=[];return t.hideIcon||r.push((0,e.h)(`div`,{class:h.value},[g(`icon`,`icon`),g(`active-icon`,`activeIcon`)])),(t.label!==``||n.label!==void 0)&&r[c.value.action]((0,e.h)(`div`,c.value.data,n.label===void 0?[t.label]:n.label(d.value))),Ze(n.tooltip,r)}return(0,e.provide)(pe,{showing:i,onChildClick(e){l(e),e?.qAvoidFocus!==!0&&r.value?.$el.focus()}}),()=>(0,e.h)(`div`,{class:f.value},[(0,e.h)(yn,{ref:r,class:s.value,...t,noWrap:!0,stack:t.stacked,align:void 0,icon:void 0,label:void 0,noCaps:!0,fab:!0,"aria-expanded":i.value?`true`:`false`,"aria-haspopup":`true`,"aria-controls":a.value,onClick:u},_),(0,e.h)(`div`,{class:p.value,...m.value},X(n.default))])}});let Dc={start:`self-end`,center:`self-center`,end:`self-start`},Oc=Object.keys(Dc);var kc=h({name:`QFabAction`,props:{...Sc,icon:{type:String,default:``},anchor:{type:String,validator:e=>Oc.includes(e)},to:[String,Object],replace:Boolean},emits:[`click`],setup(t,{slots:n,emit:r}){let i=(0,e.inject)(pe,()=>({showing:{value:!0},onChildClick:y})),{formClass:a,labelProps:o}=Cc(t,i.showing),s=(0,e.computed)(()=>{let e=Dc[t.anchor];return a.value+(e===void 0?``:` ${e}`)}),c=(0,e.computed)(()=>t.disable||!i.showing.value);function l(e){i.onChildClick(e),r(`click`,e)}function u(){let r=[];return n.icon===void 0?t.icon!==``&&r.push((0,e.h)(Z,{name:t.icon})):r.push(n.icon()),(t.label!==``||n.label!==void 0)&&r[o.value.action]((0,e.h)(`div`,o.value.data,n.label===void 0?[t.label]:n.label())),Ze(n.default,r)}let d=(0,e.getCurrentInstance)();return Object.assign(d.proxy,{click:l}),()=>(0,e.h)(yn,{class:s.value,...t,noWrap:!0,stack:t.stacked,icon:void 0,label:void 0,noCaps:!0,fabMini:!0,disable:c.value,onClick:l},u)}});function Ac({validate:t,resetValidation:n,requiresQForm:r}){let i=(0,e.inject)(me,!1);if(i!==!1){let{props:r,proxy:a}=(0,e.getCurrentInstance)();Object.assign(a,{validate:t,resetValidation:n}),(0,e.watch)(()=>r.disable,e=>{e?(typeof n==`function`&&n(),i.unbindComponent(a)):i.bindComponent(a)}),(0,e.onMounted)(()=>{r.disable||i.bindComponent(a)}),(0,e.onBeforeUnmount)(()=>{r.disable||i.unbindComponent(a)})}else r&&console.error(`Parent QForm not found on useFormChild()!`)}let jc=[!0,!1,`ondemand`],Mc={modelValue:{},error:{type:Boolean,default:null},errorMessage:String,noErrorIcon:Boolean,rules:Array,reactiveRules:Boolean,lazyRules:{type:[Boolean,String],default:!1,validator:e=>jc.includes(e)}};function Nc(t,n){let{props:i,proxy:a}=(0,e.getCurrentInstance)(),o=(0,e.ref)(!1),s=(0,e.ref)(null),c=(0,e.ref)(!1);Ac({validate:_,resetValidation:g});let l=0,u,d=(0,e.computed)(()=>i.rules!==void 0&&i.rules!==null&&i.rules.length!==0),f=(0,e.computed)(()=>!i.disable&&d.value&&!n.value),p=(0,e.computed)(()=>i.error===!0||o.value),m=(0,e.computed)(()=>typeof i.errorMessage==`string`&&i.errorMessage.length!==0?i.errorMessage:s.value);(0,e.watch)(()=>i.modelValue,()=>{c.value=!0,f.value&&i.lazyRules===!1&&v()});function h(){i.lazyRules!==`ondemand`&&f.value&&c.value&&v()}(0,e.watch)(()=>i.reactiveRules,t=>{t?u===void 0&&(u=(0,e.watch)(()=>i.rules,h,{immediate:!0,deep:!0})):u!==void 0&&(u(),u=void 0)},{immediate:!0}),(0,e.watch)(()=>i.lazyRules,h),(0,e.watch)(t,e=>{e?c.value=!0:f.value&&i.lazyRules!==`ondemand`&&v()});function g(){l++,n.value=!1,c.value=!1,o.value=!1,s.value=null,v.cancel()}function _(e=i.modelValue){if(i.disable||!d.value)return!0;let t=++l,r=n.value?()=>{}:()=>{c.value=!0},a=(e,t)=>{e&&r(),o.value=e,s.value=t||null,n.value=!1},u=[];for(let t=0;t{if(e===void 0||!Array.isArray(e)||e.length===0)return t===l&&a(!1),!0;let n=e.find(e=>e===!1||typeof e==`string`);return t===l&&a(n!==void 0,n),n===void 0},e=>(t===l&&(console.error(e),a(!0)),!1)))}let v=N(_,0);return(0,e.onBeforeUnmount)(()=>{u?.(),v.cancel()}),Object.assign(a,{resetValidation:g,validate:_}),r(a,`hasError`,()=>p.value),{isDirtyModel:c,hasRules:d,hasError:p,errorMessage:m,validate:_,resetValidation:g}}function Pc(e){return e!=null&&String(e).length!==0}let Fc={...Q,...Mc,label:String,stackLabel:Boolean,hint:String,hideHint:Boolean,prefix:String,suffix:String,labelColor:String,color:String,bgColor:String,filled:Boolean,outlined:Boolean,borderless:Boolean,standout:[Boolean,String],square:Boolean,loading:Boolean,labelSlot:Boolean,bottomSlots:Boolean,hideBottomSpace:Boolean,rounded:Boolean,dense:Boolean,itemAligned:Boolean,counter:Boolean,clearable:Boolean,clearIcon:String,disable:Boolean,readonly:Boolean,autofocus:Boolean,for:String},Ic={...Fc,maxlength:[Number,String]},Lc=[`update:modelValue`,`clear`,`focus`,`blur`];function Rc({requiredForAttr:t=!0,tagProp:n,changeEvent:r=!1}={}){let{props:i,proxy:a}=(0,e.getCurrentInstance)(),o=$(i,a.$q),s=ti({required:t,getValue:()=>i.for});return{requiredForAttr:t,changeEvent:r,tag:n?(0,e.computed)(()=>i.tag):{value:`label`},isDark:o,editable:(0,e.computed)(()=>!i.disable&&!i.readonly),innerLoading:(0,e.ref)(!1),focused:(0,e.ref)(!1),hasPopupOpen:!1,splitAttrs:ac(),targetUid:s,rootRef:(0,e.ref)(null),targetRef:(0,e.ref)(null),controlRef:(0,e.ref)(null)}}function zc(t,n){return n===null?null:(0,e.h)(`div`,{key:t,class:`q-field__append q-field__marginal row no-wrap items-center q-anchor--skip`},n)}function Bc(t){let{props:n,emit:r,slots:i,attrs:a,proxy:o}=(0,e.getCurrentInstance)(),{$q:s}=o,c=null;t.hasValue===void 0&&(t.hasValue=(0,e.computed)(()=>Pc(n.modelValue))),t.emitValue===void 0&&(t.emitValue=e=>{r(`update:modelValue`,e)}),t.controlEvents===void 0&&(t.controlEvents={onFocusin:E,onFocusout:k}),Object.assign(t,{clearValue:A,onControlFocusin:E,onControlFocusout:k,focus:w}),t.computedCounter===void 0&&(t.computedCounter=(0,e.computed)(()=>{if(n.counter){let e=typeof n.modelValue==`string`||typeof n.modelValue==`number`?String(n.modelValue).length:Array.isArray(n.modelValue)?n.modelValue.length:0,t=n.maxlength===void 0?n.maxValues:n.maxlength;return e+(t===void 0?``:` / `+t)}}));let{isDirtyModel:l,hasRules:u,hasError:d,errorMessage:f,resetValidation:p}=Nc(t.focused,t.innerLoading),m=t.floatingLabel===void 0?(0,e.computed)(()=>n.stackLabel||t.focused.value||t.hasValue.value):(0,e.computed)(()=>n.stackLabel||t.focused.value||t.floatingLabel.value),h=(0,e.computed)(()=>n.bottomSlots||n.hint!==void 0||u.value||n.counter||n.error!==null),g=(0,e.computed)(()=>n.filled?`filled`:n.outlined?`outlined`:n.borderless?`borderless`:n.standout?`standout`:`standard`),_=(0,e.computed)(()=>`q-field row no-wrap items-start q-field--${g.value}`+(t.fieldClass===void 0?``:` ${t.fieldClass.value}`)+(n.rounded?` q-field--rounded`:``)+(n.square?` q-field--square`:``)+(m.value?` q-field--float`:``)+(y.value?` q-field--labeled`:``)+(n.dense?` q-field--dense`:``)+(n.itemAligned?` q-field--item-aligned q-item-type`:``)+(t.isDark.value?` q-field--dark`:``)+(t.getControl===void 0?` q-field--auto-height`:``)+(t.focused.value?` q-field--focused`:``)+(d.value?` q-field--error`:``)+(d.value||t.focused.value?` q-field--highlighted`:``)+(!n.hideBottomSpace&&h.value?` q-field--with-bottom`:``)+(n.disable?` q-field--disabled`:n.readonly?` q-field--readonly`:``)),v=(0,e.computed)(()=>`q-field__control relative-position row no-wrap`+(n.bgColor===void 0?``:` bg-${n.bgColor}`)+(d.value?` text-negative`:typeof n.standout==`string`&&n.standout.length!==0&&t.focused.value?` ${n.standout}`:n.color===void 0?``:` text-${n.color}`)),y=(0,e.computed)(()=>n.labelSlot||n.label!==void 0),b=(0,e.computed)(()=>`q-field__label no-pointer-events absolute ellipsis`+(n.labelColor!==void 0&&!d.value?` text-${n.labelColor}`:``)),x=(0,e.computed)(()=>({id:t.targetUid.value,editable:t.editable.value,focused:t.focused.value,floatingLabel:m.value,modelValue:n.modelValue,emitValue:t.emitValue})),S=(0,e.computed)(()=>{let e={};return t.targetUid.value&&(e.for=t.targetUid.value),n.disable&&(e[`aria-disabled`]=`true`),e});function C(){let e=document.activeElement,n=t.targetRef?.value;n&&(e===null||e.id!==t.targetUid.value)&&(n.hasAttribute(`tabindex`)||(n=n.querySelector(`[tabindex]`)),n!==e&&n?.focus({preventScroll:!0}))}function w(){Rn(C)}function T(){zn(C);let e=document.activeElement;e!==null&&t.rootRef.value.contains(e)&&e.blur()}function E(e){c!==null&&(clearTimeout(c),c=null),t.editable.value&&!t.focused.value&&(t.focused.value=!0,r(`focus`,e))}function k(e,n){c!==null&&clearTimeout(c),c=setTimeout(()=>{c=null,!(document.hasFocus()&&(t.hasPopupOpen||t.controlRef===void 0||t.controlRef.value===null||t.controlRef.value.contains(document.activeElement)))&&(t.focused.value&&(t.focused.value=!1,r(`blur`,e)),n?.())},0)}function A(i){O(i),s.platform.is.mobile?t.rootRef.value.contains(document.activeElement)&&document.activeElement.blur():(t.targetRef?.value||t.rootRef.value).focus(),n.type===`file`&&(t.inputRef.value.value=null),t.onClear?.(),r(`update:modelValue`,null),t.changeEvent&&r(`change`,null),r(`clear`,n.modelValue),(0,e.nextTick)(()=>{let e=l.value;p(),l.value=e})}function j(e){[13,32].includes(e.keyCode)&&A(e)}function M(){let r=[];return i.prepend!==void 0&&r.push((0,e.h)(`div`,{class:`q-field__prepend q-field__marginal row no-wrap items-center`,key:`prepend`,onClick:D},i.prepend())),r.push((0,e.h)(`div`,{class:`q-field__control-container col relative-position row no-wrap q-anchor--skip`},N())),d.value&&!n.noErrorIcon&&r.push(zc(`error`,[(0,e.h)(Z,{name:s.iconSet.field.error,color:`negative`})])),n.loading||t.innerLoading.value?r.push(zc(`inner-loading-append`,i.loading===void 0?[(0,e.h)(Ht,{color:n.color})]:i.loading())):n.clearable&&t.hasValue.value&&t.editable.value&&r.push(zc(`inner-clearable-append`,[(0,e.h)(Z,{class:`q-field__focusable-action`,name:n.clearIcon||s.iconSet.field.clear,tabindex:0,role:`button`,"aria-hidden":`false`,"aria-label":s.lang.label.clear,onKeyup:j,onClick:A})])),i.append!==void 0&&r.push((0,e.h)(`div`,{class:`q-field__append q-field__marginal row no-wrap items-center`,key:`append`,onClick:D},i.append())),t.getInnerAppend!==void 0&&r.push(zc(`inner-append`,t.getInnerAppend())),t.getControlChild!==void 0&&r.push(t.getControlChild()),r}function N(){let r=[];return n.prefix!==void 0&&n.prefix!==null&&r.push((0,e.h)(`div`,{class:`q-field__prefix no-pointer-events row items-center`},n.prefix)),t.getShadowControl!==void 0&&t.hasShadow.value&&r.push(t.getShadowControl()),y.value&&r.push((0,e.h)(`div`,{class:b.value},X(i.label,n.label))),t.getControl===void 0?i.rawControl===void 0?i.control!==void 0&&r.push((0,e.h)(`div`,{ref:t.targetRef,class:`q-field__native row`,tabindex:-1,...t.splitAttrs.attributes.value,"data-autofocus":n.autofocus||void 0},i.control(x.value))):r.push(i.rawControl()):r.push(t.getControl()),n.suffix!==void 0&&n.suffix!==null&&r.push((0,e.h)(`div`,{class:`q-field__suffix no-pointer-events row items-center`},n.suffix)),r.concat(X(i.default))}function P(){let r,a;d.value?f.value===null?(r=X(i.error),a=`q--slot-error`):(r=[(0,e.h)(`div`,{role:`alert`},f.value)],a=`q--slot-error-${f.value}`):(!n.hideHint||t.focused.value)&&(n.hint===void 0?(r=X(i.hint),a=`q--slot-hint`):(r=[(0,e.h)(`div`,n.hint)],a=`q--slot-hint-${n.hint}`));let o=n.counter||i.counter!==void 0;if(n.hideBottomSpace&&!o&&r===void 0)return;let s=(0,e.h)(`div`,{key:a,class:`q-field__messages col`},r);return(0,e.h)(`div`,{class:`q-field__bottom row items-start q-field__bottom--`+(n.hideBottomSpace?`stale`:`animated`),onClick:D},[n.hideBottomSpace?s:(0,e.h)(e.Transition,{name:`q-transition--field-message`},()=>s),o?(0,e.h)(`div`,{class:`q-field__counter`},i.counter===void 0?t.computedCounter.value:i.counter()):null])}let F=!1;return(0,e.onDeactivated)(()=>{F=!0}),(0,e.onActivated)(()=>{F&&n.autofocus&&o.focus()}),n.autofocus&&(0,e.onMounted)(()=>{o.focus()}),(0,e.onBeforeUnmount)(()=>{c!==null&&clearTimeout(c)}),Object.assign(o,{focus:w,blur:T}),function(){let r=t.getControl===void 0&&i.control===void 0?{...t.splitAttrs.attributes.value,"data-autofocus":n.autofocus||void 0,...S.value}:S.value;return(0,e.h)(t.tag.value,{ref:t.rootRef,class:[_.value,a.class],style:a.style,...r},[i.before===void 0?null:(0,e.h)(`div`,{class:`q-field__before q-field__marginal row no-wrap items-center`,onClick:D},i.before()),(0,e.h)(`div`,{class:`q-field__inner relative-position col self-stretch`},[(0,e.h)(`div`,{ref:t.controlRef,class:v.value,tabindex:-1,...t.controlEvents},M()),h.value?P():null]),i.after===void 0?null:(0,e.h)(`div`,{class:`q-field__after q-field__marginal row no-wrap items-center`,onClick:D},i.after())])}}var Vc=h({name:`QField`,inheritAttrs:!1,props:{...Ic,tag:{type:String,default:`label`}},emits:Lc,setup(){return Bc(Rc({tagProp:!0}))}});function Hc(e,t,n,r){let i=[];return e.forEach(e=>{r(e)?i.push(e):t.push({failedPropValidation:n,file:e})}),i}function Uc(e){e?.dataTransfer&&(e.dataTransfer.dropEffect=`copy`),O(e)}let Wc={multiple:Boolean,accept:String,capture:String,maxFileSize:[Number,String],maxTotalSize:[Number,String],maxFiles:[Number,String],filter:Function},Gc=[`rejected`];function Kc({editable:t,dnd:n,getFileInput:r,addFilesToQueue:i}){let{props:a,emit:o,proxy:s}=(0,e.getCurrentInstance)(),c=(0,e.ref)(null),l=(0,e.computed)(()=>a.accept===void 0?null:a.accept.split(`,`).map(e=>(e=e.trim(),e===`*`?`*/`:(e.endsWith(`/*`)&&(e=e.slice(0,-1)),e.toUpperCase())))),u=(0,e.computed)(()=>Number.parseInt(a.maxFiles,10)),d=(0,e.computed)(()=>Number.parseInt(a.maxTotalSize,10));function f(e){if(t.value)if(e!==Object(e)&&(e={target:null}),e.target?.matches(`input[type="file"]`)===!0)e.clientX===0&&e.clientY===0&&E(e);else{let t=r();t!==e.target&&t?.click(e)}}function m(e){t.value&&e&&i(null,e)}function h(e,t,n,r){let i=[...t||e.target.files],s=[],c=()=>{s.length!==0&&o(`rejected`,s)};if(a.accept!==void 0&&!l.value.includes(`*/`)&&(i=Hc(i,s,`accept`,e=>l.value.some(t=>(t.endsWith(`/`)?e.type.toUpperCase().startsWith(t):e.type.toUpperCase()===t)||e.name.toUpperCase().endsWith(t))),i.length===0))return c();if(a.maxFileSize!==void 0){let e=Number.parseInt(a.maxFileSize,10);if(i=Hc(i,s,`max-file-size`,t=>t.size<=e),i.length===0)return c()}if(!a.multiple&&i.length!==0&&(i=[i[0]]),i.forEach(e=>{e.__key=JSON.stringify([e.webkitRelativePath,e.lastModified,e.name,e.size])}),r){let e=new Set(n.map(e=>e.__key));i=Hc(i,s,`duplicate`,t=>e.has(t.__key)?!1:(e.add(t.__key),!0))}if(i.length===0)return c();if(a.maxTotalSize!==void 0){let e=r?n.reduce((e,t)=>e+t.size,0):0;if(i=Hc(i,s,`max-total-size`,t=>{let n=e+t.size;return n>d.value?!1:(e=n,!0)}),i.length===0)return c()}if(typeof a.filter==`function`){let e=a.filter(i);i=Hc(i,s,`filter`,t=>e.includes(t))}if(a.maxFiles!==void 0){let e=r?n.length:0;if(i=Hc(i,s,`max-files`,()=>(e++,e<=u.value)),i.length===0)return c()}if(c(),i.length!==0)return i}function g(e){Uc(e),n.value||=!0}function _(e){O(e),(e.relatedTarget!==null||!p.is.safari?e.relatedTarget!==c.value:!document.elementsFromPoint(e.clientX,e.clientY).includes(c.value))&&(n.value=!1)}function v(e){Uc(e);let t=e.dataTransfer.files;t.length!==0&&i(null,t),n.value=!1}function y(t){if(n.value)return(0,e.h)(`div`,{ref:c,class:`q-${t}__dnd absolute-full`,onDragenter:Uc,onDragover:Uc,onDragleave:_,onDrop:v})}return Object.assign(s,{pickFiles:f,addFiles:m}),{pickFiles:f,addFiles:m,onDragover:g,onDragleave:_,processFiles:h,getDndNode:y,maxFilesNumber:u,maxTotalSizeNumber:d}}function qc(t,n){function r(){let e=t.modelValue;try{let t=`DataTransfer`in window?new DataTransfer:`ClipboardEvent`in window?new ClipboardEvent(``).clipboardData:void 0;return Object(e)===e&&(`length`in e?[...e]:[e]).forEach(e=>{t.items.add(e)}),{files:t.files}}catch{return{files:void 0}}}return n?(0,e.computed)(()=>{if(t.type===`file`)return r()}):(0,e.computed)(r)}function Jc(e){e.keyCode===13&&D(e)}var Yc=h({name:`QFile`,inheritAttrs:!1,props:{...Fc,...ai,...Wc,modelValue:[File,FileList,Array],append:Boolean,useChips:Boolean,displayValue:[String,Number],tabindex:{type:[String,Number],default:0},counterLabel:Function,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...Lc,...Gc],setup(t,{slots:n,emit:i,attrs:a}){let{proxy:o}=(0,e.getCurrentInstance)(),s=Rc(),c=(0,e.ref)(null),l=(0,e.ref)(!1),u=ci(t),{pickFiles:d,onDragover:f,onDragleave:p,processFiles:m,getDndNode:h}=Kc({editable:s.editable,dnd:l,getFileInput:k,addFilesToQueue:A}),g=qc(t),_=(0,e.computed)(()=>Object(t.modelValue)===t.modelValue?`length`in t.modelValue?[...t.modelValue]:[t.modelValue]:[]),v=(0,e.computed)(()=>Pc(_.value)),y=(0,e.computed)(()=>_.value.map(e=>e.name).join(`, `)),b=(0,e.computed)(()=>Me(_.value.reduce((e,t)=>e+t.size,0))),x=(0,e.computed)(()=>({totalSize:b.value,filesNumber:_.value.length,maxFiles:t.maxFiles})),S=(0,e.computed)(()=>({tabindex:-1,type:`file`,title:``,accept:t.accept,capture:t.capture,name:u.value,...a,id:s.targetUid.value,disabled:!s.editable.value})),C=(0,e.computed)(()=>`q-file q-field--auto-height`+(l.value?` q-file--dnd`:``)),w=(0,e.computed)(()=>t.multiple&&t.append);function T(e){let t=[..._.value];t.splice(e,1),D(t)}function E(e){let t=_.value.indexOf(e);t!==-1&&T(t)}function D(e){i(`update:modelValue`,t.multiple?e:e[0])}function O(e){(e.keyCode===13||e.keyCode===32)&&d(e)}function k(){return c.value}function A(e,n){let r=m(e,n,_.value,w.value),i=k();i!=null&&(i.value=``),r!==void 0&&((t.multiple?t.modelValue&&r.every(e=>_.value.includes(e)):t.modelValue===r[0])||D(w.value?[..._.value,...r]:r))}function j(){return[(0,e.h)(`input`,{class:[t.inputClass,`q-file__filler`],style:t.inputStyle})]}function M(){if(n.file!==void 0)return _.value.length===0?j():_.value.map((e,t)=>n.file({index:t,file:e,ref:this}));if(n.selected!==void 0)return _.value.length===0?j():n.selected({files:_.value,ref:this});if(t.useChips)return _.value.length===0?j():_.value.map((n,r)=>(0,e.h)(Ji,{key:`file-`+r,removable:s.editable.value,dense:!0,textColor:t.color,tabindex:t.tabindex,onRemove:()=>{T(r)}},()=>(0,e.h)(`span`,{class:`ellipsis`,textContent:n.name})));let r=t.displayValue===void 0?y.value:t.displayValue;return r.length===0?j():[(0,e.h)(`div`,{class:t.inputClass,style:t.inputStyle,textContent:r})]}function N(){let n={ref:c,...S.value,...g.value,class:`q-field__input fit absolute-full cursor-pointer`,onChange:A};return t.multiple&&(n.multiple=!0),(0,e.h)(`input`,n)}return Object.assign(s,{fieldClass:C,emitValue:D,hasValue:v,inputRef:c,innerValue:_,floatingLabel:(0,e.computed)(()=>v.value||Pc(t.displayValue)),computedCounter:(0,e.computed)(()=>{if(t.counterLabel!==void 0)return t.counterLabel(x.value);let e=t.maxFiles;return`${_.value.length}${e===void 0?``:` / `+e} (${b.value})`}),getControlChild:()=>h(`file`),getControl:()=>{let n={ref:s.targetRef,class:`q-field__native row items-center cursor-pointer`,tabindex:t.tabindex};return s.editable.value&&Object.assign(n,{onDragover:f,onDragleave:p,onKeydown:Jc,onKeyup:O}),(0,e.h)(`div`,n,[N()].concat(M()))}}),Object.assign(o,{removeAtIndex:T,removeFile:E,getNativeElement:()=>c.value}),r(o,`nativeEl`,()=>c.value),Bc(s)}});function Xc(e,t){e.value!==t&&(e.value=t)}var Zc=h({name:`QFooter`,props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:[`reveal`,`focusin`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=(0,e.inject)(fe,J);if(o===J)return console.error(`QFooter needs to be child of QLayout`),J;let s=(0,e.ref)(Number.parseInt(t.heightHint,10)),c=(0,e.ref)(!0),l=(0,e.ref)(a.value||o.isContainer.value?0:window.innerHeight),u=(0,e.computed)(()=>t.reveal||o.view.value.includes(`F`)||i.platform.is.ios&&o.isContainer.value),d=(0,e.computed)(()=>o.isContainer.value?o.containerHeight.value:l.value),f=(0,e.computed)(()=>{if(!t.modelValue)return 0;if(u.value)return c.value?s.value:0;let e=o.scroll.value.position+d.value+s.value-o.height.value;return Math.max(e,0)}),p=(0,e.computed)(()=>!t.modelValue||u.value&&!c.value),m=(0,e.computed)(()=>t.modelValue&&p.value&&t.reveal),h=(0,e.computed)(()=>`q-footer q-layout__section--marginal `+(u.value?`fixed`:`absolute`)+`-bottom`+(t.bordered?` q-footer--bordered`:``)+(p.value?` q-footer--hidden`:``)+(t.modelValue?``:` q-layout--prevent-focus`+(u.value?``:` hidden`))),g=(0,e.computed)(()=>{let e=o.rows.value.bottom,t={};return e[0]===`l`&&o.left.space&&(t[i.lang.rtl?`right`:`left`]=`${o.left.size}px`),e[2]===`r`&&o.right.space&&(t[i.lang.rtl?`left`:`right`]=`${o.right.size}px`),t});function _(e,t){o.update(`footer`,e,t)}function v({height:e}){Xc(s,e),_(`size`,e)}function y(){if(!t.reveal)return;let{direction:e,position:n,inflectionPoint:r}=o.scroll.value;Xc(c,e===`up`||n-r<100||o.height.value-d.value-n-s.value<300)}function b(e){m.value&&Xc(c,!0),r(`focusin`,e)}(0,e.watch)(()=>t.modelValue,e=>{_(`space`,e),Xc(c,!0),o.animate()}),(0,e.watch)(f,e=>{_(`offset`,e)}),(0,e.watch)(()=>t.reveal,e=>{e||Xc(c,t.modelValue)}),(0,e.watch)(c,e=>{o.animate(),r(`reveal`,e)}),(0,e.watch)([s,o.scroll,o.height],y),(0,e.watch)(()=>i.screen.height,e=>{o.isContainer.value||Xc(l,e)});let x={};return o.instances.footer=x,t.modelValue&&_(`size`,s.value),_(`space`,t.modelValue),_(`offset`,f.value),(0,e.onBeforeUnmount)(()=>{o.instances.footer===x&&(o.instances.footer=void 0,_(`size`,0),_(`offset`,0),_(`space`,!1))}),()=>{let r=Ze(n.default,[(0,e.h)(ma,{debounce:0,onResize:v})]);return t.elevated&&r.push((0,e.h)(`div`,{class:`q-layout__shadow absolute-full overflow-hidden no-pointer-events`})),(0,e.h)(`footer`,{class:h.value,style:g.value,onFocusin:b},r)}}});function Qc(e){let t=e.validate();return typeof t.then==`function`?t.then(t=>({valid:t,comp:e}),t=>({valid:!1,comp:e,err:t})):Promise.resolve({valid:t,comp:e})}var $c=h({name:`QForm`,props:{autofocus:Boolean,noErrorFocus:Boolean,noResetFocus:Boolean,greedy:Boolean,onSubmit:Function},emits:[`reset`,`validationSuccess`,`validationError`],setup(t,{slots:n,emit:r}){let i=(0,e.getCurrentInstance)(),a=(0,e.ref)(null),o=0,s=[];function c(e){let n=typeof e==`boolean`?e:!t.noErrorFocus,i=++o,a=(e,t)=>{r(`validation${e?`Success`:`Error`}`,t)};return(t.greedy?Promise.all(s.map(Qc)).then(e=>e.filter(e=>!e.valid)):s.reduce((e,t)=>e.then(()=>Qc(t)).then(e=>{if(!e.valid)throw e}),Promise.resolve()).catch(e=>[e])).then(e=>{if(e===void 0||e.length===0)return i===o&&a(!0),!0;if(i===o){let{comp:t,err:r}=e[0];if(r!==void 0&&console.error(r),a(!1,t),n){let t=e.find(({comp:e})=>typeof e.focus==`function`&&!Dt(e.$));t!==void 0&&t.comp.focus()}}return!1})}function l(){o++,s.forEach(e=>{typeof e.resetValidation==`function`&&e.resetValidation()})}function u(e){e!==void 0&&O(e);let n=o+1;c().then(i=>{n===o&&i&&(t.onSubmit===void 0?e?.target!==void 0&&typeof e.target.submit==`function`&&e.target.submit():r(`submit`,e))})}function d(n){n!==void 0&&O(n),r(`reset`),(0,e.nextTick)(()=>{l(),t.autofocus&&!t.noResetFocus&&f()})}function f(){Rn(()=>{a.value!==null&&(a.value.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||a.value.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||a.value.querySelector(`[autofocus], [data-autofocus]`)||Array.prototype.find.call(a.value.querySelectorAll(`[tabindex]`),e=>e.tabIndex!==-1))?.focus({preventScroll:!0})})}(0,e.provide)(me,{bindComponent(e){s.push(e)},unbindComponent(e){let t=s.indexOf(e);t!==-1&&s.splice(t,1)}});let p=!1;return(0,e.onDeactivated)(()=>{p=!0}),(0,e.onActivated)(()=>{p&&t.autofocus&&f()}),(0,e.onMounted)(()=>{t.autofocus&&f()}),Object.assign(i.proxy,{validate:c,resetValidation:l,submit:u,reset:d,focus:f,getValidationComponents:()=>s}),()=>(0,e.h)(`form`,{class:`q-form`,ref:a,onSubmit:u,onReset:d},X(n.default))}}),el={inject:{[me]:{default:y}},watch:{disable(e){let t=this.$.provides[me];t!==void 0&&(e?(this.resetValidation(),t.unbindComponent(this)):t.bindComponent(this))}},methods:{validate(){},resetValidation(){}},mounted(){this.disable||this.$.provides[me]?.bindComponent(this)},beforeUnmount(){this.disable||this.$.provides[me]?.unbindComponent(this)}};function tl(e,t){e.value!==t&&(e.value=t)}var nl=h({name:`QHeader`,props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,revealOffset:{type:Number,default:250},bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:[`reveal`,`focusin`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=(0,e.inject)(fe,J);if(a===J)return console.error(`QHeader needs to be child of QLayout`),J;let o=(0,e.ref)(Number.parseInt(t.heightHint,10)),s=(0,e.ref)(!0),c=(0,e.computed)(()=>t.reveal||a.view.value.includes(`H`)||i.platform.is.ios&&a.isContainer.value),l=(0,e.computed)(()=>{if(!t.modelValue)return 0;if(c.value)return s.value?o.value:0;let e=o.value-a.scroll.value.position;return Math.max(e,0)}),u=(0,e.computed)(()=>!t.modelValue||c.value&&!s.value),d=(0,e.computed)(()=>t.modelValue&&u.value&&t.reveal),f=(0,e.computed)(()=>`q-header q-layout__section--marginal `+(c.value?`fixed`:`absolute`)+`-top`+(t.bordered?` q-header--bordered`:``)+(u.value?` q-header--hidden`:``)+(t.modelValue?``:` q-layout--prevent-focus`)),p=(0,e.computed)(()=>{let e=a.rows.value.top,t={};return e[0]===`l`&&a.left.space&&(t[i.lang.rtl?`right`:`left`]=`${a.left.size}px`),e[2]===`r`&&a.right.space&&(t[i.lang.rtl?`left`:`right`]=`${a.right.size}px`),t});function m(e,t){a.update(`header`,e,t)}function h({height:e}){tl(o,e),m(`size`,e)}function g(e){d.value&&tl(s,!0),r(`focusin`,e)}(0,e.watch)(()=>t.modelValue,e=>{m(`space`,e),tl(s,!0),a.animate()}),(0,e.watch)(l,e=>{m(`offset`,e)}),(0,e.watch)(()=>t.reveal,e=>{e||tl(s,t.modelValue)}),(0,e.watch)(s,e=>{a.animate(),r(`reveal`,e)}),(0,e.watch)(a.scroll,e=>{t.reveal&&tl(s,e.direction===`up`||e.position<=t.revealOffset||e.position-e.inflectionPoint<100)});let _={};return a.instances.header=_,t.modelValue&&m(`size`,o.value),m(`space`,t.modelValue),m(`offset`,l.value),(0,e.onBeforeUnmount)(()=>{a.instances.header===_&&(a.instances.header=void 0,m(`size`,0),m(`offset`,0),m(`space`,!1))}),()=>{let r=Xe(n.default,[]);return t.elevated&&r.push((0,e.h)(`div`,{class:`q-layout__shadow absolute-full overflow-hidden no-pointer-events`})),r.push((0,e.h)(ma,{debounce:0,onResize:h})),(0,e.h)(`header`,{class:f.value,style:p.value,onFocusin:g},r)}}});let rl={ratio:[String,Number]};function il(t,n){return(0,e.computed)(()=>{let e=t.ratio||n?.value;if(typeof e==`string`&&e.trim()===``)return null;let r=Number(e);return Number.isFinite(r)&&r>0?{paddingBottom:`${100/r}%`}:null})}var al=h({name:`QImg`,props:{...rl,src:String,srcset:String,sizes:String,alt:String,crossorigin:String,decoding:String,referrerpolicy:String,draggable:Boolean,loading:{type:String,default:`lazy`},loadingShowDelay:{type:[Number,String],default:0},fetchpriority:{type:String,default:`auto`},width:String,height:String,initialRatio:{type:[Number,String],default:1.7778},placeholderSrc:String,errorSrc:String,fit:{type:String,default:`cover`},position:{type:String,default:`50% 50%`},imgClass:String,imgStyle:Object,noSpinner:Boolean,noNativeMenu:Boolean,noTransition:Boolean,spinnerColor:String,spinnerSize:String},emits:[`load`,`error`],setup(t,{slots:n,emit:r}){let i=(0,e.ref)(t.initialRatio),o=il(t,i),s=(0,e.getCurrentInstance)(),{registerTimeout:c,removeTimeout:l}=$n(),{registerTimeout:u,removeTimeout:d}=$n(),f=(0,e.computed)(()=>t.placeholderSrc===void 0?null:{src:t.placeholderSrc}),p=(0,e.computed)(()=>t.errorSrc===void 0?null:{src:t.errorSrc,__qerror:!0}),m=[(0,e.ref)(null),(0,e.ref)(f.value)],h=(0,e.ref)(0),g=(0,e.ref)(!1),_=(0,e.ref)(!1),v=(0,e.computed)(()=>`q-img q-img--${t.noNativeMenu?`no-`:``}menu`),y=(0,e.computed)(()=>({width:t.width,height:t.height})),b=(0,e.computed)(()=>`q-img__image ${t.imgClass===void 0?``:t.imgClass+` `}q-img__image--with${t.noTransition?`out`:``}-transition q-img__image--`),x=(0,e.computed)(()=>({...t.imgStyle,objectFit:t.fit,objectPosition:t.position}));function S(){if(d(),t.loadingShowDelay===0){g.value=!0;return}u(()=>{g.value=!0},t.loadingShowDelay)}function C(){d(),g.value=!1}function w({target:e}){Dt(s)||(l(),i.value=e.naturalHeight===0?.5:e.naturalWidth/e.naturalHeight,T(e,1))}function T(e,t){t===1e3||Dt(s)||(e.complete?E(e):c(()=>{T(e,t+1)},50))}function E(e){Dt(s)||(h.value^=1,m[h.value].value=null,C(),e.getAttribute(`__qerror`)!==`true`&&(_.value=!1),r(`load`,e.currentSrc||e.src))}function D(e){l(),C(),_.value=!0,m[h.value].value=p.value,m[h.value^1].value=f.value,r(`error`,e)}function O(n){let r=m[n].value,i={key:`img_`+n,class:b.value,style:x.value,alt:t.alt,crossorigin:t.crossorigin,decoding:t.decoding,referrerpolicy:t.referrerpolicy,height:t.height,width:t.width,loading:t.loading,fetchpriority:t.fetchpriority,"aria-hidden":`true`,draggable:t.draggable,...r};return h.value===n?Object.assign(i,{class:i.class+`current`,onLoad:w,onError:D}):i.class+=`loaded`,(0,e.h)(`div`,{class:`q-img__container absolute-full`,key:`img`+n},(0,e.h)(`img`,i))}function k(){return g.value?(0,e.h)(`div`,{key:`loading`,class:`q-img__loading absolute-full flex flex-center`},n.loading===void 0?t.noSpinner?void 0:[(0,e.h)(Ht,{color:t.spinnerColor,size:t.spinnerSize})]:n.loading()):(0,e.h)(`div`,{key:`content`,class:`q-img__content absolute-full q-anchor--skip`},X(n[_.value?`error`:`default`]))}{let n=()=>{(0,e.watch)(()=>t.src||t.srcset||t.sizes?{src:t.src,srcset:t.srcset,sizes:t.sizes}:null,e=>{l(),_.value=!1,e===null?(C(),m[h.value^1].value=f.value):S(),m[h.value].value=e},{immediate:!0})};a.value?(0,e.onMounted)(n):n()}return()=>{let n=[];return o.value!==null&&n.push((0,e.h)(`div`,{key:`filler`,style:o.value})),m[0].value!==null&&n.push(O(0)),m[1].value!==null&&n.push(O(1)),n.push((0,e.h)(e.Transition,{name:`q-transition--fade`},k)),(0,e.h)(`div`,{key:`main`,class:v.value,style:y.value,role:`img`,"aria-label":t.alt},n)}}});let{passive:ol}=v;var sl=h({name:`QInfiniteScroll`,props:{offset:{type:Number,default:500},debounce:{type:[String,Number],default:100},scrollTarget:er,initialIndex:{type:Number,default:0},disable:Boolean,reverse:Boolean},emits:[`load`],setup(t,{slots:n,emit:r}){let i=(0,e.ref)(!1),a=(0,e.ref)(!0),o=(0,e.ref)(null),s=(0,e.ref)(null),c=t.initialIndex,l,u,d=(0,e.computed)(()=>`q-infinite-scroll__loading`+(i.value?``:` invisible`));function f(){if(t.disable||i.value||!a.value)return;let e=rr(l),n=ar(l),r=Gt(l);t.reverse?Math.round(n)<=t.offset&&p():Math.round(n+r+t.offset)>=Math.round(e)&&p()}function p(){if(t.disable||i.value||!a.value)return;c++,i.value=!0;let n=rr(l);r(`load`,c,r=>{a.value&&(i.value=!1,(0,e.nextTick)(()=>{if(t.reverse){let e=rr(l),t=ar(l),r=e-n;dr(l,t+r)}r===!0?g():o.value?.closest(`body`)&&u()}))})}function m(){c=0}function h(){a.value||(a.value=!0,l.addEventListener(`scroll`,u,ol)),f()}function g(){a.value&&(a.value=!1,i.value=!1,l.removeEventListener(`scroll`,u,ol),u?.cancel?.())}function _(){if(l&&a.value&&l.removeEventListener(`scroll`,u,ol),l=nr(o.value,t.scrollTarget),a.value){if(l.addEventListener(`scroll`,u,ol),t.reverse){let e=rr(l),t=Gt(l);dr(l,e-t)}f()}}function v(e){c=e}function y(e){e=Number.parseInt(e,10);let t=u;u=e<=0?f:N(f,Number.isNaN(e)?100:e),l&&a.value&&(t!==void 0&&l.removeEventListener(`scroll`,t,ol),l.addEventListener(`scroll`,u,ol))}function b(t){if(x.value){if(s.value===null){t||(0,e.nextTick)(()=>{b(!0)});return}let n=`${i.value?`un`:``}pauseAnimations`;[...s.value.getElementsByTagName(`svg`)].forEach(e=>{e[n]()})}}let x=(0,e.computed)(()=>!t.disable&&a.value);(0,e.watch)([i,x],()=>{b()}),(0,e.watch)(()=>t.disable,e=>{e?g():h()}),(0,e.watch)(()=>t.reverse,()=>{!i.value&&a.value&&f()}),(0,e.watch)(()=>t.scrollTarget,_),(0,e.watch)(()=>t.debounce,y);let S=!1;(0,e.onActivated)(()=>{S!==!1&&l&&dr(l,S)}),(0,e.onDeactivated)(()=>{S=l?ar(l):!1}),(0,e.onBeforeUnmount)(()=>{a.value&&l.removeEventListener(`scroll`,u,ol)}),(0,e.onMounted)(()=>{y(t.debounce),_(),i.value||b()});let C=(0,e.getCurrentInstance)();return Object.assign(C.proxy,{poll:()=>{u?.()},trigger:p,stop:g,reset:m,resume:h,setIndex:v,updateScrollTarget:_}),()=>{let r=Xe(n.default,[]);return x.value&&r[t.reverse?`unshift`:`push`]((0,e.h)(`div`,{ref:s,class:d.value},X(n.loading))),(0,e.h)(`div`,{class:`q-infinite-scroll`,ref:o},r)}}}),cl=h({name:`QInnerLoading`,props:{...Q,...Xn,showing:Boolean,color:String,size:{type:[String,Number],default:`42px`},label:String,labelClass:String,labelStyle:[String,Array,Object]},setup(t,{slots:n}){let r=$(t,(0,e.getCurrentInstance)().proxy.$q),{transitionProps:i,transitionStyle:a}=Zn(t),o=(0,e.computed)(()=>`q-inner-loading q--avoid-card-border absolute-full column flex-center`+(r.value?` q-inner-loading--dark`:``)),s=(0,e.computed)(()=>`q-inner-loading__label`+(t.labelClass===void 0?``:` ${t.labelClass}`));function c(){let n=[(0,e.h)(Ht,{size:t.size,color:t.color})];return t.label!==void 0&&n.push((0,e.h)(`div`,{class:s.value,style:t.labelStyle},[t.label])),n}function l(){return t.showing?(0,e.h)(`div`,{class:o.value,style:a.value},n.default===void 0?c():n.default()):null}return()=>(0,e.h)(e.Transition,i.value,l)}});let ll={date:`####/##/##`,datetime:`####/##/## ##:##`,time:`##:##`,fulltime:`##:##:##`,phone:`(###) ### - ####`,card:`#### #### #### ####`},{tokenMap:ul,tokenKeys:dl}=fl({"#":{pattern:`[\\d]`,negate:`[^\\d]`},S:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`},N:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`},A:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`,transform:e=>e.toLocaleUpperCase()},a:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`,transform:e=>e.toLocaleLowerCase()},X:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`,transform:e=>e.toLocaleUpperCase()},x:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`,transform:e=>e.toLocaleLowerCase()}});function fl(e){let t=Object.keys(e),n={};return t.forEach(t=>{let r=e[t];n[t]={...r,regex:new RegExp(r.pattern)}}),{tokenMap:n,tokenKeys:t}}function pl(e){return RegExp("\\\\([^.*+?^${}()|([\\]])|([.*+?^${}()|[\\]])|(["+e.join(``)+`])|(.)`,`g`)}let ml=/[.*+?^${}()|[\]\\]/g,hl=pl(dl),gl=String.fromCodePoint(1),_l={mask:String,reverseFillMask:Boolean,fillMask:[Boolean,String],unmaskedValue:Boolean,maskTokens:Object};function vl(t,n,r,i){let a,o,s,c,l,u,d=(0,e.computed)(()=>{if(t.maskTokens===void 0||t.maskTokens===null)return{tokenMap:ul,tokenRegexMask:hl};let{tokenMap:e}=fl(t.maskTokens),n={...ul,...e};return{tokenMap:n,tokenRegexMask:pl(Object.keys(n))}}),f=(0,e.ref)(null),p=(0,e.ref)(h());function m(){return t.autogrow||[`textarea`,`text`,`search`,`url`,`tel`,`password`].includes(t.type)}(0,e.watch)(()=>t.type+t.autogrow,_),(0,e.watch)(()=>t.mask,e=>{if(e!==void 0)v(p.value,!0);else{let e=T(p.value);_(),t.modelValue!==e&&n(`update:modelValue`,e)}}),(0,e.watch)(()=>t.fillMask+t.reverseFillMask,()=>{f.value&&v(p.value,!0)}),(0,e.watch)(()=>t.unmaskedValue,()=>{f.value&&v(p.value)}),(0,e.watch)(()=>t.maskTokens,()=>{f.value&&v(p.value,!0)},{deep:!0});function h(){if(_(),f.value){let e=C(T(t.modelValue));return t.fillMask===!1?e:E(e)}return t.modelValue}function g(e){if(e0;r--)t+=gl;n=n.slice(0,r)+t+n.slice(r)}return n}function _(){if(f.value=t.mask!==void 0&&t.mask.length!==0&&m(),!f.value){c=void 0,a=``,o=``;return}let e=ll[t.mask]===void 0?t.mask:ll[t.mask],n=typeof t.fillMask==`string`&&t.fillMask.length!==0?t.fillMask.slice(0,1):`_`,r=n.replace(ml,String.raw`\$&`),i=[],l=[],u=[],p=t.reverseFillMask,h=``,g=``;e.replace(d.value.tokenRegexMask,(e,t,n,r,a)=>{if(r!==void 0){let e=d.value.tokenMap[r];u.push(e),g=e.negate,p&&=(l.push(`(?:`+g+`+)?(`+e.pattern+`+)?(?:`+g+`+)?(`+e.pattern+`+)?`),!1),l.push(`(?:`+g+`+)?(`+e.pattern+`)?`);return}if(n!==void 0)h=`\\`+(n===`\\`?``:n),u.push(n);else{let e=t===void 0?a:t;h=e===`\\`?String.raw`\\\\`:e.replace(ml,String.raw`\\$&`),u.push(e)}i.push(`([^`+h+`]+)?`+h+`?`)});let _=RegExp(`^`+i.join(``)+`(`+(h===``?`.`:`[^`+h+`]`)+`+)?`+(h===``?``:`[`+h+`]*`)+`$`),v=l.length-1,y=l.map((e,n)=>n===0&&t.reverseFillMask?RegExp(`^`+r+`*`+e):RegExp(n===v?`^`+e+`(`+(g===``?`.`:g)+`+)?`+(t.reverseFillMask?`$`:r+`*`):`^`+e));s=u,c=e=>{let n=_.exec(t.reverseFillMask?e:e.slice(0,u.length+1));n!==null&&(e=n.slice(1).join(``));let r=[],i=y.length;for(let t=0,n=e;ttypeof e==`string`?e:gl).join(``),o=a.split(gl).join(n)}function v(n,s,c){let u=i.value,d=u?.selectionEnd??0,f=u===null?0:u.value.length-d,m=T(n);s===!0&&_();let h=C(m,s),g=t.fillMask===!1?h:E(h),v=p.value!==g;u!==null&&u.value!==g&&(u.value=g),v&&(p.value=g),u!==null&&document.activeElement===u&&(0,e.nextTick)(()=>{if(g===o){let e=t.reverseFillMask?o.length:0;u.setSelectionRange(e,e,`forward`);return}if(c===`insertFromPaste`&&!t.reverseFillMask){let e=u.selectionEnd,t=d-1;for(let n=l;n<=t&&nh.length):Math.max(0,g.length-(g===o?0:Math.min(h.length,f)+1))+1:d;u.setSelectionRange(e,e,`forward`);return}if(t.reverseFillMask)if(v){let e=Math.max(0,g.length-(g===o?0:Math.min(h.length,f+1)));e===1&&d===1?u.setSelectionRange(e,e,`forward`):b.rightReverse(u,e)}else{let e=g.length-f;u.setSelectionRange(e,e,`backward`)}else if(v){let e=Math.max(0,a.indexOf(gl),Math.min(h.length,d)-1);b.right(u,e)}else{let e=d-1;b.right(u,e)}});let y=t.unmaskedValue?T(g):g;String(t.modelValue)!==y&&(t.modelValue!==null||y!==``)&&r(y,!0)}function y(e,t,n){let r=C(T(e.value));t=Math.max(0,a.indexOf(gl),Math.min(r.length,t)),l=t,e.setSelectionRange(t,n,`forward`)}let b={left(e,t){let n=!a.slice(t-1).includes(gl),r=Math.max(0,t-1);for(;r>=0;r--)if(a[r]===gl){t=r,n&&t++;break}if(r<0&&a[t]!==void 0&&a[t]!==gl)return b.right(e,0);t>=0&&e.setSelectionRange(t,t,`backward`)},right(e,t){let n=e.value.length,r=Math.min(n,t+1);for(;r<=n;r++)if(a[r]===gl){t=r;break}else a[r-1]===gl&&(t=r);if(r>n&&a[t-1]!==void 0&&a[t-1]!==gl)return b.left(e,n);e.setSelectionRange(t,t,`forward`)},leftReverse(e,t){let n=g(e.value.length),r=Math.max(0,t-1);for(;r>=0;r--)if(n[r-1]===gl){t=r;break}else if(n[r]===gl&&(t=r,r===0))break;if(r<0&&n[t]!==void 0&&n[t]!==gl)return b.rightReverse(e,0);t>=0&&e.setSelectionRange(t,t,`backward`)},rightReverse(e,t){let n=e.value.length,r=g(n),i=!r.slice(0,t+1).includes(gl),a=Math.min(n,t+1);for(;a<=n;a++)if(r[a-1]===gl){t=a,t>0&&i&&t--;break}if(a>n&&r[t-1]!==void 0&&r[t-1]!==gl)return b.leftReverse(e,n);e.setSelectionRange(t,t,`forward`)}};function x(e){n(`click`,e),u=void 0}function S(e){if(n(`keydown`,e),te(e)||e.altKey)return;let r=i.value,a=r.selectionStart,o=r.selectionEnd;if(e.shiftKey||(u=void 0),e.keyCode===37||e.keyCode===39){e.shiftKey&&u===void 0&&(u=r.selectionDirection===`forward`?a:o);let n=b[(e.keyCode===39?`right`:`left`)+(t.reverseFillMask?`Reverse`:``)];if(e.preventDefault(),n(r,u===a?o:a),e.shiftKey){let e=r.selectionStart;r.setSelectionRange(Math.min(u,e),Math.max(u,e),`forward`)}}else e.keyCode===8&&!t.reverseFillMask&&a===o?(b.left(r,a),r.setSelectionRange(r.selectionStart,o,`backward`)):e.keyCode===46&&t.reverseFillMask&&a===o&&(b.rightReverse(r,o),r.setSelectionRange(a,r.selectionEnd,`forward`))}function C(e,n){if(e==null||e===``)return``;if(t.reverseFillMask)return w(e,n);let r=s,i=0,a=``;for(let t=0;t=0&&i!==-1;a--){let s=n[a],c=e[i];if(typeof s==`string`)o=s+o,t===!0&&c===s&&i--;else if(c!==void 0&&s.regex.test(c))do o=(s.transform===void 0?c:s.transform(c))+o,i--,c=e[i];while(r===a&&c!==void 0&&s.regex.test(c));else return o}return o}function T(e){return typeof e!=`string`||c===void 0?typeof e==`number`?c(String(e)):e:c(e)}function E(e){return o.length-e.length<=0?e:t.reverseFillMask&&e.length!==0?o.slice(0,-e.length)+e:e+o.slice(e.length)}return{innerValue:p,hasMask:f,moveCursorForPaste:y,updateMaskValue:v,onMaskedKeydown:S,onMaskedClick:x}}let yl=/[\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFF9F\u4E00-\u9FAF\u3400-\u4DBF]/,bl=/[\u4E00-\u9FFF\u3400-\u4DBF\u{20000}-\u{2A6DF}\u{2A700}-\u{2B73F}\u{2B740}-\u{2B81F}\u{2B820}-\u{2CEAF}\uF900-\uFAFF\u3300-\u33FF\uFE30-\uFE4F\uF900-\uFAFF\u{2F800}-\u{2FA1F}]/u,xl=/[\u3131-\u314E\u314F-\u3163\uAC00-\uD7A3]/,Sl=/[a-z0-9_ -]$/i;function Cl(e){return function(t){if(t.type===`compositionend`||t.type===`change`){if(!t.target.qComposing)return;t.target.qComposing=!1,e(t)}else t.type===`compositionupdate`&&!t.target.qComposing&&typeof t.data==`string`&&(p.is.firefox?!Sl.test(t.data):yl.test(t.data)||bl.test(t.data)||xl.test(t.data))&&(t.target.qComposing=!0)}}var wl=h({name:`QInput`,inheritAttrs:!1,props:{...Ic,..._l,...ai,modelValue:[String,Number,FileList],modelModifiers:Object,shadowText:String,type:{type:String,default:`text`},debounce:[String,Number],autogrow:Boolean,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...Lc,`paste`,`change`,`keydown`,`click`,`animationend`],setup(t,{emit:n,attrs:i}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:o}=a,s={},c=NaN,l=!1,u=!1,d=null,f,p=(0,e.ref)(null),m=ci(t),{innerValue:h,hasMask:g,moveCursorForPaste:_,updateMaskValue:v,onMaskedKeydown:y,onMaskedClick:b}=vl(t,n,F,p),x=qc(t,!0),S=(0,e.computed)(()=>Pc(h.value)),C=Cl(N),w=Rc({changeEvent:!0}),T=(0,e.computed)(()=>t.type===`textarea`||t.autogrow),D=(0,e.computed)(()=>T.value||[`text`,`search`,`url`,`tel`,`password`].includes(t.type)),O=(0,e.computed)(()=>{let e={...w.splitAttrs.listeners.value,onInput:N,onPaste:M,onChange:ee,onBlur:z,onFocus:E};return e.onCompositionstart=e.onCompositionupdate=e.onCompositionend=C,g.value&&(e.onKeydown=y,e.onClick=b),t.autogrow&&(e.onAnimationend=P),e}),k=(0,e.computed)(()=>{let e={tabindex:0,"data-autofocus":t.autofocus||void 0,rows:t.type===`textarea`?6:void 0,"aria-label":t.label,name:m.value,...w.splitAttrs.attributes.value,id:w.targetUid.value,maxlength:t.maxlength,disabled:t.disable,readonly:t.readonly};return T.value||(e.type=t.type),t.autogrow&&(e.rows=1),e});(0,e.watch)(()=>t.type,()=>{p.value&&(p.value.value=t.modelValue)}),(0,e.watch)(()=>t.modelValue,n=>{if(d!==null&&(I(),l=!1,u=!1,delete s.value),g.value){if(u&&(u=!1,String(n)===c))return;v(n)}else h.value!==n&&(h.value=n,t.type===`number`&&Object.hasOwn(s,`value`)&&(l?l=!1:delete s.value),t.modelModifiers?.trim===!0&&Object.hasOwn(s,`value`)&&(typeof s.value!=`string`||s.value.trim()!==n)&&delete s.value);t.autogrow&&(0,e.nextTick)(R)}),(0,e.watch)(()=>t.autogrow,t=>{t?(0,e.nextTick)(R):p.value!==null&&i.rows>0&&(p.value.style.height=`auto`)}),(0,e.watch)(()=>t.dense,()=>{t.autogrow&&(0,e.nextTick)(R)});function A(){Rn(()=>{let e=document.activeElement;p.value!==null&&p.value!==e&&(e===null||e.id!==w.targetUid.value)&&p.value.focus({preventScroll:!0})})}function j(){p.value?.select()}function M(e){if(g.value&&t.reverseFillMask!==!0){let t=e.target;_(t,t.selectionStart,t.selectionEnd)}n(`paste`,e)}function N(r){if(!r||!r.target)return;if(t.type===`file`){n(`update:modelValue`,r.target.files);return}let i=r.target.value;if(r.target.qComposing){s.value=i;return}if(g.value)v(i,!1,r.inputType);else if(t.modelModifiers?.trim===!0&&(s.value=i),F(i),D.value&&r.target===document.activeElement){let{selectionStart:t,selectionEnd:n}=r.target;t!==void 0&&n!==void 0&&(0,e.nextTick)(()=>{r.target===document.activeElement&&i.indexOf(r.target.value)===0&&r.target.setSelectionRange(t,n)})}t.autogrow&&R()}function P(e){n(`animationend`,e),R()}function F(r,i){f=()=>{d=null,t.type!==`number`&&(t.modelModifiers?.trim!==!0||g.value)&&Object.hasOwn(s,`value`)&&delete s.value,t.modelValue!==r&&c!==r&&(c=r,i===!0&&(u=!0),n(`update:modelValue`,r),(0,e.nextTick)(()=>{c===r&&(c=NaN)})),f=void 0},t.type===`number`&&(l=!0,s.value=r),t.debounce===void 0?f():(d!==null&&clearTimeout(d),s.value=r,d=setTimeout(f,t.debounce))}function I(){d!==null&&(clearTimeout(d),d=null),f=void 0}function L(){I(),l=!1,u=!1,delete s.value}function R(){requestAnimationFrame(()=>{let e=p.value;if(e!==null){let t=e.parentNode.style,{scrollTop:n}=e,{overflowY:r,maxHeight:i}=o.platform.is.firefox?{}:window.getComputedStyle(e),a=r!==void 0&&r!==`scroll`;a&&(e.style.overflowY=`hidden`),t.marginBottom=e.scrollHeight-1+`px`,e.style.height=`1px`,e.style.height=e.scrollHeight+`px`,a&&(e.style.overflowY=Number.parseInt(i,10){p.value!==null&&(p.value.value=h.value===void 0?``:h.value)},0)}function te(){return Object.hasOwn(s,`value`)?s.value:h.value===void 0?``:h.value}(0,e.onBeforeUnmount)(()=>{z()}),(0,e.onMounted)(()=>{t.autogrow&&R()}),Object.assign(w,{innerValue:h,fieldClass:(0,e.computed)(()=>`q-${T.value?`textarea`:`input`}`+(t.autogrow?` q-textarea--autogrow`:``)),hasShadow:(0,e.computed)(()=>t.type!==`file`&&typeof t.shadowText==`string`&&t.shadowText.length!==0),inputRef:p,emitValue:F,onClear:L,hasValue:S,floatingLabel:(0,e.computed)(()=>S.value&&(t.type!==`number`||Number.isFinite(Number(h.value)))||Pc(t.displayValue)),getControl:()=>(0,e.h)(T.value?`textarea`:`input`,{ref:p,class:[`q-field__native q-placeholder`,t.inputClass],style:t.inputStyle,...k.value,...O.value,...t.type===`file`?x.value:{value:te()}}),getShadowControl:()=>(0,e.h)(`div`,{class:`q-field__native q-field__shadow absolute-bottom no-pointer-events`+(T.value?``:` text-no-wrap`)},[(0,e.h)(`span`,{class:`invisible`},te()),(0,e.h)(`span`,t.shadowText)])});let B=Bc(w);return Object.assign(a,{focus:A,select:j,getNativeElement:()=>p.value}),r(a,`nativeEl`,()=>p.value),B}});let Tl={threshold:0,root:null,rootMargin:`0px`};function El(e,t,n){let r,i,a;typeof n==`function`?(r=n,i=Tl,a=t.cfg===void 0):(r=n.handler,i={...Tl,...n.cfg},a=t.cfg===void 0||!_e(t.cfg,i)),t.handler!==r&&(t.handler=r),a&&(t.cfg=i,t.observer?.disconnect(),t.observer=new IntersectionObserver(([n])=>{if(typeof t.handler==`function`){if(n.rootBounds===null&&document.body.contains(e)){t.observer.unobserve(e),t.observer.observe(e);return}(t.handler(n,t.observer)===!1||t.once&&n.isIntersecting)&&Dl(e)}},i),t.observer.observe(e))}function Dl(e){let t=e.__qvisible;t!==void 0&&(t.observer?.disconnect(),delete e.__qvisible)}var Ol=g({name:`intersection`,mounted(e,{modifiers:t,value:n}){let r={once:t.once===!0};El(e,r,n),e.__qvisible=r},updated(e,t){let n=e.__qvisible;n!==void 0&&El(e,n,t.value)},beforeUnmount:Dl}),kl=h({name:`QIntersection`,props:{tag:{type:String,default:`div`},once:Boolean,transition:String,transitionDuration:{type:[String,Number],default:300},ssrPrerender:Boolean,margin:String,threshold:[Number,Array],root:{default:null},disable:Boolean,onVisibility:Function},setup(t,{slots:n,emit:r}){let i=(0,e.ref)(a.value?t.ssrPrerender:!1),o=(0,e.computed)(()=>t.root!==void 0||t.margin!==void 0||t.threshold!==void 0?{handler:u,cfg:{root:t.root,rootMargin:t.margin,threshold:t.threshold}}:u),s=(0,e.computed)(()=>!t.disable&&(!a.value||!t.once||!t.ssrPrerender)),c=(0,e.computed)(()=>[[Ol,o.value,void 0,{once:t.once}]]),l=(0,e.computed)(()=>`--q-transition-duration: ${t.transitionDuration}ms`);function u(e){i.value!==e.isIntersecting&&(i.value=e.isIntersecting,t.onVisibility!==void 0&&r(`visibility`,i.value))}function d(){if(i.value)return[(0,e.h)(`div`,{key:`content`,style:l.value},X(n.default))];if(n.hidden!==void 0)return[(0,e.h)(`div`,{key:`hidden`,style:l.value},n.hidden())]}return()=>{let n=t.transition?[(0,e.h)(e.Transition,{name:`q-transition--`+t.transition},d)]:d();return $e(t.tag,{class:`q-intersection`},n,`main`,s.value,()=>c.value)}}});let Al=[`ul`,`ol`];var jl=h({name:`QList`,props:{...Q,bordered:Boolean,dense:Boolean,separator:Boolean,padding:Boolean,tag:{type:String,default:`div`}},setup(t,{slots:n}){let r=$(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>Al.includes(t.tag)?null:`list`),a=(0,e.computed)(()=>`q-list`+(t.bordered?` q-list--bordered`:``)+(t.dense?` q-list--dense`:``)+(t.separator?` q-list--separator`:``)+(r.value?` q-list--dark`:``)+(t.padding?` q-list--padding`:``));return()=>(0,e.h)(t.tag,{class:a.value,role:i.value},X(n.default))}});let Ml=[34,37,40,33,39,38],Nl=Object.keys(Yi);var Pl=h({name:`QKnob`,props:{...ai,...Yi,modelValue:{type:Number,required:!0},innerMin:Number,innerMax:Number,step:{type:Number,default:1,validator:e=>e>=0},tabindex:{type:[Number,String],default:0},disable:Boolean,readonly:Boolean},emits:[`update:modelValue`,`change`,`dragValue`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=(0,e.ref)(t.modelValue),s=(0,e.ref)(!1),c=(0,e.computed)(()=>!Number.isFinite(t.innerMin)||t.innerMin!Number.isFinite(t.innerMax)||t.innerMax>t.max?t.max:t.innerMax),u;function d(){o.value=t.modelValue===null?c.value:Pe(t.modelValue,c.value,l.value),A(!0)}(0,e.watch)(()=>`${t.modelValue}|${c.value}|${l.value}`,d),d();let f=(0,e.computed)(()=>!t.disable&&!t.readonly),p=(0,e.computed)(()=>`q-knob non-selectable`+(f.value?` q-knob--editable`:t.disable?` disabled`:``)),m=(0,e.computed)(()=>(String(t.step).trim().split(`.`)[1]||``).length),h=(0,e.computed)(()=>t.step===0?1:t.step),g=(0,e.computed)(()=>t.instantFeedback||s.value),_=a.platform.is.mobile?(0,e.computed)(()=>f.value?{onClick:T}:{}):(0,e.computed)(()=>f.value?{onMousedown:w,onClick:T,onKeydown:E,onKeyup:k}:{}),v=(0,e.computed)(()=>f.value?{tabindex:t.tabindex}:{[`aria-${t.disable?`disabled`:`readonly`}`]:`true`}),y=(0,e.computed)(()=>{let e={};return Nl.forEach(n=>{e[n]=t[n]}),e});function b(e){if(e.isFinal){D(e.evt,!0),s.value=!1;return}e.isFirst&&(S(),s.value=!0),D(e.evt,!1)}let x=(0,e.computed)(()=>[[na,b,void 0,{prevent:!0,stop:!0,mouse:!0}]]);function S(){let{top:e,left:t,width:n,height:r}=i.$el.getBoundingClientRect();u={top:e+r/2,left:t+n/2}}function w(e){S(),D(e,!1)}function T(e){S(),D(e,!0)}function E(e){if(!Ml.includes(e.keyCode))return;O(e);let t=([34,33].includes(e.keyCode)?10:1)*h.value,n=[34,37,40].includes(e.keyCode)?-t:t;o.value=Pe(Number.parseFloat((o.value+n).toFixed(m.value)),c.value,l.value),A(!1)}function D(e,n){let i=C(e),s=Math.abs(i.top-u.top),d=Math.hypot(s,i.left-u.left),f=Math.asin(s/d)*(180/Math.PI);f=i.top=h.value/2?(e<0?-1:1)*h.value:0),p=Number.parseFloat(p.toFixed(m.value))}p=Pe(p,c.value,l.value),r(`dragValue`,p),o.value!==p&&(o.value=p),A(n)}function k(e){Ml.includes(e.keyCode)&&A(!0)}function A(e){t.modelValue!==o.value&&r(`update:modelValue`,o.value),e&&r(`change`,o.value)}let j=oi(t);function M(){return(0,e.h)(`input`,j.value)}return()=>{let e={class:p.value,role:`slider`,"aria-valuemin":c.value,"aria-valuemax":l.value,"aria-valuenow":t.modelValue,...v.value,...y.value,value:o.value,instantFeedback:g.value,..._.value},r={default:n.default};return f.value&&t.name!==void 0&&(r.internal=M),$e(Qi,e,r,`knob`,f.value,()=>x.value)}}});let{passive:Fl}=v,Il=[`both`,`horizontal`,`vertical`];var Ll=h({name:`QScrollObserver`,props:{axis:{type:String,validator:e=>Il.includes(e),default:`vertical`},debounce:[String,Number],scrollTarget:er},emits:[`scroll`],setup(t,{emit:n}){let r={position:{top:0,left:0},direction:`down`,directionChanged:!1,delta:{top:0,left:0},inflectionPoint:{top:0,left:0}},i=null,a,o;(0,e.watch)(()=>t.scrollTarget,()=>{l(),c()});function s(){i?.();let e=Math.max(0,ar(a)),o=or(a),s={top:e-r.position.top,left:o-r.position.left};if(t.axis===`vertical`&&s.top===0||t.axis===`horizontal`&&s.left===0)return;let c=Math.abs(s.top)>=Math.abs(s.left)?s.top<0?`up`:`down`:s.left<0?`left`:`right`;r.position={top:e,left:o},r.directionChanged=r.direction!==c,r.delta=s,r.directionChanged&&(r.direction=c,r.inflectionPoint=r.position),n(`scroll`,{...r})}function c(){a=nr(o,t.scrollTarget),a.addEventListener(`scroll`,u,Fl),u(!0)}function l(){a!==void 0&&(a.removeEventListener(`scroll`,u,Fl),a=void 0)}function u(e){if(e===!0||t.debounce===0||t.debounce===`0`)s();else if(i===null){let[e,n]=t.debounce?[setTimeout(s,t.debounce),clearTimeout]:[requestAnimationFrame(s),cancelAnimationFrame];i=()=>{n(e),i=null}}}let{proxy:d}=(0,e.getCurrentInstance)();return(0,e.watch)(()=>d.$q.lang.rtl,s),(0,e.onMounted)(()=>{o=d.$el.parentNode,c()}),(0,e.onBeforeUnmount)(()=>{i?.(),l()}),Object.assign(d,{trigger:u,getPosition:()=>r}),y}});let Rl=/^(h|l)h(h|r) lpr (f|l)f(f|r)$/;var zl=h({name:`QLayout`,props:{container:Boolean,view:{type:String,default:`hhh lpr fff`,validator:e=>Rl.test(e.toLowerCase())},onScroll:Function,onScrollHeight:Function,onResize:Function},setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=(0,e.ref)(null),s=(0,e.ref)(i.screen.height),c=(0,e.ref)(t.container?0:i.screen.width),l=(0,e.ref)({position:0,direction:`down`,inflectionPoint:0}),u=(0,e.ref)(0),d=(0,e.ref)(a.value?0:mr()),f=(0,e.computed)(()=>`q-layout q-layout--`+(t.container?`containerized`:`standard`)),p=(0,e.computed)(()=>t.container?null:{minHeight:i.screen.height+`px`}),m=(0,e.computed)(()=>d.value===0?null:{[i.lang.rtl?`left`:`right`]:`${d.value}px`}),h=(0,e.computed)(()=>d.value===0?null:{[i.lang.rtl?`right`:`left`]:0,[i.lang.rtl?`left`:`right`]:`-${d.value}px`,width:`calc(100% + ${d.value}px)`});function g(e){if(t.container||!document.qScrollPrevented){let n={position:e.position.top,direction:e.direction,directionChanged:e.directionChanged,inflectionPoint:e.inflectionPoint.top,delta:e.delta.top};l.value=n,t.onScroll!==void 0&&r(`scroll`,n)}}function _(e){let{height:n,width:i}=e,a=!1;s.value!==n&&(a=!0,s.value=n,t.onScrollHeight!==void 0&&r(`scrollHeight`,n),y()),c.value!==i&&(a=!0,c.value=i),a&&t.onResize!==void 0&&r(`resize`,e)}function v({height:e}){u.value!==e&&(u.value=e,y())}function y(){if(t.container){let e=s.value>u.value?mr():0;d.value!==e&&(d.value=e)}}let b=null,x={instances:{},view:(0,e.computed)(()=>t.view),isContainer:(0,e.computed)(()=>t.container),rootRef:o,height:s,containerHeight:u,scrollbarWidth:d,totalWidth:(0,e.computed)(()=>c.value+d.value),rows:(0,e.computed)(()=>{let e=t.view.toLowerCase().split(` `);return{top:[...e[0]],middle:[...e[1]],bottom:[...e[2]]}}),header:(0,e.reactive)({size:0,offset:0,space:!1}),right:(0,e.reactive)({size:300,offset:0,space:!1}),footer:(0,e.reactive)({size:0,offset:0,space:!1}),left:(0,e.reactive)({size:300,offset:0,space:!1}),scroll:l,animate(){b===null?document.body.classList.add(`q-body--layout-animate`):clearTimeout(b),b=setTimeout(()=>{b=null,document.body.classList.remove(`q-body--layout-animate`)},155)},update(e,t,n){x[e][t]=n}};if((0,e.provide)(fe,x),mr()>0){let n=null,r=document.body,a=()=>{n=null,r.classList.remove(`hide-scrollbar`)},o=()=>{if(n===null){if(r.scrollHeight>i.screen.height)return;r.classList.add(`hide-scrollbar`)}else clearTimeout(n);n=setTimeout(a,300)},s=e=>{n!==null&&e===`remove`&&(clearTimeout(n),a()),window[`${e}EventListener`](`resize`,o)};(0,e.watch)(()=>t.container?`remove`:`add`,s),t.container||s(`add`),(0,e.onUnmounted)(()=>{s(`remove`)})}return()=>{let r=Ze(n.default,[(0,e.h)(Ll,{onScroll:g}),(0,e.h)(ma,{onResize:_})]),i=(0,e.h)(`div`,{class:f.value,style:p.value,ref:t.container?void 0:o,tabindex:-1},r);return t.container?(0,e.h)(`div`,{class:`q-layout-container overflow-hidden`,ref:o},[(0,e.h)(ma,{onResize:v}),(0,e.h)(`div`,{class:`absolute-full`,style:m.value},[(0,e.h)(`div`,{class:`scroll`,style:h.value},[i])])]):i}}});let Bl={xs:2,sm:4,md:6,lg:10,xl:14};function Vl(e,t,n){return{transform:t?`translateX(${n.lang.rtl?`-`:``}100%) scale3d(${-e},1,1)`:`scale3d(${e},1,1)`}}var Hl=h({name:`QLinearProgress`,props:{...Q,...Je,value:{type:Number,default:0},buffer:Number,color:String,trackColor:String,reverse:Boolean,stripe:Boolean,indeterminate:Boolean,query:Boolean,rounded:Boolean,animationSpeed:{type:[String,Number],default:2100},instantFeedback:Boolean},setup(t,{slots:n}){let{proxy:r}=(0,e.getCurrentInstance)(),i=$(t,r.$q),a=Ye(t,Bl),o=(0,e.computed)(()=>t.indeterminate||t.query),s=(0,e.computed)(()=>t.reverse!==t.query),c=(0,e.computed)(()=>({...a.value===null?{}:a.value,"--q-linear-progress-speed":`${t.animationSpeed}ms`})),l=(0,e.computed)(()=>`q-linear-progress`+(t.color===void 0?``:` text-${t.color}`)+(t.reverse||t.query?` q-linear-progress--reverse`:``)+(t.rounded?` rounded-borders`:``)),u=(0,e.computed)(()=>Vl(t.buffer===void 0?1:t.buffer,s.value,r.$q)),d=(0,e.computed)(()=>`with${t.instantFeedback?`out`:``}-transition`),f=(0,e.computed)(()=>`q-linear-progress__track absolute-full q-linear-progress__track--${d.value} q-linear-progress__track--${i.value?`dark`:`light`}`+(t.trackColor===void 0?``:` bg-${t.trackColor}`)),p=(0,e.computed)(()=>Vl(o.value?1:t.value,s.value,r.$q)),m=(0,e.computed)(()=>`q-linear-progress__model absolute-full q-linear-progress__model--${d.value} q-linear-progress__model--${o.value?`in`:``}determinate`),h=(0,e.computed)(()=>({width:`${t.value*100}%`})),g=(0,e.computed)(()=>`q-linear-progress__stripe absolute-${t.reverse?`right`:`left`} q-linear-progress__stripe--${d.value}`);return()=>{let r=[(0,e.h)(`div`,{class:f.value,style:u.value}),(0,e.h)(`div`,{class:m.value,style:p.value})];return t.stripe&&!o.value&&r.push((0,e.h)(`div`,{class:g.value,style:h.value})),(0,e.h)(`div`,{class:l.value,style:c.value,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":t.indeterminate?void 0:t.value},Ze(n.default,r))}}});let Ul=[`horizontal`,`vertical`,`cell`,`none`];var Wl=h({name:`QMarkupTable`,props:{...Q,dense:Boolean,flat:Boolean,bordered:Boolean,square:Boolean,wrapCells:Boolean,separator:{type:String,default:`horizontal`,validator:e=>Ul.includes(e)}},setup(t,{slots:n}){let r=$(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>`q-markup-table q-table__container q-table__card q-table--${t.separator}-separator`+(r.value?` q-table--dark q-table__card--dark q-dark`:``)+(t.dense?` q-table--dense`:``)+(t.flat?` q-table--flat`:``)+(t.bordered?` q-table--bordered`:``)+(t.square?` q-table--square`:``)+(t.wrapCells?``:` q-table--no-wrap`));return()=>(0,e.h)(`div`,{class:i.value},[(0,e.h)(`table`,{class:`q-table`},X(n.default))])}}),Gl=h({name:`QNoSsr`,props:{tag:{type:String,default:`div`},placeholder:String},setup(t,{slots:n}){let{isHydrated:r}=da();return()=>{if(r.value){let r=X(n.default);return r===void 0?r:r.length>1?(0,e.h)(t.tag,{},r):r[0]}let i={class:`q-no-ssr-placeholder`},a=X(n.placeholder);if(a!==void 0)return a.length>1?(0,e.h)(t.tag,i,a):a[0];if(t.placeholder!==void 0)return(0,e.h)(t.tag,i,t.placeholder)}}});let Kl=()=>(0,e.h)(`svg`,{key:`svg`,class:`q-radio__bg absolute non-selectable`,viewBox:`0 0 24 24`},[(0,e.h)(`path`,{d:`M12,22a10,10 0 0 1 -10,-10a10,10 0 0 1 10,-10a10,10 0 0 1 10,10a10,10 0 0 1 -10,10m0,-22a12,12 0 0 0 -12,12a12,12 0 0 0 12,12a12,12 0 0 0 12,-12a12,12 0 0 0 -12,-12`}),(0,e.h)(`path`,{class:`q-radio__check`,d:`M12,6a6,6 0 0 0 -6,6a6,6 0 0 0 6,6a6,6 0 0 0 6,-6a6,6 0 0 0 -6,-6`})]);function ql(e){(e.keyCode===13||e.keyCode===32)&&O(e)}var Jl=h({name:`QRadio`,props:{...Q,...Je,...ai,modelValue:{required:!0},val:{required:!0},label:String,leftLabel:Boolean,checkedIcon:String,uncheckedIcon:String,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},emits:[`update:modelValue`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),a=$(t,i.$q),o=Ye(t,zi),s=(0,e.ref)(null),{refocusTargetEl:c,refocusTarget:l}=Ri(t,s),u=(0,e.computed)(()=>(0,e.toRaw)(t.modelValue)===(0,e.toRaw)(t.val)),d=(0,e.computed)(()=>`q-radio cursor-pointer no-outline row inline no-wrap items-center`+(t.disable?` disabled`:``)+(a.value?` q-radio--dark`:``)+(t.dense?` q-radio--dense`:``)+(t.leftLabel?` reverse`:``)),f=(0,e.computed)(()=>{let e=t.color!==void 0&&(t.keepColor||u.value)?` text-${t.color}`:``;return`q-radio__inner relative-position q-radio__inner--${u.value?`truthy`:`falsy`}${e}`}),p=(0,e.computed)(()=>(u.value?t.checkedIcon:t.uncheckedIcon)||null),m=(0,e.computed)(()=>t.disable?-1:t.tabindex||0),h=si((0,e.computed)(()=>{let e={type:`radio`};return t.name!==void 0&&Object.assign(e,{".checked":u.value,"^checked":u.value?`checked`:void 0,name:t.name,value:t.val}),e}));function g(e){e!==void 0&&(O(e),l(e)),!t.disable&&!u.value&&r(`update:modelValue`,t.val,e)}function _(e){(e.keyCode===13||e.keyCode===32)&&g(e)}Object.assign(i,{set:g});let v=Kl();return()=>{let r=p.value===null?[v]:[(0,e.h)(`div`,{key:`icon`,class:`q-radio__icon-container absolute-full flex flex-center no-wrap`},[(0,e.h)(Z,{class:`q-radio__icon`,name:p.value})])];t.disable||h(r,`unshift`,` q-radio__native q-ma-none q-pa-none`);let i=[(0,e.h)(`div`,{class:f.value,style:o.value,"aria-hidden":`true`},r)];c.value!==null&&i.push(c.value);let a=t.label===void 0?X(n.default):Ze(n.default,[t.label]);return a!==void 0&&i.push((0,e.h)(`div`,{class:`q-radio__label q-anchor--skip`},a)),(0,e.h)(`div`,{ref:s,class:d.value,tabindex:m.value,role:`radio`,"aria-label":t.label,"aria-checked":u.value?`true`:`false`,"aria-disabled":t.disable?`true`:void 0,onClick:g,onKeydown:ql,onKeyup:_},i)}}}),Yl=h({name:`QToggle`,props:{...Bi,icon:String,iconColor:String},emits:Vi,setup(t){function n(n,r){let i=(0,e.computed)(()=>(n.value?t.checkedIcon:r.value?t.indeterminateIcon:t.uncheckedIcon)||t.icon),a=(0,e.computed)(()=>n.value?t.iconColor:null);return()=>[(0,e.h)(`div`,{class:`q-toggle__track`}),(0,e.h)(`div`,{class:`q-toggle__thumb absolute flex flex-center no-wrap`},i.value===void 0?void 0:[(0,e.h)(Z,{name:i.value,color:a.value})])]}return Ui(`toggle`,n)}});let Xl={radio:Jl,checkbox:Gi,toggle:Yl},Zl=Object.keys(Xl);function Ql(e,t){if(typeof e==`function`)return e;let n=e===void 0?t:e;return e=>e[n]}var $l=h({name:`QOptionGroup`,props:{...Q,modelValue:{required:!0},options:{type:Array,validator:e=>e.every(ve),default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],name:String,type:{type:String,default:`radio`,validator:e=>Zl.includes(e)},color:String,keepColor:Boolean,dense:Boolean,size:String,leftLabel:Boolean,inline:Boolean,disable:Boolean},emits:[`update:modelValue`],setup(t,{emit:n,slots:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=Array.isArray(t.modelValue);t.type===`radio`?a&&console.error(`q-option-group: model should not be array`):a||console.error(`q-option-group: model should be array in your case`);let o=$(t,i),s=(0,e.computed)(()=>Xl[t.type]),c=(0,e.computed)(()=>Ql(t.optionValue,`value`)),l=(0,e.computed)(()=>Ql(t.optionLabel,`label`)),u=(0,e.computed)(()=>Ql(t.optionDisable,`disable`)),d=(0,e.computed)(()=>t.options.map(e=>({val:c.value(e),name:e.name===void 0?t.name:e.name,disable:t.disable||u.value(e),leftLabel:e.leftLabel===void 0?t.leftLabel:e.leftLabel,color:e.color===void 0?t.color:e.color,checkedIcon:e.checkedIcon,uncheckedIcon:e.uncheckedIcon,dark:e.dark===void 0?o.value:e.dark,size:e.size===void 0?t.size:e.size,dense:t.dense,keepColor:e.keepColor===void 0?t.keepColor:e.keepColor}))),f=(0,e.computed)(()=>`q-option-group q-gutter-x-sm`+(t.inline?` q-option-group--inline`:``)),p=(0,e.computed)(()=>{let e={role:`group`};return t.type===`radio`&&(e.role=`radiogroup`,t.disable&&(e[`aria-disabled`]=`true`)),e});function m(e){n(`update:modelValue`,e)}return()=>(0,e.h)(`div`,{class:f.value,...p.value},t.options.map((n,i)=>{let a=r[`label-`+i]===void 0?r.label===void 0?void 0:()=>r.label(n):()=>r[`label-`+i](n);return(0,e.h)(`div`,[(0,e.h)(s.value,{label:a===void 0?l.value(n):null,modelValue:t.modelValue,"onUpdate:modelValue":m,...d.value[i]},a)])}))}}),eu=h({name:`QPage`,props:{padding:Boolean,styleFn:Function},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=(0,e.inject)(fe,J);if(i===J)return console.error(`QPage needs to be a deep child of QLayout`),J;if((0,e.inject)(`_q_pc_`,J)===J)return console.error(`QPage needs to be child of QPageContainer`),J;let a=(0,e.computed)(()=>{let e=(i.header.space?i.header.size:0)+(i.footer.space?i.footer.size:0);if(typeof t.styleFn==`function`){let n=i.isContainer.value?i.containerHeight.value:r.screen.height;return t.styleFn(e,n)}return{minHeight:i.isContainer.value?i.containerHeight.value-e+`px`:r.screen.height===0?e===0?`100vh`:`calc(100vh - ${e}px)`:r.screen.height-e+`px`}}),o=(0,e.computed)(()=>`q-page${t.padding?` q-layout-padding`:``}`);return()=>(0,e.h)(`main`,{class:o.value,style:a.value},X(n.default))}}),tu=h({name:`QPageContainer`,setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=(0,e.inject)(fe,J);if(i===J)return console.error(`QPageContainer needs to be child of QLayout`),J;(0,e.provide)(`_q_pc_`,!0);let a=(0,e.computed)(()=>{let e={};return i.header.space&&(e.paddingTop=`${i.header.size}px`),i.right.space&&(e[`padding${r.lang.rtl?`Left`:`Right`}`]=`${i.right.size}px`),i.footer.space&&(e.paddingBottom=`${i.footer.size}px`),i.left.space&&(e[`padding${r.lang.rtl?`Right`:`Left`}`]=`${i.left.size}px`),e});return()=>(0,e.h)(`div`,{class:`q-page-container`,style:a.value},X(n.default))}});let nu={position:{type:String,default:`bottom-right`,validator:e=>[`top-right`,`top-left`,`bottom-right`,`bottom-left`,`top`,`right`,`bottom`,`left`].includes(e)},offset:{type:Array,validator:e=>e.length===2},expand:Boolean};function ru(){let{props:t,proxy:{$q:n}}=(0,e.getCurrentInstance)(),r=(0,e.inject)(fe,J);if(r===J)return console.error(`QPageSticky needs to be child of QLayout`),J;let i=(0,e.computed)(()=>{let e=t.position;return{top:e.includes(`top`),right:e.includes(`right`),bottom:e.includes(`bottom`),left:e.includes(`left`),vertical:e===`top`||e===`bottom`,horizontal:e===`left`||e===`right`}}),a=(0,e.computed)(()=>r.header.offset),o=(0,e.computed)(()=>r.right.offset),s=(0,e.computed)(()=>r.footer.offset),c=(0,e.computed)(()=>r.left.offset),l=(0,e.computed)(()=>{let e=0,r=0,l=i.value,u=n.lang.rtl?-1:1;l.top&&a.value!==0?r=`${a.value}px`:l.bottom&&s.value!==0&&(r=`${-s.value}px`),l.left&&c.value!==0?e=`${u*c.value}px`:l.right&&o.value!==0&&(e=`${-u*o.value}px`);let d={transform:`translate(${e}, ${r})`};return t.offset&&(d.margin=`${t.offset[1]}px ${t.offset[0]}px`),l.vertical?(c.value!==0&&(d[n.lang.rtl?`right`:`left`]=`${c.value}px`),o.value!==0&&(d[n.lang.rtl?`left`:`right`]=`${o.value}px`)):l.horizontal&&(a.value!==0&&(d.top=`${a.value}px`),s.value!==0&&(d.bottom=`${s.value}px`)),d}),u=(0,e.computed)(()=>`q-page-sticky row flex-center fixed-${t.position} q-page-sticky--${t.expand?`expand`:`shrink`}`);function d(n){let r=X(n.default);return(0,e.h)(`div`,{class:u.value,style:l.value},t.expand?r:[(0,e.h)(`div`,r)])}return{$layout:r,getStickyContent:d}}var iu=h({name:`QPageScroller`,props:{...nu,scrollOffset:{type:Number,default:1e3},reverse:Boolean,duration:{type:Number,default:300},offset:{...nu.offset,default:()=>[18,18]}},emits:[`click`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),{$layout:a,getStickyContent:o}=ru(),s=(0,e.ref)(null),c,l=(0,e.computed)(()=>a.height.value-(a.isContainer.value?a.containerHeight.value:i.screen.height));function u(){return t.reverse?l.value-a.scroll.value.position>t.scrollOffset:a.scroll.value.position>t.scrollOffset}let d=(0,e.ref)(u());function f(){let e=u();d.value!==e&&(d.value=e)}function p(){t.reverse?c===void 0&&(c=(0,e.watch)(l,f)):m()}(0,e.watch)(a.scroll,f),(0,e.watch)(()=>t.reverse,p);function m(){c!==void 0&&(c(),c=void 0)}function h(e){dr(nr(a.isContainer.value?s.value:a.rootRef.value),t.reverse?a.height.value:0,t.duration),r(`click`,e)}function g(){return d.value?(0,e.h)(`div`,{ref:s,class:`q-page-scroller`,onClick:h},o(n)):null}return p(),(0,e.onBeforeUnmount)(m),()=>(0,e.h)(e.Transition,{name:`q-transition--fade`},g)}}),au=h({name:`QPageSticky`,props:nu,setup(e,{slots:t}){let{getStickyContent:n}=ru();return()=>n(t)}});function ou(e,t){return e===!0||e===!1?e:t}var su=h({name:`QPagination`,props:{...Q,modelValue:{type:Number,required:!0},min:{type:[Number,String],default:1},max:{type:[Number,String],required:!0},maxPages:{type:[Number,String],default:0,validator:e=>(typeof e==`string`?Number.parseInt(e,10):e)>=0},inputStyle:[Array,String,Object],inputClass:[Array,String,Object],size:String,disable:Boolean,input:Boolean,iconPrev:String,iconNext:String,iconFirst:String,iconLast:String,toFn:Function,boundaryLinks:{type:Boolean,default:null},boundaryNumbers:{type:Boolean,default:null},directionLinks:{type:Boolean,default:null},ellipses:{type:Boolean,default:null},ripple:{type:[Boolean,Object],default:null},round:Boolean,rounded:Boolean,flat:Boolean,outline:Boolean,unelevated:Boolean,push:Boolean,glossy:Boolean,color:{type:String,default:`primary`},textColor:String,activeDesign:{type:String,default:``,values:e=>e===``||cn.includes(e)},activeColor:String,activeTextColor:String,gutter:String,padding:{type:String,default:`3px 2px`}},emits:[`update:modelValue`],setup(t,{emit:n}){let{proxy:r}=(0,e.getCurrentInstance)(),{$q:i}=r,a=$(t,i),o=(0,e.computed)(()=>Number.parseInt(t.min,10)),s=(0,e.computed)(()=>Number.parseInt(t.max,10)),c=(0,e.computed)(()=>Number.parseInt(t.maxPages,10)),l=(0,e.computed)(()=>h.value+` / `+s.value),u=(0,e.computed)(()=>ou(t.boundaryLinks,t.input)),d=(0,e.computed)(()=>ou(t.boundaryNumbers,!t.input)),f=(0,e.computed)(()=>ou(t.directionLinks,t.input)),p=(0,e.computed)(()=>ou(t.ellipses,!t.input)),m=(0,e.ref)(null),h=(0,e.computed)({get:()=>t.modelValue,set:e=>{if(e=Number.parseInt(e,10),t.disable||!Number.isFinite(e))return;let r=Pe(e,o.value,s.value);t.modelValue!==r&&n(`update:modelValue`,r)}});(0,e.watch)(()=>`${o.value}|${s.value}`,()=>{h.value=t.modelValue});let g=(0,e.computed)(()=>`q-pagination row no-wrap items-center`+(t.disable?` disabled`:``)),_=(0,e.computed)(()=>t.gutter in rn?`${rn[t.gutter]}px`:t.gutter||null),v=(0,e.computed)(()=>_.value===null?null:`--q-pagination-gutter-parent:-${_.value};--q-pagination-gutter-child:${_.value}`),y=(0,e.computed)(()=>{let e=[t.iconFirst||i.iconSet.pagination.first,t.iconPrev||i.iconSet.pagination.prev,t.iconNext||i.iconSet.pagination.next,t.iconLast||i.iconSet.pagination.last];return i.lang.rtl?e.reverse():e}),b=(0,e.computed)(()=>({"aria-disabled":t.disable?`true`:`false`,role:`navigation`})),x=(0,e.computed)(()=>ln(t,`flat`)),S=(0,e.computed)(()=>({[x.value]:!0,round:t.round,rounded:t.rounded,padding:t.padding,color:t.color,textColor:t.textColor,size:t.size,ripple:t.ripple===null||t.ripple})),C=(0,e.computed)(()=>{let e={[x.value]:!1};return t.activeDesign!==``&&(e[t.activeDesign]=!0),e}),w=(0,e.computed)(()=>({...C.value,color:t.activeColor||t.color,textColor:t.activeTextColor||t.textColor})),T=(0,e.computed)(()=>{let e=Math.max(c.value,1+(p.value?2:0)+(d.value?2:0)),n={pgFrom:o.value,pgTo:s.value,ellipsesStart:!1,ellipsesEnd:!1,boundaryStart:!1,boundaryEnd:!1,marginalStyle:{minWidth:`${Math.max(2,String(s.value).length)}em`}};return c.value&&eo.value+ +!!d.value&&(n.ellipsesStart=!0,n.pgFrom++),d.value&&(n.boundaryEnd=!0,n.pgTo--),p.value&&n.pgTo{E(r)}:a.to=t.toFn(r)),(0,e.h)(yn,a)}return Object.assign(r,{set:E,setByOffset:D}),()=>{let n=[],r=[],c;if(u.value&&(n.push(j({key:`bls`,disable:t.disable||t.modelValue<=o.value,icon:y.value[0],"aria-label":i.lang.pagination.first},o.value)),r.unshift(j({key:`ble`,disable:t.disable||t.modelValue>=s.value,icon:y.value[3],"aria-label":i.lang.pagination.last},s.value))),f.value&&(n.push(j({key:`bdp`,disable:t.disable||t.modelValue<=o.value,icon:y.value[1],"aria-label":i.lang.pagination.prev},t.modelValue-1)),r.unshift(j({key:`bdn`,disable:t.disable||t.modelValue>=s.value,icon:y.value[2],"aria-label":i.lang.pagination.next},t.modelValue+1))),!t.input){c=[];let{pgFrom:e,pgTo:i,marginalStyle:a}=T.value;T.value.boundaryStart&&n.push(j({key:`bns`,style:a,disable:t.disable,label:o.value},o.value,o.value===t.modelValue)),T.value.boundaryEnd&&r.unshift(j({key:`bne`,style:a,disable:t.disable,label:s.value},s.value,s.value===t.modelValue)),T.value.ellipsesStart&&n.push(j({key:`bes`,style:a,disable:t.disable,label:`…`,ripple:!1},e-1)),T.value.ellipsesEnd&&r.unshift(j({key:`bee`,style:a,disable:t.disable,label:`…`,ripple:!1},i+1));for(let n=e;n<=i;n++)c.push(j({key:`bpg${n}`,style:a,disable:t.disable,label:n},n,n===t.modelValue))}return(0,e.h)(`div`,{class:g.value,...b.value},[(0,e.h)(`div`,{class:`q-pagination__content row no-wrap items-center`,style:v.value},[...n,t.input?(0,e.h)(wl,{class:`inline`,style:{width:`${l.value.length/1.5}em`},type:`number`,dense:!0,value:m.value,disable:t.disable,dark:a.value,borderless:!0,inputClass:t.inputClass,inputStyle:t.inputStyle,placeholder:l.value,min:o.value,max:s.value,"onUpdate:modelValue":k,onKeyup:A,onBlur:O}):(0,e.h)(`div`,{class:`q-pagination__middle row justify-center`},c),...r])])}}});function cu(e){let t=null,n=null,r=null;function i(...i){n=i,r=this,t===null&&(t=window.requestAnimationFrame(()=>{e.apply(r,n),t=null,n=null,r=null}))}return i.cancel=()=>{t!==null&&(window.cancelAnimationFrame(t),t=null),n=null,r=null},i}let{passive:lu}=v,uu=[`load`,`loadstart`,`loadedmetadata`];var du=h({name:`QParallax`,props:{src:String,height:{type:Number,default:500},speed:{type:Number,default:1,validator:e=>e>=0&&e<=1},scrollTarget:er,onScroll:Function},setup(t,{slots:n,emit:r}){let i=(0,e.ref)(0),a=(0,e.ref)(null),o=(0,e.ref)(null),s=(0,e.ref)(null),c=!1,l,u,d,f,p;(0,e.watch)(()=>t.height,()=>{c&&h()}),(0,e.watch)(()=>t.scrollTarget,()=>{c&&(y(),v())});let m=e=>{i.value=e,t.onScroll!==void 0&&r(`scroll`,e)};function h(){let e,n,r;p===window?(e=0,r=n=window.innerHeight):(e=Ut(p).top,n=Gt(p),r=e+n);let i=Ut(a.value).top,o=i+t.height;if(f!==void 0||o>e&&i{l.style.transform=`translate3d(-50%,${Math.round(e)}px,0)`};function _(){u=l.naturalHeight||l.videoHeight||Gt(l),c&&h()}function v(){c=!0,p=nr(a.value,t.scrollTarget),p.addEventListener(`scroll`,h,lu),window.addEventListener(`resize`,d,lu),h()}function y(){c&&(c=!1,p.removeEventListener(`scroll`,h,lu),window.removeEventListener(`resize`,d,lu),p=void 0,g.cancel(),m.cancel(),d.cancel())}return(0,e.onMounted)(()=>{g=cu(g),m=cu(m),d=cu(_),l=n.media===void 0?s.value:o.value.children[0],uu.forEach(e=>{l.addEventListener(e,_)}),_(),l.style.display=`initial`,window.IntersectionObserver===void 0?v():(f=new IntersectionObserver(e=>{(e[0].isIntersecting?v:y)()}),f.observe(a.value))}),(0,e.onBeforeUnmount)(()=>{y(),f?.disconnect(),uu.forEach(e=>{l.removeEventListener(e,_)})}),()=>(0,e.h)(`div`,{ref:a,class:`q-parallax`,style:{height:`${t.height}px`}},[(0,e.h)(`div`,{ref:o,class:`q-parallax__media absolute-full`},n.media===void 0?[(0,e.h)(`img`,{ref:s,src:t.src})]:n.media()),(0,e.h)(`div`,{class:`q-parallax__content absolute-full column flex-center`},n.content===void 0?X(n.default):n.content({percentScrolled:i.value}))])}});function fu(e,t=new WeakMap){if(Object(e)!==e)return e;if(t.has(e))return t.get(e);let n=e instanceof Date?new Date(e):e instanceof RegExp?new RegExp(e.source,e.flags):e instanceof Set?new Set:e instanceof Map?new Map:typeof e.constructor==`function`?e.prototype!==void 0&&typeof e.prototype.constructor==`function`?e:new e.constructor:Object.create(null);if(typeof e.constructor==`function`&&typeof e.valueOf==`function`){let n=e.valueOf();if(Object(n)!==n){let r=new e.constructor(n);return t.set(e,r),r}}return t.set(e,n),e instanceof Set?e.forEach(e=>{n.add(fu(e,t))}):e instanceof Map&&e.forEach((e,r)=>{n.set(r,fu(e,t))}),Object.assign(n,...Object.keys(e).map(n=>({[n]:fu(e[n],t)})))}var pu=h({name:`QPopupEdit`,props:{modelValue:{required:!0},title:String,buttons:Boolean,labelSet:String,labelCancel:String,color:{type:String,default:`primary`},validate:{type:Function,default:()=>!0},autoSave:Boolean,cover:{type:Boolean,default:!0},disable:Boolean},emits:[`update:modelValue`,`save`,`cancel`,`beforeShow`,`show`,`beforeHide`,`hide`],setup(t,{slots:n,emit:i}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:o}=a,s=(0,e.ref)(null),c=(0,e.ref)(``),l=(0,e.ref)(``),u=!1,d=(0,e.computed)(()=>r({initialValue:c.value,validate:t.validate,set:f,cancel:p,updatePosition:m},`value`,()=>l.value,e=>{l.value=e}));function f(){t.validate(l.value)&&(h()&&(i(`save`,l.value,c.value),i(`update:modelValue`,l.value)),g())}function p(){h()&&i(`cancel`,l.value,c.value),g()}function m(){(0,e.nextTick)(()=>{s.value.updatePosition()})}function h(){return!_e(l.value,c.value)}function g(){u=!0,s.value.hide()}function _(){u=!1,c.value=fu(t.modelValue),l.value=fu(t.modelValue),i(`beforeShow`)}function v(){i(`show`)}function y(){!u&&h()&&(t.autoSave&&t.validate(l.value)?(i(`save`,l.value,c.value),i(`update:modelValue`,l.value)):i(`cancel`,l.value,c.value)),i(`beforeHide`)}function b(){i(`hide`)}function x(){let r=n.default===void 0?[]:[n.default(d.value)].flat();return t.title&&r.unshift((0,e.h)(`div`,{class:`q-dialog__title q-mt-sm q-mb-sm`},t.title)),t.buttons&&r.push((0,e.h)(`div`,{class:`q-popup-edit__buttons row justify-center no-wrap`},[(0,e.h)(yn,{flat:!0,color:t.color,label:t.labelCancel||o.lang.label.cancel,onClick:p}),(0,e.h)(yn,{flat:!0,color:t.color,label:t.labelSet||o.lang.label.set,onClick:f})])),r}return Object.assign(a,{set:f,cancel:p,show(e){s.value?.show(e)},hide(e){s.value?.hide(e)},updatePosition:m}),()=>{if(!t.disable)return(0,e.h)(Xr,{ref:s,class:`q-popup-edit`,cover:t.cover,onBeforeShow:_,onShow:v,onBeforeHide:y,onHide:b,onEscapeKey:p},x)}}}),mu=h({name:`QPopupProxy`,props:{...Cn,breakpoint:{type:[String,Number],default:450}},emits:[`show`,`hide`],setup(t,{slots:n,emit:i,attrs:a}){let{proxy:o}=(0,e.getCurrentInstance)(),{$q:s}=o,c=(0,e.ref)(!1),l=(0,e.ref)(null),u=(0,e.computed)(()=>Number.parseInt(t.breakpoint,10)),{canShow:d}=wn({showing:c,avoidEmit:!0});function f(){return s.screen.widthp.value===`menu`?{maxHeight:`99vh`}:{});(0,e.watch)(()=>f(),e=>{c.value||(p.value=e)});function h(e){c.value=!0,i(`show`,e)}function g(e){c.value=!1,p.value=f(),i(`hide`,e)}return Object.assign(o,{show(e){d(e)&&l.value.show(e)},hide(e){l.value.hide(e)},toggle(e){l.value.toggle(e)}}),r(o,`currentComponent`,()=>({type:p.value,ref:l.value})),()=>{let r={ref:l,...m.value,...a,onShow:h,onHide:g},i;return p.value===`dialog`?i=Rs:(i=Xr,Object.assign(r,{target:t.target,contextMenu:t.contextMenu,noParentEvent:!0,separateClosePopup:!0})),(0,e.h)(i,r,n.default)}}}),hu=h({name:`QPullToRefresh`,props:{color:String,bgColor:String,icon:String,noMouse:Boolean,disable:Boolean,scrollTarget:er},emits:[`refresh`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=(0,e.ref)(`pull`),s=(0,e.ref)(0),c=(0,e.ref)(!1),l=(0,e.ref)(-40),u=(0,e.ref)(!1),d=(0,e.ref)({}),f=(0,e.computed)(()=>({opacity:s.value,transform:`translateY(${l.value}px) rotate(${s.value*360}deg)`})),p=(0,e.computed)(()=>`q-pull-to-refresh__puller row flex-center`+(u.value?` q-pull-to-refresh__puller--animating`:``)+(t.bgColor===void 0?``:` bg-${t.bgColor}`));function m(e){if(e.isFinal){c.value&&(c.value=!1,o.value===`pulled`?(o.value=`refreshing`,b({pos:20}),_()):o.value===`pull`&&b({pos:-40,ratio:0}));return}if(u.value||o.value===`refreshing`)return!1;if(e.isFirst){if(ar(v)!==0||e.direction!==`down`)return c.value&&(c.value=!1,o.value=`pull`,b({pos:-40,ratio:0})),!1;c.value=!0;let{top:t,left:n}=i.$el.getBoundingClientRect();d.value={top:t+`px`,left:n+`px`,width:window.getComputedStyle(i.$el).getPropertyValue(`width`)}}D(e.evt);let t=Math.min(140,Math.max(0,e.distance.y));l.value=t-40,s.value=Pe(t/60,0,1);let n=l.value>20?`pulled`:`pull`;o.value!==n&&(o.value=n)}let h=(0,e.computed)(()=>{let e={down:!0};return t.noMouse||(e.mouse=!0),[[na,m,void 0,e]]}),g=(0,e.computed)(()=>`q-pull-to-refresh__content${c.value?` no-pointer-events`:``}`);function _(){r(`refresh`,()=>{b({pos:-40,ratio:0},()=>{o.value=`pull`})})}let v,y=null;function b({pos:e,ratio:t},n){u.value=!0,l.value=e,t!==void 0&&(s.value=t),y!==null&&clearTimeout(y),y=setTimeout(()=>{y=null,u.value=!1,n?.()},300)}function x(){v=nr(i.$el,t.scrollTarget)}return(0,e.watch)(()=>t.scrollTarget,x),(0,e.onMounted)(x),(0,e.onBeforeUnmount)(()=>{y!==null&&clearTimeout(y)}),Object.assign(i,{trigger:_,updateScrollTarget:x}),()=>$e(`div`,{class:`q-pull-to-refresh`},[(0,e.h)(`div`,{class:g.value},X(n.default)),(0,e.h)(`div`,{class:`q-pull-to-refresh__puller-container fixed row flex-center no-pointer-events z-top`,style:d.value},[(0,e.h)(`div`,{class:p.value,style:f.value},[o.value===`refreshing`?(0,e.h)(Ht,{size:`24px`,color:t.color}):(0,e.h)(Z,{name:t.icon||a.iconSet.pullToRefresh.icon,color:t.color,size:`32px`})])])],`main`,!t.disable,()=>h.value)}});let gu={MIN:0,RANGE:1,MAX:2};var _u=h({name:`QRange`,props:{...oa,modelValue:{type:Object,default:()=>({min:null,max:null}),validator:e=>`min`in e&&`max`in e},dragRange:Boolean,dragOnlyRange:Boolean,leftLabelColor:String,leftLabelTextColor:String,rightLabelColor:String,rightLabelTextColor:String,leftLabelValue:[String,Number],rightLabelValue:[String,Number],leftThumbColor:String,rightThumbColor:String},emits:sa,setup(t,{emit:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),{state:i,methods:a}=ca({updateValue:T,updatePosition:D,getDragging:E,formAttrs:(0,e.computed)(()=>({type:`hidden`,name:t.name,value:`${t.modelValue.min}|${t.modelValue.max}`}))}),o=(0,e.ref)(null),s=(0,e.ref)(0),c=(0,e.ref)(0),l=(0,e.ref)({min:0,max:0});function u(){l.value.min=t.modelValue.min===null?i.innerMin.value:Pe(t.modelValue.min,i.innerMin.value,i.innerMax.value),l.value.max=t.modelValue.max===null?i.innerMax.value:Pe(t.modelValue.max,i.innerMin.value,i.innerMax.value)}(0,e.watch)(()=>`${t.modelValue.min}|${t.modelValue.max}|${i.innerMin.value}|${i.innerMax.value}`,u),u();let d=(0,e.computed)(()=>a.convertModelToRatio(l.value.min)),f=(0,e.computed)(()=>a.convertModelToRatio(l.value.max)),p=(0,e.computed)(()=>i.active.value?s.value:d.value),m=(0,e.computed)(()=>i.active.value?c.value:f.value),h=(0,e.computed)(()=>{let e={[i.positionProp.value]:`${100*p.value}%`,[i.sizeProp.value]:`${100*(m.value-p.value)}%`};return t.selectionImg!==void 0&&(e.backgroundImage=`url(${t.selectionImg}) !important`),e}),g=(0,e.computed)(()=>{if(!i.editable.value)return{};if(r.platform.is.mobile)return{onClick:a.onMobileClick};let e={onMousedown:a.onActivate};return(t.dragRange||t.dragOnlyRange)&&Object.assign(e,{onFocus:()=>{i.focus.value=`both`},onBlur:a.onBlur,onKeydown:k,onKeyup:a.onKeyup}),e});function _(e){return!r.platform.is.mobile&&i.editable.value&&!t.dragOnlyRange?{onFocus:()=>{i.focus.value=e},onBlur:a.onBlur,onKeydown:k,onKeyup:a.onKeyup}:{}}let v=(0,e.computed)(()=>t.dragOnlyRange?null:i.tabindex.value),y=(0,e.computed)(()=>!r.platform.is.mobile&&(t.dragRange||t.dragOnlyRange)?i.tabindex.value:null),b=(0,e.ref)(null),x=(0,e.computed)(()=>_(`min`)),S=a.getThumbRenderFn({focusValue:`min`,getNodeData:()=>({ref:b,key:`tmin`,...x.value,tabindex:v.value}),ratio:p,label:(0,e.computed)(()=>t.leftLabelValue===void 0?l.value.min:t.leftLabelValue),thumbColor:(0,e.computed)(()=>t.leftThumbColor||t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.leftLabelColor||t.labelColor),labelTextColor:(0,e.computed)(()=>t.leftLabelTextColor||t.labelTextColor)}),C=(0,e.computed)(()=>_(`max`)),w=a.getThumbRenderFn({injectFormInput:!1,focusValue:`max`,getNodeData:()=>({...C.value,key:`tmax`,tabindex:v.value}),ratio:m,label:(0,e.computed)(()=>t.rightLabelValue===void 0?l.value.max:t.rightLabelValue),thumbColor:(0,e.computed)(()=>t.rightThumbColor||t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.rightLabelColor||t.labelColor),labelTextColor:(0,e.computed)(()=>t.rightLabelTextColor||t.labelTextColor)});function T(e){(l.value.min!==t.modelValue.min||l.value.max!==t.modelValue.max)&&n(`update:modelValue`,{...l.value}),e&&n(`change`,{...l.value})}function E(e){let{left:n,top:r,width:i,height:s}=o.value.getBoundingClientRect(),c=t.dragOnlyRange?0:t.vertical?b.value.offsetHeight/(2*s):b.value.offsetWidth/(2*i),u={left:n,top:r,width:i,height:s,valueMin:l.value.min,valueMax:l.value.max,ratioMin:d.value,ratioMax:f.value},p=a.getDraggingRatio(e,u);return!t.dragOnlyRange&&p=n.ratioMin?(r={minR:n.ratioMin,maxR:o,min:n.valueMin,max:u},i.focus.value=`max`):(r={minR:o,maxR:n.ratioMin,min:u,max:n.valueMin},i.focus.value=`min`);break;case gu.RANGE:{let e=o-n.offsetRatio,t=Pe(n.ratioMin+e,i.innerMinRatio.value,i.innerMaxRatio.value-n.rangeRatio),a=u-n.offsetModel,s=Pe(n.valueMin+a,i.innerMin.value,i.innerMax.value-n.rangeValue);r={minR:t,maxR:t+n.rangeRatio,min:i.roundValueFn.value(s),max:i.roundValueFn.value(s+n.rangeValue)},i.focus.value=`both`;break}}l.value=l.value.min===null||l.value.max===null?{min:r.min??t.min,max:r.max??t.max}:{min:r.min,max:r.max},!t.snap||t.step===0?(s.value=r.minR,c.value=r.maxR):(s.value=a.convertModelToRatio(l.value.min),c.value=a.convertModelToRatio(l.value.max))}function k(e){if(!aa.includes(e.keyCode))return;O(e);let n=([34,33].includes(e.keyCode)?10:1)*i.keyStep.value,r=([34,37,40].includes(e.keyCode)?-1:1)*(i.isReversed.value?-1:1)*(t.vertical?-1:1)*n;if(i.focus.value===`both`){let e=l.value.max-l.value.min,t=Pe(i.roundValueFn.value(l.value.min+r),i.innerMin.value,i.innerMax.value-e);l.value={min:t,max:i.roundValueFn.value(t+e)}}else if(i.focus.value){let e=i.focus.value;l.value={...l.value,[e]:Pe(i.roundValueFn.value(l.value[e]+r),e===`min`?i.innerMin.value:l.value.min,e===`max`?i.innerMax.value:l.value.max)}}else return;T()}return()=>{let n=a.getContent(h,y,g,e=>{e.push(S(),w())});return(0,e.h)(`div`,{ref:o,class:`q-range `+i.classes.value+(t.modelValue.min===null||t.modelValue.max===null?` q-slider--no-value`:``),...i.attributes.value,"aria-valuenow":t.modelValue.min+`|`+t.modelValue.max},n)}}}),vu=h({name:`QRating`,props:{...Je,...ai,modelValue:{type:Number,required:!0},max:{type:[String,Number],default:5},icon:[String,Array],iconHalf:[String,Array],iconSelected:[String,Array],iconAriaLabel:[String,Array],color:[String,Array],colorHalf:[String,Array],colorSelected:[String,Array],noReset:Boolean,noDimming:Boolean,readonly:Boolean,disable:Boolean},emits:[`update:modelValue`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=Ye(t),o=si(oi(t)),s=(0,e.ref)(0),c={},l=(0,e.computed)(()=>!t.readonly&&!t.disable),u=(0,e.computed)(()=>`q-rating row inline items-center q-rating--${l.value?``:`non-`}editable`+(t.noDimming?` q-rating--no-dimming`:``)+(t.disable?` disabled`:``)+(t.color!==void 0&&!Array.isArray(t.color)?` text-${t.color}`:``)),d=(0,e.computed)(()=>{let e=Array.isArray(t.icon)?t.icon.length:0,n=Array.isArray(t.iconSelected)?t.iconSelected.length:0,r=Array.isArray(t.iconHalf)?t.iconHalf.length:0,i=Array.isArray(t.color)?t.color.length:0,a=Array.isArray(t.colorSelected)?t.colorSelected.length:0,o=Array.isArray(t.colorHalf)?t.colorHalf.length:0;return{iconLen:e,icon:e>0?t.icon[e-1]:t.icon,selIconLen:n,selIcon:n>0?t.iconSelected[n-1]:t.iconSelected,halfIconLen:r,halfIcon:r>0?t.iconHalf[r-1]:t.iconHalf,colorLen:i,color:i>0?t.color[i-1]:t.color,selColorLen:a,selColor:a>0?t.colorSelected[a-1]:t.colorSelected,halfColorLen:o,halfColor:o>0?t.colorHalf[o-1]:t.colorHalf}}),f=(0,e.computed)(()=>{if(typeof t.iconAriaLabel==`string`){let e=t.iconAriaLabel.length===0?``:`${t.iconAriaLabel} `;return t=>`${e}${t}`}if(Array.isArray(t.iconAriaLabel)){let e=t.iconAriaLabel.length;if(e>0)return n=>t.iconAriaLabel[Math.min(n,e)-1]}return(e,t)=>`${t} ${e}`}),p=(0,e.computed)(()=>{let e=[],n=d.value,r=Math.ceil(t.modelValue),a=Number.isInteger(t.modelValue)&&t.modelValue>=1&&t.modelValue<=t.max?t.modelValue:1,o=t.iconHalf===void 0||r===t.modelValue?-1:r;for(let c=1;c<=t.max;c++){let u=s.value===0&&t.modelValue>=c||s.value>0&&s.value>=c,d=o===c&&s.value0&&(d?r:t.modelValue)>=c&&s.value{let e={role:`radiogroup`};return t.disable&&(e[`aria-disabled`]=`true`),t.readonly&&(e[`aria-readonly`]=`true`),e});function h(e){if(l.value){let n=Pe(Number.parseInt(e,10),1,Number.parseInt(t.max,10)),i=!t.noReset&&t.modelValue===n?0:n;i!==t.modelValue&&r(`update:modelValue`,i),s.value=0}}function g(e){l.value&&(s.value=e)}function _(e,t){switch(e.keyCode){case 13:case 32:return h(t),O(e);case 37:{let n=t+(i.lang.rtl?1:-1);return c[`rt${n}`]&&c[`rt${n}`].focus(),O(e)}case 39:{let n=t+(i.lang.rtl?-1:1);return c[`rt${n}`]&&c[`rt${n}`].focus(),O(e)}case 40:return c[`rt${t-1}`]&&c[`rt${t-1}`].focus(),O(e);case 38:return c[`rt${t+1}`]&&c[`rt${t+1}`].focus(),O(e)}}function v(){s.value=0}return(0,e.onBeforeUpdate)(()=>{c={}}),()=>{let r=[];return p.value.forEach(({iconClass:t,name:i,attrs:a},o)=>{let s=o+1;r.push((0,e.h)(`div`,{key:s,ref:e=>{c[`rt${s}`]=e},class:`q-rating__icon-container flex flex-center`,...a,onClick(){h(s)},onMouseover(){g(s)},onMouseout:v,onFocus(){g(s)},onBlur:v,onKeydown(e){_(e,s)}},Ze(n[`tip-${s}`],[(0,e.h)(Z,{class:t,name:i})])))}),t.name!==void 0&&!t.disable&&o(r,`push`),(0,e.h)(`div`,{class:u.value,style:a.value,...m.value},r)}}}),yu=h({name:`QResponsive`,props:rl,setup(t,{slots:n}){let r=il(t);return()=>(0,e.h)(`div`,{class:`q-responsive`},[(0,e.h)(`div`,{class:`q-responsive__filler overflow-hidden`},[(0,e.h)(`div`,{style:r.value})]),(0,e.h)(`div`,{class:`q-responsive__content absolute-full fit`},X(n.default))])}}),bu=h({props:[`store`,`barStyle`,`verticalBarStyle`,`horizontalBarStyle`],setup(t){return()=>[(0,e.h)(`div`,{class:t.store.scroll.vertical.barClass.value,style:[t.barStyle,t.verticalBarStyle],"aria-hidden":`true`,onMousedown:t.store.onVerticalMousedown}),(0,e.h)(`div`,{class:t.store.scroll.horizontal.barClass.value,style:[t.barStyle,t.horizontalBarStyle],"aria-hidden":`true`,onMousedown:t.store.onHorizontalMousedown}),(0,e.withDirectives)((0,e.h)(`div`,{ref:t.store.scroll.vertical.ref,class:t.store.scroll.vertical.thumbClass.value,style:t.store.scroll.vertical.style.value,"aria-hidden":`true`}),t.store.thumbVertDir),(0,e.withDirectives)((0,e.h)(`div`,{ref:t.store.scroll.horizontal.ref,class:t.store.scroll.horizontal.thumbClass.value,style:t.store.scroll.horizontal.style.value,"aria-hidden":`true`}),t.store.thumbHorizDir)]}});let xu=[`vertical`,`horizontal`],Su={vertical:{offset:`offsetY`,scroll:`scrollTop`,dir:`down`,dist:`y`},horizontal:{offset:`offsetX`,scroll:`scrollLeft`,dir:`right`,dist:`x`}},Cu={prevent:!0,mouse:!0,mouseAllDir:!0},wu=e=>e>=250?50:Math.ceil(e/5);var Tu=h({name:`QScrollArea`,props:{...Q,thumbStyle:Object,verticalThumbStyle:Object,horizontalThumbStyle:Object,barStyle:[Array,String,Object],verticalBarStyle:[Array,String,Object],horizontalBarStyle:[Array,String,Object],verticalOffset:{type:Array,default:()=>[0,0]},horizontalOffset:{type:Array,default:()=>[0,0]},contentStyle:[Array,String,Object],contentActiveStyle:[Array,String,Object],delay:{type:[String,Number],default:1e3},visible:{type:Boolean,default:null},tabindex:[String,Number],onScroll:Function},setup(t,{slots:n,emit:r}){let i=(0,e.ref)(!1),a=(0,e.ref)(!1),o=(0,e.ref)(!1),s={vertical:(0,e.ref)(0),horizontal:(0,e.ref)(0)},c={vertical:{ref:(0,e.ref)(null),position:(0,e.ref)(0),size:(0,e.ref)(0)},horizontal:{ref:(0,e.ref)(null),position:(0,e.ref)(0),size:(0,e.ref)(0)}},{proxy:l}=(0,e.getCurrentInstance)(),u=$(t,l.$q),d=null,f,p=(0,e.ref)(null),m=(0,e.computed)(()=>`q-scrollarea`+(u.value?` q-scrollarea--dark`:``));Object.assign(s,{verticalInner:(0,e.computed)(()=>s.vertical.value-t.verticalOffset[0]-t.verticalOffset[1]),horizontalInner:(0,e.computed)(()=>s.horizontal.value-t.horizontalOffset[0]-t.horizontalOffset[1])}),c.vertical.percentage=(0,e.computed)(()=>{let e=c.vertical.size.value-s.vertical.value;if(e<=0)return 0;let t=Pe(c.vertical.position.value/e,0,1);return Math.round(t*1e4)/1e4}),c.vertical.thumbHidden=(0,e.computed)(()=>!(t.visible===null?o.value:t.visible)&&!i.value&&!a.value||c.vertical.size.value<=s.vertical.value+1),c.vertical.thumbStart=(0,e.computed)(()=>t.verticalOffset[0]+c.vertical.percentage.value*(s.verticalInner.value-c.vertical.thumbSize.value)),c.vertical.thumbSize=(0,e.computed)(()=>Math.round(Pe(s.verticalInner.value*s.verticalInner.value/c.vertical.size.value,wu(s.verticalInner.value),s.verticalInner.value))),c.vertical.style=(0,e.computed)(()=>({...t.thumbStyle,...t.verticalThumbStyle,top:`${c.vertical.thumbStart.value}px`,height:`${c.vertical.thumbSize.value}px`,right:`${t.horizontalOffset[1]}px`})),c.vertical.thumbClass=(0,e.computed)(()=>`q-scrollarea__thumb q-scrollarea__thumb--v absolute-right`+(c.vertical.thumbHidden.value?` q-scrollarea__thumb--invisible`:``)),c.vertical.barClass=(0,e.computed)(()=>`q-scrollarea__bar q-scrollarea__bar--v absolute-right`+(c.vertical.thumbHidden.value?` q-scrollarea__bar--invisible`:``)),c.horizontal.percentage=(0,e.computed)(()=>{let e=c.horizontal.size.value-s.horizontal.value;if(e<=0)return 0;let t=Pe(E(c.horizontal.position.value)/e,0,1);return Math.round(t*1e4)/1e4}),c.horizontal.thumbHidden=(0,e.computed)(()=>!(t.visible===null?o.value:t.visible)&&!i.value&&!a.value||c.horizontal.size.value<=s.horizontal.value+1),c.horizontal.thumbStart=(0,e.computed)(()=>t.horizontalOffset[+!!l.$q.lang.rtl]+c.horizontal.percentage.value*(s.horizontalInner.value-c.horizontal.thumbSize.value)),c.horizontal.thumbSize=(0,e.computed)(()=>Math.round(Pe(s.horizontalInner.value*s.horizontalInner.value/c.horizontal.size.value,wu(s.horizontalInner.value),s.horizontalInner.value))),c.horizontal.style=(0,e.computed)(()=>({...t.thumbStyle,...t.horizontalThumbStyle,[l.$q.lang.rtl?`right`:`left`]:`${c.horizontal.thumbStart.value}px`,width:`${c.horizontal.thumbSize.value}px`,bottom:`${t.verticalOffset[1]}px`})),c.horizontal.thumbClass=(0,e.computed)(()=>`q-scrollarea__thumb q-scrollarea__thumb--h absolute-bottom`+(c.horizontal.thumbHidden.value?` q-scrollarea__thumb--invisible`:``)),c.horizontal.barClass=(0,e.computed)(()=>`q-scrollarea__bar q-scrollarea__bar--h absolute-bottom`+(c.horizontal.thumbHidden.value?` q-scrollarea__bar--invisible`:``));let h=(0,e.computed)(()=>c.vertical.thumbHidden.value&&c.horizontal.thumbHidden.value?t.contentStyle:t.contentActiveStyle);function g(){let e={};return xu.forEach(t=>{let n=c[t];Object.assign(e,{[t+`Position`]:n.position.value,[t+`Percentage`]:n.percentage.value,[t+`Size`]:n.size.value,[t+`ContainerSize`]:s[t].value,[t+`ContainerInnerSize`]:s[t+`Inner`].value})}),e}let _=N(()=>{let e=g();e.ref=l,r(`scroll`,e)},0);function v(e,t,n){if(!xu.includes(e)){console.error(`[QScrollArea]: wrong first param of setScrollPosition (vertical/horizontal)`);return}(e===`vertical`?dr:fr)(p.value,t,n)}function y({height:e,width:t}){let n=!1;s.vertical.value!==e&&(s.vertical.value=e,n=!0),s.horizontal.value!==t&&(s.horizontal.value=t,n=!0),n&&w()}function b({position:e}){let t=!1;c.vertical.position.value!==e.top&&(c.vertical.position.value=e.top,t=!0),c.horizontal.position.value!==e.left&&(c.horizontal.position.value=e.left,t=!0),t&&w()}function x({height:e,width:t}){c.horizontal.size.value!==t&&(c.horizontal.size.value=t,w()),c.vertical.size.value!==e&&(c.vertical.size.value=e,w())}function S(e,t){let n=c[t];if(e.isFirst){if(n.thumbHidden.value)return;f=t===`horizontal`?E(n.position.value):n.position.value,a.value=!0}else if(!a.value)return;e.isFinal&&(a.value=!1);let r=Su[t],i=(n.size.value-s[t].value)/(s[t+`Inner`].value-n.thumbSize.value),o=e.distance[r.dist],u=(e.direction===r.dir?1:-1)*(t===`horizontal`&&l.$q.lang.rtl?-1:1),d=f+u*o*i;T(t===`horizontal`?D(d):d,t)}function C(e,n){let r=c[n];if(!r.thumbHidden.value){let i=n===`horizontal`&&l.$q.lang.rtl,a=n===`vertical`?t.verticalOffset[0]:t.horizontalOffset[+!!i],o=(i?s.horizontal.value-e.offsetX:e[Su[n].offset])-a,c=r.thumbStart.value-a;if(oc+r.thumbSize.value){let e=Pe((o-r.thumbSize.value/2)/(s[n+`Inner`].value-r.thumbSize.value),0,1);T(i?D(e*Math.max(0,r.size.value-s[n].value)):e*Math.max(0,r.size.value-s[n].value),n)}r.ref.value!==null&&r.ref.value.dispatchEvent(new MouseEvent(e.type,e))}}function w(){i.value=!0,d!==null&&clearTimeout(d),d=setTimeout(()=>{d=null,i.value=!1},t.delay),t.onScroll!==void 0&&_()}function T(e,t){p.value[Su[t].scroll]=e}function E(e,t=l.$q.lang.rtl){return t?ha?Math.max(0,c.horizontal.size.value-s.horizontal.value)-e:-e:e}function D(e,t=l.$q.lang.rtl){return t?ha?Math.max(0,c.horizontal.size.value-s.horizontal.value)-e:-e:e}let O=null;function k(){O!==null&&clearTimeout(O),O=setTimeout(()=>{O=null,o.value=!0},l.$q.platform.is.ios?50:0)}function A(){O!==null&&(clearTimeout(O),O=null),o.value=!1}let j=null;(0,e.watch)(()=>l.$q.lang.rtl,(e,t)=>{p.value!==null&&fr(p.value,D(E(c.horizontal.position.value,t),e))}),(0,e.onDeactivated)(()=>{j={top:c.vertical.position.value,left:c.horizontal.position.value}}),(0,e.onActivated)(()=>{if(j===null)return;let e=p.value;e!==null&&(fr(e,j.left),dr(e,j.top))}),(0,e.onBeforeUnmount)(_.cancel),Object.assign(l,{getScrollTarget:()=>p.value,getScroll:g,getScrollPosition:()=>({top:c.vertical.position.value,left:c.horizontal.position.value}),getScrollPercentage:()=>({top:c.vertical.percentage.value,left:c.horizontal.percentage.value}),setScrollPosition:v,setScrollPercentage(e,t,n){let r=t*(c[e].size.value-s[e].value);v(e,e===`horizontal`?D(r):r,n)}});let M={scroll:c,thumbVertDir:[[na,e=>{S(e,`vertical`)},void 0,{vertical:!0,...Cu}]],thumbHorizDir:[[na,e=>{S(e,`horizontal`)},void 0,{horizontal:!0,...Cu}]],onVerticalMousedown(e){C(e,`vertical`)},onHorizontalMousedown(e){C(e,`horizontal`)}};return()=>(0,e.h)(`div`,{class:m.value,onMouseenter:k,onMouseleave:A},[(0,e.h)(`div`,{ref:p,class:`q-scrollarea__container scroll relative-position fit hide-scrollbar`,tabindex:t.tabindex===void 0?void 0:t.tabindex},[(0,e.h)(`div`,{class:`q-scrollarea__content absolute`,style:h.value},Ze(n.default,[(0,e.h)(ma,{debounce:0,onResize:x})])),(0,e.h)(Ll,{axis:`both`,onScroll:b})]),(0,e.h)(ma,{debounce:0,onResize:y}),(0,e.h)(bu,{store:M,barStyle:t.barStyle,verticalBarStyle:t.verticalBarStyle,horizontalBarStyle:t.horizontalBarStyle})])}});let Eu=1e3,Du=[`start`,`center`,`end`,`start-force`,`center-force`,`end-force`],Ou=Array.prototype.filter,ku=window.getComputedStyle(document.body).overflowAnchor===void 0?y:function(e,t){e!==null&&(e._qOverflowAnimationFrame!==void 0&&cancelAnimationFrame(e._qOverflowAnimationFrame),e._qOverflowAnimationFrame=requestAnimationFrame(()=>{if(e===null)return;e._qOverflowAnimationFrame=void 0;let n=e.children||[];Ou.call(n,e=>e.dataset&&e.dataset.qVsAnchor!==void 0).forEach(e=>{delete e.dataset.qVsAnchor});let r=n[t];r?.dataset&&(r.dataset.qVsAnchor=``)}))};function Au(e,t){return e+t}function ju(e,t,n,r,i,a,o,s){let c=e===window?document.scrollingElement||document.documentElement:e,l=i?`offsetWidth`:`offsetHeight`,u={scrollStart:0,scrollViewSize:-o-s,scrollMaxSize:0,offsetStart:-o,offsetEnd:-s};if(i?(e===window?(u.scrollStart=window.pageXOffset||window.scrollX||document.body.scrollLeft||0,u.scrollViewSize+=document.documentElement.clientWidth):(u.scrollStart=c.scrollLeft,u.scrollViewSize+=c.clientWidth),u.scrollMaxSize=c.scrollWidth,a&&(u.scrollStart=(ha?u.scrollMaxSize-u.scrollViewSize:0)-u.scrollStart)):(e===window?(u.scrollStart=window.pageYOffset||window.scrollY||document.body.scrollTop||0,u.scrollViewSize+=document.documentElement.clientHeight):(u.scrollStart=c.scrollTop,u.scrollViewSize+=c.clientHeight),u.scrollMaxSize=c.scrollHeight),n!==null)for(let e=n.previousElementSibling;e!==null;e=e.previousElementSibling)e.classList.contains(`q-virtual-scroll--skip`)||(u.offsetStart+=e[l]);if(r!==null)for(let e=r.nextElementSibling;e!==null;e=e.nextElementSibling)e.classList.contains(`q-virtual-scroll--skip`)||(u.offsetEnd+=e[l]);if(t!==e){let n=c.getBoundingClientRect(),r=t.getBoundingClientRect();i?(u.offsetStart+=r.left-n.left,u.offsetEnd-=r.width):(u.offsetStart+=r.top-n.top,u.offsetEnd-=r.height),e!==window&&(u.offsetStart+=u.scrollStart),u.offsetEnd+=u.scrollMaxSize-u.offsetStart}return u}function Mu(e,t,n,r){t===`end`&&(t=(e===window?document.body:e)[n?`scrollWidth`:`scrollHeight`]),e===window?n?(r&&(t=(ha?document.body.scrollWidth-document.documentElement.clientWidth:0)-t),window.scrollTo(t,window.pageYOffset||window.scrollY||document.body.scrollTop||0)):window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,t):n?(r&&(t=(ha?e.scrollWidth-e.offsetWidth:0)-t),e.scrollLeft=t):e.scrollTop=t}function Nu(e,t,n,r){if(n>=r)return 0;let i=t.length,a=Math.floor(n/Eu),o=Math.floor((r-1)/Eu)+1,s=e.slice(a,o).reduce(Au,0);return n%Eu!=0&&(s-=t.slice(a*Eu,n).reduce(Au,0)),r%Eu!=0&&r!==i&&(s-=t.slice(r,o*Eu).reduce(Au,0)),s}let Pu={virtualScrollSliceSize:{type:[Number,String],default:10},virtualScrollSliceRatioBefore:{type:[Number,String],default:1},virtualScrollSliceRatioAfter:{type:[Number,String],default:1},virtualScrollItemSize:{type:[Number,String],default:24},virtualScrollStickySizeStart:{type:[Number,String],default:0},virtualScrollStickySizeEnd:{type:[Number,String],default:0},tableColspan:[Number,String]},Fu=Object.keys(Pu),Iu={virtualScrollHorizontal:Boolean,onVirtualScroll:Function,...Pu};function Lu({virtualScrollLength:t,getVirtualScrollTarget:n,getVirtualScrollEl:r,virtualScrollItemSizeComputed:i}){let{props:a,emit:o,proxy:s}=(0,e.getCurrentInstance)(),{$q:c}=s,l,u,d,f=[],p,m=(0,e.ref)(0),h=(0,e.ref)(0),g=(0,e.ref)({}),_=(0,e.ref)(null),v=(0,e.ref)(null),y=(0,e.ref)(null),b=(0,e.ref)({from:0,to:0}),x=(0,e.computed)(()=>a.tableColspan===void 0?100:a.tableColspan);i===void 0&&(i=(0,e.computed)(()=>a.virtualScrollItemSize));let S=(0,e.computed)(()=>i.value+`;`+a.virtualScrollHorizontal);(0,e.watch)((0,e.computed)(()=>S.value+`;`+a.virtualScrollSliceRatioBefore+`;`+a.virtualScrollSliceRatioAfter),()=>{j()}),(0,e.watch)(S,C);function C(){A(u,!0)}function w(e){A(e===void 0?u:e)}function T(e,i){let o=n();if(o==null||o.nodeType===8)return;let s=ju(o,r(),_.value,v.value,a.virtualScrollHorizontal,c.lang.rtl,a.virtualScrollStickySizeStart,a.virtualScrollStickySizeEnd);d!==s.scrollViewSize&&j(s.scrollViewSize),D(o,s,Math.min(t.value-1,Math.max(0,Number.parseInt(e,10)||0)),0,Du.includes(i)?i:u!==-1&&e>u?`end`:`start`)}function E(){let e=n();if(e==null||e.nodeType===8)return;let i=ju(e,r(),_.value,v.value,a.virtualScrollHorizontal,c.lang.rtl,a.virtualScrollStickySizeStart,a.virtualScrollStickySizeEnd),o=t.value-1,s=i.scrollMaxSize-i.offsetStart-i.offsetEnd-h.value;if(l===i.scrollStart)return;if(i.scrollMaxSize<=0){D(e,i,0,0);return}d!==i.scrollViewSize&&j(i.scrollViewSize),O(b.value.from);let u=Math.floor(i.scrollMaxSize-Math.max(i.scrollViewSize,i.offsetEnd)-Math.min(p[o],i.scrollViewSize/2));if(u>0&&Math.ceil(i.scrollStart)>=u){D(e,i,o,i.scrollMaxSize-i.offsetEnd-f.reduce(Au,0));return}let g=0,y=i.scrollStart-i.offsetStart,x=y;if(y<=s&&y+i.scrollViewSize>=m.value)y-=m.value,g=b.value.from,x=y;else for(let e=0;y>=f[e]&&g0&&g-i.scrollViewSize?(g++,x=y):x=p[g]+y;D(e,i,g,x)}function D(e,n,r,i,o){let s=typeof o==`string`&&o.includes(`-force`),u=s?o.replace(`-force`,``):o,d=u===void 0?`start`:u,_=Math.max(0,r-g.value[d]),v=_+g.value.total;v>t.value&&(v=t.value,_=Math.max(0,v-g.value.total)),l=n.scrollStart;let x=_!==b.value.from||v!==b.value.to;if(!x&&u===void 0){P(r);return}let{activeElement:S}=document,C=y.value;x&&C!==null&&C!==S&&C.contains(S)&&(C.addEventListener(`focusout`,k),setTimeout(()=>{C?.removeEventListener(`focusout`,k)},0)),ku(C,r-_);let w=u===void 0?0:p.slice(_,r).reduce(Au,0);if(x){let e=v>=b.value.from&&_<=b.value.to?b.value.to:v;b.value={from:_,to:e},m.value=Nu(f,p,0,_),h.value=Nu(f,p,v,t.value),requestAnimationFrame(()=>{b.value.to!==v&&l===n.scrollStart&&(b.value={from:b.value.from,to:v},h.value=Nu(f,p,v,t.value))})}requestAnimationFrame(()=>{if(l!==n.scrollStart)return;x&&O(_);let t=p.slice(_,r).reduce(Au,0),o=t+n.offsetStart+m.value,d=o+p[r],f=o+i;if(u!==void 0){let e=t-w,i=n.scrollStart+e;f=!s&&ie.classList&&!e.classList.contains(`q-virtual-scroll--skip`)),r=n.length,i=a.virtualScrollHorizontal?e=>e.getBoundingClientRect().width:e=>e.offsetHeight,o=e,s,c;for(let e=0;e=o;e--)p[e]=a;let s=Math.floor((t.value-1)/Eu);f=[];for(let e=0;e<=s;e++){let n=0,r=Math.min((e+1)*Eu,t.value);for(let t=e*Eu;t=0?(O(b.value.from),(0,e.nextTick)(()=>{T(n)})):F()}function j(e){if(e===void 0&&typeof window<`u`){let t=n();t!=null&&t.nodeType!==8&&(e=ju(t,r(),_.value,v.value,a.virtualScrollHorizontal,c.lang.rtl,a.virtualScrollStickySizeStart,a.virtualScrollStickySizeEnd).scrollViewSize)}d=e;let t=Number.parseFloat(a.virtualScrollSliceRatioBefore)||0,o=Number.parseFloat(a.virtualScrollSliceRatioAfter)||0,s=1+t+o,l=e===void 0||e<=0?1:Math.ceil(e/i.value),u=Math.max(1,l,Math.ceil((a.virtualScrollSliceSize>0?a.virtualScrollSliceSize:10)/s));g.value={total:Math.ceil(u*s),start:Math.ceil(u*t),center:Math.ceil(u*(.5+t)),end:Math.ceil(u*(1+t)),view:l}}function M(t,n){let r=a.virtualScrollHorizontal?`width`:`height`,o={[`--q-virtual-scroll-item-`+r]:i.value+`px`};return[t===`tbody`?(0,e.h)(t,{class:`q-virtual-scroll__padding`,key:`before`,ref:_},[(0,e.h)(`tr`,[(0,e.h)(`td`,{style:{[r]:`${m.value}px`,...o},colspan:x.value})])]):(0,e.h)(t,{class:`q-virtual-scroll__padding`,key:`before`,ref:_,style:{[r]:`${m.value}px`,...o}}),(0,e.h)(t,{class:`q-virtual-scroll__content`,key:`content`,ref:y,tabindex:-1},n.flat()),t===`tbody`?(0,e.h)(t,{class:`q-virtual-scroll__padding`,key:`after`,ref:v},[(0,e.h)(`tr`,[(0,e.h)(`td`,{style:{[r]:`${h.value}px`,...o},colspan:x.value})])]):(0,e.h)(t,{class:`q-virtual-scroll__padding`,key:`after`,ref:v,style:{[r]:`${h.value}px`,...o}})]}function P(e){u!==e&&(a.onVirtualScroll!==void 0&&o(`virtualScroll`,{index:e,from:b.value.from,to:b.value.to-1,direction:e{j()});let I=!1;return(0,e.onDeactivated)(()=>{I=!0}),(0,e.onActivated)(()=>{if(!I)return;let e=n();l!==void 0&&e!=null&&e.nodeType!==8?Mu(e,l,a.virtualScrollHorizontal,c.lang.rtl):T(u)}),(0,e.onBeforeUnmount)(()=>{F.cancel()}),Object.assign(s,{scrollTo:T,reset:C,refresh:w}),{virtualScrollSliceRange:b,virtualScrollSliceSizeComputed:g,setVirtualScrollSize:j,onVirtualScrollEvt:F,localResetVirtualScroll:A,padVirtualScroll:M,scrollTo:T,reset:C,refresh:w}}let Ru=e=>[`add`,`add-unique`,`toggle`].includes(e),zu=Object.keys(Ic);function Bu(e,t){if(typeof e==`function`)return e;let n=e===void 0?t:e;return e=>typeof e==`object`&&e&&n in e?e[n]:e}var Vu=h({name:`QSelect`,inheritAttrs:!1,props:{...Iu,...ai,...Ic,modelValue:{required:!0},multiple:Boolean,displayValue:[String,Number],displayValueHtml:Boolean,dropdownIcon:String,options:{type:Array,default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],hideSelected:Boolean,hideDropdownIcon:Boolean,fillInput:Boolean,maxValues:[Number,String],optionsDense:Boolean,optionsDark:{type:Boolean,default:null},optionsSelectedClass:String,optionsHtml:Boolean,optionsCover:Boolean,menuShrink:Boolean,menuAnchor:String,menuSelf:String,menuOffset:Array,popupContentClass:String,popupContentStyle:[String,Array,Object],popupNoRouteDismiss:Boolean,useInput:Boolean,useChips:Boolean,newValueMode:{type:String,validator:Ru},mapOptions:Boolean,emitValue:Boolean,disableTabSelection:Boolean,inputDebounce:{type:[Number,String],default:500},inputClass:[Array,String,Object],inputStyle:[Array,String,Object],tabindex:{type:[String,Number],default:0},autocomplete:String,transitionShow:{},transitionHide:{},transitionDuration:{},behavior:{type:String,validator:e=>[`default`,`menu`,`dialog`].includes(e),default:`default`},virtualScrollItemSize:Iu.virtualScrollItemSize.type,onNewValue:Function,onFilter:Function},emits:[...Lc,`add`,`remove`,`inputValue`,`keyup`,`keypress`,`keydown`,`popupShow`,`popupHide`,`filterAbort`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=(0,e.ref)(!1),s=(0,e.ref)(!1),c=(0,e.ref)(-1),l=(0,e.ref)(``),u=(0,e.ref)(!1),d=(0,e.ref)(!1),f=null,p=null,m,h,g,_=null,v,y,b,x,S=(0,e.ref)(null),C=(0,e.ref)(null),w=(0,e.ref)(null),T=(0,e.ref)(null),k=(0,e.ref)(null),A=ci(t),j=Cl(Re),M=(0,e.computed)(()=>Array.isArray(t.options)?t.options.length:0),{virtualScrollSliceRange:N,virtualScrollSliceSizeComputed:P,localResetVirtualScroll:F,padVirtualScroll:I,onVirtualScrollEvt:L,scrollTo:R,setVirtualScrollSize:ee}=Lu({virtualScrollLength:M,getVirtualScrollTarget:Pe,getVirtualScrollEl:Ne,virtualScrollItemSizeComputed:(0,e.computed)(()=>t.virtualScrollItemSize===void 0?t.optionsDense?24:48:t.virtualScrollItemSize)}),z=Rc(),V=(0,e.computed)(()=>{let e=t.mapOptions&&!t.multiple,n=t.modelValue!==void 0&&(t.modelValue!==null||e)?t.multiple&&Array.isArray(t.modelValue)?t.modelValue:[t.modelValue]:[];if(t.mapOptions&&Array.isArray(t.options)){let r=t.mapOptions&&m!==void 0?m:[],i=n.map(e=>Ee(e,r));return t.modelValue===null&&e?i.filter(e=>e!==null):i}return n}),ne=(0,e.computed)(()=>{let e={};return zu.forEach(n=>{let r=t[n];r!==void 0&&(e[n]=r)}),e}),H=(0,e.computed)(()=>t.optionsDark===null?z.isDark.value:t.optionsDark),U=(0,e.computed)(()=>Pc(V.value)),W=(0,e.computed)(()=>{let e=`q-field__input q-placeholder col`;return t.hideSelected||V.value.length===0?[e,t.inputClass]:(e+=` q-field__input--padding`,t.inputClass===void 0?e:[e,t.inputClass])}),G=(0,e.computed)(()=>(t.virtualScrollHorizontal?`q-virtual-scroll--horizontal`:``)+(t.popupContentClass?` `+t.popupContentClass:``)),K=(0,e.computed)(()=>M.value===0),q=(0,e.computed)(()=>V.value.map(e=>he.value(e)).join(`, `)),re=(0,e.computed)(()=>t.displayValue===void 0?q.value:t.displayValue),ie=(0,e.computed)(()=>t.optionsHtml?()=>!0:e=>e?.html===!0),ae=(0,e.computed)(()=>t.displayValueHtml||t.displayValue===void 0&&(t.optionsHtml||V.value.some(ie.value))),oe=(0,e.computed)(()=>z.focused.value?t.tabindex:-1),se=(0,e.computed)(()=>{let e={tabindex:t.tabindex,role:`combobox`,"aria-label":t.label,"aria-readonly":t.readonly?`true`:`false`,"aria-autocomplete":t.useInput?`list`:`none`,"aria-expanded":o.value?`true`:`false`,"aria-controls":`${z.targetUid.value}_lb`};return c.value>=0&&(e[`aria-activedescendant`]=`${z.targetUid.value}_${c.value}`),e}),ce=(0,e.computed)(()=>({id:`${z.targetUid.value}_lb`,role:`listbox`,"aria-multiselectable":t.multiple?`true`:`false`})),le=(0,e.computed)(()=>V.value.map((e,t)=>({index:t,opt:e,html:ie.value(e),selected:!0,removeAtIndex:xe,toggleOption:Ce,tabindex:oe.value}))),ue=(0,e.computed)(()=>{if(M.value===0)return[];let{from:e,to:n}=N.value;return t.options.slice(e,n).map((n,r)=>{let i=ge.value(n)===!0,s=De(n),l=e+r,u={clickable:!0,active:s,activeClass:pe.value,manualFocus:!0,focused:!1,disable:i,tabindex:-1,dense:t.optionsDense,dark:H.value,role:`option`,"aria-selected":s?`true`:`false`,id:`${z.targetUid.value}_${l}`,onClick:()=>{Ce(n)}};return i||(c.value===l&&(u.focused=!0),a.platform.is.desktop&&(u.onMousemove=()=>{o.value&&we(l)})),{index:l,opt:n,html:ie.value(n),label:he.value(n),selected:u.active,focused:u.focused,toggleOption:Ce,setOptionIndex:we,itemProps:u}})}),de=(0,e.computed)(()=>t.dropdownIcon===void 0?a.iconSet.arrow.dropdown:t.dropdownIcon),fe=(0,e.computed)(()=>!t.optionsCover&&!t.outlined&&!t.standout&&!t.borderless&&!t.rounded),pe=(0,e.computed)(()=>t.optionsSelectedClass===void 0?t.color===void 0?``:`text-${t.color}`:t.optionsSelectedClass),me=(0,e.computed)(()=>Bu(t.optionValue,`value`)),he=(0,e.computed)(()=>Bu(t.optionLabel,`label`)),ge=(0,e.computed)(()=>Bu(t.optionDisable,`disable`)),J=(0,e.computed)(()=>V.value.map(me.value)),ve=(0,e.computed)(()=>{let e={onInput:Re,onChange:j,onKeydown:Me,onKeyup:Ae,onKeypress:je,onFocus:Oe,onClick(e){h&&E(e)}};return e.onCompositionstart=e.onCompositionupdate=e.onCompositionend=j,e});(0,e.watch)(V,e=>{m=e,t.useInput&&t.fillInput&&!t.multiple&&!z.innerLoading.value&&(!s.value&&!o.value||!U.value)&&(g||et(),(s.value||o.value)&&Ve(``))},{immediate:!0}),(0,e.watch)(()=>t.fillInput,et),(0,e.watch)(o,tt),(0,e.watch)(M,nt);function ye(e){return t.emitValue?me.value(e):e}function be(e){if(e!==-1&&e=t.maxValues)return;let a=[...t.modelValue];r(`add`,{index:a.length,value:i}),a.push(i),r(`update:modelValue`,a)}function Ce(e,n){if(!z.editable.value||e===void 0||ge.value(e)===!0)return;let i=me.value(e);if(!t.multiple){n||(Be(t.fillInput?he.value(e):``,!0,!0),$e()),C.value?.focus(),(V.value.length===0||!_e(me.value(V.value[0]),i))&&r(`update:modelValue`,t.emitValue?i:e);return}if((!h||u.value)&&z.focus(),Oe(),V.value.length===0){let n=t.emitValue?i:e;r(`add`,{index:0,value:n}),r(`update:modelValue`,t.multiple?[n]:n);return}let a=[...t.modelValue],o=J.value.findIndex(e=>_e(e,i));if(o!==-1)r(`remove`,{index:o,value:a.splice(o,1)[0]});else{if(t.maxValues!==void 0&&a.length>=t.maxValues)return;let n=t.emitValue?i:e;r(`add`,{index:a.length,value:n}),a.push(n)}r(`update:modelValue`,a)}function we(e){if(!a.platform.is.desktop)return;let t=e!==-1&&e=0?he.value(t.options[r]):v,!0))}}function Ee(e,n){let r=t=>_e(me.value(t),e);return t.options.find(r)||n.find(r)||e}function De(e){let t=me.value(e);return J.value.find(e=>_e(e,t))!==void 0}function Oe(e){t.useInput&&C.value!==null&&(e===void 0||C.value===e.target&&e.target.value===q.value)&&C.value.select()}function ke(e){B(e,27)&&o.value&&(E(e),$e(),et()),r(`keyup`,e)}function Ae(e){let{value:n}=e.target;if(e.keyCode!==void 0){ke(e);return}if(e.target.value=``,f!==null&&(clearTimeout(f),f=null),p!==null&&(clearTimeout(p),p=null),et(),typeof n==`string`&&n.length!==0){let e=n.toLocaleLowerCase(),r=n=>{let r=t.options.find(t=>String(n.value(t)).toLocaleLowerCase()===e);return r===void 0?!1:(V.value.includes(r)?$e():Ce(r),!0)},i=e=>{!r(me)&&!e&&!r(he)&&Ve(n,!0,()=>i(!0))};i()}else z.clearValue(e)}function je(e){r(`keypress`,e)}function Me(n){if(r(`keydown`,n),te(n))return;let i=l.value.length!==0&&(t.newValueMode!==void 0||t.onNewValue!==void 0),a=!n.shiftKey&&!t.disableTabSelection&&!t.multiple&&(c.value!==-1||i);if(n.keyCode===27){D(n);return}if(n.keyCode===9&&!a){Xe();return}if(n.target===void 0||n.target.id!==z.targetUid.value||!z.editable.value)return;if(n.keyCode===40&&!z.innerLoading.value&&!o.value){O(n),Qe();return}if(n.keyCode===8&&(t.useChips||t.clearable)&&!t.hideSelected&&l.value.length===0){t.multiple&&Array.isArray(t.modelValue)?be(t.modelValue.length-1):!t.multiple&&t.modelValue!==null&&r(`update:modelValue`,null);return}(n.keyCode===35||n.keyCode===36)&&(typeof l.value!=`string`||l.value.length===0)&&(O(n),c.value=-1,Te(n.keyCode===36?1:-1,t.multiple)),(n.keyCode===33||n.keyCode===34)&&P.value!==void 0&&(O(n),c.value=Math.max(-1,Math.min(M.value,c.value+(n.keyCode===33?-1:1)*P.value.view)),Te(n.keyCode===33?1:-1,t.multiple)),(n.keyCode===38||n.keyCode===40)&&(O(n),Te(n.keyCode===38?-1:1,t.multiple));let s=M.value;if((b===void 0||x0&&!t.useInput&&n.key!==void 0&&n.key.length===1&&!n.altKey&&!n.ctrlKey&&!n.metaKey&&(n.keyCode!==32||b.length!==0)){o.value||Qe(n);let r=n.key.toLocaleLowerCase(),i=b.length===1&&b[0]===r;x=Date.now()+1500,i||(O(n),b+=r);let a=RegExp(`^`+[...b].map(e=>".*+?^${}()|[]\\".includes(e)?`\\`+e:e).join(`.*`),`i`),l=c.value;if(i||l<0||!a.test(he.value(t.options[l])))do l=Fe(l+1,-1,s-1);while(l!==c.value&&(ge.value(t.options[l])===!0||!a.test(he.value(t.options[l]))));c.value!==l&&(0,e.nextTick)(()=>{we(l),R(l),l>=0&&t.useInput&&t.fillInput&&ze(he.value(t.options[l]),!0)});return}if(!(n.keyCode!==13&&(n.keyCode!==32||t.useInput||b!==``)&&(n.keyCode!==9||!a))){if(n.keyCode!==9&&O(n),c.value!==-1&&c.value{if(n){if(!Ru(n))return}else n=t.newValueMode;Be(``,!t.multiple,!0),e!=null&&((n===`toggle`?Ce:Se)(e,n===`add-unique`),t.multiple||(C.value?.focus(),$e()))};if(t.onNewValue===void 0?e(l.value):r(`newValue`,l.value,e),!t.multiple)return}o.value?Xe():z.innerLoading.value||Qe()}}function Ne(){return h?k.value:w.value!==null&&w.value.contentEl!==null?w.value.contentEl:void 0}function Pe(){return Ne()}function Y(){return t.hideSelected?[]:n[`selected-item`]===void 0?n.selected===void 0?t.useChips?le.value.map((n,r)=>(0,e.h)(Ji,{key:`option-`+r,removable:z.editable.value&&ge.value(n.opt)!==!0,dense:!0,textColor:t.color,tabindex:oe.value,onRemove(){n.removeAtIndex(r)}},()=>(0,e.h)(`span`,{class:`ellipsis`,[n.html?`innerHTML`:`textContent`]:he.value(n.opt)}))):[(0,e.h)(`span`,{class:`ellipsis`,[ae.value?`innerHTML`:`textContent`]:re.value})]:[n.selected()].flat():le.value.map(e=>n[`selected-item`](e))}function Ie(){if(K.value)return n[`no-option`]===void 0?void 0:n[`no-option`]({inputValue:l.value});let t=n.option===void 0?t=>(0,e.h)(Ys,{key:t.index,...t.itemProps},()=>(0,e.h)(Xs,()=>(0,e.h)(fc,()=>(0,e.h)(`span`,{[t.html?`innerHTML`:`textContent`]:t.label})))):n.option,r=I(`div`,ue.value.map(t));return n[`before-options`]!==void 0&&(r=[n[`before-options`](),...r].flat()),Ze(n[`after-options`],r)}function Le(n,r){let i=r?{...se.value,...z.splitAttrs.attributes.value}:void 0,a={ref:r?C:void 0,key:`i_t`,class:W.value,style:t.inputStyle,value:l.value===void 0?``:l.value,type:`search`,...i,id:r?z.targetUid.value:void 0,maxlength:t.maxlength,autocomplete:t.autocomplete,"data-autofocus":n===!0||t.autofocus||void 0,disabled:t.disable,readonly:t.readonly,...ve.value};return!n&&h&&(Array.isArray(a.class)?a.class=[...a.class,`no-pointer-events`]:a.class+=` no-pointer-events`),(0,e.h)(`input`,a)}function Re(e){f!==null&&(clearTimeout(f),f=null),p!==null&&(clearTimeout(p),p=null),!e?.target?.qComposing&&(ze(e.target.value||``),g=!0,v=l.value,!z.focused.value&&(!h||u.value)&&z.focus(),t.onFilter!==void 0&&(f=setTimeout(()=>{f=null,Ve(l.value)},t.inputDebounce)))}function ze(e,n){l.value!==e&&(l.value=e,n||t.inputDebounce===0||t.inputDebounce===`0`?r(`inputValue`,e):p=setTimeout(()=>{p=null,r(`inputValue`,e)},t.inputDebounce))}function Be(e,n,r){g=r!==!0,t.useInput&&(ze(e,!0),(n||g)&&(v=e),n||Ve(e))}function Ve(n,a,s){if(t.onFilter===void 0||!a&&!z.focused.value)return;z.innerLoading.value?r(`filterAbort`):(z.innerLoading.value=!0,d.value=!0),n!==``&&!t.multiple&&V.value.length!==0&&!g&&n===he.value(V.value[0])&&(n=``);let c=setTimeout(()=>{o.value&&=!1},10);_!==null&&clearTimeout(_),_=c,r(`filter`,n,(t,n)=>{(a||z.focused.value)&&_===c&&(clearTimeout(_),typeof t==`function`&&t(),d.value=!1,(0,e.nextTick)(()=>{z.innerLoading.value=!1,z.editable.value&&(a?o.value&&$e():o.value?tt(!0):o.value=!0),typeof n==`function`&&(0,e.nextTick)(()=>{n(i)}),typeof s==`function`&&(0,e.nextTick)(()=>{s(i)})}))},()=>{z.focused.value&&_===c&&(clearTimeout(_),z.innerLoading.value=!1,d.value=!1),o.value&&=!1})}function He(){return(0,e.h)(Xr,{ref:w,class:G.value,style:t.popupContentStyle,modelValue:o.value,fit:!t.menuShrink,cover:t.optionsCover&&!K.value&&!t.useInput,anchor:t.menuAnchor,self:t.menuSelf,offset:t.menuOffset,dark:H.value,noParentEvent:!0,noRefocus:!0,noFocus:!0,noRouteDismiss:t.popupNoRouteDismiss,square:fe.value,transitionShow:t.transitionShow,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,separateClosePopup:!0,...ce.value,onScrollPassive:L,onBeforeShow:it,onBeforeHide:Ue,onShow:We},Ie)}function Ue(e){at(e),Xe()}function We(){ee()}function Ge(e){E(e),C.value?.focus(),u.value=!0,window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,0)}function Ke(t){E(t),(0,e.nextTick)(()=>{u.value=!1})}function qe(){let r=[(0,e.h)(Vc,{class:`col-auto ${z.fieldClass.value}`,...ne.value,for:z.targetUid.value,dark:H.value,square:!0,loading:d.value,itemAligned:!1,filled:!0,stackLabel:l.value.length!==0,...z.splitAttrs.listeners.value,onFocus:Ge,onBlur:Ke},{...n,rawControl:()=>z.getControl(!0),before:void 0,after:void 0})];return o.value&&r.push((0,e.h)(`div`,{ref:k,class:G.value+` scroll`,style:t.popupContentStyle,...ce.value,onClick:D,onScrollPassive:L},Ie())),(0,e.h)(Rs,{ref:T,modelValue:s.value,position:t.useInput?`top`:void 0,transitionShow:y,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,noRouteDismiss:t.popupNoRouteDismiss,onBeforeShow:it,onBeforeHide:Je,onHide:Ye,onShow:X},()=>(0,e.h)(`div`,{class:`q-select__dialog`+(H.value?` q-select__dialog--dark q-dark`:``)+(u.value?` q-select__dialog--focused`:``)},r))}function Je(e){at(e),T.value!==null&&T.value.__updateRefocusTarget(z.rootRef.value.querySelector(`.q-field__native > [tabindex]:last-child`)),z.focused.value=!1}function Ye(e){$e(),z.focused.value||r(`blur`,e),et()}function X(){let e=document.activeElement;(e===null||e.id!==z.targetUid.value)&&C.value!==null&&C.value!==e&&C.value.focus(),ee()}function Xe(){s.value||(c.value=-1,o.value&&=!1,z.focused.value||(_!==null&&(clearTimeout(_),_=null),z.innerLoading.value&&(r(`filterAbort`),z.innerLoading.value=!1,d.value=!1)))}function Qe(r){z.editable.value&&(h?(z.onControlFocusin(r),s.value=!0,(0,e.nextTick)(()=>{z.focus()})):z.focus(),t.onFilter===void 0?(!K.value||n[`no-option`]!==void 0)&&(o.value=!0):Ve(l.value))}function $e(){s.value=!1,Xe()}function et(){t.useInput&&Be(!t.multiple&&t.fillInput&&V.value.length!==0&&he.value(V.value[0])||``,!0,!0)}function tt(e){let n=-1;if(e){if(V.value.length!==0){let e=me.value(V.value[0]);n=t.options.findIndex(t=>_e(me.value(t),e))}F(n)}we(n)}function nt(t,n){o.value&&!z.innerLoading.value&&(F(-1,!0),(0,e.nextTick)(()=>{o.value&&!z.innerLoading.value&&(t>n?F():tt(!0))}))}function rt(){s.value||w.value?.updatePosition()}function it(e){e!==void 0&&E(e),r(`popupShow`,e),z.hasPopupOpen=!0,z.onControlFocusin(e)}function at(e){e!==void 0&&E(e),r(`popupHide`,e),z.hasPopupOpen=!1,z.onControlFocusout(e)}function ot(){h=!a.platform.is.mobile&&t.behavior!==`dialog`?!1:t.behavior!==`menu`&&(!t.useInput||n[`no-option`]!==void 0||t.onFilter!==void 0||!K.value),y=a.platform.is.ios&&h&&t.useInput?`fade`:t.transitionShow}return(0,e.onBeforeUpdate)(ot),(0,e.onUpdated)(rt),ot(),(0,e.onBeforeUnmount)(()=>{f!==null&&clearTimeout(f),p!==null&&clearTimeout(p)}),Object.assign(i,{showPopup:Qe,hidePopup:$e,removeAtIndex:be,add:Se,toggleOption:Ce,getOptionIndex:()=>c.value,setOptionIndex:we,moveOptionSelection:Te,filter:Ve,updateMenuPosition:rt,updateInputValue:Be,isOptionSelected:De,getEmittingOptionValue:ye,isOptionDisabled:(...e)=>ge.value(...e)===!0,getOptionValue:(...e)=>me.value(...e),getOptionLabel:(...e)=>he.value(...e)}),Object.assign(z,{innerValue:V,fieldClass:(0,e.computed)(()=>`q-select q-field--auto-height q-select--with${t.useInput?``:`out`}-input q-select--with${t.useChips?``:`out`}-chips q-select--${t.multiple?`multiple`:`single`}`),inputRef:S,targetRef:C,hasValue:U,showPopup:Qe,floatingLabel:(0,e.computed)(()=>!t.hideSelected&&U.value||typeof l.value==`number`||l.value.length!==0||Pc(t.displayValue)),getControlChild:()=>{if(z.editable.value&&(s.value||!K.value||n[`no-option`]!==void 0))return h?qe():He();z.hasPopupOpen&&=!1},controlEvents:{onFocusin(e){z.onControlFocusin(e)},onFocusout(e){z.onControlFocusout(e,()=>{et(),Xe()})},onClick(e){if(D(e),!h&&o.value){Xe(),C.value?.focus();return}Qe(e)}},getControl:n=>{let r=Y(),i=n===!0||!s.value||!h;if(t.useInput)r.push(Le(n,i));else if(z.editable.value){let a=i?se.value:void 0;r.push((0,e.h)(`input`,{ref:i?C:void 0,key:`d_t`,class:`q-select__focus-target`,id:i?z.targetUid.value:void 0,value:re.value,readonly:!0,"data-autofocus":n===!0||t.autofocus||void 0,...a,onKeydown:Me,onKeyup:ke,onKeypress:je})),i&&typeof t.autocomplete==`string`&&t.autocomplete.length!==0&&r.push((0,e.h)(`input`,{class:`q-select__autocomplete-input`,autocomplete:t.autocomplete,tabindex:-1,onKeyup:Ae}))}if(A.value!==void 0&&!t.disable&&J.value.length!==0){let n=J.value.map(t=>(0,e.h)(`option`,{value:t,selected:!0}));r.push((0,e.h)(`select`,{class:`hidden`,name:A.value,multiple:t.multiple},n))}return(0,e.h)(`div`,{class:`q-field__native row items-center`,...t.useInput||!i?void 0:z.splitAttrs.attributes.value,...z.splitAttrs.listeners.value},r)},getInnerAppend:()=>!t.loading&&!d.value&&!t.hideDropdownIcon?[(0,e.h)(Z,{class:`q-select__dropdown-icon`+(o.value?` rotate-180`:``),name:de.value})]:null}),Bc(z)}});let Hu=[`text`,`rect`,`circle`,`QBtn`,`QBadge`,`QChip`,`QToolbar`,`QCheckbox`,`QRadio`,`QToggle`,`QSlider`,`QRange`,`QInput`,`QAvatar`],Uu=[`wave`,`pulse`,`pulse-x`,`pulse-y`,`fade`,`blink`,`none`];var Wu=h({name:`QSkeleton`,props:{...Q,tag:{type:String,default:`div`},type:{type:String,validator:e=>Hu.includes(e),default:`rect`},animation:{type:String,validator:e=>Uu.includes(e),default:`wave`},animationSpeed:{type:[String,Number],default:1500},square:Boolean,bordered:Boolean,size:String,width:String,height:String},setup(t,{slots:n}){let r=$(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>{let e=t.size===void 0?[t.width,t.height]:[t.size,t.size];return{"--q-skeleton-speed":`${t.animationSpeed}ms`,width:e[0],height:e[1]}}),a=(0,e.computed)(()=>`q-skeleton q-skeleton--${r.value?`dark`:`light`} q-skeleton--type-${t.type}`+(t.animation===`none`?``:` q-skeleton--anim q-skeleton--anim-${t.animation}`)+(t.square?` q-skeleton--square`:``)+(t.bordered?` q-skeleton--bordered`:``));return()=>(0,e.h)(t.tag,{class:a.value,style:i.value},X(n.default))}});let Gu=[[`left`,`center`,`start`,`width`],[`right`,`center`,`end`,`width`],[`top`,`start`,`center`,`height`],[`bottom`,`end`,`center`,`height`]];var Ku=h({name:`QSlideItem`,props:{...Q,leftColor:String,rightColor:String,topColor:String,bottomColor:String,onSlide:Function},emits:[`action`,`top`,`right`,`bottom`,`left`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=$(t,a),{getCache:s}=xi(),c=(0,e.ref)(null),l=null,u={},d={},f={},p=(0,e.computed)(()=>a.lang.rtl?{left:`right`,right:`left`}:{left:`left`,right:`right`}),m=(0,e.computed)(()=>`q-slide-item q-item-type overflow-hidden`+(o.value?` q-slide-item--dark q-dark`:``));function h(){c.value.style.transform=`translate(0,0)`}function g(e,n,i){t.onSlide!==void 0&&r(`slide`,{side:e,ratio:n,isReset:i})}function _(e){let t=c.value;if(e.isFirst)u={dir:null,size:{left:0,right:0,top:0,bottom:0},scale:0},t.classList.add(`no-transition`),Gu.forEach(e=>{if(n[e[0]]!==void 0){let t=f[e[0]];t.style.transform=`scale(1)`,u.size[e[0]]=t.getBoundingClientRect()[e[3]]}}),u.axis=e.direction===`up`||e.direction===`down`?`Y`:`X`;else if(e.isFinal){if(t.classList.remove(`no-transition`),u.scale===1){t.style.transform=`translate${u.axis}(${u.dir*100}%)`,l!==null&&clearTimeout(l);let e=u.showing;l=setTimeout(()=>{l=null,r(e,{reset:h}),r(`action`,{side:e,reset:h})},230)}else t.style.transform=`translate(0,0)`,g(u.showing,0,!0);return}else e.direction=u.axis===`X`?e.offset.x<0?`left`:`right`:e.offset.y<0?`up`:`down`;if(n.left===void 0&&e.direction===p.value.right||n.right===void 0&&e.direction===p.value.left||n.top===void 0&&e.direction===`down`||n.bottom===void 0&&e.direction===`up`){t.style.transform=`translate(0,0)`;return}let i,a,o;u.axis===`X`?(a=e.direction===`left`?-1:1,i=a===1?p.value.left:p.value.right,o=e.distance.x):(a=e.direction===`up`?-2:2,i=a===2?`top`:`bottom`,o=e.distance.y),(u.dir===null||Math.abs(a)===Math.abs(u.dir))&&(u.dir!==a&&([`left`,`right`,`top`,`bottom`].forEach(e=>{d[e]&&(d[e].style.visibility=i===e?`visible`:`hidden`)}),u.showing=i,u.dir=a),u.scale=Math.max(0,Math.min(1,(o-40)/u.size[i])),t.style.transform=`translate${u.axis}(${o*a/Math.abs(a)}px)`,f[i].style.transform=`scale(${u.scale})`,g(i,u.scale,!1))}return(0,e.onBeforeUpdate)(()=>{d={},f={}}),(0,e.onBeforeUnmount)(()=>{l!==null&&clearTimeout(l)}),Object.assign(i,{reset:h}),()=>{let r=[],i={left:n[p.value.right]!==void 0,right:n[p.value.left]!==void 0,up:n.bottom!==void 0,down:n.top!==void 0},a=Object.keys(i).filter(e=>i[e]);Gu.forEach(i=>{let a=i[0];n[a]!==void 0&&r.push((0,e.h)(`div`,{key:a,ref:e=>{d[a]=e},class:`q-slide-item__${a} absolute-full row no-wrap items-${i[1]} justify-${i[2]}`+(t[a+`Color`]===void 0?``:` bg-${t[a+`Color`]}`)},[(0,e.h)(`div`,{ref:e=>{f[a]=e}},n[a]())]))});let o=(0,e.h)(`div`,{key:`${a.length===0?`only-`:``} content`,ref:c,class:`q-slide-item__content`},X(n.default));return a.length===0?r.push(o):r.push((0,e.withDirectives)(o,s(`dir#`+a.join(``),()=>{let e={prevent:!0,stop:!0,mouse:!0};return a.forEach(t=>{e[t]=!0}),[[na,_,void 0,e]]}))),(0,e.h)(`div`,{class:m.value},r)}}}),qu=h({name:`QSpace`,setup(){let t=(0,e.h)(`div`,{class:`q-space`});return()=>t}}),Ju=h({name:`QSpinnerAudio`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,fill:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 55 80`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Yu=h({name:`QSpinnerBall`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,stroke:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 57 57`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Xu=h({name:`QSpinnerBars`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,fill:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 135 140`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Zu=h({name:`QSpinnerBox`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Qu=h({name:`QSpinnerClock`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),$u=h({name:`QSpinnerComment`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,innerHTML:``})}}),ed=h({name:`QSpinnerCube`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,innerHTML:``})}}),td=h({name:`QSpinnerDots`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,fill:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 120 30`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),nd=h({name:`QSpinnerFacebook`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,xmlns:`http://www.w3.org/2000/svg`,preserveAspectRatio:`xMidYMid`,innerHTML:``})}}),rd=h({name:`QSpinnerGears`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),id=h({name:`QSpinnerGrid`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,fill:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 105 105`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),ad=h({name:`QSpinnerHearts`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,fill:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 140 64`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),od=h({name:`QSpinnerHourglass`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),sd=h({name:`QSpinnerInfinity`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,innerHTML:``})}}),cd=h({name:`QSpinnerIos`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,stroke:`currentColor`,fill:`currentColor`,viewBox:`0 0 64 64`,innerHTML:``})}}),ld=h({name:`QSpinnerOrbit`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),ud=h({name:`QSpinnerOval`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,stroke:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 38 38`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),dd=h({name:`QSpinnerPie`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),fd=h({name:`QSpinnerPuff`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,stroke:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 44 44`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),pd=h({name:`QSpinnerRadio`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),md=h({name:`QSpinnerRings`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,stroke:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 45 45`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),hd=h({name:`QSpinnerTail`,props:Bt,setup(t){let{cSize:n,classes:r}=Vt(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 38 38`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),gd=h({name:`QSplitter`,props:{...Q,modelValue:{type:Number,required:!0},reverse:Boolean,unit:{type:String,default:`%`,validator:e=>[`%`,`px`].includes(e)},limits:{type:Array,validator:e=>e.length!==2||typeof e[0]!=`number`||typeof e[1]!=`number`?!1:e[0]>=0&&e[0]<=e[1]},emitImmediately:Boolean,horizontal:Boolean,disable:Boolean,beforeClass:[Array,String,Object],afterClass:[Array,String,Object],separatorClass:[Array,String,Object],separatorStyle:[Array,String,Object]},emits:[`update:modelValue`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=$(t,i),o=(0,e.ref)(null),s={before:(0,e.ref)(null),after:(0,e.ref)(null)},c=(0,e.computed)(()=>`q-splitter no-wrap ${t.horizontal?`q-splitter--horizontal column`:`q-splitter--vertical row`} q-splitter--${t.disable?`disabled`:`workable`}`+(a.value?` q-splitter--dark`:``)),l=(0,e.computed)(()=>t.horizontal?`height`:`width`),u=(0,e.computed)(()=>t.reverse?`after`:`before`),d=(0,e.computed)(()=>t.limits===void 0?t.unit===`%`?[10,90]:[50,1/0]:t.limits);function f(e){return(t.unit===`%`?e:Math.round(e))+t.unit}let p=(0,e.computed)(()=>({[u.value]:{[l.value]:f(t.modelValue)}})),m,h,g,_,v;function y(e){if(e.isFirst){let e=o.value.getBoundingClientRect()[l.value];m=t.horizontal?`up`:`left`,h=t.unit===`%`?100:e,g=Math.min(h,d.value[1],Math.max(d.value[0],t.modelValue)),_=(t.reverse?-1:1)*(t.horizontal?1:i.lang.rtl?-1:1)*(t.unit===`%`?e===0?0:100/e:1),o.value.classList.add(`q-splitter--active`);return}if(e.isFinal){v!==t.modelValue&&r(`update:modelValue`,v),o.value.classList.remove(`q-splitter--active`);return}let n=g+_*(e.direction===m?-1:1)*e.distance[t.horizontal?`y`:`x`];v=Math.min(h,d.value[1],Math.max(d.value[0],n)),s[u.value].value.style[l.value]=f(v),t.emitImmediately&&t.modelValue!==v&&r(`update:modelValue`,v)}let b=(0,e.computed)(()=>[[na,y,void 0,{[t.horizontal?`vertical`:`horizontal`]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]);function x(e,t){et[1]&&r(`update:modelValue`,t[1])}return(0,e.watch)(()=>t.modelValue,e=>{x(e,d.value)}),(0,e.watch)(()=>t.limits,()=>{(0,e.nextTick)(()=>{x(t.modelValue,d.value)})}),()=>{let r=[(0,e.h)(`div`,{ref:s.before,class:[`q-splitter__panel q-splitter__before`+(t.reverse?` col`:``),t.beforeClass],style:p.value.before},X(n.before)),(0,e.h)(`div`,{class:[`q-splitter__separator`,t.separatorClass],style:t.separatorStyle,"aria-disabled":t.disable?`true`:void 0},[$e(`div`,{class:`q-splitter__separator-area absolute-full`},X(n.separator),`sep`,!t.disable,()=>b.value)]),(0,e.h)(`div`,{ref:s.after,class:[`q-splitter__panel q-splitter__after`+(t.reverse?``:` col`),t.afterClass],style:p.value.after},X(n.after))];return(0,e.h)(`div`,{class:c.value,ref:o},Ze(n.default,r))}}});function _d(e){e.keyCode===32&&O(e)}var vd=h({name:`StepHeader`,props:{stepper:{},step:{},goToPanel:Function},setup(t,{attrs:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=(0,e.ref)(null),a=(0,e.computed)(()=>t.stepper.modelValue===t.step.name),o=(0,e.computed)(()=>{let e=t.step.disable;return e===!0||e===``}),s=(0,e.computed)(()=>{let e=t.step.error;return e===!0||e===``}),c=(0,e.computed)(()=>{let e=t.step.done;return!o.value&&(e===!0||e===``)}),l=(0,e.computed)(()=>{let e=t.step.headerNav;return!o.value&&t.stepper.headerNav&&(e===!0||e===``||e===void 0)}),u=(0,e.computed)(()=>t.step.prefix&&(!a.value||t.stepper.activeIcon===`none`)&&(!s.value||t.stepper.errorIcon===`none`)&&(!c.value||t.stepper.doneIcon===`none`)),d=(0,e.computed)(()=>{let e=t.step.icon||t.stepper.inactiveIcon;if(a.value){let n=t.step.activeIcon||t.stepper.activeIcon;return n===`none`?e:n||r.iconSet.stepper.active}if(s.value){let n=t.step.errorIcon||t.stepper.errorIcon;return n===`none`?e:n||r.iconSet.stepper.error}if(!o.value&&c.value){let n=t.step.doneIcon||t.stepper.doneIcon;return n===`none`?e:n||r.iconSet.stepper.done}return e}),f=(0,e.computed)(()=>{let e=s.value?t.step.errorColor||t.stepper.errorColor:void 0;if(a.value){let n=t.step.activeColor||t.stepper.activeColor||t.step.color;return n===void 0?e:n}return e===void 0?!o.value&&c.value?t.step.doneColor||t.stepper.doneColor||t.step.color||t.stepper.inactiveColor:t.step.color||t.stepper.inactiveColor:e}),p=(0,e.computed)(()=>`q-stepper__tab col-grow flex items-center no-wrap relative-position`+(f.value===void 0?``:` text-${f.value}`)+(s.value?` q-stepper__tab--error q-stepper__tab--error-with-`+(u.value?`prefix`:`icon`):``)+(a.value?` q-stepper__tab--active`:``)+(c.value?` q-stepper__tab--done`:``)+(l.value?` q-stepper__tab--navigation q-focusable q-hoverable`:``)+(o.value?` q-stepper__tab--disabled`:``)),m=(0,e.computed)(()=>t.stepper.headerNav&&l.value);function h(){i.value?.focus(),a.value||t.goToPanel(t.step.name)}function g(e){[13,32].includes(e.keyCode)&&(a.value||t.goToPanel(t.step.name),O(e))}return()=>{let r={class:p.value};l.value&&(r.onClick=h,r.onKeydown=_d,r.onKeyup=g,r.role=`button`,r[`aria-current`]=a.value?`step`:void 0,Object.assign(r,o.value?{tabindex:-1,"aria-disabled":`true`}:{tabindex:n.tabindex||0}));let s=[(0,e.h)(`div`,{class:`q-focus-helper`,tabindex:-1,ref:i}),(0,e.h)(`div`,{class:`q-stepper__dot row flex-center q-stepper__line relative-position`},[(0,e.h)(`span`,{class:`row flex-center`},[u.value?t.step.prefix:(0,e.h)(Z,{name:d.value})])])];if(t.step.title!==void 0&&t.step.title!==null){let n=[(0,e.h)(`div`,{class:`q-stepper__title`},t.step.title)];t.step.caption!==void 0&&t.step.caption!==null&&n.push((0,e.h)(`div`,{class:`q-stepper__caption`},t.step.caption)),s.push((0,e.h)(`div`,{class:`q-stepper__label q-stepper__line relative-position`},n))}return(0,e.withDirectives)((0,e.h)(`div`,r,s),[[nn,m.value]])}}});function yd(t){return(0,e.h)(`div`,{class:`q-stepper__step-content`},[(0,e.h)(`div`,{class:`q-stepper__step-inner`},X(t.default))])}let bd={setup(e,{slots:t}){return()=>yd(t)}};var xd=h({name:`QStep`,props:{...Si,icon:String,color:String,title:{type:String,required:!0},caption:String,prefix:[String,Number],doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String,headerNav:{type:Boolean,default:!0},done:Boolean,error:Boolean,onScroll:[Function,Array]},setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=(0,e.inject)(de,J);if(a===J)return console.error(`QStep needs to be a child of QStepper`),J;let{getCache:o}=xi(),s=(0,e.ref)(null),c=(0,e.computed)(()=>a.value.modelValue===t.name),l=(0,e.computed)(()=>!i.platform.is.ios&&i.platform.is.chrome||!c.value||!a.value.vertical?{}:{onScroll(e){let{target:n}=e;n.scrollTop>0&&(n.scrollTop=0),t.onScroll!==void 0&&r(`scroll`,e)}}),u=(0,e.computed)(()=>typeof t.name==`string`||typeof t.name==`number`?t.name:String(t.name));function d(){let t=a.value.vertical;return t&&a.value.keepAlive?(0,e.h)(e.KeepAlive,a.value.keepAliveProps.value,c.value?[(0,e.h)(a.value.needsUniqueKeepAliveWrapper.value?o(u.value,()=>({...bd,name:u.value})):bd,{key:u.value},n.default)]:void 0):!t||c.value?yd(n):void 0}return()=>(0,e.h)(`div`,{ref:s,class:`q-stepper__step`,role:`tabpanel`,...l.value},a.value.vertical?[(0,e.h)(vd,{stepper:a.value,step:t,goToPanel:a.value.goToPanel}),a.value.animated?(0,e.h)(pc,d):d()]:[d()])}});let Sd=/(-\w)/g;function Cd(e){let t={};for(let n in e){let r=n.replace(Sd,e=>e[1].toUpperCase());t[r]=e[n]}return t}var wd=h({name:`QStepper`,props:{...Q,...wi,flat:Boolean,bordered:Boolean,alternativeLabels:Boolean,headerNav:Boolean,contracted:Boolean,headerClass:String,inactiveColor:String,inactiveIcon:String,doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String},emits:Ti,setup(t,{slots:n}){let r=$(t,(0,e.getCurrentInstance)().proxy.$q),{updatePanelsList:i,isValidPanelName:a,updatePanelIndex:o,getPanelContent:s,getPanels:c,panelDirectives:l,goToPanel:u,keepAliveProps:d,needsUniqueKeepAliveWrapper:f}=Di();(0,e.provide)(de,(0,e.computed)(()=>({goToPanel:u,keepAliveProps:d,needsUniqueKeepAliveWrapper:f,...t})));let p=(0,e.computed)(()=>`q-stepper q-stepper--${t.vertical?`vertical`:`horizontal`}`+(t.flat?` q-stepper--flat`:``)+(t.bordered?` q-stepper--bordered`:``)+(r.value?` q-stepper--dark q-dark`:``)),m=(0,e.computed)(()=>`q-stepper__header row items-stretch justify-between q-stepper__header--${t.alternativeLabels?`alternative`:`standard`}-labels`+(t.bordered||!t.flat?` q-stepper__header--border`:``)+(t.contracted?` q-stepper__header--contracted`:``)+(t.headerClass===void 0?``:` ${t.headerClass}`));function h(){let r=X(n.message,[]);if(t.vertical){a(t.modelValue)&&o();let i=(0,e.h)(`div`,{class:`q-stepper__content`},X(n.default));return r===void 0?[i]:r.concat(i)}return[(0,e.h)(`div`,{class:m.value},c().map(n=>{let r=Cd(n.props);return(0,e.h)(vd,{key:r.name,stepper:t,step:r,goToPanel:u})})),r,$e(`div`,{class:`q-stepper__content q-panel-parent`},s(),`cont`,t.swipeable,()=>l.value)]}return()=>(i(n),(0,e.h)(`div`,{class:p.value},Ze(n.navigation,h())))}}),Td=h({name:`QStepperNavigation`,setup(t,{slots:n}){return()=>(0,e.h)(`div`,{class:`q-stepper__nav`},X(n.default))}}),Ed=h({name:`QTh`,props:{props:Object,autoWidth:Boolean},emits:[`click`],setup(t,{slots:n,emit:r}){let i=(0,e.getCurrentInstance)(),{proxy:{$q:a}}=i,o=e=>{r(`click`,e)},s=(e,n)=>{(e.key===`Enter`||e.key===` `)&&(t.props.sort(n),o(e),e.preventDefault())};return()=>{if(t.props===void 0)return(0,e.h)(`th`,{class:t.autoWidth?`q-table--col-auto-width`:``,onClick:o},X(n.default));let r,c,l=i.vnode.key;if(l!==null){if(r=t.props.colsMap[l],r===void 0)return}else r=t.props.col;if(r.sortable){let t=r.align===`right`?`unshift`:`push`;c=Xe(n.default,[]),c[t]((0,e.h)(Z,{class:r.__iconClass,name:a.iconSet.table.arrowUp}))}else c=X(n.default);let u={class:r.__thClass+(t.autoWidth?` q-table--col-auto-width`:``),style:r.headerStyle,onClick:e=>{r.sortable&&t.props.sort(r),o(e)}};return r.sortable&&(u.tabindex=0,u[`aria-sort`]=r.__ariaSort,u.onKeydown=e=>{e.key===` `&&e.preventDefault()},u.onKeyup=e=>{s(e,r)}),(0,e.h)(`th`,u,c)}}});function Dd(t,n){return(0,e.h)(`div`,t,[(0,e.h)(`table`,{class:`q-table`},n)])}let Od={list:jl,table:Wl},kd=[`list`,`table`,`__qtable`];var Ad=h({name:`QVirtualScroll`,props:{...Iu,type:{type:String,default:`list`,validator:e=>kd.includes(e)},items:{type:Array,default:()=>[]},itemsFn:Function,itemsSize:Number,scrollTarget:er},setup(t,{slots:n,attrs:r}){let i,a=(0,e.ref)(null),o=(0,e.computed)(()=>t.itemsSize>=0&&t.itemsFn!==void 0?Number.parseInt(t.itemsSize,10):Array.isArray(t.items)?t.items.length:0),{virtualScrollSliceRange:s,localResetVirtualScroll:c,padVirtualScroll:l,onVirtualScrollEvt:u}=Lu({virtualScrollLength:o,getVirtualScrollTarget:h,getVirtualScrollEl:m}),d=(0,e.computed)(()=>{if(o.value===0)return[];let e=(e,t)=>({index:s.value.from+t,item:e});return t.itemsFn===void 0?t.items.slice(s.value.from,s.value.to).map(e):t.itemsFn(s.value.from,s.value.to-s.value.from).map(e)}),f=(0,e.computed)(()=>`q-virtual-scroll q-virtual-scroll`+(t.virtualScrollHorizontal?`--horizontal`:`--vertical`)+(t.scrollTarget===void 0?` scroll`:``)),p=(0,e.computed)(()=>t.scrollTarget===void 0?{tabindex:0}:{});(0,e.watch)(o,()=>{c()}),(0,e.watch)(()=>t.scrollTarget,()=>{_(),g()});function m(){return a.value.$el||a.value}function h(){return i}function g(){i=nr(m(),t.scrollTarget),i.addEventListener(`scroll`,u,v.passive)}function _(){i!==void 0&&(i.removeEventListener(`scroll`,u,v.passive),i=void 0)}function y(){let e=l(t.type===`list`?`div`:`tbody`,d.value.map(n.default));return n.before!==void 0&&(e=n.before().concat(e)),Ze(n.after,e)}return(0,e.onBeforeMount)(()=>{c()}),(0,e.onMounted)(()=>{g()}),(0,e.onActivated)(()=>{g()}),(0,e.onDeactivated)(()=>{_()}),(0,e.onBeforeUnmount)(()=>{_()}),()=>{if(n.default===void 0){console.error(`QVirtualScroll: default scoped slot is required for rendering`);return}return t.type===`__qtable`?Dd({ref:a,class:`q-table__middle `+f.value},y()):(0,e.h)(Od[t.type],{...r,ref:a,class:[r.class,f.value],...p.value},y)}}});function jd(e,t){return new Date(e)-new Date(t)}let Md={sortMethod:Function,binaryStateSort:Boolean,columnSortOrder:{type:String,validator:e=>e===`ad`||e===`da`,default:`ad`}};function Nd(t,n,r,i){let a=(0,e.computed)(()=>{let{sortBy:e}=n.value;return e&&r.value.find(t=>t.name===e)||null}),o=(0,e.computed)(()=>t.sortMethod===void 0?(e,t,n)=>{let i=r.value.find(e=>e.name===t);if(i===void 0||i.field===void 0)return e;let a=n?-1:1,o=typeof i.field==`function`?e=>i.field(e):e=>e[i.field];return e.sort((e,t)=>{let n=o(e),r=o(t);return i.rawSort===void 0?n==null?-1*a:r==null?Number(a):i.sort===void 0?xe(n)&&xe(r)?(n-r)*a:ye(n)&&ye(r)?jd(n,r)*a:typeof n==`boolean`&&typeof r==`boolean`?(n-r)*a:([n,r]=[n,r].map(e=>String(e).toLocaleString().toLowerCase()),nt.name===e);t?.sortOrder&&(a=t.sortOrder)}let{sortBy:o,descending:s}=n.value;o===e?t.binaryStateSort?s=!s:s?a===`ad`?o=null:s=!1:a===`ad`?s=!0:o=null:(o=e,s=a===`da`),i({sortBy:o,descending:s,page:1})}return{columnToSort:a,computedSortMethod:o,sort:s}}let Pd={filter:[String,Object],filterMethod:Function};function Fd(t,n){let r=(0,e.computed)(()=>t.filterMethod===void 0?(e,t,n,r)=>{let i=t?t.toLowerCase():``;return e.filter(e=>n.some(t=>{let n=String(r(t,e));return(n===`undefined`||n===`null`?``:n.toLowerCase()).includes(i)}))}:t.filterMethod);return(0,e.watch)(()=>t.filter,()=>{(0,e.nextTick)(()=>{n({page:1},!0)})},{deep:!0}),{computedFilterMethod:r}}function Id(e,t){for(let n in t)if(t[n]!==e[n])return!1;return!0}function Ld(e){return e.page<1&&(e.page=1),e.rowsPerPage!==void 0&&e.rowsPerPage<1&&(e.rowsPerPage=0),e}let Rd={pagination:Object,rowsPerPageOptions:{type:Array,default:()=>[5,7,10,15,20,25,50,0]},"onUpdate:pagination":[Function,Array]};function zd(t,n){let{props:r,emit:i}=t,a=(0,e.ref)({sortBy:null,descending:!1,page:1,rowsPerPage:r.rowsPerPageOptions.length===0?5:r.rowsPerPageOptions[0],...r.pagination}),o=(0,e.computed)(()=>Ld(r[`onUpdate:pagination`]===void 0?a.value:{...a.value,...r.pagination})),s=(0,e.computed)(()=>o.value.rowsNumber!==void 0);function c(e){l({pagination:e,filter:r.filter})}function l(t={}){(0,e.nextTick)(()=>{i(`request`,{pagination:t.pagination===void 0?o.value:t.pagination,filter:t.filter===void 0?r.filter:t.filter,getCellValue:n})})}function u(e,t){let n=Ld({...o.value,...e});if(Id(o.value,n)){s.value&&t&&c(n);return}if(s.value){c(n);return}r.pagination!==void 0&&r[`onUpdate:pagination`]!==void 0?i(`update:pagination`,n):a.value=n}return{innerPagination:a,computedPagination:o,isServerSide:s,requestServerInteraction:l,setPagination:u}}function Bd(t,n,r,i,a,o){let{props:s,emit:c,proxy:{$q:l}}=t,u=(0,e.computed)(()=>i.value?r.value.rowsNumber||0:o.value),d=(0,e.computed)(()=>{let{page:e,rowsPerPage:t}=r.value;return(e-1)*t}),f=(0,e.computed)(()=>{let{page:e,rowsPerPage:t}=r.value;return e*t}),p=(0,e.computed)(()=>r.value.page===1),m=(0,e.computed)(()=>r.value.rowsPerPage===0?1:Math.max(1,Math.ceil(u.value/r.value.rowsPerPage))),h=(0,e.computed)(()=>f.value===0||r.value.page>=m.value),g=(0,e.computed)(()=>(s.rowsPerPageOptions.includes(n.value.rowsPerPage)?s.rowsPerPageOptions:[n.value.rowsPerPage,...s.rowsPerPageOptions]).map(e=>({label:e===0?l.lang.table.allRows:String(e),value:e})));(0,e.watch)(m,(e,t)=>{if(e===t)return;let n=r.value.page;e&&!n?a({page:1}):e1&&a({page:e-1})}function y(){let{page:e,rowsPerPage:t}=r.value;f.value>0&&e*t[`single`,`multiple`,`none`].includes(e)},selected:{type:Array,default:()=>[]}},Hd=[`update:selected`,`selection`];function Ud(t,n,r,i){let a=(0,e.computed)(()=>new Set(t.selected.map(i.value))),o=(0,e.computed)(()=>t.selection!==`none`),s=(0,e.computed)(()=>t.selection===`single`),c=(0,e.computed)(()=>t.selection===`multiple`),l=(0,e.computed)(()=>r.value.length!==0&&r.value.every(e=>a.value.has(i.value(e)))),u=(0,e.computed)(()=>!l.value&&r.value.some(e=>a.value.has(i.value(e)))),d=(0,e.computed)(()=>t.selected.length);function f(e){return a.value.has(e)}function p(){n(`update:selected`,[])}function m(e,r,a,o){n(`selection`,{rows:r,added:a,keys:e,evt:o}),n(`update:selected`,s.value?a?r:[]:a?[...t.selected,...r]:t.selected.filter(t=>!e.includes(i.value(t))))}return{hasSelectionMode:o,singleSelection:s,multipleSelection:c,allRowsSelected:l,someRowsSelected:u,rowsSelectedNumber:d,isRowSelected:f,clearSelection:p,updateSelection:m}}function Wd(e){return Array.isArray(e)?[...e]:[]}let Gd={expanded:Array},Kd=[`update:expanded`];function qd(t,n){let r=(0,e.ref)(Wd(t.expanded));(0,e.watch)(()=>t.expanded,e=>{r.value=Wd(e)});function i(e){return r.value.includes(e)}function a(e){t.expanded===void 0?r.value=e:n(`update:expanded`,e)}function o(e,t){let n=[...r.value],i=n.indexOf(e);t?i===-1&&(n.push(e),a(n)):i!==-1&&(n.splice(i,1),a(n))}return{isRowExpanded:i,setExpanded:a,updateExpanded:o}}let Jd={visibleColumns:Array};function Yd(t,n,r){let i=(0,e.computed)(()=>{if(t.columns!==void 0)return t.columns;let e=t.rows[0];return e===void 0?[]:Object.keys(e).map(t=>({name:t,label:t.toUpperCase(),field:t,align:xe(e[t])?`right`:`left`,sortable:!0}))}),a=(0,e.computed)(()=>{let{sortBy:e,descending:r}=n.value;return(t.visibleColumns===void 0?i.value:i.value.filter(e=>e.required||t.visibleColumns.includes(e.name))).map(t=>{let n=t.align||`right`,i=`text-${n}`;return{...t,align:n,__iconClass:`q-table__sort-icon q-table__sort-icon--${n}`,__ariaSort:t.sortable===!0?t.name===e?r?`descending`:`ascending`:`none`:void 0,__thClass:i+(t.headerClasses===void 0?``:` `+t.headerClasses)+(t.sortable?` sortable`:``)+(t.name===e?` sorted ${r?`sort-desc`:``}`:``),__tdStyle:t.style===void 0?()=>null:typeof t.style==`function`?t.style:()=>t.style,__tdClass:t.classes===void 0?()=>i:typeof t.classes==`function`?e=>i+` `+t.classes(e):()=>i+` `+t.classes}})});return{colList:i,computedCols:a,computedColsMap:(0,e.computed)(()=>{let e=Object.create(null);return a.value.forEach(t=>{e[t.name]=t}),e}),computedColspan:(0,e.computed)(()=>t.tableColspan===void 0?a.value.length+ +!!r.value:t.tableColspan)}}let Xd=`q-table__bottom row items-center`,Zd={};Fu.forEach(e=>{Zd[e]={}});function Qd(e,t){let n=typeof e.field==`function`?e.field(t):t[e.field];return e.format===void 0?n:e.format(n,t)}var $d=h({name:`QTable`,props:{rows:{type:Array,required:!0},rowKey:{type:[String,Function],default:`id`},columns:Array,loading:Boolean,iconFirstPage:String,iconPrevPage:String,iconNextPage:String,iconLastPage:String,title:String,hideHeader:Boolean,grid:Boolean,gridHeader:Boolean,dense:Boolean,flat:Boolean,bordered:Boolean,square:Boolean,separator:{type:String,default:`horizontal`,validator:e=>[`horizontal`,`vertical`,`cell`,`none`].includes(e)},wrapCells:Boolean,virtualScroll:Boolean,virtualScrollTarget:{},...Zd,noDataLabel:String,noResultsLabel:String,loadingLabel:String,selectedRowsLabel:Function,rowsPerPageLabel:String,paginationLabel:Function,color:{type:String,default:`grey-8`},titleClass:[String,Array,Object],tableStyle:[String,Array,Object],tableClass:[String,Array,Object],tableHeaderStyle:[String,Array,Object],tableHeaderClass:[String,Array,Object],tableRowStyleFn:Function,tableRowClassFn:Function,cardContainerClass:[String,Array,Object],cardContainerStyle:[String,Array,Object],cardStyle:[String,Array,Object],cardClass:[String,Array,Object],cardStyleFn:Function,cardClassFn:Function,hideBottom:Boolean,hideSelectedBanner:Boolean,hideNoData:Boolean,hidePagination:Boolean,onRowClick:Function,onRowDblclick:Function,onRowContextmenu:Function,...Q,...ki,...Jd,...Pd,...Rd,...Gd,...Vd,...Md},emits:[`request`,`virtualScroll`,...Ai,...Kd,...Hd],setup(t,{slots:n,emit:a}){let o=(0,e.getCurrentInstance)(),{proxy:{$q:s}}=o,c=$(t,s),{inFullscreen:l,toggleFullscreen:u}=ji(),d=(0,e.computed)(()=>typeof t.rowKey==`function`?t.rowKey:e=>e[t.rowKey]),f=(0,e.ref)(null),p=(0,e.ref)(null),m=(0,e.computed)(()=>!t.grid&&t.virtualScroll),h=(0,e.computed)(()=>` q-table__card`+(c.value?` q-table__card--dark q-dark`:``)+(t.square?` q-table--square`:``)+(t.flat?` q-table--flat`:``)+(t.bordered?` q-table--bordered`:``)),g=(0,e.computed)(()=>`q-table__container q-table--${t.separator}-separator column no-wrap`+(t.grid?` q-table--grid`:h.value)+(c.value?` q-table--dark`:``)+(t.dense?` q-table--dense`:``)+(t.wrapCells?``:` q-table--no-wrap`)+(l.value?` fullscreen scroll`:``)),_=(0,e.computed)(()=>g.value+(t.loading?` q-table--loading`:``));(0,e.watch)([()=>t.tableStyle,()=>t.tableClass,()=>t.tableHeaderStyle,()=>t.tableHeaderClass,g],()=>{m.value&&p.value?.reset()},{deep:!0});let{innerPagination:v,computedPagination:y,isServerSide:b,requestServerInteraction:x,setPagination:S}=zd(o,Qd),{computedFilterMethod:C}=Fd(t,S),{isRowExpanded:w,setExpanded:T,updateExpanded:E}=qd(t,a),D=(0,e.computed)(()=>{let e=t.rows;if(b.value||e.length===0)return e;let{sortBy:n,descending:r}=y.value;return t.filter&&(e=C.value(e,t.filter,z.value,Qd)),V.value!==null&&(e=ne.value(t.rows===e?[...e]:e,n,r)),e}),O=(0,e.computed)(()=>D.value.length),k=(0,e.computed)(()=>{let e=D.value;if(b.value)return e;let{rowsPerPage:n}=y.value;return n!==0&&(U.value===0&&t.rows!==e?e.length>W.value&&(e=e.slice(0,W.value)):e=e.slice(U.value,W.value)),e}),{hasSelectionMode:A,singleSelection:j,multipleSelection:M,allRowsSelected:N,someRowsSelected:P,rowsSelectedNumber:F,isRowSelected:I,clearSelection:L,updateSelection:R}=Ud(t,a,k,d),{colList:ee,computedCols:z,computedColsMap:te,computedColspan:B}=Yd(t,y,A),{columnToSort:V,computedSortMethod:ne,sort:H}=Nd(t,y,ee,S),{firstRowIndex:U,lastRowIndex:W,isFirstPage:G,isLastPage:K,pagesNumber:q,computedRowsPerPageOptions:re,computedRowsNumber:ie,firstPage:ae,prevPage:oe,nextPage:se,lastPage:ce}=Bd(o,v,y,b,S,O),le=(0,e.computed)(()=>k.value.length===0),ue=(0,e.computed)(()=>{let e={};return Fu.forEach(n=>{e[n]=t[n]}),e.virtualScrollItemSize===void 0&&(e.virtualScrollItemSize=t.dense?28:48),e});function de(){m.value&&p.value.reset()}function fe(){if(t.grid)return Ne();let r=t.hideHeader?null:we;if(m.value){let i=n[`top-row`],a=n[`bottom-row`],o={default:e=>ge(e.item,n.body,e.index)};if(i!==void 0){let t=(0,e.h)(`tbody`,i({cols:z.value}));o.before=r===null?()=>t:()=>[r(),t]}else r!==null&&(o.before=r);return a!==void 0&&(o.after=()=>(0,e.h)(`tbody`,a({cols:z.value}))),(0,e.h)(Ad,{ref:p,class:t.tableClass,style:t.tableStyle,...ue.value,scrollTarget:t.virtualScrollTarget,items:k.value,type:`__qtable`,tableColspan:B.value,onVirtualScroll:me},o)}let i=[J()];return r!==null&&i.unshift(r()),Dd({class:[`q-table__middle scroll`,t.tableClass],style:t.tableStyle},i)}function pe(e,n){if(p.value!==null){p.value.scrollTo(e,n);return}e=Number.parseInt(e,10);let r=f.value.querySelector(`tbody tr:nth-of-type(${e+1})`);if(r!==null){let n=f.value.querySelector(`.q-table__middle.scroll`),i=r.offsetTop-t.virtualScrollStickySizeStart,o=i{let i=n[`body-cell-${t.name}`],a=i===void 0?u:i;return a===void 0?(0,e.h)(`td`,{class:t.__tdClass(r),style:t.__tdStyle(r)},Qd(t,r)):a(ve({key:s,row:r,pageIndex:o,col:t}))});if(A.value){let i=n[`body-selection`],a=i===void 0?[(0,e.h)(Gi,{modelValue:l,color:t.color,dark:c.value,dense:t.dense,"onUpdate:modelValue":(e,t)=>{R([s],[r],e,t)}})]:i(ye({key:s,row:r,pageIndex:o}));f.unshift((0,e.h)(`td`,{class:`q-table--col-auto-width`},a))}let p={key:s,class:{selected:l}};if(t.onRowClick!==void 0&&(p.class[`cursor-pointer`]=!0,p.onClick=e=>{a(`rowClick`,e,r,o)}),t.onRowDblclick!==void 0&&(p.class[`cursor-pointer`]=!0,p.onDblclick=e=>{a(`rowDblclick`,e,r,o)}),t.onRowContextmenu!==void 0&&(p.class[`cursor-pointer`]=!0,p.onContextmenu=e=>{a(`rowContextmenu`,e,r,o)}),t.tableRowStyleFn!==void 0&&(p.style=t.tableRowStyleFn(r)),t.tableRowClassFn!==void 0){let e=t.tableRowClassFn(r);e&&(p.class[e]=!0)}return(0,e.h)(`tr`,p,f)}function J(){let t=n.body,r=n[`top-row`],i=n[`bottom-row`],a=k.value.map((e,n)=>ge(e,t,n));return(0,e.h)(`tbody`,[r?.({cols:z.value}),...a,i?.({cols:z.value})].flat())}function _e(e){return be(e),e.cols=e.cols.map(t=>r({...t},`value`,()=>Qd(t,e.row))),e}function ve(e){return be(e),r(e,`value`,()=>Qd(e.col,e.row)),e}function ye(e){return be(e),e}function be(e){Object.assign(e,{cols:z.value,colsMap:te.value,sort:H,rowIndex:U.value+e.pageIndex,color:t.color,dark:c.value,dense:t.dense}),A.value&&r(e,`selected`,()=>I(e.key),(t,n)=>{R([e.key],[e.row],t,n)}),r(e,`expand`,()=>w(e.key),t=>{E(e.key,t)})}let xe=(0,e.computed)(()=>({pagination:y.value,pagesNumber:q.value,isFirstPage:G.value,isLastPage:K.value,firstPage:ae,prevPage:oe,nextPage:se,lastPage:ce,inFullscreen:l.value,toggleFullscreen:u}));function Se(){let r=n.top,i=n[`top-left`],a=n[`top-right`],o=n[`top-selection`],s=A.value&&o!==void 0&&F.value>0,c=`q-table__top relative-position row items-center`;if(r!==void 0)return(0,e.h)(`div`,{class:c},[r(xe.value)]);let l;if(s?l=[o(xe.value)].flat():(l=[],i===void 0?t.title&&l.push((0,e.h)(`div`,{class:`q-table__control`},[(0,e.h)(`div`,{class:[`q-table__title`,t.titleClass]},t.title)])):l.push((0,e.h)(`div`,{class:`q-table__control`},[i(xe.value)]))),a!==void 0&&l.push((0,e.h)(`div`,{class:`q-table__separator col`}),(0,e.h)(`div`,{class:`q-table__control`},[a(xe.value)])),l.length!==0)return(0,e.h)(`div`,{class:c},l)}let Ce=(0,e.computed)(()=>P.value?null:N.value);function we(){let r=Te();return t.loading&&n.loading===void 0&&r.push((0,e.h)(`tr`,{class:`q-table__progress`},[(0,e.h)(`th`,{class:`relative-position`,colspan:B.value},he())])),(0,e.h)(`thead`,r)}function Te(){let r=n.header,i=n[`header-cell`];if(r!==void 0)return[r(Ee({header:!0}))].flat();let a=z.value.map(t=>{let r=n[`header-cell-${t.name}`],a=r===void 0?i:r,o=Ee({col:t});return a===void 0?(0,e.h)(Ed,{key:t.name,props:o},()=>t.label):a(o)});if(j.value&&!t.grid)a.unshift((0,e.h)(`th`,{class:`q-table--col-auto-width`},` `));else if(M.value){let r=n[`header-selection`],i=r===void 0?[(0,e.h)(Gi,{color:t.color,modelValue:Ce.value,dark:c.value,dense:t.dense,"onUpdate:modelValue":De})]:r(Ee({}));a.unshift((0,e.h)(`th`,{class:`q-table--col-auto-width`},i))}return[(0,e.h)(`tr`,{class:t.tableHeaderClass,style:t.tableHeaderStyle},a)]}function Ee(e){return Object.assign(e,{cols:z.value,sort:H,colsMap:te.value,color:t.color,dark:c.value,dense:t.dense}),M.value&&r(e,`selected`,()=>Ce.value,De),e}function De(e){P.value&&(e=!1),R(k.value.map(d.value),k.value,e)}let Oe=(0,e.computed)(()=>{let e=[t.iconFirstPage||s.iconSet.table.firstPage,t.iconPrevPage||s.iconSet.table.prevPage,t.iconNextPage||s.iconSet.table.nextPage,t.iconLastPage||s.iconSet.table.lastPage];return s.lang.rtl?e.reverse():e});function ke(){if(t.hideBottom)return;if(le.value){if(t.hideNoData)return;let r=t.loading?t.loadingLabel||s.lang.table.loading:t.filter?t.noResultsLabel||s.lang.table.noResults:t.noDataLabel||s.lang.table.noData,i=n[`no-data`];return(0,e.h)(`div`,{class:`q-table__bottom row items-center q-table__bottom--nodata`},i===void 0?[(0,e.h)(Z,{class:`q-table__bottom-nodata-icon`,name:s.iconSet.table.warning}),r]:[i({message:r,icon:s.iconSet.table.warning,filter:t.filter})])}let r=n.bottom;if(r!==void 0)return(0,e.h)(`div`,{class:Xd},[r(xe.value)]);let i=!t.hideSelectedBanner&&A.value&&F.value>0?[(0,e.h)(`div`,{class:`q-table__control`},[(0,e.h)(`div`,[(t.selectedRowsLabel||s.lang.table.selectedRecords)(F.value)])])]:[];if(!t.hidePagination)return(0,e.h)(`div`,{class:`q-table__bottom row items-center justify-end`},je(i));if(i.length!==0)return(0,e.h)(`div`,{class:Xd},i)}function Ae(e){S({page:1,rowsPerPage:e.value})}function je(r){let i,{rowsPerPage:a}=y.value,o=t.paginationLabel||s.lang.table.pagination,l=n.pagination,u=t.rowsPerPageOptions.length>1;if(r.push((0,e.h)(`div`,{class:`q-table__separator col`})),u&&r.push((0,e.h)(`div`,{class:`q-table__control`},[(0,e.h)(`span`,{class:`q-table__bottom-item`},[t.rowsPerPageLabel||s.lang.table.recordsPerPage]),(0,e.h)(Vu,{class:`q-table__select inline q-table__bottom-item`,color:t.color,modelValue:a,options:re.value,displayValue:a===0?s.lang.table.allRows:a,dark:c.value,borderless:!0,dense:!0,optionsDense:!0,optionsCover:!0,"onUpdate:modelValue":Ae})])),l!==void 0)i=l(xe.value);else if(i=[(0,e.h)(`span`,a===0?{}:{class:`q-table__bottom-item`},[a?o(U.value+1,Math.min(W.value,ie.value),ie.value):o(1,O.value,ie.value)])],a!==0&&q.value>1){let n={color:t.color,round:!0,dense:!0,flat:!0};t.dense&&(n.size=`sm`),q.value>2&&i.push((0,e.h)(yn,{key:`pgFirst`,...n,icon:Oe.value[0],disable:G.value,"aria-label":s.lang.pagination.first,onClick:ae})),i.push((0,e.h)(yn,{key:`pgPrev`,...n,icon:Oe.value[1],disable:G.value,"aria-label":s.lang.pagination.prev,onClick:oe}),(0,e.h)(yn,{key:`pgNext`,...n,icon:Oe.value[2],disable:K.value,"aria-label":s.lang.pagination.next,onClick:se})),q.value>2&&i.push((0,e.h)(yn,{key:`pgLast`,...n,icon:Oe.value[3],disable:K.value,"aria-label":s.lang.pagination.last,onClick:ce}))}return r.push((0,e.h)(`div`,{class:`q-table__control`},i)),r}function Me(){return(0,e.h)(`div`,{class:`q-table__middle`},t.gridHeader?[(0,e.h)(`table`,{class:`q-table`},[we(e.h)])]:t.loading&&n.loading===void 0?he(e.h):void 0)}function Ne(){let r=n.item===void 0?r=>{let i=r.cols.map(t=>(0,e.h)(`div`,{class:`q-table__grid-item-row`},[(0,e.h)(`div`,{class:`q-table__grid-item-title`},[t.label]),(0,e.h)(`div`,{class:`q-table__grid-item-value`},[t.value])]));if(A.value){let a=n[`body-selection`],o=a===void 0?[(0,e.h)(Gi,{modelValue:r.selected,color:t.color,dark:c.value,dense:t.dense,"onUpdate:modelValue":(e,t)=>{R([r.key],[r.row],e,t)}})]:a(r);i.unshift((0,e.h)(`div`,{class:`q-table__grid-item-row`},o),(0,e.h)(gc,{dark:c.value}))}let o={class:[`q-table__grid-item-card`+h.value,t.cardClass],style:t.cardStyle};if(t.cardStyleFn!==void 0&&(o.style=[o.style,t.cardStyleFn(r.row)]),t.cardClassFn!==void 0){let e=t.cardClassFn(r.row);e&&(o.class[0]+=` ${e}`)}return(t.onRowClick!==void 0||t.onRowDblclick!==void 0||t.onRowContextmenu!==void 0)&&(o.class[0]+=` cursor-pointer`,t.onRowClick!==void 0&&(o.onClick=e=>{a(`rowClick`,e,r.row,r.pageIndex)}),t.onRowDblclick!==void 0&&(o.onDblclick=e=>{a(`rowDblclick`,e,r.row,r.pageIndex)}),t.onRowContextmenu!==void 0&&(o.onContextmenu=e=>{a(`rowContextmenu`,e,r.row,r.pageIndex)})),(0,e.h)(`div`,{class:`q-table__grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3`+(r.selected?` q-table__grid-item--selected`:``)},[(0,e.h)(`div`,o,i)])}:n.item;return(0,e.h)(`div`,{class:[`q-table__grid-content row`,t.cardContainerClass],style:t.cardContainerStyle},k.value.map((e,t)=>r(_e({key:d.value(e),row:e,pageIndex:t}))))}return Object.assign(o.proxy,{requestServerInteraction:x,setPagination:S,firstPage:ae,prevPage:oe,nextPage:se,lastPage:ce,isRowSelected:I,clearSelection:L,isRowExpanded:w,setExpanded:T,sort:H,resetVirtualScroll:de,scrollTo:pe,getCellValue:(e,t)=>{let n=te.value[e];if(n!==void 0)return Qd(n,t)}}),i(o.proxy,{filteredSortedRows:()=>D.value,computedRows:()=>k.value,computedRowsNumber:()=>ie.value}),()=>{let r=[Se()],i={ref:f,class:_.value};return t.grid?r.push(Me()):Object.assign(i,{class:[i.class,t.cardClass],style:t.cardStyle}),r.push(fe(),ke()),t.loading&&n.loading!==void 0&&r.push(n.loading()),(0,e.h)(`div`,i,r)}}}),ef=h({name:`QTr`,props:{props:Object,noHover:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-tr`+(t.props===void 0||t.props.header?``:` `+t.props.__trClass)+(t.noHover?` q-tr--no-hover`:``));return()=>(0,e.h)(`tr`,{style:t.props?.__trStyle,class:r.value},X(n.default))}}),tf=h({name:`QTd`,props:{props:Object,autoWidth:Boolean,noHover:Boolean},setup(t,{slots:n}){let r=(0,e.getCurrentInstance)(),i=(0,e.computed)(()=>`q-td`+(t.autoWidth?` q-table--col-auto-width`:``)+(t.noHover?` q-td--no-hover`:``)+` `);return()=>{if(t.props===void 0)return(0,e.h)(`td`,{class:i.value},X(n.default));let a=r.vnode.key,o=(t.props.colsMap===void 0?null:t.props.colsMap[a])||t.props.col;if(o===void 0)return;let{row:s}=t.props;return(0,e.h)(`td`,{class:i.value+o.__tdClass(s),style:o.__tdStyle(s)},X(n.default))}}}),nf=h({name:`QRouteTab`,props:{...Lt,...Sa},emits:xa,setup(t,{slots:n,emit:r}){let i=Rt({useDisableForRouterLinkProps:!1}),{renderTab:a,$tabs:o}=Ca(t,n,r,{exact:(0,e.computed)(()=>t.exact),...i});return(0,e.watch)(()=>`${t.name} | ${t.exact} | ${(i.resolvedLink.value||{}).href}`,o.verifyRouteModel),()=>a(i.linkTag.value,i.linkAttrs.value)}});let rf=/^-?[\d]+\/[0-1]\d\/[0-3]\d$/;function af(e,t){if(e.hour!==null){if(e.minute===null)return`minute`;if(t&&e.second===null)return`second`}return`hour`}function of(){let e=new Date;return{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}}function sf(e){e.keyCode===32&&O(e)}function cf(e,t,n){let r=Math.abs(e-t);return Math.min(r,n-r)}function lf(e,t,n){let r=Array.from({length:t+1},(t,n)=>n+e).filter(e=>n(e));return{min:r[0],max:r.at(-1),values:r,threshold:t+1}}var uf=h({name:`QTime`,props:{...Q,...ai,...xo,modelValue:{required:!0,validator:e=>typeof e==`string`||e===null},mask:{...xo.mask,default:null},format24h:{type:Boolean,default:null},defaultDate:{type:String,validator:e=>rf.test(e)},options:Function,hourOptions:Array,minuteOptions:Array,secondOptions:Array,withSeconds:Boolean,nowBtn:Boolean},emits:So,setup(t,{slots:n,emit:r}){let i=(0,e.getCurrentInstance)(),{$q:a}=i.proxy,o=$(t,a),{tabindex:s,headerClass:c,getLocale:l,getCurrentDate:u}=wo(t,a),d=si(oi(t)),f,p,m=(0,e.ref)(null),h=(0,e.computed)(()=>te()),g=(0,e.computed)(()=>l()),_=(0,e.computed)(()=>B()),v=Bo(t.modelValue,h.value,g.value,t.calendar,_.value),y=(0,e.ref)(af(v)),b=(0,e.ref)(v),x=(0,e.ref)(v.hour===null||v.hour<12),S=(0,e.computed)(()=>t.format24h===null?a.lang.date.format24h:t.format24h),w=(0,e.computed)(()=>`q-time q-time--${t.landscape?`landscape`:`portrait`}`+(o.value?` q-time--dark q-dark`:``)+(t.disable?` disabled`:t.readonly?` q-time--readonly`:``)+(t.bordered?` q-time--bordered`:``)+(t.square?` q-time--square no-border-radius`:``)+(t.flat?` q-time--flat no-shadow`:``)),T=(0,e.computed)(()=>{let e=b.value;return{hour:e.hour===null?`--`:S.value?Y(e.hour):String(x.value?e.hour===0?12:e.hour:e.hour>12?e.hour-12:e.hour),minute:e.minute===null?`--`:Y(e.minute),second:e.second===null?`--`:Y(e.second)}}),E=(0,e.computed)(()=>{let e=y.value===`hour`,t=e?12:60,n=b.value[y.value],r=`rotate(${Math.round(360/t*n)-180}deg) translateX(-50%)`;return e&&S.value&&b.value.hour>=12&&(r+=` scale(.7)`),{transform:r}}),D=(0,e.computed)(()=>b.value.hour!==null),k=(0,e.computed)(()=>D.value&&b.value.minute!==null),A=(0,e.computed)(()=>t.hourOptions===void 0?t.options===void 0?null:e=>t.options(e,null,null):e=>t.hourOptions.includes(e)),j=(0,e.computed)(()=>t.minuteOptions===void 0?t.options===void 0?null:e=>t.options(b.value.hour,e,null):e=>t.minuteOptions.includes(e)),M=(0,e.computed)(()=>t.secondOptions===void 0?t.options===void 0?null:e=>t.options(b.value.hour,b.value.minute,e):e=>t.secondOptions.includes(e)),N=(0,e.computed)(()=>{if(A.value===null)return null;let e=lf(0,11,A.value),t=lf(12,11,A.value);return{am:e,pm:t,values:[...e.values,...t.values]}}),P=(0,e.computed)(()=>j.value===null?null:lf(0,59,j.value)),F=(0,e.computed)(()=>M.value===null?null:lf(0,59,M.value)),I=(0,e.computed)(()=>{switch(y.value){case`hour`:return N.value;case`minute`:return P.value;case`second`:return F.value}}),L=(0,e.computed)(()=>{let e,t=0,n=1,r=I.value===null?void 0:I.value.values;y.value===`hour`?S.value?e=23:(e=11,x.value||(t=12)):(e=55,n=5);let i=[];for(let a=0,o=0;a<=e;a+=n,o++){let e=a+t,n=r?.includes(e)===!1,s=y.value===`hour`&&a===0?S.value?`00`:`12`:a;i.push({val:e,index:o,disable:n,label:s})}return i}),R=(0,e.computed)(()=>[[na,H,void 0,{stop:!0,prevent:!0,mouse:!0}]]);(0,e.watch)(()=>t.modelValue,e=>{let n=Bo(e,h.value,g.value,t.calendar,_.value);(n.dateHash!==b.value.dateHash||n.timeHash!==b.value.timeHash)&&(b.value=n,n.hour===null?y.value=`hour`:x.value=n.hour<12)}),(0,e.watch)([h,g],()=>{(0,e.nextTick)(()=>{ge()})});function ee(){let e={...u(),...of()};ge(e),Object.assign(b.value,e),y.value=`hour`}function z(e,{min:t,max:n,values:r,threshold:i}){if(e===t)return t;if(en)return cf(e,t,i)<=cf(e,n,i)?t:n;let a=r.findIndex(t=>e<=t),o=r[a-1],s=r[a];return e-o<=s-e?o:s}function te(){return t.calendar!==`persian`&&t.mask!==null?t.mask:`HH:mm${t.withSeconds?`:ss`:``}`}function B(){if(typeof t.defaultDate!=`string`){let e=u(!0);return e.dateHash=Co(e),e}return Bo(t.defaultDate,`YYYY/MM/DD`,void 0,t.calendar)}function V(){return Dt(i)||I.value!==null&&(I.value.values.length===0||y.value===`hour`&&!S.value&&N.value[x.value?`am`:`pm`].values.length===0)}function ne(){let{top:e,left:t,width:n}=m.value.getBoundingClientRect(),r=n/2;return{top:e+r,left:t+r,dist:r*.7}}function H(e){if(!V()){if(e.isFirst){f=ne(),p=W(e.evt,f);return}p=W(e.evt,f,p),e.isFinal&&(f=!1,p=null,U())}}function U(){y.value===`hour`?y.value=`minute`:t.withSeconds&&y.value===`minute`&&(y.value=`second`)}function W(e,t,n){let r=C(e),i=Math.abs(r.top-t.top),a=Math.hypot(r.top-t.top,r.left-t.left),o,s=Math.asin(i/a)*(180/Math.PI);if(s=r.top=t.dist:N.value.am.values.length!==0:x.value;o=z(o+(e?0:12),N.value[e?`am`:`pm`])}else o=Math.round(o),S.value?a(0,e.h)(`div`,{key:`clock`+y.value,class:`q-time__container-parent absolute-full`},[(0,e.h)(`div`,{ref:m,class:`q-time__container-child fit overflow-hidden`},[(0,e.withDirectives)((0,e.h)(`div`,{class:`q-time__clock cursor-pointer non-selectable`,onClick:re,onMousedown:ie},[(0,e.h)(`div`,{class:`q-time__clock-circle fit`},[(0,e.h)(`div`,{class:`q-time__clock-pointer`+(b.value[y.value]===null?` hidden`:t.color===void 0?``:` text-${t.color}`),style:E.value}),L.value.map(t=>(0,e.h)(`div`,{class:`q-time__clock-position row flex-center q-time__clock-pos-${t.index}`+(t.val===n?` q-time__clock-position--active `+c.value:t.disable?` q-time__clock-position--disable`:``)},[(0,e.h)(`span`,t.label)]))])]),R.value)])])),t.nowBtn?(0,e.h)(yn,{class:`q-time__now-button absolute`,icon:a.iconSet.datetime.now,unelevated:!0,size:`sm`,round:!0,color:t.color,textColor:t.textColor,tabindex:s.value,onClick:ee}):null])}return i.proxy.setNow=ee,()=>{let r=[_e()],i=X(n.default);return i!==void 0&&r.push((0,e.h)(`div`,{class:`q-time__actions`},i)),t.name!==void 0&&!t.disable&&d(r,`push`),(0,e.h)(`div`,{class:w.value,tabindex:-1},[J(),(0,e.h)(`div`,{class:`q-time__main col overflow-auto`},r)])}}});let df=[`left`,`right`],ff=[`dense`,`comfortable`,`loose`];var pf=h({name:`QTimeline`,props:{...Q,color:{type:String,default:`primary`},side:{type:String,default:`right`,validator:e=>df.includes(e)},layout:{type:String,default:`dense`,validator:e=>ff.includes(e)}},setup(t,{slots:n}){let r=$(t,(0,e.getCurrentInstance)().proxy.$q);(0,e.provide)(ue,t);let i=(0,e.computed)(()=>`q-timeline q-timeline--${t.layout} q-timeline--${t.layout}--${t.side}`+(r.value?` q-timeline--dark`:``));return()=>(0,e.h)(`ul`,{class:i.value},X(n.default))}}),mf=h({name:`QTimelineEntry`,props:{heading:Boolean,tag:{type:String,default:`h3`},side:{type:String,default:`right`,validator:e=>[`left`,`right`].includes(e)},icon:String,avatar:String,color:String,title:String,subtitle:String,body:String},setup(t,{slots:n}){let r=(0,e.inject)(ue,J);if(r===J)return console.error(`QTimelineEntry needs to be child of QTimeline`),J;let i=(0,e.computed)(()=>`q-timeline__entry q-timeline__entry--${t.side}`+(t.icon!==void 0||t.avatar!==void 0?` q-timeline__entry--icon`:``)),a=(0,e.computed)(()=>`q-timeline__dot text-${t.color||r.color}`),o=(0,e.computed)(()=>r.layout===`comfortable`&&r.side===`left`);return()=>{let r=Xe(n.default,[]);if(t.body!==void 0&&r.unshift(t.body),t.heading){let n=[(0,e.h)(`div`),(0,e.h)(`div`),(0,e.h)(t.tag,{class:`q-timeline__heading-title`},r)];return(0,e.h)(`div`,{class:`q-timeline__heading`},o.value?n.reverse():n)}let s;t.icon===void 0?t.avatar!==void 0&&(s=[(0,e.h)(`img`,{class:`q-timeline__dot-img`,src:t.avatar})]):s=[(0,e.h)(Z,{class:`row items-center justify-center`,name:t.icon})];let c=[(0,e.h)(`div`,{class:`q-timeline__subtitle`},[(0,e.h)(`span`,{},X(n.subtitle,[t.subtitle]))]),(0,e.h)(`div`,{class:a.value},s),(0,e.h)(`div`,{class:`q-timeline__content`},[(0,e.h)(`h6`,{class:`q-timeline__title`},X(n.title,[t.title]))].concat(r))];return(0,e.h)(`li`,{class:i.value},o.value?c.reverse():c)}}}),hf=h({name:`QToolbar`,props:{inset:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-toolbar row no-wrap items-center`+(t.inset?` q-toolbar--inset`:``));return()=>(0,e.h)(`div`,{class:r.value,role:`toolbar`},X(n.default))}}),gf=h({name:`QToolbarTitle`,props:{shrink:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-toolbar__title ellipsis`+(t.shrink?` col-shrink`:``));return()=>(0,e.h)(`div`,{class:r.value},X(n.default))}});let _f=[`none`,`strict`,`leaf`,`leaf-filtered`];function vf(t){if(t.icon!==void 0)return(0,e.h)(Z,{class:`q-tree__icon q-mr-sm`,name:t.icon,color:t.iconColor});let n=t.img||t.avatar;if(n)return(0,e.h)(`img`,{class:`q-tree__${t.img?`img`:`avatar`} q-mr-sm`,src:n})}var yf=h({name:`QTree`,props:{...Q,nodes:{type:Array,required:!0},nodeKey:{type:String,required:!0},labelKey:{type:String,default:`label`},childrenKey:{type:String,default:`children`},dense:Boolean,color:String,controlColor:String,textColor:String,selectedColor:String,icon:String,tickStrategy:{type:String,default:`none`,validator:e=>_f.includes(e)},ticked:Array,expanded:Array,selected:{},noSelectionUnset:Boolean,defaultExpandAll:Boolean,accordion:Boolean,filter:String,filterMethod:Function,duration:{},noConnectors:Boolean,noTransition:Boolean,noNodesLabel:String,noResultsLabel:String},emits:[`update:expanded`,`update:ticked`,`update:selected`,`lazyLoad`,`afterShow`,`afterHide`],setup(t,{slots:n,emit:i}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:o}=a,s=$(t,o),c=(0,e.ref)({}),l=(0,e.ref)(t.ticked||[]),u=(0,e.ref)(t.expanded||[]),d=(0,e.ref)(null),f={},p={};(0,e.onBeforeUpdate)(()=>{f={},p={}});let m=(0,e.computed)(()=>`q-tree q-tree--${t.dense?`dense`:`standard`}`+(t.noConnectors?` q-tree--no-connectors`:``)+(s.value?` q-tree--dark`:``)+(t.color===void 0?``:` text-${t.color}`)),h=(0,e.computed)(()=>t.selected!==void 0),g=(0,e.computed)(()=>t.icon||o.iconSet.tree.icon),_=(0,e.computed)(()=>t.controlColor||t.color),v=(0,e.computed)(()=>t.textColor===void 0?``:` text-${t.textColor}`),y=(0,e.computed)(()=>{let e=t.selectedColor||t.color;return e?` text-${e}`:``}),b=(0,e.computed)(()=>t.filterMethod===void 0?(e,n)=>{let r=n.toLowerCase();return e[t.labelKey]&&e[t.labelKey].toLowerCase().includes(r)}:t.filterMethod),x=(0,e.computed)(()=>{let e={},n=(r,i)=>{let a=r.tickStrategy||(i?i.tickStrategy:t.tickStrategy),o=r[t.nodeKey],s=r[t.childrenKey]&&Array.isArray(r[t.childrenKey])&&r[t.childrenKey].length!==0,d=!r.disabled&&h.value&&r.selectable!==!1,f=!r.disabled&&r.expandable!==!1,p=a!==`none`,m=a===`strict`,g=a===`leaf-filtered`,_=a===`leaf`||a===`leaf-filtered`,v=!r.disabled&&r.tickable!==!1;_&&v===!0&&i&&i.tickable!==!0&&(v=!1);let y=r.lazy;y===!0&&c.value[o]!==void 0&&Array.isArray(r[t.childrenKey])&&(y=c.value[o]);let x={key:o,parent:i,isParent:s,lazy:y,disabled:r.disabled,link:!r.disabled&&(d||f&&(s||y===!0)),children:[],matchesFilter:!t.filter||b.value(r,t.filter),selected:o===t.selected&&d,selectable:d,expanded:s?u.value.includes(o):!1,expandable:f,noTick:r.noTick===!0||!m&&y&&y!==`loaded`,tickable:v,tickStrategy:a,hasTicking:p,strictTicking:m,leafFilteredTicking:g,leafTicking:_,ticked:(m||!s)&&l.value.includes(o)};if(e[o]=x,s&&(x.children=r[t.childrenKey].map(e=>n(e,x)),t.filter&&(x.matchesFilter===!0?x.noTick!==!0&&x.disabled!==!0&&x.tickable===!0&&g&&x.children.every(e=>e.matchesFilter!==!0||e.noTick===!0||e.tickable!==!0)&&(x.tickable=!1):x.matchesFilter=x.children.some(e=>e.matchesFilter)),x.matchesFilter===!0&&(x.noTick!==!0&&m!==!0&&x.children.every(e=>e.noTick)&&(x.noTick=!0),_))){if(x.ticked=!1,x.indeterminate=x.children.some(e=>e.indeterminate===!0),x.tickable=x.tickable===!0&&x.children.some(e=>e.tickable),x.indeterminate!==!0){let e=x.children.reduce((e,t)=>t.ticked===!0?e+1:e,0);e===x.children.length?x.ticked=!0:e>0&&(x.indeterminate=!0)}x.indeterminate===!0&&(x.indeterminateNextState=x.children.every(e=>e.tickable!==!0||e.ticked!==!0))}return x};return t.nodes.forEach(e=>n(e,null)),e}),S=(0,e.computed)(()=>{let e=[];function n(r){r.forEach(r=>{let i=x.value[r[t.nodeKey]];t.filter&&i.matchesFilter!==!0||(i.link===!0&&e.push(i.key),i.expanded===!0&&Array.isArray(r[t.childrenKey])&&n(r[t.childrenKey]))})}return n(t.nodes),e}),C=(0,e.computed)(()=>{let e=S.value;if(e.includes(d.value))return d.value;let t=e.find(e=>x.value[e].selected===!0);return t===void 0?e[0]:t});(0,e.watch)(()=>t.ticked,e=>{l.value=e}),(0,e.watch)(()=>t.expanded,e=>{u.value=e});function w(e){let n=(r,i)=>{if(r||!i)return r;if(Array.isArray(i))return i.reduce(n,r);if(i[t.nodeKey]===e)return i;if(i[t.childrenKey])return n(null,i[t.childrenKey])};return n(null,t.nodes)}function T(){return l.value.map(e=>w(e))}function E(){return u.value.map(e=>w(e))}function D(e){return e&&x.value[e]?x.value[e].expanded:!1}function k(){t.expanded===void 0?u.value=[]:i(`update:expanded`,[])}function A(){let e=[],n=r=>{r[t.childrenKey]&&r[t.childrenKey].length!==0&&r.expandable!==!1&&r.disabled!==!0&&(e.push(r[t.nodeKey]),r[t.childrenKey].forEach(n))};t.nodes.forEach(n),t.expanded===void 0?u.value=e:i(`update:expanded`,e)}function j(n,r,a=w(n),o=x.value[n]){if(o.lazy&&o.lazy!==`loaded`){if(o.lazy===`loading`)return;c.value[n]=`loading`,Array.isArray(a[t.childrenKey])||(a[t.childrenKey]=[]),i(`lazyLoad`,{node:a,key:n,done:r=>{c.value[n]=`loaded`,a[t.childrenKey]=Array.isArray(r)?r:[],(0,e.nextTick)(()=>{x.value[n]?.isParent===!0&&M(n,!0)})},fail:()=>{delete c.value[n],a[t.childrenKey].length===0&&delete a[t.childrenKey]}})}else o.isParent===!0&&o.expandable===!0&&M(n,r)}function M(e,n){let r=u.value,a=t.expanded!==void 0;if(a&&(r=[...r]),n){if(t.accordion&&x.value[e]){let n=[];x.value[e].parent?x.value[e].parent.children.forEach(t=>{t.key!==e&&t.expandable===!0&&n.push(t.key)}):t.nodes.forEach(r=>{let i=r[t.nodeKey];i!==e&&n.push(i)}),n.length!==0&&(r=r.filter(e=>!n.includes(e)))}r=[...r,e].filter((e,t,n)=>n.indexOf(e)===t)}else r=r.filter(t=>t!==e);a?i(`update:expanded`,r):u.value=r}function N(e){return e&&x.value[e]?x.value[e].ticked:!1}function P(e,n){let r=l.value,a=t.ticked!==void 0;a&&(r=[...r]),r=n?[...r,...e].filter((e,t,n)=>n.indexOf(e)===t):r.filter(t=>!e.includes(t)),a&&i(`update:ticked`,r)}function F(e,n,i){let o={tree:a,node:e,key:i,color:t.color,dark:s.value};return r(o,`expanded`,()=>n.expanded,e=>{e!==n.expanded&&j(i,e)}),r(o,`ticked`,()=>n.ticked,e=>{e!==n.ticked&&P([i],e)}),o}function I(e){return(t.filter?e.filter(e=>x.value[e[t.nodeKey]].matchesFilter):e).map(e=>ee(e))}function L(){i(`afterShow`)}function R(){i(`afterHide`)}function ee(r){let i=r[t.nodeKey],a=x.value[i],o=r.header&&n[`header-${r.header}`]||n[`default-header`],c=a.isParent===!0?I(r[t.childrenKey]):[],l=c.length!==0||a.lazy&&a.lazy!==`loaded`,u=r.body&&n[`body-${r.body}`]||n[`default-body`],m=o!==void 0||u!==void 0?F(r,a,i):null;return u!==void 0&&(u=(0,e.h)(`div`,{class:`q-tree__node-body relative-position`},[(0,e.h)(`div`,{class:v.value},[u(m)])])),(0,e.h)(`div`,{key:i,class:`q-tree__node relative-position q-tree__node--${l?`parent`:`child`}`},[(0,e.h)(`div`,{class:`q-tree__node-header relative-position row no-wrap items-center`+(a.link===!0?` q-tree__node--link q-hoverable q-focusable`:``)+(a.selected===!0?` q-tree__node--selected`:``)+(a.disabled===!0?` q-tree__node--disabled`:``),ref:e=>{p[a.key]=e},tabindex:a.link===!0&&a.key===C.value?0:-1,"aria-expanded":l?a.expanded?`true`:`false`:null,"aria-selected":a.selectable?a.selected?`true`:`false`:null,"aria-disabled":a.disabled===!0?`true`:null,role:`treeitem`,onFocus(){a.link===!0&&(d.value=a.key)},onClick:e=>{H(r,a,e)},onKeydown(e){te(e)!==!0&&(e.keyCode===13?H(r,a,e,!0):e.keyCode===32?U(r,a,e,!0):ne(a,e.keyCode)&&O(e))}},[(0,e.h)(`div`,{class:`q-focus-helper`,tabindex:-1,ref:e=>{f[a.key]=e}}),a.lazy===`loading`?(0,e.h)(Ht,{class:`q-tree__spinner`,color:_.value}):l?(0,e.h)(Z,{class:`q-tree__arrow`+(a.expanded===!0?` q-tree__arrow--rotate`:``),name:g.value,onClick(e){U(r,a,e)}}):null,a.hasTicking===!0&&a.noTick!==!0?(0,e.h)(Gi,{class:`q-tree__tickbox`,modelValue:a.indeterminate===!0?null:a.ticked,color:_.value,dark:s.value,dense:!0,keepColor:!0,disable:a.tickable!==!0,onKeydown:O,"onUpdate:modelValue":e=>{W(a,e)}}):null,(0,e.h)(`div`,{class:`q-tree__node-header-content col row no-wrap items-center`+(a.selected===!0?y.value:v.value)},[o?o(m):[vf(r),(0,e.h)(`div`,r[t.labelKey])]])]),l?t.noTransition?a.expanded===!0?(0,e.h)(`div`,{class:`q-tree__node-collapsible`+v.value,key:`${i}__q`},[u,(0,e.h)(`div`,{class:`q-tree__children`+(a.disabled===!0?` q-tree__node--disabled`:``),role:`group`},c)]):null:(0,e.h)(pc,{duration:t.duration,onShow:L,onHide:R},()=>(0,e.withDirectives)((0,e.h)(`div`,{class:`q-tree__node-collapsible`+v.value,key:`${i}__q`},[u,(0,e.h)(`div`,{class:`q-tree__children`+(a.disabled===!0?` q-tree__node--disabled`:``),role:`group`},c)]),[[e.vShow,a.expanded]])):u])}function z(e){f[e]?.focus()}function B(e){e!==void 0&&(d.value=e,p[e]?.focus())}function V(e){for(let n of e)if(!(t.filter&&n.matchesFilter!==!0)){if(n.link===!0)return n.key;if(n.expanded===!0){let e=V(n.children);if(e!==void 0)return e}}}function ne(e,t){let n=S.value,r=n.indexOf(e.key);if(t===36)return B(n[0]),!0;if(t===35)return B(n.at(-1)),!0;if(t===38)return B(n[r-1]),!0;if(t===40)return B(n[r+1]),!0;if(t===39)return e.isParent!==!0&&!e.lazy||(e.expanded===!0?B(V(e.children)):j(e.key,!0)),!0;if(t===37){if(e.expanded===!0)j(e.key,!1);else{let t=e.parent;for(;t!==null&&t.link!==!0;)t=t.parent;B(t?.key)}return!0}return!1}function H(e,n,r,a){n.link===!0&&(d.value=n.key),a!==!0&&n.selectable!==!1&&z(n.key),h.value&&n.selectable?t.noSelectionUnset?n.key!==t.selected&&i(`update:selected`,n.key===void 0?null:n.key):i(`update:selected`,n.key===t.selected?null:n.key):U(e,n,r,a),typeof e.handler==`function`&&e.handler(e)}function U(e,t,n,r){t.link===!0&&(d.value=t.key),n!==void 0&&O(n),r!==!0&&t.selectable!==!1&&z(t.key),j(t.key,!t.expanded,e,t)}function W(e,t){if(e.indeterminate===!0&&(t=e.indeterminateNextState),e.strictTicking)P([e.key],t);else if(e.leafTicking){let n=[],r=e=>{e.isParent?(t!==!0&&e.noTick!==!0&&e.tickable===!0&&n.push(e.key),e.leafTicking===!0&&e.children.forEach(r)):e.noTick!==!0&&e.tickable===!0&&(e.leafFilteredTicking!==!0||e.matchesFilter===!0)&&n.push(e.key)};r(e),P(n,t)}}return t.defaultExpandAll&&A(),Object.assign(a,{getNodeByKey:w,getTickedNodes:T,getExpandedNodes:E,isExpanded:D,collapseAll:k,expandAll:A,setExpanded:j,isTicked:N,setTicked:P}),()=>{let n=I(t.nodes);return(0,e.h)(`div`,{class:m.value,role:`tree`},n.length===0?t.filter?t.noResultsLabel||o.lang.tree.noResults:t.noNodesLabel||o.lang.tree.noNodes:n)}}});function bf(e){return(e*100).toFixed(2)+`%`}let xf={...Q,...Wc,label:String,color:String,textColor:String,square:Boolean,flat:Boolean,bordered:Boolean,noThumbnails:Boolean,thumbnailFit:{type:String,default:`cover`},autoUpload:Boolean,hideUploadBtn:Boolean,disable:Boolean,readonly:Boolean},Sf=[...Gc,`start`,`finish`,`added`,`removed`];function Cf(t,n){let a=(0,e.getCurrentInstance)(),{props:o,slots:s,emit:c,proxy:l}=a,{$q:u}=l,d=$(o,u);function f(e,t,n){if(e.__status=t,t===`idle`){e.__uploaded=0,e.__progress=0,e.__sizeLabel=Me(e.size),e.__progressLabel=`0.00%`;return}if(t===`failed`){l.$forceUpdate();return}e.__uploaded=t===`uploaded`?e.size:n,e.__progress=t===`uploaded`?1:e.size===0?0:Math.min(.9999,e.__uploaded/e.size),e.__progressLabel=bf(e.__progress),l.$forceUpdate()}let p=(0,e.computed)(()=>!o.disable&&!o.readonly),m=(0,e.ref)(!1),h=(0,e.ref)(null),g=(0,e.ref)(null),_={files:(0,e.ref)([]),queuedFiles:(0,e.ref)([]),uploadedFiles:(0,e.ref)([]),uploadedSize:(0,e.ref)(0),updateFileStatus:f,isAlive:()=>!Dt(a)},{pickFiles:v,addFiles:y,onDragover:b,onDragleave:x,processFiles:S,getDndNode:C,maxFilesNumber:w,maxTotalSizeNumber:T}=Kc({editable:p,dnd:m,getFileInput:te,addFilesToQueue:B});Object.assign(_,t({props:o,slots:s,emit:c,helpers:_,exposeApi:e=>{Object.assign(_,e)}})),_.isBusy===void 0&&(_.isBusy=(0,e.ref)(!1));let D=(0,e.ref)(0),O=(0,e.computed)(()=>D.value===0?0:_.uploadedSize.value/D.value),k=(0,e.computed)(()=>bf(O.value)),A=(0,e.computed)(()=>Me(D.value)),j=(0,e.computed)(()=>p.value&&!_.isUploading.value&&(o.multiple||_.queuedFiles.value.length===0)&&(o.maxFiles===void 0||_.files.value.lengthp.value&&!_.isBusy.value&&!_.isUploading.value&&_.queuedFiles.value.length!==0);(0,e.provide)(ge,H);let N=(0,e.computed)(()=>`q-uploader column no-wrap`+(d.value?` q-uploader--dark q-dark`:``)+(o.bordered?` q-uploader--bordered`:``)+(o.square?` q-uploader--square no-border-radius`:``)+(o.flat?` q-uploader--flat no-shadow`:``)+(o.disable?` disabled q-uploader--disable`:``)+(m.value?` q-uploader--dnd`:``)),P=(0,e.computed)(()=>`q-uploader__header`+(o.color===void 0?``:` bg-${o.color}`)+(o.textColor===void 0?``:` text-${o.textColor}`));(0,e.watch)(_.isUploading,(e,t)=>{!t&&e?c(`start`):t&&!e&&c(`finish`)});function F(){o.disable||(_.abort(),_.uploadedSize.value=0,D.value=0,z(),_.files.value=[],_.queuedFiles.value=[],_.uploadedFiles.value=[])}function I(){o.disable||R([`uploaded`],({size:e})=>{_.uploadedSize.value-=e,D.value-=e,_.uploadedFiles.value=[]})}function L(){R([`idle`,`failed`],({size:e})=>{D.value-=e,_.queuedFiles.value=[]})}function R(e,t){if(o.disable)return;let n={files:[],size:0},r=_.files.value.filter(t=>e.includes(t.__status)?(n.size+=t.size,n.files.push(t),t.__img!==void 0&&window.URL.revokeObjectURL(t.__img.src),!1):!0);n.files.length!==0&&(_.files.value=r,t(n),c(`removed`,n.files))}function ee(e){if(o.disable)return;let t=e.__status===`uploading`;e.__status===`uploaded`?(_.uploadedSize.value-=e.size,D.value-=e.size,_.uploadedFiles.value=_.uploadedFiles.value.filter(t=>t.__key!==e.__key)):D.value-=e.size,_.files.value=_.files.value.filter(t=>t.__key===e.__key?(t.__img!==void 0&&window.URL.revokeObjectURL(t.__img.src),!1):!0),_.queuedFiles.value=_.queuedFiles.value.filter(t=>t.__key!==e.__key),t&&e.__abort(),c(`removed`,[e])}function z(){_.files.value.forEach(e=>{e.__img!==void 0&&window.URL.revokeObjectURL(e.__img.src)})}function te(){return g.value||h.value.getElementsByClassName(`q-uploader__input`)[0]}function B(e,t){let n=S(e,t,_.files.value,!0),r=te();r!=null&&(r.value=``),n!==void 0&&(n.forEach(e=>{if(_.updateFileStatus(e,`idle`),D.value+=e.size,!o.noThumbnails&&e.type.toUpperCase().startsWith(`IMAGE`)){let t=new Image;t.src=window.URL.createObjectURL(e),e.__img=t}}),_.files.value.push(...n),_.queuedFiles.value.push(...n),c(`added`,n),o.autoUpload&&_.upload())}function V(){M.value&&_.upload()}function ne(t,n,r){if(t){let t={type:`a`,key:n,icon:u.iconSet.uploader[n],flat:!0,dense:!0},i;return n===`add`?(t.onClick=v,i=H):t.onClick=r,(0,e.h)(yn,t,i)}}function H(){return(0,e.h)(`input`,{ref:g,class:`q-uploader__input overflow-hidden absolute-full`,tabindex:-1,type:`file`,title:``,accept:o.accept,multiple:o.multiple?`multiple`:void 0,capture:o.capture,onMousedown:E,onClick:v,onChange:B})}function U(){return s.header===void 0?[(0,e.h)(`div`,{class:`q-uploader__header-content column`},[(0,e.h)(`div`,{class:`flex flex-center no-wrap q-gutter-xs`},[ne(_.queuedFiles.value.length!==0,`removeQueue`,L),ne(_.uploadedFiles.value.length!==0,`removeUploaded`,I),_.isUploading.value?(0,e.h)(Ht,{class:`q-uploader__spinner`}):null,(0,e.h)(`div`,{class:`col column justify-center`},[o.label===void 0?null:(0,e.h)(`div`,{class:`q-uploader__title`},[o.label]),(0,e.h)(`div`,{class:`q-uploader__subtitle`},[A.value+` / `+k.value])]),ne(j.value,`add`),ne(!o.hideUploadBtn&&M.value,`upload`,_.upload),ne(_.isUploading.value,`clear`,_.abort)])])]:s.header(G)}function W(){return s.list===void 0?_.files.value.map(t=>(0,e.h)(`div`,{key:t.__key,class:`q-uploader__file relative-position`+(!o.noThumbnails&&t.__img!==void 0?` q-uploader__file--img`:``)+(t.__status===`failed`?` q-uploader__file--failed`:t.__status===`uploaded`?` q-uploader__file--uploaded`:``),style:!o.noThumbnails&&t.__img!==void 0?{backgroundImage:`url("`+t.__img.src+`")`,backgroundSize:o.thumbnailFit}:null},[(0,e.h)(`div`,{class:`q-uploader__file-header row flex-center no-wrap`},[t.__status===`failed`?(0,e.h)(Z,{class:`q-uploader__file-status`,name:u.iconSet.type.negative,color:`negative`}):null,(0,e.h)(`div`,{class:`q-uploader__file-header-content col`},[(0,e.h)(`div`,{class:`q-uploader__title`},[t.name]),(0,e.h)(`div`,{class:`q-uploader__subtitle row items-center no-wrap`},[t.__sizeLabel+` / `+t.__progressLabel])]),t.__status===`uploading`?(0,e.h)(Qi,{value:t.__progress,min:0,max:1,indeterminate:t.__progress===0}):(0,e.h)(yn,{round:!0,dense:!0,flat:!0,icon:u.iconSet.uploader[t.__status===`uploaded`?`done`:`clear`],onClick:()=>{ee(t)}})])])):s.list(G)}(0,e.onBeforeUnmount)(()=>{_.isUploading.value&&_.abort(),_.files.value.length!==0&&z()});let G={};for(let t in _)(0,e.isRef)(_[t])?r(G,t,()=>_[t].value):G[t]=_[t];return Object.assign(G,{upload:V,reset:F,removeUploadedFiles:I,removeQueuedFiles:L,removeFile:ee,pickFiles:v,addFiles:y}),i(G,{canAddFiles:()=>j.value,canUpload:()=>M.value,uploadSizeLabel:()=>A.value,uploadProgressLabel:()=>k.value}),n({..._,upload:V,reset:F,removeUploadedFiles:I,removeQueuedFiles:L,removeFile:ee,pickFiles:v,addFiles:y,canAddFiles:j,canUpload:M,uploadSizeLabel:A,uploadProgressLabel:k}),()=>{let t=[(0,e.h)(`div`,{class:P.value},U()),(0,e.h)(`div`,{class:`q-uploader__list scroll`},W()),C(`uploader`)];_.isBusy.value&&t.push((0,e.h)(`div`,{class:`q-uploader__overlay absolute-full flex flex-center`},[(0,e.h)(Ht)]));let n={ref:h,class:N.value};return j.value&&Object.assign(n,{onDragover:b,onDragleave:x}),(0,e.h)(`div`,n,t)}}let wf=()=>!0;function Tf(e){let t={};return e.forEach(e=>{t[e]=wf}),t}let Ef=Tf(Sf);function Df({name:e,props:t,emits:n,injectPlugin:r}){return h({name:e,props:{...xf,...t},emits:ve(n)?{...Ef,...n}:[...Sf,...n],setup(e,{expose:t}){return Cf(r,t)}})}function Of(e){return typeof e==`function`?e:()=>e}let kf={url:[Function,String],method:{type:[Function,String],default:`POST`},fieldName:{type:[Function,String],default:()=>e=>e.name},headers:[Function,Array],formFields:[Function,Array],withCredentials:[Function,Boolean],sendRaw:[Function,Boolean],batch:[Function,Boolean],factory:Function},Af=[`factoryFailed`,`uploaded`,`failed`,`uploading`];function jf({props:t,emit:n,helpers:r}){let i=(0,e.ref)([]),a=(0,e.ref)([]),o=(0,e.ref)(0),s=new WeakSet,c=(0,e.computed)(()=>({url:Of(t.url),method:Of(t.method),headers:Of(t.headers),formFields:Of(t.formFields),fieldName:Of(t.fieldName),withCredentials:Of(t.withCredentials),sendRaw:Of(t.sendRaw),batch:Of(t.batch)})),l=(0,e.computed)(()=>o.value>0),u=(0,e.computed)(()=>a.value.length!==0),d=e=>e.filter(e=>r.files.value.includes(e));function f(){i.value.forEach(e=>{e.abort()}),a.value.forEach(e=>{s.add(e)})}function p(){let e=[...r.queuedFiles.value];r.queuedFiles.value=[],c.value.batch(e)?m(e):e.forEach(e=>{m([e])})}function m(e){o.value++;let i=(t,i)=>{if(r.isAlive()){i!==void 0&&(a.value=a.value.filter(e=>e!==i));let s=d(e);s.length!==0&&(r.queuedFiles.value.push(...s),s.forEach(e=>{r.updateFileStatus(e,`failed`)}),n(`factoryFailed`,t,s)),o.value--}};if(typeof t.factory!=`function`){l({});return}let c;try{c=t.factory(e)}catch(e){i(e);return}Object(c)===c?typeof c.catch==`function`&&typeof c.then==`function`?(a.value.push(c),c.then(e=>{s.has(c)?i(Error(`Aborted`),c):Object(e)===e?r.isAlive()&&(a.value=a.value.filter(e=>e!==c),l(e)):i(Error(`QUploader: factory() does not return properly`),c)}).catch(e=>{i(e,c)})):l(c):i(Error(`QUploader: factory() does not return properly`));function l(t){let n=d(e);if(n.length===0){o.value--;return}try{h(n,t)}catch(e){i(e)}}}function h(e,t){let a=new FormData,s=new XMLHttpRequest,l=(e,n)=>t[e]===void 0?c.value[e](n):Of(t[e])(n),u=l(`url`,e);if(!u){console.error(`q-uploader: invalid or no URL specified`),r.queuedFiles.value.push(...e),e.forEach(e=>{r.updateFileStatus(e,`failed`)}),o.value--;return}let f=l(`formFields`,e);f!==void 0&&f.forEach(e=>{a.append(e.name,e.value)});let p=0,m=0,h=0,g=0,_;s.upload.addEventListener(`progress`,t=>{if(_)return;let n=Math.min(g,t.loaded);r.uploadedSize.value+=n-h,h=n;let i=h-m;for(let t=p;i>0&&t=n.size)i-=n.size,p++,m+=n.size,r.updateFileStatus(n,`uploading`,n.size);else{r.updateFileStatus(n,`uploading`,i);return}}},!1),s.addEventListener(`readystatechange`,()=>{if(!(s.readyState<4)){if(s.status&&s.status<400){let t=d(e),i=t.reduce((e,t)=>e+t.size,0);r.uploadedSize.value+=i-h,t.length!==0&&(r.uploadedFiles.value.push(...t),t.forEach(e=>{r.updateFileStatus(e,`uploaded`)}),n(`uploaded`,{files:t,xhr:s}))}else{_=!0,r.uploadedSize.value-=h;let t=d(e);t.length!==0&&(r.queuedFiles.value.push(...t),t.forEach(e=>{r.updateFileStatus(e,`failed`)}),n(`failed`,{files:t,xhr:s}))}o.value--,i.value=i.value.filter(e=>e!==s)}}),s.open(l(`method`,e),u),l(`withCredentials`,e)===!0&&(s.withCredentials=!0);let v=l(`headers`,e);v!==void 0&&v.forEach(e=>{s.setRequestHeader(e.name,e.value)});let y=l(`sendRaw`,e);e.forEach(e=>{r.updateFileStatus(e,`uploading`,0),y!==!0&&a.append(l(`fieldName`,e),e,e.name),e.xhr=s,e.__abort=()=>{s.abort()},g+=e.size}),n(`uploading`,{files:e,xhr:s}),i.value.push(s),y===!0?s.send(new Blob(e)):s.send(a)}return{isUploading:l,isBusy:u,abort:f,upload:p}}var Mf=Df({name:`QUploader`,props:kf,emits:Af,injectPlugin:jf}),Nf=h({name:`QUploaderAddTrigger`,setup(){let t=(0,e.inject)(ge,J);return t===J&&console.error(`QUploaderAddTrigger needs to be child of QUploader`),t}}),Pf=h({name:`QVideo`,props:{...rl,src:{type:String,required:!0},title:String,fetchpriority:{type:String,default:`auto`},loading:{type:String,default:`eager`},referrerpolicy:{type:String,default:`strict-origin-when-cross-origin`}},setup(t){let n=il(t),r=(0,e.computed)(()=>`q-video`+(t.ratio===void 0?``:` q-video--responsive`));return()=>(0,e.h)(`div`,{class:r.value,style:n.value},[(0,e.h)(`iframe`,{src:t.src,title:t.title,fetchpriority:t.fetchpriority,loading:t.loading,referrerpolicy:t.referrerpolicy,frameborder:`0`,allowfullscreen:!0})])}}),Ff=n({QAjaxBar:()=>Ke,QAvatar:()=>mt,QBadge:()=>gt,QBanner:()=>_t,QBar:()=>vt,QBreadcrumbs:()=>kt,QBreadcrumbsEl:()=>zt,QBtn:()=>yn,QBtnDropdown:()=>ii,QBtnGroup:()=>bn,QBtnToggle:()=>li,QCard:()=>ui,QCardActions:()=>fi,QCardSection:()=>di,QCarousel:()=>Pi,QCarouselControl:()=>Ii,QCarouselSlide:()=>Fi,QChatMessage:()=>Li,QCheckbox:()=>Gi,QChip:()=>Ji,QCircularProgress:()=>Qi,QColor:()=>ao,QDate:()=>ys,QDialog:()=>Rs,QDrawer:()=>Bs,QEditor:()=>dc,QExpansionItem:()=>bc,QFab:()=>Ec,QFabAction:()=>kc,QField:()=>Vc,QFile:()=>Yc,QFooter:()=>Zc,QForm:()=>$c,QFormChildMixin:()=>el,QHeader:()=>nl,QIcon:()=>Z,QImg:()=>al,QInfiniteScroll:()=>sl,QInnerLoading:()=>cl,QInput:()=>wl,QIntersection:()=>kl,QItem:()=>Ys,QItemLabel:()=>fc,QItemSection:()=>Xs,QKnob:()=>Pl,QLayout:()=>zl,QLinearProgress:()=>Hl,QList:()=>jl,QMarkupTable:()=>Wl,QMenu:()=>Xr,QNoSsr:()=>Gl,QOptionGroup:()=>$l,QPage:()=>eu,QPageContainer:()=>tu,QPageScroller:()=>iu,QPageSticky:()=>au,QPagination:()=>su,QParallax:()=>du,QPopupEdit:()=>pu,QPopupProxy:()=>mu,QPullToRefresh:()=>hu,QRadio:()=>Jl,QRange:()=>_u,QRating:()=>vu,QResizeObserver:()=>ma,QResponsive:()=>yu,QRouteTab:()=>nf,QScrollArea:()=>Tu,QScrollObserver:()=>Ll,QSelect:()=>Vu,QSeparator:()=>gc,QSkeleton:()=>Wu,QSlideItem:()=>Ku,QSlideTransition:()=>pc,QSlider:()=>ua,QSpace:()=>qu,QSpinner:()=>Ht,QSpinnerAudio:()=>Ju,QSpinnerBall:()=>Yu,QSpinnerBars:()=>Xu,QSpinnerBox:()=>Zu,QSpinnerClock:()=>Qu,QSpinnerComment:()=>$u,QSpinnerCube:()=>ed,QSpinnerDots:()=>td,QSpinnerFacebook:()=>nd,QSpinnerGears:()=>rd,QSpinnerGrid:()=>id,QSpinnerHearts:()=>ad,QSpinnerHourglass:()=>od,QSpinnerInfinity:()=>sd,QSpinnerIos:()=>cd,QSpinnerOrbit:()=>ld,QSpinnerOval:()=>ud,QSpinnerPie:()=>dd,QSpinnerPuff:()=>fd,QSpinnerRadio:()=>pd,QSpinnerRings:()=>md,QSpinnerTail:()=>hd,QSplitter:()=>gd,QStep:()=>xd,QStepper:()=>wd,QStepperNavigation:()=>Td,QTab:()=>wa,QTabPanel:()=>Ea,QTabPanels:()=>Ta,QTable:()=>$d,QTabs:()=>ya,QTd:()=>tf,QTh:()=>Ed,QTime:()=>uf,QTimeline:()=>pf,QTimelineEntry:()=>mf,QToggle:()=>Yl,QToolbar:()=>hf,QToolbarTitle:()=>gf,QTooltip:()=>Js,QTr:()=>ef,QTree:()=>yf,QUploader:()=>Mf,QUploaderAddTrigger:()=>Nf,QVideo:()=>Pf,QVirtualScroll:()=>Ad});function If(e){return e===!1?0:e===!0||e===void 0?1:Number.parseInt(e,10)||0}var Lf=g({name:`close-popup`,beforeMount(e,{value:t}){let n={depth:If(t),handler(t){n.depth!==0&&setTimeout(()=>{let r=An(e);r!==void 0&&Mn(r,t,n.depth)},0)},handlerKey(e){B(e,13)&&n.handler(e)}};e.__qclosepopup=n,e.addEventListener(`click`,n.handler),e.addEventListener(`keyup`,n.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=If(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});let Rf=0,zf;function Bf(){return!1}function Vf(e,t){zf===void 0&&(zf=document.createElement(`div`),zf.style.cssText=`position: absolute; left: 0; top: 0`,document.body.append(zf));let n=e.getBoundingClientRect(),r=zf.getBoundingClientRect(),{marginLeft:i,marginRight:a,marginTop:o,marginBottom:s}=window.getComputedStyle(e),c=Number.parseInt(i,10)+Number.parseInt(a,10),l=Number.parseInt(o,10)+Number.parseInt(s,10);return{left:n.left-r.left,top:n.top-r.top,width:n.right-n.left,height:n.bottom-n.top,widthM:n.right-n.left+(t?0:c),heightM:n.bottom-n.top+(t?0:l),marginH:t?c:0,marginV:t?l:0}}function Hf(e){return{width:e.scrollWidth,height:e.scrollHeight}}let Uf=[`Top`,`Right`,`Bottom`,`Left`],Wf=[`borderTopLeftRadius`,`borderTopRightRadius`,`borderBottomRightRadius`,`borderBottomLeftRadius`],Gf=/-block|-inline|block-|inline-/,Kf=/(-block|-inline|block-|inline-).*:/;function qf(e,t){let n=window.getComputedStyle(e),r={};for(let e=0;e!Kf.test(e)).join(`;`):r[i]=n[i]}return r}let Jf=[`absolute`,`fixed`,`relative`,`sticky`];function Yf(e){let t=e,n=0;for(;t!==null&&t!==document;){let{position:r,zIndex:i}=window.getComputedStyle(t),a=Number(i);a>n&&(t===e||Jf.includes(r))&&(n=a),t=t.parentNode}return n}function Xf(e){return{from:e.from,to:e.to===void 0?e.from:e.to}}function Zf(e,t){let n=Number.parseFloat(e);return Number.isFinite(n)?Math.max(0,Math.min(1,n)):t}function Qf(e){typeof e==`number`?e={duration:e}:typeof e==`function`&&(e={onEnd:e});let t=Number.parseInt(e.duration,10),n=Number.parseInt(e.delay,10);return{...e,waitFor:e.waitFor===void 0?0:e.waitFor,duration:Number.isNaN(t)?300:t,delay:Number.isNaN(n)?0:n,easing:typeof e.easing==`string`&&e.easing.length!==0?e.easing:`ease-in-out`,fill:typeof e.fill==`string`&&e.fill.length!==0?e.fill:`none`,resize:e.resize===!0,useCSS:e.useCSS===!0||e.usecss===!0,hideFromClone:e.hideFromClone===!0||e.hidefromclone===!0,keepToClone:e.keepToClone===!0||e.keeptoclone===!0,tween:e.tween===!0,tweenFromOpacity:Zf(e.tweenFromOpacity,.6),tweenToOpacity:Zf(e.tweenToOpacity,.5)}}function $f(e){let t=typeof e;return t===`function`?e():t===`string`?document.querySelector(e):e}function ep(e){return e&&e.ownerDocument===document&&e.parentNode!==null}function tp(e){let t=Bf,n=!1,r=!0,i=Xf(e),a=Qf(e),o=$f(i.from);if(!ep(o))return t;typeof o.qMorphCancel==`function`&&o.qMorphCancel();let s,c,l,u,d=o.parentNode,f=o.nextElementSibling,p=Vf(o,a.resize),{width:m,height:h}=Hf(d),{borderWidth:g,borderStyle:_,borderColor:v,borderRadius:y,backgroundColor:b,transform:x,position:S,cssText:C}=qf(o,[`borderWidth`,`borderStyle`,`borderColor`,`borderRadius`,`backgroundColor`,`transform`,`position`,`cssText`]),w=o.classList.toString(),T=o.style.cssText,E=o.cloneNode(!0),D=a.tween===!0?o.cloneNode(!0):void 0;return D!==void 0&&(D.className=D.classList.toString().split(` `).filter(e=>!e.startsWith(`bg-`)).join(` `)),a.hideFromClone===!0&&E.classList.add(`q-morph--internal`),E.setAttribute(`aria-hidden`,`true`),E.style.transition=`none`,E.style.animation=`none`,E.style.pointerEvents=`none`,d.insertBefore(E,f),o.qMorphCancel=()=>{n=!0,E.remove(),D?.remove(),a.hideFromClone===!0&&E.classList.remove(`q-morph--internal`),o.qMorphCancel=void 0},typeof e.onToggle==`function`&&e.onToggle(),requestAnimationFrame(()=>{let e=$f(i.to);if(n===!0||!ep(e)){typeof o.qMorphCancel==`function`&&o.qMorphCancel();return}o!==e&&typeof e.qMorphCancel==`function`&&e.qMorphCancel(),a.keepToClone!==!0&&e.classList.add(`q-morph--internal`),E.classList.add(`q-morph--internal`);let{width:f,height:O}=Hf(d),{width:k,height:A}=Hf(e.parentNode);a.hideFromClone!==!0&&E.classList.remove(`q-morph--internal`),e.qMorphCancel=()=>{n=!0,E.remove(),D?.remove(),a.hideFromClone===!0&&E.classList.remove(`q-morph--internal`),a.keepToClone!==!0&&e.classList.remove(`q-morph--internal`),o.qMorphCancel=void 0,e.qMorphCancel=void 0};let j=()=>{if(n===!0){typeof e.qMorphCancel==`function`&&e.qMorphCancel();return}a.hideFromClone!==!0&&(E.classList.add(`q-morph--internal`),E.innerHTML=``,E.style.left=0,E.style.right=`unset`,E.style.top=0,E.style.bottom=`unset`,E.style.transform=`none`),a.keepToClone!==!0&&e.classList.remove(`q-morph--internal`);let i=e.parentNode,{width:j,height:M}=Hf(i),N=e.cloneNode(a.keepToClone);N.setAttribute(`aria-hidden`,`true`),a.keepToClone!==!0&&(N.style.left=0,N.style.right=`unset`,N.style.top=0,N.style.bottom=`unset`,N.style.transform=`none`,N.style.pointerEvents=`none`),N.classList.add(`q-morph--internal`);let P=e===o&&d===i?E:e.nextElementSibling;i.insertBefore(N,P);let{borderWidth:F,borderStyle:I,borderColor:L,borderRadius:R,backgroundColor:ee,transform:z,position:te,cssText:B}=qf(e,[`borderWidth`,`borderStyle`,`borderColor`,`borderRadius`,`backgroundColor`,`transform`,`position`,`cssText`]),V=e.classList.toString(),ne=e.style.cssText;e.style.cssText=B,e.style.transform=`none`,e.style.animation=`none`,e.style.transition=`none`,e.className=V.split(` `).filter(e=>!e.startsWith(`bg-`)).join(` `);let H=Vf(e,a.resize),U=p.left-H.left,W=p.top-H.top,G=p.width/(H.width>0?H.width:10),K=p.height/(H.height>0?H.height:100),q=m-f,re=h-O,ie=j-k,ae=M-A,oe=Math.max(p.widthM,q),se=Math.max(p.heightM,re),ce=Math.max(H.widthM,ie),le=Math.max(H.heightM,ae),ue=o===e&&![`absolute`,`fixed`].includes(te)&&![`absolute`,`fixed`].includes(S),de=te===`fixed`,fe=i;for(;!de&&fe!==document;)de=window.getComputedStyle(fe).position===`fixed`,fe=fe.parentNode;if(a.hideFromClone!==!0&&(E.style.display=`block`,E.style.flex=`0 0 auto`,E.style.opacity=0,E.style.minWidth=`unset`,E.style.maxWidth=`unset`,E.style.minHeight=`unset`,E.style.maxHeight=`unset`,E.classList.remove(`q-morph--internal`)),a.keepToClone!==!0&&(N.style.display=`block`,N.style.flex=`0 0 auto`,N.style.opacity=0,N.style.minWidth=`unset`,N.style.maxWidth=`unset`,N.style.minHeight=`unset`,N.style.maxHeight=`unset`),N.classList.remove(`q-morph--internal`),typeof a.classes==`string`&&(e.className+=` `+a.classes),typeof a.style==`string`)e.style.cssText+=` `+a.style;else if(ve(a.style))for(let t in a.style)e.style[t]=a.style[t];let pe=Yf(E),me=Yf(e),he=de?document.documentElement:{scrollLeft:0,scrollTop:0};e.style.position=de?`fixed`:`absolute`,e.style.left=`${H.left-he.scrollLeft}px`,e.style.right=`unset`,e.style.top=`${H.top-he.scrollTop}px`,e.style.margin=0,a.resize===!0&&(e.style.minWidth=`unset`,e.style.maxWidth=`unset`,e.style.minHeight=`unset`,e.style.maxHeight=`unset`,e.style.overflow=`hidden`,e.style.overflowX=`hidden`,e.style.overflowY=`hidden`),document.body.append(e),D!==void 0&&(D.style.cssText=C,D.style.transform=`none`,D.style.animation=`none`,D.style.transition=`none`,D.style.position=e.style.position,D.style.left=`${p.left-he.scrollLeft}px`,D.style.right=`unset`,D.style.top=`${p.top-he.scrollTop}px`,D.style.margin=0,D.style.pointerEvents=`none`,a.resize===!0&&(D.style.minWidth=`unset`,D.style.maxWidth=`unset`,D.style.minHeight=`unset`,D.style.maxHeight=`unset`,D.style.overflow=`hidden`,D.style.overflowX=`hidden`,D.style.overflowY=`hidden`),document.body.append(D));let ge=n=>{o===e&&r!==!0?(e.style.cssText=T,e.className=w):(e.style.cssText=ne,e.className=V),N.parentNode===i&&N.before(e),E.remove(),N.remove(),D?.remove(),t=Bf,o.qMorphCancel=void 0,e.qMorphCancel=void 0,typeof a.onEnd==`function`&&a.onEnd(r===!0?`to`:`from`,n===!0)};if(a.useCSS!==!0&&typeof e.animate==`function`){let i=a.resize===!0?{transform:`translate(${U}px, ${W}px)`,width:`${oe}px`,height:`${se}px`}:{transform:`translate(${U}px, ${W}px) scale(${G}, ${K})`},d=a.resize===!0?{width:`${ce}px`,height:`${le}px`}:{},f=a.resize===!0?{width:`${oe}px`,height:`${se}px`}:{},m=a.resize===!0?{transform:`translate(${-1*U}px, ${-1*W}px)`,width:`${ce}px`,height:`${le}px`}:{transform:`translate(${-1*U}px, ${-1*W}px) scale(${1/G}, ${1/K})`},h=D===void 0?{backgroundColor:b}:{opacity:a.tweenToOpacity},S=D===void 0?{backgroundColor:ee}:{opacity:1};u=e.animate([{margin:0,borderWidth:g,borderStyle:_,borderColor:v,borderRadius:y,zIndex:pe,transformOrigin:`0 0`,...i,...h},{margin:0,borderWidth:F,borderStyle:I,borderColor:L,borderRadius:R,zIndex:me,transformOrigin:`0 0`,transform:z,...d,...S}],{duration:a.duration,easing:a.easing,fill:a.fill,delay:a.delay}),c=D===void 0?void 0:D.animate([{opacity:a.tweenFromOpacity,margin:0,borderWidth:g,borderStyle:_,borderColor:v,borderRadius:y,zIndex:pe,transformOrigin:`0 0`,transform:x,...f},{opacity:0,margin:0,borderWidth:F,borderStyle:I,borderColor:L,borderRadius:R,zIndex:me,transformOrigin:`0 0`,...m}],{duration:a.duration,easing:a.easing,fill:a.fill,delay:a.delay}),s=a.hideFromClone===!0||ue===!0?void 0:E.animate([{margin:`${re<0?re/2:0}px ${q<0?q/2:0}px`,width:`${oe+p.marginH}px`,height:`${se+p.marginV}px`},{margin:0,width:0,height:0}],{duration:a.duration,easing:a.easing,fill:a.fill,delay:a.delay}),l=a.keepToClone===!0?void 0:N.animate([ue===!0?{margin:`${re<0?re/2:0}px ${q<0?q/2:0}px`,width:`${oe+p.marginH}px`,height:`${se+p.marginV}px`}:{margin:0,width:0,height:0},{margin:`${ae<0?ae/2:0}px ${ie<0?ie/2:0}px`,width:`${ce+H.marginH}px`,height:`${le+H.marginV}px`}],{duration:a.duration,easing:a.easing,fill:a.fill,delay:a.delay});let C=e=>{s?.cancel(),c?.cancel(),l?.cancel(),u.cancel(),u.removeEventListener(`finish`,C),u.removeEventListener(`cancel`,C),ge(e),s=void 0,c=void 0,l=void 0,u=void 0};o.qMorphCancel=()=>{o.qMorphCancel=void 0,n=!0,C()},e.qMorphCancel=()=>{e.qMorphCancel=void 0,n=!0,C()},u.addEventListener(`finish`,C),u.addEventListener(`cancel`,C),t=e=>n===!0||u===void 0?!1:e===!0?(C(!0),!0):(r=r!==!0,s?.reverse(),c?.reverse(),l?.reverse(),u.reverse(),!0)}else{let i=`q-morph-anim-${++Rf}`,s=document.createElement(`style`),c=a.resize===!0?` - transform: translate(${U}px, ${W}px); - width: ${oe}px; - height: ${se}px; - `:`transform: translate(${U}px, ${W}px) scale(${G}, ${K});`,l=a.resize===!0?` - width: ${ce}px; - height: ${le}px; + `),e.print(),e.close();return}else if(e===`link`){let e=this.getParentAttribute(`href`);if(e===null){let e=this.selectWord(this.selection),t=e?e.toString():``;if(!t.length&&(!this.range||!this.range.cloneContents().querySelector(`img`)))return;this.eVm.editLinkUrl.value=Os.test(t)?t:`https://`,this.save(e.getRangeAt(0)),document.execCommand(`createLink`,!1,this.eVm.editLinkUrl.value)}else this.eVm.editLinkUrl.value=e,this.range.selectNodeContents(this.parent),this.save();return}else if(e===`fullscreen`){this.eVm.toggleFullscreen(),n();return}else if(e===`viewsource`){this.eVm.isViewingSource.value=this.eVm.isViewingSource.value===!1,this.eVm.setContent(this.eVm.props.modelValue),n();return}document.execCommand(e,!1,t),n()}selectWord(e){if(e===null||e.isCollapsed!==!0||e.modify===void 0)return e;let t=document.createRange();t.setStart(e.anchorNode,e.anchorOffset),t.setEnd(e.focusNode,e.focusOffset);let n=t.collapsed?[`backward`,`forward`]:[`forward`,`backward`];t.detach();let r=e.focusNode,i=e.focusOffset;return e.collapse(e.anchorNode,e.anchorOffset),e.modify(`move`,n[0],`character`),e.modify(`move`,n[1],`word`),e.extend(r,i),e.modify(`extend`,n[1],`character`),e.modify(`extend`,n[0],`word`),e}},As=h({name:`QTooltip`,inheritAttrs:!1,props:{...xn,...Tn,...Yn,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null},transitionShow:{...Yn.transitionShow,default:`jump-down`},transitionHide:{...Yn.transitionHide,default:`jump-up`},anchor:{type:String,default:`bottom middle`,validator:Ir},self:{type:String,default:`top middle`,validator:Ir},offset:{type:Array,default:()=>[14,14],validator:Lr},scrollTarget:$n,delay:{type:Number,default:0},hideDelay:{type:Number,default:0},persistent:Boolean},emits:[...En],setup(t,{slots:n,emit:r,attrs:i}){let a,o,s=(0,e.getCurrentInstance)(),{proxy:{$q:c}}=s,l=(0,e.ref)(null),u=(0,e.ref)(!1),d=(0,e.computed)(()=>zr(t.anchor,c.lang.rtl)),f=(0,e.computed)(()=>zr(t.self,c.lang.rtl)),p=(0,e.computed)(()=>t.persistent!==!0),{registerTick:m,removeTick:h}=Zn(),{registerTimeout:g}=Qn(),{transitionProps:_,transitionStyle:v}=Xn(t),{localScrollTarget:y,changeScrollEvent:b,unconfigureScrollTarget:x}=wn(t,B),{anchorEl:S,canShow:C,anchorEvents:w}=Cn({showing:u,configureAnchorEl:z}),{show:T,hide:E}=Dn({showing:u,canShow:C,handleShow:N,handleHide:P,hideOnRouteChange:p,processOnMount:!0});Object.assign(w,{delayShow:L,delayHide:R});let{showPortal:D,hidePortal:k,renderPortal:M}=Jn(s,l,V,`tooltip`);if(c.platform.is.mobile===!0){let n={anchorEl:S,innerRef:l,onClickOutside(e){return E(e),e.target.classList.contains(`q-dialog__backdrop`)&&O(e),!0}};(0,e.watch)((0,e.computed)(()=>t.modelValue===null&&t.persistent!==!0&&u.value===!0),e=>{(e===!0?Mr:Nr)(n)}),(0,e.onBeforeUnmount)(()=>{Nr(n)})}function N(n){D(),m(()=>{o=new MutationObserver(()=>I()),o.observe(l.value,{attributes:!1,childList:!0,characterData:!0,subtree:!0}),I(),B()}),a===void 0&&(a=(0,e.watch)(()=>c.screen.width+`|`+c.screen.height+`|`+t.self+`|`+t.anchor+`|`+c.lang.rtl,I)),g(()=>{D(!0),r(`show`,n)},t.transitionDuration)}function P(e){h(),k(),F(),g(()=>{k(!0),r(`hide`,e)},t.transitionDuration)}function F(){o!==void 0&&(o.disconnect(),o=void 0),a!==void 0&&(a(),a=void 0),x(),j(w,`tooltipTemp`)}function I(){Wr({targetEl:l.value,offset:t.offset,anchorEl:S.value,anchorOrigin:d.value,selfOrigin:f.value,maxHeight:t.maxHeight,maxWidth:t.maxWidth})}function L(e){if(c.platform.is.mobile===!0){bn(),document.body.classList.add(`non-selectable`);let e=S.value;A(w,`tooltipTemp`,[`touchmove`,`touchcancel`,`touchend`,`click`].map(t=>[e,t,`delayHide`,`passiveCapture`]))}g(()=>{T(e)},t.delay)}function R(e){c.platform.is.mobile===!0&&(j(w,`tooltipTemp`),bn(),setTimeout(()=>{document.body.classList.remove(`non-selectable`)},10)),g(()=>{E(e)},t.hideDelay)}function z(){t.noParentEvent===!0||S.value===null||A(w,`anchor`,c.platform.is.mobile===!0?[[S.value,`touchstart`,`delayShow`,`passive`]]:[[S.value,`mouseenter`,`delayShow`,`passive`],[S.value,`mouseleave`,`delayHide`,`passive`]])}function B(){if(S.value!==null||t.scrollTarget!==void 0){y.value=tr(S.value,t.scrollTarget);let e=t.noParentEvent===!0?I:E;b(y.value,e)}}function ee(){return u.value===!0?(0,e.h)(`div`,{...i,ref:l,class:[`q-tooltip q-tooltip--style q-position-engine no-pointer-events`,i.class],style:[i.style,v.value],role:`tooltip`},Y(n.default)):null}function V(){return(0,e.h)(e.Transition,_.value,ee)}return(0,e.onBeforeUnmount)(F),Object.assign(s.proxy,{updatePosition:I}),M}}),js=h({name:`QItem`,props:{...Z,...Rt,tag:{type:String,default:`div`},active:{type:Boolean,default:null},clickable:Boolean,dense:Boolean,insetLevel:Number,tabindex:[String,Number],focused:Boolean,manualFocus:Boolean},emits:[`click`,`keyup`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=Q(t,i),{hasLink:o,linkAttrs:s,linkClass:c,linkTag:l,navigateOnClick:u}=zt(),d=(0,e.ref)(null),f=(0,e.ref)(null),p=(0,e.computed)(()=>t.clickable===!0||o.value===!0||t.tag===`label`),m=(0,e.computed)(()=>t.disable!==!0&&p.value===!0),h=(0,e.computed)(()=>`q-item q-item-type row no-wrap`+(t.dense===!0?` q-item--dense`:``)+(a.value===!0?` q-item--dark`:``)+(o.value===!0&&t.active===null?c.value:t.active===!0?` q-item--active${t.activeClass===void 0?``:` ${t.activeClass}`}`:``)+(t.disable===!0?` disabled`:``)+(m.value===!0?` q-item--clickable q-link cursor-pointer `+(t.manualFocus===!0?`q-manual-focusable`:`q-focusable q-hoverable`)+(t.focused===!0?` q-manual-focusable--focused`:``):``)),g=(0,e.computed)(()=>t.insetLevel===void 0?null:{[`padding`+(i.lang.rtl===!0?`Right`:`Left`)]:16+t.insetLevel*56+`px`});function _(e){m.value===!0&&(f.value!==null&&e.qAvoidFocus!==!0&&(e.qKeyEvent!==!0&&document.activeElement===d.value?f.value.focus():document.activeElement===f.value&&d.value.focus()),u(e))}function v(e){if(m.value===!0&&V(e,[13,32])===!0){O(e),e.qKeyEvent=!0;let t=new MouseEvent(`click`,e);t.qKeyEvent=!0,d.value.dispatchEvent(t)}r(`keyup`,e)}function y(){let t=Ze(n.default,[]);return m.value===!0&&t.unshift((0,e.h)(`div`,{class:`q-focus-helper`,tabindex:-1,ref:f})),t}return()=>{let n={ref:d,class:h.value,style:g.value,role:`listitem`,onClick:_,onKeyup:v};return m.value===!0?(n.tabindex=t.tabindex||`0`,Object.assign(n,s.value)):p.value===!0&&(n[`aria-disabled`]=`true`),(0,e.h)(l.value,n,y())}}}),Ms=h({name:`QItemSection`,props:{avatar:Boolean,thumbnail:Boolean,side:Boolean,top:Boolean,noWrap:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-item__section column q-item__section--${t.avatar===!0||t.side===!0||t.thumbnail===!0?`side`:`main`}`+(t.top===!0?` q-item__section--top justify-start`:` justify-center`)+(t.avatar===!0?` q-item__section--avatar`:``)+(t.thumbnail===!0?` q-item__section--thumbnail`:``)+(t.noWrap===!0?` q-item__section--nowrap`:``));return()=>(0,e.h)(`div`,{class:r.value},Y(n.default))}});function Ns(e,t,n){t.handler?t.handler(e,n,n.caret):n.runCmd(t.cmd,t.param)}function Ps(t){return(0,e.h)(`div`,{class:`q-editor__toolbar-group`},t)}function Fs(t,n,r,i=!1){let a=i||(n.type===`toggle`?n.toggled?n.toggled(t):n.cmd&&t.caret.is(n.cmd,n.param):!1),o=[];if(t.$q.platform.is.desktop&&(n.tip||n.htmlTip)){let t=n.key?(0,e.h)(`div`,[(0,e.h)(`small`,`(CTRL + ${String.fromCharCode(n.key)})`)]):null;o.push((0,e.h)(As,{delay:1e3},()=>[(0,e.h)(`div`,n.htmlTip?{innerHTML:n.htmlTip}:n.tip),t]))}return(0,e.h)($,{...t.buttonProps.value,icon:n.icon===null?void 0:n.icon,color:a?n.toggleColor||t.props.toolbarToggleColor:n.color||t.props.toolbarColor,textColor:a&&!t.props.toolbarPush?null:n.textColor||t.props.toolbarTextColor,label:n.label,"aria-label":n.label===null?n.tip:void 0,disable:n.disable?typeof n.disable==`function`?n.disable(t):!0:!1,size:`sm`,onClick(e){r?.(),Ns(e,n,t)}},()=>o)}function Is(t,n){let r=n.list===`only-icons`,i=n.label,a=n.icon===null?void 0:n.icon,o,s;function c(){u.component.proxy.hide()}if(r)s=n.options.map(e=>{let n=e.type===void 0?t.caret.is(e.cmd,e.param):!1;return n&&(i=e.tip,a=e.icon===null?void 0:e.icon),Fs(t,e,c,n)}),o=t.toolbarBackgroundClass.value,s=[Ps(s)];else{let r=t.props.toolbarToggleColor===void 0?null:`text-${t.props.toolbarToggleColor}`,l=t.props.toolbarTextColor===void 0?null:`text-${t.props.toolbarTextColor}`,u=n.list===`no-icons`;s=n.options.map(n=>{let o=n.disable?n.disable(t):!1,s=n.type===void 0?t.caret.is(n.cmd,n.param):!1;s&&(i=n.tip,a=n.icon===null?void 0:n.icon);let d=n.htmlTip;return(0,e.h)(js,{active:s,activeClass:r,clickable:!0,disable:o,dense:!0,onClick(e){c(),e?.qAvoidFocus!==!0&&t.contentRef.value?.focus(),t.caret.restore(),Ns(e,n,t)}},()=>[u===!0?null:(0,e.h)(Ms,{class:s?r:l,side:!0},()=>(0,e.h)(X,{name:n.icon===null?void 0:n.icon})),(0,e.h)(Ms,d?()=>(0,e.h)(`div`,{class:`text-no-wrap`,innerHTML:n.htmlTip}):n.tip?()=>(0,e.h)(`div`,{class:`text-no-wrap`},n.tip):void 0)])}),o=[t.toolbarBackgroundClass.value,l]}let l=n.highlight&&i!==n.label,u=(0,e.h)(ii,{...t.buttonProps.value,noCaps:!0,noWrap:!0,color:l?t.props.toolbarToggleColor:t.props.toolbarColor,textColor:l&&!t.props.toolbarPush?null:t.props.toolbarTextColor,label:n.fixedLabel?n.label:i,icon:n.fixedIcon?n.icon===null?void 0:n.icon:a,contentClass:o,onShow:e=>t.emit(`dropdownShow`,e),onHide:e=>t.emit(`dropdownHide`,e),onBeforeShow:e=>t.emit(`dropdownBeforeShow`,e),onBeforeHide:e=>t.emit(`dropdownBeforeHide`,e)},()=>s);return u}function Ls(e){if(e.caret)return e.buttons.value.filter(t=>!e.isViewingSource.value||t.find(e=>e.cmd===`viewsource`)).map(t=>Ps(t.map(t=>e.isViewingSource.value&&t.cmd!==`viewsource`?!1:t.type===`slot`?Y(e.slots[t.slot]):t.type===`dropdown`?Is(e,t):Fs(e,t))))}function Rs(e,t,n,r={}){let i=Object.keys(r);if(i.length===0)return{};let a={default_font:{cmd:`fontName`,param:e,icon:n,tip:t}};return i.forEach(e=>{let t=r[e];a[e]={cmd:`fontName`,param:t,icon:n,tip:t,htmlTip:`${t}`}}),a}function zs(t){if(t.caret){let n=t.props.toolbarColor||t.props.toolbarTextColor,r=t.editLinkUrl.value,i=()=>{t.caret.restore(),r!==t.editLinkUrl.value&&document.execCommand(`createLink`,!1,r===``?` `:r),t.editLinkUrl.value=null};return[(0,e.h)(`div`,{class:`q-mx-xs text-${n}`},`${t.$q.lang.editor.url}: `),(0,e.h)(`input`,{key:`qedt_btm_input`,class:`col q-editor__link-input`,value:r,onInput:e=>{E(e),r=e.target.value},onKeydown:e=>{if(ee(e)!==!0)switch(e.keyCode){case 13:return D(e),i();case 27:D(e),t.caret.restore(),(!t.editLinkUrl.value||t.editLinkUrl.value===`https://`)&&document.execCommand(`unlink`),t.editLinkUrl.value=null;break}}}),Ps([(0,e.h)($,{key:`qedt_btm_rem`,...t.buttonProps.value,label:t.$q.lang.label.remove,noCaps:!0,onClick:()=>{t.caret.restore(),document.execCommand(`unlink`),t.editLinkUrl.value=null}}),(0,e.h)($,{key:`qedt_btm_upd`,...t.buttonProps.value,label:t.$q.lang.label.update,noCaps:!0,onClick:i})])]}}let Bs=/^on[A-Z]/;function Vs(){let{attrs:t,vnode:n}=(0,e.getCurrentInstance)(),r={listeners:(0,e.ref)({}),attributes:(0,e.ref)({})};function i(){let e={},i={};for(let n in t)n!==`class`&&n!==`style`&&Bs.test(n)===!1&&(e[n]=t[n]);for(let e in n.props)Bs.test(e)===!0&&(i[e]=n.props[e]);r.attributes.value=e,r.listeners.value=i}return(0,e.onBeforeUpdate)(i),i(),r}let Hs=Object.prototype.toString,Us=Object.prototype.hasOwnProperty,Ws=new Set([`Boolean`,`Number`,`String`,`Function`,`Array`,`Date`,`RegExp`].map(e=>`[object `+e+`]`));function Gs(e){if(e!==Object(e)||Ws.has(Hs.call(e))===!0||e.constructor&&Us.call(e,`constructor`)===!1&&Us.call(e.constructor.prototype,`isPrototypeOf`)===!1)return!1;let t;for(t in e);return t===void 0||Us.call(e,t)}function Ks(){let e,t,n,r,i,a,o=arguments[0]||{},s=1,c=!1,l=arguments.length;for(typeof o==`boolean`&&(c=o,o=arguments[1]||{},s=2),Object(o)!==o&&typeof o!=`function`&&(o={}),l===s&&(o=this,s--);se.length===0||e.every(e=>e.length),default:()=>[[`left`,`center`,`right`,`justify`],[`bold`,`italic`,`underline`,`strike`],[`undo`,`redo`]]},toolbarColor:String,toolbarBg:String,toolbarTextColor:String,toolbarToggleColor:{type:String,default:`primary`},toolbarOutline:Boolean,toolbarPush:Boolean,toolbarRounded:Boolean,paragraphTag:{type:String,validator:e=>[`div`,`p`].includes(e),default:`div`},contentStyle:Object,contentClass:[Object,Array,String],square:Boolean,flat:Boolean,dense:Boolean},emits:[...Oi,`update:modelValue`,`keydown`,`click`,`focus`,`blur`,`dropdownShow`,`dropdownHide`,`dropdownBeforeShow`,`dropdownBeforeHide`,`linkShow`,`linkHide`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=Q(t,a),{inFullscreen:s,toggleFullscreen:c}=ki(),l=Vs(),u=(0,e.ref)(null),d=(0,e.ref)(null),f=(0,e.ref)(null),p=(0,e.ref)(!1),m=(0,e.computed)(()=>!t.readonly&&!t.disable),h,g,_=t.modelValue;document.execCommand(`defaultParagraphSeparator`,!1,t.paragraphTag),h=window.getComputedStyle(document.body).fontFamily;let v=(0,e.computed)(()=>t.toolbarBg?` bg-${t.toolbarBg}`:``),y=(0,e.computed)(()=>({type:`a`,flat:t.toolbarOutline!==!0&&t.toolbarPush!==!0,noWrap:!0,outline:t.toolbarOutline,push:t.toolbarPush,rounded:t.toolbarRounded,dense:!0,color:t.toolbarColor,disable:!m.value,size:`sm`})),b=(0,e.computed)(()=>{let e=a.lang.editor,n=a.iconSet.editor;return{bold:{cmd:`bold`,icon:n.bold,tip:e.bold,key:66},italic:{cmd:`italic`,icon:n.italic,tip:e.italic,key:73},strike:{cmd:`strikeThrough`,icon:n.strikethrough,tip:e.strikethrough,key:83},underline:{cmd:`underline`,icon:n.underline,tip:e.underline,key:85},unordered:{cmd:`insertUnorderedList`,icon:n.unorderedList,tip:e.unorderedList},ordered:{cmd:`insertOrderedList`,icon:n.orderedList,tip:e.orderedList},subscript:{cmd:`subscript`,icon:n.subscript,tip:e.subscript,htmlTip:`x2`},superscript:{cmd:`superscript`,icon:n.superscript,tip:e.superscript,htmlTip:`x2`},link:{cmd:`link`,disable:e=>e.caret&&!e.caret.can(`link`),icon:n.hyperlink,tip:e.hyperlink,key:76},fullscreen:{cmd:`fullscreen`,icon:n.toggleFullscreen,tip:e.toggleFullscreen,key:70},viewsource:{cmd:`viewsource`,icon:n.viewSource,tip:e.viewSource},quote:{cmd:`formatBlock`,param:`BLOCKQUOTE`,icon:n.quote,tip:e.quote,key:81},left:{cmd:`justifyLeft`,icon:n.left,tip:e.left},center:{cmd:`justifyCenter`,icon:n.center,tip:e.center},right:{cmd:`justifyRight`,icon:n.right,tip:e.right},justify:{cmd:`justifyFull`,icon:n.justify,tip:e.justify},print:{type:`no-state`,cmd:`print`,icon:n.print,tip:e.print,key:80},outdent:{type:`no-state`,disable:e=>e.caret&&!e.caret.can(`outdent`),cmd:`outdent`,icon:n.outdent,tip:e.outdent},indent:{type:`no-state`,disable:e=>e.caret&&!e.caret.can(`indent`),cmd:`indent`,icon:n.indent,tip:e.indent},removeFormat:{type:`no-state`,cmd:`removeFormat`,icon:n.removeFormat,tip:e.removeFormat},hr:{type:`no-state`,cmd:`insertHorizontalRule`,icon:n.hr,tip:e.hr},undo:{type:`no-state`,cmd:`undo`,icon:n.undo,tip:e.undo,key:90},redo:{type:`no-state`,cmd:`redo`,icon:n.redo,tip:e.redo,key:89},h1:{cmd:`formatBlock`,param:`H1`,icon:n.heading1||n.heading,tip:e.heading1,htmlTip:`

${e.heading1}

`},h2:{cmd:`formatBlock`,param:`H2`,icon:n.heading2||n.heading,tip:e.heading2,htmlTip:`

${e.heading2}

`},h3:{cmd:`formatBlock`,param:`H3`,icon:n.heading3||n.heading,tip:e.heading3,htmlTip:`

${e.heading3}

`},h4:{cmd:`formatBlock`,param:`H4`,icon:n.heading4||n.heading,tip:e.heading4,htmlTip:`

${e.heading4}

`},h5:{cmd:`formatBlock`,param:`H5`,icon:n.heading5||n.heading,tip:e.heading5,htmlTip:`
${e.heading5}
`},h6:{cmd:`formatBlock`,param:`H6`,icon:n.heading6||n.heading,tip:e.heading6,htmlTip:`
${e.heading6}
`},p:{cmd:`formatBlock`,param:t.paragraphTag,icon:n.heading,tip:e.paragraph},code:{cmd:`formatBlock`,param:`PRE`,icon:n.code,htmlTip:`${e.code}`},"size-1":{cmd:`fontSize`,param:`1`,icon:n.size1||n.size,tip:e.size1,htmlTip:`${e.size1}`},"size-2":{cmd:`fontSize`,param:`2`,icon:n.size2||n.size,tip:e.size2,htmlTip:`${e.size2}`},"size-3":{cmd:`fontSize`,param:`3`,icon:n.size3||n.size,tip:e.size3,htmlTip:`${e.size3}`},"size-4":{cmd:`fontSize`,param:`4`,icon:n.size4||n.size,tip:e.size4,htmlTip:`${e.size4}`},"size-5":{cmd:`fontSize`,param:`5`,icon:n.size5||n.size,tip:e.size5,htmlTip:`${e.size5}`},"size-6":{cmd:`fontSize`,param:`6`,icon:n.size6||n.size,tip:e.size6,htmlTip:`${e.size6}`},"size-7":{cmd:`fontSize`,param:`7`,icon:n.size7||n.size,tip:e.size7,htmlTip:`${e.size7}`}}}),x=(0,e.computed)(()=>{let e=t.definitions||{},n=t.definitions||t.fonts?Ks(!0,{},b.value,e,Rs(h,a.lang.editor.defaultFont,a.iconSet.editor.font,t.fonts)):b.value;return t.toolbar.map(t=>t.map(t=>{if(t.options)return{type:`dropdown`,icon:t.icon,label:t.label,size:`sm`,dense:!0,fixedLabel:t.fixedLabel,fixedIcon:t.fixedIcon,highlight:t.highlight,list:t.list,options:t.options.map(e=>n[e])};let r=n[t];return r?r.type===`no-state`||e[t]&&(r.cmd===void 0||b.value[r.cmd]&&b.value[r.cmd].type===`no-state`)?r:Object.assign({type:`toggle`},r):{type:`slot`,slot:t}}))}),S={$q:a,props:t,slots:n,emit:r,inFullscreen:s,toggleFullscreen:c,runCmd:B,isViewingSource:p,editLinkUrl:f,toolbarBackgroundClass:v,buttonProps:y,contentRef:d,buttons:x,setContent:z};(0,e.watch)(()=>t.modelValue,e=>{_!==e&&(_=e,z(e,!0))}),(0,e.watch)(f,e=>{r(`link${e?`Show`:`Hide`}`)});let C=(0,e.computed)(()=>t.toolbar&&t.toolbar.length!==0),w=(0,e.computed)(()=>{let e={},t=t=>{t.key&&(e[t.key]={cmd:t.cmd,param:t.param})};return x.value.forEach(e=>{e.forEach(e=>{e.options?e.options.forEach(t):t(e)})}),e}),T=(0,e.computed)(()=>s.value?t.contentStyle:[{minHeight:t.minHeight,height:t.height,maxHeight:t.maxHeight},t.contentStyle]),E=(0,e.computed)(()=>`q-editor q-editor--${p.value===!0?`source`:`default`}`+(t.disable===!0?` disabled`:``)+(s.value===!0?` fullscreen column`:``)+(t.square===!0?` q-editor--square no-border-radius`:``)+(t.flat===!0?` q-editor--flat`:``)+(t.dense===!0?` q-editor--dense`:``)+(o.value===!0?` q-editor--dark q-dark`:``)),D=(0,e.computed)(()=>[t.contentClass,`q-editor__content`,{col:s.value,"overflow-auto":s.value||t.maxHeight}]),k=(0,e.computed)(()=>t.disable===!0?{"aria-disabled":`true`}:{});function A(){if(d.value!==null){let e=`inner${p.value===!0?`Text`:`HTML`}`,n=d.value[e];n!==t.modelValue&&(_=n,r(`update:modelValue`,n))}}function j(e){if(r(`keydown`,e),e.ctrlKey!==!0||ee(e)===!0){V();return}let t=e.keyCode,n=w.value[t];if(n!==void 0){let{cmd:t,param:r}=n;O(e),B(t,r,!1)}}function M(e){V(),r(`click`,e)}function N(e){if(d.value!==null){let{scrollTop:e,scrollHeight:t}=d.value;g=t-e}S.caret.save(),r(`blur`,e)}function P(t){(0,e.nextTick)(()=>{d.value!==null&&g!==void 0&&(d.value.scrollTop=d.value.scrollHeight-g)}),r(`focus`,t)}function F(e){let t=u.value;if(t!==null&&t.contains(e.target)===!0&&(e.relatedTarget===null||t.contains(e.relatedTarget)!==!0)){let e=`inner${p.value===!0?`Text`:`HTML`}`;S.caret.restorePosition(d.value[e].length),V()}}function I(e){let t=u.value;t!==null&&t.contains(e.target)===!0&&(e.relatedTarget===null||t.contains(e.relatedTarget)!==!0)&&(S.caret.savePosition(),V())}function L(){g=void 0}function R(){S.caret.save()}function z(e,t){if(d.value!==null){t===!0&&S.caret.savePosition();let n=`inner${p.value===!0?`Text`:`HTML`}`;d.value[n]=e,t===!0&&(S.caret.restorePosition(d.value[n].length),V())}}function B(e,t,n=!0){H(),S.caret.restore(),S.caret.apply(e,t,()=>{H(),S.caret.save(),n&&V()})}function V(){setTimeout(()=>{f.value=null,i.$forceUpdate()},1)}function H(){Nn(()=>{d.value?.focus({preventScroll:!0})})}function te(){return d.value}return(0,e.onMounted)(()=>{S.caret=i.caret=new ks(d.value,S),z(t.modelValue),V(),document.addEventListener(`selectionchange`,R)}),(0,e.onBeforeUnmount)(()=>{document.removeEventListener(`selectionchange`,R)}),Object.assign(i,{runCmd:B,refreshToolbar:V,focus:H,getContentEl:te}),()=>{let n;if(C.value){let t=[(0,e.h)(`div`,{key:`qedt_top`,class:`q-editor__toolbar row no-wrap scroll-x`+v.value},Ls(S))];f.value!==null&&t.push((0,e.h)(`div`,{key:`qedt_btm`,class:`q-editor__toolbar row no-wrap items-center scroll-x`+v.value},zs(S))),n=(0,e.h)(`div`,{key:`toolbar_ctainer`,class:`q-editor__toolbars-container`},t)}return(0,e.h)(`div`,{ref:u,class:E.value,style:{height:s.value===!0?`100%`:null},...k.value,onFocusin:F,onFocusout:I},[n,(0,e.h)(`div`,{ref:d,style:T.value,class:D.value,contenteditable:m.value,placeholder:t.placeholder,...l.listeners.value,onInput:A,onKeydown:j,onClick:M,onBlur:N,onFocus:P,onMousedown:L,onTouchstartPassive:L})])}}}),Js=h({name:`QItemLabel`,props:{overline:Boolean,caption:Boolean,header:Boolean,lines:[Number,String]},setup(t,{slots:n}){let r=(0,e.computed)(()=>parseInt(t.lines,10)),i=(0,e.computed)(()=>`q-item__label`+(t.overline===!0?` q-item__label--overline text-overline`:``)+(t.caption===!0?` q-item__label--caption text-caption`:``)+(t.header===!0?` q-item__label--header`:``)+(r.value===1?` ellipsis`:``)),a=(0,e.computed)(()=>t.lines!==void 0&&r.value>1?{overflow:`hidden`,display:`-webkit-box`,"-webkit-box-orient":`vertical`,"-webkit-line-clamp":r.value}:null);return()=>(0,e.h)(`div`,{style:a.value,class:i.value},Y(n.default))}}),Ys=h({name:`QSlideTransition`,props:{appear:Boolean,duration:{type:Number,default:300}},emits:[`show`,`hide`],setup(t,{slots:n,emit:r}){let i=!1,a,o,s=null,c=null,l,u;function d(){a?.(),a=null,i=!1,s!==null&&(clearTimeout(s),s=null),c!==null&&(clearTimeout(c),c=null),o?.removeEventListener(`transitionend`,l),l=null}function f(e,n,r){n!==void 0&&(e.style.height=`${n}px`),e.style.transition=`height ${t.duration}ms cubic-bezier(.25, .8, .50, 1)`,i=!0,a=r}function p(e,t){e.style.overflowY=null,e.style.height=null,e.style.transition=null,d(),t!==u&&r(t)}function m(e,n){let r=0;o=e,i===!0?(d(),r=e.offsetHeight===e.scrollHeight?0:void 0):(u=`hide`,e.style.overflowY=`hidden`),f(e,r,n),s=setTimeout(()=>{s=null,e.style.height=`${e.scrollHeight}px`,l=t=>{c=null,(Object(t)!==t||t.target===e)&&p(e,`show`)},e.addEventListener(`transitionend`,l),c=setTimeout(l,t.duration*1.1)},100)}function h(e,n){let r;o=e,i===!0?d():(u=`show`,e.style.overflowY=`hidden`,r=e.scrollHeight),f(e,r,n),s=setTimeout(()=>{s=null,e.style.height=0,l=t=>{c=null,(Object(t)!==t||t.target===e)&&p(e,`hide`)},e.addEventListener(`transitionend`,l),c=setTimeout(l,t.duration*1.1)},100)}return(0,e.onBeforeUnmount)(()=>{i===!0&&d()}),()=>(0,e.h)(e.Transition,{css:!1,appear:t.appear,onEnter:m,onLeave:h},n.default)}});let Xs={true:`inset`,item:`item-inset`,"item-thumbnail":`item-thumbnail-inset`},Zs={xs:2,sm:4,md:8,lg:16,xl:24};var Qs=h({name:`QSeparator`,props:{...Z,spaced:[Boolean,String],inset:[Boolean,String],vertical:Boolean,color:String,size:String},setup(t){let n=Q(t,(0,e.getCurrentInstance)().proxy.$q),r=(0,e.computed)(()=>t.vertical===!0?`vertical`:`horizontal`),i=(0,e.computed)(()=>` q-separator--${r.value}`),a=(0,e.computed)(()=>t.inset===!1?``:`${i.value}-${Xs[t.inset]}`),o=(0,e.computed)(()=>`q-separator${i.value}${a.value}`+(t.color===void 0?``:` bg-${t.color}`)+(n.value===!0?` q-separator--dark`:``)),s=(0,e.computed)(()=>{let e={};if(t.size!==void 0&&(e[t.vertical===!0?`width`:`height`]=t.size),t.spaced!==!1){let n=t.spaced===!0?`${Zs.md}px`:t.spaced in Zs?`${Zs[t.spaced]}px`:t.spaced,r=t.vertical===!0?[`Left`,`Right`]:[`Top`,`Bottom`];e[`margin${r[0]}`]=e[`margin${r[1]}`]=n}return e});return()=>(0,e.h)(`hr`,{class:o.value,style:s.value,"aria-orientation":r.value})}});let $s=(0,e.shallowReactive)({}),ec=Object.keys(Rt);var tc=h({name:`QExpansionItem`,props:{...Rt,...Tn,...Z,icon:String,label:String,labelLines:[Number,String],caption:String,captionLines:[Number,String],dense:Boolean,toggleAriaLabel:String,expandIcon:String,expandedIcon:String,expandIconClass:[Array,String,Object],duration:{},headerInsetLevel:Number,contentInsetLevel:Number,expandSeparator:Boolean,defaultOpened:Boolean,hideExpandIcon:Boolean,expandIconToggle:Boolean,switchToggleSide:Boolean,denseToggle:Boolean,group:String,popup:Boolean,headerStyle:[Array,String,Object],headerClass:[Array,String,Object]},emits:[...En,`click`,`afterShow`,`afterHide`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=Q(t,i),o=(0,e.ref)(t.modelValue===null?t.defaultOpened:t.modelValue),s=(0,e.ref)(null),c=ti(),{show:l,hide:u,toggle:d}=Dn({showing:o}),f,p,m=(0,e.computed)(()=>`q-expansion-item q-item-type q-expansion-item--${o.value===!0?`expanded`:`collapsed`} q-expansion-item--${t.popup===!0?`popup`:`standard`}`),h=(0,e.computed)(()=>t.contentInsetLevel===void 0?null:{[`padding`+(i.lang.rtl===!0?`Right`:`Left`)]:t.contentInsetLevel*56+`px`}),g=(0,e.computed)(()=>t.disable!==!0&&(t.href!==void 0||t.to!==void 0&&t.to!==null&&t.to!==``)),_=(0,e.computed)(()=>{let e={};return ec.forEach(n=>{e[n]=t[n]}),e}),v=(0,e.computed)(()=>g.value===!0||t.expandIconToggle!==!0),y=(0,e.computed)(()=>t.expandedIcon!==void 0&&o.value===!0?t.expandedIcon:t.expandIcon||i.iconSet.expansionItem[t.denseToggle===!0?`denseIcon`:`icon`]),b=(0,e.computed)(()=>t.disable!==!0&&(g.value===!0||t.expandIconToggle===!0)),x=(0,e.computed)(()=>({expanded:o.value===!0,detailsId:c.value,toggle:d,show:l,hide:u})),S=(0,e.computed)(()=>{let e=t.toggleAriaLabel===void 0?i.lang.label[o.value===!0?`collapse`:`expand`](t.label):t.toggleAriaLabel;return{role:`button`,"aria-expanded":o.value===!0?`true`:`false`,"aria-controls":c.value,"aria-label":e}});(0,e.watch)(()=>t.group,e=>{p?.(),e!==void 0&&k()});function C(e){g.value!==!0&&d(e),r(`click`,e)}function w(e){e.keyCode===13&&T(e,!0)}function T(e,t){t!==!0&&e.qAvoidFocus!==!0&&s.value?.focus(),d(e),O(e)}function E(){r(`afterShow`)}function D(){r(`afterHide`)}function k(){f===void 0&&(f=Qr()),o.value===!0&&($s[t.group]=f);let n=(0,e.watch)(o,e=>{e===!0?$s[t.group]=f:$s[t.group]===f&&delete $s[t.group]}),r=(0,e.watch)(()=>$s[t.group],(e,t)=>{t===f&&e!==void 0&&e!==f&&u()});p=()=>{n(),r(),$s[t.group]===f&&delete $s[t.group],p=void 0}}function A(){let n={class:[`q-focusable relative-position cursor-pointer${t.denseToggle===!0&&t.switchToggleSide===!0?` items-end`:``}`,t.expandIconClass],side:t.switchToggleSide!==!0,avatar:t.switchToggleSide},r=[(0,e.h)(X,{class:`q-expansion-item__toggle-icon`+(t.expandedIcon===void 0&&o.value===!0?` q-expansion-item__toggle-icon--rotated`:``),name:y.value})];return b.value===!0&&(Object.assign(n,{tabindex:0,...S.value,onClick:T,onKeyup:w}),r.unshift((0,e.h)(`div`,{ref:s,class:`q-expansion-item__toggle-focus q-icon q-focus-helper q-focus-helper--rounded`,tabindex:-1}))),(0,e.h)(Ms,n,()=>r)}function j(){let r;return n.header===void 0?(r=[(0,e.h)(Ms,()=>[(0,e.h)(Js,{lines:t.labelLines},()=>t.label||``),t.caption?(0,e.h)(Js,{lines:t.captionLines,caption:!0},()=>t.caption):null])],t.icon&&r[t.switchToggleSide===!0?`push`:`unshift`]((0,e.h)(Ms,{side:t.switchToggleSide===!0,avatar:t.switchToggleSide!==!0},()=>(0,e.h)(X,{name:t.icon})))):r=[].concat(n.header(x.value)),t.disable!==!0&&t.hideExpandIcon!==!0&&r[t.switchToggleSide===!0?`unshift`:`push`](A()),r}function M(){let n={ref:`item`,style:t.headerStyle,class:t.headerClass,dark:a.value,disable:t.disable,dense:t.dense,insetLevel:t.headerInsetLevel};return v.value===!0&&(n.clickable=!0,n.onClick=C,Object.assign(n,g.value===!0?_.value:S.value)),(0,e.h)(js,n,j)}function N(){return(0,e.withDirectives)((0,e.h)(`div`,{key:`e-content`,class:`q-expansion-item__content relative-position`,style:h.value,id:c.value},Y(n.default)),[[e.vShow,o.value]])}function P(){let n=[M(),(0,e.h)(Ys,{duration:t.duration,onShow:E,onHide:D},N)];return t.expandSeparator===!0&&n.push((0,e.h)(Qs,{class:`q-expansion-item__border q-expansion-item__border--top absolute-top`,dark:a.value}),(0,e.h)(Qs,{class:`q-expansion-item__border q-expansion-item__border--bottom absolute-bottom`,dark:a.value})),n}return t.group!==void 0&&k(),(0,e.onBeforeUnmount)(()=>{p?.()}),()=>(0,e.h)(`div`,{class:m.value},[(0,e.h)(`div`,{class:`q-expansion-item__container relative-position`},P())])}});let nc=[`top`,`right`,`bottom`,`left`],rc={type:{type:String,default:`a`},outline:Boolean,push:Boolean,flat:Boolean,unelevated:Boolean,color:String,textColor:String,glossy:Boolean,square:Boolean,padding:String,label:{type:[String,Number],default:``},labelPosition:{type:String,default:`right`,validator:e=>nc.includes(e)},externalLabel:Boolean,hideLabel:{type:Boolean},labelClass:[Array,String,Object],labelStyle:[Array,String,Object],disable:Boolean,tabindex:[Number,String]};function ic(t,n){return{formClass:(0,e.computed)(()=>`q-fab--form-${t.square===!0?`square`:`rounded`}`),stacked:(0,e.computed)(()=>t.externalLabel===!1&&[`top`,`bottom`].includes(t.labelPosition)),labelProps:(0,e.computed)(()=>{if(t.externalLabel===!0){let e=t.hideLabel===null?n.value===!1:t.hideLabel;return{action:`push`,data:{class:[t.labelClass,`q-fab__label q-tooltip--style q-fab__label--external q-fab__label--external-${t.labelPosition}`+(e===!0?` q-fab__label--external-hidden`:``)],style:t.labelStyle}}}return{action:[`left`,`top`].includes(t.labelPosition)?`unshift`:`push`,data:{class:[t.labelClass,`q-fab__label q-fab__label--internal q-fab__label--internal-${t.labelPosition}`+(t.hideLabel===!0?` q-fab__label--internal-hidden`:``)],style:t.labelStyle}}})}}let ac=[`up`,`right`,`down`,`left`],oc=[`left`,`center`,`right`];var sc=h({name:`QFab`,props:{...rc,...Tn,icon:String,activeIcon:String,hideIcon:Boolean,hideLabel:{...rc.hideLabel,default:null},direction:{type:String,default:`right`,validator:e=>ac.includes(e)},persistent:Boolean,verticalActionsAlign:{type:String,default:`center`,validator:e=>oc.includes(e)}},emits:En,setup(t,{slots:n}){let r=(0,e.ref)(null),i=(0,e.ref)(t.modelValue===!0),a=ti(),{proxy:{$q:o}}=(0,e.getCurrentInstance)(),{formClass:s,labelProps:c}=ic(t,i),{hide:l,toggle:u}=Dn({showing:i,hideOnRouteChange:(0,e.computed)(()=>t.persistent!==!0)}),d=(0,e.computed)(()=>({opened:i.value})),f=(0,e.computed)(()=>`q-fab z-fab row inline justify-center q-fab--align-${t.verticalActionsAlign} ${s.value}`+(i.value===!0?` q-fab--opened`:` q-fab--closed`)),p=(0,e.computed)(()=>`q-fab__actions flex no-wrap inline q-fab__actions--${t.direction} q-fab__actions--${i.value===!0?`opened`:`closed`}`),m=(0,e.computed)(()=>{let e={id:a.value,role:`menu`};return i.value!==!0&&(e[`aria-hidden`]=`true`),e}),h=(0,e.computed)(()=>`q-fab__icon-holder q-fab__icon-holder--${i.value===!0?`opened`:`closed`}`);function g(r,i){let a=n[r],s=`q-fab__${r} absolute-full`;return a===void 0?(0,e.h)(X,{class:s,name:t[i]||o.iconSet.fab[i]}):(0,e.h)(`div`,{class:s},a(d.value))}function _(){let r=[];return t.hideIcon!==!0&&r.push((0,e.h)(`div`,{class:h.value},[g(`icon`,`icon`),g(`active-icon`,`activeIcon`)])),(t.label!==``||n.label!==void 0)&&r[c.value.action]((0,e.h)(`div`,c.value.data,n.label===void 0?[t.label]:n.label(d.value))),Qe(n.tooltip,r)}return(0,e.provide)(me,{showing:i,onChildClick(e){l(e),e?.qAvoidFocus!==!0&&r.value?.$el.focus()}}),()=>(0,e.h)(`div`,{class:f.value},[(0,e.h)($,{ref:r,class:s.value,...t,noWrap:!0,stack:t.stacked,align:void 0,icon:void 0,label:void 0,noCaps:!0,fab:!0,"aria-expanded":i.value===!0?`true`:`false`,"aria-haspopup":`true`,"aria-controls":a.value,onClick:u},_),(0,e.h)(`div`,{class:p.value,...m.value},Y(n.default))])}});let cc={start:`self-end`,center:`self-center`,end:`self-start`},lc=Object.keys(cc);var uc=h({name:`QFabAction`,props:{...rc,icon:{type:String,default:``},anchor:{type:String,validator:e=>lc.includes(e)},to:[String,Object],replace:Boolean},emits:[`click`],setup(t,{slots:n,emit:r}){let i=(0,e.inject)(me,()=>({showing:{value:!0},onChildClick:y})),{formClass:a,labelProps:o}=ic(t,i.showing),s=(0,e.computed)(()=>{let e=cc[t.anchor];return a.value+(e===void 0?``:` ${e}`)}),c=(0,e.computed)(()=>t.disable===!0||i.showing.value!==!0);function l(e){i.onChildClick(e),r(`click`,e)}function u(){let r=[];return n.icon===void 0?t.icon!==``&&r.push((0,e.h)(X,{name:t.icon})):r.push(n.icon()),(t.label!==``||n.label!==void 0)&&r[o.value.action]((0,e.h)(`div`,o.value.data,n.label===void 0?[t.label]:n.label())),Qe(n.default,r)}let d=(0,e.getCurrentInstance)();return Object.assign(d.proxy,{click:l}),()=>(0,e.h)($,{class:s.value,...t,noWrap:!0,stack:t.stacked,icon:void 0,label:void 0,noCaps:!0,fabMini:!0,disable:c.value,onClick:l},u)}});function dc({validate:t,resetValidation:n,requiresQForm:r}){let i=(0,e.inject)(he,!1);if(i!==!1){let{props:r,proxy:a}=(0,e.getCurrentInstance)();Object.assign(a,{validate:t,resetValidation:n}),(0,e.watch)(()=>r.disable,e=>{e===!0?(typeof n==`function`&&n(),i.unbindComponent(a)):i.bindComponent(a)}),(0,e.onMounted)(()=>{r.disable!==!0&&i.bindComponent(a)}),(0,e.onBeforeUnmount)(()=>{r.disable!==!0&&i.unbindComponent(a)})}else r===!0&&console.error(`Parent QForm not found on useFormChild()!`)}let fc=[!0,!1,`ondemand`],pc={modelValue:{},error:{type:Boolean,default:null},errorMessage:String,noErrorIcon:Boolean,rules:Array,reactiveRules:Boolean,lazyRules:{type:[Boolean,String],default:!1,validator:e=>fc.includes(e)}};function mc(t,n){let{props:i,proxy:a}=(0,e.getCurrentInstance)(),o=(0,e.ref)(!1),s=(0,e.ref)(null),c=(0,e.ref)(!1);dc({validate:_,resetValidation:g});let l=0,u,d=(0,e.computed)(()=>i.rules!==void 0&&i.rules!==null&&i.rules.length!==0),f=(0,e.computed)(()=>i.disable!==!0&&d.value===!0&&n.value===!1),p=(0,e.computed)(()=>i.error===!0||o.value===!0),m=(0,e.computed)(()=>typeof i.errorMessage==`string`&&i.errorMessage.length!==0?i.errorMessage:s.value);(0,e.watch)(()=>i.modelValue,()=>{c.value=!0,f.value===!0&&i.lazyRules===!1&&v()});function h(){i.lazyRules!==`ondemand`&&f.value===!0&&c.value===!0&&v()}(0,e.watch)(()=>i.reactiveRules,t=>{t===!0?u===void 0&&(u=(0,e.watch)(()=>i.rules,h,{immediate:!0,deep:!0})):u!==void 0&&(u(),u=void 0)},{immediate:!0}),(0,e.watch)(()=>i.lazyRules,h),(0,e.watch)(t,e=>{e===!0?c.value=!0:f.value===!0&&i.lazyRules!==`ondemand`&&v()});function g(){l++,n.value=!1,c.value=!1,o.value=!1,s.value=null,v.cancel()}function _(e=i.modelValue){if(i.disable===!0||d.value===!1)return!0;let t=++l,r=n.value===!0?()=>{}:()=>{c.value=!0},a=(e,t)=>{e===!0&&r(),o.value=e,s.value=t||null,n.value=!1},u=[];for(let t=0;t{if(e===void 0||Array.isArray(e)===!1||e.length===0)return t===l&&a(!1),!0;let n=e.find(e=>e===!1||typeof e==`string`);return t===l&&a(n!==void 0,n),n===void 0},e=>(t===l&&(console.error(e),a(!0)),!1)))}let v=N(_,0);return(0,e.onBeforeUnmount)(()=>{u?.(),v.cancel()}),Object.assign(a,{resetValidation:g,validate:_}),r(a,`hasError`,()=>p.value),{isDirtyModel:c,hasRules:d,hasError:p,errorMessage:m,validate:_,resetValidation:g}}function hc(e){return e!=null&&String(e).length!==0}let gc={...Z,...pc,label:String,stackLabel:Boolean,hint:String,hideHint:Boolean,prefix:String,suffix:String,labelColor:String,color:String,bgColor:String,filled:Boolean,outlined:Boolean,borderless:Boolean,standout:[Boolean,String],square:Boolean,loading:Boolean,labelSlot:Boolean,bottomSlots:Boolean,hideBottomSpace:Boolean,rounded:Boolean,dense:Boolean,itemAligned:Boolean,counter:Boolean,clearable:Boolean,clearIcon:String,disable:Boolean,readonly:Boolean,autofocus:Boolean,for:String},_c={...gc,maxlength:[Number,String]},vc=[`update:modelValue`,`clear`,`focus`,`blur`];function yc({requiredForAttr:t=!0,tagProp:n,changeEvent:r=!1}={}){let{props:i,proxy:a}=(0,e.getCurrentInstance)(),o=Q(i,a.$q),s=ti({required:t,getValue:()=>i.for});return{requiredForAttr:t,changeEvent:r,tag:n===!0?(0,e.computed)(()=>i.tag):{value:`label`},isDark:o,editable:(0,e.computed)(()=>i.disable!==!0&&i.readonly!==!0),innerLoading:(0,e.ref)(!1),focused:(0,e.ref)(!1),hasPopupOpen:!1,splitAttrs:Vs(),targetUid:s,rootRef:(0,e.ref)(null),targetRef:(0,e.ref)(null),controlRef:(0,e.ref)(null)}}function bc(t){let{props:n,emit:r,slots:i,attrs:a,proxy:o}=(0,e.getCurrentInstance)(),{$q:s}=o,c=null;t.hasValue===void 0&&(t.hasValue=(0,e.computed)(()=>hc(n.modelValue))),t.emitValue===void 0&&(t.emitValue=e=>{r(`update:modelValue`,e)}),t.controlEvents===void 0&&(t.controlEvents={onFocusin:E,onFocusout:k}),Object.assign(t,{clearValue:A,onControlFocusin:E,onControlFocusout:k,focus:w}),t.computedCounter===void 0&&(t.computedCounter=(0,e.computed)(()=>{if(n.counter!==!1){let e=typeof n.modelValue==`string`||typeof n.modelValue==`number`?String(n.modelValue).length:Array.isArray(n.modelValue)===!0?n.modelValue.length:0,t=n.maxlength===void 0?n.maxValues:n.maxlength;return e+(t===void 0?``:` / `+t)}}));let{isDirtyModel:l,hasRules:u,hasError:d,errorMessage:f,resetValidation:p}=mc(t.focused,t.innerLoading),m=t.floatingLabel===void 0?(0,e.computed)(()=>n.stackLabel===!0||t.focused.value===!0||t.hasValue.value===!0):(0,e.computed)(()=>n.stackLabel===!0||t.focused.value===!0||t.floatingLabel.value===!0),h=(0,e.computed)(()=>n.bottomSlots===!0||n.hint!==void 0||u.value===!0||n.counter===!0||n.error!==null),g=(0,e.computed)(()=>n.filled===!0?`filled`:n.outlined===!0?`outlined`:n.borderless===!0?`borderless`:n.standout?`standout`:`standard`),_=(0,e.computed)(()=>`q-field row no-wrap items-start q-field--${g.value}`+(t.fieldClass===void 0?``:` ${t.fieldClass.value}`)+(n.rounded===!0?` q-field--rounded`:``)+(n.square===!0?` q-field--square`:``)+(m.value===!0?` q-field--float`:``)+(y.value===!0?` q-field--labeled`:``)+(n.dense===!0?` q-field--dense`:``)+(n.itemAligned===!0?` q-field--item-aligned q-item-type`:``)+(t.isDark.value===!0?` q-field--dark`:``)+(t.getControl===void 0?` q-field--auto-height`:``)+(t.focused.value===!0?` q-field--focused`:``)+(d.value===!0?` q-field--error`:``)+(d.value===!0||t.focused.value===!0?` q-field--highlighted`:``)+(n.hideBottomSpace!==!0&&h.value===!0?` q-field--with-bottom`:``)+(n.disable===!0?` q-field--disabled`:n.readonly===!0?` q-field--readonly`:``)),v=(0,e.computed)(()=>`q-field__control relative-position row no-wrap`+(n.bgColor===void 0?``:` bg-${n.bgColor}`)+(d.value===!0?` text-negative`:typeof n.standout==`string`&&n.standout.length!==0&&t.focused.value===!0?` ${n.standout}`:n.color===void 0?``:` text-${n.color}`)),y=(0,e.computed)(()=>n.labelSlot===!0||n.label!==void 0),b=(0,e.computed)(()=>`q-field__label no-pointer-events absolute ellipsis`+(n.labelColor!==void 0&&d.value!==!0?` text-${n.labelColor}`:``)),x=(0,e.computed)(()=>({id:t.targetUid.value,editable:t.editable.value,focused:t.focused.value,floatingLabel:m.value,modelValue:n.modelValue,emitValue:t.emitValue})),S=(0,e.computed)(()=>{let e={};return t.targetUid.value&&(e.for=t.targetUid.value),n.disable===!0&&(e[`aria-disabled`]=`true`),e});function C(){let e=document.activeElement,n=t.targetRef?.value;n&&(e===null||e.id!==t.targetUid.value)&&(n.hasAttribute(`tabindex`)!==!0&&(n=n.querySelector(`[tabindex]`)),n!==e&&n?.focus({preventScroll:!0}))}function w(){Nn(C)}function T(){Pn(C);let e=document.activeElement;e!==null&&t.rootRef.value.contains(e)&&e.blur()}function E(e){c!==null&&(clearTimeout(c),c=null),t.editable.value===!0&&t.focused.value===!1&&(t.focused.value=!0,r(`focus`,e))}function k(e,n){c!==null&&clearTimeout(c),c=setTimeout(()=>{c=null,!(document.hasFocus()===!0&&(t.hasPopupOpen===!0||t.controlRef===void 0||t.controlRef.value===null||t.controlRef.value.contains(document.activeElement)!==!1))&&(t.focused.value===!0&&(t.focused.value=!1,r(`blur`,e)),n?.())})}function A(i){O(i),s.platform.is.mobile===!0?t.rootRef.value.contains(document.activeElement)===!0&&document.activeElement.blur():(t.targetRef?.value||t.rootRef.value).focus(),n.type===`file`&&(t.inputRef.value.value=null),r(`update:modelValue`,null),t.changeEvent===!0&&r(`change`,null),r(`clear`,n.modelValue),(0,e.nextTick)(()=>{let e=l.value;p(),l.value=e})}function j(e){[13,32].includes(e.keyCode)&&A(e)}function M(){let r=[];return i.prepend!==void 0&&r.push((0,e.h)(`div`,{class:`q-field__prepend q-field__marginal row no-wrap items-center`,key:`prepend`,onClick:D},i.prepend())),r.push((0,e.h)(`div`,{class:`q-field__control-container col relative-position row no-wrap q-anchor--skip`},N())),d.value===!0&&n.noErrorIcon===!1&&r.push(F(`error`,[(0,e.h)(X,{name:s.iconSet.field.error,color:`negative`})])),n.loading===!0||t.innerLoading.value===!0?r.push(F(`inner-loading-append`,i.loading===void 0?[(0,e.h)(Ut,{color:n.color})]:i.loading())):n.clearable===!0&&t.hasValue.value===!0&&t.editable.value===!0&&r.push(F(`inner-clearable-append`,[(0,e.h)(X,{class:`q-field__focusable-action`,name:n.clearIcon||s.iconSet.field.clear,tabindex:0,role:`button`,"aria-hidden":`false`,"aria-label":s.lang.label.clear,onKeyup:j,onClick:A})])),i.append!==void 0&&r.push((0,e.h)(`div`,{class:`q-field__append q-field__marginal row no-wrap items-center`,key:`append`,onClick:D},i.append())),t.getInnerAppend!==void 0&&r.push(F(`inner-append`,t.getInnerAppend())),t.getControlChild!==void 0&&r.push(t.getControlChild()),r}function N(){let r=[];return n.prefix!==void 0&&n.prefix!==null&&r.push((0,e.h)(`div`,{class:`q-field__prefix no-pointer-events row items-center`},n.prefix)),t.getShadowControl!==void 0&&t.hasShadow.value===!0&&r.push(t.getShadowControl()),y.value===!0&&r.push((0,e.h)(`div`,{class:b.value},Y(i.label,n.label))),t.getControl===void 0?i.rawControl===void 0?i.control!==void 0&&r.push((0,e.h)(`div`,{ref:t.targetRef,class:`q-field__native row`,tabindex:-1,...t.splitAttrs.attributes.value,"data-autofocus":n.autofocus===!0||void 0},i.control(x.value))):r.push(i.rawControl()):r.push(t.getControl()),n.suffix!==void 0&&n.suffix!==null&&r.push((0,e.h)(`div`,{class:`q-field__suffix no-pointer-events row items-center`},n.suffix)),r.concat(Y(i.default))}function P(){let r,a;d.value===!0?f.value===null?(r=Y(i.error),a=`q--slot-error`):(r=[(0,e.h)(`div`,{role:`alert`},f.value)],a=`q--slot-error-${f.value}`):(n.hideHint!==!0||t.focused.value===!0)&&(n.hint===void 0?(r=Y(i.hint),a=`q--slot-hint`):(r=[(0,e.h)(`div`,n.hint)],a=`q--slot-hint-${n.hint}`));let o=n.counter===!0||i.counter!==void 0;if(n.hideBottomSpace===!0&&o===!1&&r===void 0)return;let s=(0,e.h)(`div`,{key:a,class:`q-field__messages col`},r);return(0,e.h)(`div`,{class:`q-field__bottom row items-start q-field__bottom--`+(n.hideBottomSpace===!0?`stale`:`animated`),onClick:D},[n.hideBottomSpace===!0?s:(0,e.h)(e.Transition,{name:`q-transition--field-message`},()=>s),o===!0?(0,e.h)(`div`,{class:`q-field__counter`},i.counter===void 0?t.computedCounter.value:i.counter()):null])}function F(t,n){return n===null?null:(0,e.h)(`div`,{key:t,class:`q-field__append q-field__marginal row no-wrap items-center q-anchor--skip`},n)}let I=!1;return(0,e.onDeactivated)(()=>{I=!0}),(0,e.onActivated)(()=>{I===!0&&n.autofocus===!0&&o.focus()}),n.autofocus===!0&&(0,e.onMounted)(()=>{o.focus()}),(0,e.onBeforeUnmount)(()=>{c!==null&&clearTimeout(c)}),Object.assign(o,{focus:w,blur:T}),function(){let r=t.getControl===void 0&&i.control===void 0?{...t.splitAttrs.attributes.value,"data-autofocus":n.autofocus===!0||void 0,...S.value}:S.value;return(0,e.h)(t.tag.value,{ref:t.rootRef,class:[_.value,a.class],style:a.style,...r},[i.before===void 0?null:(0,e.h)(`div`,{class:`q-field__before q-field__marginal row no-wrap items-center`,onClick:D},i.before()),(0,e.h)(`div`,{class:`q-field__inner relative-position col self-stretch`},[(0,e.h)(`div`,{ref:t.controlRef,class:v.value,tabindex:-1,...t.controlEvents},M()),h.value===!0?P():null]),i.after===void 0?null:(0,e.h)(`div`,{class:`q-field__after q-field__marginal row no-wrap items-center`,onClick:D},i.after())])}}var xc=h({name:`QField`,inheritAttrs:!1,props:{..._c,tag:{type:String,default:`label`}},emits:vc,setup(){return bc(yc({tagProp:!0}))}});function Sc(e,t,n,r){let i=[];return e.forEach(e=>{r(e)===!0?i.push(e):t.push({failedPropValidation:n,file:e})}),i}function Cc(e){e?.dataTransfer&&(e.dataTransfer.dropEffect=`copy`),O(e)}let wc={multiple:Boolean,accept:String,capture:String,maxFileSize:[Number,String],maxTotalSize:[Number,String],maxFiles:[Number,String],filter:Function},Tc=[`rejected`];function Ec({editable:t,dnd:n,getFileInput:r,addFilesToQueue:i}){let{props:a,emit:o,proxy:s}=(0,e.getCurrentInstance)(),c=(0,e.ref)(null),l=(0,e.computed)(()=>a.accept===void 0?null:a.accept.split(`,`).map(e=>(e=e.trim(),e===`*`?`*/`:(e.endsWith(`/*`)&&(e=e.slice(0,e.length-1)),e.toUpperCase())))),u=(0,e.computed)(()=>parseInt(a.maxFiles,10)),d=(0,e.computed)(()=>parseInt(a.maxTotalSize,10));function f(e){if(t.value)if(e!==Object(e)&&(e={target:null}),e.target?.matches(`input[type="file"]`)===!0)e.clientX===0&&e.clientY===0&&E(e);else{let t=r();t!==e.target&&t?.click(e)}}function m(e){t.value&&e&&i(null,e)}function h(e,t,n,r){let i=Array.from(t||e.target.files),s=[],c=()=>{s.length!==0&&o(`rejected`,s)};if(a.accept!==void 0&&l.value.indexOf(`*/`)===-1&&(i=Sc(i,s,`accept`,e=>l.value.some(t=>e.type.toUpperCase().startsWith(t)||e.name.toUpperCase().endsWith(t))),i.length===0))return c();if(a.maxFileSize!==void 0){let e=parseInt(a.maxFileSize,10);if(i=Sc(i,s,`max-file-size`,t=>t.size<=e),i.length===0)return c()}if(a.multiple!==!0&&i.length!==0&&(i=[i[0]]),i.forEach(e=>{e.__key=e.webkitRelativePath+e.lastModified+e.name+e.size}),r===!0){let e=n.map(e=>e.__key);i=Sc(i,s,`duplicate`,t=>e.includes(t.__key)===!1)}if(i.length===0)return c();if(a.maxTotalSize!==void 0){let e=r===!0?n.reduce((e,t)=>e+t.size,0):0;if(i=Sc(i,s,`max-total-size`,t=>(e+=t.size,e<=d.value)),i.length===0)return c()}if(typeof a.filter==`function`){let e=a.filter(i);i=Sc(i,s,`filter`,t=>e.includes(t))}if(a.maxFiles!==void 0){let e=r===!0?n.length:0;if(i=Sc(i,s,`max-files`,()=>(e++,e<=u.value)),i.length===0)return c()}if(c(),i.length!==0)return i}function g(e){Cc(e),n.value!==!0&&(n.value=!0)}function _(e){O(e),(e.relatedTarget!==null||p.is.safari!==!0?e.relatedTarget!==c.value:document.elementsFromPoint(e.clientX,e.clientY).includes(c.value)===!1)&&(n.value=!1)}function v(e){Cc(e);let t=e.dataTransfer.files;t.length!==0&&i(null,t),n.value=!1}function y(t){if(n.value===!0)return(0,e.h)(`div`,{ref:c,class:`q-${t}__dnd absolute-full`,onDragenter:Cc,onDragover:Cc,onDragleave:_,onDrop:v})}return Object.assign(s,{pickFiles:f,addFiles:m}),{pickFiles:f,addFiles:m,onDragover:g,onDragleave:_,processFiles:h,getDndNode:y,maxFilesNumber:u,maxTotalSizeNumber:d}}function Dc(t,n){function r(){let e=t.modelValue;try{let t=`DataTransfer`in window?new DataTransfer:`ClipboardEvent`in window?new ClipboardEvent(``).clipboardData:void 0;return Object(e)===e&&(`length`in e?Array.from(e):[e]).forEach(e=>{t.items.add(e)}),{files:t.files}}catch{return{files:void 0}}}return n===!0?(0,e.computed)(()=>{if(t.type===`file`)return r()}):(0,e.computed)(r)}var Oc=h({name:`QFile`,inheritAttrs:!1,props:{...gc,...ai,...wc,modelValue:[File,FileList,Array],append:Boolean,useChips:Boolean,displayValue:[String,Number],tabindex:{type:[String,Number],default:0},counterLabel:Function,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...vc,...Tc],setup(t,{slots:n,emit:i,attrs:a}){let{proxy:o}=(0,e.getCurrentInstance)(),s=yc(),c=(0,e.ref)(null),l=(0,e.ref)(!1),u=ci(t),{pickFiles:d,onDragover:f,onDragleave:p,processFiles:m,getDndNode:h}=Ec({editable:s.editable,dnd:l,getFileInput:j,addFilesToQueue:M}),g=Dc(t),_=(0,e.computed)(()=>Object(t.modelValue)===t.modelValue?`length`in t.modelValue?Array.from(t.modelValue):[t.modelValue]:[]),v=(0,e.computed)(()=>hc(_.value)),y=(0,e.computed)(()=>_.value.map(e=>e.name).join(`, `)),b=(0,e.computed)(()=>Ne(_.value.reduce((e,t)=>e+t.size,0))),x=(0,e.computed)(()=>({totalSize:b.value,filesNumber:_.value.length,maxFiles:t.maxFiles})),S=(0,e.computed)(()=>({tabindex:-1,type:`file`,title:``,accept:t.accept,capture:t.capture,name:u.value,...a,id:s.targetUid.value,disabled:s.editable.value!==!0})),C=(0,e.computed)(()=>`q-file q-field--auto-height`+(l.value===!0?` q-file--dnd`:``)),w=(0,e.computed)(()=>t.multiple===!0&&t.append===!0);function T(e){let t=_.value.slice();t.splice(e,1),O(t)}function E(e){let t=_.value.indexOf(e);t!==-1&&T(t)}function O(e){i(`update:modelValue`,t.multiple===!0?e:e[0])}function k(e){e.keyCode===13&&D(e)}function A(e){(e.keyCode===13||e.keyCode===32)&&d(e)}function j(){return c.value}function M(e,n){let r=m(e,n,_.value,w.value),i=j();i!=null&&(i.value=``),r!==void 0&&((t.multiple===!0?t.modelValue&&r.every(e=>_.value.includes(e)):t.modelValue===r[0])||O(w.value===!0?_.value.concat(r):r))}function N(){return[(0,e.h)(`input`,{class:[t.inputClass,`q-file__filler`],style:t.inputStyle})]}function P(){if(n.file!==void 0)return _.value.length===0?N():_.value.map((e,t)=>n.file({index:t,file:e,ref:this}));if(n.selected!==void 0)return _.value.length===0?N():n.selected({files:_.value,ref:this});if(t.useChips===!0)return _.value.length===0?N():_.value.map((n,r)=>(0,e.h)(Wi,{key:`file-`+r,removable:s.editable.value,dense:!0,textColor:t.color,tabindex:t.tabindex,onRemove:()=>{T(r)}},()=>(0,e.h)(`span`,{class:`ellipsis`,textContent:n.name})));let r=t.displayValue===void 0?y.value:t.displayValue;return r.length===0?N():[(0,e.h)(`div`,{class:t.inputClass,style:t.inputStyle,textContent:r})]}function F(){let n={ref:c,...S.value,...g.value,class:`q-field__input fit absolute-full cursor-pointer`,onChange:M};return t.multiple===!0&&(n.multiple=!0),(0,e.h)(`input`,n)}return Object.assign(s,{fieldClass:C,emitValue:O,hasValue:v,inputRef:c,innerValue:_,floatingLabel:(0,e.computed)(()=>v.value===!0||hc(t.displayValue)),computedCounter:(0,e.computed)(()=>{if(t.counterLabel!==void 0)return t.counterLabel(x.value);let e=t.maxFiles;return`${_.value.length}${e===void 0?``:` / `+e} (${b.value})`}),getControlChild:()=>h(`file`),getControl:()=>{let n={ref:s.targetRef,class:`q-field__native row items-center cursor-pointer`,tabindex:t.tabindex};return s.editable.value===!0&&Object.assign(n,{onDragover:f,onDragleave:p,onKeydown:k,onKeyup:A}),(0,e.h)(`div`,n,[F()].concat(P()))}}),Object.assign(o,{removeAtIndex:T,removeFile:E,getNativeElement:()=>c.value}),r(o,`nativeEl`,()=>c.value),bc(s)}}),kc=h({name:`QFooter`,props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:[`reveal`,`focusin`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=(0,e.inject)(pe,q);if(o===q)return console.error(`QFooter needs to be child of QLayout`),q;let s=(0,e.ref)(parseInt(t.heightHint,10)),c=(0,e.ref)(!0),l=(0,e.ref)(a.value===!0||o.isContainer.value===!0?0:window.innerHeight),u=(0,e.computed)(()=>t.reveal===!0||o.view.value.indexOf(`F`)!==-1||i.platform.is.ios&&o.isContainer.value===!0),d=(0,e.computed)(()=>o.isContainer.value===!0?o.containerHeight.value:l.value),f=(0,e.computed)(()=>{if(t.modelValue!==!0)return 0;if(u.value===!0)return c.value===!0?s.value:0;let e=o.scroll.value.position+d.value+s.value-o.height.value;return e>0?e:0}),p=(0,e.computed)(()=>t.modelValue!==!0||u.value===!0&&c.value!==!0),m=(0,e.computed)(()=>t.modelValue===!0&&p.value===!0&&t.reveal===!0),h=(0,e.computed)(()=>`q-footer q-layout__section--marginal `+(u.value===!0?`fixed`:`absolute`)+`-bottom`+(t.bordered===!0?` q-footer--bordered`:``)+(p.value===!0?` q-footer--hidden`:``)+(t.modelValue===!0?``:` q-layout--prevent-focus`+(u.value===!0?``:` hidden`))),g=(0,e.computed)(()=>{let e=o.rows.value.bottom,t={};return e[0]===`l`&&o.left.space===!0&&(t[i.lang.rtl===!0?`right`:`left`]=`${o.left.size}px`),e[2]===`r`&&o.right.space===!0&&(t[i.lang.rtl===!0?`left`:`right`]=`${o.right.size}px`),t});function _(e,t){o.update(`footer`,e,t)}function v(e,t){e.value!==t&&(e.value=t)}function y({height:e}){v(s,e),_(`size`,e)}function b(){if(t.reveal!==!0)return;let{direction:e,position:n,inflectionPoint:r}=o.scroll.value;v(c,e===`up`||n-r<100||o.height.value-d.value-n-s.value<300)}function x(e){m.value===!0&&v(c,!0),r(`focusin`,e)}(0,e.watch)(()=>t.modelValue,e=>{_(`space`,e),v(c,!0),o.animate()}),(0,e.watch)(f,e=>{_(`offset`,e)}),(0,e.watch)(()=>t.reveal,e=>{e===!1&&v(c,t.modelValue)}),(0,e.watch)(c,e=>{o.animate(),r(`reveal`,e)}),(0,e.watch)([s,o.scroll,o.height],b),(0,e.watch)(()=>i.screen.height,e=>{o.isContainer.value!==!0&&v(l,e)});let S={};return o.instances.footer=S,t.modelValue===!0&&_(`size`,s.value),_(`space`,t.modelValue),_(`offset`,f.value),(0,e.onBeforeUnmount)(()=>{o.instances.footer===S&&(o.instances.footer=void 0,_(`size`,0),_(`offset`,0),_(`space`,!1))}),()=>{let r=Qe(n.default,[(0,e.h)(la,{debounce:0,onResize:y})]);return t.elevated===!0&&r.push((0,e.h)(`div`,{class:`q-layout__shadow absolute-full overflow-hidden no-pointer-events`})),(0,e.h)(`footer`,{class:h.value,style:g.value,onFocusin:x},r)}}}),Ac=h({name:`QForm`,props:{autofocus:Boolean,noErrorFocus:Boolean,noResetFocus:Boolean,greedy:Boolean,onSubmit:Function},emits:[`reset`,`validationSuccess`,`validationError`],setup(t,{slots:n,emit:r}){let i=(0,e.getCurrentInstance)(),a=(0,e.ref)(null),o=0,s=[];function c(e){let n=typeof e==`boolean`?e:t.noErrorFocus!==!0,i=++o,a=(e,t)=>{r(`validation${e===!0?`Success`:`Error`}`,t)},c=e=>{let t=e.validate();return typeof t.then==`function`?t.then(t=>({valid:t,comp:e}),t=>({valid:!1,comp:e,err:t})):Promise.resolve({valid:t,comp:e})};return(t.greedy===!0?Promise.all(s.map(c)).then(e=>e.filter(e=>e.valid!==!0)):s.reduce((e,t)=>e.then(()=>c(t).then(e=>{if(e.valid===!1)return Promise.reject(e)})),Promise.resolve()).catch(e=>[e])).then(e=>{if(e===void 0||e.length===0)return i===o&&a(!0),!0;if(i===o){let{comp:t,err:r}=e[0];if(r!==void 0&&console.error(r),a(!1,t),n===!0){let t=e.find(({comp:e})=>typeof e.focus==`function`&&Ot(e.$)===!1);t!==void 0&&t.comp.focus()}}return!1})}function l(){o++,s.forEach(e=>{typeof e.resetValidation==`function`&&e.resetValidation()})}function u(e){e!==void 0&&O(e);let n=o+1;c().then(i=>{n===o&&i===!0&&(t.onSubmit===void 0?e?.target!==void 0&&typeof e.target.submit==`function`&&e.target.submit():r(`submit`,e))})}function d(n){n!==void 0&&O(n),r(`reset`),(0,e.nextTick)(()=>{l(),t.autofocus===!0&&t.noResetFocus!==!0&&f()})}function f(){Nn(()=>{a.value!==null&&(a.value.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||a.value.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||a.value.querySelector(`[autofocus], [data-autofocus]`)||Array.prototype.find.call(a.value.querySelectorAll(`[tabindex]`),e=>e.tabIndex!==-1))?.focus({preventScroll:!0})})}(0,e.provide)(he,{bindComponent(e){s.push(e)},unbindComponent(e){let t=s.indexOf(e);t!==-1&&s.splice(t,1)}});let p=!1;return(0,e.onDeactivated)(()=>{p=!0}),(0,e.onActivated)(()=>{p===!0&&t.autofocus===!0&&f()}),(0,e.onMounted)(()=>{t.autofocus===!0&&f()}),Object.assign(i.proxy,{validate:c,resetValidation:l,submit:u,reset:d,focus:f,getValidationComponents:()=>s}),()=>(0,e.h)(`form`,{class:`q-form`,ref:a,onSubmit:u,onReset:d},Y(n.default))}}),jc={inject:{[he]:{default:y}},watch:{disable(e){let t=this.$.provides[he];t!==void 0&&(e===!0?(this.resetValidation(),t.unbindComponent(this)):t.bindComponent(this))}},methods:{validate(){},resetValidation(){}},mounted(){this.disable!==!0&&this.$.provides[he]?.bindComponent(this)},beforeUnmount(){this.disable!==!0&&this.$.provides[he]?.unbindComponent(this)}},Mc=h({name:`QHeader`,props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,revealOffset:{type:Number,default:250},bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:[`reveal`,`focusin`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=(0,e.inject)(pe,q);if(a===q)return console.error(`QHeader needs to be child of QLayout`),q;let o=(0,e.ref)(parseInt(t.heightHint,10)),s=(0,e.ref)(!0),c=(0,e.computed)(()=>t.reveal===!0||a.view.value.indexOf(`H`)!==-1||i.platform.is.ios&&a.isContainer.value===!0),l=(0,e.computed)(()=>{if(t.modelValue!==!0)return 0;if(c.value===!0)return s.value===!0?o.value:0;let e=o.value-a.scroll.value.position;return e>0?e:0}),u=(0,e.computed)(()=>t.modelValue!==!0||c.value===!0&&s.value!==!0),d=(0,e.computed)(()=>t.modelValue===!0&&u.value===!0&&t.reveal===!0),f=(0,e.computed)(()=>`q-header q-layout__section--marginal `+(c.value===!0?`fixed`:`absolute`)+`-top`+(t.bordered===!0?` q-header--bordered`:``)+(u.value===!0?` q-header--hidden`:``)+(t.modelValue===!0?``:` q-layout--prevent-focus`)),p=(0,e.computed)(()=>{let e=a.rows.value.top,t={};return e[0]===`l`&&a.left.space===!0&&(t[i.lang.rtl===!0?`right`:`left`]=`${a.left.size}px`),e[2]===`r`&&a.right.space===!0&&(t[i.lang.rtl===!0?`left`:`right`]=`${a.right.size}px`),t});function m(e,t){a.update(`header`,e,t)}function h(e,t){e.value!==t&&(e.value=t)}function g({height:e}){h(o,e),m(`size`,e)}function _(e){d.value===!0&&h(s,!0),r(`focusin`,e)}(0,e.watch)(()=>t.modelValue,e=>{m(`space`,e),h(s,!0),a.animate()}),(0,e.watch)(l,e=>{m(`offset`,e)}),(0,e.watch)(()=>t.reveal,e=>{e===!1&&h(s,t.modelValue)}),(0,e.watch)(s,e=>{a.animate(),r(`reveal`,e)}),(0,e.watch)(a.scroll,e=>{t.reveal===!0&&h(s,e.direction===`up`||e.position<=t.revealOffset||e.position-e.inflectionPoint<100)});let v={};return a.instances.header=v,t.modelValue===!0&&m(`size`,o.value),m(`space`,t.modelValue),m(`offset`,l.value),(0,e.onBeforeUnmount)(()=>{a.instances.header===v&&(a.instances.header=void 0,m(`size`,0),m(`offset`,0),m(`space`,!1))}),()=>{let r=Ze(n.default,[]);return t.elevated===!0&&r.push((0,e.h)(`div`,{class:`q-layout__shadow absolute-full overflow-hidden no-pointer-events`})),r.push((0,e.h)(la,{debounce:0,onResize:g})),(0,e.h)(`header`,{class:f.value,style:p.value,onFocusin:_},r)}}});let Nc={ratio:[String,Number]};function Pc(t,n){return(0,e.computed)(()=>{let e=Number(t.ratio||(n===void 0?void 0:n.value));return isNaN(e)!==!0&&e>0?{paddingBottom:`${100/e}%`}:null})}var Fc=h({name:`QImg`,props:{...Nc,src:String,srcset:String,sizes:String,alt:String,crossorigin:String,decoding:String,referrerpolicy:String,draggable:Boolean,loading:{type:String,default:`lazy`},loadingShowDelay:{type:[Number,String],default:0},fetchpriority:{type:String,default:`auto`},width:String,height:String,initialRatio:{type:[Number,String],default:1.7778},placeholderSrc:String,errorSrc:String,fit:{type:String,default:`cover`},position:{type:String,default:`50% 50%`},imgClass:String,imgStyle:Object,noSpinner:Boolean,noNativeMenu:Boolean,noTransition:Boolean,spinnerColor:String,spinnerSize:String},emits:[`load`,`error`],setup(t,{slots:n,emit:r}){let i=(0,e.ref)(t.initialRatio),o=Pc(t,i),s=(0,e.getCurrentInstance)(),{registerTimeout:c,removeTimeout:l}=Qn(),{registerTimeout:u,removeTimeout:d}=Qn(),f=(0,e.computed)(()=>t.placeholderSrc===void 0?null:{src:t.placeholderSrc}),p=(0,e.computed)(()=>t.errorSrc===void 0?null:{src:t.errorSrc,__qerror:!0}),m=[(0,e.ref)(null),(0,e.ref)(f.value)],h=(0,e.ref)(0),g=(0,e.ref)(!1),_=(0,e.ref)(!1),v=(0,e.computed)(()=>`q-img q-img--${t.noNativeMenu===!0?`no-`:``}menu`),y=(0,e.computed)(()=>({width:t.width,height:t.height})),b=(0,e.computed)(()=>`q-img__image ${t.imgClass===void 0?``:t.imgClass+` `}q-img__image--with${t.noTransition===!0?`out`:``}-transition q-img__image--`),x=(0,e.computed)(()=>({...t.imgStyle,objectFit:t.fit,objectPosition:t.position}));function S(){if(d(),t.loadingShowDelay===0){g.value=!0;return}u(()=>{g.value=!0},t.loadingShowDelay)}function C(){d(),g.value=!1}function w({target:e}){Ot(s)===!1&&(l(),i.value=e.naturalHeight===0?.5:e.naturalWidth/e.naturalHeight,T(e,1))}function T(e,t){t===1e3||Ot(s)===!0||(e.complete===!0?E(e):c(()=>{T(e,t+1)},50))}function E(e){Ot(s)!==!0&&(h.value^=1,m[h.value].value=null,C(),e.getAttribute(`__qerror`)!==`true`&&(_.value=!1),r(`load`,e.currentSrc||e.src))}function D(e){l(),C(),_.value=!0,m[h.value].value=p.value,m[h.value^1].value=f.value,r(`error`,e)}function O(n){let r=m[n].value,i={key:`img_`+n,class:b.value,style:x.value,alt:t.alt,crossorigin:t.crossorigin,decoding:t.decoding,referrerpolicy:t.referrerpolicy,height:t.height,width:t.width,loading:t.loading,fetchpriority:t.fetchpriority,"aria-hidden":`true`,draggable:t.draggable,...r};return h.value===n?Object.assign(i,{class:i.class+`current`,onLoad:w,onError:D}):i.class+=`loaded`,(0,e.h)(`div`,{class:`q-img__container absolute-full`,key:`img`+n},(0,e.h)(`img`,i))}function k(){return g.value===!1?(0,e.h)(`div`,{key:`content`,class:`q-img__content absolute-full q-anchor--skip`},Y(n[_.value===!0?`error`:`default`])):(0,e.h)(`div`,{key:`loading`,class:`q-img__loading absolute-full flex flex-center`},n.loading===void 0?t.noSpinner===!0?void 0:[(0,e.h)(Ut,{color:t.spinnerColor,size:t.spinnerSize})]:n.loading())}{function A(){(0,e.watch)(()=>t.src||t.srcset||t.sizes?{src:t.src,srcset:t.srcset,sizes:t.sizes}:null,e=>{l(),_.value=!1,e===null?(C(),m[h.value^1].value=f.value):S(),m[h.value].value=e},{immediate:!0})}a.value===!0?(0,e.onMounted)(A):A()}return()=>{let n=[];return o.value!==null&&n.push((0,e.h)(`div`,{key:`filler`,style:o.value})),m[0].value!==null&&n.push(O(0)),m[1].value!==null&&n.push(O(1)),n.push((0,e.h)(e.Transition,{name:`q-transition--fade`},k)),(0,e.h)(`div`,{key:`main`,class:v.value,style:y.value,role:`img`,"aria-label":t.alt},n)}}});let{passive:Ic}=v;var Lc=h({name:`QInfiniteScroll`,props:{offset:{type:Number,default:500},debounce:{type:[String,Number],default:100},scrollTarget:$n,initialIndex:{type:Number,default:0},disable:Boolean,reverse:Boolean},emits:[`load`],setup(t,{slots:n,emit:r}){let i=(0,e.ref)(!1),a=(0,e.ref)(!0),o=(0,e.ref)(null),s=(0,e.ref)(null),c=t.initialIndex,l,u,d=(0,e.computed)(()=>`q-infinite-scroll__loading`+(i.value===!0?``:` invisible`));function f(){if(t.disable===!0||i.value===!0||a.value===!1)return;let e=nr(l),n=ir(l),r=Kt(l);t.reverse===!1?Math.round(n+r+t.offset)>=Math.round(e)&&p():Math.round(n)<=t.offset&&p()}function p(){if(t.disable===!0||i.value===!0||a.value===!1)return;c++,i.value=!0;let n=nr(l);r(`load`,c,r=>{a.value===!0&&(i.value=!1,(0,e.nextTick)(()=>{if(t.reverse===!0){let e=nr(l),t=ir(l),r=e-n;ur(l,t+r)}r===!0?g():o.value&&o.value.closest(`body`)&&u()}))})}function m(){c=0}function h(){a.value===!1&&(a.value=!0,l.addEventListener(`scroll`,u,Ic)),f()}function g(){a.value===!0&&(a.value=!1,i.value=!1,l.removeEventListener(`scroll`,u,Ic),u?.cancel?.())}function _(){if(l&&a.value===!0&&l.removeEventListener(`scroll`,u,Ic),l=tr(o.value,t.scrollTarget),a.value===!0){if(l.addEventListener(`scroll`,u,Ic),t.reverse===!0){let e=nr(l),t=Kt(l);ur(l,e-t)}f()}}function v(e){c=e}function y(e){e=parseInt(e,10);let t=u;u=e<=0?f:N(f,isNaN(e)===!0?100:e),l&&a.value===!0&&(t!==void 0&&l.removeEventListener(`scroll`,t,Ic),l.addEventListener(`scroll`,u,Ic))}function b(t){if(x.value===!0){if(s.value===null){t!==!0&&(0,e.nextTick)(()=>{b(!0)});return}let n=`${i.value===!0?`un`:``}pauseAnimations`;Array.from(s.value.getElementsByTagName(`svg`)).forEach(e=>{e[n]()})}}let x=(0,e.computed)(()=>t.disable!==!0&&a.value===!0);(0,e.watch)([i,x],()=>{b()}),(0,e.watch)(()=>t.disable,e=>{e===!0?g():h()}),(0,e.watch)(()=>t.reverse,()=>{i.value===!1&&a.value===!0&&f()}),(0,e.watch)(()=>t.scrollTarget,_),(0,e.watch)(()=>t.debounce,y);let S=!1;(0,e.onActivated)(()=>{S!==!1&&l&&ur(l,S)}),(0,e.onDeactivated)(()=>{S=l?ir(l):!1}),(0,e.onBeforeUnmount)(()=>{a.value===!0&&l.removeEventListener(`scroll`,u,Ic)}),(0,e.onMounted)(()=>{y(t.debounce),_(),i.value===!1&&b()});let C=(0,e.getCurrentInstance)();return Object.assign(C.proxy,{poll:()=>{u?.()},trigger:p,stop:g,reset:m,resume:h,setIndex:v,updateScrollTarget:_}),()=>{let r=Ze(n.default,[]);return x.value===!0&&r[t.reverse===!1?`push`:`unshift`]((0,e.h)(`div`,{ref:s,class:d.value},Y(n.loading))),(0,e.h)(`div`,{class:`q-infinite-scroll`,ref:o},r)}}}),Rc=h({name:`QInnerLoading`,props:{...Z,...Yn,showing:Boolean,color:String,size:{type:[String,Number],default:`42px`},label:String,labelClass:String,labelStyle:[String,Array,Object]},setup(t,{slots:n}){let r=Q(t,(0,e.getCurrentInstance)().proxy.$q),{transitionProps:i,transitionStyle:a}=Xn(t),o=(0,e.computed)(()=>`q-inner-loading q--avoid-card-border absolute-full column flex-center`+(r.value===!0?` q-inner-loading--dark`:``)),s=(0,e.computed)(()=>`q-inner-loading__label`+(t.labelClass===void 0?``:` ${t.labelClass}`));function c(){let n=[(0,e.h)(Ut,{size:t.size,color:t.color})];return t.label!==void 0&&n.push((0,e.h)(`div`,{class:s.value,style:t.labelStyle},[t.label])),n}function l(){return t.showing===!0?(0,e.h)(`div`,{class:o.value,style:a.value},n.default===void 0?c():n.default()):null}return()=>(0,e.h)(e.Transition,i.value,l)}});let zc={date:`####/##/##`,datetime:`####/##/## ##:##`,time:`##:##`,fulltime:`##:##:##`,phone:`(###) ### - ####`,card:`#### #### #### ####`},{tokenMap:Bc,tokenKeys:Vc}=Hc({"#":{pattern:`[\\d]`,negate:`[^\\d]`},S:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`},N:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`},A:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`,transform:e=>e.toLocaleUpperCase()},a:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`,transform:e=>e.toLocaleLowerCase()},X:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`,transform:e=>e.toLocaleUpperCase()},x:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`,transform:e=>e.toLocaleLowerCase()}});function Hc(e){let t=Object.keys(e),n={};return t.forEach(t=>{let r=e[t];n[t]={...r,regex:new RegExp(r.pattern)}}),{tokenMap:n,tokenKeys:t}}function Uc(e){return RegExp("\\\\([^.*+?^${}()|([\\]])|([.*+?^${}()|[\\]])|(["+e.join(``)+`])|(.)`,`g`)}let Wc=/[.*+?^${}()|[\]\\]/g,Gc=Uc(Vc),Kc={mask:String,reverseFillMask:Boolean,fillMask:[Boolean,String],unmaskedValue:Boolean,maskTokens:Object};function qc(t,n,r,i){let a,o,s,c,l,u,d=(0,e.computed)(()=>{if(t.maskTokens===void 0||t.maskTokens===null)return{tokenMap:Bc,tokenRegexMask:Gc};let{tokenMap:e}=Hc(t.maskTokens),n={...Bc,...e};return{tokenMap:n,tokenRegexMask:Uc(Object.keys(n))}}),f=(0,e.ref)(null),p=(0,e.ref)(h());function m(){return t.autogrow===!0||[`textarea`,`text`,`search`,`url`,`tel`,`password`].includes(t.type)}(0,e.watch)(()=>t.type+t.autogrow,_),(0,e.watch)(()=>t.mask,e=>{if(e!==void 0)v(p.value,!0);else{let e=T(p.value);_(),t.modelValue!==e&&n(`update:modelValue`,e)}}),(0,e.watch)(()=>t.fillMask+t.reverseFillMask,()=>{f.value===!0&&v(p.value,!0)}),(0,e.watch)(()=>t.unmaskedValue,()=>{f.value===!0&&v(p.value)});function h(){if(_(),f.value===!0){let e=C(T(t.modelValue));return t.fillMask===!1?e:E(e)}return t.modelValue}function g(e){if(e0;r--)t+=``;n=n.slice(0,r)+t+n.slice(r)}return n}function _(){if(f.value=t.mask!==void 0&&t.mask.length!==0&&m(),f.value===!1){c=void 0,a=``,o=``;return}let e=zc[t.mask]===void 0?t.mask:zc[t.mask],n=typeof t.fillMask==`string`&&t.fillMask.length!==0?t.fillMask.slice(0,1):`_`,r=n.replace(Wc,`\\$&`),i=[],l=[],u=[],p=t.reverseFillMask===!0,h=``,g=``;e.replace(d.value.tokenRegexMask,(e,t,n,r,a)=>{if(r!==void 0){let e=d.value.tokenMap[r];u.push(e),g=e.negate,p===!0&&(l.push(`(?:`+g+`+)?(`+e.pattern+`+)?(?:`+g+`+)?(`+e.pattern+`+)?`),p=!1),l.push(`(?:`+g+`+)?(`+e.pattern+`)?`)}else if(n!==void 0)h=`\\`+(n===`\\`?``:n),u.push(n),i.push(`([^`+h+`]+)?`+h+`?`);else{let e=t===void 0?a:t;h=e===`\\`?`\\\\\\\\`:e.replace(Wc,`\\\\$&`),u.push(e),i.push(`([^`+h+`]+)?`+h+`?`)}});let _=RegExp(`^`+i.join(``)+`(`+(h===``?`.`:`[^`+h+`]`)+`+)?`+(h===``?``:`[`+h+`]*`)+`$`),v=l.length-1,y=l.map((e,n)=>n===0&&t.reverseFillMask===!0?RegExp(`^`+r+`*`+e):RegExp(n===v?`^`+e+`(`+(g===``?`.`:g)+`+)?`+(t.reverseFillMask===!0?`$`:r+`*`):`^`+e));s=u,c=e=>{let n=_.exec(t.reverseFillMask===!0?e:e.slice(0,u.length+1));n!==null&&(e=n.slice(1).join(``));let r=[],i=y.length;for(let t=0,n=e;ttypeof e==`string`?e:``).join(``),o=a.split(``).join(n)}function v(n,s,c){let u=i.value,d=u.selectionEnd,f=u.value.length-d,m=T(n);s===!0&&_();let h=C(m,s),g=t.fillMask===!1?h:E(h),v=p.value!==g;u.value!==g&&(u.value=g),v===!0&&(p.value=g),document.activeElement===u&&(0,e.nextTick)(()=>{if(g===o){let e=t.reverseFillMask===!0?o.length:0;u.setSelectionRange(e,e,`forward`);return}if(c===`insertFromPaste`&&t.reverseFillMask!==!0){let e=u.selectionEnd,t=d-1;for(let n=l;n<=t&&nh.length):Math.max(0,g.length-(g===o?0:Math.min(h.length,f)+1))+1:d;u.setSelectionRange(e,e,`forward`);return}if(t.reverseFillMask===!0)if(v===!0){let e=Math.max(0,g.length-(g===o?0:Math.min(h.length,f+1)));e===1&&d===1?u.setSelectionRange(e,e,`forward`):b.rightReverse(u,e)}else{let e=g.length-f;u.setSelectionRange(e,e,`backward`)}else if(v===!0){let e=Math.max(0,a.indexOf(``),Math.min(h.length,d)-1);b.right(u,e)}else{let e=d-1;b.right(u,e)}});let y=t.unmaskedValue===!0?T(g):g;String(t.modelValue)!==y&&(t.modelValue!==null||y!==``)&&r(y,!0)}function y(e,t,n){let r=C(T(e.value));t=Math.max(0,a.indexOf(``),Math.min(r.length,t)),l=t,e.setSelectionRange(t,n,`forward`)}let b={left(e,t){let n=a.slice(t-1).indexOf(``)===-1,r=Math.max(0,t-1);for(;r>=0;r--)if(a[r]===``){t=r,n===!0&&t++;break}if(r<0&&a[t]!==void 0&&a[t]!==``)return b.right(e,0);t>=0&&e.setSelectionRange(t,t,`backward`)},right(e,t){let n=e.value.length,r=Math.min(n,t+1);for(;r<=n;r++)if(a[r]===``){t=r;break}else a[r-1]===``&&(t=r);if(r>n&&a[t-1]!==void 0&&a[t-1]!==``)return b.left(e,n);e.setSelectionRange(t,t,`forward`)},leftReverse(e,t){let n=g(e.value.length),r=Math.max(0,t-1);for(;r>=0;r--)if(n[r-1]===``){t=r;break}else if(n[r]===``&&(t=r,r===0))break;if(r<0&&n[t]!==void 0&&n[t]!==``)return b.rightReverse(e,0);t>=0&&e.setSelectionRange(t,t,`backward`)},rightReverse(e,t){let n=e.value.length,r=g(n),i=r.slice(0,t+1).indexOf(``)===-1,a=Math.min(n,t+1);for(;a<=n;a++)if(r[a-1]===``){t=a,t>0&&i===!0&&t--;break}if(a>n&&r[t-1]!==void 0&&r[t-1]!==``)return b.leftReverse(e,n);e.setSelectionRange(t,t,`forward`)}};function x(e){n(`click`,e),u=void 0}function S(e){if(n(`keydown`,e),ee(e)===!0||e.altKey===!0)return;let r=i.value,a=r.selectionStart,o=r.selectionEnd;if(e.shiftKey||(u=void 0),e.keyCode===37||e.keyCode===39){e.shiftKey&&u===void 0&&(u=r.selectionDirection===`forward`?a:o);let n=b[(e.keyCode===39?`right`:`left`)+(t.reverseFillMask===!0?`Reverse`:``)];if(e.preventDefault(),n(r,u===a?o:a),e.shiftKey){let e=r.selectionStart;r.setSelectionRange(Math.min(u,e),Math.max(u,e),`forward`)}}else e.keyCode===8&&t.reverseFillMask!==!0&&a===o?(b.left(r,a),r.setSelectionRange(r.selectionStart,o,`backward`)):e.keyCode===46&&t.reverseFillMask===!0&&a===o&&(b.rightReverse(r,o),r.setSelectionRange(a,r.selectionEnd,`forward`))}function C(e,n){if(e==null||e===``)return``;if(t.reverseFillMask===!0)return w(e,n);let r=s,i=0,a=``;for(let t=0;t=0&&i!==-1;a--){let s=n[a],c=e[i];if(typeof s==`string`)o=s+o,t===!0&&c===s&&i--;else if(c!==void 0&&s.regex.test(c))do o=(s.transform===void 0?c:s.transform(c))+o,i--,c=e[i];while(r===a&&c!==void 0&&s.regex.test(c));else return o}return o}function T(e){return typeof e!=`string`||c===void 0?typeof e==`number`?c(String(e)):e:c(e)}function E(e){return o.length-e.length<=0?e:t.reverseFillMask===!0&&e.length!==0?o.slice(0,-e.length)+e:e+o.slice(e.length)}return{innerValue:p,hasMask:f,moveCursorForPaste:y,updateMaskValue:v,onMaskedKeydown:S,onMaskedClick:x}}let Jc=/[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf]/,Yc=/[\u4e00-\u9fff\u3400-\u4dbf\u{20000}-\u{2a6df}\u{2a700}-\u{2b73f}\u{2b740}-\u{2b81f}\u{2b820}-\u{2ceaf}\uf900-\ufaff\u3300-\u33ff\ufe30-\ufe4f\uf900-\ufaff\u{2f800}-\u{2fa1f}]/u,Xc=/[\u3131-\u314e\u314f-\u3163\uac00-\ud7a3]/,Zc=/[a-z0-9_ -]$/i;function Qc(e){return function(t){if(t.type===`compositionend`||t.type===`change`){if(t.target.qComposing!==!0)return;t.target.qComposing=!1,e(t)}else t.type===`compositionupdate`&&t.target.qComposing!==!0&&typeof t.data==`string`&&(p.is.firefox===!0?Zc.test(t.data)===!1:Jc.test(t.data)===!0||Yc.test(t.data)===!0||Xc.test(t.data)===!0)&&(t.target.qComposing=!0)}}var $c=h({name:`QInput`,inheritAttrs:!1,props:{..._c,...Kc,...ai,modelValue:[String,Number,FileList],shadowText:String,type:{type:String,default:`text`},debounce:[String,Number],autogrow:Boolean,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...vc,`paste`,`change`,`keydown`,`click`,`animationend`],setup(t,{emit:n,attrs:i}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:o}=a,s={},c=NaN,l,u,d=null,f,p=(0,e.ref)(null),m=ci(t),{innerValue:h,hasMask:g,moveCursorForPaste:_,updateMaskValue:v,onMaskedKeydown:y,onMaskedClick:b}=qc(t,n,F,p),x=Dc(t,!0),S=(0,e.computed)(()=>hc(h.value)),C=Qc(N),w=yc({changeEvent:!0}),T=(0,e.computed)(()=>t.type===`textarea`||t.autogrow===!0),D=(0,e.computed)(()=>T.value===!0||[`text`,`search`,`url`,`tel`,`password`].includes(t.type)),O=(0,e.computed)(()=>{let e={...w.splitAttrs.listeners.value,onInput:N,onPaste:M,onChange:L,onBlur:R,onFocus:E};return e.onCompositionstart=e.onCompositionupdate=e.onCompositionend=C,g.value===!0&&(e.onKeydown=y,e.onClick=b),t.autogrow===!0&&(e.onAnimationend=P),e}),k=(0,e.computed)(()=>{let e={tabindex:0,"data-autofocus":t.autofocus===!0||void 0,rows:t.type===`textarea`?6:void 0,"aria-label":t.label,name:m.value,...w.splitAttrs.attributes.value,id:w.targetUid.value,maxlength:t.maxlength,disabled:t.disable===!0,readonly:t.readonly===!0};return T.value===!1&&(e.type=t.type),t.autogrow===!0&&(e.rows=1),e});(0,e.watch)(()=>t.type,()=>{p.value&&(p.value.value=t.modelValue)}),(0,e.watch)(()=>t.modelValue,n=>{if(g.value===!0){if(u===!0&&(u=!1,String(n)===c))return;v(n)}else h.value!==n&&(h.value=n,t.type===`number`&&s.hasOwnProperty(`value`)===!0&&(l===!0?l=!1:delete s.value));t.autogrow===!0&&(0,e.nextTick)(I)}),(0,e.watch)(()=>t.autogrow,t=>{t===!0?(0,e.nextTick)(I):p.value!==null&&i.rows>0&&(p.value.style.height=`auto`)}),(0,e.watch)(()=>t.dense,()=>{t.autogrow===!0&&(0,e.nextTick)(I)});function A(){Nn(()=>{let e=document.activeElement;p.value!==null&&p.value!==e&&(e===null||e.id!==w.targetUid.value)&&p.value.focus({preventScroll:!0})})}function j(){p.value?.select()}function M(e){if(g.value===!0&&t.reverseFillMask!==!0){let t=e.target;_(t,t.selectionStart,t.selectionEnd)}n(`paste`,e)}function N(r){if(!r||!r.target)return;if(t.type===`file`){n(`update:modelValue`,r.target.files);return}let i=r.target.value;if(r.target.qComposing===!0){s.value=i;return}if(g.value===!0)v(i,!1,r.inputType);else if(F(i),D.value===!0&&r.target===document.activeElement){let{selectionStart:t,selectionEnd:n}=r.target;t!==void 0&&n!==void 0&&(0,e.nextTick)(()=>{r.target===document.activeElement&&i.indexOf(r.target.value)===0&&r.target.setSelectionRange(t,n)})}t.autogrow===!0&&I()}function P(e){n(`animationend`,e),I()}function F(r,i){f=()=>{d=null,t.type!==`number`&&s.hasOwnProperty(`value`)===!0&&delete s.value,t.modelValue!==r&&c!==r&&(c=r,i===!0&&(u=!0),n(`update:modelValue`,r),(0,e.nextTick)(()=>{c===r&&(c=NaN)})),f=void 0},t.type===`number`&&(l=!0,s.value=r),t.debounce===void 0?f():(d!==null&&clearTimeout(d),s.value=r,d=setTimeout(f,t.debounce))}function I(){requestAnimationFrame(()=>{let e=p.value;if(e!==null){let t=e.parentNode.style,{scrollTop:n}=e,{overflowY:r,maxHeight:i}=o.platform.is.firefox===!0?{}:window.getComputedStyle(e),a=r!==void 0&&r!==`scroll`;a===!0&&(e.style.overflowY=`hidden`),t.marginBottom=e.scrollHeight-1+`px`,e.style.height=`1px`,e.style.height=e.scrollHeight+`px`,a===!0&&(e.style.overflowY=parseInt(i,10){p.value!==null&&(p.value.value=h.value===void 0?``:h.value)})}function z(){return s.hasOwnProperty(`value`)===!0?s.value:h.value===void 0?``:h.value}(0,e.onBeforeUnmount)(()=>{R()}),(0,e.onMounted)(()=>{t.autogrow===!0&&I()}),Object.assign(w,{innerValue:h,fieldClass:(0,e.computed)(()=>`q-${T.value===!0?`textarea`:`input`}`+(t.autogrow===!0?` q-textarea--autogrow`:``)),hasShadow:(0,e.computed)(()=>t.type!==`file`&&typeof t.shadowText==`string`&&t.shadowText.length!==0),inputRef:p,emitValue:F,hasValue:S,floatingLabel:(0,e.computed)(()=>S.value===!0&&(t.type!==`number`||isNaN(h.value)===!1)||hc(t.displayValue)),getControl:()=>(0,e.h)(T.value===!0?`textarea`:`input`,{ref:p,class:[`q-field__native q-placeholder`,t.inputClass],style:t.inputStyle,...k.value,...O.value,...t.type===`file`?x.value:{value:z()}}),getShadowControl:()=>(0,e.h)(`div`,{class:`q-field__native q-field__shadow absolute-bottom no-pointer-events`+(T.value===!0?``:` text-no-wrap`)},[(0,e.h)(`span`,{class:`invisible`},z()),(0,e.h)(`span`,t.shadowText)])});let B=bc(w);return Object.assign(a,{focus:A,select:j,getNativeElement:()=>p.value}),r(a,`nativeEl`,()=>p.value),B}});let el={threshold:0,root:null,rootMargin:`0px`};function tl(e,t,n){let r,i,a;typeof n==`function`?(r=n,i=el,a=t.cfg===void 0):(r=n.handler,i=Object.assign({},el,n.cfg),a=t.cfg===void 0||xe(t.cfg,i)===!1),t.handler!==r&&(t.handler=r),a===!0&&(t.cfg=i,t.observer?.unobserve(e),t.observer=new IntersectionObserver(([n])=>{if(typeof t.handler==`function`){if(n.rootBounds===null&&document.body.contains(e)===!0){t.observer.unobserve(e),t.observer.observe(e);return}(t.handler(n,t.observer)===!1||t.once===!0&&n.isIntersecting===!0)&&nl(e)}},i),t.observer.observe(e))}function nl(e){let t=e.__qvisible;t!==void 0&&(t.observer?.unobserve(e),delete e.__qvisible)}var rl=g({name:`intersection`,mounted(e,{modifiers:t,value:n}){let r={once:t.once===!0};tl(e,r,n),e.__qvisible=r},updated(e,t){let n=e.__qvisible;n!==void 0&&tl(e,n,t.value)},beforeUnmount:nl}),il=h({name:`QIntersection`,props:{tag:{type:String,default:`div`},once:Boolean,transition:String,transitionDuration:{type:[String,Number],default:300},ssrPrerender:Boolean,margin:String,threshold:[Number,Array],root:{default:null},disable:Boolean,onVisibility:Function},setup(t,{slots:n,emit:r}){let i=(0,e.ref)(a.value===!0?t.ssrPrerender:!1),o=(0,e.computed)(()=>t.root!==void 0||t.margin!==void 0||t.threshold!==void 0?{handler:u,cfg:{root:t.root,rootMargin:t.margin,threshold:t.threshold}}:u),s=(0,e.computed)(()=>t.disable!==!0&&(a.value!==!0||t.once!==!0||t.ssrPrerender!==!0)),c=(0,e.computed)(()=>[[rl,o.value,void 0,{once:t.once}]]),l=(0,e.computed)(()=>`--q-transition-duration: ${t.transitionDuration}ms`);function u(e){i.value!==e.isIntersecting&&(i.value=e.isIntersecting,t.onVisibility!==void 0&&r(`visibility`,i.value))}function d(){if(i.value===!0)return[(0,e.h)(`div`,{key:`content`,style:l.value},Y(n.default))];if(n.hidden!==void 0)return[(0,e.h)(`div`,{key:`hidden`,style:l.value},n.hidden())]}return()=>{let n=t.transition?[(0,e.h)(e.Transition,{name:`q-transition--`+t.transition},d)]:d();return et(t.tag,{class:`q-intersection`},n,`main`,s.value,()=>c.value)}}});let al=[`ul`,`ol`];var ol=h({name:`QList`,props:{...Z,bordered:Boolean,dense:Boolean,separator:Boolean,padding:Boolean,tag:{type:String,default:`div`}},setup(t,{slots:n}){let r=Q(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>al.includes(t.tag)?null:`list`),a=(0,e.computed)(()=>`q-list`+(t.bordered===!0?` q-list--bordered`:``)+(t.dense===!0?` q-list--dense`:``)+(t.separator===!0?` q-list--separator`:``)+(r.value===!0?` q-list--dark`:``)+(t.padding===!0?` q-list--padding`:``));return()=>(0,e.h)(t.tag,{class:a.value,role:i.value},Y(n.default))}});let sl=[34,37,40,33,39,38],cl=Object.keys(Gi);var ll=h({name:`QKnob`,props:{...ai,...Gi,modelValue:{type:Number,required:!0},innerMin:Number,innerMax:Number,step:{type:Number,default:1,validator:e=>e>=0},tabindex:{type:[Number,String],default:0},disable:Boolean,readonly:Boolean},emits:[`update:modelValue`,`change`,`dragValue`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=(0,e.ref)(t.modelValue),s=(0,e.ref)(!1),c=(0,e.computed)(()=>isNaN(t.innerMin)===!0||t.innerMinisNaN(t.innerMax)===!0||t.innerMax>t.max?t.max:t.innerMax),u;function d(){o.value=t.modelValue===null?c.value:Fe(t.modelValue,c.value,l.value),A(!0)}(0,e.watch)(()=>`${t.modelValue}|${c.value}|${l.value}`,d),d();let f=(0,e.computed)(()=>t.disable===!1&&t.readonly===!1),p=(0,e.computed)(()=>`q-knob non-selectable`+(f.value===!0?` q-knob--editable`:t.disable===!0?` disabled`:``)),m=(0,e.computed)(()=>(String(t.step).trim().split(`.`)[1]||``).length),h=(0,e.computed)(()=>t.step===0?1:t.step),g=(0,e.computed)(()=>t.instantFeedback===!0||s.value===!0),_=a.platform.is.mobile===!0?(0,e.computed)(()=>f.value===!0?{onClick:T}:{}):(0,e.computed)(()=>f.value===!0?{onMousedown:w,onClick:T,onKeydown:E,onKeyup:k}:{}),v=(0,e.computed)(()=>f.value===!0?{tabindex:t.tabindex}:{[`aria-${t.disable===!0?`disabled`:`readonly`}`]:`true`}),y=(0,e.computed)(()=>{let e={};return cl.forEach(n=>{e[n]=t[n]}),e});function b(e){e.isFinal?(D(e.evt,!0),s.value=!1):e.isFirst?(S(),s.value=!0,D(e.evt)):D(e.evt)}let x=(0,e.computed)(()=>[[Zi,b,void 0,{prevent:!0,stop:!0,mouse:!0}]]);function S(){let{top:e,left:t,width:n,height:r}=i.$el.getBoundingClientRect();u={top:e+r/2,left:t+n/2}}function w(e){S(),D(e)}function T(e){S(),D(e,!0)}function E(e){if(sl.includes(e.keyCode)===!1)return;O(e);let t=([34,33].includes(e.keyCode)?10:1)*h.value,n=[34,37,40].includes(e.keyCode)?-t:t;o.value=Fe(parseFloat((o.value+n).toFixed(m.value)),c.value,l.value),A()}function D(e,n){let i=C(e),s=Math.abs(i.top-u.top),d=Math.sqrt(s**2+Math.abs(i.left-u.left)**2),f=Math.asin(s/d)*(180/Math.PI);f=i.top=h.value/2?(e<0?-1:1)*h.value:0),p=parseFloat(p.toFixed(m.value))}p=Fe(p,c.value,l.value),r(`dragValue`,p),o.value!==p&&(o.value=p),A(n)}function k(e){sl.includes(e.keyCode)&&A(!0)}function A(e){t.modelValue!==o.value&&r(`update:modelValue`,o.value),e===!0&&r(`change`,o.value)}let j=oi(t);function M(){return(0,e.h)(`input`,j.value)}return()=>{let e={class:p.value,role:`slider`,"aria-valuemin":c.value,"aria-valuemax":l.value,"aria-valuenow":t.modelValue,...v.value,...y.value,value:o.value,instantFeedback:g.value,..._.value},r={default:n.default};return f.value===!0&&t.name!==void 0&&(r.internal=M),et(Ji,e,r,`knob`,f.value,()=>x.value)}}});let{passive:ul}=v,dl=[`both`,`horizontal`,`vertical`];var fl=h({name:`QScrollObserver`,props:{axis:{type:String,validator:e=>dl.includes(e),default:`vertical`},debounce:[String,Number],scrollTarget:$n},emits:[`scroll`],setup(t,{emit:n}){let r={position:{top:0,left:0},direction:`down`,directionChanged:!1,delta:{top:0,left:0},inflectionPoint:{top:0,left:0}},i=null,a,o;(0,e.watch)(()=>t.scrollTarget,()=>{l(),c()});function s(){i?.();let e=Math.max(0,ir(a)),o=ar(a),s={top:e-r.position.top,left:o-r.position.left};if(t.axis===`vertical`&&s.top===0||t.axis===`horizontal`&&s.left===0)return;let c=Math.abs(s.top)>=Math.abs(s.left)?s.top<0?`up`:`down`:s.left<0?`left`:`right`;r.position={top:e,left:o},r.directionChanged=r.direction!==c,r.delta=s,r.directionChanged===!0&&(r.direction=c,r.inflectionPoint=r.position),n(`scroll`,{...r})}function c(){a=tr(o,t.scrollTarget),a.addEventListener(`scroll`,u,ul),u(!0)}function l(){a!==void 0&&(a.removeEventListener(`scroll`,u,ul),a=void 0)}function u(e){if(e===!0||t.debounce===0||t.debounce===`0`)s();else if(i===null){let[e,n]=t.debounce?[setTimeout(s,t.debounce),clearTimeout]:[requestAnimationFrame(s),cancelAnimationFrame];i=()=>{n(e),i=null}}}let{proxy:d}=(0,e.getCurrentInstance)();return(0,e.watch)(()=>d.$q.lang.rtl,s),(0,e.onMounted)(()=>{o=d.$el.parentNode,c()}),(0,e.onBeforeUnmount)(()=>{i?.(),l()}),Object.assign(d,{trigger:u,getPosition:()=>r}),y}}),pl=h({name:`QLayout`,props:{container:Boolean,view:{type:String,default:`hhh lpr fff`,validator:e=>/^(h|l)h(h|r) lpr (f|l)f(f|r)$/.test(e.toLowerCase())},onScroll:Function,onScrollHeight:Function,onResize:Function},setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),o=(0,e.ref)(null),s=(0,e.ref)(i.screen.height),c=(0,e.ref)(t.container===!0?0:i.screen.width),l=(0,e.ref)({position:0,direction:`down`,inflectionPoint:0}),u=(0,e.ref)(0),d=(0,e.ref)(a.value===!0?0:pr()),f=(0,e.computed)(()=>`q-layout q-layout--`+(t.container===!0?`containerized`:`standard`)),p=(0,e.computed)(()=>t.container===!1?{minHeight:i.screen.height+`px`}:null),m=(0,e.computed)(()=>d.value===0?null:{[i.lang.rtl===!0?`left`:`right`]:`${d.value}px`}),h=(0,e.computed)(()=>d.value===0?null:{[i.lang.rtl===!0?`right`:`left`]:0,[i.lang.rtl===!0?`left`:`right`]:`-${d.value}px`,width:`calc(100% + ${d.value}px)`});function g(e){if(t.container===!0||document.qScrollPrevented!==!0){let n={position:e.position.top,direction:e.direction,directionChanged:e.directionChanged,inflectionPoint:e.inflectionPoint.top,delta:e.delta.top};l.value=n,t.onScroll!==void 0&&r(`scroll`,n)}}function _(e){let{height:n,width:i}=e,a=!1;s.value!==n&&(a=!0,s.value=n,t.onScrollHeight!==void 0&&r(`scrollHeight`,n),y()),c.value!==i&&(a=!0,c.value=i),a===!0&&t.onResize!==void 0&&r(`resize`,e)}function v({height:e}){u.value!==e&&(u.value=e,y())}function y(){if(t.container===!0){let e=s.value>u.value?pr():0;d.value!==e&&(d.value=e)}}let b=null,x={instances:{},view:(0,e.computed)(()=>t.view),isContainer:(0,e.computed)(()=>t.container),rootRef:o,height:s,containerHeight:u,scrollbarWidth:d,totalWidth:(0,e.computed)(()=>c.value+d.value),rows:(0,e.computed)(()=>{let e=t.view.toLowerCase().split(` `);return{top:e[0].split(``),middle:e[1].split(``),bottom:e[2].split(``)}}),header:(0,e.reactive)({size:0,offset:0,space:!1}),right:(0,e.reactive)({size:300,offset:0,space:!1}),footer:(0,e.reactive)({size:0,offset:0,space:!1}),left:(0,e.reactive)({size:300,offset:0,space:!1}),scroll:l,animate(){b===null?document.body.classList.add(`q-body--layout-animate`):clearTimeout(b),b=setTimeout(()=>{b=null,document.body.classList.remove(`q-body--layout-animate`)},155)},update(e,t,n){x[e][t]=n}};if((0,e.provide)(pe,x),pr()>0){let n=null,r=document.body;function S(){n=null,r.classList.remove(`hide-scrollbar`)}function C(){if(n===null){if(r.scrollHeight>i.screen.height)return;r.classList.add(`hide-scrollbar`)}else clearTimeout(n);n=setTimeout(S,300)}function w(e){n!==null&&e===`remove`&&(clearTimeout(n),S()),window[`${e}EventListener`](`resize`,C)}(0,e.watch)(()=>t.container===!0?`remove`:`add`,w),t.container!==!0&&w(`add`),(0,e.onUnmounted)(()=>{w(`remove`)})}return()=>{let r=Qe(n.default,[(0,e.h)(fl,{onScroll:g}),(0,e.h)(la,{onResize:_})]),i=(0,e.h)(`div`,{class:f.value,style:p.value,ref:t.container===!0?void 0:o,tabindex:-1},r);return t.container===!0?(0,e.h)(`div`,{class:`q-layout-container overflow-hidden`,ref:o},[(0,e.h)(la,{onResize:v}),(0,e.h)(`div`,{class:`absolute-full`,style:m.value},[(0,e.h)(`div`,{class:`scroll`,style:h.value},[i])])]):i}}});let ml=[`horizontal`,`vertical`,`cell`,`none`];var hl=h({name:`QMarkupTable`,props:{...Z,dense:Boolean,flat:Boolean,bordered:Boolean,square:Boolean,wrapCells:Boolean,separator:{type:String,default:`horizontal`,validator:e=>ml.includes(e)}},setup(t,{slots:n}){let r=Q(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>`q-markup-table q-table__container q-table__card q-table--${t.separator}-separator`+(r.value===!0?` q-table--dark q-table__card--dark q-dark`:``)+(t.dense===!0?` q-table--dense`:``)+(t.flat===!0?` q-table--flat`:``)+(t.bordered===!0?` q-table--bordered`:``)+(t.square===!0?` q-table--square`:``)+(t.wrapCells===!1?` q-table--no-wrap`:``));return()=>(0,e.h)(`div`,{class:i.value},[(0,e.h)(`table`,{class:`q-table`},Y(n.default))])}}),gl=h({name:`QNoSsr`,props:{tag:{type:String,default:`div`},placeholder:String},setup(t,{slots:n}){let{isHydrated:r}=oa();return()=>{if(r.value===!0){let r=Y(n.default);return r===void 0?r:r.length>1?(0,e.h)(t.tag,{},r):r[0]}let i={class:`q-no-ssr-placeholder`},a=Y(n.placeholder);if(a!==void 0)return a.length>1?(0,e.h)(t.tag,i,a):a[0];if(t.placeholder!==void 0)return(0,e.h)(t.tag,i,t.placeholder)}}});let _l=()=>(0,e.h)(`svg`,{key:`svg`,class:`q-radio__bg absolute non-selectable`,viewBox:`0 0 24 24`},[(0,e.h)(`path`,{d:`M12,22a10,10 0 0 1 -10,-10a10,10 0 0 1 10,-10a10,10 0 0 1 10,10a10,10 0 0 1 -10,10m0,-22a12,12 0 0 0 -12,12a12,12 0 0 0 12,12a12,12 0 0 0 12,-12a12,12 0 0 0 -12,-12`}),(0,e.h)(`path`,{class:`q-radio__check`,d:`M12,6a6,6 0 0 0 -6,6a6,6 0 0 0 6,6a6,6 0 0 0 6,-6a6,6 0 0 0 -6,-6`})]);var vl=h({name:`QRadio`,props:{...Z,...Ye,...ai,modelValue:{required:!0},val:{required:!0},label:String,leftLabel:Boolean,checkedIcon:String,uncheckedIcon:String,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},emits:[`update:modelValue`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),a=Q(t,i.$q),o=Xe(t,Li),s=(0,e.ref)(null),{refocusTargetEl:c,refocusTarget:l}=Ii(t,s),u=(0,e.computed)(()=>(0,e.toRaw)(t.modelValue)===(0,e.toRaw)(t.val)),d=(0,e.computed)(()=>`q-radio cursor-pointer no-outline row inline no-wrap items-center`+(t.disable===!0?` disabled`:``)+(a.value===!0?` q-radio--dark`:``)+(t.dense===!0?` q-radio--dense`:``)+(t.leftLabel===!0?` reverse`:``)),f=(0,e.computed)(()=>{let e=t.color!==void 0&&(t.keepColor===!0||u.value===!0)?` text-${t.color}`:``;return`q-radio__inner relative-position q-radio__inner--${u.value===!0?`truthy`:`falsy`}${e}`}),p=(0,e.computed)(()=>(u.value===!0?t.checkedIcon:t.uncheckedIcon)||null),m=(0,e.computed)(()=>t.disable===!0?-1:t.tabindex||0),h=si((0,e.computed)(()=>{let e={type:`radio`};return t.name!==void 0&&Object.assign(e,{".checked":u.value===!0,"^checked":u.value===!0?`checked`:void 0,name:t.name,value:t.val}),e}));function g(e){e!==void 0&&(O(e),l(e)),t.disable!==!0&&u.value!==!0&&r(`update:modelValue`,t.val,e)}function _(e){(e.keyCode===13||e.keyCode===32)&&O(e)}function v(e){(e.keyCode===13||e.keyCode===32)&&g(e)}Object.assign(i,{set:g});let y=_l();return()=>{let r=p.value===null?[y]:[(0,e.h)(`div`,{key:`icon`,class:`q-radio__icon-container absolute-full flex flex-center no-wrap`},[(0,e.h)(X,{class:`q-radio__icon`,name:p.value})])];t.disable!==!0&&h(r,`unshift`,` q-radio__native q-ma-none q-pa-none`);let i=[(0,e.h)(`div`,{class:f.value,style:o.value,"aria-hidden":`true`},r)];c.value!==null&&i.push(c.value);let a=t.label===void 0?Y(n.default):Qe(n.default,[t.label]);return a!==void 0&&i.push((0,e.h)(`div`,{class:`q-radio__label q-anchor--skip`},a)),(0,e.h)(`div`,{ref:s,class:d.value,tabindex:m.value,role:`radio`,"aria-label":t.label,"aria-checked":u.value===!0?`true`:`false`,"aria-disabled":t.disable===!0?`true`:void 0,onClick:g,onKeydown:_,onKeyup:v},i)}}}),yl=h({name:`QToggle`,props:{...Ri,icon:String,iconColor:String},emits:zi,setup(t){function n(n,r){let i=(0,e.computed)(()=>(n.value===!0?t.checkedIcon:r.value===!0?t.indeterminateIcon:t.uncheckedIcon)||t.icon),a=(0,e.computed)(()=>n.value===!0?t.iconColor:null);return()=>[(0,e.h)(`div`,{class:`q-toggle__track`}),(0,e.h)(`div`,{class:`q-toggle__thumb absolute flex flex-center no-wrap`},i.value===void 0?void 0:[(0,e.h)(X,{name:i.value,color:a.value})])]}return Bi(`toggle`,n)}});let bl={radio:vl,checkbox:Hi,toggle:yl},xl=Object.keys(bl);function Sl(e,t){if(typeof e==`function`)return e;let n=e===void 0?t:e;return e=>e[n]}var Cl=h({name:`QOptionGroup`,props:{...Z,modelValue:{required:!0},options:{type:Array,validator:e=>e.every(Se),default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],name:String,type:{type:String,default:`radio`,validator:e=>xl.includes(e)},color:String,keepColor:Boolean,dense:Boolean,size:String,leftLabel:Boolean,inline:Boolean,disable:Boolean},emits:[`update:modelValue`],setup(t,{emit:n,slots:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=Array.isArray(t.modelValue);t.type===`radio`?a===!0&&console.error(`q-option-group: model should not be array`):a===!1&&console.error(`q-option-group: model should be array in your case`);let o=Q(t,i),s=(0,e.computed)(()=>bl[t.type]),c=(0,e.computed)(()=>Sl(t.optionValue,`value`)),l=(0,e.computed)(()=>Sl(t.optionLabel,`label`)),u=(0,e.computed)(()=>Sl(t.optionDisable,`disable`)),d=(0,e.computed)(()=>t.options.map(e=>({val:c.value(e),name:e.name===void 0?t.name:e.name,disable:t.disable||u.value(e),leftLabel:e.leftLabel===void 0?t.leftLabel:e.leftLabel,color:e.color===void 0?t.color:e.color,checkedIcon:e.checkedIcon,uncheckedIcon:e.uncheckedIcon,dark:e.dark===void 0?o.value:e.dark,size:e.size===void 0?t.size:e.size,dense:t.dense,keepColor:e.keepColor===void 0?t.keepColor:e.keepColor}))),f=(0,e.computed)(()=>`q-option-group q-gutter-x-sm`+(t.inline===!0?` q-option-group--inline`:``)),p=(0,e.computed)(()=>{let e={role:`group`};return t.type===`radio`&&(e.role=`radiogroup`,t.disable===!0&&(e[`aria-disabled`]=`true`)),e});function m(e){n(`update:modelValue`,e)}return()=>(0,e.h)(`div`,{class:f.value,...p.value},t.options.map((n,i)=>{let a=r[`label-`+i]===void 0?r.label===void 0?void 0:()=>r.label(n):()=>r[`label-`+i](n);return(0,e.h)(`div`,[(0,e.h)(s.value,{label:a===void 0?l.value(n):null,modelValue:t.modelValue,"onUpdate:modelValue":m,...d.value[i]},a)])}))}}),wl=h({name:`QPage`,props:{padding:Boolean,styleFn:Function},setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=(0,e.inject)(pe,q);if(i===q)return console.error(`QPage needs to be a deep child of QLayout`),q;if((0,e.inject)(`_q_pc_`,q)===q)return console.error(`QPage needs to be child of QPageContainer`),q;let a=(0,e.computed)(()=>{let e=(i.header.space===!0?i.header.size:0)+(i.footer.space===!0?i.footer.size:0);if(typeof t.styleFn==`function`){let n=i.isContainer.value===!0?i.containerHeight.value:r.screen.height;return t.styleFn(e,n)}return{minHeight:i.isContainer.value===!0?i.containerHeight.value-e+`px`:r.screen.height===0?e===0?`100vh`:`calc(100vh - ${e}px)`:r.screen.height-e+`px`}}),o=(0,e.computed)(()=>`q-page${t.padding===!0?` q-layout-padding`:``}`);return()=>(0,e.h)(`main`,{class:o.value,style:a.value},Y(n.default))}}),Tl=h({name:`QPageContainer`,setup(t,{slots:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=(0,e.inject)(pe,q);if(i===q)return console.error(`QPageContainer needs to be child of QLayout`),q;(0,e.provide)(`_q_pc_`,!0);let a=(0,e.computed)(()=>{let e={};return i.header.space===!0&&(e.paddingTop=`${i.header.size}px`),i.right.space===!0&&(e[`padding${r.lang.rtl===!0?`Left`:`Right`}`]=`${i.right.size}px`),i.footer.space===!0&&(e.paddingBottom=`${i.footer.size}px`),i.left.space===!0&&(e[`padding${r.lang.rtl===!0?`Right`:`Left`}`]=`${i.left.size}px`),e});return()=>(0,e.h)(`div`,{class:`q-page-container`,style:a.value},Y(n.default))}});let El={position:{type:String,default:`bottom-right`,validator:e=>[`top-right`,`top-left`,`bottom-right`,`bottom-left`,`top`,`right`,`bottom`,`left`].includes(e)},offset:{type:Array,validator:e=>e.length===2},expand:Boolean};function Dl(){let{props:t,proxy:{$q:n}}=(0,e.getCurrentInstance)(),r=(0,e.inject)(pe,q);if(r===q)return console.error(`QPageSticky needs to be child of QLayout`),q;let i=(0,e.computed)(()=>{let e=t.position;return{top:e.indexOf(`top`)!==-1,right:e.indexOf(`right`)!==-1,bottom:e.indexOf(`bottom`)!==-1,left:e.indexOf(`left`)!==-1,vertical:e===`top`||e===`bottom`,horizontal:e===`left`||e===`right`}}),a=(0,e.computed)(()=>r.header.offset),o=(0,e.computed)(()=>r.right.offset),s=(0,e.computed)(()=>r.footer.offset),c=(0,e.computed)(()=>r.left.offset),l=(0,e.computed)(()=>{let e=0,r=0,l=i.value,u=n.lang.rtl===!0?-1:1;l.top===!0&&a.value!==0?r=`${a.value}px`:l.bottom===!0&&s.value!==0&&(r=`${-s.value}px`),l.left===!0&&c.value!==0?e=`${u*c.value}px`:l.right===!0&&o.value!==0&&(e=`${-u*o.value}px`);let d={transform:`translate(${e}, ${r})`};return t.offset&&(d.margin=`${t.offset[1]}px ${t.offset[0]}px`),l.vertical===!0?(c.value!==0&&(d[n.lang.rtl===!0?`right`:`left`]=`${c.value}px`),o.value!==0&&(d[n.lang.rtl===!0?`left`:`right`]=`${o.value}px`)):l.horizontal===!0&&(a.value!==0&&(d.top=`${a.value}px`),s.value!==0&&(d.bottom=`${s.value}px`)),d}),u=(0,e.computed)(()=>`q-page-sticky row flex-center fixed-${t.position} q-page-sticky--${t.expand===!0?`expand`:`shrink`}`);function d(n){let r=Y(n.default);return(0,e.h)(`div`,{class:u.value,style:l.value},t.expand===!0?r:[(0,e.h)(`div`,r)])}return{$layout:r,getStickyContent:d}}var Ol=h({name:`QPageScroller`,props:{...El,scrollOffset:{type:Number,default:1e3},reverse:Boolean,duration:{type:Number,default:300},offset:{...El.offset,default:()=>[18,18]}},emits:[`click`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),{$layout:a,getStickyContent:o}=Dl(),s=(0,e.ref)(null),c,l=(0,e.computed)(()=>a.height.value-(a.isContainer.value===!0?a.containerHeight.value:i.screen.height));function u(){return t.reverse===!0?l.value-a.scroll.value.position>t.scrollOffset:a.scroll.value.position>t.scrollOffset}let d=(0,e.ref)(u());function f(){let e=u();d.value!==e&&(d.value=e)}function p(){t.reverse===!0?c===void 0&&(c=(0,e.watch)(l,f)):m()}(0,e.watch)(a.scroll,f),(0,e.watch)(()=>t.reverse,p);function m(){c!==void 0&&(c(),c=void 0)}function h(e){ur(tr(a.isContainer.value===!0?s.value:a.rootRef.value),t.reverse===!0?a.height.value:0,t.duration),r(`click`,e)}function g(){return d.value===!0?(0,e.h)(`div`,{ref:s,class:`q-page-scroller`,onClick:h},o(n)):null}return p(),(0,e.onBeforeUnmount)(m),()=>(0,e.h)(e.Transition,{name:`q-transition--fade`},g)}}),kl=h({name:`QPageSticky`,props:El,setup(e,{slots:t}){let{getStickyContent:n}=Dl();return()=>n(t)}});function Al(e,t){return[!0,!1].includes(e)?e:t}var jl=h({name:`QPagination`,props:{...Z,modelValue:{type:Number,required:!0},min:{type:[Number,String],default:1},max:{type:[Number,String],required:!0},maxPages:{type:[Number,String],default:0,validator:e=>(typeof e==`string`?parseInt(e,10):e)>=0},inputStyle:[Array,String,Object],inputClass:[Array,String,Object],size:String,disable:Boolean,input:Boolean,iconPrev:String,iconNext:String,iconFirst:String,iconLast:String,toFn:Function,boundaryLinks:{type:Boolean,default:null},boundaryNumbers:{type:Boolean,default:null},directionLinks:{type:Boolean,default:null},ellipses:{type:Boolean,default:null},ripple:{type:[Boolean,Object],default:null},round:Boolean,rounded:Boolean,flat:Boolean,outline:Boolean,unelevated:Boolean,push:Boolean,glossy:Boolean,color:{type:String,default:`primary`},textColor:String,activeDesign:{type:String,default:``,values:e=>e===``||ln.includes(e)},activeColor:String,activeTextColor:String,gutter:String,padding:{type:String,default:`3px 2px`}},emits:[`update:modelValue`],setup(t,{emit:n}){let{proxy:r}=(0,e.getCurrentInstance)(),{$q:i}=r,a=Q(t,i),o=(0,e.computed)(()=>parseInt(t.min,10)),s=(0,e.computed)(()=>parseInt(t.max,10)),c=(0,e.computed)(()=>parseInt(t.maxPages,10)),l=(0,e.computed)(()=>h.value+` / `+s.value),u=(0,e.computed)(()=>Al(t.boundaryLinks,t.input)),d=(0,e.computed)(()=>Al(t.boundaryNumbers,!t.input)),f=(0,e.computed)(()=>Al(t.directionLinks,t.input)),p=(0,e.computed)(()=>Al(t.ellipses,!t.input)),m=(0,e.ref)(null),h=(0,e.computed)({get:()=>t.modelValue,set:e=>{if(e=parseInt(e,10),t.disable||isNaN(e))return;let r=Fe(e,o.value,s.value);t.modelValue!==r&&n(`update:modelValue`,r)}});(0,e.watch)(()=>`${o.value}|${s.value}`,()=>{h.value=t.modelValue});let g=(0,e.computed)(()=>`q-pagination row no-wrap items-center`+(t.disable===!0?` disabled`:``)),_=(0,e.computed)(()=>t.gutter in an?`${an[t.gutter]}px`:t.gutter||null),v=(0,e.computed)(()=>_.value===null?null:`--q-pagination-gutter-parent:-${_.value};--q-pagination-gutter-child:${_.value}`),y=(0,e.computed)(()=>{let e=[t.iconFirst||i.iconSet.pagination.first,t.iconPrev||i.iconSet.pagination.prev,t.iconNext||i.iconSet.pagination.next,t.iconLast||i.iconSet.pagination.last];return i.lang.rtl===!0?e.reverse():e}),b=(0,e.computed)(()=>({"aria-disabled":t.disable===!0?`true`:`false`,role:`navigation`})),x=(0,e.computed)(()=>un(t,`flat`)),S=(0,e.computed)(()=>({[x.value]:!0,round:t.round,rounded:t.rounded,padding:t.padding,color:t.color,textColor:t.textColor,size:t.size,ripple:t.ripple===null?!0:t.ripple})),C=(0,e.computed)(()=>{let e={[x.value]:!1};return t.activeDesign!==``&&(e[t.activeDesign]=!0),e}),w=(0,e.computed)(()=>({...C.value,color:t.activeColor||t.color,textColor:t.activeTextColor||t.textColor})),T=(0,e.computed)(()=>{let e=Math.max(c.value,1+(p.value?2:0)+(d.value?2:0)),n={pgFrom:o.value,pgTo:s.value,ellipsesStart:!1,ellipsesEnd:!1,boundaryStart:!1,boundaryEnd:!1,marginalStyle:{minWidth:`${Math.max(2,String(s.value).length)}em`}};return c.value&&eo.value+ +!!d.value&&(n.ellipsesStart=!0,n.pgFrom++),d.value&&(n.boundaryEnd=!0,n.pgTo--),p.value&&n.pgTo{E(r)}:a.to=t.toFn(r)),(0,e.h)($,a)}return Object.assign(r,{set:E,setByOffset:D}),()=>{let n=[],r=[],c;if(u.value===!0&&(n.push(j({key:`bls`,disable:t.disable||t.modelValue<=o.value,icon:y.value[0],"aria-label":i.lang.pagination.first},o.value)),r.unshift(j({key:`ble`,disable:t.disable||t.modelValue>=s.value,icon:y.value[3],"aria-label":i.lang.pagination.last},s.value))),f.value===!0&&(n.push(j({key:`bdp`,disable:t.disable||t.modelValue<=o.value,icon:y.value[1],"aria-label":i.lang.pagination.prev},t.modelValue-1)),r.unshift(j({key:`bdn`,disable:t.disable||t.modelValue>=s.value,icon:y.value[2],"aria-label":i.lang.pagination.next},t.modelValue+1))),t.input!==!0){c=[];let{pgFrom:e,pgTo:i,marginalStyle:a}=T.value;if(T.value.boundaryStart===!0){let e=o.value===t.modelValue;n.push(j({key:`bns`,style:a,disable:t.disable,label:o.value},o.value,e))}if(T.value.boundaryEnd===!0){let e=s.value===t.modelValue;r.unshift(j({key:`bne`,style:a,disable:t.disable,label:s.value},s.value,e))}T.value.ellipsesStart===!0&&n.push(j({key:`bes`,style:a,disable:t.disable,label:`…`,ripple:!1},e-1)),T.value.ellipsesEnd===!0&&r.unshift(j({key:`bee`,style:a,disable:t.disable,label:`…`,ripple:!1},i+1));for(let n=e;n<=i;n++)c.push(j({key:`bpg${n}`,style:a,disable:t.disable,label:n},n,n===t.modelValue))}return(0,e.h)(`div`,{class:g.value,...b.value},[(0,e.h)(`div`,{class:`q-pagination__content row no-wrap items-center`,style:v.value},[...n,t.input===!0?(0,e.h)($c,{class:`inline`,style:{width:`${l.value.length/1.5}em`},type:`number`,dense:!0,value:m.value,disable:t.disable,dark:a.value,borderless:!0,inputClass:t.inputClass,inputStyle:t.inputStyle,placeholder:l.value,min:o.value,max:s.value,"onUpdate:modelValue":k,onKeyup:A,onBlur:O}):(0,e.h)(`div`,{class:`q-pagination__middle row justify-center`},c),...r])])}}});function Ml(e){let t=!1,n,r;function i(){r=arguments,t!==!0&&(t=!0,n=window.requestAnimationFrame(()=>{e.apply(this,r),r=void 0,t=!1}))}return i.cancel=()=>{window.cancelAnimationFrame(n),t=!1},i}let{passive:Nl}=v;var Pl=h({name:`QParallax`,props:{src:String,height:{type:Number,default:500},speed:{type:Number,default:1,validator:e=>e>=0&&e<=1},scrollTarget:$n,onScroll:Function},setup(t,{slots:n,emit:r}){let i=(0,e.ref)(0),a=(0,e.ref)(null),o=(0,e.ref)(null),s=(0,e.ref)(null),c,l,u,d,f,p;(0,e.watch)(()=>t.height,()=>{c===!0&&h()}),(0,e.watch)(()=>t.scrollTarget,()=>{c===!0&&(y(),v())});let m=e=>{i.value=e,t.onScroll!==void 0&&r(`scroll`,e)};function h(){let e,n,r;p===window?(e=0,r=n=window.innerHeight):(e=Wt(p).top,n=Kt(p),r=e+n);let i=Wt(a.value).top,o=i+t.height;if(f!==void 0||o>e&&i{l.style.transform=`translate3d(-50%,${Math.round(e)}px,0)`};function _(){u=l.naturalHeight||l.videoHeight||Kt(l),c===!0&&h()}function v(){c=!0,p=tr(a.value,t.scrollTarget),p.addEventListener(`scroll`,h,Nl),window.addEventListener(`resize`,d,Nl),h()}function y(){c===!0&&(c=!1,p.removeEventListener(`scroll`,h,Nl),window.removeEventListener(`resize`,d,Nl),p=void 0,g.cancel(),m.cancel(),d.cancel())}return(0,e.onMounted)(()=>{g=Ml(g),m=Ml(m),d=Ml(_),l=n.media===void 0?s.value:o.value.children[0],l.onload=l.onloadstart=l.loadedmetadata=_,_(),l.style.display=`initial`,window.IntersectionObserver===void 0?v():(f=new IntersectionObserver(e=>{(e[0].isIntersecting===!0?v:y)()}),f.observe(a.value))}),(0,e.onBeforeUnmount)(()=>{y(),f?.disconnect(),l.onload=l.onloadstart=l.loadedmetadata=null}),()=>(0,e.h)(`div`,{ref:a,class:`q-parallax`,style:{height:`${t.height}px`}},[(0,e.h)(`div`,{ref:o,class:`q-parallax__media absolute-full`},n.media===void 0?[(0,e.h)(`img`,{ref:s,src:t.src})]:n.media()),(0,e.h)(`div`,{class:`q-parallax__content absolute-full column flex-center`},n.content===void 0?Y(n.default):n.content({percentScrolled:i.value}))])}});function Fl(e,t=new WeakMap){if(Object(e)!==e)return e;if(t.has(e))return t.get(e);let n=e instanceof Date?new Date(e):e instanceof RegExp?new RegExp(e.source,e.flags):e instanceof Set?new Set:e instanceof Map?new Map:typeof e.constructor==`function`?e.prototype!==void 0&&typeof e.prototype.constructor==`function`?e:new e.constructor:Object.create(null);if(typeof e.constructor==`function`&&typeof e.valueOf==`function`){let n=e.valueOf();if(Object(n)!==n){let r=new e.constructor(n);return t.set(e,r),r}}return t.set(e,n),e instanceof Set?e.forEach(e=>{n.add(Fl(e,t))}):e instanceof Map&&e.forEach((e,r)=>{n.set(r,Fl(e,t))}),Object.assign(n,...Object.keys(e).map(n=>({[n]:Fl(e[n],t)})))}var Il=h({name:`QPopupEdit`,props:{modelValue:{required:!0},title:String,buttons:Boolean,labelSet:String,labelCancel:String,color:{type:String,default:`primary`},validate:{type:Function,default:()=>!0},autoSave:Boolean,cover:{type:Boolean,default:!0},disable:Boolean},emits:[`update:modelValue`,`save`,`cancel`,`beforeShow`,`show`,`beforeHide`,`hide`],setup(t,{slots:n,emit:i}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:o}=a,s=(0,e.ref)(null),c=(0,e.ref)(``),l=(0,e.ref)(``),u=!1,d=(0,e.computed)(()=>r({initialValue:c.value,validate:t.validate,set:f,cancel:p,updatePosition:m},`value`,()=>l.value,e=>{l.value=e}));function f(){t.validate(l.value)!==!1&&(h()===!0&&(i(`save`,l.value,c.value),i(`update:modelValue`,l.value)),g())}function p(){h()===!0&&i(`cancel`,l.value,c.value),g()}function m(){(0,e.nextTick)(()=>{s.value.updatePosition()})}function h(){return xe(l.value,c.value)===!1}function g(){u=!0,s.value.hide()}function _(){u=!1,c.value=Fl(t.modelValue),l.value=Fl(t.modelValue),i(`beforeShow`)}function v(){i(`show`)}function y(){u===!1&&h()===!0&&(t.autoSave===!0&&t.validate(l.value)===!0?(i(`save`,l.value,c.value),i(`update:modelValue`,l.value)):i(`cancel`,l.value,c.value)),i(`beforeHide`)}function b(){i(`hide`)}function x(){let r=n.default===void 0?[]:[].concat(n.default(d.value));return t.title&&r.unshift((0,e.h)(`div`,{class:`q-dialog__title q-mt-sm q-mb-sm`},t.title)),t.buttons===!0&&r.push((0,e.h)(`div`,{class:`q-popup-edit__buttons row justify-center no-wrap`},[(0,e.h)($,{flat:!0,color:t.color,label:t.labelCancel||o.lang.label.cancel,onClick:p}),(0,e.h)($,{flat:!0,color:t.color,label:t.labelSet||o.lang.label.set,onClick:f})])),r}return Object.assign(a,{set:f,cancel:p,show(e){s.value?.show(e)},hide(e){s.value?.hide(e)},updatePosition:m}),()=>{if(t.disable!==!0)return(0,e.h)(Kr,{ref:s,class:`q-popup-edit`,cover:t.cover,onBeforeShow:_,onShow:v,onBeforeHide:y,onHide:b,onEscapeKey:p},x)}}}),Ll=h({name:`QPopupProxy`,props:{...Sn,breakpoint:{type:[String,Number],default:450}},emits:[`show`,`hide`],setup(t,{slots:n,emit:i,attrs:a}){let{proxy:o}=(0,e.getCurrentInstance)(),{$q:s}=o,c=(0,e.ref)(!1),l=(0,e.ref)(null),u=(0,e.computed)(()=>parseInt(t.breakpoint,10)),{canShow:d}=Cn({showing:c});function f(){return s.screen.widthp.value===`menu`?{maxHeight:`99vh`}:{});(0,e.watch)(()=>f(),e=>{c.value!==!0&&(p.value=e)});function h(e){c.value=!0,i(`show`,e)}function g(e){c.value=!1,p.value=f(),i(`hide`,e)}return Object.assign(o,{show(e){d(e)===!0&&l.value.show(e)},hide(e){l.value.hide(e)},toggle(e){l.value.toggle(e)}}),r(o,`currentComponent`,()=>({type:p.value,ref:l.value})),()=>{let r={ref:l,...m.value,...a,onShow:h,onHide:g},i;return p.value===`dialog`?i=Cs:(i=Kr,Object.assign(r,{target:t.target,contextMenu:t.contextMenu,noParentEvent:!0,separateClosePopup:!0})),(0,e.h)(i,r,n.default)}}});let Rl={xs:2,sm:4,md:6,lg:10,xl:14};function zl(e,t,n){return{transform:t===!0?`translateX(${n.lang.rtl===!0?`-`:``}100%) scale3d(${-e},1,1)`:`scale3d(${e},1,1)`}}var Bl=h({name:`QLinearProgress`,props:{...Z,...Ye,value:{type:Number,default:0},buffer:Number,color:String,trackColor:String,reverse:Boolean,stripe:Boolean,indeterminate:Boolean,query:Boolean,rounded:Boolean,animationSpeed:{type:[String,Number],default:2100},instantFeedback:Boolean},setup(t,{slots:n}){let{proxy:r}=(0,e.getCurrentInstance)(),i=Q(t,r.$q),a=Xe(t,Rl),o=(0,e.computed)(()=>t.indeterminate===!0||t.query===!0),s=(0,e.computed)(()=>t.reverse!==t.query),c=(0,e.computed)(()=>({...a.value===null?{}:a.value,"--q-linear-progress-speed":`${t.animationSpeed}ms`})),l=(0,e.computed)(()=>`q-linear-progress`+(t.color===void 0?``:` text-${t.color}`)+(t.reverse===!0||t.query===!0?` q-linear-progress--reverse`:``)+(t.rounded===!0?` rounded-borders`:``)),u=(0,e.computed)(()=>zl(t.buffer===void 0?1:t.buffer,s.value,r.$q)),d=(0,e.computed)(()=>`with${t.instantFeedback===!0?`out`:``}-transition`),f=(0,e.computed)(()=>`q-linear-progress__track absolute-full q-linear-progress__track--${d.value} q-linear-progress__track--${i.value===!0?`dark`:`light`}`+(t.trackColor===void 0?``:` bg-${t.trackColor}`)),p=(0,e.computed)(()=>zl(o.value===!0?1:t.value,s.value,r.$q)),m=(0,e.computed)(()=>`q-linear-progress__model absolute-full q-linear-progress__model--${d.value} q-linear-progress__model--${o.value===!0?`in`:``}determinate`),h=(0,e.computed)(()=>({width:`${t.value*100}%`})),g=(0,e.computed)(()=>`q-linear-progress__stripe absolute-${t.reverse===!0?`right`:`left`} q-linear-progress__stripe--${d.value}`);return()=>{let r=[(0,e.h)(`div`,{class:f.value,style:u.value}),(0,e.h)(`div`,{class:m.value,style:p.value})];return t.stripe===!0&&o.value===!1&&r.push((0,e.h)(`div`,{class:g.value,style:h.value})),(0,e.h)(`div`,{class:l.value,style:c.value,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":t.indeterminate===!0?void 0:t.value},Qe(n.default,r))}}}),Vl=h({name:`QPullToRefresh`,props:{color:String,bgColor:String,icon:String,noMouse:Boolean,disable:Boolean,scrollTarget:$n},emits:[`refresh`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=(0,e.ref)(`pull`),s=(0,e.ref)(0),c=(0,e.ref)(!1),l=(0,e.ref)(-40),u=(0,e.ref)(!1),d=(0,e.ref)({}),f=(0,e.computed)(()=>({opacity:s.value,transform:`translateY(${l.value}px) rotate(${s.value*360}deg)`})),p=(0,e.computed)(()=>`q-pull-to-refresh__puller row flex-center`+(u.value===!0?` q-pull-to-refresh__puller--animating`:``)+(t.bgColor===void 0?``:` bg-${t.bgColor}`));function m(e){if(e.isFinal===!0){c.value===!0&&(c.value=!1,o.value===`pulled`?(o.value=`refreshing`,b({pos:20}),_()):o.value===`pull`&&b({pos:-40,ratio:0}));return}if(u.value===!0||o.value===`refreshing`)return!1;if(e.isFirst===!0){if(ir(v)!==0||e.direction!==`down`)return c.value===!0&&(c.value=!1,o.value=`pull`,b({pos:-40,ratio:0})),!1;c.value=!0;let{top:t,left:n}=i.$el.getBoundingClientRect();d.value={top:t+`px`,left:n+`px`,width:window.getComputedStyle(i.$el).getPropertyValue(`width`)}}D(e.evt);let t=Math.min(140,Math.max(0,e.distance.y));l.value=t-40,s.value=Fe(t/60,0,1);let n=l.value>20?`pulled`:`pull`;o.value!==n&&(o.value=n)}let h=(0,e.computed)(()=>{let e={down:!0};return t.noMouse!==!0&&(e.mouse=!0),[[Zi,m,void 0,e]]}),g=(0,e.computed)(()=>`q-pull-to-refresh__content${c.value===!0?` no-pointer-events`:``}`);function _(){r(`refresh`,()=>{b({pos:-40,ratio:0},()=>{o.value=`pull`})})}let v,y=null;function b({pos:e,ratio:t},n){u.value=!0,l.value=e,t!==void 0&&(s.value=t),y!==null&&clearTimeout(y),y=setTimeout(()=>{y=null,u.value=!1,n?.()},300)}function x(){v=tr(i.$el,t.scrollTarget)}return(0,e.watch)(()=>t.scrollTarget,x),(0,e.onMounted)(x),(0,e.onBeforeUnmount)(()=>{y!==null&&clearTimeout(y)}),Object.assign(i,{trigger:_,updateScrollTarget:x}),()=>et(`div`,{class:`q-pull-to-refresh`},[(0,e.h)(`div`,{class:g.value},Y(n.default)),(0,e.h)(`div`,{class:`q-pull-to-refresh__puller-container fixed row flex-center no-pointer-events z-top`,style:d.value},[(0,e.h)(`div`,{class:p.value,style:f.value},[o.value===`refreshing`?(0,e.h)(Ut,{size:`24px`,color:t.color}):(0,e.h)(X,{name:t.icon||a.iconSet.pullToRefresh.icon,color:t.color,size:`32px`})])])],`main`,t.disable===!1,()=>h.value)}});let Hl={MIN:0,RANGE:1,MAX:2};var Ul=h({name:`QRange`,props:{...ta,modelValue:{type:Object,default:()=>({min:null,max:null}),validator:e=>`min`in e&&`max`in e},dragRange:Boolean,dragOnlyRange:Boolean,leftLabelColor:String,leftLabelTextColor:String,rightLabelColor:String,rightLabelTextColor:String,leftLabelValue:[String,Number],rightLabelValue:[String,Number],leftThumbColor:String,rightThumbColor:String},emits:na,setup(t,{emit:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),{state:i,methods:a}=ra({updateValue:T,updatePosition:D,getDragging:E,formAttrs:(0,e.computed)(()=>({type:`hidden`,name:t.name,value:`${t.modelValue.min}|${t.modelValue.max}`}))}),o=(0,e.ref)(null),s=(0,e.ref)(0),c=(0,e.ref)(0),l=(0,e.ref)({min:0,max:0});function u(){l.value.min=t.modelValue.min===null?i.innerMin.value:Fe(t.modelValue.min,i.innerMin.value,i.innerMax.value),l.value.max=t.modelValue.max===null?i.innerMax.value:Fe(t.modelValue.max,i.innerMin.value,i.innerMax.value)}(0,e.watch)(()=>`${t.modelValue.min}|${t.modelValue.max}|${i.innerMin.value}|${i.innerMax.value}`,u),u();let d=(0,e.computed)(()=>a.convertModelToRatio(l.value.min)),f=(0,e.computed)(()=>a.convertModelToRatio(l.value.max)),p=(0,e.computed)(()=>i.active.value===!0?s.value:d.value),m=(0,e.computed)(()=>i.active.value===!0?c.value:f.value),h=(0,e.computed)(()=>{let e={[i.positionProp.value]:`${100*p.value}%`,[i.sizeProp.value]:`${100*(m.value-p.value)}%`};return t.selectionImg!==void 0&&(e.backgroundImage=`url(${t.selectionImg}) !important`),e}),g=(0,e.computed)(()=>{if(i.editable.value!==!0)return{};if(r.platform.is.mobile===!0)return{onClick:a.onMobileClick};let e={onMousedown:a.onActivate};return(t.dragRange===!0||t.dragOnlyRange===!0)&&Object.assign(e,{onFocus:()=>{i.focus.value=`both`},onBlur:a.onBlur,onKeydown:k,onKeyup:a.onKeyup}),e});function _(e){return r.platform.is.mobile!==!0&&i.editable.value===!0&&t.dragOnlyRange!==!0?{onFocus:()=>{i.focus.value=e},onBlur:a.onBlur,onKeydown:k,onKeyup:a.onKeyup}:{}}let v=(0,e.computed)(()=>t.dragOnlyRange===!0?null:i.tabindex.value),y=(0,e.computed)(()=>r.platform.is.mobile!==!0&&(t.dragRange||t.dragOnlyRange===!0)?i.tabindex.value:null),b=(0,e.ref)(null),x=(0,e.computed)(()=>_(`min`)),S=a.getThumbRenderFn({focusValue:`min`,getNodeData:()=>({ref:b,key:`tmin`,...x.value,tabindex:v.value}),ratio:p,label:(0,e.computed)(()=>t.leftLabelValue===void 0?l.value.min:t.leftLabelValue),thumbColor:(0,e.computed)(()=>t.leftThumbColor||t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.leftLabelColor||t.labelColor),labelTextColor:(0,e.computed)(()=>t.leftLabelTextColor||t.labelTextColor)}),C=(0,e.computed)(()=>_(`max`)),w=a.getThumbRenderFn({focusValue:`max`,getNodeData:()=>({...C.value,key:`tmax`,tabindex:v.value}),ratio:m,label:(0,e.computed)(()=>t.rightLabelValue===void 0?l.value.max:t.rightLabelValue),thumbColor:(0,e.computed)(()=>t.rightThumbColor||t.thumbColor||t.color),labelColor:(0,e.computed)(()=>t.rightLabelColor||t.labelColor),labelTextColor:(0,e.computed)(()=>t.rightLabelTextColor||t.labelTextColor)});function T(e){(l.value.min!==t.modelValue.min||l.value.max!==t.modelValue.max)&&n(`update:modelValue`,{...l.value}),e===!0&&n(`change`,{...l.value})}function E(e){let{left:n,top:r,width:i,height:s}=o.value.getBoundingClientRect(),c=t.dragOnlyRange===!0?0:t.vertical===!0?b.value.offsetHeight/(2*s):b.value.offsetWidth/(2*i),u={left:n,top:r,width:i,height:s,valueMin:l.value.min,valueMax:l.value.max,ratioMin:d.value,ratioMax:f.value},p=a.getDraggingRatio(e,u);return t.dragOnlyRange!==!0&&p=n.ratioMin?(r={minR:n.ratioMin,maxR:o,min:n.valueMin,max:u},i.focus.value=`max`):(r={minR:o,maxR:n.ratioMin,min:u,max:n.valueMin},i.focus.value=`min`);break;case Hl.RANGE:let e=o-n.offsetRatio,t=Fe(n.ratioMin+e,i.innerMinRatio.value,i.innerMaxRatio.value-n.rangeRatio),a=u-n.offsetModel,s=Fe(n.valueMin+a,i.innerMin.value,i.innerMax.value-n.rangeValue);r={minR:t,maxR:t+n.rangeRatio,min:i.roundValueFn.value(s),max:i.roundValueFn.value(s+n.rangeValue)},i.focus.value=`both`;break}l.value=l.value.min===null||l.value.max===null?{min:r.min||t.min,max:r.max||t.max}:{min:r.min,max:r.max},t.snap!==!0||t.step===0?(s.value=r.minR,c.value=r.maxR):(s.value=a.convertModelToRatio(l.value.min),c.value=a.convertModelToRatio(l.value.max))}function k(e){if(ea.includes(e.keyCode)===!1)return;O(e);let n=([34,33].includes(e.keyCode)?10:1)*i.keyStep.value,r=([34,37,40].includes(e.keyCode)?-1:1)*(i.isReversed.value===!0?-1:1)*(t.vertical===!0?-1:1)*n;if(i.focus.value===`both`){let e=l.value.max-l.value.min,t=Fe(i.roundValueFn.value(l.value.min+r),i.innerMin.value,i.innerMax.value-e);l.value={min:t,max:i.roundValueFn.value(t+e)}}else if(i.focus.value===!1)return;else{let e=i.focus.value;l.value={...l.value,[e]:Fe(i.roundValueFn.value(l.value[e]+r),e===`min`?i.innerMin.value:l.value.min,e===`max`?i.innerMax.value:l.value.max)}}T()}return()=>{let n=a.getContent(h,y,g,e=>{e.push(S(),w())});return(0,e.h)(`div`,{ref:o,class:`q-range `+i.classes.value+(t.modelValue.min===null||t.modelValue.max===null?` q-slider--no-value`:``),...i.attributes.value,"aria-valuenow":t.modelValue.min+`|`+t.modelValue.max},n)}}}),Wl=h({name:`QRating`,props:{...Ye,...ai,modelValue:{type:Number,required:!0},max:{type:[String,Number],default:5},icon:[String,Array],iconHalf:[String,Array],iconSelected:[String,Array],iconAriaLabel:[String,Array],color:[String,Array],colorHalf:[String,Array],colorSelected:[String,Array],noReset:Boolean,noDimming:Boolean,readonly:Boolean,disable:Boolean},emits:[`update:modelValue`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=Xe(t),o=si(oi(t)),s=(0,e.ref)(0),c={},l=(0,e.computed)(()=>t.readonly!==!0&&t.disable!==!0),u=(0,e.computed)(()=>`q-rating row inline items-center q-rating--${l.value===!0?``:`non-`}editable`+(t.noDimming===!0?` q-rating--no-dimming`:``)+(t.disable===!0?` disabled`:``)+(t.color!==void 0&&Array.isArray(t.color)===!1?` text-${t.color}`:``)),d=(0,e.computed)(()=>{let e=Array.isArray(t.icon)===!0?t.icon.length:0,n=Array.isArray(t.iconSelected)===!0?t.iconSelected.length:0,r=Array.isArray(t.iconHalf)===!0?t.iconHalf.length:0,i=Array.isArray(t.color)===!0?t.color.length:0,a=Array.isArray(t.colorSelected)===!0?t.colorSelected.length:0,o=Array.isArray(t.colorHalf)===!0?t.colorHalf.length:0;return{iconLen:e,icon:e>0?t.icon[e-1]:t.icon,selIconLen:n,selIcon:n>0?t.iconSelected[n-1]:t.iconSelected,halfIconLen:r,halfIcon:r>0?t.iconHalf[n-1]:t.iconHalf,colorLen:i,color:i>0?t.color[i-1]:t.color,selColorLen:a,selColor:a>0?t.colorSelected[a-1]:t.colorSelected,halfColorLen:o,halfColor:o>0?t.colorHalf[o-1]:t.colorHalf}}),f=(0,e.computed)(()=>{if(typeof t.iconAriaLabel==`string`){let e=t.iconAriaLabel.length===0?``:`${t.iconAriaLabel} `;return t=>`${e}${t}`}if(Array.isArray(t.iconAriaLabel)===!0){let e=t.iconAriaLabel.length;if(e>0)return n=>t.iconAriaLabel[Math.min(n,e)-1]}return(e,t)=>`${t} ${e}`}),p=(0,e.computed)(()=>{let e=[],n=d.value,r=Math.ceil(t.modelValue),a=l.value===!0?0:null,o=t.iconHalf===void 0||r===t.modelValue?-1:r;for(let c=1;c<=t.max;c++){let l=s.value===0&&t.modelValue>=c||s.value>0&&s.value>=c,u=o===c&&s.value0&&(u===!0?r:t.modelValue)>=c&&s.value{let e={role:`radiogroup`};return t.disable===!0&&(e[`aria-disabled`]=`true`),t.readonly===!0&&(e[`aria-readonly`]=`true`),e});function h(e){if(l.value===!0){let n=Fe(parseInt(e,10),1,parseInt(t.max,10)),i=t.noReset!==!0&&t.modelValue===n?0:n;i!==t.modelValue&&r(`update:modelValue`,i),s.value=0}}function g(e){l.value===!0&&(s.value=e)}function _(e,t){switch(e.keyCode){case 13:case 32:return h(t),O(e);case 37:case 40:return c[`rt${t-1}`]&&c[`rt${t-1}`].focus(),O(e);case 39:case 38:return c[`rt${t+1}`]&&c[`rt${t+1}`].focus(),O(e)}}function v(){s.value=0}return(0,e.onBeforeUpdate)(()=>{c={}}),()=>{let r=[];return p.value.forEach(({iconClass:t,name:i,attrs:a},o)=>{let s=o+1;r.push((0,e.h)(`div`,{key:s,ref:e=>{c[`rt${s}`]=e},class:`q-rating__icon-container flex flex-center`,...a,onClick(){h(s)},onMouseover(){g(s)},onMouseout:v,onFocus(){g(s)},onBlur:v,onKeyup(e){_(e,s)}},Qe(n[`tip-${s}`],[(0,e.h)(X,{class:t,name:i})])))}),t.name!==void 0&&t.disable!==!0&&o(r,`push`),(0,e.h)(`div`,{class:u.value,style:a.value,...m.value},r)}}}),Gl=h({name:`QResponsive`,props:Nc,setup(t,{slots:n}){let r=Pc(t);return()=>(0,e.h)(`div`,{class:`q-responsive`},[(0,e.h)(`div`,{class:`q-responsive__filler overflow-hidden`},[(0,e.h)(`div`,{style:r.value})]),(0,e.h)(`div`,{class:`q-responsive__content absolute-full fit`},Y(n.default))])}}),Kl=h({props:[`store`,`barStyle`,`verticalBarStyle`,`horizontalBarStyle`],setup(t){return()=>[(0,e.h)(`div`,{class:t.store.scroll.vertical.barClass.value,style:[t.barStyle,t.verticalBarStyle],"aria-hidden":`true`,onMousedown:t.store.onVerticalMousedown}),(0,e.h)(`div`,{class:t.store.scroll.horizontal.barClass.value,style:[t.barStyle,t.horizontalBarStyle],"aria-hidden":`true`,onMousedown:t.store.onHorizontalMousedown}),(0,e.withDirectives)((0,e.h)(`div`,{ref:t.store.scroll.vertical.ref,class:t.store.scroll.vertical.thumbClass.value,style:t.store.scroll.vertical.style.value,"aria-hidden":`true`}),t.store.thumbVertDir),(0,e.withDirectives)((0,e.h)(`div`,{ref:t.store.scroll.horizontal.ref,class:t.store.scroll.horizontal.thumbClass.value,style:t.store.scroll.horizontal.style.value,"aria-hidden":`true`}),t.store.thumbHorizDir)]}});let ql=[`vertical`,`horizontal`],Jl={vertical:{offset:`offsetY`,scroll:`scrollTop`,dir:`down`,dist:`y`},horizontal:{offset:`offsetX`,scroll:`scrollLeft`,dir:`right`,dist:`x`}},Yl={prevent:!0,mouse:!0,mouseAllDir:!0},Xl=e=>e>=250?50:Math.ceil(e/5);var Zl=h({name:`QScrollArea`,props:{...Z,thumbStyle:Object,verticalThumbStyle:Object,horizontalThumbStyle:Object,barStyle:[Array,String,Object],verticalBarStyle:[Array,String,Object],horizontalBarStyle:[Array,String,Object],verticalOffset:{type:Array,default:[0,0]},horizontalOffset:{type:Array,default:[0,0]},contentStyle:[Array,String,Object],contentActiveStyle:[Array,String,Object],delay:{type:[String,Number],default:1e3},visible:{type:Boolean,default:null},tabindex:[String,Number],onScroll:Function},setup(t,{slots:n,emit:r}){let i=(0,e.ref)(!1),a=(0,e.ref)(!1),o=(0,e.ref)(!1),s={vertical:(0,e.ref)(0),horizontal:(0,e.ref)(0)},c={vertical:{ref:(0,e.ref)(null),position:(0,e.ref)(0),size:(0,e.ref)(0)},horizontal:{ref:(0,e.ref)(null),position:(0,e.ref)(0),size:(0,e.ref)(0)}},{proxy:l}=(0,e.getCurrentInstance)(),u=Q(t,l.$q),d=null,f,p=(0,e.ref)(null),m=(0,e.computed)(()=>`q-scrollarea`+(u.value===!0?` q-scrollarea--dark`:``));Object.assign(s,{verticalInner:(0,e.computed)(()=>s.vertical.value-t.verticalOffset[0]-t.verticalOffset[1]),horizontalInner:(0,e.computed)(()=>s.horizontal.value-t.horizontalOffset[0]-t.horizontalOffset[1])}),c.vertical.percentage=(0,e.computed)(()=>{let e=c.vertical.size.value-s.vertical.value;if(e<=0)return 0;let t=Fe(c.vertical.position.value/e,0,1);return Math.round(t*1e4)/1e4}),c.vertical.thumbHidden=(0,e.computed)(()=>(t.visible===null?o.value:t.visible)!==!0&&i.value===!1&&a.value===!1||c.vertical.size.value<=s.vertical.value+1),c.vertical.thumbStart=(0,e.computed)(()=>t.verticalOffset[0]+c.vertical.percentage.value*(s.verticalInner.value-c.vertical.thumbSize.value)),c.vertical.thumbSize=(0,e.computed)(()=>Math.round(Fe(s.verticalInner.value*s.verticalInner.value/c.vertical.size.value,Xl(s.verticalInner.value),s.verticalInner.value))),c.vertical.style=(0,e.computed)(()=>({...t.thumbStyle,...t.verticalThumbStyle,top:`${c.vertical.thumbStart.value}px`,height:`${c.vertical.thumbSize.value}px`,right:`${t.horizontalOffset[1]}px`})),c.vertical.thumbClass=(0,e.computed)(()=>`q-scrollarea__thumb q-scrollarea__thumb--v absolute-right`+(c.vertical.thumbHidden.value===!0?` q-scrollarea__thumb--invisible`:``)),c.vertical.barClass=(0,e.computed)(()=>`q-scrollarea__bar q-scrollarea__bar--v absolute-right`+(c.vertical.thumbHidden.value===!0?` q-scrollarea__bar--invisible`:``)),c.horizontal.percentage=(0,e.computed)(()=>{let e=c.horizontal.size.value-s.horizontal.value;if(e<=0)return 0;let t=Fe(Math.abs(c.horizontal.position.value)/e,0,1);return Math.round(t*1e4)/1e4}),c.horizontal.thumbHidden=(0,e.computed)(()=>(t.visible===null?o.value:t.visible)!==!0&&i.value===!1&&a.value===!1||c.horizontal.size.value<=s.horizontal.value+1),c.horizontal.thumbStart=(0,e.computed)(()=>t.horizontalOffset[0]+c.horizontal.percentage.value*(s.horizontalInner.value-c.horizontal.thumbSize.value)),c.horizontal.thumbSize=(0,e.computed)(()=>Math.round(Fe(s.horizontalInner.value*s.horizontalInner.value/c.horizontal.size.value,Xl(s.horizontalInner.value),s.horizontalInner.value))),c.horizontal.style=(0,e.computed)(()=>({...t.thumbStyle,...t.horizontalThumbStyle,[l.$q.lang.rtl===!0?`right`:`left`]:`${c.horizontal.thumbStart.value}px`,width:`${c.horizontal.thumbSize.value}px`,bottom:`${t.verticalOffset[1]}px`})),c.horizontal.thumbClass=(0,e.computed)(()=>`q-scrollarea__thumb q-scrollarea__thumb--h absolute-bottom`+(c.horizontal.thumbHidden.value===!0?` q-scrollarea__thumb--invisible`:``)),c.horizontal.barClass=(0,e.computed)(()=>`q-scrollarea__bar q-scrollarea__bar--h absolute-bottom`+(c.horizontal.thumbHidden.value===!0?` q-scrollarea__bar--invisible`:``));let h=(0,e.computed)(()=>c.vertical.thumbHidden.value===!0&&c.horizontal.thumbHidden.value===!0?t.contentStyle:t.contentActiveStyle);function g(){let e={};return ql.forEach(t=>{let n=c[t];Object.assign(e,{[t+`Position`]:n.position.value,[t+`Percentage`]:n.percentage.value,[t+`Size`]:n.size.value,[t+`ContainerSize`]:s[t].value,[t+`ContainerInnerSize`]:s[t+`Inner`].value})}),e}let _=N(()=>{let e=g();e.ref=l,r(`scroll`,e)},0);function v(e,t,n){if(ql.includes(e)===!1){console.error(`[QScrollArea]: wrong first param of setScrollPosition (vertical/horizontal)`);return}(e===`vertical`?ur:dr)(p.value,t,n)}function y({height:e,width:t}){let n=!1;s.vertical.value!==e&&(s.vertical.value=e,n=!0),s.horizontal.value!==t&&(s.horizontal.value=t,n=!0),n===!0&&w()}function b({position:e}){let t=!1;c.vertical.position.value!==e.top&&(c.vertical.position.value=e.top,t=!0),c.horizontal.position.value!==e.left&&(c.horizontal.position.value=e.left,t=!0),t===!0&&w()}function x({height:e,width:t}){c.horizontal.size.value!==t&&(c.horizontal.size.value=t,w()),c.vertical.size.value!==e&&(c.vertical.size.value=e,w())}function S(e,t){let n=c[t];if(e.isFirst===!0){if(n.thumbHidden.value===!0)return;f=n.position.value,a.value=!0}else if(a.value!==!0)return;e.isFinal===!0&&(a.value=!1);let r=Jl[t],i=(n.size.value-s[t].value)/(s[t+`Inner`].value-n.thumbSize.value),o=e.distance[r.dist];T(f+(e.direction===r.dir?1:-1)*o*i,t)}function C(e,n){let r=c[n];if(r.thumbHidden.value!==!0){let i=n===`vertical`?t.verticalOffset[0]:t.horizontalOffset[0],a=e[Jl[n].offset]-i,o=r.thumbStart.value-i;(ao+r.thumbSize.value)&&T(Fe((a-r.thumbSize.value/2)/(s[n+`Inner`].value-r.thumbSize.value),0,1)*Math.max(0,r.size.value-s[n].value),n),r.ref.value!==null&&r.ref.value.dispatchEvent(new MouseEvent(e.type,e))}}function w(){i.value=!0,d!==null&&clearTimeout(d),d=setTimeout(()=>{d=null,i.value=!1},t.delay),t.onScroll!==void 0&&_()}function T(e,t){p.value[Jl[t].scroll]=e}let E=null;function D(){E!==null&&clearTimeout(E),E=setTimeout(()=>{E=null,o.value=!0},l.$q.platform.is.ios?50:0)}function O(){E!==null&&(clearTimeout(E),E=null),o.value=!1}let k=null;(0,e.watch)(()=>l.$q.lang.rtl,e=>{p.value!==null&&dr(p.value,Math.abs(c.horizontal.position.value)*(e===!0?-1:1))}),(0,e.onDeactivated)(()=>{k={top:c.vertical.position.value,left:c.horizontal.position.value}}),(0,e.onActivated)(()=>{if(k===null)return;let e=p.value;e!==null&&(dr(e,k.left),ur(e,k.top))}),(0,e.onBeforeUnmount)(_.cancel),Object.assign(l,{getScrollTarget:()=>p.value,getScroll:g,getScrollPosition:()=>({top:c.vertical.position.value,left:c.horizontal.position.value}),getScrollPercentage:()=>({top:c.vertical.percentage.value,left:c.horizontal.percentage.value}),setScrollPosition:v,setScrollPercentage(e,t,n){v(e,t*(c[e].size.value-s[e].value)*(e===`horizontal`&&l.$q.lang.rtl===!0?-1:1),n)}});let A={scroll:c,thumbVertDir:[[Zi,e=>{S(e,`vertical`)},void 0,{vertical:!0,...Yl}]],thumbHorizDir:[[Zi,e=>{S(e,`horizontal`)},void 0,{horizontal:!0,...Yl}]],onVerticalMousedown(e){C(e,`vertical`)},onHorizontalMousedown(e){C(e,`horizontal`)}};return()=>(0,e.h)(`div`,{class:m.value,onMouseenter:D,onMouseleave:O},[(0,e.h)(`div`,{ref:p,class:`q-scrollarea__container scroll relative-position fit hide-scrollbar`,tabindex:t.tabindex===void 0?void 0:t.tabindex},[(0,e.h)(`div`,{class:`q-scrollarea__content absolute`,style:h.value},Qe(n.default,[(0,e.h)(la,{debounce:0,onResize:x})])),(0,e.h)(fl,{axis:`both`,onScroll:b})]),(0,e.h)(la,{debounce:0,onResize:y}),(0,e.h)(Kl,{store:A,barStyle:t.barStyle,verticalBarStyle:t.verticalBarStyle,horizontalBarStyle:t.horizontalBarStyle})])}});let Ql=1e3,$l=[`start`,`center`,`end`,`start-force`,`center-force`,`end-force`],eu=Array.prototype.filter,tu=window.getComputedStyle(document.body).overflowAnchor===void 0?y:function(e,t){e!==null&&(e._qOverflowAnimationFrame!==void 0&&cancelAnimationFrame(e._qOverflowAnimationFrame),e._qOverflowAnimationFrame=requestAnimationFrame(()=>{if(e===null)return;e._qOverflowAnimationFrame=void 0;let n=e.children||[];eu.call(n,e=>e.dataset&&e.dataset.qVsAnchor!==void 0).forEach(e=>{delete e.dataset.qVsAnchor});let r=n[t];r?.dataset&&(r.dataset.qVsAnchor=``)}))};function nu(e,t){return e+t}function ru(e,t,n,r,i,a,o,s){let c=e===window?document.scrollingElement||document.documentElement:e,l=i===!0?`offsetWidth`:`offsetHeight`,u={scrollStart:0,scrollViewSize:-o-s,scrollMaxSize:0,offsetStart:-o,offsetEnd:-s};if(i===!0?(e===window?(u.scrollStart=window.pageXOffset||window.scrollX||document.body.scrollLeft||0,u.scrollViewSize+=document.documentElement.clientWidth):(u.scrollStart=c.scrollLeft,u.scrollViewSize+=c.clientWidth),u.scrollMaxSize=c.scrollWidth,a===!0&&(u.scrollStart=(ua===!0?u.scrollMaxSize-u.scrollViewSize:0)-u.scrollStart)):(e===window?(u.scrollStart=window.pageYOffset||window.scrollY||document.body.scrollTop||0,u.scrollViewSize+=document.documentElement.clientHeight):(u.scrollStart=c.scrollTop,u.scrollViewSize+=c.clientHeight),u.scrollMaxSize=c.scrollHeight),n!==null)for(let e=n.previousElementSibling;e!==null;e=e.previousElementSibling)e.classList.contains(`q-virtual-scroll--skip`)===!1&&(u.offsetStart+=e[l]);if(r!==null)for(let e=r.nextElementSibling;e!==null;e=e.nextElementSibling)e.classList.contains(`q-virtual-scroll--skip`)===!1&&(u.offsetEnd+=e[l]);if(t!==e){let n=c.getBoundingClientRect(),r=t.getBoundingClientRect();i===!0?(u.offsetStart+=r.left-n.left,u.offsetEnd-=r.width):(u.offsetStart+=r.top-n.top,u.offsetEnd-=r.height),e!==window&&(u.offsetStart+=u.scrollStart),u.offsetEnd+=u.scrollMaxSize-u.offsetStart}return u}function iu(e,t,n,r){t===`end`&&(t=(e===window?document.body:e)[n===!0?`scrollWidth`:`scrollHeight`]),e===window?n===!0?(r===!0&&(t=(ua===!0?document.body.scrollWidth-document.documentElement.clientWidth:0)-t),window.scrollTo(t,window.pageYOffset||window.scrollY||document.body.scrollTop||0)):window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,t):n===!0?(r===!0&&(t=(ua===!0?e.scrollWidth-e.offsetWidth:0)-t),e.scrollLeft=t):e.scrollTop=t}function au(e,t,n,r){if(n>=r)return 0;let i=t.length,a=Math.floor(n/Ql),o=Math.floor((r-1)/Ql)+1,s=e.slice(a,o).reduce(nu,0);return n%Ql!==0&&(s-=t.slice(a*Ql,n).reduce(nu,0)),r%Ql!==0&&r!==i&&(s-=t.slice(r,o*Ql).reduce(nu,0)),s}let ou={virtualScrollSliceSize:{type:[Number,String],default:10},virtualScrollSliceRatioBefore:{type:[Number,String],default:1},virtualScrollSliceRatioAfter:{type:[Number,String],default:1},virtualScrollItemSize:{type:[Number,String],default:24},virtualScrollStickySizeStart:{type:[Number,String],default:0},virtualScrollStickySizeEnd:{type:[Number,String],default:0},tableColspan:[Number,String]},su=Object.keys(ou),cu={virtualScrollHorizontal:Boolean,onVirtualScroll:Function,...ou};function lu({virtualScrollLength:t,getVirtualScrollTarget:n,getVirtualScrollEl:r,virtualScrollItemSizeComputed:i}){let{props:a,emit:o,proxy:s}=(0,e.getCurrentInstance)(),{$q:c}=s,l,u,d,f=[],p,m=(0,e.ref)(0),h=(0,e.ref)(0),g=(0,e.ref)({}),_=(0,e.ref)(null),v=(0,e.ref)(null),y=(0,e.ref)(null),b=(0,e.ref)({from:0,to:0}),x=(0,e.computed)(()=>a.tableColspan===void 0?100:a.tableColspan);i===void 0&&(i=(0,e.computed)(()=>a.virtualScrollItemSize));let S=(0,e.computed)(()=>i.value+`;`+a.virtualScrollHorizontal);(0,e.watch)((0,e.computed)(()=>S.value+`;`+a.virtualScrollSliceRatioBefore+`;`+a.virtualScrollSliceRatioAfter),()=>{j()}),(0,e.watch)(S,C);function C(){A(u,!0)}function w(e){A(e===void 0?u:e)}function T(e,i){let o=n();if(o==null||o.nodeType===8)return;let s=ru(o,r(),_.value,v.value,a.virtualScrollHorizontal,c.lang.rtl,a.virtualScrollStickySizeStart,a.virtualScrollStickySizeEnd);d!==s.scrollViewSize&&j(s.scrollViewSize),D(o,s,Math.min(t.value-1,Math.max(0,parseInt(e,10)||0)),0,$l.indexOf(i)===-1?u!==-1&&e>u?`end`:`start`:i)}function E(){let e=n();if(e==null||e.nodeType===8)return;let i=ru(e,r(),_.value,v.value,a.virtualScrollHorizontal,c.lang.rtl,a.virtualScrollStickySizeStart,a.virtualScrollStickySizeEnd),o=t.value-1,s=i.scrollMaxSize-i.offsetStart-i.offsetEnd-h.value;if(l===i.scrollStart)return;if(i.scrollMaxSize<=0){D(e,i,0,0);return}d!==i.scrollViewSize&&j(i.scrollViewSize),O(b.value.from);let u=Math.floor(i.scrollMaxSize-Math.max(i.scrollViewSize,i.offsetEnd)-Math.min(p[o],i.scrollViewSize/2));if(u>0&&Math.ceil(i.scrollStart)>=u){D(e,i,o,i.scrollMaxSize-i.offsetEnd-f.reduce(nu,0));return}let g=0,y=i.scrollStart-i.offsetStart,x=y;if(y<=s&&y+i.scrollViewSize>=m.value)y-=m.value,g=b.value.from,x=y;else for(let e=0;y>=f[e]&&g0&&g-i.scrollViewSize?(g++,x=y):x=p[g]+y;D(e,i,g,x)}function D(e,n,r,i,o){let s=typeof o==`string`&&o.indexOf(`-force`)!==-1,u=s===!0?o.replace(`-force`,``):o,d=u===void 0?`start`:u,_=Math.max(0,r-g.value[d]),v=_+g.value.total;v>t.value&&(v=t.value,_=Math.max(0,v-g.value.total)),l=n.scrollStart;let x=_!==b.value.from||v!==b.value.to;if(x===!1&&u===void 0){P(r);return}let{activeElement:S}=document,C=y.value;x===!0&&C!==null&&C!==S&&C.contains(S)===!0&&(C.addEventListener(`focusout`,k),setTimeout(()=>{C?.removeEventListener(`focusout`,k)})),tu(C,r-_);let w=u===void 0?0:p.slice(_,r).reduce(nu,0);if(x===!0){let e=v>=b.value.from&&_<=b.value.to?b.value.to:v;b.value={from:_,to:e},m.value=au(f,p,0,_),h.value=au(f,p,v,t.value),requestAnimationFrame(()=>{b.value.to!==v&&l===n.scrollStart&&(b.value={from:b.value.from,to:v},h.value=au(f,p,v,t.value))})}requestAnimationFrame(()=>{if(l!==n.scrollStart)return;x===!0&&O(_);let t=p.slice(_,r).reduce(nu,0),o=t+n.offsetStart+m.value,d=o+p[r],f=o+i;if(u!==void 0){let e=t-w,i=n.scrollStart+e;f=s!==!0&&ie.classList&&e.classList.contains(`q-virtual-scroll--skip`)===!1),r=n.length,i=a.virtualScrollHorizontal===!0?e=>e.getBoundingClientRect().width:e=>e.offsetHeight,o=e,s,c;for(let e=0;e=o;e--)p[e]=a;let s=Math.floor((t.value-1)/Ql);f=[];for(let e=0;e<=s;e++){let n=0,r=Math.min((e+1)*Ql,t.value);for(let t=e*Ql;t=0?(O(b.value.from),(0,e.nextTick)(()=>{T(n)})):F()}function j(e){if(e===void 0&&typeof window<`u`){let t=n();t!=null&&t.nodeType!==8&&(e=ru(t,r(),_.value,v.value,a.virtualScrollHorizontal,c.lang.rtl,a.virtualScrollStickySizeStart,a.virtualScrollStickySizeEnd).scrollViewSize)}d=e;let t=parseFloat(a.virtualScrollSliceRatioBefore)||0,o=parseFloat(a.virtualScrollSliceRatioAfter)||0,s=1+t+o,l=e===void 0||e<=0?1:Math.ceil(e/i.value),u=Math.max(1,l,Math.ceil((a.virtualScrollSliceSize>0?a.virtualScrollSliceSize:10)/s));g.value={total:Math.ceil(u*s),start:Math.ceil(u*t),center:Math.ceil(u*(.5+t)),end:Math.ceil(u*(1+t)),view:l}}function M(t,n){let r=a.virtualScrollHorizontal===!0?`width`:`height`,o={[`--q-virtual-scroll-item-`+r]:i.value+`px`};return[t===`tbody`?(0,e.h)(t,{class:`q-virtual-scroll__padding`,key:`before`,ref:_},[(0,e.h)(`tr`,[(0,e.h)(`td`,{style:{[r]:`${m.value}px`,...o},colspan:x.value})])]):(0,e.h)(t,{class:`q-virtual-scroll__padding`,key:`before`,ref:_,style:{[r]:`${m.value}px`,...o}}),(0,e.h)(t,{class:`q-virtual-scroll__content`,key:`content`,ref:y,tabindex:-1},n.flat()),t===`tbody`?(0,e.h)(t,{class:`q-virtual-scroll__padding`,key:`after`,ref:v},[(0,e.h)(`tr`,[(0,e.h)(`td`,{style:{[r]:`${h.value}px`,...o},colspan:x.value})])]):(0,e.h)(t,{class:`q-virtual-scroll__padding`,key:`after`,ref:v,style:{[r]:`${h.value}px`,...o}})]}function P(e){u!==e&&(a.onVirtualScroll!==void 0&&o(`virtualScroll`,{index:e,from:b.value.from,to:b.value.to-1,direction:e{j()});let I=!1;return(0,e.onDeactivated)(()=>{I=!0}),(0,e.onActivated)(()=>{if(I!==!0)return;let e=n();l!==void 0&&e!=null&&e.nodeType!==8?iu(e,l,a.virtualScrollHorizontal,c.lang.rtl):T(u)}),(0,e.onBeforeUnmount)(()=>{F.cancel()}),Object.assign(s,{scrollTo:T,reset:C,refresh:w}),{virtualScrollSliceRange:b,virtualScrollSliceSizeComputed:g,setVirtualScrollSize:j,onVirtualScrollEvt:F,localResetVirtualScroll:A,padVirtualScroll:M,scrollTo:T,reset:C,refresh:w}}let uu=e=>[`add`,`add-unique`,`toggle`].includes(e),du=Object.keys(_c);function fu(e,t){if(typeof e==`function`)return e;let n=e===void 0?t:e;return e=>typeof e==`object`&&e&&n in e?e[n]:e}var pu=h({name:`QSelect`,inheritAttrs:!1,props:{...cu,...ai,..._c,modelValue:{required:!0},multiple:Boolean,displayValue:[String,Number],displayValueHtml:Boolean,dropdownIcon:String,options:{type:Array,default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],hideSelected:Boolean,hideDropdownIcon:Boolean,fillInput:Boolean,maxValues:[Number,String],optionsDense:Boolean,optionsDark:{type:Boolean,default:null},optionsSelectedClass:String,optionsHtml:Boolean,optionsCover:Boolean,menuShrink:Boolean,menuAnchor:String,menuSelf:String,menuOffset:Array,popupContentClass:String,popupContentStyle:[String,Array,Object],popupNoRouteDismiss:Boolean,useInput:Boolean,useChips:Boolean,newValueMode:{type:String,validator:uu},mapOptions:Boolean,emitValue:Boolean,disableTabSelection:Boolean,inputDebounce:{type:[Number,String],default:500},inputClass:[Array,String,Object],inputStyle:[Array,String,Object],tabindex:{type:[String,Number],default:0},autocomplete:String,transitionShow:{},transitionHide:{},transitionDuration:{},behavior:{type:String,validator:e=>[`default`,`menu`,`dialog`].includes(e),default:`default`},virtualScrollItemSize:cu.virtualScrollItemSize.type,onNewValue:Function,onFilter:Function},emits:[...vc,`add`,`remove`,`inputValue`,`keyup`,`keypress`,`keydown`,`popupShow`,`popupHide`,`filterAbort`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=(0,e.ref)(!1),s=(0,e.ref)(!1),c=(0,e.ref)(-1),l=(0,e.ref)(``),u=(0,e.ref)(!1),d=(0,e.ref)(!1),f=null,p=null,m,h,g,_=null,v,y,b,x,S=(0,e.ref)(null),C=(0,e.ref)(null),w=(0,e.ref)(null),T=(0,e.ref)(null),k=(0,e.ref)(null),A=ci(t),j=Qc(ze),M=(0,e.computed)(()=>Array.isArray(t.options)?t.options.length:0),{virtualScrollSliceRange:N,virtualScrollSliceSizeComputed:P,localResetVirtualScroll:F,padVirtualScroll:I,onVirtualScrollEvt:L,scrollTo:R,setVirtualScrollSize:z}=lu({virtualScrollLength:M,getVirtualScrollTarget:Fe,getVirtualScrollEl:Pe,virtualScrollItemSizeComputed:(0,e.computed)(()=>t.virtualScrollItemSize===void 0?t.optionsDense===!0?24:48:t.virtualScrollItemSize)}),B=yc(),H=(0,e.computed)(()=>{let e=t.mapOptions===!0&&t.multiple!==!0,n=t.modelValue!==void 0&&(t.modelValue!==null||e===!0)?t.multiple===!0&&Array.isArray(t.modelValue)?t.modelValue:[t.modelValue]:[];if(t.mapOptions===!0&&Array.isArray(t.options)===!0){let r=t.mapOptions===!0&&m!==void 0?m:[],i=n.map(e=>De(e,r));return t.modelValue===null&&e===!0?i.filter(e=>e!==null):i}return n}),te=(0,e.computed)(()=>{let e={};return du.forEach(n=>{let r=t[n];r!==void 0&&(e[n]=r)}),e}),U=(0,e.computed)(()=>t.optionsDark===null?B.isDark.value:t.optionsDark),ne=(0,e.computed)(()=>hc(H.value)),W=(0,e.computed)(()=>{let e=`q-field__input q-placeholder col`;return t.hideSelected===!0||H.value.length===0?[e,t.inputClass]:(e+=` q-field__input--padding`,t.inputClass===void 0?e:[e,t.inputClass])}),G=(0,e.computed)(()=>(t.virtualScrollHorizontal===!0?`q-virtual-scroll--horizontal`:``)+(t.popupContentClass?` `+t.popupContentClass:``)),re=(0,e.computed)(()=>M.value===0),K=(0,e.computed)(()=>H.value.map(e=>ge.value(e)).join(`, `)),ie=(0,e.computed)(()=>t.displayValue===void 0?K.value:t.displayValue),ae=(0,e.computed)(()=>t.optionsHtml===!0?()=>!0:e=>e?.html===!0),oe=(0,e.computed)(()=>t.displayValueHtml===!0||t.displayValue===void 0&&(t.optionsHtml===!0||H.value.some(ae.value))),se=(0,e.computed)(()=>B.focused.value===!0?t.tabindex:-1),ce=(0,e.computed)(()=>{let e={tabindex:t.tabindex,role:`combobox`,"aria-label":t.label,"aria-readonly":t.readonly===!0?`true`:`false`,"aria-autocomplete":t.useInput===!0?`list`:`none`,"aria-expanded":o.value===!0?`true`:`false`,"aria-controls":`${B.targetUid.value}_lb`};return c.value>=0&&(e[`aria-activedescendant`]=`${B.targetUid.value}_${c.value}`),e}),le=(0,e.computed)(()=>({id:`${B.targetUid.value}_lb`,role:`listbox`,"aria-multiselectable":t.multiple===!0?`true`:`false`})),ue=(0,e.computed)(()=>H.value.map((e,t)=>({index:t,opt:e,html:ae.value(e),selected:!0,removeAtIndex:Se,toggleOption:we,tabindex:se.value}))),de=(0,e.computed)(()=>{if(M.value===0)return[];let{from:e,to:n}=N.value;return t.options.slice(e,n).map((n,r)=>{let i=_e.value(n)===!0,s=Oe(n)===!0,l=e+r,u={clickable:!0,active:s,activeClass:me.value,manualFocus:!0,focused:!1,disable:i,tabindex:-1,dense:t.optionsDense,dark:U.value,role:`option`,"aria-selected":s===!0?`true`:`false`,id:`${B.targetUid.value}_${l}`,onClick:()=>{we(n)}};return i!==!0&&(c.value===l&&(u.focused=!0),a.platform.is.desktop===!0&&(u.onMousemove=()=>{o.value===!0&&Te(l)})),{index:l,opt:n,html:ae.value(n),label:ge.value(n),selected:u.active,focused:u.focused,toggleOption:we,setOptionIndex:Te,itemProps:u}})}),fe=(0,e.computed)(()=>t.dropdownIcon===void 0?a.iconSet.arrow.dropdown:t.dropdownIcon),pe=(0,e.computed)(()=>t.optionsCover===!1&&t.outlined!==!0&&t.standout!==!0&&t.borderless!==!0&&t.rounded!==!0),me=(0,e.computed)(()=>t.optionsSelectedClass===void 0?t.color===void 0?``:`text-${t.color}`:t.optionsSelectedClass),he=(0,e.computed)(()=>fu(t.optionValue,`value`)),ge=(0,e.computed)(()=>fu(t.optionLabel,`label`)),_e=(0,e.computed)(()=>fu(t.optionDisable,`disable`)),q=(0,e.computed)(()=>H.value.map(he.value)),ve=(0,e.computed)(()=>{let e={onInput:ze,onChange:j,onKeydown:Ne,onKeyup:je,onKeypress:Me,onFocus:ke,onClick(e){h===!0&&E(e)}};return e.onCompositionstart=e.onCompositionupdate=e.onCompositionend=j,e});(0,e.watch)(H,e=>{m=e,t.useInput===!0&&t.fillInput===!0&&t.multiple!==!0&&B.innerLoading.value!==!0&&(s.value!==!0&&o.value!==!0||ne.value!==!0)&&(g!==!0&&tt(),(s.value===!0||o.value===!0)&&He(``))},{immediate:!0}),(0,e.watch)(()=>t.fillInput,tt),(0,e.watch)(o,nt),(0,e.watch)(M,rt);function ye(e){return t.emitValue===!0?he.value(e):e}function be(e){if(e!==-1&&e=t.maxValues)return;let a=t.modelValue.slice();r(`add`,{index:a.length,value:i}),a.push(i),r(`update:modelValue`,a)}function we(e,n){if(B.editable.value!==!0||e===void 0||_e.value(e)===!0)return;let i=he.value(e);if(t.multiple!==!0){n!==!0&&(Ve(t.fillInput===!0?ge.value(e):``,!0,!0),et()),C.value?.focus(),(H.value.length===0||xe(he.value(H.value[0]),i)!==!0)&&r(`update:modelValue`,t.emitValue===!0?i:e);return}if((h!==!0||u.value===!0)&&B.focus(),ke(),H.value.length===0){let n=t.emitValue===!0?i:e;r(`add`,{index:0,value:n}),r(`update:modelValue`,t.multiple===!0?[n]:n);return}let a=t.modelValue.slice(),o=q.value.findIndex(e=>xe(e,i));if(o!==-1)r(`remove`,{index:o,value:a.splice(o,1)[0]});else{if(t.maxValues!==void 0&&a.length>=t.maxValues)return;let n=t.emitValue===!0?i:e;r(`add`,{index:a.length,value:n}),a.push(n)}r(`update:modelValue`,a)}function Te(e){if(a.platform.is.desktop!==!0)return;let t=e!==-1&&e=0?ge.value(t.options[r]):v,!0))}}function De(e,n){let r=t=>xe(he.value(t),e);return t.options.find(r)||n.find(r)||e}function Oe(e){let t=he.value(e);return q.value.find(e=>xe(e,t))!==void 0}function ke(e){t.useInput===!0&&C.value!==null&&(e===void 0||C.value===e.target&&e.target.value===K.value)&&C.value.select()}function Ae(e){V(e,27)===!0&&o.value===!0&&(E(e),et(),tt()),r(`keyup`,e)}function je(e){let{value:n}=e.target;if(e.keyCode!==void 0){Ae(e);return}if(e.target.value=``,f!==null&&(clearTimeout(f),f=null),p!==null&&(clearTimeout(p),p=null),tt(),typeof n==`string`&&n.length!==0){let e=n.toLocaleLowerCase(),r=n=>{let r=t.options.find(t=>String(n.value(t)).toLocaleLowerCase()===e);return r===void 0?!1:(H.value.indexOf(r)===-1?we(r):et(),!0)},i=e=>{r(he)!==!0&&e!==!0&&r(ge)!==!0&&He(n,!0,()=>i(!0))};i()}else B.clearValue(e)}function Me(e){r(`keypress`,e)}function Ne(n){if(r(`keydown`,n),ee(n)===!0)return;let i=l.value.length!==0&&(t.newValueMode!==void 0||t.onNewValue!==void 0),a=n.shiftKey!==!0&&t.disableTabSelection!==!0&&t.multiple!==!0&&(c.value!==-1||i===!0);if(n.keyCode===27){D(n);return}if(n.keyCode===9&&a===!1){Ze();return}if(n.target===void 0||n.target.id!==B.targetUid.value||B.editable.value!==!0)return;if(n.keyCode===40&&B.innerLoading.value!==!0&&o.value===!1){O(n),$e();return}if(n.keyCode===8&&(t.useChips===!0||t.clearable===!0)&&t.hideSelected!==!0&&l.value.length===0){t.multiple===!0&&Array.isArray(t.modelValue)===!0?be(t.modelValue.length-1):t.multiple!==!0&&t.modelValue!==null&&r(`update:modelValue`,null);return}(n.keyCode===35||n.keyCode===36)&&(typeof l.value!=`string`||l.value.length===0)&&(O(n),c.value=-1,Ee(n.keyCode===36?1:-1,t.multiple)),(n.keyCode===33||n.keyCode===34)&&P.value!==void 0&&(O(n),c.value=Math.max(-1,Math.min(M.value,c.value+(n.keyCode===33?-1:1)*P.value.view)),Ee(n.keyCode===33?1:-1,t.multiple)),(n.keyCode===38||n.keyCode===40)&&(O(n),Ee(n.keyCode===38?-1:1,t.multiple));let s=M.value;if((b===void 0||x0&&t.useInput!==!0&&n.key!==void 0&&n.key.length===1&&n.altKey===!1&&n.ctrlKey===!1&&n.metaKey===!1&&(n.keyCode!==32||b.length!==0)){o.value!==!0&&$e(n);let r=n.key.toLocaleLowerCase(),i=b.length===1&&b[0]===r;x=Date.now()+1500,i===!1&&(O(n),b+=r);let a=RegExp(`^`+b.split(``).map(e=>".*+?^${}()|[]\\".indexOf(e)===-1?e:`\\`+e).join(`.*`),`i`),l=c.value;if(i===!0||l<0||a.test(ge.value(t.options[l]))!==!0)do l=Ie(l+1,-1,s-1);while(l!==c.value&&(_e.value(t.options[l])===!0||a.test(ge.value(t.options[l]))!==!0));c.value!==l&&(0,e.nextTick)(()=>{Te(l),R(l),l>=0&&t.useInput===!0&&t.fillInput===!0&&Be(ge.value(t.options[l]),!0)});return}if(!(n.keyCode!==13&&(n.keyCode!==32||t.useInput===!0||b!==``)&&(n.keyCode!==9||a===!1))){if(n.keyCode!==9&&O(n),c.value!==-1&&c.value{if(n){if(uu(n)!==!0)return}else n=t.newValueMode;Ve(``,t.multiple!==!0,!0),e!=null&&((n===`toggle`?we:Ce)(e,n===`add-unique`),t.multiple!==!0&&(C.value?.focus(),et()))};if(t.onNewValue===void 0?e(l.value):r(`newValue`,l.value,e),t.multiple!==!0)return}o.value===!0?Ze():B.innerLoading.value!==!0&&$e()}}function Pe(){return h===!0?k.value:w.value!==null&&w.value.contentEl!==null?w.value.contentEl:void 0}function Fe(){return Pe()}function J(){return t.hideSelected===!0?[]:n[`selected-item`]===void 0?n.selected===void 0?t.useChips===!0?ue.value.map((n,r)=>(0,e.h)(Wi,{key:`option-`+r,removable:B.editable.value===!0&&_e.value(n.opt)!==!0,dense:!0,textColor:t.color,tabindex:se.value,onRemove(){n.removeAtIndex(r)}},()=>(0,e.h)(`span`,{class:`ellipsis`,[n.html===!0?`innerHTML`:`textContent`]:ge.value(n.opt)}))):[(0,e.h)(`span`,{class:`ellipsis`,[oe.value===!0?`innerHTML`:`textContent`]:ie.value})]:[].concat(n.selected()):ue.value.map(e=>n[`selected-item`](e)).slice()}function Le(){if(re.value===!0)return n[`no-option`]===void 0?void 0:n[`no-option`]({inputValue:l.value});let t=n.option===void 0?t=>(0,e.h)(js,{key:t.index,...t.itemProps},()=>(0,e.h)(Ms,()=>(0,e.h)(Js,()=>(0,e.h)(`span`,{[t.html===!0?`innerHTML`:`textContent`]:t.label})))):n.option,r=I(`div`,de.value.map(t));return n[`before-options`]!==void 0&&(r=n[`before-options`]().concat(r)),Qe(n[`after-options`],r)}function Re(n,r){let i=r===!0?{...ce.value,...B.splitAttrs.attributes.value}:void 0,a={ref:r===!0?C:void 0,key:`i_t`,class:W.value,style:t.inputStyle,value:l.value===void 0?``:l.value,type:`search`,...i,id:r===!0?B.targetUid.value:void 0,maxlength:t.maxlength,autocomplete:t.autocomplete,"data-autofocus":n===!0||t.autofocus===!0||void 0,disabled:t.disable===!0,readonly:t.readonly===!0,...ve.value};return n!==!0&&h===!0&&(Array.isArray(a.class)===!0?a.class=[...a.class,`no-pointer-events`]:a.class+=` no-pointer-events`),(0,e.h)(`input`,a)}function ze(e){f!==null&&(clearTimeout(f),f=null),p!==null&&(clearTimeout(p),p=null),!(e&&e.target&&e.target.qComposing===!0)&&(Be(e.target.value||``),g=!0,v=l.value,B.focused.value!==!0&&(h!==!0||u.value===!0)&&B.focus(),t.onFilter!==void 0&&(f=setTimeout(()=>{f=null,He(l.value)},t.inputDebounce)))}function Be(e,n){l.value!==e&&(l.value=e,n===!0||t.inputDebounce===0||t.inputDebounce===`0`?r(`inputValue`,e):p=setTimeout(()=>{p=null,r(`inputValue`,e)},t.inputDebounce))}function Ve(e,n,r){g=r!==!0,t.useInput===!0&&(Be(e,!0),(n===!0||r!==!0)&&(v=e),n!==!0&&He(e))}function He(n,a,s){if(t.onFilter===void 0||a!==!0&&B.focused.value!==!0)return;B.innerLoading.value===!0?r(`filterAbort`):(B.innerLoading.value=!0,d.value=!0),n!==``&&t.multiple!==!0&&H.value.length!==0&&g!==!0&&n===ge.value(H.value[0])&&(n=``);let c=setTimeout(()=>{o.value===!0&&(o.value=!1)},10);_!==null&&clearTimeout(_),_=c,r(`filter`,n,(t,n)=>{(a===!0||B.focused.value===!0)&&_===c&&(clearTimeout(_),typeof t==`function`&&t(),d.value=!1,(0,e.nextTick)(()=>{B.innerLoading.value=!1,B.editable.value===!0&&(a===!0?o.value===!0&&et():o.value===!0?nt(!0):o.value=!0),typeof n==`function`&&(0,e.nextTick)(()=>{n(i)}),typeof s==`function`&&(0,e.nextTick)(()=>{s(i)})}))},()=>{B.focused.value===!0&&_===c&&(clearTimeout(_),B.innerLoading.value=!1,d.value=!1),o.value===!0&&(o.value=!1)})}function Ue(){return(0,e.h)(Kr,{ref:w,class:G.value,style:t.popupContentStyle,modelValue:o.value,fit:t.menuShrink!==!0,cover:t.optionsCover===!0&&re.value!==!0&&t.useInput!==!0,anchor:t.menuAnchor,self:t.menuSelf,offset:t.menuOffset,dark:U.value,noParentEvent:!0,noRefocus:!0,noFocus:!0,noRouteDismiss:t.popupNoRouteDismiss,square:pe.value,transitionShow:t.transitionShow,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,separateClosePopup:!0,...le.value,onScrollPassive:L,onBeforeShow:at,onBeforeHide:We,onShow:Ge},Le)}function We(e){ot(e),Ze()}function Ge(){z()}function Ke(e){E(e),C.value?.focus(),u.value=!0,window.scrollTo(window.pageXOffset||window.scrollX||document.body.scrollLeft||0,0)}function qe(t){E(t),(0,e.nextTick)(()=>{u.value=!1})}function Je(){let r=[(0,e.h)(xc,{class:`col-auto ${B.fieldClass.value}`,...te.value,for:B.targetUid.value,dark:U.value,square:!0,loading:d.value,itemAligned:!1,filled:!0,stackLabel:l.value.length!==0,...B.splitAttrs.listeners.value,onFocus:Ke,onBlur:qe},{...n,rawControl:()=>B.getControl(!0),before:void 0,after:void 0})];return o.value===!0&&r.push((0,e.h)(`div`,{ref:k,class:G.value+` scroll`,style:t.popupContentStyle,...le.value,onClick:D,onScrollPassive:L},Le())),(0,e.h)(Cs,{ref:T,modelValue:s.value,position:t.useInput===!0?`top`:void 0,transitionShow:y,transitionHide:t.transitionHide,transitionDuration:t.transitionDuration,noRouteDismiss:t.popupNoRouteDismiss,onBeforeShow:at,onBeforeHide:Ye,onHide:Xe,onShow:Y},()=>(0,e.h)(`div`,{class:`q-select__dialog`+(U.value===!0?` q-select__dialog--dark q-dark`:``)+(u.value===!0?` q-select__dialog--focused`:``)},r))}function Ye(e){ot(e),T.value!==null&&T.value.__updateRefocusTarget(B.rootRef.value.querySelector(`.q-field__native > [tabindex]:last-child`)),B.focused.value=!1}function Xe(e){et(),B.focused.value===!1&&r(`blur`,e),tt()}function Y(){let e=document.activeElement;(e===null||e.id!==B.targetUid.value)&&C.value!==null&&C.value!==e&&C.value.focus(),z()}function Ze(){s.value!==!0&&(c.value=-1,o.value===!0&&(o.value=!1),B.focused.value===!1&&(_!==null&&(clearTimeout(_),_=null),B.innerLoading.value===!0&&(r(`filterAbort`),B.innerLoading.value=!1,d.value=!1)))}function $e(r){B.editable.value===!0&&(h===!0?(B.onControlFocusin(r),s.value=!0,(0,e.nextTick)(()=>{B.focus()})):B.focus(),t.onFilter===void 0?(re.value!==!0||n[`no-option`]!==void 0)&&(o.value=!0):He(l.value))}function et(){s.value=!1,Ze()}function tt(){t.useInput===!0&&Ve(t.multiple!==!0&&t.fillInput===!0&&H.value.length!==0&&ge.value(H.value[0])||``,!0,!0)}function nt(e){let n=-1;if(e===!0){if(H.value.length!==0){let e=he.value(H.value[0]);n=t.options.findIndex(t=>xe(he.value(t),e))}F(n)}Te(n)}function rt(t,n){o.value===!0&&B.innerLoading.value===!1&&(F(-1,!0),(0,e.nextTick)(()=>{o.value===!0&&B.innerLoading.value===!1&&(t>n?F():nt(!0))}))}function it(){s.value===!1&&w.value!==null&&w.value.updatePosition()}function at(e){e!==void 0&&E(e),r(`popupShow`,e),B.hasPopupOpen=!0,B.onControlFocusin(e)}function ot(e){e!==void 0&&E(e),r(`popupHide`,e),B.hasPopupOpen=!1,B.onControlFocusout(e)}function st(){h=a.platform.is.mobile!==!0&&t.behavior!==`dialog`?!1:t.behavior!==`menu`&&(t.useInput===!0?n[`no-option`]!==void 0||t.onFilter!==void 0||re.value===!1:!0),y=a.platform.is.ios===!0&&h===!0&&t.useInput===!0?`fade`:t.transitionShow}return(0,e.onBeforeUpdate)(st),(0,e.onUpdated)(it),st(),(0,e.onBeforeUnmount)(()=>{f!==null&&clearTimeout(f),p!==null&&clearTimeout(p)}),Object.assign(i,{showPopup:$e,hidePopup:et,removeAtIndex:be,add:Ce,toggleOption:we,getOptionIndex:()=>c.value,setOptionIndex:Te,moveOptionSelection:Ee,filter:He,updateMenuPosition:it,updateInputValue:Ve,isOptionSelected:Oe,getEmittingOptionValue:ye,isOptionDisabled:(...e)=>_e.value.apply(null,e)===!0,getOptionValue:(...e)=>he.value.apply(null,e),getOptionLabel:(...e)=>ge.value.apply(null,e)}),Object.assign(B,{innerValue:H,fieldClass:(0,e.computed)(()=>`q-select q-field--auto-height q-select--with${t.useInput===!0?``:`out`}-input q-select--with${t.useChips===!0?``:`out`}-chips q-select--${t.multiple===!0?`multiple`:`single`}`),inputRef:S,targetRef:C,hasValue:ne,showPopup:$e,floatingLabel:(0,e.computed)(()=>t.hideSelected!==!0&&ne.value===!0||typeof l.value==`number`||l.value.length!==0||hc(t.displayValue)),getControlChild:()=>{if(B.editable.value!==!1&&(s.value===!0||re.value!==!0||n[`no-option`]!==void 0))return h===!0?Je():Ue();B.hasPopupOpen===!0&&(B.hasPopupOpen=!1)},controlEvents:{onFocusin(e){B.onControlFocusin(e)},onFocusout(e){B.onControlFocusout(e,()=>{tt(),Ze()})},onClick(e){if(D(e),h!==!0&&o.value===!0){Ze(),C.value?.focus();return}$e(e)}},getControl:n=>{let r=J(),i=n===!0||s.value!==!0||h!==!0;if(t.useInput===!0)r.push(Re(n,i));else if(B.editable.value===!0){let a=i===!0?ce.value:void 0;r.push((0,e.h)(`input`,{ref:i===!0?C:void 0,key:`d_t`,class:`q-select__focus-target`,id:i===!0?B.targetUid.value:void 0,value:ie.value,readonly:!0,"data-autofocus":n===!0||t.autofocus===!0||void 0,...a,onKeydown:Ne,onKeyup:Ae,onKeypress:Me})),i===!0&&typeof t.autocomplete==`string`&&t.autocomplete.length!==0&&r.push((0,e.h)(`input`,{class:`q-select__autocomplete-input`,autocomplete:t.autocomplete,tabindex:-1,onKeyup:je}))}if(A.value!==void 0&&t.disable!==!0&&q.value.length!==0){let n=q.value.map(t=>(0,e.h)(`option`,{value:t,selected:!0}));r.push((0,e.h)(`select`,{class:`hidden`,name:A.value,multiple:t.multiple},n))}return(0,e.h)(`div`,{class:`q-field__native row items-center`,...t.useInput===!0||i!==!0?void 0:B.splitAttrs.attributes.value,...B.splitAttrs.listeners.value},r)},getInnerAppend:()=>t.loading!==!0&&d.value!==!0&&t.hideDropdownIcon!==!0?[(0,e.h)(X,{class:`q-select__dropdown-icon`+(o.value===!0?` rotate-180`:``),name:fe.value})]:null}),bc(B)}});let mu=[`text`,`rect`,`circle`,`QBtn`,`QBadge`,`QChip`,`QToolbar`,`QCheckbox`,`QRadio`,`QToggle`,`QSlider`,`QRange`,`QInput`,`QAvatar`],hu=[`wave`,`pulse`,`pulse-x`,`pulse-y`,`fade`,`blink`,`none`];var gu=h({name:`QSkeleton`,props:{...Z,tag:{type:String,default:`div`},type:{type:String,validator:e=>mu.includes(e),default:`rect`},animation:{type:String,validator:e=>hu.includes(e),default:`wave`},animationSpeed:{type:[String,Number],default:1500},square:Boolean,bordered:Boolean,size:String,width:String,height:String},setup(t,{slots:n}){let r=Q(t,(0,e.getCurrentInstance)().proxy.$q),i=(0,e.computed)(()=>{let e=t.size===void 0?[t.width,t.height]:[t.size,t.size];return{"--q-skeleton-speed":`${t.animationSpeed}ms`,width:e[0],height:e[1]}}),a=(0,e.computed)(()=>`q-skeleton q-skeleton--${r.value===!0?`dark`:`light`} q-skeleton--type-${t.type}`+(t.animation===`none`?``:` q-skeleton--anim q-skeleton--anim-${t.animation}`)+(t.square===!0?` q-skeleton--square`:``)+(t.bordered===!0?` q-skeleton--bordered`:``));return()=>(0,e.h)(t.tag,{class:a.value,style:i.value},Y(n.default))}});let _u=[[`left`,`center`,`start`,`width`],[`right`,`center`,`end`,`width`],[`top`,`start`,`center`,`height`],[`bottom`,`end`,`center`,`height`]];var vu=h({name:`QSlideItem`,props:{...Z,leftColor:String,rightColor:String,topColor:String,bottomColor:String,onSlide:Function},emits:[`action`,`top`,`right`,`bottom`,`left`],setup(t,{slots:n,emit:r}){let{proxy:i}=(0,e.getCurrentInstance)(),{$q:a}=i,o=Q(t,a),{getCache:s}=bi(),c=(0,e.ref)(null),l=null,u={},d={},f={},p=(0,e.computed)(()=>a.lang.rtl===!0?{left:`right`,right:`left`}:{left:`left`,right:`right`}),m=(0,e.computed)(()=>`q-slide-item q-item-type overflow-hidden`+(o.value===!0?` q-slide-item--dark q-dark`:``));function h(){c.value.style.transform=`translate(0,0)`}function g(e,n,i){t.onSlide!==void 0&&r(`slide`,{side:e,ratio:n,isReset:i})}function _(e){let t=c.value;if(e.isFirst)u={dir:null,size:{left:0,right:0,top:0,bottom:0},scale:0},t.classList.add(`no-transition`),_u.forEach(e=>{if(n[e[0]]!==void 0){let t=f[e[0]];t.style.transform=`scale(1)`,u.size[e[0]]=t.getBoundingClientRect()[e[3]]}}),u.axis=e.direction===`up`||e.direction===`down`?`Y`:`X`;else if(e.isFinal){t.classList.remove(`no-transition`),u.scale===1?(t.style.transform=`translate${u.axis}(${u.dir*100}%)`,l!==null&&clearTimeout(l),l=setTimeout(()=>{l=null,r(u.showing,{reset:h}),r(`action`,{side:u.showing,reset:h})},230)):(t.style.transform=`translate(0,0)`,g(u.showing,0,!0));return}else e.direction=u.axis===`X`?e.offset.x<0?`left`:`right`:e.offset.y<0?`up`:`down`;if(n.left===void 0&&e.direction===p.value.right||n.right===void 0&&e.direction===p.value.left||n.top===void 0&&e.direction===`down`||n.bottom===void 0&&e.direction===`up`){t.style.transform=`translate(0,0)`;return}let i,a,o;u.axis===`X`?(a=e.direction===`left`?-1:1,i=a===1?p.value.left:p.value.right,o=e.distance.x):(a=e.direction===`up`?-2:2,i=a===2?`top`:`bottom`,o=e.distance.y),!(u.dir!==null&&Math.abs(a)!==Math.abs(u.dir))&&(u.dir!==a&&([`left`,`right`,`top`,`bottom`].forEach(e=>{d[e]&&(d[e].style.visibility=i===e?`visible`:`hidden`)}),u.showing=i,u.dir=a),u.scale=Math.max(0,Math.min(1,(o-40)/u.size[i])),t.style.transform=`translate${u.axis}(${o*a/Math.abs(a)}px)`,f[i].style.transform=`scale(${u.scale})`,g(i,u.scale,!1))}return(0,e.onBeforeUpdate)(()=>{d={},f={}}),(0,e.onBeforeUnmount)(()=>{l!==null&&clearTimeout(l)}),Object.assign(i,{reset:h}),()=>{let r=[],i={left:n[p.value.right]!==void 0,right:n[p.value.left]!==void 0,up:n.bottom!==void 0,down:n.top!==void 0},a=Object.keys(i).filter(e=>i[e]===!0);_u.forEach(i=>{let a=i[0];n[a]!==void 0&&r.push((0,e.h)(`div`,{key:a,ref:e=>{d[a]=e},class:`q-slide-item__${a} absolute-full row no-wrap items-${i[1]} justify-${i[2]}`+(t[a+`Color`]===void 0?``:` bg-${t[a+`Color`]}`)},[(0,e.h)(`div`,{ref:e=>{f[a]=e}},n[a]())]))});let o=(0,e.h)(`div`,{key:`${a.length===0?`only-`:``} content`,ref:c,class:`q-slide-item__content`},Y(n.default));return a.length===0?r.push(o):r.push((0,e.withDirectives)(o,s(`dir#`+a.join(``),()=>{let e={prevent:!0,stop:!0,mouse:!0};return a.forEach(t=>{e[t]=!0}),[[Zi,_,void 0,e]]}))),(0,e.h)(`div`,{class:m.value},r)}}}),yu=h({name:`QSpace`,setup(){let t=(0,e.h)(`div`,{class:`q-space`});return()=>t}}),bu=h({name:`QSpinnerAudio`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,fill:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 55 80`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),xu=h({name:`QSpinnerBall`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,stroke:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 57 57`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Su=h({name:`QSpinnerBars`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,fill:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 135 140`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Cu=h({name:`QSpinnerBox`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),wu=h({name:`QSpinnerClock`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Tu=h({name:`QSpinnerComment`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,innerHTML:``})}}),Eu=h({name:`QSpinnerCube`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,innerHTML:``})}}),Du=h({name:`QSpinnerDots`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,fill:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 120 30`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Ou=h({name:`QSpinnerFacebook`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,xmlns:`http://www.w3.org/2000/svg`,preserveAspectRatio:`xMidYMid`,innerHTML:``})}}),ku=h({name:`QSpinnerGears`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Au=h({name:`QSpinnerGrid`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,fill:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 105 105`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),ju=h({name:`QSpinnerHearts`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,fill:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 140 64`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Mu=h({name:`QSpinnerHourglass`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Nu=h({name:`QSpinnerInfinity`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,innerHTML:``})}}),Pu=h({name:`QSpinnerIos`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,stroke:`currentColor`,fill:`currentColor`,viewBox:`0 0 64 64`,innerHTML:``})}}),Fu=h({name:`QSpinnerOrbit`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Iu=h({name:`QSpinnerOval`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,stroke:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 38 38`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Lu=h({name:`QSpinnerPie`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Ru=h({name:`QSpinnerPuff`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,stroke:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 44 44`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),zu=h({name:`QSpinnerRadio`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 100 100`,preserveAspectRatio:`xMidYMid`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Bu=h({name:`QSpinnerRings`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,stroke:`currentColor`,width:n.value,height:n.value,viewBox:`0 0 45 45`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Vu=h({name:`QSpinnerTail`,props:Vt,setup(t){let{cSize:n,classes:r}=Ht(t);return()=>(0,e.h)(`svg`,{class:r.value,width:n.value,height:n.value,viewBox:`0 0 38 38`,xmlns:`http://www.w3.org/2000/svg`,innerHTML:``})}}),Hu=h({name:`QSplitter`,props:{...Z,modelValue:{type:Number,required:!0},reverse:Boolean,unit:{type:String,default:`%`,validator:e=>[`%`,`px`].includes(e)},limits:{type:Array,validator:e=>e.length!==2||typeof e[0]!=`number`||typeof e[1]!=`number`?!1:e[0]>=0&&e[0]<=e[1]},emitImmediately:Boolean,horizontal:Boolean,disable:Boolean,beforeClass:[Array,String,Object],afterClass:[Array,String,Object],separatorClass:[Array,String,Object],separatorStyle:[Array,String,Object]},emits:[`update:modelValue`],setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=Q(t,i),o=(0,e.ref)(null),s={before:(0,e.ref)(null),after:(0,e.ref)(null)},c=(0,e.computed)(()=>`q-splitter no-wrap ${t.horizontal===!0?`q-splitter--horizontal column`:`q-splitter--vertical row`} q-splitter--${t.disable===!0?`disabled`:`workable`}`+(a.value===!0?` q-splitter--dark`:``)),l=(0,e.computed)(()=>t.horizontal===!0?`height`:`width`),u=(0,e.computed)(()=>t.reverse===!0?`after`:`before`),d=(0,e.computed)(()=>t.limits===void 0?t.unit===`%`?[10,90]:[50,1/0]:t.limits);function f(e){return(t.unit===`%`?e:Math.round(e))+t.unit}let p=(0,e.computed)(()=>({[u.value]:{[l.value]:f(t.modelValue)}})),m,h,g,_,v;function y(e){if(e.isFirst===!0){let e=o.value.getBoundingClientRect()[l.value];m=t.horizontal===!0?`up`:`left`,h=t.unit===`%`?100:e,g=Math.min(h,d.value[1],Math.max(d.value[0],t.modelValue)),_=(t.reverse===!0?-1:1)*(t.horizontal===!0?1:i.lang.rtl===!0?-1:1)*(t.unit===`%`?e===0?0:100/e:1),o.value.classList.add(`q-splitter--active`);return}if(e.isFinal===!0){v!==t.modelValue&&r(`update:modelValue`,v),o.value.classList.remove(`q-splitter--active`);return}let n=g+_*(e.direction===m?-1:1)*e.distance[t.horizontal===!0?`y`:`x`];v=Math.min(h,d.value[1],Math.max(d.value[0],n)),s[u.value].value.style[l.value]=f(v),t.emitImmediately===!0&&t.modelValue!==v&&r(`update:modelValue`,v)}let b=(0,e.computed)(()=>[[Zi,y,void 0,{[t.horizontal===!0?`vertical`:`horizontal`]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]);function x(e,t){et[1]&&r(`update:modelValue`,t[1])}return(0,e.watch)(()=>t.modelValue,e=>{x(e,d.value)}),(0,e.watch)(()=>t.limits,()=>{(0,e.nextTick)(()=>{x(t.modelValue,d.value)})}),()=>{let r=[(0,e.h)(`div`,{ref:s.before,class:[`q-splitter__panel q-splitter__before`+(t.reverse===!0?` col`:``),t.beforeClass],style:p.value.before},Y(n.before)),(0,e.h)(`div`,{class:[`q-splitter__separator`,t.separatorClass],style:t.separatorStyle,"aria-disabled":t.disable===!0?`true`:void 0},[et(`div`,{class:`q-splitter__separator-area absolute-full`},Y(n.separator),`sep`,t.disable!==!0,()=>b.value)]),(0,e.h)(`div`,{ref:s.after,class:[`q-splitter__panel q-splitter__after`+(t.reverse===!0?``:` col`),t.afterClass],style:p.value.after},Y(n.after))];return(0,e.h)(`div`,{class:c.value,ref:o},Qe(n.default,r))}}}),Uu=h({name:`StepHeader`,props:{stepper:{},step:{},goToPanel:Function},setup(t,{attrs:n}){let{proxy:{$q:r}}=(0,e.getCurrentInstance)(),i=(0,e.ref)(null),a=(0,e.computed)(()=>t.stepper.modelValue===t.step.name),o=(0,e.computed)(()=>{let e=t.step.disable;return e===!0||e===``}),s=(0,e.computed)(()=>{let e=t.step.error;return e===!0||e===``}),c=(0,e.computed)(()=>{let e=t.step.done;return o.value===!1&&(e===!0||e===``)}),l=(0,e.computed)(()=>{let e=t.step.headerNav,n=e===!0||e===``||e===void 0;return o.value===!1&&t.stepper.headerNav&&n}),u=(0,e.computed)(()=>t.step.prefix&&(a.value===!1||t.stepper.activeIcon===`none`)&&(s.value===!1||t.stepper.errorIcon===`none`)&&(c.value===!1||t.stepper.doneIcon===`none`)),d=(0,e.computed)(()=>{let e=t.step.icon||t.stepper.inactiveIcon;if(a.value===!0){let n=t.step.activeIcon||t.stepper.activeIcon;return n===`none`?e:n||r.iconSet.stepper.active}if(s.value===!0){let n=t.step.errorIcon||t.stepper.errorIcon;return n===`none`?e:n||r.iconSet.stepper.error}if(o.value===!1&&c.value===!0){let n=t.step.doneIcon||t.stepper.doneIcon;return n===`none`?e:n||r.iconSet.stepper.done}return e}),f=(0,e.computed)(()=>{let e=s.value===!0?t.step.errorColor||t.stepper.errorColor:void 0;if(a.value===!0){let n=t.step.activeColor||t.stepper.activeColor||t.step.color;return n===void 0?e:n}return e===void 0?o.value===!1&&c.value===!0?t.step.doneColor||t.stepper.doneColor||t.step.color||t.stepper.inactiveColor:t.step.color||t.stepper.inactiveColor:e}),p=(0,e.computed)(()=>`q-stepper__tab col-grow flex items-center no-wrap relative-position`+(f.value===void 0?``:` text-${f.value}`)+(s.value===!0?` q-stepper__tab--error q-stepper__tab--error-with-`+(u.value===!0?`prefix`:`icon`):``)+(a.value===!0?` q-stepper__tab--active`:``)+(c.value===!0?` q-stepper__tab--done`:``)+(l.value===!0?` q-stepper__tab--navigation q-focusable q-hoverable`:``)+(o.value===!0?` q-stepper__tab--disabled`:``)),m=(0,e.computed)(()=>t.stepper.headerNav===!0?l.value:!1);function h(){i.value?.focus(),a.value===!1&&t.goToPanel(t.step.name)}function g(e){e.keyCode===13&&a.value===!1&&t.goToPanel(t.step.name)}return()=>{let r={class:p.value};l.value===!0&&(r.onClick=h,r.onKeyup=g,Object.assign(r,o.value===!0?{tabindex:-1,"aria-disabled":`true`}:{tabindex:n.tabindex||0}));let a=[(0,e.h)(`div`,{class:`q-focus-helper`,tabindex:-1,ref:i}),(0,e.h)(`div`,{class:`q-stepper__dot row flex-center q-stepper__line relative-position`},[(0,e.h)(`span`,{class:`row flex-center`},[u.value===!0?t.step.prefix:(0,e.h)(X,{name:d.value})])])];if(t.step.title!==void 0&&t.step.title!==null){let n=[(0,e.h)(`div`,{class:`q-stepper__title`},t.step.title)];t.step.caption!==void 0&&t.step.caption!==null&&n.push((0,e.h)(`div`,{class:`q-stepper__caption`},t.step.caption)),a.push((0,e.h)(`div`,{class:`q-stepper__label q-stepper__line relative-position`},n))}return(0,e.withDirectives)((0,e.h)(`div`,r,a),[[rn,m.value]])}}});function Wu(t){return(0,e.h)(`div`,{class:`q-stepper__step-content`},[(0,e.h)(`div`,{class:`q-stepper__step-inner`},Y(t.default))])}let Gu={setup(e,{slots:t}){return()=>Wu(t)}};var Ku=h({name:`QStep`,props:{...xi,icon:String,color:String,title:{type:String,required:!0},caption:String,prefix:[String,Number],doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String,headerNav:{type:Boolean,default:!0},done:Boolean,error:Boolean,onScroll:[Function,Array]},setup(t,{slots:n,emit:r}){let{proxy:{$q:i}}=(0,e.getCurrentInstance)(),a=(0,e.inject)(fe,q);if(a===q)return console.error(`QStep needs to be a child of QStepper`),q;let{getCache:o}=bi(),s=(0,e.ref)(null),c=(0,e.computed)(()=>a.value.modelValue===t.name),l=(0,e.computed)(()=>i.platform.is.ios!==!0&&i.platform.is.chrome===!0||c.value!==!0||a.value.vertical!==!0?{}:{onScroll(e){let{target:n}=e;n.scrollTop>0&&(n.scrollTop=0),t.onScroll!==void 0&&r(`scroll`,e)}}),u=(0,e.computed)(()=>typeof t.name==`string`||typeof t.name==`number`?t.name:String(t.name));function d(){let t=a.value.vertical;return t===!0&&a.value.keepAlive===!0?(0,e.h)(e.KeepAlive,a.value.keepAliveProps.value,c.value===!0?[(0,e.h)(a.value.needsUniqueKeepAliveWrapper.value===!0?o(u.value,()=>({...Gu,name:u.value})):Gu,{key:u.value},n.default)]:void 0):t!==!0||c.value===!0?Wu(n):void 0}return()=>(0,e.h)(`div`,{ref:s,class:`q-stepper__step`,role:`tabpanel`,...l.value},a.value.vertical===!0?[(0,e.h)(Uu,{stepper:a.value,step:t,goToPanel:a.value.goToPanel}),a.value.animated===!0?(0,e.h)(Ys,d):d()]:[d()])}});let qu=/(-\w)/g;function Ju(e){let t={};for(let n in e){let r=n.replace(qu,e=>e[1].toUpperCase());t[r]=e[n]}return t}var Yu=h({name:`QStepper`,props:{...Z,...Ci,flat:Boolean,bordered:Boolean,alternativeLabels:Boolean,headerNav:Boolean,contracted:Boolean,headerClass:String,inactiveColor:String,inactiveIcon:String,doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String},emits:wi,setup(t,{slots:n}){let r=Q(t,(0,e.getCurrentInstance)().proxy.$q),{updatePanelsList:i,isValidPanelName:a,updatePanelIndex:o,getPanelContent:s,getPanels:c,panelDirectives:l,goToPanel:u,keepAliveProps:d,needsUniqueKeepAliveWrapper:f}=Ti();(0,e.provide)(fe,(0,e.computed)(()=>({goToPanel:u,keepAliveProps:d,needsUniqueKeepAliveWrapper:f,...t})));let p=(0,e.computed)(()=>`q-stepper q-stepper--${t.vertical===!0?`vertical`:`horizontal`}`+(t.flat===!0?` q-stepper--flat`:``)+(t.bordered===!0?` q-stepper--bordered`:``)+(r.value===!0?` q-stepper--dark q-dark`:``)),m=(0,e.computed)(()=>`q-stepper__header row items-stretch justify-between q-stepper__header--${t.alternativeLabels===!0?`alternative`:`standard`}-labels`+(t.flat===!1||t.bordered===!0?` q-stepper__header--border`:``)+(t.contracted===!0?` q-stepper__header--contracted`:``)+(t.headerClass===void 0?``:` ${t.headerClass}`));function h(){let r=Y(n.message,[]);if(t.vertical===!0){a(t.modelValue)&&o();let i=(0,e.h)(`div`,{class:`q-stepper__content`},Y(n.default));return r===void 0?[i]:r.concat(i)}return[(0,e.h)(`div`,{class:m.value},c().map(n=>{let r=Ju(n.props);return(0,e.h)(Uu,{key:r.name,stepper:t,step:r,goToPanel:u})})),r,et(`div`,{class:`q-stepper__content q-panel-parent`},s(),`cont`,t.swipeable,()=>l.value)]}return()=>(i(n),(0,e.h)(`div`,{class:p.value},Qe(n.navigation,h())))}}),Xu=h({name:`QStepperNavigation`,setup(t,{slots:n}){return()=>(0,e.h)(`div`,{class:`q-stepper__nav`},Y(n.default))}}),Zu=h({name:`QTh`,props:{props:Object,autoWidth:Boolean},emits:[`click`],setup(t,{slots:n,emit:r}){let i=(0,e.getCurrentInstance)(),{proxy:{$q:a}}=i,o=e=>{r(`click`,e)};return()=>{if(t.props===void 0)return(0,e.h)(`th`,{class:t.autoWidth===!0?`q-table--col-auto-width`:``,onClick:o},Y(n.default));let r,s,c=i.vnode.key;if(c){if(r=t.props.colsMap[c],r===void 0)return}else r=t.props.col;if(r.sortable===!0){let t=r.align===`right`?`unshift`:`push`;s=Ze(n.default,[]),s[t]((0,e.h)(X,{class:r.__iconClass,name:a.iconSet.table.arrowUp}))}else s=Y(n.default);return(0,e.h)(`th`,{class:r.__thClass+(t.autoWidth===!0?` q-table--col-auto-width`:``),style:r.headerStyle,onClick:e=>{r.sortable===!0&&t.props.sort(r),o(e)}},s)}}});function Qu(t,n){return(0,e.h)(`div`,t,[(0,e.h)(`table`,{class:`q-table`},n)])}let $u={list:ol,table:hl},ed=[`list`,`table`,`__qtable`];var td=h({name:`QVirtualScroll`,props:{...cu,type:{type:String,default:`list`,validator:e=>ed.includes(e)},items:{type:Array,default:()=>[]},itemsFn:Function,itemsSize:Number,scrollTarget:$n},setup(t,{slots:n,attrs:r}){let i,a=(0,e.ref)(null),o=(0,e.computed)(()=>t.itemsSize>=0&&t.itemsFn!==void 0?parseInt(t.itemsSize,10):Array.isArray(t.items)?t.items.length:0),{virtualScrollSliceRange:s,localResetVirtualScroll:c,padVirtualScroll:l,onVirtualScrollEvt:u}=lu({virtualScrollLength:o,getVirtualScrollTarget:h,getVirtualScrollEl:m}),d=(0,e.computed)(()=>{if(o.value===0)return[];let e=(e,t)=>({index:s.value.from+t,item:e});return t.itemsFn===void 0?t.items.slice(s.value.from,s.value.to).map(e):t.itemsFn(s.value.from,s.value.to-s.value.from).map(e)}),f=(0,e.computed)(()=>`q-virtual-scroll q-virtual-scroll`+(t.virtualScrollHorizontal===!0?`--horizontal`:`--vertical`)+(t.scrollTarget===void 0?` scroll`:``)),p=(0,e.computed)(()=>t.scrollTarget===void 0?{tabindex:0}:{});(0,e.watch)(o,()=>{c()}),(0,e.watch)(()=>t.scrollTarget,()=>{_(),g()});function m(){return a.value.$el||a.value}function h(){return i}function g(){i=tr(m(),t.scrollTarget),i.addEventListener(`scroll`,u,v.passive)}function _(){i!==void 0&&(i.removeEventListener(`scroll`,u,v.passive),i=void 0)}function y(){let e=l(t.type===`list`?`div`:`tbody`,d.value.map(n.default));return n.before!==void 0&&(e=n.before().concat(e)),Qe(n.after,e)}return(0,e.onBeforeMount)(()=>{c()}),(0,e.onMounted)(()=>{g()}),(0,e.onActivated)(()=>{g()}),(0,e.onDeactivated)(()=>{_()}),(0,e.onBeforeUnmount)(()=>{_()}),()=>{if(n.default===void 0){console.error(`QVirtualScroll: default scoped slot is required for rendering`);return}return t.type===`__qtable`?Qu({ref:a,class:`q-table__middle `+f.value},y()):(0,e.h)($u[t.type],{...r,ref:a,class:[r.class,f.value],...p.value},y)}}});function nd(e,t){return new Date(e)-new Date(t)}let rd={sortMethod:Function,binaryStateSort:Boolean,columnSortOrder:{type:String,validator:e=>e===`ad`||e===`da`,default:`ad`}};function id(t,n,r,i){let a=(0,e.computed)(()=>{let{sortBy:e}=n.value;return e&&r.value.find(t=>t.name===e)||null}),o=(0,e.computed)(()=>t.sortMethod===void 0?(e,t,n)=>{let i=r.value.find(e=>e.name===t);if(i===void 0||i.field===void 0)return e;let a=n===!0?-1:1,o=typeof i.field==`function`?e=>i.field(e):e=>e[i.field];return e.sort((e,t)=>{let n=o(e),r=o(t);return i.rawSort===void 0?n==null?-1*a:r==null?Number(a):i.sort===void 0?Te(n)===!0&&Te(r)===!0?(n-r)*a:Ce(n)===!0&&Ce(r)===!0?nd(n,r)*a:typeof n==`boolean`&&typeof r==`boolean`?(n-r)*a:([n,r]=[n,r].map(e=>String(e).toLocaleString().toLowerCase()),nt.name===e);t?.sortOrder&&(a=t.sortOrder)}let{sortBy:o,descending:s}=n.value;o===e?t.binaryStateSort===!0?s=!s:s===!0?a===`ad`?o=null:s=!1:a===`ad`?s=!0:o=null:(o=e,s=a===`da`),i({sortBy:o,descending:s,page:1})}return{columnToSort:a,computedSortMethod:o,sort:s}}let ad={filter:[String,Object],filterMethod:Function};function od(t,n){let r=(0,e.computed)(()=>t.filterMethod===void 0?(e,t,n,r)=>{let i=t?t.toLowerCase():``;return e.filter(e=>n.some(t=>{let n=String(r(t,e));return(n===`undefined`||n===`null`?``:n.toLowerCase()).indexOf(i)!==-1}))}:t.filterMethod);return(0,e.watch)(()=>t.filter,()=>{(0,e.nextTick)(()=>{n({page:1},!0)})},{deep:!0}),{computedFilterMethod:r}}function sd(e,t){for(let n in t)if(t[n]!==e[n])return!1;return!0}function cd(e){return e.page<1&&(e.page=1),e.rowsPerPage!==void 0&&e.rowsPerPage<1&&(e.rowsPerPage=0),e}let ld={pagination:Object,rowsPerPageOptions:{type:Array,default:()=>[5,7,10,15,20,25,50,0]},"onUpdate:pagination":[Function,Array]};function ud(t,n){let{props:r,emit:i}=t,a=(0,e.ref)(Object.assign({sortBy:null,descending:!1,page:1,rowsPerPage:r.rowsPerPageOptions.length===0?5:r.rowsPerPageOptions[0]},r.pagination)),o=(0,e.computed)(()=>cd(r[`onUpdate:pagination`]===void 0?a.value:{...a.value,...r.pagination})),s=(0,e.computed)(()=>o.value.rowsNumber!==void 0);function c(e){l({pagination:e,filter:r.filter})}function l(t={}){(0,e.nextTick)(()=>{i(`request`,{pagination:t.pagination||o.value,filter:t.filter||r.filter,getCellValue:n})})}function u(e,t){let n=cd({...o.value,...e});if(sd(o.value,n)===!0){s.value===!0&&t===!0&&c(n);return}if(s.value===!0){c(n);return}r.pagination!==void 0&&r[`onUpdate:pagination`]!==void 0?i(`update:pagination`,n):a.value=n}return{innerPagination:a,computedPagination:o,isServerSide:s,requestServerInteraction:l,setPagination:u}}function dd(t,n,r,i,a,o){let{props:s,emit:c,proxy:{$q:l}}=t,u=(0,e.computed)(()=>i.value===!0?r.value.rowsNumber||0:o.value),d=(0,e.computed)(()=>{let{page:e,rowsPerPage:t}=r.value;return(e-1)*t}),f=(0,e.computed)(()=>{let{page:e,rowsPerPage:t}=r.value;return e*t}),p=(0,e.computed)(()=>r.value.page===1),m=(0,e.computed)(()=>r.value.rowsPerPage===0?1:Math.max(1,Math.ceil(u.value/r.value.rowsPerPage))),h=(0,e.computed)(()=>f.value===0?!0:r.value.page>=m.value),g=(0,e.computed)(()=>(s.rowsPerPageOptions.includes(n.value.rowsPerPage)?s.rowsPerPageOptions:[n.value.rowsPerPage].concat(s.rowsPerPageOptions)).map(e=>({label:e===0?l.lang.table.allRows:String(e),value:e})));(0,e.watch)(m,(e,t)=>{if(e===t)return;let n=r.value.page;e&&!n?a({page:1}):e1&&a({page:e-1})}function y(){let{page:e,rowsPerPage:t}=r.value;f.value>0&&e*t[`single`,`multiple`,`none`].includes(e)},selected:{type:Array,default:()=>[]}},pd=[`update:selected`,`selection`];function md(t,n,r,i){let a=(0,e.computed)(()=>{let e={};return t.selected.map(i.value).forEach(t=>{e[t]=!0}),e}),o=(0,e.computed)(()=>t.selection!==`none`),s=(0,e.computed)(()=>t.selection===`single`),c=(0,e.computed)(()=>t.selection===`multiple`),l=(0,e.computed)(()=>r.value.length!==0&&r.value.every(e=>a.value[i.value(e)]===!0)),u=(0,e.computed)(()=>l.value!==!0&&r.value.some(e=>a.value[i.value(e)]===!0)),d=(0,e.computed)(()=>t.selected.length);function f(e){return a.value[e]===!0}function p(){n(`update:selected`,[])}function m(e,r,a,o){n(`selection`,{rows:r,added:a,keys:e,evt:o}),n(`update:selected`,s.value===!0?a===!0?r:[]:a===!0?t.selected.concat(r):t.selected.filter(t=>e.includes(i.value(t))===!1))}return{hasSelectionMode:o,singleSelection:s,multipleSelection:c,allRowsSelected:l,someRowsSelected:u,rowsSelectedNumber:d,isRowSelected:f,clearSelection:p,updateSelection:m}}function hd(e){return Array.isArray(e)?e.slice():[]}let gd={expanded:Array},_d=[`update:expanded`];function vd(t,n){let r=(0,e.ref)(hd(t.expanded));(0,e.watch)(()=>t.expanded,e=>{r.value=hd(e)});function i(e){return r.value.includes(e)}function a(e){t.expanded===void 0?r.value=e:n(`update:expanded`,e)}function o(e,t){let n=r.value.slice(),i=n.indexOf(e);t===!0?i===-1&&(n.push(e),a(n)):i!==-1&&(n.splice(i,1),a(n))}return{isRowExpanded:i,setExpanded:a,updateExpanded:o}}let yd={visibleColumns:Array};function bd(t,n,r){let i=(0,e.computed)(()=>{if(t.columns!==void 0)return t.columns;let e=t.rows[0];return e===void 0?[]:Object.keys(e).map(t=>({name:t,label:t.toUpperCase(),field:t,align:Te(e[t])?`right`:`left`,sortable:!0}))}),a=(0,e.computed)(()=>{let{sortBy:e,descending:r}=n.value;return(t.visibleColumns===void 0?i.value:i.value.filter(e=>e.required===!0||t.visibleColumns.includes(e.name)===!0)).map(t=>{let n=t.align||`right`,i=`text-${n}`;return{...t,align:n,__iconClass:`q-table__sort-icon q-table__sort-icon--${n}`,__thClass:i+(t.headerClasses===void 0?``:` `+t.headerClasses)+(t.sortable===!0?` sortable`:``)+(t.name===e?` sorted ${r===!0?`sort-desc`:``}`:``),__tdStyle:t.style===void 0?()=>null:typeof t.style==`function`?t.style:()=>t.style,__tdClass:t.classes===void 0?()=>i:typeof t.classes==`function`?e=>i+` `+t.classes(e):()=>i+` `+t.classes}})});return{colList:i,computedCols:a,computedColsMap:(0,e.computed)(()=>{let e={};return a.value.forEach(t=>{e[t.name]=t}),e}),computedColspan:(0,e.computed)(()=>t.tableColspan===void 0?a.value.length+ +(r.value===!0):t.tableColspan)}}let xd=`q-table__bottom row items-center`,Sd={};su.forEach(e=>{Sd[e]={}});var Cd=h({name:`QTable`,props:{rows:{type:Array,required:!0},rowKey:{type:[String,Function],default:`id`},columns:Array,loading:Boolean,iconFirstPage:String,iconPrevPage:String,iconNextPage:String,iconLastPage:String,title:String,hideHeader:Boolean,grid:Boolean,gridHeader:Boolean,dense:Boolean,flat:Boolean,bordered:Boolean,square:Boolean,separator:{type:String,default:`horizontal`,validator:e=>[`horizontal`,`vertical`,`cell`,`none`].includes(e)},wrapCells:Boolean,virtualScroll:Boolean,virtualScrollTarget:{},...Sd,noDataLabel:String,noResultsLabel:String,loadingLabel:String,selectedRowsLabel:Function,rowsPerPageLabel:String,paginationLabel:Function,color:{type:String,default:`grey-8`},titleClass:[String,Array,Object],tableStyle:[String,Array,Object],tableClass:[String,Array,Object],tableHeaderStyle:[String,Array,Object],tableHeaderClass:[String,Array,Object],tableRowStyleFn:Function,tableRowClassFn:Function,cardContainerClass:[String,Array,Object],cardContainerStyle:[String,Array,Object],cardStyle:[String,Array,Object],cardClass:[String,Array,Object],cardStyleFn:Function,cardClassFn:Function,hideBottom:Boolean,hideSelectedBanner:Boolean,hideNoData:Boolean,hidePagination:Boolean,onRowClick:Function,onRowDblclick:Function,onRowContextmenu:Function,...Z,...Di,...yd,...ad,...ld,...gd,...fd,...rd},emits:[`request`,`virtualScroll`,...Oi,..._d,...pd],setup(t,{slots:n,emit:a}){let o=(0,e.getCurrentInstance)(),{proxy:{$q:s}}=o,c=Q(t,s),{inFullscreen:l,toggleFullscreen:u}=ki(),d=(0,e.computed)(()=>typeof t.rowKey==`function`?t.rowKey:e=>e[t.rowKey]),f=(0,e.ref)(null),p=(0,e.ref)(null),m=(0,e.computed)(()=>t.grid!==!0&&t.virtualScroll===!0),h=(0,e.computed)(()=>` q-table__card`+(c.value===!0?` q-table__card--dark q-dark`:``)+(t.square===!0?` q-table--square`:``)+(t.flat===!0?` q-table--flat`:``)+(t.bordered===!0?` q-table--bordered`:``)),g=(0,e.computed)(()=>`q-table__container q-table--${t.separator}-separator column no-wrap`+(t.grid===!0?` q-table--grid`:h.value)+(c.value===!0?` q-table--dark`:``)+(t.dense===!0?` q-table--dense`:``)+(t.wrapCells===!1?` q-table--no-wrap`:``)+(l.value===!0?` fullscreen scroll`:``)),_=(0,e.computed)(()=>g.value+(t.loading===!0?` q-table--loading`:``));(0,e.watch)(()=>t.tableStyle+t.tableClass+t.tableHeaderStyle+t.tableHeaderClass+g.value,()=>{m.value===!0&&p.value?.reset()});let{innerPagination:v,computedPagination:y,isServerSide:b,requestServerInteraction:x,setPagination:S}=ud(o,Se),{computedFilterMethod:C}=od(t,S),{isRowExpanded:w,setExpanded:T,updateExpanded:E}=vd(t,a),D=(0,e.computed)(()=>{let e=t.rows;if(b.value===!0||e.length===0)return e;let{sortBy:n,descending:r}=y.value;return t.filter&&(e=C.value(e,t.filter,B.value,Se)),H.value!==null&&(e=te.value(t.rows===e?e.slice():e,n,r)),e}),O=(0,e.computed)(()=>D.value.length),k=(0,e.computed)(()=>{let e=D.value;if(b.value===!0)return e;let{rowsPerPage:n}=y.value;return n!==0&&(ne.value===0&&t.rows!==e?e.length>W.value&&(e=e.slice(0,W.value)):e=e.slice(ne.value,W.value)),e}),{hasSelectionMode:A,singleSelection:j,multipleSelection:M,allRowsSelected:N,someRowsSelected:P,rowsSelectedNumber:F,isRowSelected:I,clearSelection:L,updateSelection:R}=md(t,a,k,d),{colList:z,computedCols:B,computedColsMap:ee,computedColspan:V}=bd(t,y,A),{columnToSort:H,computedSortMethod:te,sort:U}=id(t,y,z,S),{firstRowIndex:ne,lastRowIndex:W,isFirstPage:G,isLastPage:re,pagesNumber:K,computedRowsPerPageOptions:ie,computedRowsNumber:ae,firstPage:oe,prevPage:se,nextPage:ce,lastPage:le}=dd(o,v,y,b,S,O),ue=(0,e.computed)(()=>k.value.length===0),de=(0,e.computed)(()=>{let e={};return su.forEach(n=>{e[n]=t[n]}),e.virtualScrollItemSize===void 0&&(e.virtualScrollItemSize=t.dense===!0?28:48),e});function fe(){m.value===!0&&p.value.reset()}function pe(){if(t.grid===!0)return Fe();let r=t.hideHeader===!0?null:Ee;if(m.value===!0){let i=n[`top-row`],a=n[`bottom-row`],o={default:e=>_e(e.item,n.body,e.index)};if(i!==void 0){let t=(0,e.h)(`tbody`,i({cols:B.value}));o.before=r===null?()=>t:()=>[r()].concat(t)}else r!==null&&(o.before=r);return a!==void 0&&(o.after=()=>(0,e.h)(`tbody`,a({cols:B.value}))),(0,e.h)(td,{ref:p,class:t.tableClass,style:t.tableStyle,...de.value,scrollTarget:t.virtualScrollTarget,items:k.value,type:`__qtable`,tableColspan:V.value,onVirtualScroll:he},o)}let i=[q()];return r!==null&&i.unshift(r()),Qu({class:[`q-table__middle scroll`,t.tableClass],style:t.tableStyle},i)}function me(e,n){if(p.value!==null){p.value.scrollTo(e,n);return}e=parseInt(e,10);let r=f.value.querySelector(`tbody tr:nth-of-type(${e+1})`);if(r!==null){let n=f.value.querySelector(`.q-table__middle.scroll`),i=r.offsetTop-t.virtualScrollStickySizeStart,o=i{let i=n[`body-cell-${t.name}`],a=i===void 0?u:i;return a===void 0?(0,e.h)(`td`,{class:t.__tdClass(r),style:t.__tdStyle(r)},Se(t,r)):a(ye({key:s,row:r,pageIndex:o,col:t}))});if(A.value===!0){let i=n[`body-selection`],a=i===void 0?[(0,e.h)(Hi,{modelValue:l,color:t.color,dark:c.value,dense:t.dense,"onUpdate:modelValue":(e,t)=>{R([s],[r],e,t)}})]:i(be({key:s,row:r,pageIndex:o}));f.unshift((0,e.h)(`td`,{class:`q-table--col-auto-width`},a))}let p={key:s,class:{selected:l}};if(t.onRowClick!==void 0&&(p.class[`cursor-pointer`]=!0,p.onClick=e=>{a(`rowClick`,e,r,o)}),t.onRowDblclick!==void 0&&(p.class[`cursor-pointer`]=!0,p.onDblclick=e=>{a(`rowDblclick`,e,r,o)}),t.onRowContextmenu!==void 0&&(p.class[`cursor-pointer`]=!0,p.onContextmenu=e=>{a(`rowContextmenu`,e,r,o)}),t.tableRowStyleFn!==void 0&&(p.style=t.tableRowStyleFn(r)),t.tableRowClassFn!==void 0){let e=t.tableRowClassFn(r);e&&(p.class[e]=!0)}return(0,e.h)(`tr`,p,f)}function q(){let t=n.body,r=n[`top-row`],i=n[`bottom-row`],a=k.value.map((e,n)=>_e(e,t,n));return r!==void 0&&(a=r({cols:B.value}).concat(a)),i!==void 0&&(a=a.concat(i({cols:B.value}))),(0,e.h)(`tbody`,a)}function ve(e){return xe(e),e.cols=e.cols.map(t=>r({...t},`value`,()=>Se(t,e.row))),e}function ye(e){return xe(e),r(e,`value`,()=>Se(e.col,e.row)),e}function be(e){return xe(e),e}function xe(e){Object.assign(e,{cols:B.value,colsMap:ee.value,sort:U,rowIndex:ne.value+e.pageIndex,color:t.color,dark:c.value,dense:t.dense}),A.value===!0&&r(e,`selected`,()=>I(e.key),(t,n)=>{R([e.key],[e.row],t,n)}),r(e,`expand`,()=>w(e.key),t=>{E(e.key,t)})}function Se(e,t){let n=typeof e.field==`function`?e.field(t):t[e.field];return e.format===void 0?n:e.format(n,t)}let Ce=(0,e.computed)(()=>({pagination:y.value,pagesNumber:K.value,isFirstPage:G.value,isLastPage:re.value,firstPage:oe,prevPage:se,nextPage:ce,lastPage:le,inFullscreen:l.value,toggleFullscreen:u}));function we(){let r=n.top,i=n[`top-left`],a=n[`top-right`],o=n[`top-selection`],s=A.value===!0&&o!==void 0&&F.value>0,c=`q-table__top relative-position row items-center`;if(r!==void 0)return(0,e.h)(`div`,{class:c},[r(Ce.value)]);let l;if(s===!0?l=o(Ce.value).slice():(l=[],i===void 0?t.title&&l.push((0,e.h)(`div`,{class:`q-table__control`},[(0,e.h)(`div`,{class:[`q-table__title`,t.titleClass]},t.title)])):l.push((0,e.h)(`div`,{class:`q-table__control`},[i(Ce.value)]))),a!==void 0&&(l.push((0,e.h)(`div`,{class:`q-table__separator col`})),l.push((0,e.h)(`div`,{class:`q-table__control`},[a(Ce.value)]))),l.length!==0)return(0,e.h)(`div`,{class:c},l)}let Te=(0,e.computed)(()=>P.value===!0?null:N.value);function Ee(){let r=De();return t.loading===!0&&n.loading===void 0&&r.push((0,e.h)(`tr`,{class:`q-table__progress`},[(0,e.h)(`th`,{class:`relative-position`,colspan:V.value},ge())])),(0,e.h)(`thead`,r)}function De(){let r=n.header,i=n[`header-cell`];if(r!==void 0)return r(Oe({header:!0})).slice();let a=B.value.map(t=>{let r=n[`header-cell-${t.name}`],a=r===void 0?i:r,o=Oe({col:t});return a===void 0?(0,e.h)(Zu,{key:t.name,props:o},()=>t.label):a(o)});if(j.value===!0&&t.grid!==!0)a.unshift((0,e.h)(`th`,{class:`q-table--col-auto-width`},` `));else if(M.value===!0){let r=n[`header-selection`],i=r===void 0?[(0,e.h)(Hi,{color:t.color,modelValue:Te.value,dark:c.value,dense:t.dense,"onUpdate:modelValue":ke})]:r(Oe({}));a.unshift((0,e.h)(`th`,{class:`q-table--col-auto-width`},i))}return[(0,e.h)(`tr`,{class:t.tableHeaderClass,style:t.tableHeaderStyle},a)]}function Oe(e){return Object.assign(e,{cols:B.value,sort:U,colsMap:ee.value,color:t.color,dark:c.value,dense:t.dense}),M.value===!0&&r(e,`selected`,()=>Te.value,ke),e}function ke(e){P.value===!0&&(e=!1),R(k.value.map(d.value),k.value,e)}let Ae=(0,e.computed)(()=>{let e=[t.iconFirstPage||s.iconSet.table.firstPage,t.iconPrevPage||s.iconSet.table.prevPage,t.iconNextPage||s.iconSet.table.nextPage,t.iconLastPage||s.iconSet.table.lastPage];return s.lang.rtl===!0?e.reverse():e});function je(){if(t.hideBottom===!0)return;if(ue.value===!0){if(t.hideNoData===!0)return;let r=t.loading===!0?t.loadingLabel||s.lang.table.loading:t.filter?t.noResultsLabel||s.lang.table.noResults:t.noDataLabel||s.lang.table.noData,i=n[`no-data`],a=i===void 0?[(0,e.h)(X,{class:`q-table__bottom-nodata-icon`,name:s.iconSet.table.warning}),r]:[i({message:r,icon:s.iconSet.table.warning,filter:t.filter})];return(0,e.h)(`div`,{class:xd+` q-table__bottom--nodata`},a)}let r=n.bottom;if(r!==void 0)return(0,e.h)(`div`,{class:xd},[r(Ce.value)]);let i=t.hideSelectedBanner!==!0&&A.value===!0&&F.value>0?[(0,e.h)(`div`,{class:`q-table__control`},[(0,e.h)(`div`,[(t.selectedRowsLabel||s.lang.table.selectedRecords)(F.value)])])]:[];if(t.hidePagination!==!0)return(0,e.h)(`div`,{class:xd+` justify-end`},Ne(i));if(i.length!==0)return(0,e.h)(`div`,{class:xd},i)}function Me(e){S({page:1,rowsPerPage:e.value})}function Ne(r){let i,{rowsPerPage:a}=y.value,o=t.paginationLabel||s.lang.table.pagination,l=n.pagination,u=t.rowsPerPageOptions.length>1;if(r.push((0,e.h)(`div`,{class:`q-table__separator col`})),u===!0&&r.push((0,e.h)(`div`,{class:`q-table__control`},[(0,e.h)(`span`,{class:`q-table__bottom-item`},[t.rowsPerPageLabel||s.lang.table.recordsPerPage]),(0,e.h)(pu,{class:`q-table__select inline q-table__bottom-item`,color:t.color,modelValue:a,options:ie.value,displayValue:a===0?s.lang.table.allRows:a,dark:c.value,borderless:!0,dense:!0,optionsDense:!0,optionsCover:!0,"onUpdate:modelValue":Me})])),l!==void 0)i=l(Ce.value);else if(i=[(0,e.h)(`span`,a===0?{}:{class:`q-table__bottom-item`},[a?o(ne.value+1,Math.min(W.value,ae.value),ae.value):o(1,O.value,ae.value)])],a!==0&&K.value>1){let n={color:t.color,round:!0,dense:!0,flat:!0};t.dense===!0&&(n.size=`sm`),K.value>2&&i.push((0,e.h)($,{key:`pgFirst`,...n,icon:Ae.value[0],disable:G.value,"aria-label":s.lang.pagination.first,onClick:oe})),i.push((0,e.h)($,{key:`pgPrev`,...n,icon:Ae.value[1],disable:G.value,"aria-label":s.lang.pagination.prev,onClick:se}),(0,e.h)($,{key:`pgNext`,...n,icon:Ae.value[2],disable:re.value,"aria-label":s.lang.pagination.next,onClick:ce})),K.value>2&&i.push((0,e.h)($,{key:`pgLast`,...n,icon:Ae.value[3],disable:re.value,"aria-label":s.lang.pagination.last,onClick:le}))}return r.push((0,e.h)(`div`,{class:`q-table__control`},i)),r}function Pe(){return(0,e.h)(`div`,{class:`q-table__middle`},t.gridHeader===!0?[(0,e.h)(`table`,{class:`q-table`},[Ee(e.h)])]:t.loading===!0&&n.loading===void 0?ge(e.h):void 0)}function Fe(){let r=n.item===void 0?r=>{let i=r.cols.map(t=>(0,e.h)(`div`,{class:`q-table__grid-item-row`},[(0,e.h)(`div`,{class:`q-table__grid-item-title`},[t.label]),(0,e.h)(`div`,{class:`q-table__grid-item-value`},[t.value])]));if(A.value===!0){let a=n[`body-selection`],o=a===void 0?[(0,e.h)(Hi,{modelValue:r.selected,color:t.color,dark:c.value,dense:t.dense,"onUpdate:modelValue":(e,t)=>{R([r.key],[r.row],e,t)}})]:a(r);i.unshift((0,e.h)(`div`,{class:`q-table__grid-item-row`},o),(0,e.h)(Qs,{dark:c.value}))}let o={class:[`q-table__grid-item-card`+h.value,t.cardClass],style:t.cardStyle};if(t.cardStyleFn!==void 0&&(o.style=[o.style,t.cardStyleFn(r.row)]),t.cardClassFn!==void 0){let e=t.cardClassFn(r.row);e&&(o.class[0]+=` ${e}`)}return(t.onRowClick!==void 0||t.onRowDblclick!==void 0||t.onRowContextmenu!==void 0)&&(o.class[0]+=` cursor-pointer`,t.onRowClick!==void 0&&(o.onClick=e=>{a(`RowClick`,e,r.row,r.pageIndex)}),t.onRowDblclick!==void 0&&(o.onDblclick=e=>{a(`RowDblclick`,e,r.row,r.pageIndex)}),t.onRowContextmenu!==void 0&&(o.onContextmenu=e=>{a(`rowContextmenu`,e,r.row,r.pageIndex)})),(0,e.h)(`div`,{class:`q-table__grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3`+(r.selected===!0?` q-table__grid-item--selected`:``)},[(0,e.h)(`div`,o,i)])}:n.item;return(0,e.h)(`div`,{class:[`q-table__grid-content row`,t.cardContainerClass],style:t.cardContainerStyle},k.value.map((e,t)=>r(ve({key:d.value(e),row:e,pageIndex:t}))))}return Object.assign(o.proxy,{requestServerInteraction:x,setPagination:S,firstPage:oe,prevPage:se,nextPage:ce,lastPage:le,isRowSelected:I,clearSelection:L,isRowExpanded:w,setExpanded:T,sort:U,resetVirtualScroll:fe,scrollTo:me,getCellValue:Se}),i(o.proxy,{filteredSortedRows:()=>D.value,computedRows:()=>k.value,computedRowsNumber:()=>ae.value}),()=>{let r=[we()],i={ref:f,class:_.value};return t.grid===!0?r.push(Pe()):Object.assign(i,{class:[i.class,t.cardClass],style:t.cardStyle}),r.push(pe(),je()),t.loading===!0&&n.loading!==void 0&&r.push(n.loading()),(0,e.h)(`div`,i,r)}}}),wd=h({name:`QTr`,props:{props:Object,noHover:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-tr`+(t.props===void 0||t.props.header===!0?``:` `+t.props.__trClass)+(t.noHover===!0?` q-tr--no-hover`:``));return()=>(0,e.h)(`tr`,{style:t.props?.__trStyle,class:r.value},Y(n.default))}}),Td=h({name:`QTd`,props:{props:Object,autoWidth:Boolean,noHover:Boolean},setup(t,{slots:n}){let r=(0,e.getCurrentInstance)(),i=(0,e.computed)(()=>`q-td`+(t.autoWidth===!0?` q-table--col-auto-width`:``)+(t.noHover===!0?` q-td--no-hover`:``)+` `);return()=>{if(t.props===void 0)return(0,e.h)(`td`,{class:i.value},Y(n.default));let a=r.vnode.key,o=(t.props.colsMap===void 0?null:t.props.colsMap[a])||t.props.col;if(o===void 0)return;let{row:s}=t.props;return(0,e.h)(`td`,{class:i.value+o.__tdClass(s),style:o.__tdStyle(s)},Y(n.default))}}}),Ed=h({name:`QRouteTab`,props:{...Rt,...ga},emits:ha,setup(t,{slots:n,emit:r}){let i=zt({useDisableForRouterLinkProps:!1}),{renderTab:a,$tabs:o}=_a(t,n,r,{exact:(0,e.computed)(()=>t.exact),...i});return(0,e.watch)(()=>`${t.name} | ${t.exact} | ${(i.resolvedLink.value||{}).href}`,o.verifyRouteModel),()=>a(i.linkTag.value,i.linkAttrs.value)}});function Dd(e,t){if(e.hour!==null){if(e.minute===null)return`minute`;if(t===!0&&e.second===null)return`second`}return`hour`}function Od(){let e=new Date;return{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}}var kd=h({name:`QTime`,props:{...Z,...ai,...ao,modelValue:{required:!0,validator:e=>typeof e==`string`||e===null},mask:{...ao.mask,default:null},format24h:{type:Boolean,default:null},defaultDate:{type:String,validator:e=>/^-?[\d]+\/[0-1]\d\/[0-3]\d$/.test(e)},options:Function,hourOptions:Array,minuteOptions:Array,secondOptions:Array,withSeconds:Boolean,nowBtn:Boolean},emits:oo,setup(t,{slots:n,emit:r}){let i=(0,e.getCurrentInstance)(),{$q:a}=i.proxy,o=Q(t,a),{tabindex:s,headerClass:c,getLocale:l,getCurrentDate:u}=co(t,a),d=si(oi(t)),f,p,m=(0,e.ref)(null),h=(0,e.computed)(()=>V()),g=(0,e.computed)(()=>l()),_=(0,e.computed)(()=>H()),v=To(t.modelValue,h.value,g.value,t.calendar,_.value),y=(0,e.ref)(Dd(v)),b=(0,e.ref)(v),x=(0,e.ref)(v.hour===null||v.hour<12),S=(0,e.computed)(()=>`q-time q-time--${t.landscape===!0?`landscape`:`portrait`}`+(o.value===!0?` q-time--dark q-dark`:``)+(t.disable===!0?` disabled`:t.readonly===!0?` q-time--readonly`:``)+(t.bordered===!0?` q-time--bordered`:``)+(t.square===!0?` q-time--square no-border-radius`:``)+(t.flat===!0?` q-time--flat no-shadow`:``)),w=(0,e.computed)(()=>{let e=b.value;return{hour:e.hour===null?`--`:T.value===!0?J(e.hour):String(x.value===!0?e.hour===0?12:e.hour:e.hour>12?e.hour-12:e.hour),minute:e.minute===null?`--`:J(e.minute),second:e.second===null?`--`:J(e.second)}}),T=(0,e.computed)(()=>t.format24h===null?a.lang.date.format24h:t.format24h),E=(0,e.computed)(()=>{let e=y.value===`hour`,t=e===!0?12:60,n=b.value[y.value],r=`rotate(${Math.round(360/t*n)-180}deg) translateX(-50%)`;return e===!0&&T.value===!0&&b.value.hour>=12&&(r+=` scale(.7)`),{transform:r}}),D=(0,e.computed)(()=>b.value.hour!==null),O=(0,e.computed)(()=>D.value===!0&&b.value.minute!==null),k=(0,e.computed)(()=>t.hourOptions===void 0?t.options===void 0?null:e=>t.options(e,null,null):e=>t.hourOptions.includes(e)),A=(0,e.computed)(()=>t.minuteOptions===void 0?t.options===void 0?null:e=>t.options(b.value.hour,e,null):e=>t.minuteOptions.includes(e)),j=(0,e.computed)(()=>t.secondOptions===void 0?t.options===void 0?null:e=>t.options(b.value.hour,b.value.minute,e):e=>t.secondOptions.includes(e)),M=(0,e.computed)(()=>{if(k.value===null)return null;let e=z(0,11,k.value),t=z(12,11,k.value);return{am:e,pm:t,values:e.values.concat(t.values)}}),N=(0,e.computed)(()=>A.value===null?null:z(0,59,A.value)),P=(0,e.computed)(()=>j.value===null?null:z(0,59,j.value)),F=(0,e.computed)(()=>{switch(y.value){case`hour`:return M.value;case`minute`:return N.value;case`second`:return P.value}}),I=(0,e.computed)(()=>{let e,t,n=0,r=1,i=F.value===null?void 0:F.value.values;y.value===`hour`?T.value===!0?(e=0,t=23):(e=0,t=11,x.value===!1&&(n=12)):(e=0,t=55,r=5);let a=[];for(let o=e,s=e;o<=t;o+=r,s++){let e=o+n,t=i?.includes(e)===!1,r=y.value===`hour`&&o===0?T.value===!0?`00`:`12`:o;a.push({val:e,index:s,disable:t,label:r})}return a}),L=(0,e.computed)(()=>[[Zi,ne,void 0,{stop:!0,prevent:!0,mouse:!0}]]);(0,e.watch)(()=>t.modelValue,e=>{let n=To(e,h.value,g.value,t.calendar,_.value);(n.dateHash!==b.value.dateHash||n.timeHash!==b.value.timeHash)&&(b.value=n,n.hour===null?y.value=`hour`:x.value=n.hour<12)}),(0,e.watch)([h,g],()=>{(0,e.nextTick)(()=>{q()})});function R(){let e={...u(),...Od()};q(e),Object.assign(b.value,e),y.value=`hour`}function z(e,t,n){let r=Array.apply(null,{length:t+1}).map((t,r)=>{let i=r+e;return{index:i,val:n(i)===!0}}).filter(e=>e.val===!0).map(e=>e.index);return{min:r[0],max:r[r.length-1],values:r,threshold:t+1}}function B(e,t,n){let r=Math.abs(e-t);return Math.min(r,n-r)}function ee(e,{min:t,max:n,values:r,threshold:i}){if(e===t)return t;if(en)return B(e,t,i)<=B(e,n,i)?t:n;let a=r.findIndex(t=>e<=t),o=r[a-1],s=r[a];return e-o<=s-e?o:s}function V(){return t.calendar!==`persian`&&t.mask!==null?t.mask:`HH:mm${t.withSeconds===!0?`:ss`:``}`}function H(){if(typeof t.defaultDate!=`string`){let e=u(!0);return e.dateHash=so(e),e}return To(t.defaultDate,`YYYY/MM/DD`,void 0,t.calendar)}function te(){return Ot(i)===!0||F.value!==null&&(F.value.values.length===0||y.value===`hour`&&T.value!==!0&&M.value[x.value===!0?`am`:`pm`].values.length===0)}function U(){let{top:e,left:t,width:n}=m.value.getBoundingClientRect(),r=n/2;return{top:e+r,left:t+r,dist:r*.7}}function ne(e){if(te()!==!0){if(e.isFirst===!0){f=U(),p=G(e.evt,f);return}p=G(e.evt,f,p),e.isFinal===!0&&(f=!1,p=null,W())}}function W(){y.value===`hour`?y.value=`minute`:t.withSeconds&&y.value===`minute`&&(y.value=`second`)}function G(e,t,n){let r=C(e),i=Math.abs(r.top-t.top),a=Math.sqrt(Math.abs(r.top-t.top)**2+Math.abs(r.left-t.left)**2),o,s=Math.asin(i/a)*(180/Math.PI);if(s=r.top=t.dist:M.value.am.values.length!==0:x.value===!0;o=ee(o+(e===!0?0:12),M.value[e===!0?`am`:`pm`])}else o=Math.round(o),T.value===!0?a(0,e.h)(`div`,{key:`clock`+y.value,class:`q-time__container-parent absolute-full`},[(0,e.h)(`div`,{ref:m,class:`q-time__container-child fit overflow-hidden`},[(0,e.withDirectives)((0,e.h)(`div`,{class:`q-time__clock cursor-pointer non-selectable`,onClick:ae,onMousedown:oe},[(0,e.h)(`div`,{class:`q-time__clock-circle fit`},[(0,e.h)(`div`,{class:`q-time__clock-pointer`+(b.value[y.value]===null?` hidden`:t.color===void 0?``:` text-${t.color}`),style:E.value}),I.value.map(t=>(0,e.h)(`div`,{class:`q-time__clock-position row flex-center q-time__clock-pos-${t.index}`+(t.val===n?` q-time__clock-position--active `+c.value:t.disable===!0?` q-time__clock-position--disable`:``)},[(0,e.h)(`span`,t.label)]))])]),L.value)])])),t.nowBtn===!0?(0,e.h)($,{class:`q-time__now-button absolute`,icon:a.iconSet.datetime.now,unelevated:!0,size:`sm`,round:!0,color:t.color,textColor:t.textColor,tabindex:s.value,onClick:R}):null])}return i.proxy.setNow=R,()=>{let r=[ye()],i=Y(n.default);return i!==void 0&&r.push((0,e.h)(`div`,{class:`q-time__actions`},i)),t.name!==void 0&&t.disable!==!0&&d(r,`push`),(0,e.h)(`div`,{class:S.value,tabindex:-1},[ve(),(0,e.h)(`div`,{class:`q-time__main col overflow-auto`},r)])}}}),Ad=h({name:`QTimeline`,props:{...Z,color:{type:String,default:`primary`},side:{type:String,default:`right`,validator:e=>[`left`,`right`].includes(e)},layout:{type:String,default:`dense`,validator:e=>[`dense`,`comfortable`,`loose`].includes(e)}},setup(t,{slots:n}){let r=Q(t,(0,e.getCurrentInstance)().proxy.$q);(0,e.provide)(de,t);let i=(0,e.computed)(()=>`q-timeline q-timeline--${t.layout} q-timeline--${t.layout}--${t.side}`+(r.value===!0?` q-timeline--dark`:``));return()=>(0,e.h)(`ul`,{class:i.value},Y(n.default))}}),jd=h({name:`QTimelineEntry`,props:{heading:Boolean,tag:{type:String,default:`h3`},side:{type:String,default:`right`,validator:e=>[`left`,`right`].includes(e)},icon:String,avatar:String,color:String,title:String,subtitle:String,body:String},setup(t,{slots:n}){let r=(0,e.inject)(de,q);if(r===q)return console.error(`QTimelineEntry needs to be child of QTimeline`),q;let i=(0,e.computed)(()=>`q-timeline__entry q-timeline__entry--${t.side}`+(t.icon!==void 0||t.avatar!==void 0?` q-timeline__entry--icon`:``)),a=(0,e.computed)(()=>`q-timeline__dot text-${t.color||r.color}`),o=(0,e.computed)(()=>r.layout===`comfortable`&&r.side===`left`);return()=>{let r=Ze(n.default,[]);if(t.body!==void 0&&r.unshift(t.body),t.heading===!0){let n=[(0,e.h)(`div`),(0,e.h)(`div`),(0,e.h)(t.tag,{class:`q-timeline__heading-title`},r)];return(0,e.h)(`div`,{class:`q-timeline__heading`},o.value===!0?n.reverse():n)}let s;t.icon===void 0?t.avatar!==void 0&&(s=[(0,e.h)(`img`,{class:`q-timeline__dot-img`,src:t.avatar})]):s=[(0,e.h)(X,{class:`row items-center justify-center`,name:t.icon})];let c=[(0,e.h)(`div`,{class:`q-timeline__subtitle`},[(0,e.h)(`span`,{},Y(n.subtitle,[t.subtitle]))]),(0,e.h)(`div`,{class:a.value},s),(0,e.h)(`div`,{class:`q-timeline__content`},[(0,e.h)(`h6`,{class:`q-timeline__title`},Y(n.title,[t.title]))].concat(r))];return(0,e.h)(`li`,{class:i.value},o.value===!0?c.reverse():c)}}}),Md=h({name:`QToolbar`,props:{inset:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-toolbar row no-wrap items-center`+(t.inset===!0?` q-toolbar--inset`:``));return()=>(0,e.h)(`div`,{class:r.value,role:`toolbar`},Y(n.default))}}),Nd=h({name:`QToolbarTitle`,props:{shrink:Boolean},setup(t,{slots:n}){let r=(0,e.computed)(()=>`q-toolbar__title ellipsis`+(t.shrink===!0?` col-shrink`:``));return()=>(0,e.h)(`div`,{class:r.value},Y(n.default))}});let Pd=[`none`,`strict`,`leaf`,`leaf-filtered`];var Fd=h({name:`QTree`,props:{...Z,nodes:{type:Array,required:!0},nodeKey:{type:String,required:!0},labelKey:{type:String,default:`label`},childrenKey:{type:String,default:`children`},dense:Boolean,color:String,controlColor:String,textColor:String,selectedColor:String,icon:String,tickStrategy:{type:String,default:`none`,validator:e=>Pd.includes(e)},ticked:Array,expanded:Array,selected:{},noSelectionUnset:Boolean,defaultExpandAll:Boolean,accordion:Boolean,filter:String,filterMethod:Function,duration:{},noConnectors:Boolean,noTransition:Boolean,noNodesLabel:String,noResultsLabel:String},emits:[`update:expanded`,`update:ticked`,`update:selected`,`lazyLoad`,`afterShow`,`afterHide`],setup(t,{slots:n,emit:i}){let{proxy:a}=(0,e.getCurrentInstance)(),{$q:o}=a,s=Q(t,o),c=(0,e.ref)({}),l=(0,e.ref)(t.ticked||[]),u=(0,e.ref)(t.expanded||[]),d={};(0,e.onBeforeUpdate)(()=>{d={}});let f=(0,e.computed)(()=>`q-tree q-tree--${t.dense===!0?`dense`:`standard`}`+(t.noConnectors===!0?` q-tree--no-connectors`:``)+(s.value===!0?` q-tree--dark`:``)+(t.color===void 0?``:` text-${t.color}`)),p=(0,e.computed)(()=>t.selected!==void 0),m=(0,e.computed)(()=>t.icon||o.iconSet.tree.icon),h=(0,e.computed)(()=>t.controlColor||t.color),g=(0,e.computed)(()=>t.textColor===void 0?``:` text-${t.textColor}`),_=(0,e.computed)(()=>{let e=t.selectedColor||t.color;return e?` text-${e}`:``}),v=(0,e.computed)(()=>t.filterMethod===void 0?(e,n)=>{let r=n.toLowerCase();return e[t.labelKey]&&e[t.labelKey].toLowerCase().indexOf(r)!==-1}:t.filterMethod),y=(0,e.computed)(()=>{let e={},n=(r,i)=>{let a=r.tickStrategy||(i?i.tickStrategy:t.tickStrategy),o=r[t.nodeKey],s=r[t.childrenKey]&&Array.isArray(r[t.childrenKey])&&r[t.childrenKey].length!==0,d=r.disabled!==!0&&p.value===!0&&r.selectable!==!1,f=r.disabled!==!0&&r.expandable!==!1,m=a!==`none`,h=a===`strict`,g=a===`leaf-filtered`,_=a===`leaf`||a===`leaf-filtered`,y=r.disabled!==!0&&r.tickable!==!1;_===!0&&y===!0&&i&&i.tickable!==!0&&(y=!1);let b=r.lazy;b===!0&&c.value[o]!==void 0&&Array.isArray(r[t.childrenKey])===!0&&(b=c.value[o]);let x={key:o,parent:i,isParent:s,lazy:b,disabled:r.disabled,link:r.disabled!==!0&&(d===!0||f===!0&&(s===!0||b===!0)),children:[],matchesFilter:t.filter?v.value(r,t.filter):!0,selected:o===t.selected&&d===!0,selectable:d,expanded:s===!0?u.value.includes(o):!1,expandable:f,noTick:r.noTick===!0||h!==!0&&b&&b!==`loaded`,tickable:y,tickStrategy:a,hasTicking:m,strictTicking:h,leafFilteredTicking:g,leafTicking:_,ticked:h===!0?l.value.includes(o):s===!0?!1:l.value.includes(o)};if(e[o]=x,s===!0&&(x.children=r[t.childrenKey].map(e=>n(e,x)),t.filter&&(x.matchesFilter===!0?x.noTick!==!0&&x.disabled!==!0&&x.tickable===!0&&g===!0&&x.children.every(e=>e.matchesFilter!==!0||e.noTick===!0||e.tickable!==!0)===!0&&(x.tickable=!1):x.matchesFilter=x.children.some(e=>e.matchesFilter)),x.matchesFilter===!0&&(x.noTick!==!0&&h!==!0&&x.children.every(e=>e.noTick)===!0&&(x.noTick=!0),_))){if(x.ticked=!1,x.indeterminate=x.children.some(e=>e.indeterminate===!0),x.tickable=x.tickable===!0&&x.children.some(e=>e.tickable),x.indeterminate!==!0){let e=x.children.reduce((e,t)=>t.ticked===!0?e+1:e,0);e===x.children.length?x.ticked=!0:e>0&&(x.indeterminate=!0)}x.indeterminate===!0&&(x.indeterminateNextState=x.children.every(e=>e.tickable!==!0||e.ticked!==!0))}return x};return t.nodes.forEach(e=>n(e,null)),e});(0,e.watch)(()=>t.ticked,e=>{l.value=e}),(0,e.watch)(()=>t.expanded,e=>{u.value=e});function b(e){let n=[].reduce,r=(i,a)=>{if(i||!a)return i;if(Array.isArray(a)===!0)return n.call(Object(a),r,i);if(a[t.nodeKey]===e)return a;if(a[t.childrenKey])return r(null,a[t.childrenKey])};return r(null,t.nodes)}function x(){return l.value.map(e=>b(e))}function S(){return u.value.map(e=>b(e))}function C(e){return e&&y.value[e]?y.value[e].expanded:!1}function w(){t.expanded===void 0?u.value=[]:i(`update:expanded`,[])}function T(){let e=[],n=r=>{r[t.childrenKey]&&r[t.childrenKey].length!==0&&r.expandable!==!1&&r.disabled!==!0&&(e.push(r[t.nodeKey]),r[t.childrenKey].forEach(n))};t.nodes.forEach(n),t.expanded===void 0?u.value=e:i(`update:expanded`,e)}function E(n,r,a=b(n),o=y.value[n]){if(o.lazy&&o.lazy!==`loaded`){if(o.lazy===`loading`)return;c.value[n]=`loading`,Array.isArray(a[t.childrenKey])!==!0&&(a[t.childrenKey]=[]),i(`lazyLoad`,{node:a,key:n,done:r=>{c.value[n]=`loaded`,a[t.childrenKey]=Array.isArray(r)===!0?r:[],(0,e.nextTick)(()=>{y.value[n]?.isParent===!0&&D(n,!0)})},fail:()=>{delete c.value[n],a[t.childrenKey].length===0&&delete a[t.childrenKey]}})}else o.isParent===!0&&o.expandable===!0&&D(n,r)}function D(e,n){let r=u.value,a=t.expanded!==void 0;if(a===!0&&(r=r.slice()),n){if(t.accordion&&y.value[e]){let n=[];y.value[e].parent?y.value[e].parent.children.forEach(t=>{t.key!==e&&t.expandable===!0&&n.push(t.key)}):t.nodes.forEach(r=>{let i=r[t.nodeKey];i!==e&&n.push(i)}),n.length!==0&&(r=r.filter(e=>n.includes(e)===!1))}r=r.concat([e]).filter((e,t,n)=>n.indexOf(e)===t)}else r=r.filter(t=>t!==e);a===!0?i(`update:expanded`,r):u.value=r}function k(e){return e&&y.value[e]?y.value[e].ticked:!1}function A(e,n){let r=l.value,a=t.ticked!==void 0;a===!0&&(r=r.slice()),r=n?r.concat(e).filter((e,t,n)=>n.indexOf(e)===t):r.filter(t=>e.includes(t)===!1),a===!0&&i(`update:ticked`,r)}function j(e,n,i){let o={tree:a,node:e,key:i,color:t.color,dark:s.value};return r(o,`expanded`,()=>n.expanded,e=>{e!==n.expanded&&E(i,e)}),r(o,`ticked`,()=>n.ticked,e=>{e!==n.ticked&&A([i],e)}),o}function M(e){return(t.filter?e.filter(e=>y.value[e[t.nodeKey]].matchesFilter):e).map(e=>I(e))}function N(t){if(t.icon!==void 0)return(0,e.h)(X,{class:`q-tree__icon q-mr-sm`,name:t.icon,color:t.iconColor});let n=t.img||t.avatar;if(n)return(0,e.h)(`img`,{class:`q-tree__${t.img?`img`:`avatar`} q-mr-sm`,src:n})}function P(){i(`afterShow`)}function F(){i(`afterHide`)}function I(r){let i=r[t.nodeKey],a=y.value[i],o=r.header&&n[`header-${r.header}`]||n[`default-header`],c=a.isParent===!0?M(r[t.childrenKey]):[],l=c.length!==0||a.lazy&&a.lazy!==`loaded`,u=r.body&&n[`body-${r.body}`]||n[`default-body`],f=o!==void 0||u!==void 0?j(r,a,i):null;return u!==void 0&&(u=(0,e.h)(`div`,{class:`q-tree__node-body relative-position`},[(0,e.h)(`div`,{class:g.value},[u(f)])])),(0,e.h)(`div`,{key:i,class:`q-tree__node relative-position q-tree__node--${l===!0?`parent`:`child`}`},[(0,e.h)(`div`,{class:`q-tree__node-header relative-position row no-wrap items-center`+(a.link===!0?` q-tree__node--link q-hoverable q-focusable`:``)+(a.selected===!0?` q-tree__node--selected`:``)+(a.disabled===!0?` q-tree__node--disabled`:``),tabindex:a.link===!0?0:-1,ariaExpanded:c.length>0?a.expanded:null,role:`treeitem`,onClick:e=>{R(r,a,e)},onKeypress(e){ee(e)!==!0&&(e.keyCode===13?R(r,a,e,!0):e.keyCode===32&&z(r,a,e,!0))}},[(0,e.h)(`div`,{class:`q-focus-helper`,tabindex:-1,ref:e=>{d[a.key]=e}}),a.lazy===`loading`?(0,e.h)(Ut,{class:`q-tree__spinner`,color:h.value}):l===!0?(0,e.h)(X,{class:`q-tree__arrow`+(a.expanded===!0?` q-tree__arrow--rotate`:``),name:m.value,onClick(e){z(r,a,e)}}):null,a.hasTicking===!0&&a.noTick!==!0?(0,e.h)(Hi,{class:`q-tree__tickbox`,modelValue:a.indeterminate===!0?null:a.ticked,color:h.value,dark:s.value,dense:!0,keepColor:!0,disable:a.tickable!==!0,onKeydown:O,"onUpdate:modelValue":e=>{B(a,e)}}):null,(0,e.h)(`div`,{class:`q-tree__node-header-content col row no-wrap items-center`+(a.selected===!0?_.value:g.value)},[o?o(f):[N(r),(0,e.h)(`div`,r[t.labelKey])]])]),l===!0?t.noTransition===!0?a.expanded===!0?(0,e.h)(`div`,{class:`q-tree__node-collapsible`+g.value,key:`${i}__q`},[u,(0,e.h)(`div`,{class:`q-tree__children`+(a.disabled===!0?` q-tree__node--disabled`:``),role:`group`},c)]):null:(0,e.h)(Ys,{duration:t.duration,onShow:P,onHide:F},()=>(0,e.withDirectives)((0,e.h)(`div`,{class:`q-tree__node-collapsible`+g.value,key:`${i}__q`},[u,(0,e.h)(`div`,{class:`q-tree__children`+(a.disabled===!0?` q-tree__node--disabled`:``),role:`group`},c)]),[[e.vShow,a.expanded]])):u])}function L(e){d[e]?.focus()}function R(e,n,r,a){a!==!0&&n.selectable!==!1&&L(n.key),p.value&&n.selectable?t.noSelectionUnset===!1?i(`update:selected`,n.key===t.selected?null:n.key):n.key!==t.selected&&i(`update:selected`,n.key===void 0?null:n.key):z(e,n,r,a),typeof e.handler==`function`&&e.handler(e)}function z(e,t,n,r){n!==void 0&&O(n),r!==!0&&t.selectable!==!1&&L(t.key),E(t.key,!t.expanded,e,t)}function B(e,t){if(e.indeterminate===!0&&(t=e.indeterminateNextState),e.strictTicking)A([e.key],t);else if(e.leafTicking){let n=[],r=e=>{e.isParent?(t!==!0&&e.noTick!==!0&&e.tickable===!0&&n.push(e.key),e.leafTicking===!0&&e.children.forEach(r)):e.noTick!==!0&&e.tickable===!0&&(e.leafFilteredTicking!==!0||e.matchesFilter===!0)&&n.push(e.key)};r(e),A(n,t)}}return t.defaultExpandAll===!0&&T(),Object.assign(a,{getNodeByKey:b,getTickedNodes:x,getExpandedNodes:S,isExpanded:C,collapseAll:w,expandAll:T,setExpanded:E,isTicked:k,setTicked:A}),()=>{let n=M(t.nodes);return(0,e.h)(`div`,{class:f.value,role:`tree`},n.length===0?t.filter?t.noResultsLabel||o.lang.tree.noResults:t.noNodesLabel||o.lang.tree.noNodes:n)}}});function Id(e){return(e*100).toFixed(2)+`%`}let Ld={...Z,...wc,label:String,color:String,textColor:String,square:Boolean,flat:Boolean,bordered:Boolean,noThumbnails:Boolean,thumbnailFit:{type:String,default:`cover`},autoUpload:Boolean,hideUploadBtn:Boolean,disable:Boolean,readonly:Boolean},Rd=[...Tc,`start`,`finish`,`added`,`removed`];function zd(t,n){let a=(0,e.getCurrentInstance)(),{props:o,slots:s,emit:c,proxy:l}=a,{$q:u}=l,d=Q(o,u);function f(e,t,n){if(e.__status=t,t===`idle`){e.__uploaded=0,e.__progress=0,e.__sizeLabel=Ne(e.size),e.__progressLabel=`0.00%`;return}if(t===`failed`){l.$forceUpdate();return}e.__uploaded=t===`uploaded`?e.size:n,e.__progress=t===`uploaded`?1:Math.min(.9999,e.__uploaded/e.size),e.__progressLabel=Id(e.__progress),l.$forceUpdate()}let p=(0,e.computed)(()=>o.disable!==!0&&o.readonly!==!0),m=(0,e.ref)(!1),h=(0,e.ref)(null),g=(0,e.ref)(null),_={files:(0,e.ref)([]),queuedFiles:(0,e.ref)([]),uploadedFiles:(0,e.ref)([]),uploadedSize:(0,e.ref)(0),updateFileStatus:f,isAlive:()=>Ot(a)===!1},{pickFiles:v,addFiles:y,onDragover:b,onDragleave:x,processFiles:S,getDndNode:C,maxFilesNumber:w,maxTotalSizeNumber:T}=Ec({editable:p,dnd:m,getFileInput:ee,addFilesToQueue:V});Object.assign(_,t({props:o,slots:s,emit:c,helpers:_,exposeApi:e=>{Object.assign(_,e)}})),_.isBusy===void 0&&(_.isBusy=(0,e.ref)(!1));let D=(0,e.ref)(0),O=(0,e.computed)(()=>D.value===0?0:_.uploadedSize.value/D.value),k=(0,e.computed)(()=>Id(O.value)),A=(0,e.computed)(()=>Ne(D.value)),j=(0,e.computed)(()=>p.value===!0&&_.isUploading.value!==!0&&(o.multiple===!0||_.queuedFiles.value.length===0)&&(o.maxFiles===void 0||_.files.value.lengthp.value===!0&&_.isBusy.value!==!0&&_.isUploading.value!==!0&&_.queuedFiles.value.length!==0);(0,e.provide)(_e,U);let N=(0,e.computed)(()=>`q-uploader column no-wrap`+(d.value===!0?` q-uploader--dark q-dark`:``)+(o.bordered===!0?` q-uploader--bordered`:``)+(o.square===!0?` q-uploader--square no-border-radius`:``)+(o.flat===!0?` q-uploader--flat no-shadow`:``)+(o.disable===!0?` disabled q-uploader--disable`:``)+(m.value===!0?` q-uploader--dnd`:``)),P=(0,e.computed)(()=>`q-uploader__header`+(o.color===void 0?``:` bg-${o.color}`)+(o.textColor===void 0?``:` text-${o.textColor}`));(0,e.watch)(_.isUploading,(e,t)=>{t===!1&&e===!0?c(`start`):t===!0&&e===!1&&c(`finish`)});function F(){o.disable===!1&&(_.abort(),_.uploadedSize.value=0,D.value=0,B(),_.files.value=[],_.queuedFiles.value=[],_.uploadedFiles.value=[])}function I(){o.disable===!1&&R([`uploaded`],()=>{_.uploadedFiles.value=[]})}function L(){R([`idle`,`failed`],({size:e})=>{D.value-=e,_.queuedFiles.value=[]})}function R(e,t){if(o.disable===!0)return;let n={files:[],size:0},r=_.files.value.filter(t=>e.indexOf(t.__status)===-1?!0:(n.size+=t.size,n.files.push(t),t.__img!==void 0&&window.URL.revokeObjectURL(t.__img.src),!1));n.files.length!==0&&(_.files.value=r,t(n),c(`removed`,n.files))}function z(e){o.disable||(e.__status===`uploaded`?_.uploadedFiles.value=_.uploadedFiles.value.filter(t=>t.__key!==e.__key):e.__status===`uploading`?e.__abort():D.value-=e.size,_.files.value=_.files.value.filter(t=>t.__key===e.__key?(t.__img!==void 0&&window.URL.revokeObjectURL(t.__img.src),!1):!0),_.queuedFiles.value=_.queuedFiles.value.filter(t=>t.__key!==e.__key),c(`removed`,[e]))}function B(){_.files.value.forEach(e=>{e.__img!==void 0&&window.URL.revokeObjectURL(e.__img.src)})}function ee(){return g.value||h.value.getElementsByClassName(`q-uploader__input`)[0]}function V(e,t){let n=S(e,t,_.files.value,!0),r=ee();r!=null&&(r.value=``),n!==void 0&&(n.forEach(e=>{if(_.updateFileStatus(e,`idle`),D.value+=e.size,o.noThumbnails!==!0&&e.type.toUpperCase().startsWith(`IMAGE`)){let t=new Image;t.src=window.URL.createObjectURL(e),e.__img=t}}),_.files.value=_.files.value.concat(n),_.queuedFiles.value=_.queuedFiles.value.concat(n),c(`added`,n),o.autoUpload===!0&&_.upload())}function H(){M.value===!0&&_.upload()}function te(t,n,r){if(t===!0){let t={type:`a`,key:n,icon:u.iconSet.uploader[n],flat:!0,dense:!0},i;return n===`add`?(t.onClick=v,i=U):t.onClick=r,(0,e.h)($,t,i)}}function U(){return(0,e.h)(`input`,{ref:g,class:`q-uploader__input overflow-hidden absolute-full`,tabindex:-1,type:`file`,title:``,accept:o.accept,multiple:o.multiple===!0?`multiple`:void 0,capture:o.capture,onMousedown:E,onClick:v,onChange:V})}function ne(){return s.header===void 0?[(0,e.h)(`div`,{class:`q-uploader__header-content column`},[(0,e.h)(`div`,{class:`flex flex-center no-wrap q-gutter-xs`},[te(_.queuedFiles.value.length!==0,`removeQueue`,L),te(_.uploadedFiles.value.length!==0,`removeUploaded`,I),_.isUploading.value===!0?(0,e.h)(Ut,{class:`q-uploader__spinner`}):null,(0,e.h)(`div`,{class:`col column justify-center`},[o.label===void 0?null:(0,e.h)(`div`,{class:`q-uploader__title`},[o.label]),(0,e.h)(`div`,{class:`q-uploader__subtitle`},[A.value+` / `+k.value])]),te(j.value,`add`),te(o.hideUploadBtn===!1&&M.value===!0,`upload`,_.upload),te(_.isUploading.value,`clear`,_.abort)])])]:s.header(G)}function W(){return s.list===void 0?_.files.value.map(t=>(0,e.h)(`div`,{key:t.__key,class:`q-uploader__file relative-position`+(o.noThumbnails!==!0&&t.__img!==void 0?` q-uploader__file--img`:``)+(t.__status===`failed`?` q-uploader__file--failed`:t.__status===`uploaded`?` q-uploader__file--uploaded`:``),style:o.noThumbnails!==!0&&t.__img!==void 0?{backgroundImage:`url("`+t.__img.src+`")`,backgroundSize:o.thumbnailFit}:null},[(0,e.h)(`div`,{class:`q-uploader__file-header row flex-center no-wrap`},[t.__status===`failed`?(0,e.h)(X,{class:`q-uploader__file-status`,name:u.iconSet.type.negative,color:`negative`}):null,(0,e.h)(`div`,{class:`q-uploader__file-header-content col`},[(0,e.h)(`div`,{class:`q-uploader__title`},[t.name]),(0,e.h)(`div`,{class:`q-uploader__subtitle row items-center no-wrap`},[t.__sizeLabel+` / `+t.__progressLabel])]),t.__status===`uploading`?(0,e.h)(Ji,{value:t.__progress,min:0,max:1,indeterminate:t.__progress===0}):(0,e.h)($,{round:!0,dense:!0,flat:!0,icon:u.iconSet.uploader[t.__status===`uploaded`?`done`:`clear`],onClick:()=>{z(t)}})])])):s.list(G)}(0,e.onBeforeUnmount)(()=>{_.isUploading.value===!0&&_.abort(),_.files.value.length!==0&&B()});let G={};for(let t in _)(0,e.isRef)(_[t])===!0?r(G,t,()=>_[t].value):G[t]=_[t];return Object.assign(G,{upload:H,reset:F,removeUploadedFiles:I,removeQueuedFiles:L,removeFile:z,pickFiles:v,addFiles:y}),i(G,{canAddFiles:()=>j.value,canUpload:()=>M.value,uploadSizeLabel:()=>A.value,uploadProgressLabel:()=>k.value}),n({..._,upload:H,reset:F,removeUploadedFiles:I,removeQueuedFiles:L,removeFile:z,pickFiles:v,addFiles:y,canAddFiles:j,canUpload:M,uploadSizeLabel:A,uploadProgressLabel:k}),()=>{let t=[(0,e.h)(`div`,{class:P.value},ne()),(0,e.h)(`div`,{class:`q-uploader__list scroll`},W()),C(`uploader`)];_.isBusy.value===!0&&t.push((0,e.h)(`div`,{class:`q-uploader__overlay absolute-full flex flex-center`},[(0,e.h)(Ut)]));let n={ref:h,class:N.value};return j.value===!0&&Object.assign(n,{onDragover:b,onDragleave:x}),(0,e.h)(`div`,n,t)}}let Bd=()=>!0;function Vd(e){let t={};return e.forEach(e=>{t[e]=Bd}),t}let Hd=Vd(Rd);var Ud=({name:e,props:t,emits:n,injectPlugin:r})=>h({name:e,props:{...Ld,...t},emits:Se(n)===!0?{...Hd,...n}:[...Rd,...n],setup(e,{expose:t}){return zd(r,t)}});function Wd(e){return typeof e==`function`?e:()=>e}let Gd={url:[Function,String],method:{type:[Function,String],default:`POST`},fieldName:{type:[Function,String],default:()=>e=>e.name},headers:[Function,Array],formFields:[Function,Array],withCredentials:[Function,Boolean],sendRaw:[Function,Boolean],batch:[Function,Boolean],factory:Function},Kd=[`factoryFailed`,`uploaded`,`failed`,`uploading`];function qd({props:t,emit:n,helpers:r}){let i=(0,e.ref)([]),a=(0,e.ref)([]),o=(0,e.ref)(0),s=(0,e.computed)(()=>({url:Wd(t.url),method:Wd(t.method),headers:Wd(t.headers),formFields:Wd(t.formFields),fieldName:Wd(t.fieldName),withCredentials:Wd(t.withCredentials),sendRaw:Wd(t.sendRaw),batch:Wd(t.batch)})),c=(0,e.computed)(()=>o.value>0),l=(0,e.computed)(()=>a.value.length!==0),u;function d(){i.value.forEach(e=>{e.abort()}),a.value.length!==0&&(u=!0)}function f(){let e=r.queuedFiles.value.slice(0);r.queuedFiles.value=[],s.value.batch(e)?p(e):e.forEach(e=>{p([e])})}function p(e){if(o.value++,typeof t.factory!=`function`){m(e,{});return}let i=t.factory(e);if(!i)n(`factoryFailed`,Error(`QUploader: factory() does not return properly`),e),o.value--;else if(typeof i.catch==`function`&&typeof i.then==`function`){a.value.push(i);let t=t=>{r.isAlive()===!0&&(a.value=a.value.filter(e=>e!==i),a.value.length===0&&(u=!1),r.queuedFiles.value=r.queuedFiles.value.concat(e),e.forEach(e=>{r.updateFileStatus(e,`failed`)}),n(`factoryFailed`,t,e),o.value--)};i.then(n=>{u===!0?t(Error(`Aborted`)):r.isAlive()===!0&&(a.value=a.value.filter(e=>e!==i),m(e,n))}).catch(t)}else m(e,i||{})}function m(e,t){let a=new FormData,c=new XMLHttpRequest,l=(e,n)=>t[e]===void 0?s.value[e](n):Wd(t[e])(n),u=l(`url`,e);if(!u){console.error(`q-uploader: invalid or no URL specified`),o.value--;return}let d=l(`formFields`,e);d!==void 0&&d.forEach(e=>{a.append(e.name,e.value)});let f=0,p=0,m=0,h=0,g;c.upload.addEventListener(`progress`,t=>{if(g===!0)return;let n=Math.min(h,t.loaded);r.uploadedSize.value+=n-m,m=n;let i=m-p;for(let t=f;i>0&&tn.size)i-=n.size,f++,p+=n.size,r.updateFileStatus(n,`uploading`,n.size);else{r.updateFileStatus(n,`uploading`,i);return}}},!1),c.onreadystatechange=()=>{c.readyState<4||(c.status&&c.status<400?(r.uploadedFiles.value=r.uploadedFiles.value.concat(e),e.forEach(e=>{r.updateFileStatus(e,`uploaded`)}),n(`uploaded`,{files:e,xhr:c})):(g=!0,r.uploadedSize.value-=m,r.queuedFiles.value=r.queuedFiles.value.concat(e),e.forEach(e=>{r.updateFileStatus(e,`failed`)}),n(`failed`,{files:e,xhr:c})),o.value--,i.value=i.value.filter(e=>e!==c))},c.open(l(`method`,e),u),l(`withCredentials`,e)===!0&&(c.withCredentials=!0);let _=l(`headers`,e);_!==void 0&&_.forEach(e=>{c.setRequestHeader(e.name,e.value)});let v=l(`sendRaw`,e);e.forEach(e=>{r.updateFileStatus(e,`uploading`,0),v!==!0&&a.append(l(`fieldName`,e),e,e.name),e.xhr=c,e.__abort=()=>{c.abort()},h+=e.size}),n(`uploading`,{files:e,xhr:c}),i.value.push(c),v===!0?c.send(new Blob(e)):c.send(a)}return{isUploading:c,isBusy:l,abort:d,upload:f}}var Jd=Ud({name:`QUploader`,props:Gd,emits:Kd,injectPlugin:qd}),Yd=h({name:`QUploaderAddTrigger`,setup(){let t=(0,e.inject)(_e,q);return t===q&&console.error(`QUploaderAddTrigger needs to be child of QUploader`),t}}),Xd=h({name:`QVideo`,props:{...Nc,src:{type:String,required:!0},title:String,fetchpriority:{type:String,default:`auto`},loading:{type:String,default:`eager`},referrerpolicy:{type:String,default:`strict-origin-when-cross-origin`}},setup(t){let n=Pc(t),r=(0,e.computed)(()=>`q-video`+(t.ratio===void 0?``:` q-video--responsive`));return()=>(0,e.h)(`div`,{class:r.value,style:n.value},[(0,e.h)(`iframe`,{src:t.src,title:t.title,fetchpriority:t.fetchpriority,loading:t.loading,referrerpolicy:t.referrerpolicy,frameborder:`0`,allowfullscreen:!0})])}}),Zd=n({QAjaxBar:()=>qe,QAvatar:()=>ht,QBadge:()=>_t,QBanner:()=>vt,QBar:()=>yt,QBreadcrumbs:()=>At,QBreadcrumbsEl:()=>Bt,QBtn:()=>$,QBtnDropdown:()=>ii,QBtnGroup:()=>yn,QBtnToggle:()=>li,QCard:()=>ui,QCardActions:()=>fi,QCardSection:()=>di,QCarousel:()=>Mi,QCarouselControl:()=>Pi,QCarouselSlide:()=>Ni,QChatMessage:()=>Fi,QCheckbox:()=>Hi,QChip:()=>Wi,QCircularProgress:()=>Ji,QColor:()=>Wa,QDate:()=>ns,QDialog:()=>Cs,QDrawer:()=>ws,QEditor:()=>qs,QExpansionItem:()=>tc,QFab:()=>sc,QFabAction:()=>uc,QField:()=>xc,QFile:()=>Oc,QFooter:()=>kc,QForm:()=>Ac,QFormChildMixin:()=>jc,QHeader:()=>Mc,QIcon:()=>X,QImg:()=>Fc,QInfiniteScroll:()=>Lc,QInnerLoading:()=>Rc,QInput:()=>$c,QIntersection:()=>il,QItem:()=>js,QItemLabel:()=>Js,QItemSection:()=>Ms,QKnob:()=>ll,QLayout:()=>pl,QLinearProgress:()=>Bl,QList:()=>ol,QMarkupTable:()=>hl,QMenu:()=>Kr,QNoSsr:()=>gl,QOptionGroup:()=>Cl,QPage:()=>wl,QPageContainer:()=>Tl,QPageScroller:()=>Ol,QPageSticky:()=>kl,QPagination:()=>jl,QParallax:()=>Pl,QPopupEdit:()=>Il,QPopupProxy:()=>Ll,QPullToRefresh:()=>Vl,QRadio:()=>vl,QRange:()=>Ul,QRating:()=>Wl,QResizeObserver:()=>la,QResponsive:()=>Gl,QRouteTab:()=>Ed,QScrollArea:()=>Zl,QScrollObserver:()=>fl,QSelect:()=>pu,QSeparator:()=>Qs,QSkeleton:()=>gu,QSlideItem:()=>vu,QSlideTransition:()=>Ys,QSlider:()=>aa,QSpace:()=>yu,QSpinner:()=>Ut,QSpinnerAudio:()=>bu,QSpinnerBall:()=>xu,QSpinnerBars:()=>Su,QSpinnerBox:()=>Cu,QSpinnerClock:()=>wu,QSpinnerComment:()=>Tu,QSpinnerCube:()=>Eu,QSpinnerDots:()=>Du,QSpinnerFacebook:()=>Ou,QSpinnerGears:()=>ku,QSpinnerGrid:()=>Au,QSpinnerHearts:()=>ju,QSpinnerHourglass:()=>Mu,QSpinnerInfinity:()=>Nu,QSpinnerIos:()=>Pu,QSpinnerOrbit:()=>Fu,QSpinnerOval:()=>Iu,QSpinnerPie:()=>Lu,QSpinnerPuff:()=>Ru,QSpinnerRadio:()=>zu,QSpinnerRings:()=>Bu,QSpinnerTail:()=>Vu,QSplitter:()=>Hu,QStep:()=>Ku,QStepper:()=>Yu,QStepperNavigation:()=>Xu,QTab:()=>va,QTabPanel:()=>ba,QTabPanels:()=>ya,QTable:()=>Cd,QTabs:()=>pa,QTd:()=>Td,QTh:()=>Zu,QTime:()=>kd,QTimeline:()=>Ad,QTimelineEntry:()=>jd,QToggle:()=>yl,QToolbar:()=>Md,QToolbarTitle:()=>Nd,QTooltip:()=>As,QTr:()=>wd,QTree:()=>Fd,QUploader:()=>Jd,QUploaderAddTrigger:()=>Yd,QVideo:()=>Xd,QVirtualScroll:()=>td});function Qd(e){if(e===!1)return 0;if(e===!0||e===void 0)return 1;let t=parseInt(e,10);return isNaN(t)?0:t}var $d=g({name:`close-popup`,beforeMount(e,{value:t}){let n={depth:Qd(t),handler(t){n.depth!==0&&setTimeout(()=>{let r=Un(e);r!==void 0&&Gn(r,t,n.depth)})},handlerKey(e){V(e,13)===!0&&n.handler(e)}};e.__qclosepopup=n,e.addEventListener(`click`,n.handler),e.addEventListener(`keyup`,n.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=Qd(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});let ef=0,tf;function nf(e,t){tf===void 0&&(tf=document.createElement(`div`),tf.style.cssText=`position: absolute; left: 0; top: 0`,document.body.appendChild(tf));let n=e.getBoundingClientRect(),r=tf.getBoundingClientRect(),{marginLeft:i,marginRight:a,marginTop:o,marginBottom:s}=window.getComputedStyle(e),c=parseInt(i,10)+parseInt(a,10),l=parseInt(o,10)+parseInt(s,10);return{left:n.left-r.left,top:n.top-r.top,width:n.right-n.left,height:n.bottom-n.top,widthM:n.right-n.left+(t===!0?0:c),heightM:n.bottom-n.top+(t===!0?0:l),marginH:t===!0?c:0,marginV:t===!0?l:0}}function rf(e){return{width:e.scrollWidth,height:e.scrollHeight}}let af=[`Top`,`Right`,`Bottom`,`Left`],of=[`borderTopLeftRadius`,`borderTopRightRadius`,`borderBottomRightRadius`,`borderBottomLeftRadius`],sf=/-block|-inline|block-|inline-/,cf=/(-block|-inline|block-|inline-).*:/;function lf(e,t){let n=window.getComputedStyle(e),r={};for(let e=0;ecf.test(e)!==!0).join(`;`):r[i]=n[i]}return r}let uf=[`absolute`,`fixed`,`relative`,`sticky`];function df(e){let t=e,n=0;for(;t!==null&&t!==document;){let{position:r,zIndex:i}=window.getComputedStyle(t),a=Number(i);a>n&&(t===e||uf.includes(r)===!0)&&(n=a),t=t.parentNode}return n}function ff(e){return{from:e.from,to:e.to===void 0?e.from:e.to}}function pf(e){return typeof e==`number`?e={duration:e}:typeof e==`function`&&(e={onEnd:e}),{...e,waitFor:e.waitFor===void 0?0:e.waitFor,duration:isNaN(e.duration)===!0?300:parseInt(e.duration,10),easing:typeof e.easing==`string`&&e.easing.length!==0?e.easing:`ease-in-out`,delay:isNaN(e.delay)===!0?0:parseInt(e.delay,10),fill:typeof e.fill==`string`&&e.fill.length!==0?e.fill:`none`,resize:e.resize===!0,useCSS:e.useCSS===!0||e.usecss===!0,hideFromClone:e.hideFromClone===!0||e.hidefromclone===!0,keepToClone:e.keepToClone===!0||e.keeptoclone===!0,tween:e.tween===!0,tweenFromOpacity:isNaN(e.tweenFromOpacity)===!0?.6:parseFloat(e.tweenFromOpacity),tweenToOpacity:isNaN(e.tweenToOpacity)===!0?.5:parseFloat(e.tweenToOpacity)}}function mf(e){let t=typeof e;return t===`function`?e():t===`string`?document.querySelector(e):e}function hf(e){return e&&e.ownerDocument===document&&e.parentNode!==null}function gf(e){let t=()=>!1,n=!1,r=!0,i=ff(e),a=pf(e),o=mf(i.from);if(hf(o)!==!0)return t;typeof o.qMorphCancel==`function`&&o.qMorphCancel();let s,c,l,u,d=o.parentNode,f=o.nextElementSibling,p=nf(o,a.resize),{width:m,height:h}=rf(d),{borderWidth:g,borderStyle:_,borderColor:v,borderRadius:y,backgroundColor:b,transform:x,position:S,cssText:C}=lf(o,[`borderWidth`,`borderStyle`,`borderColor`,`borderRadius`,`backgroundColor`,`transform`,`position`,`cssText`]),w=o.classList.toString(),T=o.style.cssText,E=o.cloneNode(!0),D=a.tween===!0?o.cloneNode(!0):void 0;return D!==void 0&&(D.className=D.classList.toString().split(` `).filter(e=>/^bg-/.test(e)===!1).join(` `)),a.hideFromClone===!0&&E.classList.add(`q-morph--internal`),E.setAttribute(`aria-hidden`,`true`),E.style.transition=`none`,E.style.animation=`none`,E.style.pointerEvents=`none`,d.insertBefore(E,f),o.qMorphCancel=()=>{n=!0,E.remove(),D?.remove(),a.hideFromClone===!0&&E.classList.remove(`q-morph--internal`),o.qMorphCancel=void 0},typeof e.onToggle==`function`&&e.onToggle(),requestAnimationFrame(()=>{let e=mf(i.to);if(n===!0||hf(e)!==!0){typeof o.qMorphCancel==`function`&&o.qMorphCancel();return}o!==e&&typeof e.qMorphCancel==`function`&&e.qMorphCancel(),a.keepToClone!==!0&&e.classList.add(`q-morph--internal`),E.classList.add(`q-morph--internal`);let{width:f,height:O}=rf(d),{width:k,height:A}=rf(e.parentNode);a.hideFromClone!==!0&&E.classList.remove(`q-morph--internal`),e.qMorphCancel=()=>{n=!0,E.remove(),D?.remove(),a.hideFromClone===!0&&E.classList.remove(`q-morph--internal`),a.keepToClone!==!0&&e.classList.remove(`q-morph--internal`),o.qMorphCancel=void 0,e.qMorphCancel=void 0};let j=()=>{if(n===!0){typeof e.qMorphCancel==`function`&&e.qMorphCancel();return}a.hideFromClone!==!0&&(E.classList.add(`q-morph--internal`),E.innerHTML=``,E.style.left=0,E.style.right=`unset`,E.style.top=0,E.style.bottom=`unset`,E.style.transform=`none`),a.keepToClone!==!0&&e.classList.remove(`q-morph--internal`);let i=e.parentNode,{width:j,height:M}=rf(i),N=e.cloneNode(a.keepToClone);N.setAttribute(`aria-hidden`,`true`),a.keepToClone!==!0&&(N.style.left=0,N.style.right=`unset`,N.style.top=0,N.style.bottom=`unset`,N.style.transform=`none`,N.style.pointerEvents=`none`),N.classList.add(`q-morph--internal`);let P=e===o&&d===i?E:e.nextElementSibling;i.insertBefore(N,P);let{borderWidth:F,borderStyle:I,borderColor:L,borderRadius:R,backgroundColor:z,transform:B,position:ee,cssText:V}=lf(e,[`borderWidth`,`borderStyle`,`borderColor`,`borderRadius`,`backgroundColor`,`transform`,`position`,`cssText`]),H=e.classList.toString(),te=e.style.cssText;e.style.cssText=V,e.style.transform=`none`,e.style.animation=`none`,e.style.transition=`none`,e.className=H.split(` `).filter(e=>/^bg-/.test(e)===!1).join(` `);let U=nf(e,a.resize),ne=p.left-U.left,W=p.top-U.top,G=p.width/(U.width>0?U.width:10),re=p.height/(U.height>0?U.height:100),K=m-f,ie=h-O,ae=j-k,oe=M-A,se=Math.max(p.widthM,K),ce=Math.max(p.heightM,ie),le=Math.max(U.widthM,ae),ue=Math.max(U.heightM,oe),de=o===e&&[`absolute`,`fixed`].includes(ee)===!1&&[`absolute`,`fixed`].includes(S)===!1,fe=ee===`fixed`,pe=i;for(;fe!==!0&&pe!==document;)fe=window.getComputedStyle(pe).position===`fixed`,pe=pe.parentNode;if(a.hideFromClone!==!0&&(E.style.display=`block`,E.style.flex=`0 0 auto`,E.style.opacity=0,E.style.minWidth=`unset`,E.style.maxWidth=`unset`,E.style.minHeight=`unset`,E.style.maxHeight=`unset`,E.classList.remove(`q-morph--internal`)),a.keepToClone!==!0&&(N.style.display=`block`,N.style.flex=`0 0 auto`,N.style.opacity=0,N.style.minWidth=`unset`,N.style.maxWidth=`unset`,N.style.minHeight=`unset`,N.style.maxHeight=`unset`),N.classList.remove(`q-morph--internal`),typeof a.classes==`string`&&(e.className+=` `+a.classes),typeof a.style==`string`)e.style.cssText+=` `+a.style;else if(Se(a.style)===!0)for(let t in a.style)e.style[t]=a.style[t];let me=df(E),he=df(e),ge=fe===!0?document.documentElement:{scrollLeft:0,scrollTop:0};e.style.position=fe===!0?`fixed`:`absolute`,e.style.left=`${U.left-ge.scrollLeft}px`,e.style.right=`unset`,e.style.top=`${U.top-ge.scrollTop}px`,e.style.margin=0,a.resize===!0&&(e.style.minWidth=`unset`,e.style.maxWidth=`unset`,e.style.minHeight=`unset`,e.style.maxHeight=`unset`,e.style.overflow=`hidden`,e.style.overflowX=`hidden`,e.style.overflowY=`hidden`),document.body.appendChild(e),D!==void 0&&(D.style.cssText=C,D.style.transform=`none`,D.style.animation=`none`,D.style.transition=`none`,D.style.position=e.style.position,D.style.left=`${p.left-ge.scrollLeft}px`,D.style.right=`unset`,D.style.top=`${p.top-ge.scrollTop}px`,D.style.margin=0,D.style.pointerEvents=`none`,a.resize===!0&&(D.style.minWidth=`unset`,D.style.maxWidth=`unset`,D.style.minHeight=`unset`,D.style.maxHeight=`unset`,D.style.overflow=`hidden`,D.style.overflowX=`hidden`,D.style.overflowY=`hidden`),document.body.appendChild(D));let _e=n=>{o===e&&r!==!0?(e.style.cssText=T,e.className=w):(e.style.cssText=te,e.className=H),N.parentNode===i&&i.insertBefore(e,N),E.remove(),N.remove(),D?.remove(),t=()=>!1,o.qMorphCancel=void 0,e.qMorphCancel=void 0,typeof a.onEnd==`function`&&a.onEnd(r===!0?`to`:`from`,n===!0)};if(a.useCSS!==!0&&typeof e.animate==`function`){let i=a.resize===!0?{transform:`translate(${ne}px, ${W}px)`,width:`${se}px`,height:`${ce}px`}:{transform:`translate(${ne}px, ${W}px) scale(${G}, ${re})`},d=a.resize===!0?{width:`${le}px`,height:`${ue}px`}:{},f=a.resize===!0?{width:`${se}px`,height:`${ce}px`}:{},m=a.resize===!0?{transform:`translate(${-1*ne}px, ${-1*W}px)`,width:`${le}px`,height:`${ue}px`}:{transform:`translate(${-1*ne}px, ${-1*W}px) scale(${1/G}, ${1/re})`},h=D===void 0?{backgroundColor:b}:{opacity:a.tweenToOpacity},S=D===void 0?{backgroundColor:z}:{opacity:1};u=e.animate([{margin:0,borderWidth:g,borderStyle:_,borderColor:v,borderRadius:y,zIndex:me,transformOrigin:`0 0`,...i,...h},{margin:0,borderWidth:F,borderStyle:I,borderColor:L,borderRadius:R,zIndex:he,transformOrigin:`0 0`,transform:B,...d,...S}],{duration:a.duration,easing:a.easing,fill:a.fill,delay:a.delay}),c=D===void 0?void 0:D.animate([{opacity:a.tweenFromOpacity,margin:0,borderWidth:g,borderStyle:_,borderColor:v,borderRadius:y,zIndex:me,transformOrigin:`0 0`,transform:x,...f},{opacity:0,margin:0,borderWidth:F,borderStyle:I,borderColor:L,borderRadius:R,zIndex:he,transformOrigin:`0 0`,...m}],{duration:a.duration,easing:a.easing,fill:a.fill,delay:a.delay}),s=a.hideFromClone===!0||de===!0?void 0:E.animate([{margin:`${ie<0?ie/2:0}px ${K<0?K/2:0}px`,width:`${se+p.marginH}px`,height:`${ce+p.marginV}px`},{margin:0,width:0,height:0}],{duration:a.duration,easing:a.easing,fill:a.fill,delay:a.delay}),l=a.keepToClone===!0?void 0:N.animate([de===!0?{margin:`${ie<0?ie/2:0}px ${K<0?K/2:0}px`,width:`${se+p.marginH}px`,height:`${ce+p.marginV}px`}:{margin:0,width:0,height:0},{margin:`${oe<0?oe/2:0}px ${ae<0?ae/2:0}px`,width:`${le+U.marginH}px`,height:`${ue+U.marginV}px`}],{duration:a.duration,easing:a.easing,fill:a.fill,delay:a.delay});let C=e=>{s?.cancel(),c?.cancel(),l?.cancel(),u.cancel(),u.removeEventListener(`finish`,C),u.removeEventListener(`cancel`,C),_e(e),s=void 0,c=void 0,l=void 0,u=void 0};o.qMorphCancel=()=>{o.qMorphCancel=void 0,n=!0,C()},e.qMorphCancel=()=>{e.qMorphCancel=void 0,n=!0,C()},u.addEventListener(`finish`,C),u.addEventListener(`cancel`,C),t=e=>n===!0||u===void 0?!1:e===!0?(C(!0),!0):(r=r!==!0,s?.reverse(),c?.reverse(),l?.reverse(),u.reverse(),!0)}else{let i=`q-morph-anim-${++ef}`,s=document.createElement(`style`),c=a.resize===!0?` + transform: translate(${ne}px, ${W}px); + width: ${se}px; + height: ${ce}px; + `:`transform: translate(${ne}px, ${W}px) scale(${G}, ${re});`,l=a.resize===!0?` + width: ${le}px; + height: ${ue}px; `:``,u=a.resize===!0?` - width: ${oe}px; - height: ${se}px; + width: ${se}px; + height: ${ce}px; `:``,d=a.resize===!0?` - transform: translate(${-1*U}px, ${-1*W}px); - width: ${ce}px; - height: ${le}px; - `:`transform: translate(${-1*U}px, ${-1*W}px) scale(${1/G}, ${1/K});`,f=D===void 0?`background-color: ${b};`:`opacity: ${a.tweenToOpacity};`,m=D===void 0?`background-color: ${ee};`:`opacity: 1;`,h=D===void 0?``:` + transform: translate(${-1*ne}px, ${-1*W}px); + width: ${le}px; + height: ${ue}px; + `:`transform: translate(${-1*ne}px, ${-1*W}px) scale(${1/G}, ${1/re});`,f=D===void 0?`background-color: ${b};`:`opacity: ${a.tweenToOpacity};`,m=D===void 0?`background-color: ${z};`:`opacity: 1;`,h=D===void 0?``:` @keyframes ${i}-from-tween { 0% { opacity: ${a.tweenFromOpacity}; @@ -36,7 +36,7 @@ border-style: ${_}; border-color: ${v}; border-radius: ${y}; - z-index: ${pe}; + z-index: ${me}; transform-origin: 0 0; transform: ${x}; ${u} @@ -49,17 +49,17 @@ border-style: ${I}; border-color: ${L}; border-radius: ${R}; - z-index: ${me}; + z-index: ${he}; transform-origin: 0 0; ${d} } } - `,S=a.hideFromClone===!0||ue===!0?``:` + `,S=a.hideFromClone===!0||de===!0?``:` @keyframes ${i}-from { 0% { - margin: ${re<0?re/2:0}px ${q<0?q/2:0}px; - width: ${oe+p.marginH}px; - height: ${se+p.marginV}px; + margin: ${ie<0?ie/2:0}px ${K<0?K/2:0}px; + width: ${se+p.marginH}px; + height: ${ce+p.marginV}px; } 100% { @@ -68,26 +68,14 @@ height: 0; } } - `,C=ue===!0?` - margin: ${re<0?re/2:0}px ${q<0?q/2:0}px; - width: ${oe+p.marginH}px; - height: ${se+p.marginV}px; + `,C=de===!0?` + margin: ${ie<0?ie/2:0}px ${K<0?K/2:0}px; + width: ${se+p.marginH}px; + height: ${ce+p.marginV}px; `:` margin: 0; width: 0; height: 0; - `,w=a.keepToClone===!0?``:` - @keyframes ${i}-to { - 0% { - ${C} - } - - 100% { - margin: ${ae<0?ae/2:0}px ${ie<0?ie/2:0}px; - width: ${ce+H.marginH}px; - height: ${le+H.marginV}px; - } - } `;s.innerHTML=` @keyframes ${i} { 0% { @@ -97,7 +85,7 @@ border-color: ${v}; border-radius: ${y}; background-color: ${b}; - z-index: ${pe}; + z-index: ${me}; transform-origin: 0 0; ${c} ${f} @@ -109,10 +97,10 @@ border-style: ${I}; border-color: ${L}; border-radius: ${R}; - background-color: ${ee}; - z-index: ${me}; + background-color: ${z}; + z-index: ${he}; transform-origin: 0 0; - transform: ${z}; + transform: ${B}; ${l} ${m} } @@ -122,5 +110,17 @@ ${h} - ${w} - `,document.head.append(s);let T=`normal`;E.style.animation=`${a.duration}ms ${a.easing} ${a.delay}ms ${T} ${a.fill} ${i}-from`,D!==void 0&&(D.style.animation=`${a.duration}ms ${a.easing} ${a.delay}ms ${T} ${a.fill} ${i}-from-tween`),N.style.animation=`${a.duration}ms ${a.easing} ${a.delay}ms ${T} ${a.fill} ${i}-to`,e.style.animation=`${a.duration}ms ${a.easing} ${a.delay}ms ${T} ${a.fill} ${i}`;let O=t=>{(t!==Object(t)||t.animationName===i)&&(e.removeEventListener(`animationend`,O),e.removeEventListener(`animationcancel`,O),ge(),s.remove())};o.qMorphCancel=()=>{o.qMorphCancel=void 0,n=!0,O()},e.qMorphCancel=()=>{e.qMorphCancel=void 0,n=!0,O()},e.addEventListener(`animationend`,O),e.addEventListener(`animationcancel`,O),t=t=>n===!0||!e||!E||!N?!1:t===!0?(O(),!0):(r=r!==!0,T=T===`normal`?`reverse`:`normal`,E.style.animationDirection=T,D.style.animationDirection=T,N.style.animationDirection=T,e.style.animationDirection=T,!0)}};a.waitFor>0||a.waitFor===`transitionend`||a.waitFor===Object(a.waitFor)&&typeof a.waitFor.then==`function`?(a.waitFor>0?new Promise(e=>{setTimeout(e,a.waitFor)}):a.waitFor===`transitionend`?new Promise(t=>{let n=()=>{r!==null&&(clearTimeout(r),r=null),e&&(e.removeEventListener(`transitionend`,n),e.removeEventListener(`transitioncancel`,n)),t?.(),t=null},r=setTimeout(n,400);e.addEventListener(`transitionend`,n),e.addEventListener(`transitioncancel`,n)}):a.waitFor).then(j).catch(()=>{typeof e.qMorphCancel==`function`&&e.qMorphCancel()}):j()}),e=>t(e)}let np={},rp=[`duration`,`delay`,`easing`,`fill`,`classes`,`style`,`duration`,`resize`,`useCSS`,`hideFromClone`,`keepToClone`,`tween`,`tweenFromOpacity`,`tweenToOpacity`,`waitFor`,`onEnd`],ip=[`resize`,`useCSS`,`hideFromClone`,`keepToClone`,`tween`];function ap(e,t){e.clsAction!==t&&(e.clsAction=t,e.el.classList[t](`q-morph--invisible`))}function op(e){if(e.animating||e.queue.length<2)return;let[t,n]=e.queue;e.animating=!0,t.animating=!0,n.animating=!0,ap(t,`remove`),ap(n,`remove`);let r=tp({from:t.el,to:n.el,onToggle(){ap(t,`add`),ap(n,`remove`)},...n.opts,onEnd(r,i){n.opts.onEnd?.(r,i),!i&&(t.animating=!1,n.animating=!1,e.animating=!1,e.cancel=void 0,e.queue.shift(),op(e))}});e.cancel=()=>{r(!0),e.cancel=void 0}}function sp(e,t){let n=t.opts;ip.forEach(t=>{n[t]=e[t]===!0})}function cp(e,t){let n=typeof e==`string`&&e.length!==0?e.split(`:`):[];t.name=n[0],t.group=n[1];let r=Number.parseFloat(n[2]);Object.assign(t.opts,{duration:Number.isFinite(r)?r:300,waitFor:n[3]})}function lp(e,t){e.group!==void 0&&(t.group=e.group),e.name!==void 0&&(t.name=e.name);let n=t.opts;rp.forEach(t=>{e[t]!==void 0&&(n[t]=e[t])})}function up(e,t){if(t.name===e){let n=np[t.group];n===void 0?(np[t.group]={name:t.group,model:e,queue:[t],animating:!1},ap(t,`remove`)):n.model!==e&&(n.model=e,n.queue.push(t),!n.animating&&n.queue.length===2&&op(n));return}t.animating||ap(t,`add`)}function dp(e,t){let n;Object(t)===t?(n=String(t.model),lp(t,e),sp(t,e)):n=String(t),n===e.model?!e.animating&&e.clsAction!==void 0&&e.el.classList[e.clsAction](`q-morph--invisible`):(e.model=n,up(n,e))}var fp=g({name:`morph`,mounted(e,t){let n={el:e,animating:!1,opts:{}};sp(t.modifiers,n),cp(t.arg,n),dp(n,t.value),e.__qmorph=n},updated(e,t){dp(e.__qmorph,t.value)},beforeUnmount(e){let t=e.__qmorph,n=np[t.group];n?.queue.includes(t)&&(n.queue=n.queue.filter(e=>e!==t),n.queue.length===0&&(n.cancel?.(),delete np[t.group])),t.clsAction===`add`&&e.classList.remove(`q-morph--invisible`),delete e.__qmorph}});let pp={childList:!0,subtree:!0,attributes:!0,characterData:!0,attributeOldValue:!0,characterDataOldValue:!0};function mp(e,t,n){t.handler=n,t.observer?.disconnect(),t.observer=new MutationObserver(n=>{typeof t.handler==`function`&&(t.handler(n)===!1||t.once===!0)&&hp(e)}),t.observer.observe(e,t.opts)}function hp(e){let t=e.__qmutation;t!==void 0&&(t.observer?.disconnect(),delete e.__qmutation)}var gp=g({name:`mutation`,mounted(e,{modifiers:{once:t,...n},value:r}){let i={once:t,opts:Object.keys(n).length===0?pp:n};mp(e,i,r),e.__qmutation=i},updated(e,{oldValue:t,value:n}){let r=e.__qmutation;r!==void 0&&t!==n&&mp(e,r,n)},beforeUnmount:hp});let{passive:_p}=v;function vp(e,{value:t,oldValue:n}){if(typeof t!=`function`){e.scrollTarget.removeEventListener(`scroll`,e.scroll,_p);return}e.handler=t,typeof n!=`function`&&(e.scrollTarget.addEventListener(`scroll`,e.scroll,_p),e.scroll())}var yp=g({name:`scroll-fire`,mounted(e,t){let n={scrollTarget:nr(e),scroll:N(()=>{let t,r;n.scrollTarget===window?(r=e.getBoundingClientRect().bottom,t=window.innerHeight):(r=Ut(e).top+Gt(e),t=Ut(n.scrollTarget).top+Gt(n.scrollTarget)),r>0&&r{r.styleCleanup=void 0,e===!0?(xn(),setTimeout(Sp,10)):Sp()}),r.triggered=!1,r.sensitivity=t?r.mouseSensitivity:r.touchSensitivity,r.timer=setTimeout(()=>{r.timer=void 0,xn(),r.triggered=!0,r.handler({evt:e,touch:!t,mouse:t===!0,position:r.origin,duration:Date.now()-n})},r.duration)},move(e){let{top:t,left:n}=C(e);r.timer!==void 0&&(Math.abs(n-r.origin.left)>=r.sensitivity||Math.abs(t-r.origin.top)>=r.sensitivity)&&(clearTimeout(r.timer),r.timer=void 0)},end(e){j(r,`temp`),r.styleCleanup?.(r.triggered),r.triggered?e!==void 0&&O(e):r.timer!==void 0&&(clearTimeout(r.timer),r.timer=void 0)}},i=[600,5,7];typeof t.arg==`string`&&t.arg.length!==0&&t.arg.split(`:`).forEach((e,t)=>{let n=Number.parseInt(e,10);n&&(i[t]=n)}),[r.duration,r.touchSensitivity,r.mouseSensitivity]=i,e.__qtouchhold=r,n.mouse&&A(r,`main`,[[e,`mousedown`,`mouseStart`,`passive${n.mouseCapture||n.mousecapture?`Capture`:``}`]]),p.has.touch&&A(r,`main`,[[e,`touchstart`,`touchStart`,`passive${n.capture?`Capture`:``}`],[e,`touchend`,`noop`,`notPassiveCapture`]])},updated(e,t){let n=e.__qtouchhold;n!==void 0&&t.oldValue!==t.value&&(typeof t.value!=`function`&&n.end(),n.handler=t.value)},beforeUnmount(e){let t=e.__qtouchhold;t!==void 0&&(j(t,`main`),j(t,`temp`),t.timer!==void 0&&clearTimeout(t.timer),t.styleCleanup?.(),delete e.__qtouchhold)}});let wp={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Tp=RegExp(`^([\\d+]+|${Object.keys(wp).join(`|`)})$`,`i`);function Ep(e,t){let{top:n,left:r}=C(e);return Math.abs(r-t.left)>=7||Math.abs(n-t.top)>=7}function Dp(){document.body.classList.remove(`non-selectable`)}var Op=g({name:`touch-repeat`,beforeMount(e,{modifiers:t,value:n,arg:r}){let i=Object.keys(t).reduce((e,t)=>{if(Tp.test(t)){let n=Number.parseInt(t,10),r=Number.isNaN(n)?wp[t.toLowerCase()]:n;r!==void 0&&e.push(...[r].flat())}return e},[]);if(!t.mouse&&!p.has.touch&&i.length===0)return;let a=typeof r==`string`&&r.length!==0?r.split(`:`).map(e=>Number.parseInt(e,10)):[0,600,300],o=a.length-1,s={keyboard:i,handler:n,noop:y,mouseStart(e){s.event===void 0&&typeof s.handler==`function`&&b(e)&&(A(s,`temp`,[[document,`mousemove`,`move`,`passiveCapture`],[document,`click`,`end`,`notPassiveCapture`]]),s.start(e,!0))},keyboardStart(t){if(typeof s.handler==`function`&&B(t,i)){if((a[0]===0||s.event!==void 0)&&(O(t),e.focus(),s.event!==void 0))return;A(s,`temp`,[[document,`keyup`,`end`,`notPassiveCapture`],[document,`click`,`end`,`notPassiveCapture`]]),s.start(t,!1,!0)}},touchStart(e){if(e.target!==void 0&&typeof s.handler==`function`){let t=e.target;A(s,`temp`,[[t,`touchmove`,`move`,`passiveCapture`],[t,`touchcancel`,`end`,`notPassiveCapture`],[t,`touchend`,`end`,`notPassiveCapture`]]),s.start(e)}},start(e,t,n){n||(s.origin=C(e));function r(e){s.styleCleanup=void 0,document.documentElement.style.cursor=``,e===!0?(xn(),setTimeout(Dp,10)):Dp()}p.is.mobile&&(document.body.classList.add(`non-selectable`),xn(),s.styleCleanup=r),s.event={touch:!t&&!n,mouse:t===!0,keyboard:n===!0,startTime:Date.now(),repeatCount:0};let i=()=>{if(s.timer=void 0,s.event===void 0)return;s.event.repeatCount===0&&(s.event.evt=e,n?s.event.keyCode=e.keyCode:s.event.position=C(e),p.is.mobile||(document.documentElement.style.cursor=`pointer`,document.body.classList.add(`non-selectable`),xn(),s.styleCleanup=r)),s.event.duration=Date.now()-s.event.startTime,s.event.repeatCount+=1,s.handler(s.event);let t=o0&&O(e),j(s,`temp`),s.timer!==void 0&&(clearTimeout(s.timer),s.timer=void 0),s.event=void 0)}};e.__qtouchrepeat=s,t.mouse&&A(s,`main`,[[e,`mousedown`,`mouseStart`,`passive${t.mouseCapture||t.mousecapture?`Capture`:``}`]]),p.has.touch&&A(s,`main`,[[e,`touchstart`,`touchStart`,`passive${t.capture?`Capture`:``}`],[e,`touchend`,`noop`,`passiveCapture`]]),i.length!==0&&A(s,`main`,[[e,`keydown`,`keyboardStart`,`notPassive${t.keyCapture||t.keycapture?`Capture`:``}`]])},updated(e,{oldValue:t,value:n}){let r=e.__qtouchrepeat;r!==void 0&&t!==n&&(typeof n!=`function`&&r.end(),r.handler=n)},beforeUnmount(e){let t=e.__qtouchrepeat;t!==void 0&&(t.timer!==void 0&&clearTimeout(t.timer),j(t,`main`),j(t,`temp`),t.styleCleanup?.(),delete e.__qtouchrepeat)}}),kp=n({ClosePopup:()=>Lf,Intersection:()=>Ol,Morph:()=>fp,Mutation:()=>gp,Ripple:()=>nn,Scroll:()=>xp,ScrollFire:()=>yp,TouchHold:()=>Cp,TouchPan:()=>na,TouchRepeat:()=>Op,TouchSwipe:()=>bi});function Ap(e,t=document.body){if(typeof e!=`string`)throw TypeError(`Expected a string as propName`);if(!(t instanceof Element))throw TypeError(`Expected a DOM element`);return getComputedStyle(t).getPropertyValue(`--q-${e}`).trim()||null}let jp;function Mp(){return p.is.winphone?`msapplication-navbutton-color`:`theme-color`}function Np(e){let t=document.getElementsByTagName(`META`);for(let n in t)if(t[n].name===e)return t[n]}function Pp(e){jp===void 0&&(jp=Mp());let t=Np(jp),n=t===void 0;n&&(t=document.createElement(`meta`),t.setAttribute(`name`,jp)),t.setAttribute(`content`,e),n&&document.head.append(t)}var Fp={set:p.is.mobile&&(p.is.nativeMobile||p.is.winphone||p.is.safari||p.is.webkit||p.is.vivaldi)?e=>{let t=e||Ap(`primary`);p.is.nativeMobile&&window.StatusBar?window.StatusBar.backgroundColorByHexString(t):Pp(t)}:y,install({$q:e}){e.addressbarColor=this,e.config.addressbarColor&&this.set(e.config.addressbarColor)}};let Ip={};function Lp(e){Object.assign(Hp,{request:e,exit:e,toggle:e})}function Rp(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement||null}function zp(){let e=Hp.activeEl=Hp.isActive?Rp():null;Kn(e===null||e===document.documentElement?document.body:e)}function Bp(){Hp.isActive=!Hp.isActive,zp()}function Vp(e,t){try{let n=e[t]();return n===void 0?Promise.resolve():n}catch(e){return Promise.reject(e)}}let Hp=_({isActive:!1,activeEl:null},{isCapable:!1,install({$q:e}){e.fullscreen=this}});Ip.request=[`requestFullscreen`,`msRequestFullscreen`,`mozRequestFullScreen`,`webkitRequestFullscreen`].find(e=>document.documentElement[e]!==void 0),Hp.isCapable=Ip.request!==void 0,Hp.isCapable?(Object.assign(Hp,{request(e){let t=e||document.documentElement,{activeEl:n}=Hp;return t===n?Promise.resolve():(n!==null&&t.contains(n)?Hp.exit():Promise.resolve()).finally(()=>Vp(t,Ip.request))},exit(){return Hp.isActive?Vp(document,Ip.exit):Promise.resolve()},toggle(e){return Hp.isActive?Hp.exit():Hp.request(e)}}),Ip.exit=[`exitFullscreen`,`msExitFullscreen`,`mozCancelFullScreen`,`webkitExitFullscreen`].find(e=>document[e]),Hp.isActive=!!Rp(),Hp.isActive&&zp(),[`onfullscreenchange`,`onmsfullscreenchange`,`onwebkitfullscreenchange`].forEach(e=>{document[e]=Bp})):Lp(()=>Promise.reject(Error(`Not capable`)));let Up=_({appVisible:!0},{install({$q:e}){r(e,`appVisible`,()=>this.appVisible)}});{let e,t;document.hidden===void 0?document.msHidden===void 0?document.webkitHidden!==void 0&&(e=`webkitHidden`,t=`webkitvisibilitychange`):(e=`msHidden`,t=`msvisibilitychange`):(e=`hidden`,t=`visibilitychange`),t&&document[e]!==void 0&&document.addEventListener(t,()=>{Up.appVisible=!document[e]},!1)}var Wp=h({name:`BottomSheetComponent`,props:{...Q,title:String,message:String,actions:Array,grid:Boolean,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:[`ok`,`hide`],setup(t,{emit:n}){let{proxy:r}=(0,e.getCurrentInstance)(),i=$(t,r.$q),a=(0,e.ref)(null);function o(){a.value.show()}function s(){a.value.hide()}function c(e){n(`ok`,e),s()}function l(){n(`hide`)}function u(){return t.actions.map(t=>{let n=t.avatar||t.img;return t.label===void 0?(0,e.h)(gc,{class:`col-all`,dark:i.value}):(0,e.h)(`div`,{class:[`q-bottom-sheet__item q-hoverable q-focusable cursor-pointer relative-position`,t.class],style:t.style,tabindex:0,role:`listitem`,onClick(){c(t)},onKeyup(e){e.keyCode===13&&c(t)}},[(0,e.h)(`div`,{class:`q-focus-helper`}),t.icon?(0,e.h)(Z,{name:t.icon,color:t.color}):n?(0,e.h)(`img`,{class:t.avatar?`q-bottom-sheet__avatar`:``,src:n}):(0,e.h)(`div`,{class:`q-bottom-sheet__empty-icon`}),(0,e.h)(`div`,t.label)])})}function d(){return t.actions.map(t=>{let n=t.avatar||t.img;return t.label===void 0?(0,e.h)(gc,{spaced:!0,dark:i.value}):(0,e.h)(Ys,{class:[`q-bottom-sheet__item`,t.classes],style:t.style,tabindex:0,clickable:!0,dark:i.value,onClick(){c(t)}},()=>[(0,e.h)(Xs,{avatar:!0},()=>t.icon?(0,e.h)(Z,{name:t.icon,color:t.color}):n?(0,e.h)(`img`,{class:t.avatar?`q-bottom-sheet__avatar`:``,src:n}):null),(0,e.h)(Xs,()=>t.label)])})}function f(){let n=[];return t.title&&n.push((0,e.h)(di,{class:`q-dialog__title`},()=>t.title)),t.message&&n.push((0,e.h)(di,{class:`q-dialog__message`},()=>t.message)),n.push(t.grid?(0,e.h)(`div`,{class:`row items-stretch justify-start`,role:`list`},u()):(0,e.h)(`div`,{role:`list`},d())),n}function p(){return[(0,e.h)(ui,{class:[`q-bottom-sheet q-bottom-sheet--${t.grid?`grid`:`list`}`+(i.value?` q-bottom-sheet--dark q-dark`:``),t.cardClass],style:t.cardStyle},f)]}return Object.assign(r,{show:o,hide:s}),()=>(0,e.h)(Rs,{ref:a,position:`bottom`,onHide:l},p)}});function Gp(e,t){for(let n in t)n!==`spinner`&&Object(t[n])===t[n]?(e[n]=Object(e[n])===e[n]?{...e[n]}:{},Gp(e[n],t[n])):e[n]=t[n]}function Kp(t,n,r){return i=>{let a,o,s=n&&i.component!==void 0;if(s){let{component:e,componentProps:t}=i;a=typeof e==`string`?r.component(e):e,o=t||{}}else{let{class:e,style:n,...r}=i;a=t,o=r,e!==void 0&&(r.cardClass=e),n!==void 0&&(r.cardStyle=n)}let c,l=!1,u=(0,e.ref)(null),d=Wn(!1,`dialog`),f=e=>{if(u.value?.[e]!==void 0){u.value[e]();return}let t=c.$.subTree;if(t?.component){if(t.component.proxy&&t.component.proxy[e]){t.component.proxy[e]();return}if(t.component.subTree&&t.component.subTree.component&&t.component.subTree.component.proxy&&t.component.subTree.component.proxy[e]){t.component.subTree.component.proxy[e]();return}}console.error(`[Quasar] Incorrectly defined Dialog component`)},p=[],m=[],h={onOk(e){return p.push(e),h},onCancel(e){return m.push(e),h},onDismiss(e){return p.push(e),m.push(e),h},hide(){return f(`hide`),h},update(e){if(c!==null){if(s)Object.assign(o,e);else{let{class:t,style:n,...r}=e;t!==void 0&&(r.cardClass=t),n!==void 0&&(r.cardStyle=n),Gp(o,r)}c.$forceUpdate()}return h}},g=e=>{l=!0,p.forEach(t=>{t(e)})},_=()=>{v.unmount(d),Gn(d),v=null,c=null,l||m.forEach(e=>{e()})},v=De({name:`QGlobalDialog`,setup:()=>()=>(0,e.h)(a,{...o,ref:u,onOk:g,onHide:_,onVnodeMounted(...t){typeof o.onVnodeMounted==`function`&&o.onVnodeMounted(...t),(0,e.nextTick)(()=>f(`show`))}})},r);return c=v.mount(d),h}}var qp={install({$q:e,parentApp:t}){e.bottomSheet=this.create=Kp(Wp,!1,t)}};function Jp(e){return encodeURIComponent(e===Object(e)?JSON.stringify(e):String(e))}function Yp(e){if(e===``)return e;e.indexOf(`"`)===0&&(e=e.slice(1,-1).replaceAll(String.raw`\"`,`"`).replaceAll(String.raw`\\`,`\\`));try{e=decodeURIComponent(e.replaceAll(`+`,` `))}catch{return}try{let t=JSON.parse(e);(t===Object(t)||Array.isArray(t))&&(e=t)}catch{}return e}let Xp=/(\d+)([dhms])/g,Zp={d:86400,h:3600,m:60,s:1};function Qp(e){let t=0,n=!1,r=e.matchAll(Xp);for(let e of r){n=!0;let r=Number.parseInt(e[1],10),i=e[2];t+=r*Zp[i]}if(n)return t;let i=Date.parse(e);return Number.isNaN(i)?void 0:Math.round((i-Date.now())/1e3)}function $p(e,t,n={},r){let i,a=!1;if(n.expires!==void 0){if(Number.isFinite(n.expires))i=Math.round(n.expires*86400);else if(n.expires instanceof Date){let e=n.expires.getTime();Number.isFinite(e)&&(i=Math.round((e-Date.now())/1e3))}else typeof n.expires==`string`&&(i=Qp(n.expires));i!==void 0&&(a=i<=0)}let o=`${encodeURIComponent(e)}=${Jp(t)}`,s=[o,i===void 0?``:`; Max-Age=${i}`,n.path?`; Path=${n.path}`:``,n.domain?`; Domain=${n.domain}`:``,n.sameSite?`; SameSite=${n.sameSite}`:``,n.httpOnly?`; HttpOnly`:``,n.secure?`; Secure`:``,n.other?`; ${n.other}`:``].join(``);if(r){r.req.qCookies?r.req.qCookies.push(s):r.req.qCookies=[s],r.res.setHeader(`Set-Cookie`,r.req.qCookies);let t=r.req.headers.cookie||``;if(i!==void 0&&a){let n=encodeURIComponent(e);t=t.split(`; `).filter(e=>e.split(`=`,1)[0]!==n).join(`; `)}else t=t?`${o}; ${t}`:o;r.req.headers.cookie=t}else document.cookie=s}function em(e,t){let n=t?t.req.headers:document,r=n.cookie?n.cookie.split(`; `):[],i=r.length,a=e?null:{},o=0,s,c,l;for(;oem(t,e),set:(t,n,r)=>$p(t,n,r,e),has:t=>nm(t,e),remove:(t,n)=>tm(t,n,e),getAll:()=>em(null,e)}}let im={install({$q:e,ssrContext:t}){e.cookies=this}};Object.assign(im,rm());var am=h({name:`DialogPluginComponent`,props:{...Q,title:String,message:String,prompt:Object,options:Object,progress:[Boolean,Object],html:Boolean,ok:{type:[String,Object,Boolean],default:!0},cancel:[String,Object,Boolean],focus:{type:String,default:`ok`,validator:e=>[`ok`,`cancel`,`none`].includes(e)},stackButtons:Boolean,color:String,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:[`ok`,`hide`],setup(t,{emit:n}){let{proxy:r}=(0,e.getCurrentInstance)(),{$q:i}=r,a=$(t,i),o=(0,e.ref)(null),s=(0,e.ref)(t.prompt===void 0?t.options===void 0?void 0:t.options.model:t.prompt.model),c=(0,e.computed)(()=>`q-dialog-plugin`+(a.value?` q-dialog-plugin--dark q-dark`:``)+(t.progress===!1?``:` q-dialog-plugin--progress`)),l=(0,e.computed)(()=>t.color||(a.value?`amber`:`primary`)),u=(0,e.computed)(()=>t.progress===!1?null:ve(t.progress)?{component:t.progress.spinner||Ht,props:{color:t.progress.color||l.value}}:{component:Ht,props:{color:l.value}}),d=(0,e.computed)(()=>t.prompt!==void 0||t.options!==void 0),f=(0,e.computed)(()=>{if(!d.value)return{};let{model:e,isValid:n,items:r,...i}=t.prompt===void 0?t.options:t.prompt;return i}),p=(0,e.computed)(()=>ve(t.ok)||t.ok===!0?i.lang.label.ok:t.ok),m=(0,e.computed)(()=>ve(t.cancel)||t.cancel===!0?i.lang.label.cancel:t.cancel),h=(0,e.computed)(()=>t.prompt===void 0?t.options!==void 0&&t.options.isValid!==void 0&&!t.options.isValid(s.value):t.prompt.isValid!==void 0&&!t.prompt.isValid(s.value)),g=(0,e.computed)(()=>({color:l.value,label:p.value,ripple:!1,disable:h.value,...ve(t.ok)?t.ok:{flat:!0},"data-autofocus":t.focus===`ok`&&!d.value||void 0,onClick:b})),_=(0,e.computed)(()=>({color:l.value,label:m.value,ripple:!1,...ve(t.cancel)?t.cancel:{flat:!0},"data-autofocus":t.focus===`cancel`&&!d.value||void 0,onClick:x}));(0,e.watch)(()=>t.prompt&&t.prompt.model,C),(0,e.watch)(()=>t.options&&t.options.model,C);function v(){o.value.show()}function y(){o.value.hide()}function b(){n(`ok`,(0,e.toRaw)(s.value)),y()}function x(){y()}function S(){n(`hide`)}function C(e){s.value=e}function w(e){!h.value&&t.prompt.type!==`textarea`&&B(e,13)&&b()}function T(n,r){return t.html?(0,e.h)(di,{class:n,innerHTML:r}):(0,e.h)(di,{class:n},()=>r)}function E(){return[(0,e.h)(wl,{color:l.value,dense:!0,autofocus:!0,dark:a.value,...f.value,modelValue:s.value,"onUpdate:modelValue":C,onKeyup:w})]}function D(){return[(0,e.h)($l,{color:l.value,options:t.options.items,dark:a.value,...f.value,modelValue:s.value,"onUpdate:modelValue":C})]}function O(){let n=[];return t.cancel&&n.push((0,e.h)(yn,_.value)),t.ok&&n.push((0,e.h)(yn,g.value)),(0,e.h)(fi,{class:t.stackButtons?`items-end`:``,vertical:t.stackButtons,align:`right`},()=>n)}function k(){let n=[];return t.title&&n.push(T(`q-dialog__title`,t.title)),t.progress!==!1&&n.push((0,e.h)(di,{class:`q-dialog__progress`},()=>(0,e.h)(u.value.component,u.value.props))),t.message&&n.push(T(`q-dialog__message`,t.message)),t.prompt===void 0?t.options!==void 0&&n.push((0,e.h)(gc,{dark:a.value}),(0,e.h)(di,{class:`scroll q-dialog-plugin__form`},D),(0,e.h)(gc,{dark:a.value})):n.push((0,e.h)(di,{class:`scroll q-dialog-plugin__form`},E)),(t.ok||t.cancel)&&n.push(O()),n}function A(){return[(0,e.h)(ui,{class:[c.value,t.cardClass],style:t.cardStyle,dark:a.value},k)]}return Object.assign(r,{show:v,hide:y}),()=>(0,e.h)(Rs,{ref:o,onHide:S},A)}}),om={install({$q:e,parentApp:t}){e.dialog=this.create=Kp(am,!0,t)}};let sm,cm,lm=0,um=null,dm={},fm={},pm={group:`__default_quasar_group__`,delay:0,message:!1,html:!1,spinnerSize:80,spinnerColor:``,messageColor:``,backgroundColor:``,boxClass:``,spinner:Ht,customClass:``},mm={...pm};function hm(e){if(e?.group!==void 0&&fm[e.group]!==void 0)return Object.assign(fm[e.group],e);let t=ve(e)&&e.ignoreDefaults?{...pm,...e}:{...mm,...e};return fm[t.group]=t,t}let gm=_({isActive:!1},{show(t){dm=hm(t);let{group:n}=dm;return gm.isActive=!0,sm===void 0?(dm.uid=++lm,um!==null&&clearTimeout(um),um=setTimeout(()=>{um=null;let t=Wn(`q-loading`);sm=De({name:`QLoading`,setup(){(0,e.onMounted)(()=>{Ns(!0)});function n(){!gm.isActive&&sm!==void 0&&(Ns(!1),sm.unmount(t),Gn(t),sm=void 0,cm=void 0)}function r(){if(!gm.isActive)return null;let t=[(0,e.h)(dm.spinner,{class:`q-loading__spinner`,color:dm.spinnerColor,size:dm.spinnerSize})];return dm.message&&t.push((0,e.h)(`div`,{class:`q-loading__message`+(dm.messageColor?` text-${dm.messageColor}`:``),[dm.html?`innerHTML`:`textContent`]:dm.message})),(0,e.h)(`div`,{class:`q-loading fullscreen flex flex-center z-max `+dm.customClass.trim(),key:dm.uid},[(0,e.h)(`div`,{class:`q-loading__backdrop`+(dm.backgroundColor?` bg-${dm.backgroundColor}`:``)}),(0,e.h)(`div`,{class:`q-loading__box column items-center `+dm.boxClass},t)])}return()=>(0,e.h)(e.Transition,{name:`q-transition--fade`,appear:!0,onAfterLeave:n},r)}},gm.__parentApp),cm=sm.mount(t)},dm.delay)):(dm.uid=lm,cm.$forceUpdate()),e=>{if(e===void 0||Object(e)!==e){gm.hide(n);return}gm.show({...e,group:n})}},hide(e){if(gm.isActive){if(e===void 0)fm={};else if(fm[e]===void 0)return;else{delete fm[e];let t=Object.keys(fm);if(t.length!==0){let e=t.at(-1);gm.show({group:e});return}}um!==null&&(clearTimeout(um),um=null),gm.isActive=!1}},setDefaults(e){ve(e)&&Object.assign(mm,e)},install({$q:e,parentApp:t}){e.loading=this,gm.__parentApp=t,e.config.loading!==void 0&&this.setDefaults(e.config.loading)}}),_m=(0,e.ref)(null),vm=_({isActive:!1},{start:y,stop:y,increment:y,setDefaults:y,install({$q:t,parentApp:n}){if(t.loadingBar=this,this.__installed){t.config.loadingBar!==void 0&&this.setDefaults(t.config.loadingBar);return}let r=(0,e.ref)(t.config.loadingBar===void 0?{}:{...t.config.loadingBar});function i(){vm.isActive=!0}function a(){vm.isActive=!1}let o=Wn(`q-loading-bar`);De({name:`LoadingBar`,devtools:{hide:!0},setup:()=>()=>(0,e.h)(Ke,{...r.value,onStart:i,onStop:a,ref:_m})},n).mount(o),Object.assign(this,{start(e){_m.value.start(e)},stop(){_m.value.stop()},increment(...e){_m.value.increment(...e)},setDefaults(e){ve(e)&&Object.assign(r.value,e)}})}}),ym=null,bm;String.raw`\u003C`,String.raw`\u003E`,String.raw`\u0026`,String.raw`\u2028`,String.raw`\u2029`;let xm=[];function Sm(e){e.title&&(e.title=e.titleTemplate?e.titleTemplate(e.title):e.title,delete e.titleTemplate),[[`meta`,`content`],[`link`,`href`]].forEach(t=>{let n=e[t[0]],r=t[1];for(let e in n){let t=n[e];t.template&&(Object.keys(t).length===1?delete n[e]:(t[r]=t.template(t[r]||``),delete t.template))}})}function Cm(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!0;for(let n in e)if(e[n]!==t[n])return!0}function wm(e){return![`class`,`style`].includes(e)}function Tm(e){return![`lang`,`dir`].includes(e)}function Em(e,t){let n={},r={};return e===void 0?{add:t,remove:r}:(e.title!==t.title&&(n.title=t.title),[`meta`,`link`,`script`,`htmlAttr`,`bodyAttr`].forEach(i=>{let a=e[i],o=t[i];if(r[i]=[],a==null){n[i]=o;return}n[i]={};for(let e in a)Object.hasOwn(o,e)||r[i].push(e);for(let e in o)Object.hasOwn(a,e)?Cm(a[e],o[e])&&(r[i].push(e),n[i][e]=o[e]):n[i][e]=o[e]}),{add:n,remove:r})}function Dm({add:e,remove:t}){e.title&&(document.title=e.title),Object.keys(t).length!==0&&([`meta`,`link`,`script`].forEach(e=>{t[e].forEach(t=>{document.head.querySelector(`${e}[data-qmeta="${t}"]`).remove()})}),t.htmlAttr.filter(Tm).forEach(e=>{document.documentElement.removeAttribute(e)}),t.bodyAttr.filter(wm).forEach(e=>{document.body.removeAttribute(e)})),[`meta`,`link`,`script`].forEach(t=>{let n=e[t];for(let e in n){let r=document.createElement(t);for(let t in n[e])t!==`innerHTML`&&r.setAttribute(t,n[e][t]);r.dataset.qmeta=e,t===`script`&&(r.innerHTML=n[e].innerHTML||``),document.head.append(r)}}),Object.keys(e.htmlAttr).filter(Tm).forEach(t=>{document.documentElement.setAttribute(t,e.htmlAttr[t]||``)}),Object.keys(e.bodyAttr).filter(wm).forEach(t=>{document.body.setAttribute(t,e.bodyAttr[t]||``)})}function Om(){ym=null;let e={title:``,titleTemplate:null,meta:{},link:{},script:{},htmlAttr:{},bodyAttr:{}};for(let t=0;te.iconSet.type.positive,color:`positive`},negative:{icon:e=>e.iconSet.type.negative,color:`negative`},warning:{icon:e=>e.iconSet.type.warning,color:`warning`,textColor:`dark`},info:{icon:e=>e.iconSet.type.info,color:`info`},ongoing:{group:!1,timeout:0,spinner:!0,color:`grey-8`}};function Hm(t,n,r){if(!t)return Gm(`parameter required`);let i,a={textColor:`white`};if(t.ignoreDefaults||Object.assign(a,Mm),ve(t)||(a.type&&Object.assign(a,Vm[a.type]),t={message:t}),Object.assign(a,Vm[t.type||a.type],t),typeof a.icon==`function`&&(a.icon=a.icon(n)),a.spinner?a.spinner=a.spinner===!0?Ht:(0,e.markRaw)(a.spinner):a.spinner=!1,a.meta={hasMedia:!!(a.spinner||a.icon||a.avatar),hasText:Wm(a.message)||Wm(a.caption)},a.position){if(!zm.includes(a.position))return Gm(`wrong position`,t)}else a.position=`bottom`;if(Rm.includes(a.timeout))a.timeout=5e3;else{let e=Number.parseFloat(a.timeout);if(!Number.isFinite(e)||e<0)return Gm(`wrong timeout`,t);a.timeout=e}a.timeout===0?a.progress=!1:a.progress&&(a.meta.progressClass=`q-notification__progress`+(a.progressClass?` ${a.progressClass}`:``),a.meta.progressStyle={animationDuration:`${a.timeout+1e3}ms`});let o=[...Array.isArray(t.actions)?t.actions:[],...!t.ignoreDefaults&&Array.isArray(Mm.actions)?Mm.actions:[],...Array.isArray(Vm[t.type]?.actions)?Vm[t.type].actions:[]],{closeBtn:s}=a;if(s&&o.push({label:typeof s==`string`?s:n.lang.label.close}),a.actions=o.map(({handler:e,noDismiss:t,...n})=>({flat:!0,...n,onClick:typeof e==`function`?()=>{e(),t||c()}:()=>{c()}})),a.multiLine===void 0&&(a.multiLine=a.actions.length>1),Object.assign(a.meta,{class:`q-notification row items-stretch q-notification--${a.multiLine?`multi-line`:`standard`}`+(a.color===void 0?``:` bg-${a.color}`)+(a.textColor===void 0?``:` text-${a.textColor}`)+(a.classes===void 0?``:` ${a.classes}`),wrapperClass:`q-notification__wrapper col relative-position border-radius-inherit `+(a.multiLine?`column no-wrap justify-center`:`row items-center`),contentClass:`q-notification__content row items-center`+(a.multiLine?``:` col`),leftClass:a.meta.hasText?`additional`:`single`,attrs:{role:`alert`,...a.attrs}}),a.group===!1?(a.group=void 0,a.meta.group=void 0):((a.group===void 0||a.group===!0)&&(a.group=[a.message,a.caption,a.multiline,...a.actions.map(e=>`${e.label}*${e.icon}`)].join(`|`)),a.meta.group=a.group+`|`+a.position),a.actions.length===0?a.actions=void 0:a.meta.actionsClass=`q-notification__actions row items-center `+(a.multiLine?`justify-end`:`col-auto`)+(a.meta.hasMedia?` q-notification__actions--with-media`:``),r!==void 0){r.notif.meta.timer&&(clearTimeout(r.notif.meta.timer),r.notif.meta.timer=void 0),a.meta.uid=r.notif.meta.uid;let e=Pm[a.position].value.indexOf(r.notif);Pm[a.position].value[e]=a}else{let e=Nm[a.meta.group];if(e===void 0){if(a.meta.uid=jm++,a.meta.badge=1,[`left`,`right`,`center`].includes(a.position))Pm[a.position].value.splice(Math.floor(Pm[a.position].value.length/2),0,a);else{let e=a.position.includes(`top`)?`unshift`:`push`;Pm[a.position].value[e](a)}a.group!==void 0&&(Nm[a.meta.group]=a)}else{if(e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0),a.badgePosition!==void 0){if(!Bm.includes(a.badgePosition))return Gm(`wrong badgePosition`,t)}else a.badgePosition=`top-${a.position.includes(`left`)?`right`:`left`}`;a.meta.uid=e.meta.uid,a.meta.badge=e.meta.badge+1,a.meta.badgeClass=`q-notification__badge q-notification__badge--${a.badgePosition}`+(a.badgeColor===void 0?``:` bg-${a.badgeColor}`)+(a.badgeTextColor===void 0?``:` text-${a.badgeTextColor}`)+(a.badgeClass?` ${a.badgeClass}`:``);let n=Pm[a.position].value.indexOf(e);Pm[a.position].value[n]=Nm[a.meta.group]=a}}let c=()=>{Um(a),i=void 0};if(a.timeout>0&&(a.meta.timer=setTimeout(()=>{a.meta.timer=void 0,c()},a.timeout+1e3)),a.group!==void 0)return e=>{e===void 0?c():Gm(`trying to update a grouped one which is forbidden`,t)};if(i={dismiss:c,config:t,notif:a},r!==void 0){Object.assign(r,i);return}return e=>{i!==void 0&&(e===void 0?i.dismiss():Hm({...i.config,...e,group:!1,position:a.position},n,i))}}function Um(e){e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0);let t=Pm[e.position].value.indexOf(e);if(t!==-1){e.group!==void 0&&delete Nm[e.meta.group];let n=Lm[String(e.meta.uid)];if(n){let{width:e,height:t}=getComputedStyle(n);n.style.left=`${n.offsetLeft}px`,n.style.width=e,n.style.height=t}Pm[e.position].value.splice(t,1),typeof e.onDismiss==`function`&&e.onDismiss()}}function Wm(e){return e!=null&&!Im.test(e)}function Gm(e,t){return console.error(`Notify: ${e}`,t),!1}function Km(){return h({name:`QNotifications`,devtools:{hide:!0},setup(){return()=>(0,e.h)(`div`,{class:`q-notifications`},zm.map(t=>(0,e.h)(e.TransitionGroup,{key:t,class:Fm[t],tag:`div`,name:`q-notification--${t}`},()=>Pm[t].value.map(t=>{let n=t.meta,r=[];if(n.hasMedia&&(t.spinner?r.push((0,e.h)(t.spinner,{class:`q-notification__spinner q-notification__spinner--`+n.leftClass,color:t.spinnerColor,size:t.spinnerSize})):t.icon?r.push((0,e.h)(Z,{class:`q-notification__icon q-notification__icon--`+n.leftClass,name:t.icon,color:t.iconColor,size:t.iconSize,role:`img`})):t.avatar&&r.push((0,e.h)(mt,{class:`q-notification__avatar q-notification__avatar--`+n.leftClass},()=>(0,e.h)(`img`,{src:t.avatar,"aria-hidden":`true`})))),n.hasText){let n,i={class:`q-notification__message col`};if(t.html)i.innerHTML=t.caption?`
${t.message}
${t.caption}
`:t.message;else{let r=[t.message];n=t.caption?[(0,e.h)(`div`,r),(0,e.h)(`div`,{class:`q-notification__caption`},[t.caption])]:r}r.push((0,e.h)(`div`,i,n))}let i=[(0,e.h)(`div`,{class:n.contentClass},r)];return t.progress&&i.push((0,e.h)(`div`,{key:`${n.uid}|p|${n.badge}`,class:n.progressClass,style:n.progressStyle})),t.actions&&i.push((0,e.h)(`div`,{class:n.actionsClass},t.actions.map(t=>(0,e.h)(yn,t)))),n.badge>1&&i.push((0,e.h)(`div`,{key:`${n.uid}|${n.badge}`,class:t.meta.badgeClass,style:t.badgeStyle},[n.badge])),(0,e.h)(`div`,{ref:e=>{Lm[String(n.uid)]=e},key:n.uid,class:n.class,...n.attrs},[(0,e.h)(`div`,{class:n.wrapperClass},i)])}))))}})}var qm={setDefaults(e){ve(e)&&Object.assign(Mm,e)},registerType(e,t){ve(t)&&(Vm[e]=t)},install({$q:t,parentApp:n}){if(t.notify=this.create=e=>Hm(e,t),t.notify.setDefaults=this.setDefaults,t.notify.registerType=this.registerType,t.config.notify!==void 0&&this.setDefaults(t.config.notify),!this.__installed){zm.forEach(t=>{Pm[t]=(0,e.ref)([]);let n=t===`left`||t===`center`||t===`right`?`center`:t.includes(`top`)?`top`:`bottom`,r=t.includes(`left`)?`start`:t.includes(`right`)?`end`:`center`,i=t===`left`||t===`right`?`items-${t===`left`?`start`:`end`} justify-center`:t===`center`?`flex-center`:`items-${r}`;Fm[t]=`q-notifications__list q-notifications__list--${n} fixed column no-wrap ${i}`});let t=Wn(`q-notify`);De(Km(),n).mount(t)}}};function Jm(e){return ye(e)?`__q_date|`+e.getTime():be(e)?`__q_expr|`+e.source:typeof e==`number`?`__q_numb|`+e:typeof e==`boolean`?`__q_bool|`+(e?`1`:`0`):typeof e==`string`?`__q_strn|`+e:typeof e==`function`?`__q_strn|`+e.toString():e===Object(e)?`__q_objt|`+JSON.stringify(e):e}let Ym=/^-?\d+$/;function Xm(e){if(e.length<9)return e;let t=e.slice(0,8),n=e.slice(9);switch(t){case`__q_date`:return new Date(Ym.test(n)?Number.parseInt(n,10):n);case`__q_expr`:return new RegExp(n);case`__q_numb`:return Number(n);case`__q_bool`:return n===`1`;case`__q_strn`:return String(n);case`__q_objt`:return JSON.parse(n);default:return e}}function Zm(){return{has:()=>!1,hasItem:()=>!1,getLength:()=>0,getItem:()=>null,getIndex:()=>null,getKey:()=>null,getAll:()=>({}),getAllKeys:()=>[],set:y,setItem:y,remove:y,removeItem:y,clear:y,isEmpty:()=>!0}}function Qm(e){let t=window[e+`Storage`],n=e=>{let n=t.getItem(e);return n?Xm(n):null},r=e=>t.getItem(e)!==null,i=(e,n)=>{t.setItem(e,Jm(n))},a=e=>{t.removeItem(e)};return{has:r,hasItem:r,getLength:()=>t.length,getItem:n,getIndex:e=>ee{let e,r={},i=t.length;for(let a=0;a{let e=[],n=t.length;for(let r=0;r{t.clear()},isEmpty:()=>t.length===0}}let $m=p.has.webStorage?Qm(`local`):Zm(),eh={install({$q:e}){e.localStorage=$m},...$m},th=p.has.webStorage?Qm(`session`):Zm(),nh={install({$q:e}){e.sessionStorage=th},...th};var rh=n({AddressbarColor:()=>Fp,AppFullscreen:()=>Hp,AppVisibility:()=>Up,BottomSheet:()=>qp,Cookies:()=>im,Dark:()=>L,Dialog:()=>om,IconSet:()=>le,Lang:()=>se,Loading:()=>gm,LoadingBar:()=>vm,LocalStorage:()=>eh,Meta:()=>Am,Notify:()=>qm,Platform:()=>m,Screen:()=>I,SessionStorage:()=>nh});function ih(e){let t=document.createElement(`textarea`);t.value=e,t.contentEditable=`true`,t.style.position=`fixed`;let n=()=>{};Or(n),document.body.append(t),t.focus(),t.select();let r=document.execCommand(`copy`);return t.remove(),kr(n),r}function ah(e){if(navigator.clipboard)return navigator.clipboard.writeText(e);let t=ih(e);return t?Promise.resolve(!0):Promise.reject(t)}function oh(e){let t={activated(){this.__qMeta.active=!0,km()},deactivated(){this.__qMeta.active=!1,km()},unmounted(){xm.splice(xm.indexOf(this.__qMeta),1),km(),this.__qMeta=void 0}};return typeof e==`function`?Object.assign(t,{computed:{__qMetaOptions(){return e.call(this)||{}}},watch:{__qMetaOptions(e){this.__qMeta.val=e,this.__qMeta.active&&km()}},created(){this.__qMeta={active:!0,val:this.__qMetaOptions},xm.push(this.__qMeta),km()}}):t.created=function(){this.__qMeta={active:!0,val:e},xm.push(this.__qMeta),km()},t}var sh=class{constructor(){this.__stack={}}on(e,t,n){return(this.__stack[e]||=[]).push({fn:t,ctx:n}),this}once(e,t,n){let r=(...i)=>{this.off(e,r),t.apply(n,i)};return r.__callback=t,this.on(e,r,n)}emit(e,...t){let n=this.__stack[e];return n!==void 0&&n.forEach(e=>{e.fn.apply(e.ctx,t)}),this}off(e,t){let n=this.__stack[e];if(n===void 0)return this;if(t===void 0)return delete this.__stack[e],this;let r=n.filter(e=>e.fn!==t&&e.fn.__callback!==t);return r.length===0?delete this.__stack[e]:this.__stack[e]=r,this}};function ch(e){setTimeout(()=>{window.URL.revokeObjectURL(e.href)},1e4),e.remove()}function lh(e,t,n={}){let{mimeType:r,byteOrderMark:i,encoding:a}=typeof n==`string`?{mimeType:n}:n,o=a===void 0?t:new TextEncoder(a).encode([t]),s=new Blob(i===void 0?[o]:[i,o],{type:r||`application/octet-stream`}),c=document.createElement(`a`);c.href=window.URL.createObjectURL(s),c.setAttribute(`download`,e),c.download===void 0&&c.setAttribute(`target`,`_blank`),c.classList.add(`hidden`),c.style.position=`fixed`,document.body.append(c);try{return c.click(),ch(c),!0}catch(e){return ch(c),e}}function uh(e){let t={noopener:!0,...e},n=[];for(let e in t){let r=t[e];r===!0?n.push(e):(xe(r)||typeof r==`string`&&r!==``)&&n.push(e+`=`+r)}return n.join(`,`)}function dh(e,t,n){let r=window.open;if(m.is.cordova){if(cordova?.InAppBrowser?.open!==void 0)r=cordova.InAppBrowser.open;else if(navigator?.app!==void 0)return navigator.app.loadUrl(e,{openExternal:!0})}let i={noopener:!0,...n},a=i.noopener||i.noreferrer,o=r(e,`_blank`,uh(n));if(o)return m.is.desktop&&o.focus(),o;a||t?.()}function fh(e,t,n){if(m.is.ios&&window.SafariViewController!==void 0){window.SafariViewController.isAvailable(r=>{r?window.SafariViewController.show({url:e},y,t):dh(e,t,n)});return}return dh(e,t,n)}function ph(e){if(Array.isArray(e)){let t=e.length;return{isList:!0,totalJobs:t,resultAggregator:Array(t).fill(null)}}let t=Object.keys(e),n=t.reduce((e,t)=>(e[t]=null,e),{});return{isList:!1,totalJobs:t.length,resultAggregator:n,resultKeys:t}}function mh(e,{threadsNumber:t=1,abortOnFail:n=!0}={}){let r=-1,i=!1,{isList:a,totalJobs:o,resultAggregator:s,resultKeys:c}=ph(e);if(o===0)return Promise.resolve(s);let l=o-1,u=t=>{if(i||r>=l)return t.resolve();let o=++r,d=a?o:c[o];Promise.resolve().then(()=>e[d](s)).then(e=>{i||(s[d]={key:d,status:`fulfilled`,value:e})}).catch(e=>{if(i)return;let r={key:d,status:`rejected`,reason:e};s[d]=r,n&&(i=!0,t.reject({...r,resultAggregator:s}))}).finally(()=>{i||u(t)})},d=Math.min(o,Math.max(1,t)),f=Array.from({length:d},()=>{let e=Promise.withResolvers();return u(e),e.promise});return Promise.all(f).then(()=>s)}var hh=n({EventBus:()=>sh,clone:()=>fu,colors:()=>Qa,copyToClipboard:()=>ah,createMetaMixin:()=>oh,createUploaderComponent:()=>Df,date:()=>ds,debounce:()=>N,dom:()=>Qt,event:()=>M,exportFile:()=>lh,extend:()=>uc,format:()=>Ie,frameDebounce:()=>cu,getCssVar:()=>Ap,is:()=>Se,morph:()=>tp,noop:()=>y,openURL:()=>fh,patterns:()=>Ra,runSequentialPromises:()=>mh,scroll:()=>_r,setCssVar:()=>R,throttle:()=>$t,uid:()=>Qr});function gh(){let{emit:t,proxy:n}=(0,e.getCurrentInstance)(),r=(0,e.ref)(null);function i(){r.value.show()}function a(){r.value.hide()}function o(e){t(`ok`,e),a()}function s(){t(`hide`)}return Object.assign(n,{show:i,hide:a}),{dialogRef:r,onDialogHide:s,onDialogOK:o,onDialogCancel:a}}let _h=[`ok`,`hide`];gh.emits=_h,gh.emitsObject=Tf(_h);function vh(t){{let n={active:!0};if(typeof t==`function`){let r=(0,e.computed)(t);n.val=r.value,(0,e.watch)(r,e=>{n.val=e,n.active&&km()})}else n.val=t;xm.push(n),km(),(0,e.onActivated)(()=>{n.active=!0,km()}),(0,e.onDeactivated)(()=>{n.active=!1,km()}),(0,e.onUnmounted)(()=>{xm.splice(xm.indexOf(n),1),km()})}}function yh(){return(0,e.inject)(`_q_`)}function bh(){let t=null,n=(0,e.getCurrentInstance)();function r(){t!==null&&(clearInterval(t),t=null)}return(0,e.onDeactivated)(r),(0,e.onBeforeUnmount)(r),{removeInterval:r,registerInterval(e,i){r(),Dt(n)||(t=setInterval(e,i))}}}var xh=n({useDialogPluginComponent:()=>gh,useFormChild:()=>Ac,useHydration:()=>da,useId:()=>ti,useInterval:()=>bh,useMeta:()=>vh,useQuasar:()=>yh,useRenderCache:()=>xi,useSplitAttrs:()=>ac,useTick:()=>Qn,useTimeout:()=>$n});window.Vue===void 0&&console.error(`[ Quasar ] Vue is required to run. Please add a script tag for it before loading Quasar.`),window.Quasar={version:`2.22.0`,install(e,t){Ae(e,{components:Ff,directives:kp,plugins:rh,...t})},lang:se,iconSet:le,...Ff,...kp,...rh,...xh,...hh}})(window.Vue); \ No newline at end of file + ${a.keepToClone===!0?``:` + @keyframes ${i}-to { + 0% { + ${C} + } + + 100% { + margin: ${oe<0?oe/2:0}px ${ae<0?ae/2:0}px; + width: ${le+U.marginH}px; + height: ${ue+U.marginV}px; + } + } + `} + `,document.head.appendChild(s);let w=`normal`;E.style.animation=`${a.duration}ms ${a.easing} ${a.delay}ms ${w} ${a.fill} ${i}-from`,D!==void 0&&(D.style.animation=`${a.duration}ms ${a.easing} ${a.delay}ms ${w} ${a.fill} ${i}-from-tween`),N.style.animation=`${a.duration}ms ${a.easing} ${a.delay}ms ${w} ${a.fill} ${i}-to`,e.style.animation=`${a.duration}ms ${a.easing} ${a.delay}ms ${w} ${a.fill} ${i}`;let T=t=>{t===Object(t)&&t.animationName!==i||(e.removeEventListener(`animationend`,T),e.removeEventListener(`animationcancel`,T),_e(),s.remove())};o.qMorphCancel=()=>{o.qMorphCancel=void 0,n=!0,T()},e.qMorphCancel=()=>{e.qMorphCancel=void 0,n=!0,T()},e.addEventListener(`animationend`,T),e.addEventListener(`animationcancel`,T),t=t=>n===!0||!e||!E||!N?!1:t===!0?(T(),!0):(r=r!==!0,w=w===`normal`?`reverse`:`normal`,E.style.animationDirection=w,D.style.animationDirection=w,N.style.animationDirection=w,e.style.animationDirection=w,!0)}};a.waitFor>0||a.waitFor===`transitionend`||a.waitFor===Object(a.waitFor)&&typeof a.waitFor.then==`function`?(a.waitFor>0?new Promise(e=>setTimeout(e,a.waitFor)):a.waitFor===`transitionend`?new Promise(t=>{let n=()=>{r!==null&&(clearTimeout(r),r=null),e&&(e.removeEventListener(`transitionend`,n),e.removeEventListener(`transitioncancel`,n)),t()},r=setTimeout(n,400);e.addEventListener(`transitionend`,n),e.addEventListener(`transitioncancel`,n)}):a.waitFor).then(j).catch(()=>{typeof e.qMorphCancel==`function`&&e.qMorphCancel()}):j()}),e=>t(e)}let _f={},vf=[`duration`,`delay`,`easing`,`fill`,`classes`,`style`,`duration`,`resize`,`useCSS`,`hideFromClone`,`keepToClone`,`tween`,`tweenFromOpacity`,`tweenToOpacity`,`waitFor`,`onEnd`],yf=[`resize`,`useCSS`,`hideFromClone`,`keepToClone`,`tween`];function bf(e,t){e.clsAction!==t&&(e.clsAction=t,e.el.classList[t](`q-morph--invisible`))}function xf(e){if(e.animating===!0||e.queue.length<2)return;let[t,n]=e.queue;e.animating=!0,t.animating=!0,n.animating=!0,bf(t,`remove`),bf(n,`remove`);let r=gf({from:t.el,to:n.el,onToggle(){bf(t,`add`),bf(n,`remove`)},...n.opts,onEnd(r,i){n.opts.onEnd?.(r,i),i!==!0&&(t.animating=!1,n.animating=!1,e.animating=!1,e.cancel=void 0,e.queue.shift(),xf(e))}});e.cancel=()=>{r(!0),e.cancel=void 0}}function Sf(e,t){let n=t.opts;yf.forEach(t=>{n[t]=e[t]===!0})}function Cf(e,t){let n=typeof e==`string`&&e.length!==0?e.split(`:`):[];t.name=n[0],t.group=n[1],Object.assign(t.opts,{duration:isNaN(n[2])===!0?300:parseFloat(n[2]),waitFor:n[3]})}function wf(e,t){e.group!==void 0&&(t.group=e.group),e.name!==void 0&&(t.name=e.name);let n=t.opts;vf.forEach(t=>{e[t]!==void 0&&(n[t]=e[t])})}function Tf(e,t){if(t.name===e){let n=_f[t.group];n===void 0?(_f[t.group]={name:t.group,model:e,queue:[t],animating:!1},bf(t,`remove`)):n.model!==e&&(n.model=e,n.queue.push(t),n.animating===!1&&n.queue.length===2&&xf(n));return}t.animating===!1&&bf(t,`add`)}function Ef(e,t){let n;Object(t)===t?(n=String(t.model),wf(t,e),Sf(t,e)):n=String(t),n===e.model?e.animating===!1&&e.clsAction!==void 0&&e.el.classList[e.clsAction](`q-morph--invisible`):(e.model=n,Tf(n,e))}var Df=g({name:`morph`,mounted(e,t){let n={el:e,animating:!1,opts:{}};Sf(t.modifiers,n),Cf(t.arg,n),Ef(n,t.value),e.__qmorph=n},updated(e,t){Ef(e.__qmorph,t.value)},beforeUnmount(e){let t=e.__qmorph,n=_f[t.group];n!==void 0&&n.queue.indexOf(t)!==-1&&(n.queue=n.queue.filter(e=>e!==t),n.queue.length===0&&(n.cancel?.(),delete _f[t.group])),t.clsAction===`add`&&e.classList.remove(`q-morph--invisible`),delete e.__qmorph}});let Of={childList:!0,subtree:!0,attributes:!0,characterData:!0,attributeOldValue:!0,characterDataOldValue:!0};function kf(e,t,n){t.handler=n,t.observer?.disconnect(),t.observer=new MutationObserver(n=>{typeof t.handler==`function`&&(t.handler(n)===!1||t.once===!0)&&Af(e)}),t.observer.observe(e,t.opts)}function Af(e){let t=e.__qmutation;t!==void 0&&(t.observer?.disconnect(),delete e.__qmutation)}var jf=g({name:`mutation`,mounted(e,{modifiers:{once:t,...n},value:r}){let i={once:t,opts:Object.keys(n).length===0?Of:n};kf(e,i,r),e.__qmutation=i},updated(e,{oldValue:t,value:n}){let r=e.__qmutation;r!==void 0&&t!==n&&kf(e,r,n)},beforeUnmount:Af});let{passive:Mf}=v;function Nf(e,{value:t,oldValue:n}){if(typeof t!=`function`){e.scrollTarget.removeEventListener(`scroll`,e.scroll,Mf);return}e.handler=t,typeof n!=`function`&&(e.scrollTarget.addEventListener(`scroll`,e.scroll,Mf),e.scroll())}var Pf=g({name:`scroll-fire`,mounted(e,t){let n={scrollTarget:tr(e),scroll:N(()=>{let t,r;n.scrollTarget===window?(r=e.getBoundingClientRect().bottom,t=window.innerHeight):(r=Wt(e).top+Kt(e),t=Wt(n.scrollTarget).top+Kt(n.scrollTarget)),r>0&&r{r.styleCleanup=void 0;let t=()=>{document.body.classList.remove(`non-selectable`)};e===!0?(bn(),setTimeout(t,10)):t()}),r.triggered=!1,r.sensitivity=t===!0?r.mouseSensitivity:r.touchSensitivity,r.timer=setTimeout(()=>{r.timer=void 0,bn(),r.triggered=!0,r.handler({evt:e,touch:t!==!0,mouse:t===!0,position:r.origin,duration:Date.now()-n})},r.duration)},move(e){let{top:t,left:n}=C(e);r.timer!==void 0&&(Math.abs(n-r.origin.left)>=r.sensitivity||Math.abs(t-r.origin.top)>=r.sensitivity)&&(clearTimeout(r.timer),r.timer=void 0)},end(e){j(r,`temp`),r.styleCleanup?.(r.triggered),r.triggered===!0?e!==void 0&&O(e):r.timer!==void 0&&(clearTimeout(r.timer),r.timer=void 0)}},i=[600,5,7];typeof t.arg==`string`&&t.arg.length!==0&&t.arg.split(`:`).forEach((e,t)=>{let n=parseInt(e,10);n&&(i[t]=n)}),[r.duration,r.touchSensitivity,r.mouseSensitivity]=i,e.__qtouchhold=r,n.mouse===!0&&A(r,`main`,[[e,`mousedown`,`mouseStart`,`passive${n.mouseCapture===!0||n.mousecapture===!0?`Capture`:``}`]]),p.has.touch===!0&&A(r,`main`,[[e,`touchstart`,`touchStart`,`passive${n.capture===!0?`Capture`:``}`],[e,`touchend`,`noop`,`notPassiveCapture`]])},updated(e,t){let n=e.__qtouchhold;n!==void 0&&t.oldValue!==t.value&&(typeof t.value!=`function`&&n.end(),n.handler=t.value)},beforeUnmount(e){let t=e.__qtouchhold;t!==void 0&&(j(t,`main`),j(t,`temp`),t.timer!==void 0&&clearTimeout(t.timer),t.styleCleanup?.(),delete e.__qtouchhold)}});let Rf={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},zf=RegExp(`^([\\d+]+|${Object.keys(Rf).join(`|`)})$`,`i`);function Bf(e,t){let{top:n,left:r}=C(e);return Math.abs(r-t.left)>=7||Math.abs(n-t.top)>=7}var Vf=g({name:`touch-repeat`,beforeMount(e,{modifiers:t,value:n,arg:r}){let i=Object.keys(t).reduce((e,t)=>{if(zf.test(t)===!0){let n=isNaN(parseInt(t,10))?Rf[t.toLowerCase()]:parseInt(t,10);n>=0&&e.push(n)}return e},[]);if(t.mouse!==!0&&p.has.touch!==!0&&i.length===0)return;let a=typeof r==`string`&&r.length!==0?r.split(`:`).map(e=>parseInt(e,10)):[0,600,300],o=a.length-1,s={keyboard:i,handler:n,noop:y,mouseStart(e){s.event===void 0&&typeof s.handler==`function`&&b(e)===!0&&(A(s,`temp`,[[document,`mousemove`,`move`,`passiveCapture`],[document,`click`,`end`,`notPassiveCapture`]]),s.start(e,!0))},keyboardStart(t){if(typeof s.handler==`function`&&V(t,i)===!0){if((a[0]===0||s.event!==void 0)&&(O(t),e.focus(),s.event!==void 0))return;A(s,`temp`,[[document,`keyup`,`end`,`notPassiveCapture`],[document,`click`,`end`,`notPassiveCapture`]]),s.start(t,!1,!0)}},touchStart(e){if(e.target!==void 0&&typeof s.handler==`function`){let t=e.target;A(s,`temp`,[[t,`touchmove`,`move`,`passiveCapture`],[t,`touchcancel`,`end`,`notPassiveCapture`],[t,`touchend`,`end`,`notPassiveCapture`]]),s.start(e)}},start(e,t,n){n!==!0&&(s.origin=C(e));function r(e){s.styleCleanup=void 0,document.documentElement.style.cursor=``;let t=()=>{document.body.classList.remove(`non-selectable`)};e===!0?(bn(),setTimeout(t,10)):t()}p.is.mobile===!0&&(document.body.classList.add(`non-selectable`),bn(),s.styleCleanup=r),s.event={touch:t!==!0&&n!==!0,mouse:t===!0,keyboard:n===!0,startTime:Date.now(),repeatCount:0};let i=()=>{if(s.timer=void 0,s.event===void 0)return;s.event.repeatCount===0&&(s.event.evt=e,n===!0?s.event.keyCode=e.keyCode:s.event.position=C(e),p.is.mobile!==!0&&(document.documentElement.style.cursor=`pointer`,document.body.classList.add(`non-selectable`),bn(),s.styleCleanup=r)),s.event.duration=Date.now()-s.event.startTime,s.event.repeatCount+=1,s.handler(s.event);let t=o0&&O(e),j(s,`temp`),s.timer!==void 0&&(clearTimeout(s.timer),s.timer=void 0),s.event=void 0)}};e.__qtouchrepeat=s,t.mouse===!0&&A(s,`main`,[[e,`mousedown`,`mouseStart`,`passive${t.mouseCapture===!0||t.mousecapture===!0?`Capture`:``}`]]),p.has.touch===!0&&A(s,`main`,[[e,`touchstart`,`touchStart`,`passive${t.capture===!0?`Capture`:``}`],[e,`touchend`,`noop`,`passiveCapture`]]),i.length!==0&&A(s,`main`,[[e,`keydown`,`keyboardStart`,`notPassive${t.keyCapture===!0||t.keycapture===!0?`Capture`:``}`]])},updated(e,{oldValue:t,value:n}){let r=e.__qtouchrepeat;r!==void 0&&t!==n&&(typeof n!=`function`&&r.end(),r.handler=n)},beforeUnmount(e){let t=e.__qtouchrepeat;t!==void 0&&(t.timer!==void 0&&clearTimeout(t.timer),j(t,`main`),j(t,`temp`),t.styleCleanup?.(),delete e.__qtouchrepeat)}}),Hf=n({ClosePopup:()=>$d,Intersection:()=>rl,Morph:()=>Df,Mutation:()=>jf,Ripple:()=>rn,Scroll:()=>If,ScrollFire:()=>Pf,TouchHold:()=>Lf,TouchPan:()=>Zi,TouchRepeat:()=>Vf,TouchSwipe:()=>yi});function Uf(e,t=document.body){if(typeof e!=`string`)throw TypeError(`Expected a string as propName`);if(!(t instanceof Element))throw TypeError(`Expected a DOM element`);return getComputedStyle(t).getPropertyValue(`--q-${e}`).trim()||null}let Wf;function Gf(){return p.is.winphone?`msapplication-navbutton-color`:`theme-color`}function Kf(e){let t=document.getElementsByTagName(`META`);for(let n in t)if(t[n].name===e)return t[n]}function qf(e){Wf===void 0&&(Wf=Gf());let t=Kf(Wf),n=t===void 0;n&&(t=document.createElement(`meta`),t.setAttribute(`name`,Wf)),t.setAttribute(`content`,e),n&&document.head.appendChild(t)}var Jf={set:p.is.mobile===!0&&(p.is.nativeMobile===!0||p.is.winphone===!0||p.is.safari===!0||p.is.webkit===!0||p.is.vivaldi===!0)?e=>{let t=e||Uf(`primary`);p.is.nativeMobile===!0&&window.StatusBar?window.StatusBar.backgroundColorByHexString(t):qf(t)}:y,install({$q:e}){e.addressbarColor=this,e.config.addressbarColor&&this.set(e.config.addressbarColor)}};let Yf={};function Xf(e){Object.assign(tp,{request:e,exit:e,toggle:e})}function Zf(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement||null}function Qf(){let e=tp.activeEl=tp.isActive===!1?null:Zf();Vn(e===null||e===document.documentElement?document.body:e)}function $f(){tp.isActive=tp.isActive===!1,Qf()}function ep(e,t){try{let n=e[t]();return n===void 0?Promise.resolve():n}catch(e){return Promise.reject(e)}}let tp=_({isActive:!1,activeEl:null},{isCapable:!1,install({$q:e}){e.fullscreen=this}});Yf.request=[`requestFullscreen`,`msRequestFullscreen`,`mozRequestFullScreen`,`webkitRequestFullscreen`].find(e=>document.documentElement[e]!==void 0),tp.isCapable=Yf.request!==void 0,tp.isCapable===!1?Xf(()=>Promise.reject(`Not capable`)):(Object.assign(tp,{request(e){let t=e||document.documentElement,{activeEl:n}=tp;return t===n?Promise.resolve():(n!==null&&t.contains(n)===!0?tp.exit():Promise.resolve()).finally(()=>ep(t,Yf.request))},exit(){return tp.isActive===!0?ep(document,Yf.exit):Promise.resolve()},toggle(e){return tp.isActive===!0?tp.exit():tp.request(e)}}),Yf.exit=[`exitFullscreen`,`msExitFullscreen`,`mozCancelFullScreen`,`webkitExitFullscreen`].find(e=>document[e]),tp.isActive=!!Zf(),tp.isActive===!0&&Qf(),[`onfullscreenchange`,`onmsfullscreenchange`,`onwebkitfullscreenchange`].forEach(e=>{document[e]=$f}));let np=_({appVisible:!0},{install({$q:e}){r(e,`appVisible`,()=>this.appVisible)}});{let e,t;document.hidden===void 0?document.msHidden===void 0?document.webkitHidden!==void 0&&(e=`webkitHidden`,t=`webkitvisibilitychange`):(e=`msHidden`,t=`msvisibilitychange`):(e=`hidden`,t=`visibilitychange`),t&&document[e]!==void 0&&document.addEventListener(t,()=>{np.appVisible=!document[e]},!1)}var rp=h({name:`BottomSheetComponent`,props:{...Z,title:String,message:String,actions:Array,grid:Boolean,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:[`ok`,`hide`],setup(t,{emit:n}){let{proxy:r}=(0,e.getCurrentInstance)(),i=Q(t,r.$q),a=(0,e.ref)(null);function o(){a.value.show()}function s(){a.value.hide()}function c(e){n(`ok`,e),s()}function l(){n(`hide`)}function u(){return t.actions.map(t=>{let n=t.avatar||t.img;return t.label===void 0?(0,e.h)(Qs,{class:`col-all`,dark:i.value}):(0,e.h)(`div`,{class:[`q-bottom-sheet__item q-hoverable q-focusable cursor-pointer relative-position`,t.class],style:t.style,tabindex:0,role:`listitem`,onClick(){c(t)},onKeyup(e){e.keyCode===13&&c(t)}},[(0,e.h)(`div`,{class:`q-focus-helper`}),t.icon?(0,e.h)(X,{name:t.icon,color:t.color}):n?(0,e.h)(`img`,{class:t.avatar?`q-bottom-sheet__avatar`:``,src:n}):(0,e.h)(`div`,{class:`q-bottom-sheet__empty-icon`}),(0,e.h)(`div`,t.label)])})}function d(){return t.actions.map(t=>{let n=t.avatar||t.img;return t.label===void 0?(0,e.h)(Qs,{spaced:!0,dark:i.value}):(0,e.h)(js,{class:[`q-bottom-sheet__item`,t.classes],style:t.style,tabindex:0,clickable:!0,dark:i.value,onClick(){c(t)}},()=>[(0,e.h)(Ms,{avatar:!0},()=>t.icon?(0,e.h)(X,{name:t.icon,color:t.color}):n?(0,e.h)(`img`,{class:t.avatar?`q-bottom-sheet__avatar`:``,src:n}):null),(0,e.h)(Ms,()=>t.label)])})}function f(){let n=[];return t.title&&n.push((0,e.h)(di,{class:`q-dialog__title`},()=>t.title)),t.message&&n.push((0,e.h)(di,{class:`q-dialog__message`},()=>t.message)),n.push(t.grid===!0?(0,e.h)(`div`,{class:`row items-stretch justify-start`,role:`list`},u()):(0,e.h)(`div`,{role:`list`},d())),n}function p(){return[(0,e.h)(ui,{class:[`q-bottom-sheet q-bottom-sheet--${t.grid===!0?`grid`:`list`}`+(i.value===!0?` q-bottom-sheet--dark q-dark`:``),t.cardClass],style:t.cardStyle},f)]}return Object.assign(r,{show:o,hide:s}),()=>(0,e.h)(Cs,{ref:a,position:`bottom`,onHide:l},p)}});function ip(e,t){for(let n in t)n!==`spinner`&&Object(t[n])===t[n]?(e[n]=Object(e[n])===e[n]?{...e[n]}:{},ip(e[n],t[n])):e[n]=t[n]}function ap(t,n,r){return i=>{let a,o,s=n===!0&&i.component!==void 0;if(s===!0){let{component:e,componentProps:t}=i;a=typeof e==`string`?r.component(e):e,o=t||{}}else{let{class:e,style:n,...r}=i;a=t,o=r,e!==void 0&&(r.cardClass=e),n!==void 0&&(r.cardStyle=n)}let c,l=!1,u=(0,e.ref)(null),d=zn(!1,`dialog`),f=e=>{if(u.value?.[e]!==void 0){u.value[e]();return}let t=c.$.subTree;if(t?.component){if(t.component.proxy&&t.component.proxy[e]){t.component.proxy[e]();return}if(t.component.subTree&&t.component.subTree.component&&t.component.subTree.component.proxy&&t.component.subTree.component.proxy[e]){t.component.subTree.component.proxy[e]();return}}console.error(`[Quasar] Incorrectly defined Dialog component`)},p=[],m=[],h={onOk(e){return p.push(e),h},onCancel(e){return m.push(e),h},onDismiss(e){return p.push(e),m.push(e),h},hide(){return f(`hide`),h},update(e){if(c!==null){if(s===!0)Object.assign(o,e);else{let{class:t,style:n,...r}=e;t!==void 0&&(r.cardClass=t),n!==void 0&&(r.cardStyle=n),ip(o,r)}c.$forceUpdate()}return h}},g=e=>{l=!0,p.forEach(t=>{t(e)})},_=()=>{v.unmount(d),Bn(d),v=null,c=null,l!==!0&&m.forEach(e=>{e()})},v=Oe({name:`QGlobalDialog`,setup:()=>()=>(0,e.h)(a,{...o,ref:u,onOk:g,onHide:_,onVnodeMounted(...t){typeof o.onVnodeMounted==`function`&&o.onVnodeMounted(...t),(0,e.nextTick)(()=>f(`show`))}})},r);return c=v.mount(d),h}}var op={install({$q:e,parentApp:t}){e.bottomSheet=this.create=ap(rp,!1,t)}};function sp(e){return encodeURIComponent(e)}function cp(e){return decodeURIComponent(e)}function lp(e){return sp(e===Object(e)?JSON.stringify(e):String(e))}function up(e){if(e===``)return e;e.indexOf(`"`)===0&&(e=e.slice(1,-1).replace(/\\"/g,`"`).replace(/\\\\/g,`\\`)),e=cp(e.replace(/\+/g,` `));try{let t=JSON.parse(e);(t===Object(t)||Array.isArray(t)===!0)&&(e=t)}catch{}return e}function dp(e){let t=new Date;return t.setMilliseconds(t.getMilliseconds()+e),t.toUTCString()}function fp(e){let t=0,n=e.match(/(\d+)d/),r=e.match(/(\d+)h/),i=e.match(/(\d+)m/),a=e.match(/(\d+)s/);return n&&(t+=n[1]*864e5),r&&(t+=r[1]*36e5),i&&(t+=i[1]*6e4),a&&(t+=a[1]*1e3),t===0?e:dp(t)}function pp(e,t,n={},r){let i,a;n.expires!==void 0&&(Object.prototype.toString.call(n.expires)===`[object Date]`?i=n.expires.toUTCString():typeof n.expires==`string`?i=fp(n.expires):(a=parseFloat(n.expires),i=isNaN(a)===!1?dp(a*864e5):n.expires));let o=`${sp(e)}=${lp(t)}`,s=[o,i===void 0?``:`; Expires=`+i,n.path?`; Path=`+n.path:``,n.domain?`; Domain=`+n.domain:``,n.sameSite?`; SameSite=`+n.sameSite:``,n.httpOnly?`; HttpOnly`:``,n.secure?`; Secure`:``,n.other?`; `+n.other:``].join(``);if(r){r.req.qCookies?r.req.qCookies.push(s):r.req.qCookies=[s],r.res.setHeader(`Set-Cookie`,r.req.qCookies);let t=r.req.headers.cookie||``;if(i!==void 0&&a<0){let n=mp(e,r);n!==void 0&&(t=t.replace(`${e}=${n}; `,``).replace(`; ${e}=${n}`,``).replace(`${e}=${n}`,``))}else t=t?`${o}; ${t}`:s;r.req.headers.cookie=t}else document.cookie=s}function mp(e,t){let n=t?t.req.headers:document,r=n.cookie?n.cookie.split(`; `):[],i=r.length,a=e?null:{},o=0,s,c,l;for(;omp(t,e),set:(t,n,r)=>pp(t,n,r,e),has:t=>gp(t,e),remove:(t,n)=>hp(t,n,e),getAll:()=>mp(null,e)}}let vp={install({$q:e,ssrContext:t}){e.cookies=this}};Object.assign(vp,_p());var yp=h({name:`DialogPluginComponent`,props:{...Z,title:String,message:String,prompt:Object,options:Object,progress:[Boolean,Object],html:Boolean,ok:{type:[String,Object,Boolean],default:!0},cancel:[String,Object,Boolean],focus:{type:String,default:`ok`,validator:e=>[`ok`,`cancel`,`none`].includes(e)},stackButtons:Boolean,color:String,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:[`ok`,`hide`],setup(t,{emit:n}){let{proxy:r}=(0,e.getCurrentInstance)(),{$q:i}=r,a=Q(t,i),o=(0,e.ref)(null),s=(0,e.ref)(t.prompt===void 0?t.options===void 0?void 0:t.options.model:t.prompt.model),c=(0,e.computed)(()=>`q-dialog-plugin`+(a.value===!0?` q-dialog-plugin--dark q-dark`:``)+(t.progress===!1?``:` q-dialog-plugin--progress`)),l=(0,e.computed)(()=>t.color||(a.value===!0?`amber`:`primary`)),u=(0,e.computed)(()=>t.progress===!1?null:Se(t.progress)===!0?{component:t.progress.spinner||Ut,props:{color:t.progress.color||l.value}}:{component:Ut,props:{color:l.value}}),d=(0,e.computed)(()=>t.prompt!==void 0||t.options!==void 0),f=(0,e.computed)(()=>{if(d.value!==!0)return{};let{model:e,isValid:n,items:r,...i}=t.prompt===void 0?t.options:t.prompt;return i}),p=(0,e.computed)(()=>Se(t.ok)===!0||t.ok===!0?i.lang.label.ok:t.ok),m=(0,e.computed)(()=>Se(t.cancel)===!0||t.cancel===!0?i.lang.label.cancel:t.cancel),h=(0,e.computed)(()=>t.prompt===void 0?t.options===void 0?!1:t.options.isValid!==void 0&&t.options.isValid(s.value)!==!0:t.prompt.isValid!==void 0&&t.prompt.isValid(s.value)!==!0),g=(0,e.computed)(()=>({color:l.value,label:p.value,ripple:!1,disable:h.value,...Se(t.ok)===!0?t.ok:{flat:!0},"data-autofocus":t.focus===`ok`&&d.value!==!0||void 0,onClick:b})),_=(0,e.computed)(()=>({color:l.value,label:m.value,ripple:!1,...Se(t.cancel)===!0?t.cancel:{flat:!0},"data-autofocus":t.focus===`cancel`&&d.value!==!0||void 0,onClick:x}));(0,e.watch)(()=>t.prompt&&t.prompt.model,C),(0,e.watch)(()=>t.options&&t.options.model,C);function v(){o.value.show()}function y(){o.value.hide()}function b(){n(`ok`,(0,e.toRaw)(s.value)),y()}function x(){y()}function S(){n(`hide`)}function C(e){s.value=e}function w(e){h.value!==!0&&t.prompt.type!==`textarea`&&V(e,13)===!0&&b()}function T(n,r){return t.html===!0?(0,e.h)(di,{class:n,innerHTML:r}):(0,e.h)(di,{class:n},()=>r)}function E(){return[(0,e.h)($c,{color:l.value,dense:!0,autofocus:!0,dark:a.value,...f.value,modelValue:s.value,"onUpdate:modelValue":C,onKeyup:w})]}function D(){return[(0,e.h)(Cl,{color:l.value,options:t.options.items,dark:a.value,...f.value,modelValue:s.value,"onUpdate:modelValue":C})]}function O(){let n=[];return t.cancel&&n.push((0,e.h)($,_.value)),t.ok&&n.push((0,e.h)($,g.value)),(0,e.h)(fi,{class:t.stackButtons===!0?`items-end`:``,vertical:t.stackButtons,align:`right`},()=>n)}function k(){let n=[];return t.title&&n.push(T(`q-dialog__title`,t.title)),t.progress!==!1&&n.push((0,e.h)(di,{class:`q-dialog__progress`},()=>(0,e.h)(u.value.component,u.value.props))),t.message&&n.push(T(`q-dialog__message`,t.message)),t.prompt===void 0?t.options!==void 0&&n.push((0,e.h)(Qs,{dark:a.value}),(0,e.h)(di,{class:`scroll q-dialog-plugin__form`},D),(0,e.h)(Qs,{dark:a.value})):n.push((0,e.h)(di,{class:`scroll q-dialog-plugin__form`},E)),(t.ok||t.cancel)&&n.push(O()),n}function A(){return[(0,e.h)(ui,{class:[c.value,t.cardClass],style:t.cardStyle,dark:a.value},k)]}return Object.assign(r,{show:v,hide:y}),()=>(0,e.h)(Cs,{ref:o,onHide:S},A)}}),bp={install({$q:e,parentApp:t}){e.dialog=this.create=ap(yp,!0,t)}};let xp,Sp,Cp=0,wp=null,Tp={},Ep={},Dp={group:`__default_quasar_group__`,delay:0,message:!1,html:!1,spinnerSize:80,spinnerColor:``,messageColor:``,backgroundColor:``,boxClass:``,spinner:Ut,customClass:``},Op={...Dp};function kp(e){if(e?.group!==void 0&&Ep[e.group]!==void 0)return Object.assign(Ep[e.group],e);let t=Se(e)===!0&&e.ignoreDefaults===!0?{...Dp,...e}:{...Op,...e};return Ep[t.group]=t,t}let Ap=_({isActive:!1},{show(t){Tp=kp(t);let{group:n}=Tp;return Ap.isActive=!0,xp===void 0?(Tp.uid=++Cp,wp!==null&&clearTimeout(wp),wp=setTimeout(()=>{wp=null;let t=zn(`q-loading`);xp=Oe({name:`QLoading`,setup(){(0,e.onMounted)(()=>{vs(!0)});function n(){Ap.isActive!==!0&&xp!==void 0&&(vs(!1),xp.unmount(t),Bn(t),xp=void 0,Sp=void 0)}function r(){if(Ap.isActive!==!0)return null;let t=[(0,e.h)(Tp.spinner,{class:`q-loading__spinner`,color:Tp.spinnerColor,size:Tp.spinnerSize})];return Tp.message&&t.push((0,e.h)(`div`,{class:`q-loading__message`+(Tp.messageColor?` text-${Tp.messageColor}`:``),[Tp.html===!0?`innerHTML`:`textContent`]:Tp.message})),(0,e.h)(`div`,{class:`q-loading fullscreen flex flex-center z-max `+Tp.customClass.trim(),key:Tp.uid},[(0,e.h)(`div`,{class:`q-loading__backdrop`+(Tp.backgroundColor?` bg-${Tp.backgroundColor}`:``)}),(0,e.h)(`div`,{class:`q-loading__box column items-center `+Tp.boxClass},t)])}return()=>(0,e.h)(e.Transition,{name:`q-transition--fade`,appear:!0,onAfterLeave:n},r)}},Ap.__parentApp),Sp=xp.mount(t)},Tp.delay)):(Tp.uid=Cp,Sp.$forceUpdate()),e=>{if(e===void 0||Object(e)!==e){Ap.hide(n);return}Ap.show({...e,group:n})}},hide(e){if(Ap.isActive===!0){if(e===void 0)Ep={};else if(Ep[e]===void 0)return;else{delete Ep[e];let t=Object.keys(Ep);if(t.length!==0){let e=t[t.length-1];Ap.show({group:e});return}}wp!==null&&(clearTimeout(wp),wp=null),Ap.isActive=!1}},setDefaults(e){Se(e)===!0&&Object.assign(Op,e)},install({$q:e,parentApp:t}){e.loading=this,Ap.__parentApp=t,e.config.loading!==void 0&&this.setDefaults(e.config.loading)}}),jp=(0,e.ref)(null),Mp=_({isActive:!1},{start:y,stop:y,increment:y,setDefaults:y,install({$q:t,parentApp:n}){if(t.loadingBar=this,this.__installed===!0){t.config.loadingBar!==void 0&&this.setDefaults(t.config.loadingBar);return}let r=(0,e.ref)(t.config.loadingBar===void 0?{}:{...t.config.loadingBar});function i(){Mp.isActive=!0}function a(){Mp.isActive=!1}let o=zn(`q-loading-bar`);Oe({name:`LoadingBar`,devtools:{hide:!0},setup:()=>()=>(0,e.h)(qe,{...r.value,onStart:i,onStop:a,ref:jp})},n).mount(o),Object.assign(this,{start(e){jp.value.start(e)},stop(){jp.value.stop()},increment(){jp.value.increment.apply(null,arguments)},setDefaults(e){Se(e)===!0&&Object.assign(r.value,e)}})}}),Np=null,Pp,Fp=[];function Ip(e){e.title&&(e.title=e.titleTemplate?e.titleTemplate(e.title):e.title,delete e.titleTemplate),[[`meta`,`content`],[`link`,`href`]].forEach(t=>{let n=e[t[0]],r=t[1];for(let e in n){let t=n[e];t.template&&(Object.keys(t).length===1?delete n[e]:(t[r]=t.template(t[r]||``),delete t.template))}})}function Lp(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!0;for(let n in e)if(e[n]!==t[n])return!0}function Rp(e){return[`class`,`style`].includes(e)===!1}function zp(e){return[`lang`,`dir`].includes(e)===!1}function Bp(e,t){let n={},r={};return e===void 0?{add:t,remove:r}:(e.title!==t.title&&(n.title=t.title),[`meta`,`link`,`script`,`htmlAttr`,`bodyAttr`].forEach(i=>{let a=e[i],o=t[i];if(r[i]=[],a==null){n[i]=o;return}n[i]={};for(let e in a)o.hasOwnProperty(e)===!1&&r[i].push(e);for(let e in o)a.hasOwnProperty(e)===!1?n[i][e]=o[e]:Lp(a[e],o[e])===!0&&(r[i].push(e),n[i][e]=o[e])}),{add:n,remove:r})}function Vp({add:e,remove:t}){e.title&&(document.title=e.title),Object.keys(t).length!==0&&([`meta`,`link`,`script`].forEach(e=>{t[e].forEach(t=>{document.head.querySelector(`${e}[data-qmeta="${t}"]`).remove()})}),t.htmlAttr.filter(zp).forEach(e=>{document.documentElement.removeAttribute(e)}),t.bodyAttr.filter(Rp).forEach(e=>{document.body.removeAttribute(e)})),[`meta`,`link`,`script`].forEach(t=>{let n=e[t];for(let e in n){let r=document.createElement(t);for(let t in n[e])t!==`innerHTML`&&r.setAttribute(t,n[e][t]);r.setAttribute(`data-qmeta`,e),t===`script`&&(r.innerHTML=n[e].innerHTML||``),document.head.appendChild(r)}}),Object.keys(e.htmlAttr).filter(zp).forEach(t=>{document.documentElement.setAttribute(t,e.htmlAttr[t]||``)}),Object.keys(e.bodyAttr).filter(Rp).forEach(t=>{document.body.setAttribute(t,e.bodyAttr[t]||``)})}function Hp(){Np=null;let e={title:``,titleTemplate:null,meta:{},link:{},script:{},htmlAttr:{},bodyAttr:{}};for(let t=0;te.iconSet.type.positive,color:`positive`},negative:{icon:e=>e.iconSet.type.negative,color:`negative`},warning:{icon:e=>e.iconSet.type.warning,color:`warning`,textColor:`dark`},info:{icon:e=>e.iconSet.type.info,color:`info`},ongoing:{group:!1,timeout:0,spinner:!0,color:`grey-8`}};function nm(t,n,r){if(!t)return am(`parameter required`);let i,a={textColor:`white`};if(t.ignoreDefaults!==!0&&Object.assign(a,Kp),Se(t)===!1&&(a.type&&Object.assign(a,tm[a.type]),t={message:t}),Object.assign(a,tm[t.type||a.type],t),typeof a.icon==`function`&&(a.icon=a.icon(n)),a.spinner?(a.spinner===!0&&(a.spinner=Ut),a.spinner=(0,e.markRaw)(a.spinner)):a.spinner=!1,a.meta={hasMedia:!!(a.spinner!==!1||a.icon||a.avatar),hasText:im(a.message)||im(a.caption)},a.position){if($p.includes(a.position)===!1)return am(`wrong position`,t)}else a.position=`bottom`;if(Qp.includes(a.timeout)===!0)a.timeout=5e3;else{let e=Number(a.timeout);if(isNaN(e)||e<0)return am(`wrong timeout`,t);a.timeout=Number.isFinite(e)?e:0}a.timeout===0?a.progress=!1:a.progress===!0&&(a.meta.progressClass=`q-notification__progress`+(a.progressClass?` ${a.progressClass}`:``),a.meta.progressStyle={animationDuration:`${a.timeout+1e3}ms`});let o=(Array.isArray(t.actions)===!0?t.actions:[]).concat(t.ignoreDefaults!==!0&&Array.isArray(Kp.actions)===!0?Kp.actions:[]).concat(Array.isArray(tm[t.type]?.actions)===!0?tm[t.type].actions:[]),{closeBtn:s}=a;if(s&&o.push({label:typeof s==`string`?s:n.lang.label.close}),a.actions=o.map(({handler:e,noDismiss:t,...n})=>({flat:!0,...n,onClick:typeof e==`function`?()=>{e(),t!==!0&&c()}:()=>{c()}})),a.multiLine===void 0&&(a.multiLine=a.actions.length>1),Object.assign(a.meta,{class:`q-notification row items-stretch q-notification--${a.multiLine===!0?`multi-line`:`standard`}`+(a.color===void 0?``:` bg-${a.color}`)+(a.textColor===void 0?``:` text-${a.textColor}`)+(a.classes===void 0?``:` ${a.classes}`),wrapperClass:`q-notification__wrapper col relative-position border-radius-inherit `+(a.multiLine===!0?`column no-wrap justify-center`:`row items-center`),contentClass:`q-notification__content row items-center`+(a.multiLine===!0?``:` col`),leftClass:a.meta.hasText===!0?`additional`:`single`,attrs:{role:`alert`,...a.attrs}}),a.group===!1?(a.group=void 0,a.meta.group=void 0):((a.group===void 0||a.group===!0)&&(a.group=[a.message,a.caption,a.multiline].concat(a.actions.map(e=>`${e.label}*${e.icon}`)).join(`|`)),a.meta.group=a.group+`|`+a.position),a.actions.length===0?a.actions=void 0:a.meta.actionsClass=`q-notification__actions row items-center `+(a.multiLine===!0?`justify-end`:`col-auto`)+(a.meta.hasMedia===!0?` q-notification__actions--with-media`:``),r!==void 0){r.notif.meta.timer&&(clearTimeout(r.notif.meta.timer),r.notif.meta.timer=void 0),a.meta.uid=r.notif.meta.uid;let e=Jp[a.position].value.indexOf(r.notif);Jp[a.position].value[e]=a}else{let e=qp[a.meta.group];if(e===void 0){if(a.meta.uid=Gp++,a.meta.badge=1,[`left`,`right`,`center`].indexOf(a.position)!==-1)Jp[a.position].value.splice(Math.floor(Jp[a.position].value.length/2),0,a);else{let e=a.position.indexOf(`top`)===-1?`push`:`unshift`;Jp[a.position].value[e](a)}a.group!==void 0&&(qp[a.meta.group]=a)}else{if(e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0),a.badgePosition!==void 0){if(em.includes(a.badgePosition)===!1)return am(`wrong badgePosition`,t)}else a.badgePosition=`top-${a.position.indexOf(`left`)===-1?`left`:`right`}`;a.meta.uid=e.meta.uid,a.meta.badge=e.meta.badge+1,a.meta.badgeClass=`q-notification__badge q-notification__badge--${a.badgePosition}`+(a.badgeColor===void 0?``:` bg-${a.badgeColor}`)+(a.badgeTextColor===void 0?``:` text-${a.badgeTextColor}`)+(a.badgeClass?` ${a.badgeClass}`:``);let n=Jp[a.position].value.indexOf(e);Jp[a.position].value[n]=qp[a.meta.group]=a}}let c=()=>{rm(a),i=void 0};if(a.timeout>0&&(a.meta.timer=setTimeout(()=>{a.meta.timer=void 0,c()},a.timeout+1e3)),a.group!==void 0)return e=>{e===void 0?c():am(`trying to update a grouped one which is forbidden`,t)};if(i={dismiss:c,config:t,notif:a},r!==void 0){Object.assign(r,i);return}return e=>{i!==void 0&&(e===void 0?i.dismiss():nm(Object.assign({},i.config,e,{group:!1,position:a.position}),n,i))}}function rm(e){e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0);let t=Jp[e.position].value.indexOf(e);if(t!==-1){e.group!==void 0&&delete qp[e.meta.group];let n=Zp[String(e.meta.uid)];if(n){let{width:e,height:t}=getComputedStyle(n);n.style.left=`${n.offsetLeft}px`,n.style.width=e,n.style.height=t}Jp[e.position].value.splice(t,1),typeof e.onDismiss==`function`&&e.onDismiss()}}function im(e){return e!=null&&Xp.test(e)!==!0}function am(e,t){return console.error(`Notify: ${e}`,t),!1}function om(){return h({name:`QNotifications`,devtools:{hide:!0},setup(){return()=>(0,e.h)(`div`,{class:`q-notifications`},$p.map(t=>(0,e.h)(e.TransitionGroup,{key:t,class:Yp[t],tag:`div`,name:`q-notification--${t}`},()=>Jp[t].value.map(t=>{let n=t.meta,r=[];if(n.hasMedia===!0&&(t.spinner===!1?t.icon?r.push((0,e.h)(X,{class:`q-notification__icon q-notification__icon--`+n.leftClass,name:t.icon,color:t.iconColor,size:t.iconSize,role:`img`})):t.avatar&&r.push((0,e.h)(ht,{class:`q-notification__avatar q-notification__avatar--`+n.leftClass},()=>(0,e.h)(`img`,{src:t.avatar,"aria-hidden":`true`}))):r.push((0,e.h)(t.spinner,{class:`q-notification__spinner q-notification__spinner--`+n.leftClass,color:t.spinnerColor,size:t.spinnerSize}))),n.hasText===!0){let n,i={class:`q-notification__message col`};if(t.html===!0)i.innerHTML=t.caption?`
${t.message}
${t.caption}
`:t.message;else{let r=[t.message];n=t.caption?[(0,e.h)(`div`,r),(0,e.h)(`div`,{class:`q-notification__caption`},[t.caption])]:r}r.push((0,e.h)(`div`,i,n))}let i=[(0,e.h)(`div`,{class:n.contentClass},r)];return t.progress===!0&&i.push((0,e.h)(`div`,{key:`${n.uid}|p|${n.badge}`,class:n.progressClass,style:n.progressStyle})),t.actions!==void 0&&i.push((0,e.h)(`div`,{class:n.actionsClass},t.actions.map(t=>(0,e.h)($,t)))),n.badge>1&&i.push((0,e.h)(`div`,{key:`${n.uid}|${n.badge}`,class:t.meta.badgeClass,style:t.badgeStyle},[n.badge])),(0,e.h)(`div`,{ref:e=>{Zp[String(n.uid)]=e},key:n.uid,class:n.class,...n.attrs},[(0,e.h)(`div`,{class:n.wrapperClass},i)])}))))}})}var sm={setDefaults(e){Se(e)===!0&&Object.assign(Kp,e)},registerType(e,t){Se(t)===!0&&(tm[e]=t)},install({$q:t,parentApp:n}){if(t.notify=this.create=e=>nm(e,t),t.notify.setDefaults=this.setDefaults,t.notify.registerType=this.registerType,t.config.notify!==void 0&&this.setDefaults(t.config.notify),this.__installed!==!0){$p.forEach(t=>{Jp[t]=(0,e.ref)([]);let n=[`left`,`center`,`right`].includes(t)===!0?`center`:t.indexOf(`top`)===-1?`bottom`:`top`,r=t.indexOf(`left`)===-1?t.indexOf(`right`)===-1?`center`:`end`:`start`;Yp[t]=`q-notifications__list q-notifications__list--${n} fixed column no-wrap ${[`left`,`right`].includes(t)?`items-${t===`left`?`start`:`end`} justify-center`:t===`center`?`flex-center`:`items-${r}`}`});let t=zn(`q-notify`);Oe(om(),n).mount(t)}}};function cm(e){return Ce(e)===!0?`__q_date|`+e.getTime():we(e)===!0?`__q_expr|`+e.source:typeof e==`number`?`__q_numb|`+e:typeof e==`boolean`?`__q_bool|`+(e?`1`:`0`):typeof e==`string`?`__q_strn|`+e:typeof e==`function`?`__q_strn|`+e.toString():e===Object(e)?`__q_objt|`+JSON.stringify(e):e}function lm(e){if(e.length<9)return e;let t=e.substring(0,8),n=e.substring(9);switch(t){case`__q_date`:let t=Number(n);return new Date(Number.isNaN(t)===!0?n:t);case`__q_expr`:return new RegExp(n);case`__q_numb`:return Number(n);case`__q_bool`:return n===`1`;case`__q_strn`:return String(n);case`__q_objt`:return JSON.parse(n);default:return e}}function um(){let e=()=>null;return{has:()=>!1,hasItem:()=>!1,getLength:()=>0,getItem:e,getIndex:e,getKey:e,getAll:()=>{},getAllKeys:()=>[],set:y,setItem:y,remove:y,removeItem:y,clear:y,isEmpty:()=>!0}}function dm(e){let t=window[e+`Storage`],n=e=>{let n=t.getItem(e);return n?lm(n):null},r=e=>t.getItem(e)!==null,i=(e,n)=>{t.setItem(e,cm(n))},a=e=>{t.removeItem(e)};return{has:r,hasItem:r,getLength:()=>t.length,getItem:n,getIndex:e=>ee{let e,r={},i=t.length;for(let a=0;a{let e=[],n=t.length;for(let r=0;r{t.clear()},isEmpty:()=>t.length===0}}let fm=p.has.webStorage===!1?um():dm(`local`),pm={install({$q:e}){e.localStorage=fm}};Object.assign(pm,fm);let mm=p.has.webStorage===!1?um():dm(`session`),hm={install({$q:e}){e.sessionStorage=mm}};Object.assign(hm,mm);var gm=n({AddressbarColor:()=>Jf,AppFullscreen:()=>tp,AppVisibility:()=>np,BottomSheet:()=>op,Cookies:()=>vp,Dark:()=>L,Dialog:()=>bp,IconSet:()=>ue,Lang:()=>ce,Loading:()=>Ap,LoadingBar:()=>Mp,LocalStorage:()=>pm,Meta:()=>Wp,Notify:()=>sm,Platform:()=>m,Screen:()=>I,SessionStorage:()=>hm});function _m(e){let t=document.createElement(`textarea`);t.value=e,t.contentEditable=`true`,t.style.position=`fixed`;let n=()=>{};Er(n),document.body.appendChild(t),t.focus(),t.select();let r=document.execCommand(`copy`);return t.remove(),Dr(n),r}function vm(e){return navigator.clipboard===void 0?new Promise((t,n)=>{let r=_m(e);r?t(!0):n(r)}):navigator.clipboard.writeText(e)}var ym=e=>{let t={activated(){this.__qMeta.active=!0,Up()},deactivated(){this.__qMeta.active=!1,Up()},unmounted(){Fp.splice(Fp.indexOf(this.__qMeta),1),Up(),this.__qMeta=void 0}};return typeof e==`function`?Object.assign(t,{computed:{__qMetaOptions(){return e.call(this)||{}}},watch:{__qMetaOptions(e){this.__qMeta.val=e,this.__qMeta.active===!0&&Up()}},created(){this.__qMeta={active:!0,val:this.__qMetaOptions},Fp.push(this.__qMeta),Up()}}):t.created=function(){this.__qMeta={active:!0,val:e},Fp.push(this.__qMeta),Up()},t},bm=class{constructor(){this.__stack={}}on(e,t,n){return(this.__stack[e]||(this.__stack[e]=[])).push({fn:t,ctx:n}),this}once(e,t,n){let r=(...i)=>{this.off(e,r),t.apply(n,i)};return r.__callback=t,this.on(e,r,n)}emit(e){let t=this.__stack[e];if(t!==void 0){let e=[].slice.call(arguments,1);t.forEach(t=>{t.fn.apply(t.ctx,e)})}return this}off(e,t){let n=this.__stack[e];if(n===void 0)return this;if(t===void 0)return delete this.__stack[e],this;let r=n.filter(e=>e.fn!==t&&e.fn.__callback!==t);return r.length===0?delete this.__stack[e]:this.__stack[e]=r,this}};function xm(e){setTimeout(()=>{window.URL.revokeObjectURL(e.href)},1e4),e.remove()}function Sm(e,t,n={}){let{mimeType:r,byteOrderMark:i,encoding:a}=typeof n==`string`?{mimeType:n}:n,o=a===void 0?t:new TextEncoder(a).encode([t]),s=new Blob(i===void 0?[o]:[i,o],{type:r||`application/octet-stream`}),c=document.createElement(`a`);c.href=window.URL.createObjectURL(s),c.setAttribute(`download`,e),c.download===void 0&&c.setAttribute(`target`,`_blank`),c.classList.add(`hidden`),c.style.position=`fixed`,document.body.appendChild(c);try{return c.click(),xm(c),!0}catch(e){return xm(c),e}}function Cm(e){let t=Object.assign({noopener:!0},e),n=[];for(let e in t){let r=t[e];r===!0?n.push(e):(Te(r)||typeof r==`string`&&r!==``)&&n.push(e+`=`+r)}return n.join(`,`)}function wm(e,t,n){let r=window.open;if(m.is.cordova===!0){if(cordova?.InAppBrowser?.open!==void 0)r=cordova.InAppBrowser.open;else if(navigator?.app!==void 0)return navigator.app.loadUrl(e,{openExternal:!0})}let i=Object.assign({noopener:!0},n),a=i.noopener===!0||i.noreferrer===!0,o=r(e,`_blank`,Cm(n));if(o)return m.is.desktop&&o.focus(),o;a===!1&&t?.()}var Tm=(e,t,n)=>{if(m.is.ios===!0&&window.SafariViewController!==void 0){window.SafariViewController.isAvailable(r=>{r?window.SafariViewController.show({url:e},y,t):wm(e,t,n)});return}return wm(e,t,n)};function Em(e){let t=Array.isArray(e);if(t===!0){let n=e.length;return{isList:t,totalJobs:n,resultAggregator:Array(n).fill(null)}}let n=Object.keys(e),r={};return n.forEach(e=>{r[e]=null}),{isList:t,totalJobs:n.length,resultAggregator:r,resultKeys:n}}function Dm(e,{threadsNumber:t=1,abortOnFail:n=!0}={}){let r=-1,i=!1,{isList:a,totalJobs:o,resultAggregator:s,resultKeys:c}=Em(e),l=Array(Math.min(o,t)).fill(null).map(()=>new Promise((t,l)=>{function u(){let d=++r;if(i===!0||d>=o){t();return}let f=a===!0?d:c[d];e[f](s).then(e=>{if(i===!0){t();return}s[f]={key:f,status:`fulfilled`,value:e},setTimeout(u)}).catch(e=>{if(i===!0){t();return}let r={key:f,status:`rejected`,reason:e};if(s[f]=r,n===!0){i=!0,l({...r,resultAggregator:s});return}setTimeout(u)})}u()}));return Promise.all(l).then(()=>s)}var Om=n({EventBus:()=>bm,clone:()=>Fl,colors:()=>Va,copyToClipboard:()=>vm,createMetaMixin:()=>ym,createUploaderComponent:()=>Ud,date:()=>Xo,debounce:()=>N,dom:()=>$t,event:()=>M,exportFile:()=>Sm,extend:()=>Ks,format:()=>Le,frameDebounce:()=>Ml,getCssVar:()=>Uf,is:()=>Ee,morph:()=>gf,noop:()=>y,openURL:()=>Tm,patterns:()=>Da,runSequentialPromises:()=>Dm,scroll:()=>hr,setCssVar:()=>R,throttle:()=>en,uid:()=>Qr});function km(){let{emit:t,proxy:n}=(0,e.getCurrentInstance)(),r=(0,e.ref)(null);function i(){r.value.show()}function a(){r.value.hide()}function o(e){t(`ok`,e),a()}function s(){t(`hide`)}return Object.assign(n,{show:i,hide:a}),{dialogRef:r,onDialogHide:s,onDialogOK:o,onDialogCancel:a}}let Am=[`ok`,`hide`];km.emits=Am,km.emitsObject=Vd(Am);function jm(t){{let n={active:!0};if(typeof t==`function`){let r=(0,e.computed)(t);n.val=r.value,(0,e.watch)(r,e=>{n.val=e,n.active===!0&&Up()})}else n.val=t;Fp.push(n),Up(),(0,e.onActivated)(()=>{n.active=!0,Up()}),(0,e.onDeactivated)(()=>{n.active=!1,Up()}),(0,e.onUnmounted)(()=>{Fp.splice(Fp.indexOf(n),1),Up()})}}function Mm(){return(0,e.inject)(`_q_`)}function Nm(){let t=null,n=(0,e.getCurrentInstance)();function r(){t!==null&&(clearInterval(t),t=null)}return(0,e.onDeactivated)(r),(0,e.onBeforeUnmount)(r),{removeInterval:r,registerInterval(e,i){r(),Ot(n)===!1&&(t=setInterval(e,i))}}}var Pm=n({useDialogPluginComponent:()=>km,useFormChild:()=>dc,useHydration:()=>oa,useId:()=>ti,useInterval:()=>Nm,useMeta:()=>jm,useQuasar:()=>Mm,useRenderCache:()=>bi,useSplitAttrs:()=>Vs,useTick:()=>Zn,useTimeout:()=>Qn});window.Vue===void 0&&console.error(`[ Quasar ] Vue is required to run. Please add a script tag for it before loading Quasar.`),window.Quasar={version:`2.19.3`,install(e,t){je(e,{components:Zd,directives:Hf,plugins:gm,...t})},lang:ce,iconSet:ue,...Zd,...Hf,...gm,...Pm,...Om}})(window.Vue); \ No newline at end of file diff --git a/lnbits/task_manager.py b/lnbits/task_manager.py deleted file mode 100644 index 55c57efc6..000000000 --- a/lnbits/task_manager.py +++ /dev/null @@ -1,555 +0,0 @@ -import asyncio -import traceback -import uuid -from collections.abc import Callable, Coroutine -from datetime import datetime, timezone -from typing import TypeVar - -from fastapi import WebSocket -from loguru import logger -from pydantic import BaseModel - -from lnbits.core.models import Payment -from lnbits.settings import settings -from lnbits.utils.electrum import ( - AddressTracker, - BlockInfo, - BlockTracker, - OnchainAddressEvent, - OnchainTxEvent, - TransactionTracker, - scripthash_from_address, -) - - -class PublicTask(BaseModel): - """Public model used to expose task information via the API.""" - - name: str - created_at: datetime - - -class Task: - """Model used on the backend to keep track of background tasks.""" - - coro: Coroutine - name: str - created_at: datetime - task: asyncio.Task - invoice_queue: asyncio.Queue[Payment] | None = None - onchain_address_queue: asyncio.Queue[OnchainAddressEvent] | None = None - onchain_tx_queue: asyncio.Queue[OnchainTxEvent] | None = None - block_queue: asyncio.Queue[BlockInfo] | None = None - - def __init__( - self, - coro: Coroutine, - name: str | None = None, - invoice_queue: asyncio.Queue | None = None, - onchain_address_queue: asyncio.Queue | None = None, - onchain_tx_queue: asyncio.Queue | None = None, - block_queue: asyncio.Queue | None = None, - ) -> None: - self.coro = coro - self.name = name or f"task_{uuid.uuid4()}" - self.created_at = datetime.now(timezone.utc) - self.task = asyncio.create_task(self.coro, name=self.name) - self.invoice_queue = invoice_queue - self.onchain_address_queue = onchain_address_queue - self.onchain_tx_queue = onchain_tx_queue - self.block_queue = block_queue - - -class TaskManager: - """Singleton class to manage background tasks.""" - - ONCHAIN_ADDRESS_LISTENER_SUFFIX = "_onchain_address_listener" - - tasks: list[Task] = [] - invoice_queue: asyncio.Queue[Payment] = asyncio.Queue() - internal_invoice_queue: asyncio.Queue[Payment] = asyncio.Queue() - _address_tracker: "AddressTracker | None" = None - _block_tracker: "BlockTracker | None" = None - _tx_trackers: dict[str, "TransactionTracker"] = {} - _tracked_addresses_by_listener: dict[str, set[str]] = {} - - def init(self) -> None: - self.create_permanent_task( - func=self._heart_beat, - interval=settings.task_heart_beat_interval, - ) - self.create_permanent_task(self._invoice_listener_consumer) - self.create_permanent_task(self._internal_invoice_listener_consumer) - - def get_task(self, name: str) -> Task | None: - """Get a running task by name.""" - for task in self.tasks: - if task.name == name: - return task - return None - - def get_public_tasks(self) -> list[PublicTask]: - """Get a list of public tasks.""" - return [PublicTask(name=t.name, created_at=t.created_at) for t in self.tasks] - - def cancel_task(self, task: Task) -> None: - """Cancel a running task.""" - self.tasks.remove(task) - try: - task.task.cancel() - except Exception as exc: - logger.warning(f"error while cancelling task `{task.name}`: {exc!s}") - - def cancel_all_tasks(self) -> None: - """Cancel all running tasks.""" - for task in list(self.tasks): - self.cancel_task(task) - - def create_task( - self, - coro: Coroutine, - name: str | None = None, - invoice_queue: asyncio.Queue | None = None, - onchain_address_queue: asyncio.Queue | None = None, - onchain_tx_queue: asyncio.Queue | None = None, - block_queue: asyncio.Queue | None = None, - ) -> Task: - """Create a task. If a task with the same name exists, it will be cancelled.""" - if name: - task = self.get_task(name) - if task: - self.cancel_task(task) - task = Task( - coro=coro, - name=name, - invoice_queue=invoice_queue, - onchain_address_queue=onchain_address_queue, - onchain_tx_queue=onchain_tx_queue, - block_queue=block_queue, - ) - self.tasks.append(task) - return task - - def create_permanent_task( - self, - func: Callable[[], Coroutine], - invoice_queue: asyncio.Queue | None = None, - onchain_address_queue: asyncio.Queue | None = None, - onchain_tx_queue: asyncio.Queue | None = None, - block_queue: asyncio.Queue | None = None, - name: str | None = None, - interval: int = 0, - ) -> Task: - """Create a task that runs forever and restarts on failure.""" - - async def wrapper(): - while settings.lnbits_running: - await self._catch_everything_and_restart(func) - if interval > 0: - await asyncio.sleep(interval) - - return self.create_task( - coro=wrapper(), - name=name or func.__name__, - invoice_queue=invoice_queue, - onchain_address_queue=onchain_address_queue, - onchain_tx_queue=onchain_tx_queue, - block_queue=block_queue, - ) - - def register_invoice_listener( - self, - func: Callable[[Payment], Coroutine], - name: str | None = None, - ) -> Task: - """ - A method intended for extensions to call when they want to be notified about - incoming payments. Will call provided Coroutine with the updated payment. - """ - name = f"{name or uuid.uuid4()}_invoice_listener" - queue: asyncio.Queue[Payment] = asyncio.Queue() - return self.create_permanent_task( - self._invoice_listener_worker(func, queue), - name=name, - invoice_queue=queue, - ) - - def register_onchain_listener( - self, - func: Callable[[OnchainAddressEvent], Coroutine], - name: str | None = None, - ) -> Task: - """ - Register a callback for onchain address events. Only dispatches events - for addresses tracked under the same `name` via track_address, e.g. an - extension registering as "ext_satspay" only sees events for addresses - it tracked with that same name. Defaults to the shared "core" listener - if no name is given. - """ - name = name or "core" - queue: asyncio.Queue[OnchainAddressEvent] = asyncio.Queue() - return self.create_permanent_task( - self._onchain_address_listener_worker(func, queue), - name=f"{name}{self.ONCHAIN_ADDRESS_LISTENER_SUFFIX}", - onchain_address_queue=queue, - ) - - def register_onchain_tx_listener( - self, - func: Callable[[OnchainTxEvent], Coroutine], - name: str | None = None, - ) -> Task: - """ - Register a callback for onchain transaction events dispatched for any - transaction currently tracked via register_ws_tx_queue. - Will call the provided coroutine with an OnchainTxEvent on each update. - """ - name = f"{name or uuid.uuid4()}_onchain_tx_listener" - queue: asyncio.Queue[OnchainTxEvent] = asyncio.Queue() - return self.create_permanent_task( - self._onchain_tx_listener_worker(func, queue), - name=name, - onchain_tx_queue=queue, - ) - - def register_block_listener( - self, - func: Callable[[BlockInfo], Coroutine], - name: str | None = None, - ) -> Task: - """ - Register a callback for new block events dispatched while the shared - block tracker is running (i.e. while a websocket or other consumer has - requested block updates via register_ws_block_queue). - Will call the provided coroutine with a BlockInfo on each new block. - """ - name = f"{name or uuid.uuid4()}_block_listener" - queue: asyncio.Queue[BlockInfo] = asyncio.Queue() - return self.create_permanent_task( - self._block_listener_worker(func, queue), - name=name, - block_queue=queue, - ) - - def track_address(self, address: str, name: str) -> None: - """Start tracking a Bitcoin address via Electrum (ref-counted). - - `name` identifies the listener (see register_onchain_listener) that - should receive events for this address. - """ - self._get_address_tracker().add(address) - self._tracked_addresses_by_listener.setdefault(name, set()).add(address) - - def untrack_address(self, address: str, name: str) -> None: - """Decrement ref count; remove from shared tracker when last caller leaves.""" - if self._address_tracker: - self._address_tracker.remove(address) - tracked = self._tracked_addresses_by_listener.get(name) - if tracked: - tracked.discard(address) - if not tracked: - self._tracked_addresses_by_listener.pop(name, None) - - def _get_address_tracker(self) -> "AddressTracker": - if self._address_tracker is None: - self._address_tracker = AddressTracker( - settings.lnbits_blockexplorer_electrum_url - ) - if not self.get_task("address_tracker"): - self.create_task( - self._address_tracker.run( - self._dispatch_onchain_event, - lambda: settings.lnbits_running, - ), - name="address_tracker", - ) - return self._address_tracker - - def register_ws_address_queue( - self, address: str, queue: asyncio.Queue[OnchainAddressEvent] - ) -> None: - """Register a per-connection queue for a watched address. - - Raises ValueError if the address is invalid. - """ - scripthash_from_address(address) - self._get_address_tracker().register_queue(address, queue) - - def unregister_ws_address_queue( - self, address: str, queue: asyncio.Queue[OnchainAddressEvent] - ) -> None: - """Deregister a per-connection queue and decrement the address ref count.""" - if self._address_tracker: - self._address_tracker.unregister_queue(address, queue) - - def register_ws_tx_queue( - self, txid: str, queue: asyncio.Queue[OnchainTxEvent] - ) -> None: - """Register a per-connection queue for a watched transaction.""" - self._get_tx_tracker(txid).register_queue(queue) - - def unregister_ws_tx_queue( - self, txid: str, queue: asyncio.Queue[OnchainTxEvent] - ) -> None: - """Deregister a per-connection queue; cancel tracker when last one leaves.""" - tracker = self._tx_trackers.get(txid) - if not tracker: - return - tracker.unregister_queue(queue) - if not tracker.has_queues(): - self._tx_trackers.pop(txid, None) - task = self.get_task(f"ws_tx_{txid}") - if task: - self.cancel_task(task) - - def _get_tx_tracker(self, txid: str) -> "TransactionTracker": - tracker = self._tx_trackers.get(txid) - if tracker is None: - tracker = TransactionTracker(settings.lnbits_blockexplorer_electrum_url) - self._tx_trackers[txid] = tracker - if not self.get_task(f"ws_tx_{txid}"): - self.create_task( - self._transaction_tracker_dispatch(txid, tracker), - name=f"ws_tx_{txid}", - ) - return tracker - - def register_ws_block_queue(self, queue: asyncio.Queue[BlockInfo]) -> None: - """Register a per-connection queue for new block events.""" - if self._block_tracker is None: - self._block_tracker = BlockTracker( - settings.lnbits_blockexplorer_electrum_url - ) - tracker = self._block_tracker - was_empty = not tracker.has_queues() - tracker.register_queue(queue) - if was_empty: - self.create_task( - tracker.run( - self._dispatch_block_event, - lambda: tracker.has_queues() and settings.lnbits_running, - ), - name="block_tracker", - ) - - def unregister_ws_block_queue(self, queue: asyncio.Queue[BlockInfo]) -> None: - """Deregister a per-connection queue; cancel tracker when last one leaves.""" - if not self._block_tracker: - return - self._block_tracker.unregister_queue(queue) - if not self._block_tracker.has_queues(): - task = self.get_task("block_tracker") - if task: - self.cancel_task(task) - - def track_transaction( - self, - txid: str, - callback: Callable[[OnchainTxEvent], Coroutine], - ) -> Task: - """Track a transaction until confirmed, calling callback on each change.""" - return self.create_task( - self._transaction_tracker(txid, callback), - name=f"onchain_tx_{txid}", - ) - - async def _heart_beat(self) -> None: - """A heartbeat that removes done tasks logs the number of tasks.""" - for task in self.tasks: - state = task.task._state if task.task else "NOT RUNNING" - if settings.task_heart_beat_verbose: - logger.debug( - f"Task Manager: `{task.name}` state: `{state}` " - f"created: {task.created_at.strftime('%Y-%m-%d %H:%M:%S')}`" - ) - if task.task and task.task.done(): - logger.debug(f"Task Manager: task `{task.name}` is done.") - self.cancel_task(task) - invoice_listeners = sum(1 for task in self.tasks if task.invoice_queue) - onchain_listeners = sum( - 1 - for task in self.tasks - if task.onchain_address_queue or task.onchain_tx_queue or task.block_queue - ) - other_tasks = len(self.tasks) - invoice_listeners - onchain_listeners - logger.debug( - f"Task Manager: {other_tasks} tasks, " - f"{invoice_listeners} invoice listeners, " - f"{onchain_listeners} onchain listeners." - ) - - async def _catch_everything_and_restart( - self, - func: Callable[[], Coroutine], - restart_interval: int = 5, - ) -> None: - """Catches all exceptions from a function and restarts it after 5 seconds.""" - while settings.lnbits_running: - try: - return await func() - except asyncio.CancelledError: - raise # because we must pass this up - except Exception as exc: - if not settings.lnbits_running: - return - logger.error(f"exception in background task `{func.__name__}`:", exc) - logger.error(traceback.format_exc()) - logger.info( - f"`{func.__name__}` restarts in {restart_interval} seconds." - ) - await asyncio.sleep(restart_interval) - - def _invoice_listener_worker( - self, func: Callable[[Payment], Coroutine], queue: asyncio.Queue[Payment] - ) -> Callable: - async def wrapper() -> None: - payment: Payment = await queue.get() - await func(payment) - - return wrapper - - def _onchain_address_listener_worker( - self, - func: Callable[[OnchainAddressEvent], Coroutine], - queue: asyncio.Queue[OnchainAddressEvent], - ) -> Callable: - async def wrapper() -> None: - event: OnchainAddressEvent = await queue.get() - await func(event) - - return wrapper - - def _onchain_tx_listener_worker( - self, - func: Callable[[OnchainTxEvent], Coroutine], - queue: asyncio.Queue[OnchainTxEvent], - ) -> Callable: - async def wrapper() -> None: - event: OnchainTxEvent = await queue.get() - await func(event) - - return wrapper - - def _block_listener_worker( - self, - func: Callable[[BlockInfo], Coroutine], - queue: asyncio.Queue[BlockInfo], - ) -> Callable: - async def wrapper() -> None: - event: BlockInfo = await queue.get() - await func(event) - - return wrapper - - def _invoice_dispatcher(self, payment: Payment) -> None: - """Dispatches a payment to all registered invoice listeners.""" - for task in self.tasks: - if not task.invoice_queue: - continue - logger.debug(f"Enqueing payment to task {task.name}") - task.invoice_queue.put_nowait(payment) - - async def _dispatch_onchain_event(self, event: OnchainAddressEvent) -> None: - """Dispatches an onchain address event to listeners tracking that - address under their own name (see track_address). - - Per-address WS queue fan-out is handled by AddressTracker itself. - """ - for task in self.tasks: - if not task.onchain_address_queue: - continue - if not task.name.endswith(self.ONCHAIN_ADDRESS_LISTENER_SUFFIX): - continue - name = task.name[: -len(self.ONCHAIN_ADDRESS_LISTENER_SUFFIX)] - if event.address in self._tracked_addresses_by_listener.get(name, ()): - task.onchain_address_queue.put_nowait(event) - - async def _dispatch_onchain_tx_event(self, event: OnchainTxEvent) -> None: - """Dispatches an onchain tx event to registered listeners. - - Per-tx WS queue fan-out is handled by TransactionTracker itself. - """ - for task in self.tasks: - if task.onchain_tx_queue: - task.onchain_tx_queue.put_nowait(event) - - async def _dispatch_block_event(self, event: BlockInfo) -> None: - """Dispatches a new block event to registered listeners. - - Per-connection WS queue fan-out is handled by BlockTracker itself. - """ - for task in self.tasks: - if task.block_queue: - task.block_queue.put_nowait(event) - - async def _invoice_listener_consumer(self) -> None: - payment = await self.invoice_queue.get() - logger.info(f"got a payment notification {payment.checking_id}") - self._invoice_dispatcher(payment) - - async def _internal_invoice_listener_consumer(self) -> None: - payment = await self.internal_invoice_queue.get() - logger.info(f"got an internal payment notification {payment.checking_id}") - self._invoice_dispatcher(payment) - - async def _transaction_tracker( - self, txid: str, callback: Callable[[OnchainTxEvent], Coroutine] - ) -> None: - await TransactionTracker(settings.lnbits_blockexplorer_electrum_url).track( - txid, - callback, - lambda: settings.lnbits_running, - ) - - async def _transaction_tracker_dispatch( - self, txid: str, tracker: "TransactionTracker" - ) -> None: - await tracker.track( - txid, - self._dispatch_onchain_tx_event, - lambda: tracker.has_queues() and settings.lnbits_running, - ) - - -T = TypeVar("T", bound=BaseModel) - - -async def relay_ws_queue( - websocket: WebSocket, - queue: "asyncio.Queue[T]", - serialize: Callable[[T], BaseModel] = lambda e: e, - stop_after: Callable[[T], bool] = lambda _: False, -) -> None: - """ - Pumps events from `queue` to `websocket` as JSON until the client - disconnects, sending fails, or `stop_after` returns True for an event. - Shared by the blockexplorer address/tx/block websocket endpoints. - """ - try: - while settings.lnbits_running: - recv_task = asyncio.create_task(websocket.receive()) - event_task = asyncio.create_task(queue.get()) - done, pending = await asyncio.wait( - [recv_task, event_task], return_when=asyncio.FIRST_COMPLETED - ) - for t in pending: - t.cancel() - disconnect = recv_task in done and ( - recv_task.result().get("type") == "websocket.disconnect" - ) - if disconnect: - break - if event_task in done: - event = event_task.result() - try: - await websocket.send_json(serialize(event).dict()) - except Exception as exc: - logger.debug(f"ws relay send error: {exc}") - break - if stop_after(event): - break - except Exception as exc: - logger.debug(f"ws relay error: {exc}") - - -task_manager = TaskManager() diff --git a/lnbits/tasks.py b/lnbits/tasks.py index 6a02e44bf..8d2b05e88 100644 --- a/lnbits/tasks.py +++ b/lnbits/tasks.py @@ -1,83 +1,143 @@ import asyncio +import traceback import uuid from collections.abc import Callable, Coroutine from loguru import logger from lnbits.core.models import Payment -from lnbits.core.services.payments import get_standalone_payment +from lnbits.core.services.payments import update_invoice_callback from lnbits.settings import settings -from lnbits.task_manager import task_manager +from lnbits.wallets import get_funding_source + +tasks: list[asyncio.Task] = [] +unique_tasks: dict[str, asyncio.Task] = {} -# DEPRECATED: use task_manager.create_task instead. def create_task(coro: Coroutine) -> asyncio.Task: - logger.debug("DEPRECATED: use task_manager.create_task instead.") - return task_manager.create_task(coro).task + task = asyncio.create_task(coro) + tasks.append(task) + return task -# DEPRECATED: use task_manager.create_task with `name` kwarg. def create_unique_task(name: str, coro: Coroutine) -> asyncio.Task: - logger.debug("DEPRECATED: use task_manager.create_task instead.") - return task_manager.create_task(coro, name=name).task + if unique_tasks.get(name): + logger.warning(f"task `{name}` already exists, cancelling it") + try: + unique_tasks[name].cancel() + except Exception as exc: + logger.warning(f"error while cancelling task `{name}`: {exc!s}") + task = asyncio.create_task(coro) + unique_tasks[name] = task + return task -# DEPRECATED: use task_manager.create_permanent_task instead. def create_permanent_task(func: Callable[[], Coroutine]) -> asyncio.Task: - logger.debug("DEPRECATED: use task_manager.create_permanent_task instead.") - return task_manager.create_permanent_task(func).task + return create_task(catch_everything_and_restart(func)) -# DEPRECATED: use task_manager.create_permanent_task with `name` argument instead. def create_permanent_unique_task( name: str, coro: Callable[[], Coroutine] ) -> asyncio.Task: return create_unique_task(name, catch_everything_and_restart(coro, name)) -# DEPRECATED don't use this, use task_manager.create_permanent_task instead. +def cancel_all_tasks() -> None: + for task in tasks: + try: + task.cancel() + except Exception as exc: + logger.warning(f"error while cancelling task: {exc!s}") + for name, task in unique_tasks.items(): + try: + task.cancel() + except Exception as exc: + logger.warning(f"error while cancelling task `{name}`: {exc!s}") + + async def catch_everything_and_restart( func: Callable[[], Coroutine], name: str = "unnamed", -) -> None: - _ = name - return await task_manager._catch_everything_and_restart(func) +) -> Coroutine: + try: + return await func() + except asyncio.CancelledError: + raise # because we must pass this up + except Exception as exc: + logger.error(f"exception in background task `{name}`:", exc) + logger.error(traceback.format_exc()) + logger.error("will restart the task in 5 seconds.") + await asyncio.sleep(5) + return await catch_everything_and_restart(func, name) +invoice_listeners: dict[str, asyncio.Queue] = {} + + +# TODO: name should not be optional +# some extensions still dont use a name, but they should def register_invoice_listener(send_chan: asyncio.Queue, name: str | None = None): """ - DEPRECATED: use task_manager.register_invoice_listener instead, - which also allows to pass a callback instead of a queue. - This method will still work but it is not recommended for new code. + A method intended for extensions (and core/tasks.py) to call when they want to be + notified about new invoice payments incoming. Will emit all incoming payments. """ - logger.debug("DEPRECATED: use task_manager.register_invoice_listener instead.") - name = f"forward_{name or str(uuid.uuid4())[:8]}" + if not name: + # fallback to a random name if extension didn't provide one + name = f"no_name_{str(uuid.uuid4())[:8]}" - # here we just forwarding the payments to the provided queue - async def forward_queue(payment: Payment): - send_chan.put_nowait(payment) + if invoice_listeners.get(name): + logger.warning(f"invoice listener `{name}` already exists, replacing it") - task_manager.register_invoice_listener(forward_queue, name=name) + logger.trace(f"registering invoice listener `{name}`") + invoice_listeners[name] = send_chan + + +internal_invoice_queue: asyncio.Queue = asyncio.Queue(0) async def internal_invoice_queue_put(checking_id: str) -> None: """ - DEPRECATED: use task_manager.internal_invoice_queue instead, A method to call when it wants to notify about an internal invoice payment. """ - payment = await get_standalone_payment(checking_id, incoming=True) - if not payment: - logger.warning(f"internal_invoice_queue_put: payment {checking_id} not found") - return - await task_manager.internal_invoice_queue.put(payment) + await internal_invoice_queue.put(checking_id) + + +async def internal_invoice_listener() -> None: + """ + internal_invoice_queue will be filled directly in core/services.py + after the payment was deemed to be settled internally. + + Called by the app startup sequence. + """ + while settings.lnbits_running: + checking_id = await internal_invoice_queue.get() + logger.info(f"got an internal payment notification {checking_id}") + payment = await update_invoice_callback(checking_id) + if payment: + logger.success(f"internal invoice {checking_id} settled") + await invoice_callback_dispatcher(payment) + + +async def invoice_listener() -> None: + """ + invoice_listener will collect all invoices that come directly + from the backend wallet. + + Called by the app startup sequence. + """ + funding_source = get_funding_source() + async for checking_id in funding_source.paid_invoices_stream(): + logger.info(f"got a payment notification {checking_id}") + payment = await update_invoice_callback(checking_id) + if payment: + logger.success(f"fundingsource invoice {checking_id} settled") + await invoice_callback_dispatcher(payment) -# DEPRECATED use task_manager.register_invoice_listener(coro, name="myext") def wait_for_paid_invoices( invoice_listener_name: str, func: Callable[[Payment], Coroutine], ) -> Callable[[], Coroutine]: - logger.debug("DEPRECATED: use task_manager.register_invoice_listener instead.") async def wrapper() -> None: invoice_queue: asyncio.Queue = asyncio.Queue() @@ -87,3 +147,27 @@ def wait_for_paid_invoices( await func(payment) return wrapper + + +def run_interval( + interval_seconds: int, + func: Callable[[], Coroutine], +) -> Callable[[], Coroutine]: + """Run a function at a specified interval in seconds, while the server is running""" + + async def wrapper() -> None: + while settings.lnbits_running: + try: + await func() + except Exception as e: + logger.error(f"Error occurred in interval task: {e}") + logger.warning(traceback.format_exc()) + await asyncio.sleep(interval_seconds) + + return wrapper + + +async def invoice_callback_dispatcher(payment: Payment): + for name, send_chan in invoice_listeners.items(): + logger.trace(f"invoice listeners: sending to `{name}`") + await send_chan.put(payment) diff --git a/lnbits/templates/base.html b/lnbits/templates/base.html index 87d60be15..c81271b2e 100644 --- a/lnbits/templates/base.html +++ b/lnbits/templates/base.html @@ -16,18 +16,6 @@ src: url("{{ static_url_for('static', 'fonts/material-icons-v50.woff2') }}") format('woff2'); } - - .wasm-extension-page, - .wasm-extension-frame { - height: calc(100vh - 56px); - min-height: calc(100vh - 56px); - width: 100%; - } - - .wasm-extension-frame { - border: 0; - display: block; - } {% block title %}{{ SITE_TITLE }}{% endblock %} @@ -56,14 +44,12 @@ {% block page_container %} - +
- + {% endblock %} diff --git a/lnbits/templates/components.vue b/lnbits/templates/components.vue index 84e6b562c..9d7715f29 100644 --- a/lnbits/templates/components.vue +++ b/lnbits/templates/components.vue @@ -1,5 +1,4 @@ -{% include('components/admin/funding_seed_backup.vue') %} {% -include('components/admin/funding.vue') %} {% +{% include('components/admin/funding.vue') %} {% include('components/admin/funding_sources.vue') %} {% include('components/admin/fiat_providers.vue') %} {% include('components/admin/exchange_providers.vue') %} {% @@ -8,12 +7,9 @@ include('components/admin/users.vue') %} {% include('components/admin/site_customisation.vue') %} {% include('components/admin/audit.vue') %} {% include('components/admin/extensions.vue') %} {% -include('components/admin/wasm-runtime.vue') %} {% -include('components/admin/wasm-limit-config.vue') %} {% include('components/admin/assets-config.vue') %} {% include('components/admin/notifications.vue') %} {% include('components/admin/server.vue') %} {% -include('components/admin/blockexplorer.vue') %} {% include('components/lnbits-qrcode.vue') %} {% include('components/lnbits-qrcode-scanner.vue') %} {% include('components/lnbits-disclaimer.vue') %} {% @@ -23,7 +19,6 @@ include('components/lnbits-header-wallets.vue') %} {% include('components/lnbits-drawer.vue') %} {% include('components/lnbits-home-logos.vue') %} {% include('components/lnbits-manage-extension-list.vue') %} {% -include('components/lnbits-extension-permissions.vue') %} {% include('components/lnbits-manage-wallet-list.vue') %} {% include('components/lnbits-language-dropdown.vue') %} {% include('components/lnbits-payment-list.vue') %} {% @@ -101,21 +96,6 @@ include('components/lnbits-error.vue') %} - - - - - - - - - - -
diff --git a/lnbits/templates/components/admin/blockexplorer.vue b/lnbits/templates/components/admin/blockexplorer.vue deleted file mode 100644 index a642fc2d9..000000000 --- a/lnbits/templates/components/admin/blockexplorer.vue +++ /dev/null @@ -1,90 +0,0 @@ - diff --git a/lnbits/templates/components/admin/exchange_providers.vue b/lnbits/templates/components/admin/exchange_providers.vue index eb2a33dc2..5a23dd927 100644 --- a/lnbits/templates/components/admin/exchange_providers.vue +++ b/lnbits/templates/components/admin/exchange_providers.vue @@ -1,46 +1,7 @@ diff --git a/lnbits/templates/components/admin/funding_seed_backup.vue b/lnbits/templates/components/admin/funding_seed_backup.vue deleted file mode 100644 index 74d12c9ca..000000000 --- a/lnbits/templates/components/admin/funding_seed_backup.vue +++ /dev/null @@ -1,136 +0,0 @@ - diff --git a/lnbits/templates/components/admin/server.vue b/lnbits/templates/components/admin/server.vue index 76b75aa2c..3a885b383 100644 --- a/lnbits/templates/components/admin/server.vue +++ b/lnbits/templates/components/admin/server.vue @@ -69,127 +69,6 @@
-
-
-
- - - - - - - - - -
-
- - - - - - - - - -
-
-
- - - - - - - - - - -
- -
-
- -
-
- -
diff --git a/lnbits/templates/components/admin/wasm-limit-config.vue b/lnbits/templates/components/admin/wasm-limit-config.vue deleted file mode 100644 index 4b67b3ab0..000000000 --- a/lnbits/templates/components/admin/wasm-limit-config.vue +++ /dev/null @@ -1,242 +0,0 @@ - diff --git a/lnbits/templates/components/admin/wasm-runtime.vue b/lnbits/templates/components/admin/wasm-runtime.vue deleted file mode 100644 index 9d7195fb4..000000000 --- a/lnbits/templates/components/admin/wasm-runtime.vue +++ /dev/null @@ -1,245 +0,0 @@ - diff --git a/lnbits/templates/components/lnbits-extension-permissions.vue b/lnbits/templates/components/lnbits-extension-permissions.vue deleted file mode 100644 index 6219a9b0b..000000000 --- a/lnbits/templates/components/lnbits-extension-permissions.vue +++ /dev/null @@ -1,202 +0,0 @@ - diff --git a/lnbits/templates/components/lnbits-manage-extension-list.vue b/lnbits/templates/components/lnbits-manage-extension-list.vue index 53298545d..6705d6dc3 100644 --- a/lnbits/templates/components/lnbits-manage-extension-list.vue +++ b/lnbits/templates/components/lnbits-manage-extension-list.vue @@ -18,18 +18,13 @@ - - + @@ -37,7 +32,10 @@ > - + diff --git a/lnbits/templates/components/lnbits-payment-list.vue b/lnbits/templates/components/lnbits-payment-list.vue index 64b083b3d..22a927cb7 100644 --- a/lnbits/templates/components/lnbits-payment-list.vue +++ b/lnbits/templates/components/lnbits-payment-list.vue @@ -156,7 +156,7 @@ - + diff --git a/lnbits/templates/components/lnbits-wallet-api-docs.vue b/lnbits/templates/components/lnbits-wallet-api-docs.vue index 624b0db0b..6a6dd43fb 100644 --- a/lnbits/templates/components/lnbits-wallet-api-docs.vue +++ b/lnbits/templates/components/lnbits-wallet-api-docs.vue @@ -6,12 +6,6 @@ :content-inset-level="0.5" > - @@ -72,7 +66,7 @@ diff --git a/lnbits/templates/components/lnbits-wallet-extra.vue b/lnbits/templates/components/lnbits-wallet-extra.vue index d43d3f30a..6b12fe945 100644 --- a/lnbits/templates/components/lnbits-wallet-extra.vue +++ b/lnbits/templates/components/lnbits-wallet-extra.vue @@ -157,60 +157,6 @@
- -
-
- - - - -
-
- -
-
- - - -
-
-
diff --git a/lnbits/templates/pages.vue b/lnbits/templates/pages.vue index b50d3b6b4..344fccb65 100644 --- a/lnbits/templates/pages.vue +++ b/lnbits/templates/pages.vue @@ -4,4 +4,4 @@ include('pages/users.vue') %} {% include('pages/admin.vue') %} {% include('pages/account.vue') %} {% include('pages/extensions_builder.vue') %} {% include('pages/extensions.vue') %} {% include('pages/first-install.vue') %} {% include('pages/home.vue') %} {% include('pages/wallet.vue') %} {% -include('pages/error.vue') %} {% include('pages/blockexplorer.vue') %} +include('pages/error.vue') %} diff --git a/lnbits/templates/pages/account.vue b/lnbits/templates/pages/account.vue index aa5cf9530..2373062b3 100644 --- a/lnbits/templates/pages/account.vue +++ b/lnbits/templates/pages/account.vue @@ -889,17 +889,6 @@ >
-
- - - -
diff --git a/lnbits/templates/pages/admin.vue b/lnbits/templates/pages/admin.vue index 20b8ee6df..919bd7564 100644 --- a/lnbits/templates/pages/admin.vue +++ b/lnbits/templates/pages/admin.vue @@ -74,13 +74,7 @@
-
+
- @@ -213,7 +199,6 @@ > - - - - - - @@ -255,9 +234,6 @@ - - - diff --git a/lnbits/templates/pages/blockexplorer.vue b/lnbits/templates/pages/blockexplorer.vue deleted file mode 100644 index 364bb8298..000000000 --- a/lnbits/templates/pages/blockexplorer.vue +++ /dev/null @@ -1,385 +0,0 @@ - - - diff --git a/lnbits/templates/pages/extensions.vue b/lnbits/templates/pages/extensions.vue index 4f636bb2d..0bfcbef83 100644 --- a/lnbits/templates/pages/extensions.vue +++ b/lnbits/templates/pages/extensions.vue @@ -7,29 +7,7 @@ - - - - - - - - - - + - - - -
- - - - -
- - - -
- - -
-
- + +
- + - - - - -
- -
- - -
-
+ @click="installExtension(release)" + color="primary unelevated mt-lg pt-lg" + :label="$t('install')" + >
@@ -859,175 +752,9 @@ >
- +
- - - - - -
- - -
-
-
- - - - - - - -
-
-
- -
-
- -
-
- - - -
-
- - - -
-
-
-
- -
-
-
@@ -1282,15 +1009,7 @@
- +
Copy Invoice Key - - - - - - - -
-
- - · - -
-
- - - - - - - -
-
diff --git a/lnbits/templates/pages/wallet.vue b/lnbits/templates/pages/wallet.vue index c185eb6b0..2c4d4cb03 100644 --- a/lnbits/templates/pages/wallet.vue +++ b/lnbits/templates/pages/wallet.vue @@ -28,13 +28,7 @@
-
+
@@ -238,113 +228,6 @@
- - - -
-
-
-
-
-
- - Refresh - -
- - - -
- - -
- - - -
- - - - - - - - - - - - - - - - - -
- -
- - No completed payments. - -
- -
- -
-
-
-
- -
- - - -

@@ -809,8 +664,7 @@ unelevated color="primary" @click="payInvoice" - :disable="parse.sending" - :label="parse.sending ? $t('sending') + '...' : $t('pay')" + :label="$t('pay')" >

- + Send { ) { // Open the cache event.respondWith( - caches - .open(CURRENT_CACHE + getApiKey(event.request)) - .then(cache => { - // Go to the network first - return fetch(event.request) - .then(fetchedResponse => { - cache.put(event.request, fetchedResponse.clone()).catch(() => {}) + caches.open(CURRENT_CACHE + getApiKey(event.request)).then(cache => { + // Go to the network first + return fetch(event.request) + .then(fetchedResponse => { + cache.put(event.request, fetchedResponse.clone()) - return fetchedResponse - }) - .catch(() => { - // If the network is unavailable, get - return cache.match(event.request).then(cachedResponse => { - return cachedResponse || offlineResponse() - }) - }) - }) - .catch(() => fetch(event.request).catch(() => offlineResponse())) + return fetchedResponse + }) + .catch(() => { + // If the network is unavailable, get + return cache.match(event.request.url) + }) + }) ) } }) -const offlineResponse = () => - new Response('', { - status: 503, - statusText: 'Service Unavailable' - }) - // Handle and show incoming push notifications self.addEventListener('push', function (event) { if (!(self.Notification && self.Notification.permission === 'granted')) { diff --git a/lnbits/templates/wasm_extension.html b/lnbits/templates/wasm_extension.html deleted file mode 100644 index 94d9808cc..000000000 --- a/lnbits/templates/wasm_extension.html +++ /dev/null @@ -1 +0,0 @@ -{% extends "base.html" %} diff --git a/lnbits/utils/cache.py b/lnbits/utils/cache.py index 9d8c6c3b1..904447e19 100644 --- a/lnbits/utils/cache.py +++ b/lnbits/utils/cache.py @@ -1,8 +1,13 @@ from __future__ import annotations +import asyncio from time import time from typing import Any, NamedTuple +from loguru import logger + +from lnbits.settings import settings + class Cached(NamedTuple): value: Any @@ -17,7 +22,8 @@ class Cache: Small caching utility providing simple get/set interface (very much like redis) """ - def __init__(self) -> None: + def __init__(self, interval: float = 10) -> None: + self.interval = interval self._values: dict[Any, Cached] = {} def value(self, key: str) -> Cached | None: @@ -53,11 +59,16 @@ class Cache: self.set(key, value, expiry=expiry) return value - async def invalidate_cache(self): - ts = time() - expired = [k for k, v in self._values.items() if v.expiry < ts] - for k in expired: - self._values.pop(k) + async def invalidate_forever(self): + while settings.lnbits_running: + try: + await asyncio.sleep(self.interval) + ts = time() + expired = [k for k, v in self._values.items() if v.expiry < ts] + for k in expired: + self._values.pop(k) + except Exception: + logger.error("Error invalidating cache") cache = Cache() diff --git a/lnbits/utils/electrum.py b/lnbits/utils/electrum.py deleted file mode 100644 index 1c103a19d..000000000 --- a/lnbits/utils/electrum.py +++ /dev/null @@ -1,1059 +0,0 @@ -""" -Electrum protocol client (https://github.com/spesmilo/electrum-protocol). - -JSON-RPC 2.0 over TCP / SSL (newline-delimited), with request/response -correlation, subscription dispatch, and automatic keepalive pings. -server.version is sent automatically on connect as required by the spec. -""" - -import asyncio -import hashlib -import itertools -import json -import ssl -import struct -from collections.abc import Callable, Coroutine -from typing import Any -from urllib.parse import urlparse - -from embit.networks import NETWORKS -from embit.script import Script -from embit.transaction import Transaction as EmbitTransaction -from loguru import logger -from pydantic import BaseModel - -DEFAULT_NETWORK = NETWORKS["main"] - - -def network_from_name(name: str) -> dict: - """Look up an embit network dict (see embit.networks.NETWORKS) by name.""" - try: - return NETWORKS[name] - except KeyError as exc: - raise ValueError( - f"Unknown network {name!r}, expected one of {list(NETWORKS)}" - ) from exc - - -class ElectrumError(Exception): - pass - - -def scripthash_from_scriptpubkey(scriptpubkey: bytes) -> str: - """Electrum script hash: SHA-256 of scriptPubKey, byte-reversed to hex.""" - return hashlib.sha256(scriptpubkey).digest()[::-1].hex() - - -def address_to_scriptpubkey(address: str) -> bytes: - """Convert a Bitcoin address (P2PKH/P2SH/P2WPKH/P2WSH/P2TR) to scriptPubKey.""" - try: - script = Script.from_address(address) - except Exception as exc: - raise ValueError(f"Invalid address: {address!r}") from exc - if script is None: - raise ValueError(f"Invalid address: {address!r}") - return script.data - - -def scripthash_from_address(address: str) -> str: - return scripthash_from_scriptpubkey(address_to_scriptpubkey(address)) - - -_SCRIPT_TYPE_NAMES = { - "p2pkh": "pubkeyhash", - "p2sh": "scripthash", - "p2wpkh": "witness_v0_keyhash", - "p2wsh": "witness_v0_scripthash", - "p2tr": "witness_v1_taproot", -} - - -def _scriptpubkey_info(spk: bytes, network: dict) -> tuple[str, str | None]: - """Return (type, address_or_None) for a scriptPubKey.""" - n = len(spk) - # P2PK (not classified by embit) - if n in (35, 67) and spk[-1] == 0xAC: - return "pubkey", None - # OP_RETURN (not classified by embit) - if n >= 1 and spk[0] == 0x6A: - return "nulldata", None - - script = Script(spk) - script_type = script.script_type() - if script_type is None: - return "nonstandard", None - return _SCRIPT_TYPE_NAMES[script_type], script.address(network) - - -# --------------------------------------------------------------------------- -# Response models -# --------------------------------------------------------------------------- - - -class Balance(BaseModel): - confirmed: int - unconfirmed: int - - -class HistoryEntry(BaseModel): - tx_hash: str - height: int - fee: int | None = None # present for mempool entries - - -class MempoolEntry(BaseModel): - tx_hash: str - height: int - fee: int - - -class UTXO(BaseModel): - tx_hash: str - tx_pos: int - height: int - value: int # satoshis - - -class BlockHeader(BaseModel): - height: int - hex: str - - -class BlockHeaderProof(BaseModel): - """Returned by get_block_header when cp_height > 0.""" - - branch: list[str] - header: str - root: str - - -class BlockHeaders(BaseModel): - count: int - hex: str - max: int - - -class MerkleProof(BaseModel): - block_height: int - merkle: list[str] - pos: int - - -class TxIdWithMerkle(BaseModel): - tx_hash: str - merkle: list[str] - - -class FeeHistogramEntry(BaseModel): - fee_rate: float - vsize: float - - -class ServerFeatures(BaseModel): - class Config: - extra = "allow" - - genesis_hash: str = "" - protocol_max: str = "" - protocol_min: str = "" - server_version: str = "" - pruning: int | None = None - hash_function: str = "sha256d" - hosts: dict[str, Any] = {} - - -class ScriptSig(BaseModel): - hex: str - - -class ScriptPubKey(BaseModel): - hex: str - type: str - address: str | None = None - - -class TxInput(BaseModel): - txid: str | None = None - vout: int | None = None - scriptSig: ScriptSig | None = None # noqa: N815 - sequence: int - coinbase: str | None = None - - -class TxOutput(BaseModel): - value: float - n: int - scriptPubKey: ScriptPubKey # noqa: N815 - - -class Transaction(BaseModel): - txid: str - version: int - locktime: int - vin: list[TxInput] - vout: list[TxOutput] - size: int - vsize: int - weight: int - hex: str - - -class FeeResponse(BaseModel): - estimates: dict[str, float] - histogram: list[FeeHistogramEntry] - - -class AddressResponse(BaseModel): - balance: Balance - history: list[HistoryEntry] - history_error: str | None = None - - -class BlockInfo(BaseModel): - height: int - hash: str - timestamp: int - version: int - bits: str - nonce: int - prev_hash: str - merkle_root: str - - -def parse_block_header(header_hex: str, height: int) -> BlockInfo: - """Parse an 80-byte block header hex string into a BlockInfo model.""" - data = bytes.fromhex(header_hex) - version = struct.unpack_from(" Transaction: - """Parse a raw transaction hex string into a Transaction model.""" - network = network or DEFAULT_NETWORK - data = bytes.fromhex(hex_str) - tx = EmbitTransaction.parse(data) - - vin: list[TxInput] = [] - for inp in tx.vin: - if inp.txid == b"\x00" * 32 and inp.vout == 0xFFFFFFFF: - vin.append( - TxInput(sequence=inp.sequence, coinbase=inp.script_sig.data.hex()) - ) - else: - vin.append( - TxInput( - txid=inp.txid.hex(), - vout=inp.vout, - scriptSig=ScriptSig(hex=inp.script_sig.data.hex()), - sequence=inp.sequence, - ) - ) - - vout: list[TxOutput] = [] - for n_out, out in enumerate(tx.vout): - spk_type, address = _scriptpubkey_info(out.script_pubkey.data, network) - vout.append( - TxOutput( - value=round(out.value / 1e8, 8), - n=n_out, - scriptPubKey=ScriptPubKey( - hex=out.script_pubkey.data.hex(), type=spk_type, address=address - ), - ) - ) - - if tx.is_segwit: - # base (non-witness) size = full size minus the segwit marker/flag - # (2 bytes) and each input's witness stack - witness_bytes = sum(len(inp.witness.serialize()) for inp in tx.vin) - base_size = len(data) - 2 - witness_bytes - weight = base_size * 3 + len(data) - vsize = (weight + 3) // 4 - else: - weight = len(data) * 4 - vsize = len(data) - - return Transaction( - txid=tx.txid().hex(), - version=tx.version, - locktime=tx.locktime, - vin=vin, - vout=vout, - size=len(data), - vsize=vsize, - weight=weight, - hex=hex_str, - ) - - -# --------------------------------------------------------------------------- -# Client -# --------------------------------------------------------------------------- - - -class ElectrumClient: - """ - Async Electrum protocol client over plain TCP or SSL. - - Messages are newline-terminated JSON-RPC 2.0, as required by the spec. - Handles request/response correlation by id, routes push notifications to - registered callbacks, and sends periodic pings to keep the connection alive. - - Usage:: - - # Plain TCP - async with ElectrumClient("tcp://blockstream.info:110") as client: - height = await client.get_height() - - # SSL - async with ElectrumClient("ssl://electrum.blockstream.info:50002") as c: - height = await c.get_height() - """ - - def __init__( - self, - url: str, - client_name: str = "lnbits", - protocol_version: str = "1.4", - ping_interval: float = 60.0, - network: dict | None = None, - ) -> None: - parsed = urlparse(url) - self.host = parsed.hostname or "" - self.port = parsed.port or ( - 50002 if parsed.scheme in ("ssl", "https") else 50001 - ) - self.use_ssl = parsed.scheme in ("ssl", "https") - self.client_name = client_name - self.protocol_version = protocol_version - self.ping_interval = ping_interval - self.network = network or DEFAULT_NETWORK - self._counter = itertools.count(1) - self._pending: dict[int, asyncio.Future[Any]] = {} - self._subscriptions: dict[str, list[Callable[[list[Any]], Any]]] = {} - self._recv_task: asyncio.Task[None] | None = None - self._ping_task: asyncio.Task[None] | None = None - self._reader: asyncio.StreamReader | None = None - self._writer: asyncio.StreamWriter | None = None - self.closed: asyncio.Event = asyncio.Event() - self.server_version: str = "" - self.negotiated_protocol: str = "" - - async def connect(self, timeout: float = 10.0) -> None: - ssl_ctx: ssl.SSLContext | None = None - if self.use_ssl: - ssl_ctx = ssl.create_default_context() - self._reader, self._writer = await asyncio.wait_for( - asyncio.open_connection( - self.host, self.port, ssl=ssl_ctx, limit=4 * 1024 * 1024 - ), - timeout=timeout, - ) - self._recv_task = asyncio.create_task(self._recv_loop()) - result = await self._call( - "server.version", [self.client_name, self.protocol_version], timeout=timeout - ) - self.server_version, self.negotiated_protocol = result[0], result[1] - logger.debug( - f"Electrum connected: server={self.server_version}" - f" protocol={self.negotiated_protocol}" - ) - if self.ping_interval > 0: - self._ping_task = asyncio.create_task(self._ping_loop()) - - async def close(self) -> None: - for task in (self._ping_task, self._recv_task): - if task: - task.cancel() - try: - await task - except asyncio.CancelledError: - pass - except Exception: - logger.debug("Electrum: error while cancelling task") - self._ping_task = None - self._recv_task = None - if self._writer: - self._writer.close() - try: - await asyncio.wait_for(self._writer.wait_closed(), timeout=5.0) - except Exception: - logger.debug("Electrum: error while closing writer") - self._reader = None - self._writer = None - - async def __aenter__(self) -> "ElectrumClient": - try: - await self.connect() - except BaseException: - await self.close() - raise - return self - - async def __aexit__(self, *_: Any) -> None: - await self.close() - - # ---- internal plumbing ---- - - async def _call( - self, - method: str, - params: list[Any] | dict[str, Any] | None = None, - timeout: float = 30.0, - ) -> Any: - if not self._writer: - raise ElectrumError("Not connected") - req_id = next(self._counter) - fut: asyncio.Future[Any] = asyncio.get_running_loop().create_future() - self._pending[req_id] = fut - self._writer.write( - json.dumps( - { - "jsonrpc": "2.0", - "id": req_id, - "method": method, - "params": params if params is not None else [], - } - ).encode() - + b"\n" - ) - await self._writer.drain() - try: - return await asyncio.wait_for(asyncio.shield(fut), timeout=timeout) - except asyncio.TimeoutError as exc: - self._pending.pop(req_id, None) - raise ElectrumError(f"Timeout waiting for response to {method!r}") from exc - - def _dispatch(self, msg: dict[str, Any]) -> None: - msg_id = msg.get("id") - if msg_id is not None: - fut = self._pending.pop(msg_id, None) - if fut and not fut.done(): - err = msg.get("error") - if err: - fut.set_exception(ElectrumError(err)) - else: - fut.set_result(msg.get("result")) - else: - method = msg.get("method", "") - params = msg.get("params", []) - for cb in list(self._subscriptions.get(method, [])): - try: - result = cb(params) - if asyncio.iscoroutine(result): - self._bg_tasks.add(asyncio.create_task(result)) - except Exception: - logger.exception(f"Electrum: callback error for {method!r}") - - async def _recv_loop(self) -> None: - assert self._reader - self._bg_tasks: set[asyncio.Task[Any]] = set() - buf = b"" - try: - while True: - chunk = await self._reader.read(65536) - if not chunk: - break - buf += chunk - while b"\n" in buf: - line, buf = buf.split(b"\n", 1) - if not line.strip(): - continue - try: - msg: dict[str, Any] = json.loads(line) - except json.JSONDecodeError: - logger.warning(f"Electrum: invalid JSON: {line!r}") - continue - self._dispatch(msg) - except asyncio.CancelledError: - pass - except Exception: - logger.exception("Electrum: recv loop error") - finally: - self.closed.set() - for fut in self._pending.values(): - if not fut.done(): - fut.set_exception(ElectrumError("Connection closed")) - self._pending.clear() - - async def _ping_loop(self) -> None: - try: - while True: - await asyncio.sleep(self.ping_interval) - await self._call("server.ping") - except asyncio.CancelledError: - pass - except Exception: - logger.exception("Electrum: ping loop error") - - # ---- subscription management ---- - - def on(self, method: str, callback: Callable[[list[Any]], Any]) -> None: - """Register a notification callback for a subscription method.""" - self._subscriptions.setdefault(method, []).append(callback) - - def off(self, method: str, callback: Callable[[list[Any]], Any]) -> None: - """Remove a previously registered notification callback.""" - cbs = self._subscriptions.get(method) - if cbs and callback in cbs: - cbs.remove(callback) - - # ---- server methods ---- - - async def server_ping(self) -> None: - await self._call("server.ping") - - async def server_banner(self) -> str: - return await self._call("server.banner") - - async def server_features(self) -> ServerFeatures: - data = await self._call("server.features") - return ServerFeatures.parse_obj(data) - - async def server_peers(self) -> list[Any]: - return await self._call("server.peers.subscribe") - - # ---- scripthash methods ---- - - async def get_balance(self, scripthash: str) -> Balance: - data = await self._call("blockchain.scripthash.get_balance", [scripthash]) - return Balance.parse_obj(data) - - async def get_history(self, scripthash: str) -> list[HistoryEntry]: - data = await self._call("blockchain.scripthash.get_history", [scripthash]) - return [HistoryEntry.parse_obj(e) for e in data] - - async def get_mempool(self, scripthash: str) -> list[MempoolEntry]: - data = await self._call("blockchain.scripthash.get_mempool", [scripthash]) - return [MempoolEntry.parse_obj(e) for e in data] - - async def listunspent(self, scripthash: str) -> list[UTXO]: - data = await self._call("blockchain.scripthash.listunspent", [scripthash]) - return [UTXO.parse_obj(e) for e in data] - - async def subscribe_scripthash( - self, - scripthash: str, - callback: Callable[[list[Any]], Any] | None = None, - ) -> str | None: - """Subscribe to status changes; returns current status hash or None.""" - if callback: - self.on("blockchain.scripthash.subscribe", callback) - return await self._call("blockchain.scripthash.subscribe", [scripthash]) - - async def unsubscribe_scripthash( - self, - scripthash: str, - callback: Callable[[list[Any]], Any] | None = None, - ) -> bool: - if callback: - self.off("blockchain.scripthash.subscribe", callback) - return await self._call("blockchain.scripthash.unsubscribe", [scripthash]) - - async def subscribe_headers( - self, - callback: Callable[[list[Any]], Any] | None = None, - ) -> BlockHeader: - """Subscribe to new block headers; returns current tip.""" - if callback: - self.on("blockchain.headers.subscribe", callback) - data = await self._call("blockchain.headers.subscribe") - return BlockHeader.parse_obj(data) - - # ---- transaction methods ---- - - async def broadcast(self, raw_tx: str) -> str: - """Broadcast a raw transaction hex; returns txid on success.""" - return await self._call("blockchain.transaction.broadcast", [raw_tx]) - - async def get_transaction(self, txid: str) -> str: - """Fetch raw transaction hex by txid.""" - return await self._call("blockchain.transaction.get", [txid]) - - async def get_merkle(self, txid: str, height: int) -> MerkleProof: - data = await self._call("blockchain.transaction.get_merkle", [txid, height]) - return MerkleProof.parse_obj(data) - - async def get_tx_id_from_pos( - self, height: int, tx_pos: int, merkle: bool = False - ) -> str | TxIdWithMerkle: - data = await self._call( - "blockchain.transaction.id_from_pos", [height, tx_pos, merkle] - ) - if isinstance(data, dict): - return TxIdWithMerkle.parse_obj(data) - return data - - # ---- block methods ---- - - async def get_tip(self) -> BlockHeader: - """Returns current chain tip.""" - data = await self._call("blockchain.headers.subscribe") - return BlockHeader.parse_obj(data) - - async def get_height(self) -> int: - """Returns the current best block height.""" - return (await self.get_tip()).height - - async def get_block_header( - self, height: int, cp_height: int = 0 - ) -> str | BlockHeaderProof: - data = await self._call("blockchain.block.header", [height, cp_height]) - if isinstance(data, dict): - return BlockHeaderProof.parse_obj(data) - return data - - async def get_block_headers( - self, start_height: int, count: int, cp_height: int = 0 - ) -> BlockHeaders: - data = await self._call( - "blockchain.block.headers", [start_height, count, cp_height] - ) - return BlockHeaders.parse_obj(data) - - # ---- fee methods ---- - - async def estimate_fee(self, num_blocks: int) -> float: - """Returns estimated fee rate in BTC/kB for confirmation within num_blocks.""" - return await self._call("blockchain.estimatefee", [num_blocks]) - - async def fee_histogram(self) -> list[FeeHistogramEntry]: - """Returns mempool fee histogram as FeeHistogramEntry(fee_rate, vsize) list.""" - data = await self._call("mempool.get_fee_histogram") - return [FeeHistogramEntry(fee_rate=r[0], vsize=r[1]) for r in data] - - -# --------------------------------------------------------------------------- -# Address tracking -# --------------------------------------------------------------------------- - - -class OnchainAddressEvent(BaseModel): - address: str - confirmed: int # satoshis - unconfirmed: int # satoshis - history: list[HistoryEntry] = [] - history_error: str | None = None - - @property - def txids(self) -> list[str]: - return [e.tx_hash for e in self.history] - - -class AddressTracker: - """ - Subscribes to a set of Bitcoin addresses over a single shared Electrum - connection and calls a callback on every balance/history change. - Addresses can be added/removed at runtime via :meth:`add`/:meth:`remove`, - and per-connection queues can be attached via :meth:`register_queue` for - consumers (e.g. websockets) that want events for one specific address. - Reconnects automatically on failure. - - Args: - url: Electrum server URL (e.g. ``ssl://electrum.blockstream.info:50002``). - """ - - def __init__(self, url: str) -> None: - self.url = url - self._ref_counts: dict[str, int] = {} - self._queues: dict[str, list[asyncio.Queue[OnchainAddressEvent]]] = {} - self._updated = asyncio.Event() - - def add(self, address: str) -> None: - """Start tracking an address on the shared connection (ref-counted).""" - count = self._ref_counts.get(address, 0) - self._ref_counts[address] = count + 1 - if count == 0: - self._updated.set() - - def remove(self, address: str) -> None: - """Decrement ref count; drop the subscription once the last caller leaves.""" - count = self._ref_counts.get(address, 0) - if count <= 1: - self._ref_counts.pop(address, None) - self._updated.set() - else: - self._ref_counts[address] = count - 1 - - def register_queue( - self, address: str, queue: "asyncio.Queue[OnchainAddressEvent]" - ) -> None: - """Register a per-connection queue to receive events for `address`.""" - self._queues.setdefault(address, []).append(queue) - self.add(address) - - def unregister_queue( - self, address: str, queue: "asyncio.Queue[OnchainAddressEvent]" - ) -> None: - """Deregister a per-connection queue for `address`.""" - queues = self._queues.get(address, []) - if queue in queues: - queues.remove(queue) - if not queues: - self._queues.pop(address, None) - self.remove(address) - - async def run( - self, - callback: Callable[[OnchainAddressEvent], Coroutine[Any, Any, None]], - is_active: Callable[[], bool], - ) -> None: - while is_active(): - try: - await self._run_once(callback, is_active) - except asyncio.CancelledError: - raise - except Exception as exc: - if not is_active(): - return - logger.warning(f"AddressTracker: {exc!s}, retrying in 5s") - await asyncio.sleep(5) - - async def _run_once( - self, - callback: Callable[[OnchainAddressEvent], Coroutine[Any, Any, None]], - is_active: Callable[[], bool], - ) -> None: - async with ElectrumClient(self.url) as client: - subscribed: dict[str, str] = {} # scripthash -> address - - async def on_status_change(params: list[Any]) -> None: - if not params: - return - address = subscribed.get(params[0]) - if address: - await self._fetch_and_dispatch(client, address, params[0], callback) - - client.on("blockchain.scripthash.subscribe", on_status_change) - - while is_active(): - self._updated.clear() - await self._sync_subscriptions(client, subscribed, callback) - if await self._wait_for_change_or_close(client): - break # connection closed; reconnect - - async def _sync_subscriptions( - self, - client: ElectrumClient, - subscribed: dict[str, str], - callback: Callable[[OnchainAddressEvent], Coroutine[Any, Any, None]], - ) -> None: - wanted = {a: scripthash_from_address(a) for a in self._ref_counts} - for address, scripthash in wanted.items(): - if scripthash not in subscribed: - subscribed[scripthash] = address - await client.subscribe_scripthash(scripthash) - await self._fetch_and_dispatch(client, address, scripthash, callback) - still_wanted = set(wanted.values()) - for scripthash, address in list(subscribed.items()): - if address not in still_wanted: - del subscribed[scripthash] - try: - await client.unsubscribe_scripthash(scripthash) - except ElectrumError: - # blockchain.scripthash.unsubscribe is part of the spec but - # many ElectrumX deployments don't implement it, returning - # "unknown method". This is expected and harmless: we've - # already dropped the scripthash from `subscribed` above, - # so if the server keeps pushing notifications for it - # anyway, on_status_change() looks it up, finds nothing, - # and drops them. Not logged since it fires on every - # untrack against these servers. - pass - - async def _wait_for_change_or_close(self, client: ElectrumClient) -> bool: - """Waits until addresses change or the connection closes; returns True - if it was the connection that closed.""" - wait_task = asyncio.create_task(self._updated.wait()) - closed_task = asyncio.create_task(client.closed.wait()) - try: - done, _ = await asyncio.wait( - [wait_task, closed_task], - timeout=30, - return_when=asyncio.FIRST_COMPLETED, - ) - finally: - for t in (wait_task, closed_task): - if not t.done(): - t.cancel() - return closed_task in done - - async def _fetch_and_dispatch( - self, - client: ElectrumClient, - address: str, - scripthash: str, - callback: Callable[[OnchainAddressEvent], Coroutine[Any, Any, None]], - ) -> None: - balance_r, history_r, mempool_r = await asyncio.gather( - client.get_balance(scripthash), - client.get_history(scripthash), - client.get_mempool(scripthash), - return_exceptions=True, - ) - if isinstance(balance_r, BaseException): - raise balance_r - history: list[HistoryEntry] = ( - [] if isinstance(history_r, BaseException) else history_r - ) - history_error: str | None = ( - str(history_r) if isinstance(history_r, BaseException) else None - ) - if not isinstance(mempool_r, BaseException): - seen = {e.tx_hash for e in history} - for m in mempool_r: - if m.tx_hash not in seen: - history.append(HistoryEntry(tx_hash=m.tx_hash, height=0, fee=m.fee)) - event = OnchainAddressEvent( - address=address, - confirmed=balance_r.confirmed, - unconfirmed=balance_r.unconfirmed, - history=history, - history_error=history_error, - ) - for q in list(self._queues.get(address, [])): - q.put_nowait(event) - await callback(event) - - -# --------------------------------------------------------------------------- -# Transaction tracking -# --------------------------------------------------------------------------- - - -class OnchainTxEvent(BaseModel): - txid: str - confirmed: bool - height: int | None = None - fee: int | None = None - - -def tx_watch_scripthash(tx: Transaction) -> str | None: - """Return the scripthash of the first spendable output, used to subscribe - for confirmation notifications.""" - for out in tx.vout: - if out.scriptPubKey.type != "nulldata": - return scripthash_from_scriptpubkey(bytes.fromhex(out.scriptPubKey.hex)) - return None - - -class TransactionTracker: - """ - Subscribes to a Bitcoin transaction via Electrum and calls a callback on - each status change (unconfirmed → confirmed). Stops automatically once - the transaction is confirmed or ``is_active()`` returns ``False``. - Per-connection queues can be attached via :meth:`register_queue` for - consumers (e.g. websockets) that want events for this transaction. - - Args: - url: Electrum server URL (e.g. ``ssl://electrum.blockstream.info:50002``). - """ - - def __init__(self, url: str) -> None: - self.url = url - self._queues: list[asyncio.Queue[OnchainTxEvent]] = [] - - def register_queue(self, queue: asyncio.Queue[OnchainTxEvent]) -> None: - """Register a per-connection queue to receive events for this tx.""" - self._queues.append(queue) - - def unregister_queue(self, queue: asyncio.Queue[OnchainTxEvent]) -> None: - """Deregister a per-connection queue.""" - if queue in self._queues: - self._queues.remove(queue) - - def has_queues(self) -> bool: - return bool(self._queues) - - async def track( - self, - txid: str, - callback: Callable[[OnchainTxEvent], Coroutine[Any, Any, None]], - is_active: Callable[[], bool], - ) -> None: - while is_active(): - try: - confirmed = await self._track_once(txid, callback, is_active) - if confirmed: - return - except asyncio.CancelledError: - raise - except Exception as exc: - if not is_active(): - return - logger.warning( - f"TransactionTracker {txid[:8]}: {exc!s}, retrying in 5s" - ) - await asyncio.sleep(5) - - async def _track_once( - self, - txid: str, - callback: Callable[[OnchainTxEvent], Coroutine[Any, Any, None]], - is_active: Callable[[], bool], - ) -> bool: - """One connection attempt; returns True if the tx is confirmed.""" - async with ElectrumClient(self.url) as client: - try: - raw = await client.get_transaction(txid) - except ElectrumError as exc: - logger.warning(f"TransactionTracker {txid[:8]}: {exc!s}") - await asyncio.sleep(10) - return False - - scripthash = tx_watch_scripthash(parse_raw_tx(raw)) - confirmed_event = asyncio.Event() - - async def on_change( - params: list[Any], - _sh: str | None = scripthash, - _done: asyncio.Event = confirmed_event, - ) -> None: - if params and params[0] == _sh: - ev = await self._fetch_status(client, txid, _sh) - await self._dispatch(ev, callback) - if ev.confirmed: - _done.set() - - if scripthash: - await client.subscribe_scripthash(scripthash, on_change) - - event = await self._fetch_status(client, txid, scripthash) - await self._dispatch(event, callback) - if event.confirmed: - return True - - while is_active() and not confirmed_event.is_set(): - try: - await asyncio.wait_for(client.closed.wait(), timeout=30) - break # connection closed; reconnect - except asyncio.TimeoutError: - pass - return confirmed_event.is_set() - - async def _dispatch( - self, - event: OnchainTxEvent, - callback: Callable[[OnchainTxEvent], Coroutine[Any, Any, None]], - ) -> None: - for q in list(self._queues): - q.put_nowait(event) - await callback(event) - - @staticmethod - async def _fetch_status( - client: ElectrumClient, txid: str, scripthash: str | None - ) -> OnchainTxEvent: - if scripthash: - try: - for entry in await client.get_history(scripthash): - if entry.tx_hash == txid: - return OnchainTxEvent( - txid=txid, - confirmed=entry.height > 0, - height=entry.height if entry.height > 0 else None, - fee=entry.fee, - ) - except ElectrumError: - try: - for m in await client.get_mempool(scripthash): - if m.tx_hash == txid: - return OnchainTxEvent(txid=txid, confirmed=False, fee=m.fee) - return OnchainTxEvent(txid=txid, confirmed=True) - except ElectrumError: - pass - return OnchainTxEvent(txid=txid, confirmed=False) - - -# --------------------------------------------------------------------------- -# Block tracking -# --------------------------------------------------------------------------- - - -class BlockTracker: - """ - Subscribes to new block headers via Electrum and dispatches them to - registered queues. Per-connection queues can be attached via - :meth:`register_queue`. Reconnects automatically on failure. - - Args: - url: Electrum server URL (e.g. ``ssl://electrum.blockstream.info:50002``). - """ - - def __init__(self, url: str) -> None: - self.url = url - self._queues: list[asyncio.Queue[BlockInfo]] = [] - - def register_queue(self, queue: "asyncio.Queue[BlockInfo]") -> None: - """Register a per-connection queue to receive new block events.""" - self._queues.append(queue) - - def unregister_queue(self, queue: "asyncio.Queue[BlockInfo]") -> None: - """Deregister a per-connection queue.""" - if queue in self._queues: - self._queues.remove(queue) - - def has_queues(self) -> bool: - return bool(self._queues) - - async def run( - self, - callback: Callable[[BlockInfo], Coroutine[Any, Any, None]], - is_active: Callable[[], bool], - ) -> None: - while is_active(): - try: - await self._run_once(callback, is_active) - except asyncio.CancelledError: - raise - except Exception as exc: - if not is_active(): - return - logger.warning(f"BlockTracker: {exc!s}, retrying in 5s") - await asyncio.sleep(5) - - async def _run_once( - self, - callback: Callable[[BlockInfo], Coroutine[Any, Any, None]], - is_active: Callable[[], bool], - ) -> None: - async with ElectrumClient(self.url) as client: - - async def on_header(params: list[Any]) -> None: - h = params[0] - event = parse_block_header(h["hex"], h["height"]) - await self._dispatch(event, callback) - - tip = await client.subscribe_headers(on_header) - await self._dispatch(parse_block_header(tip.hex, tip.height), callback) - - while is_active(): - try: - await asyncio.wait_for(client.closed.wait(), timeout=30) - break # connection closed; reconnect - except asyncio.TimeoutError: - pass - - async def _dispatch( - self, - event: BlockInfo, - callback: Callable[[BlockInfo], Coroutine[Any, Any, None]], - ) -> None: - for q in list(self._queues): - q.put_nowait(event) - await callback(event) diff --git a/lnbits/utils/exchange_rates.py b/lnbits/utils/exchange_rates.py index 4ecd06ec0..7cbd7f01b 100644 --- a/lnbits/utils/exchange_rates.py +++ b/lnbits/utils/exchange_rates.py @@ -289,32 +289,7 @@ async def btc_rates(currency: str) -> list[tuple[str, float]]: return apply_trimmed_mean_filter(all_rates) -async def btc_price_from_aggregator(currency: str) -> float | None: - url = settings.lnbits_price_aggregator_url.rstrip("/") - try: - headers = {"User-Agent": settings.user_agent} - async with httpx.AsyncClient(headers=headers) as client: - r = await client.get(f"{url}/rate/{currency.upper()}", timeout=3) - r.raise_for_status() - data = r.json() - median = data.get("rates", {}).get("median") - if median: - return float(median) - except Exception as e: - logger.warning(f"Failed to fetch price from aggregator {url}: {e}") - return None - - async def btc_price(currency: str) -> float: - if ( - settings.lnbits_price_aggregator_enabled - and settings.lnbits_price_aggregator_url - ): - price = await btc_price_from_aggregator(currency) - if price: - return price - logger.warning("Price aggregator failed, falling back to exchange providers.") - rates = await btc_rates(currency) if not rates: logger.warning("Could not fetch any Bitcoin price.") diff --git a/lnbits/utils/logger.py b/lnbits/utils/logger.py index 06c80822d..0d78e4414 100644 --- a/lnbits/utils/logger.py +++ b/lnbits/utils/logger.py @@ -41,16 +41,19 @@ def log_server_info(): def initialize_server_websocket_logger() -> Callable: super_user_hash = sha256(settings.super_user.encode("utf-8")).hexdigest() + serverlog_queue: asyncio.Queue = asyncio.Queue() + + async def update_websocket_serverlog(): + while settings.lnbits_running: + msg = await serverlog_queue.get() + await websocket_updater(super_user_hash, msg) + logger.add( lambda msg: serverlog_queue.put_nowait(msg), format=Formatter().format, ) - async def update_websocket_serverlog(): - msg = await serverlog_queue.get() - await websocket_updater(super_user_hash, msg) - return update_websocket_serverlog diff --git a/lnbits/wallets/__init__.py b/lnbits/wallets/__init__.py index 2f2384c7d..f6e31dcd0 100644 --- a/lnbits/wallets/__init__.py +++ b/lnbits/wallets/__init__.py @@ -6,7 +6,6 @@ from lnbits.settings import settings from lnbits.wallets.base import Feature, Wallet from .alby import AlbyWallet -from .bark import BarkWallet from .blink import BlinkWallet from .boltz import BoltzWallet from .breez import BreezSdkWallet @@ -58,7 +57,6 @@ funding_source: Wallet = fake_wallet __all__ = [ "AlbyWallet", - "BarkWallet", "BlinkWallet", "BoltzWallet", "BreezLiquidSdkWallet", diff --git a/lnbits/wallets/alby.py b/lnbits/wallets/alby.py index cfd8d6c03..bc7822c0b 100644 --- a/lnbits/wallets/alby.py +++ b/lnbits/wallets/alby.py @@ -16,7 +16,6 @@ from .base import ( PaymentStatus, StatusResponse, Wallet, - payment_request_was_rejected, ) @@ -147,21 +146,6 @@ class AlbyWallet(Wallet): return PaymentResponse( ok=True, checking_id=checking_id, fee_msat=fee_msat, preimage=preimage ) - except httpx.HTTPStatusError as exc: - logger.warning(exc) - rejected = payment_request_was_rejected(exc.response.status_code) - try: - response_message = exc.response.json().get("message", exc.response.text) - except Exception: - response_message = exc.response.text - return PaymentResponse( - ok=False if rejected else None, - error_message=( - response_message - if rejected - else f"Unable to connect to {self.endpoint}." - ), - ) except KeyError as exc: logger.warning(exc) return PaymentResponse( @@ -201,7 +185,7 @@ class AlbyWallet(Wallet): # - https://api.getalby.com/invoices/incoming # - https://api.getalby.com/invoices/outgoing return PaymentStatus( - statuses.get(data.get("state")), fee_msat=None, preimage=None + statuses[data.get("state")], fee_msat=None, preimage=None ) except Exception as e: logger.error(f"Error getting invoice status: {e}") diff --git a/lnbits/wallets/bark.py b/lnbits/wallets/bark.py deleted file mode 100644 index 1b6291be5..000000000 --- a/lnbits/wallets/bark.py +++ /dev/null @@ -1,575 +0,0 @@ -import asyncio -import json -from collections.abc import AsyncGenerator -from typing import Any -from urllib.parse import quote, urlencode, urlsplit, urlunsplit - -import httpx -from bolt11 import decode as bolt11_decode -from loguru import logger -from websockets import connect - -from lnbits.helpers import normalize_endpoint -from lnbits.settings import settings - -from .base import ( - InvoiceResponse, - PaymentFailedStatus, - PaymentPendingStatus, - PaymentResponse, - PaymentStatus, - PaymentSuccessStatus, - StatusResponse, - Wallet, - payment_request_was_rejected, -) - - -class BarkError(Exception): - pass - - -class BarkHTTPError(BarkError): - def __init__(self, message: str, status_code: int): - super().__init__(message) - self.status_code = status_code - - -class BarkWallet(Wallet): - """https://second.tech/docs/barkd""" - - def __init__(self): - if not settings.bark_api_endpoint: - raise ValueError("cannot initialize BarkWallet: missing bark_api_endpoint") - if not settings.bark_api_token: - raise ValueError("cannot initialize BarkWallet: missing bark_api_token") - - super().__init__() - self.endpoint = normalize_endpoint(settings.bark_api_endpoint) - parsed_endpoint = urlsplit(self.endpoint) - ws_scheme = "wss" if parsed_endpoint.scheme == "https" else "ws" - self.ws_endpoint = urlunsplit( - ( - ws_scheme, - parsed_endpoint.netloc, - "/api/v1/notifications/ws", - "", - "", - ) - ) - self.headers = { - "Authorization": f"Bearer {settings.bark_api_token}", - "Accept": "application/json", - "Content-Type": "application/json", - "User-Agent": settings.user_agent, - } - self.client = httpx.AsyncClient(base_url=self.endpoint, headers=self.headers) - self.pending_payments: dict[str, str] = {} - self.outgoing_payment_waiters: dict[str, asyncio.Future[PaymentStatus]] = {} - self.notified_paid_invoice: str | None = None - - async def cleanup(self): - try: - await self.client.aclose() - except RuntimeError as e: - logger.warning(f"Error closing wallet connection: {e}") - - async def status(self) -> StatusResponse: - try: - connected = await self._request_json( - "GET", "/api/v1/wallet/connected", timeout=10 - ) - if not connected.get("connected"): - return StatusResponse("Bark wallet is not connected to Ark server.", 0) - - data = await self._request_json("GET", "/api/v1/wallet/balance", timeout=10) - if "spendable_sat" not in data: - return StatusResponse("Server error: 'missing required fields'", 0) - - return StatusResponse(None, int(data["spendable_sat"]) * 1000) - except BarkError as exc: - return StatusResponse(str(exc), 0) - except Exception as exc: - logger.warning(exc) - return StatusResponse(f"Unable to connect to {self.endpoint}.", 0) - - async def create_invoice( - self, - amount: int, - memo: str | None = None, - description_hash: bytes | None = None, - unhashed_description: bytes | None = None, - **_, - ) -> InvoiceResponse: - if description_hash or unhashed_description: - return InvoiceResponse( - ok=False, - error_message="Bark does not support description-hash invoices.", - ) - - payload: dict[str, Any] = {"amount_sat": int(amount)} - if memo is not None: - payload["description"] = memo - - try: - data = await self._request_json( - "POST", - "/api/v1/lightning/receives/invoice", - json=payload, - timeout=40, - ) - payment_request = data["invoice"] - checking_id = bolt11_decode(payment_request).payment_hash - - return InvoiceResponse( - ok=True, - checking_id=checking_id, - payment_request=payment_request, - ) - except KeyError as exc: - logger.warning(exc) - return InvoiceResponse( - ok=False, error_message="Server error: 'missing required fields'" - ) - except BarkError as exc: - return InvoiceResponse(ok=False, error_message=str(exc)) - except Exception as exc: - logger.warning(exc) - return InvoiceResponse( - ok=False, error_message=f"Unable to connect to {self.endpoint}." - ) - - async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: - decoded = self._decode_invoice_for_payment(bolt11) - if isinstance(decoded, PaymentResponse): - return decoded - - checking_id, amount_sat = decoded - fee_response = await self._check_fee_limit( - checking_id, amount_sat, fee_limit_msat - ) - if fee_response: - return fee_response - - return await self._send_payment(bolt11, checking_id) - - async def get_invoice_status(self, checking_id: str) -> PaymentStatus: - try: - identifier = quote(checking_id, safe="") - data = await self._request_json( - "GET", f"/api/v1/lightning/receives/{identifier}" - ) - except BarkHTTPError as exc: - notification_status = self._consume_paid_invoice_notification(checking_id) - if notification_status: - return notification_status - if exc.status_code == 404: - return PaymentFailedStatus() - logger.warning(exc) - return PaymentPendingStatus() - except Exception as exc: - logger.warning(exc) - notification_status = self._consume_paid_invoice_notification(checking_id) - if notification_status: - return notification_status - return PaymentPendingStatus() - - return self._invoice_status_from_response(checking_id, data) - - async def get_payment_status(self, checking_id: str) -> PaymentStatus: - try: - data = await self._request_json("GET", "/api/v1/history") - if not isinstance(data, list): - return PaymentPendingStatus() - - for movement in data: - if self._movement_matches_payment_hash(movement, checking_id): - return self._movement_to_payment_status(movement) - except Exception as exc: - logger.warning(exc) - - return PaymentPendingStatus() - - async def paid_invoices_stream(self) -> AsyncGenerator[str, None]: - while settings.lnbits_running: - try: - async for checking_id in self._listen_paid_invoices(): - yield checking_id - except asyncio.CancelledError: - raise - except Exception as exc: - logger.warning( - "Bark invoices stream unavailable " - f"({type(exc).__name__}); retrying in 5 seconds." - ) - await asyncio.sleep(5) - - async def _listen_paid_invoices(self) -> AsyncGenerator[str, None]: - ticket = await self._request_json( - "GET", "/api/v1/notifications/ws/ticket", timeout=10 - ) - if not isinstance(ticket, str) or not ticket: - raise BarkError("Server error: 'invalid websocket ticket'") - - ws_url = f"{self.ws_endpoint}?{urlencode({'ticket': ticket})}" - async with connect(ws_url) as ws: - logger.info("Connected to Bark invoices stream.") - - while settings.lnbits_running: - notification = self._parse_notification(await ws.recv()) - if not notification: - continue - if notification.get("type") == "channel-lagging": - logger.warning( - "Bark invoice notifications were lost; pending payments " - "will be reconciled by the scheduled check." - ) - continue - - self._notify_outgoing_payment(notification) - checking_id = self._incoming_payment_hash(notification) - if checking_id: - self.notified_paid_invoice = checking_id - yield checking_id - - def _parse_notification(self, message: str | bytes) -> dict[str, Any] | None: - try: - notification = json.loads(message) - except (json.JSONDecodeError, TypeError): - logger.warning("Invalid message from Bark invoices stream.") - return None - return notification if isinstance(notification, dict) else None - - def _incoming_payment_hash(self, notification: dict[str, Any]) -> str | None: - if notification.get("type") not in { - "movement-created", - "movement-updated", - }: - return None - - movement = notification.get("movement") - if not isinstance(movement, dict) or movement.get("status") != "successful": - return None - - for destination in movement.get("received_on") or []: - if not isinstance(destination, dict): - continue - method = destination.get("destination") - if not isinstance(method, dict) or method.get("type") != "invoice": - continue - invoice = method.get("value") - if not isinstance(invoice, str): - continue - try: - return bolt11_decode(invoice).payment_hash - except Exception as exc: - logger.debug(f"Unable to decode Bark notification invoice: {exc}") - return None - - def _consume_paid_invoice_notification( - self, checking_id: str, preimage: str | None = None - ) -> PaymentStatus | None: - if checking_id != self.notified_paid_invoice: - return None - self.notified_paid_invoice = None - return PaymentSuccessStatus(preimage=preimage) - - def _invoice_status_from_response( - self, checking_id: str, data: Any - ) -> PaymentStatus: - preimage = data.get("payment_preimage") if isinstance(data, dict) else None - notification_status = self._consume_paid_invoice_notification( - checking_id, preimage - ) - if notification_status: - return notification_status - if not isinstance(data, dict): - return PaymentPendingStatus() - if data.get("state") == "settled" or data.get("settled_at"): - return PaymentSuccessStatus(preimage=preimage) - if not data.get("finished_at"): - return PaymentPendingStatus() - if data.get("preimage_revealed_at"): - return PaymentSuccessStatus(preimage=preimage) - return PaymentFailedStatus() - - def _decode_invoice_for_payment( - self, bolt11: str - ) -> tuple[str, int] | PaymentResponse: - try: - invoice = bolt11_decode(bolt11) - checking_id = invoice.payment_hash - except Exception as exc: - logger.warning(exc) - return PaymentResponse(ok=False, error_message=f"Invalid invoice: {exc!s}") - - if not invoice.amount_msat or invoice.amount_msat <= 0: - return PaymentResponse( - ok=False, - checking_id=checking_id, - error_message="Bark 0 amount invoice not supported.", - ) - - amount_sat = (int(invoice.amount_msat) + 999) // 1000 - return checking_id, amount_sat - - async def _check_fee_limit( - self, checking_id: str, amount_sat: int, fee_limit_msat: int - ) -> PaymentResponse | None: - try: - fee_estimate = await self._request_json( - "GET", - "/api/v1/fees/lightning/pay", - params={"amount_sat": amount_sat}, - timeout=30, - ) - fee_msat = int(fee_estimate["fee_sat"]) * 1000 - if fee_msat > fee_limit_msat: - return PaymentResponse( - ok=False, - checking_id=checking_id, - fee_msat=fee_msat, - error_message=( - f"fee of {fee_msat} msat exceeds limit of " - f"{fee_limit_msat} msat" - ), - ) - except KeyError as exc: - logger.warning(exc) - return PaymentResponse( - ok=False, - checking_id=checking_id, - error_message="Server error: 'missing required fields'", - ) - except BarkError as exc: - return PaymentResponse( - ok=False, checking_id=checking_id, error_message=str(exc) - ) - return None - - async def _send_payment(self, bolt11: str, checking_id: str) -> PaymentResponse: - waiter = asyncio.get_running_loop().create_future() - self.outgoing_payment_waiters[checking_id] = waiter - try: - initiation_error = await self._initiate_payment(bolt11, checking_id) - if initiation_error is not None: - return initiation_error - - self.pending_payments[checking_id] = bolt11 - response = await self._payment_response_from_status(checking_id) - if not response.pending: - return response - - wait_seconds = max( - 0, settings.lnbits_funding_source_pay_invoice_wait_seconds - 1 - ) - if not wait_seconds: - return response - try: - status = await asyncio.wait_for(waiter, timeout=wait_seconds) - except TimeoutError: - return response - return self._payment_response(checking_id, status) - finally: - current_waiter = self.outgoing_payment_waiters.pop(checking_id, None) - if current_waiter and not current_waiter.done(): - current_waiter.cancel() - - async def _initiate_payment( - self, bolt11: str, checking_id: str - ) -> PaymentResponse | None: - try: - r = await self.client.post( - "/api/v1/lightning/pay", - json={"destination": bolt11}, - timeout=40, - ) - r.raise_for_status() - data = r.json() - if not isinstance(data, dict) or not isinstance(data.get("message"), str): - return self._pending_payment_response( - bolt11, - checking_id, - "Server error: 'invalid payment response'", - ) - except httpx.TimeoutException: - message = f"Timeout connecting to {self.endpoint}. keep pending..." - logger.warning(message) - return self._pending_payment_response(bolt11, checking_id, message) - except httpx.HTTPStatusError as exc: - if payment_request_was_rejected(exc.response.status_code): - return PaymentResponse( - ok=False, - checking_id=checking_id, - error_message=self._http_error_message(exc.response), - ) - message = self._http_error_message(exc.response) - logger.warning(message) - return self._pending_payment_response(bolt11, checking_id, message) - except httpx.RequestError as exc: - message = f"Unable to connect to {self.endpoint}. keep pending..." - logger.warning(message) - logger.warning(exc) - return self._pending_payment_response(bolt11, checking_id, message) - except json.JSONDecodeError: - return self._pending_payment_response( - bolt11, - checking_id, - "Server error: 'invalid json response'", - ) - except Exception as exc: - message = f"Unable to connect to {self.endpoint}. keep pending..." - logger.warning(exc) - return self._pending_payment_response(bolt11, checking_id, message) - return None - - def _pending_payment_response( - self, bolt11: str, checking_id: str, error_message: str - ) -> PaymentResponse: - self.pending_payments[checking_id] = bolt11 - return PaymentResponse( - ok=None, - checking_id=checking_id, - error_message=error_message, - ) - - async def _payment_response_from_status(self, checking_id: str) -> PaymentResponse: - status = await self.get_payment_status(checking_id) - return self._payment_response(checking_id, status) - - def _payment_response( - self, checking_id: str, status: PaymentStatus - ) -> PaymentResponse: - if status.success: - return PaymentResponse( - ok=True, - checking_id=checking_id, - fee_msat=status.fee_msat, - preimage=status.preimage, - ) - if status.failed: - return PaymentResponse(ok=False, checking_id=checking_id) - return PaymentResponse(ok=None, checking_id=checking_id) - - def _notify_outgoing_payment(self, notification: dict[str, Any]) -> None: - if notification.get("type") not in { - "movement-created", - "movement-updated", - }: - return - - movement = notification.get("movement") - if not isinstance(movement, dict): - return - status = self._movement_to_payment_status(movement) - if status.pending: - return - - for destination in movement.get("sent_to") or []: - if not isinstance(destination, dict): - continue - method = destination.get("destination") - if not isinstance(method, dict) or method.get("type") != "invoice": - continue - invoice = method.get("value") - if not isinstance(invoice, str): - continue - try: - checking_id = bolt11_decode(invoice).payment_hash - except Exception as exc: - logger.debug(f"Unable to decode Bark notification invoice: {exc}") - continue - - waiter = self.outgoing_payment_waiters.get(checking_id) - if waiter and not waiter.done(): - waiter.set_result(status) - return - - async def _request_json(self, method: str, path: str, **kwargs) -> Any: - try: - r = await self.client.request(method, path, **kwargs) - r.raise_for_status() - return r.json() - except httpx.HTTPStatusError as exc: - raise BarkHTTPError( - self._http_error_message(exc.response), exc.response.status_code - ) from exc - except json.JSONDecodeError as exc: - raise BarkError("Server error: 'invalid json response'") from exc - except httpx.RequestError as exc: - raise BarkError(f"Unable to connect to {self.endpoint}.") from exc - - def _http_error_message(self, response: httpx.Response) -> str: - try: - data = response.json() - except json.JSONDecodeError: - return response.text or f"HTTP {response.status_code}" - - if isinstance(data, dict): - for key in ("message", "detail", "error"): - if key in data: - return f"Server error: '{data[key]}'" - return response.text or f"HTTP {response.status_code}" - - def _movement_matches_payment_hash(self, movement: Any, checking_id: str) -> bool: - if not isinstance(movement, dict): - return False - - metadata_hash = self._find_value( - movement.get("metadata"), {"payment_hash", "paymentHash"} - ) - if metadata_hash == checking_id: - return True - - for destination in movement.get("sent_to") or []: - if not isinstance(destination, dict): - continue - method = destination.get("destination") - if not isinstance(method, dict) or method.get("type") != "invoice": - continue - - invoice = method.get("value") - if not isinstance(invoice, str): - continue - - if invoice == self.pending_payments.get(checking_id): - return True - - try: - if bolt11_decode(invoice).payment_hash == checking_id: - return True - except Exception as exc: - logger.debug(f"Unable to decode Bark history invoice: {exc}") - continue - - return False - - def _movement_to_payment_status(self, movement: dict[str, Any]) -> PaymentStatus: - status = movement.get("status") - if status == "successful": - fee_sat = movement.get("offchain_fee_sat") - fee_msat = int(fee_sat) * 1000 if fee_sat is not None else None - preimage = self._find_value( - movement.get("metadata"), - {"preimage", "payment_preimage", "paymentPreimage"}, - ) - return PaymentSuccessStatus(fee_msat=fee_msat, preimage=preimage) - if status in {"failed", "canceled"}: - return PaymentFailedStatus() - return PaymentPendingStatus() - - def _find_value(self, data: Any, keys: set[str]) -> str | None: - if isinstance(data, dict): - for key, value in data.items(): - if key in keys and isinstance(value, str): - return value - for value in data.values(): - found = self._find_value(value, keys) - if found: - return found - if isinstance(data, list): - for value in data: - found = self._find_value(value, keys) - if found: - return found - return None diff --git a/lnbits/wallets/base.py b/lnbits/wallets/base.py index d9f4ef025..4d1d81b95 100644 --- a/lnbits/wallets/base.py +++ b/lnbits/wallets/base.py @@ -15,18 +15,9 @@ if TYPE_CHECKING: from lnbits.nodes.base import Node -def payment_request_was_rejected(status_code: int) -> bool: - """Return whether HTTP rejected the request before payment dispatch.""" - # Generic 400 and 422 responses are provider-specific. They can report an - # existing payment, so adapters must not treat them as terminal based only - # on the status code. Timeouts, conflicts and rate limits are also ambiguous. - return status_code in {401, 403, 404, 405} - - class Feature(Enum): nodemanager = "nodemanager" holdinvoice = "holdinvoice" - descriptionhash = "descriptionhash" # bolt12 = "bolt12" diff --git a/lnbits/wallets/blink.py b/lnbits/wallets/blink.py index b2f05e06d..edc7d1c16 100644 --- a/lnbits/wallets/blink.py +++ b/lnbits/wallets/blink.py @@ -164,82 +164,9 @@ class BlinkWallet(Wallet): ok=False, error_message=f"Unable to connect to {self.endpoint}." ) - async def _fee_probe(self, bolt11: str) -> tuple[int | None, str | None]: - """ - Probe the route for the fee of an amount lightning invoice. - - Probing caches the route on the Blink backend so that the subsequent - payment settles with the exact fee instead of Blink's max fee reserve. - Only invoices that carry an amount can be probed here, since the - pay_invoice interface does not provide a separate amount for - zero-amount invoices. - - Returns a tuple of (fee_sat, error_message). On success the fee in - satoshis is returned; on failure an error message is returned. - """ - probe_input = { - "paymentRequest": bolt11, - "walletId": self.wallet_id, - } - data = {"query": q.fee_probe_query, "variables": {"input": probe_input}} - response = await self._graphql_query(data) - - errors = response.get("errors") or [] - if len(errors) > 0: - return None, errors[0].get("message") or "Fee probe failed." - - result = (response.get("data") or {}).get("lnInvoiceFeeProbe") or {} - - errors = result.get("errors") or [] - if len(errors) > 0: - return None, errors[0].get("message") or "Fee probe failed." - - fee_sat = result.get("amount") - if fee_sat is None: - return None, "Server error: 'missing fee probe amount'" - - return fee_sat, None - async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: # https://dev.blink.sv/api/btc-ln-send - - invoice = bolt11_lib.decode(bolt11) - - # Only amount invoices can be probed: lnInvoiceFeeProbe takes no amount, - # and zero-amount invoices have no amount to probe with (pay_invoice - # does not receive a separate amount). Zero-amount invoices skip the - # probe and fall back to the send-without-probe behaviour. - try: - if invoice.amount_msat: - fee_sat, probe_error = await self._fee_probe(bolt11) - if probe_error is not None: - if not settings.blink_send_without_probe: - logger.info(f"Fee probe failed for invoice {bolt11}") - return PaymentResponse(ok=False, error_message=probe_error) - logger.warning( - f"Fee probe failed ('{probe_error}'), " - "sending payment without probe." - ) - elif fee_sat is not None and fee_sat * 1000 > fee_limit_msat: - error_message = ( - f"fee of {fee_sat * 1000} msat exceeds " - f"limit of {fee_limit_msat} msat" - ) - return PaymentResponse(ok=False, error_message=error_message) - elif not settings.blink_send_without_probe: - logger.info(f"Cannot probe zero-amount invoice {bolt11}") - return PaymentResponse( - ok=False, - error_message="Cannot probe fee for zero-amount invoice.", - ) - except Exception as exc: - if not settings.blink_send_without_probe: - logger.info(f"Failed to probe fee for invoice {bolt11}") - logger.warning(exc) - return PaymentResponse( - ok=False, error_message=f"Unable to connect to {self.endpoint}." - ) - logger.warning(f"Fee probe errored ('{exc}'), sending without probe.") + # Future: add check fee estimate is < fee_limit_msat before paying invoice payment_variables = { "input": { @@ -252,26 +179,22 @@ class BlinkWallet(Wallet): try: response = await self._graphql_query(data) - payment_result = response.get("data", {}).get("lnInvoicePaymentSend", {}) - errors = payment_result.get("errors", {}) + errors = ( + response.get("data", {}) + .get("lnInvoicePaymentSend", {}) + .get("errors", {}) + ) if len(errors) > 0: error_message = errors[0].get("message") - status = payment_result.get("status") - return PaymentResponse( - ok=False if status in {"FAILURE", "FAILED"} else None, - error_message=error_message, - ) + return PaymentResponse(ok=False, error_message=error_message) - checking_id = invoice.payment_hash + checking_id = bolt11_lib.decode(bolt11).payment_hash payment_status = await self.get_payment_status(checking_id) fee_msat = payment_status.fee_msat preimage = payment_status.preimage return PaymentResponse( - ok=payment_status.paid, - checking_id=checking_id, - fee_msat=fee_msat, - preimage=preimage, + ok=True, checking_id=checking_id, fee_msat=fee_msat, preimage=preimage ) except Exception as exc: logger.info(f"Failed to pay invoice {bolt11}") @@ -442,7 +365,6 @@ class BlinkGrafqlQueries(BaseModel): balance_query: str invoice_query: str payment_query: str - fee_probe_query: str status_query: str wallet_query: str tx_query: str @@ -491,16 +413,6 @@ q = BlinkGrafqlQueries( } } """, - fee_probe_query=""" - mutation LnInvoiceFeeProbe($input: LnInvoiceFeeProbeInput!) { - lnInvoiceFeeProbe(input: $input) { - amount - errors { - message - } - } - } - """, status_query=""" query InvoiceByPaymentHash($walletId: WalletId!, $paymentHash: PaymentHash!) { me { diff --git a/lnbits/wallets/boltz.py b/lnbits/wallets/boltz.py index 050021a6c..c6473f181 100644 --- a/lnbits/wallets/boltz.py +++ b/lnbits/wallets/boltz.py @@ -2,8 +2,6 @@ import asyncio from collections.abc import AsyncGenerator from bolt11.decode import decode -from bolt11.types import Bolt11 -from grpc import StatusCode from grpc.aio import AioRpcError from loguru import logger @@ -126,12 +124,26 @@ class BoltzWallet(Wallet): ) async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: - prepared = await self._prepare_payment(bolt11, fee_limit_msat) - if isinstance(prepared, PaymentResponse): - return prepared - pair, invoice = prepared + pair = boltzrpc_pb2.Pair(**{"from": boltzrpc_pb2.LBTC}) try: + pair_info: boltzrpc_pb2.PairInfo + pair_request = boltzrpc_pb2.GetPairInfoRequest( + type=boltzrpc_pb2.SUBMARINE, pair=pair + ) + pair_info = await self.rpc.GetPairInfo(pair_request, metadata=self.metadata) + invoice = decode(bolt11) + + if not invoice.amount_msat: + raise ValueError("amountless invoice") + + service_fee: float = invoice.amount_msat * pair_info.fees.percentage / 100 + estimate = int(service_fee + pair_info.fees.miner_fees * 1000) + if estimate > fee_limit_msat: + error = f"fee of {estimate} msat exceeds limit of {fee_limit_msat} msat" + + return PaymentResponse(ok=False, error_message=error) + request = boltzrpc_pb2.CreateSwapRequest( invoice=bolt11, pair=pair, @@ -153,13 +165,8 @@ class BoltzWallet(Wallet): ) return PaymentResponse(ok=True, checking_id=invoice.payment_hash) except AioRpcError as exc: - return await self._resolve_create_swap_error(invoice, exc) - except Exception as exc: logger.warning(exc) - return PaymentResponse( - checking_id=invoice.payment_hash, - error_message=str(exc), - ) + return PaymentResponse(ok=False, error_message=exc.details()) try: info_request = boltzrpc_pb2.GetSwapInfoRequest(id=response.id) @@ -179,87 +186,14 @@ class BoltzWallet(Wallet): fee_msat=fee_msat, preimage=info.swap.preimage, ) - if info.swap.state in { - boltzrpc_pb2.ERROR, - boltzrpc_pb2.SERVER_ERROR, - boltzrpc_pb2.REFUNDED, - boltzrpc_pb2.ABANDONED, - }: - return PaymentResponse( - ok=False, - checking_id=invoice.payment_hash, - error_message=info.swap.error or "swap failed", - ) - return PaymentResponse(error_message="stream stopped unexpectedly") + elif info.swap.error != "": + return PaymentResponse(ok=False, error_message=info.swap.error) + return PaymentResponse( + ok=False, error_message="stream stopped unexpectedly" + ) except AioRpcError as exc: logger.warning(exc) - return PaymentResponse(error_message=exc.details()) - - async def _resolve_create_swap_error( - self, invoice: Bolt11, exc: AioRpcError - ) -> PaymentResponse: - logger.warning(exc) - if _is_pre_dispatch_create_swap_error(exc): - status: PaymentStatus = PaymentFailedStatus() - else: - try: - status = await self.get_payment_status(invoice.payment_hash) - except Exception as status_exc: - logger.warning(status_exc) - status = PaymentPendingStatus() - - return PaymentResponse( - ok=status.paid, - checking_id=invoice.payment_hash, - fee_msat=status.fee_msat, - preimage=status.preimage, - error_message=exc.details(), - ) - - async def _prepare_payment( - self, bolt11: str, fee_limit_msat: int - ) -> tuple[boltzrpc_pb2.Pair, Bolt11] | PaymentResponse: - pair = boltzrpc_pb2.Pair(**{"from": boltzrpc_pb2.LBTC}) - try: - invoice = decode(bolt11) - except Exception as exc: - logger.warning(exc) - return PaymentResponse( - ok=False, - error_message=f"invalid bolt11 invoice: {exc}", - ) - - if not invoice.amount_msat: - return PaymentResponse( - ok=False, - checking_id=invoice.payment_hash, - error_message="amountless invoice", - ) - - try: - pair_info: boltzrpc_pb2.PairInfo - pair_request = boltzrpc_pb2.GetPairInfoRequest( - type=boltzrpc_pb2.SUBMARINE, pair=pair - ) - pair_info = await self.rpc.GetPairInfo(pair_request, metadata=self.metadata) - except Exception as exc: - logger.warning(exc) - return PaymentResponse( - ok=False, - checking_id=invoice.payment_hash, - error_message=f"unable to get swap terms: {exc}", - ) - - service_fee: float = invoice.amount_msat * pair_info.fees.percentage / 100 - estimate = int(service_fee + pair_info.fees.miner_fees * 1000) - if estimate > fee_limit_msat: - error = f"fee of {estimate} msat exceeds limit of {fee_limit_msat} msat" - return PaymentResponse( - ok=False, - checking_id=invoice.payment_hash, - error_message=error, - ) - return pair, invoice + return PaymentResponse(ok=False, error_message=exc.details()) async def get_invoice_status(self, checking_id: str) -> PaymentStatus: try: @@ -283,14 +217,10 @@ class BoltzWallet(Wallet): fee_msat=fee_msat, preimage=swap.preimage, ) - if swap.state in { - boltzrpc_pb2.SwapState.ERROR, - boltzrpc_pb2.SwapState.SERVER_ERROR, - boltzrpc_pb2.SwapState.REFUNDED, - boltzrpc_pb2.SwapState.ABANDONED, - }: - return PaymentFailedStatus() - return PaymentPendingStatus() + elif swap.state == boltzrpc_pb2.SwapState.PENDING: + return PaymentPendingStatus() + + return PaymentFailedStatus() async def get_payment_status(self, checking_id: str) -> PaymentStatus: try: @@ -301,7 +231,7 @@ class BoltzWallet(Wallet): metadata=self.metadata, ) swap = response.swap - except (AioRpcError, ValueError) as exc: + except AioRpcError as exc: logger.warning(exc) return PaymentPendingStatus() if swap.state == boltzrpc_pb2.SwapState.SUCCESSFUL: @@ -313,14 +243,10 @@ class BoltzWallet(Wallet): fee_msat=fee_msat, preimage=swap.preimage, ) - if swap.state in { - boltzrpc_pb2.SwapState.ERROR, - boltzrpc_pb2.SwapState.SERVER_ERROR, - boltzrpc_pb2.SwapState.REFUNDED, - boltzrpc_pb2.SwapState.ABANDONED, - }: - return PaymentFailedStatus() - return PaymentPendingStatus() + elif swap.state == boltzrpc_pb2.SwapState.PENDING: + return PaymentPendingStatus() + + return PaymentFailedStatus() async def paid_invoices_stream(self) -> AsyncGenerator[str, None]: while settings.lnbits_running: @@ -426,23 +352,3 @@ class BoltzWallet(Wallet): except Exception as e: logger.error(f"❌ Failed to create Boltz wallet: {e}") - - -_PRE_DISPATCH_CREATE_SWAP_ERROR_CODES = { - StatusCode.INVALID_ARGUMENT, - StatusCode.PERMISSION_DENIED, - StatusCode.UNAUTHENTICATED, -} -_PRE_DISPATCH_CREATE_SWAP_ERROR_MESSAGES = ( - "boltz error: could not find route to pay invoice", -) - - -def _is_pre_dispatch_create_swap_error(exc: AioRpcError) -> bool: - if exc.code() in _PRE_DISPATCH_CREATE_SWAP_ERROR_CODES: - return True - - details = (exc.details() or "").lower() - return any( - message in details for message in _PRE_DISPATCH_CREATE_SWAP_ERROR_MESSAGES - ) diff --git a/lnbits/wallets/breez.py b/lnbits/wallets/breez.py index dd47e69f1..e32cb9b90 100644 --- a/lnbits/wallets/breez.py +++ b/lnbits/wallets/breez.py @@ -240,12 +240,6 @@ else: logger.info(ex) return PaymentResponse(error_message=f"exception while payment {exc!s}") - if payment.status == BreezPaymentStatus.FAILED: - return PaymentResponse( - ok=False, - checking_id=invoice.payment_hash, - error_message="payment failed", - ) if payment.status != BreezPaymentStatus.COMPLETE: return PaymentResponse(ok=None, error_message="payment is pending") diff --git a/lnbits/wallets/breez_liquid.py b/lnbits/wallets/breez_liquid.py index e9c192f0d..c2a649a90 100644 --- a/lnbits/wallets/breez_liquid.py +++ b/lnbits/wallets/breez_liquid.py @@ -173,44 +173,29 @@ else: async def pay_invoice( self, bolt11: str, fee_limit_msat: int ) -> PaymentResponse: - try: - invoice_data = bolt11_decode(bolt11) - except Exception as exc: - logger.warning(exc) - return PaymentResponse( - ok=False, - error_message=f"invalid bolt11 invoice: {exc}", - ) + invoice_data = bolt11_decode(bolt11) try: prepare_req = PrepareSendRequest(destination=bolt11) req = self.sdk_services.prepare_send_payment(prepare_req) - except Exception as exc: - logger.warning(exc) - return PaymentResponse( - ok=False, - checking_id=invoice_data.payment_hash, - error_message=f"unable to prepare payment: {exc}", + + fee_limit_sat = settings.breez_liquid_fee_offset_sat + int( + fee_limit_msat / 1000 ) - fee_limit_sat = settings.breez_liquid_fee_offset_sat + int( - fee_limit_msat / 1000 - ) + if req.fees_sat and req.fees_sat > fee_limit_sat: + return PaymentResponse( + ok=False, + error_message=( + f"fee of {req.fees_sat} sat exceeds limit of " + f"{fee_limit_sat} sat" + ), + ) - if req.fees_sat and req.fees_sat > fee_limit_sat: - return PaymentResponse( - ok=False, - checking_id=invoice_data.payment_hash, - error_message=( - f"fee of {req.fees_sat} sat exceeds limit of " - f"{fee_limit_sat} sat" - ), - ) - - try: send_response = self.sdk_services.send_payment( SendPaymentRequest(prepare_response=req) ) + except Exception as exc: logger.warning(exc) return PaymentResponse(error_message=f"Exception while payment: {exc}") @@ -221,14 +206,6 @@ else: fees = req.fees_sat * 1000 if req.fees_sat and req.fees_sat > 0 else 0 - if payment.status in {PaymentState.FAILED, PaymentState.TIMED_OUT}: - return PaymentResponse( - ok=False, - checking_id=checking_id, - fee_msat=fees, - error_message=f"payment {payment.status!s}", - ) - if payment.status != PaymentState.COMPLETE: return await self._wait_for_outgoing_payment(checking_id, fees, 10) @@ -285,10 +262,7 @@ else: fee_msat=int(payment.fees_sat * 1000), preimage=payment.details.preimage, ) - if payment.status in { - PaymentState.FAILED, - PaymentState.TIMED_OUT, - }: + if payment.status == PaymentState.FAILED: return PaymentFailedStatus() return PaymentPendingStatus() except Exception as exc: diff --git a/lnbits/wallets/cliche.py b/lnbits/wallets/cliche.py index ead40e617..a0ef0e3ce 100644 --- a/lnbits/wallets/cliche.py +++ b/lnbits/wallets/cliche.py @@ -104,42 +104,41 @@ class ClicheWallet(Wallet): ) async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: - try: - ws = create_connection(self.endpoint) - ws.send(f"pay-invoice --invoice {bolt11}") + ws = create_connection(self.endpoint) + ws.send(f"pay-invoice --invoice {bolt11}") + checking_id, fee_msat, preimage, payment_ok = ( + None, + None, + None, + None, + ) + for _ in range(2): + r = ws.recv() + data = json.loads(r) checking_id, fee_msat, preimage, payment_ok = ( None, None, None, None, ) - for _ in range(2): - r = ws.recv() - data = json.loads(r) - if data.get("error") is not None: - error_message = data["error"].get("message") - return PaymentResponse(error_message=error_message) + if data.get("error") is not None: + error_message = data["error"].get("message") + return PaymentResponse(ok=False, error_message=error_message) - if data.get("method") == "payment_succeeded": - payment_ok = True - checking_id = data["params"]["payment_hash"] - fee_msat = data["params"]["fee_msatoshi"] - preimage = data["params"]["preimage"] - continue + if data.get("method") == "payment_succeeded": + payment_ok = True + checking_id = data["params"]["payment_hash"] + fee_msat = data["params"]["fee_msatoshi"] + preimage = data["params"]["preimage"] + continue - if data.get("result") is None: - return PaymentResponse(error_message="result is None") + if data.get("result") is None: + return PaymentResponse(error_message="result is None") - return PaymentResponse( - ok=payment_ok, - checking_id=checking_id, - fee_msat=fee_msat, - preimage=preimage, - ) - except Exception as exc: - logger.warning(exc) - return PaymentResponse(error_message=f"Unable to query {self.endpoint}.") + return PaymentResponse( + ok=payment_ok, checking_id=checking_id, fee_msat=fee_msat, preimage=preimage + ) async def get_invoice_status(self, checking_id: str) -> PaymentStatus: ws = create_connection(self.endpoint) @@ -155,25 +154,21 @@ class ClicheWallet(Wallet): return PaymentStatus(statuses[data["result"]["status"]]) async def get_payment_status(self, checking_id: str) -> PaymentStatus: - try: - ws = create_connection(self.endpoint) - ws.send(f"check-payment --hash {checking_id}") - r = ws.recv() - data = json.loads(r) + ws = create_connection(self.endpoint) + ws.send(f"check-payment --hash {checking_id}") + r = ws.recv() + data = json.loads(r) - if data.get("error") is not None and data["error"].get("message"): - logger.error(data["error"]["message"]) - return PaymentPendingStatus() - payment = data["result"] - statuses = {"pending": None, "complete": True, "failed": False} - return PaymentStatus( - statuses.get(payment.get("status")), - payment.get("fee_msatoshi"), - payment.get("preimage"), - ) - except Exception as exc: - logger.warning(exc) + if data.get("error") is not None and data["error"].get("message"): + logger.error(data["error"]["message"]) return PaymentPendingStatus() + payment = data["result"] + statuses = {"pending": None, "complete": True, "failed": False} + return PaymentStatus( + statuses[payment["status"]], + payment.get("fee_msatoshi"), + payment.get("preimage"), + ) async def paid_invoices_stream(self) -> AsyncGenerator[str, None]: while settings.lnbits_running: diff --git a/lnbits/wallets/clnrest.py b/lnbits/wallets/clnrest.py index d9b86c370..8d34cef34 100644 --- a/lnbits/wallets/clnrest.py +++ b/lnbits/wallets/clnrest.py @@ -19,7 +19,6 @@ from lnbits.utils.crypto import random_secret_and_hash from .base import ( InvoiceResponse, - PaymentFailedStatus, PaymentPendingStatus, PaymentResponse, PaymentStatus, @@ -380,12 +379,9 @@ class CLNRestWallet(Wallet): pay = pays_list[-1] - status = pay.get("status") - if status == "complete": + if pay["status"] == "complete": fee_msat = pay["amount_sent_msat"] - pay["amount_msat"] return PaymentSuccessStatus(fee_msat=fee_msat, preimage=pay["preimage"]) - if status == "failed": - return PaymentFailedStatus() except Exception as exc: logger.warning(f"Error getting payment status: {exc}") diff --git a/lnbits/wallets/corelightning.py b/lnbits/wallets/corelightning.py index 41d1b6617..e21cb4f13 100644 --- a/lnbits/wallets/corelightning.py +++ b/lnbits/wallets/corelightning.py @@ -31,21 +31,6 @@ async def run_sync(func) -> Any: return await loop.run_in_executor(None, func) -def _all_payment_attempts_failed(error: object) -> bool: - if not isinstance(error, dict): - return False - - attempts = error.get("attempts") - return ( - isinstance(attempts, list) - and bool(attempts) - and all( - isinstance(attempt, dict) and attempt.get("status") == "failed" - for attempt in attempts - ) - ) - - class CoreLightningWallet(Wallet): """Core Lightning RPC implementation.""" @@ -199,9 +184,7 @@ class CoreLightningWallet(Wallet): logger.warning(exc) try: error_code = exc.error.get("code") # type: ignore - if error_code in self.pay_failure_error_codes or ( - _all_payment_attempts_failed(exc.error) - ): + if error_code in self.pay_failure_error_codes: error_message = exc.error.get("message", error_code) # type: ignore return PaymentResponse( ok=False, error_message=f"Payment failed: {error_message}" diff --git a/lnbits/wallets/eclair.py b/lnbits/wallets/eclair.py index 88d12dec6..dc5ed590d 100644 --- a/lnbits/wallets/eclair.py +++ b/lnbits/wallets/eclair.py @@ -22,7 +22,6 @@ from .base import ( PaymentStatus, StatusResponse, Wallet, - payment_request_was_rejected, ) @@ -166,24 +165,6 @@ class EclairWallet(Wallet): checking_id = data["paymentHash"] preimage = data["paymentPreimage"] - except httpx.HTTPStatusError as exc: - error_message = f"Unable to connect to {self.url}." - try: - error_data = exc.response.json() - if isinstance(error_data, dict) and error_data.get("error"): - error_message = str(error_data["error"]) - except json.JSONDecodeError: - pass - - # Eclair uses HTTP 400 for invoice and form validation failures, - # which happen before it dispatches the payment. - rejected = exc.response.status_code == 400 or payment_request_was_rejected( - exc.response.status_code - ) - return PaymentResponse( - ok=False if rejected else None, - error_message=error_message, - ) except json.JSONDecodeError: return PaymentResponse( error_message="Server error: 'invalid json response'" diff --git a/lnbits/wallets/lndgrpc.py b/lnbits/wallets/lndgrpc.py index 2641de233..bef94153e 100644 --- a/lnbits/wallets/lndgrpc.py +++ b/lnbits/wallets/lndgrpc.py @@ -192,21 +192,12 @@ class LndWallet(Wallet): fee_limit_msat=fee_limit_msat, timeout_seconds=30, no_inflight_updates=True, - max_parts=16, - time_pref=0.9, - allow_self_payment=settings.lnd_grpc_allow_self_payment, ) try: res: Payment = await self.router_rpc.SendPaymentV2(req).read() - except grpc.aio.AioRpcError as exc: - logger.warning(exc) - return PaymentResponse( - ok=False if _is_pre_dispatch_payment_error(exc) else None, - error_message=exc.details() or str(exc), - ) except Exception as exc: logger.warning(exc) - return PaymentResponse(ok=None, error_message=str(exc)) + return PaymentResponse(error_message=str(exc)) if res.status == Payment.PaymentStatus.SUCCEEDED: return PaymentResponse( @@ -384,22 +375,3 @@ class LndWallet(Wallet): ) # If we reach here, the invoice was successfully canceled and payment failed return InvoiceResponse(True, checking_id=payment_hash) - - -_PRE_DISPATCH_PAYMENT_ERROR_CODES = { - grpc.StatusCode.INVALID_ARGUMENT, - grpc.StatusCode.PERMISSION_DENIED, - grpc.StatusCode.UNAUTHENTICATED, -} -_PRE_DISPATCH_PAYMENT_ERROR_MESSAGES = ( - "invoice not for current active network", - "invoice expired", -) - - -def _is_pre_dispatch_payment_error(exc: grpc.aio.AioRpcError) -> bool: - if exc.code() in _PRE_DISPATCH_PAYMENT_ERROR_CODES: - return True - - details = (exc.details() or "").lower() - return any(message in details for message in _PRE_DISPATCH_PAYMENT_ERROR_MESSAGES) diff --git a/lnbits/wallets/lndrest.py b/lnbits/wallets/lndrest.py index bec06bf2b..da72a61f1 100644 --- a/lnbits/wallets/lndrest.py +++ b/lnbits/wallets/lndrest.py @@ -3,7 +3,6 @@ import base64 import hashlib import json from collections.abc import AsyncGenerator -from typing import Any import httpx from loguru import logger @@ -26,42 +25,6 @@ from .base import ( ) from .macaroon import load_macaroon -_PRE_DISPATCH_PAYMENT_ERROR_CODES = {3, 7, 16} -_PRE_DISPATCH_PAYMENT_ERROR_MESSAGES = ( - "invoice not for current active network", - "invoice expired", -) - - -def _is_pre_dispatch_payment_error(code: int | None, message: str) -> bool: - # LND's REST gateway uses the numeric gRPC status codes. UNKNOWN (2) - # is ambiguous unless LND returned one of its request-validation errors. - if code in _PRE_DISPATCH_PAYMENT_ERROR_CODES: - return True - - message = message.lower() - return any(error in message for error in _PRE_DISPATCH_PAYMENT_ERROR_MESSAGES) - - -def _payment_response_from_http_error( - exc: httpx.HTTPStatusError, endpoint: str -) -> PaymentResponse: - try: - error = exc.response.json()["error"] - error_code = error.get("code") - error_message = str(error.get("message") or exc) - except (json.JSONDecodeError, KeyError, TypeError, AttributeError): - error_code = None - error_message = f"Unable to connect to {endpoint}." - - logger.warning(f"LndRestWallet pay_invoice POST error: {error_message}.") - return PaymentResponse( - ok=( - False if _is_pre_dispatch_payment_error(error_code, error_message) else None - ), - error_message=error_message, - ) - class LndRestWallet(Wallet): """https://api.lightning.community/#lnd-rest-api-reference""" @@ -160,8 +123,8 @@ class LndRestWallet(Wallet): hashlib.sha256(unhashed_description).digest() ).decode("ascii") - preimage, payment_hash = random_secret_and_hash() - _data["r_hash"] = base64.b64encode(bytes.fromhex(payment_hash)).decode() + preimage, _payment_hash = random_secret_and_hash() + _data["r_hash"] = base64.b64encode(bytes.fromhex(_payment_hash)).decode() _data["r_preimage"] = base64.b64encode(bytes.fromhex(preimage)).decode() try: @@ -169,7 +132,34 @@ class LndRestWallet(Wallet): r.raise_for_status() data = r.json() - return self._parse_create_invoice_response(r, data, preimage) + if len(data) == 0: + return InvoiceResponse(ok=False, error_message="no data") + + if "error" in data: + return InvoiceResponse( + ok=False, error_message=f"""Server error: '{data["error"]}'""" + ) + + if r.is_error: + return InvoiceResponse( + ok=False, error_message=f"Server error: '{r.text}'" + ) + + if "payment_request" not in data or "r_hash" not in data: + return InvoiceResponse( + ok=False, error_message="Server error: 'missing required fields'" + ) + + payment_request = data["payment_request"] + payment_hash = base64.b64decode(data["r_hash"]).hex() + checking_id = payment_hash + return InvoiceResponse( + ok=True, + checking_id=checking_id, + payment_request=payment_request, + preimage=preimage, + ) + except json.JSONDecodeError: return InvoiceResponse( ok=False, error_message="Server error: 'invalid json response'" @@ -198,8 +188,6 @@ class LndRestWallet(Wallet): ) r.raise_for_status() data = r.json() - except httpx.HTTPStatusError as exc: - return _payment_response_from_http_error(exc, self.endpoint) except json.JSONDecodeError: return PaymentResponse( error_message="Server error: 'invalid json response'" @@ -239,7 +227,7 @@ class LndRestWallet(Wallet): elif status == "IN_FLIGHT": return PaymentResponse(ok=None, checking_id=checking_id) return PaymentResponse( - ok=None, + ok=False, checking_id=checking_id, error_message="Server error: 'unknown payment status returned'", ) @@ -254,13 +242,12 @@ class LndRestWallet(Wallet): logger.warning(f"Error getting invoice status: {e}") return PaymentPendingStatus() - if r.is_error or data.get("state") is None: + if r.is_error or data.get("settled") is None: # this must also work when checking_id is not a hex recognizable by lnd - # it will return an error and no "state" attribute on the object - logger.warning(f"Error checking invoice from LND REST API: {r.text}") + # it will return an error and no "settled" attribute on the object return PaymentPendingStatus() - if data.get("state") == "SETTLED": + if data.get("settled") is True: return PaymentSuccessStatus() if data.get("state") == "CANCELED": @@ -277,11 +264,10 @@ class LndRestWallet(Wallet): "ascii" ) except ValueError: - logger.warning("Invalid checking_id format, must be hex: {checking_id}") return PaymentPendingStatus() url = f"/v2/router/track/{checking_id}" - async with self.client.stream("GET", url, timeout=30) as r: + async with self.client.stream("GET", url, timeout=None) as r: async for json_line in r.aiter_lines(): try: line = json.loads(json_line) @@ -312,7 +298,7 @@ class LndRestWallet(Wallet): return PaymentFailedStatus() elif status == "IN_FLIGHT": logger.info(f"LNDRest Payment in flight: {checking_id}") - continue + return PaymentPendingStatus() logger.info(f"LNDRest Payment non-existent: {checking_id}") return PaymentPendingStatus() @@ -325,12 +311,13 @@ class LndRestWallet(Wallet): async for line in r.aiter_lines(): try: inv = json.loads(line)["result"] - if not inv.get("state") == "SETTLED": + if not inv["settled"]: continue - payment_hash = base64.b64decode(inv.get("r_hash")).hex() except Exception as exc: logger.debug(exc) continue + + payment_hash = base64.b64decode(inv["r_hash"]).hex() yield payment_hash except Exception as exc: logger.warning( @@ -376,6 +363,8 @@ class LndRestWallet(Wallet): return InvoiceResponse(ok=False, error_message=str(exc)) payment_request = data["payment_request"] + payment_hash = base64.b64encode(bytes.fromhex(payment_hash)).decode("ascii") + return InvoiceResponse( ok=True, checking_id=payment_hash, payment_request=payment_request ) @@ -410,31 +399,3 @@ class LndRestWallet(Wallet): except Exception as exc: logger.warning(exc) return InvoiceResponse(ok=False, error_message=str(exc)) - - def _parse_create_invoice_response( - self, r: Any, data: dict, preimage: str - ) -> InvoiceResponse: - if not data: - return InvoiceResponse(ok=False, error_message="no data") - if "error" in data: - return InvoiceResponse( - ok=False, error_message=f"Server error: '{data['error']}'" - ) - if r.is_error: - return InvoiceResponse(ok=False, error_message=f"Server error: '{r.text}'") - if "payment_request" not in data or "r_hash" not in data: - return InvoiceResponse( - ok=False, error_message="Server error: 'missing required fields'" - ) - try: - payment_hash = base64.b64decode(data["r_hash"]).hex() - except Exception: - return InvoiceResponse( - ok=False, error_message=f"Unable to b64decode to {data['r_hash']}." - ) - return InvoiceResponse( - ok=True, - checking_id=payment_hash, - payment_request=data["payment_request"], - preimage=preimage, - ) diff --git a/lnbits/wallets/lnpay.py b/lnbits/wallets/lnpay.py index 0212f9be8..738faf9ea 100644 --- a/lnbits/wallets/lnpay.py +++ b/lnbits/wallets/lnpay.py @@ -15,7 +15,6 @@ from .base import ( PaymentStatus, StatusResponse, Wallet, - payment_request_was_rejected, ) @@ -106,58 +105,44 @@ class LNPayWallet(Wallet): ) async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: - try: - r = await self.client.post( - f"/wallet/{self.wallet_key}/withdraw", - json={"payment_request": bolt11}, - timeout=None, - ) - except Exception as exc: - logger.warning(exc) - return PaymentResponse(error_message="Unable to connect to LNPay.") + r = await self.client.post( + f"/wallet/{self.wallet_key}/withdraw", + json={"payment_request": bolt11}, + timeout=None, + ) try: data = r.json() except Exception: - return PaymentResponse(error_message="Got invalid JSON.") + return PaymentResponse(ok=False, error_message="Got invalid JSON.") if r.is_error: - return PaymentResponse( - ok=False if payment_request_was_rejected(r.status_code) else None, - error_message=data.get("message", r.text), - ) + return PaymentResponse(ok=False, error_message=data["message"]) - try: - checking_id = data["lnTx"]["id"] - preimage = data["lnTx"]["payment_preimage"] - except (KeyError, TypeError): - return PaymentResponse( - error_message="LNPay response is missing required payment fields." - ) + checking_id = data["lnTx"]["id"] + fee_msat = 0 + preimage = data["lnTx"]["payment_preimage"] return PaymentResponse( - ok=True, checking_id=checking_id, fee_msat=0, preimage=preimage + ok=True, checking_id=checking_id, fee_msat=fee_msat, preimage=preimage ) async def get_invoice_status(self, checking_id: str) -> PaymentStatus: return await self.get_payment_status(checking_id) async def get_payment_status(self, checking_id: str) -> PaymentStatus: - try: - r = await self.client.get( - url=f"/lntx/{checking_id}", - ) - if r.is_error: - return PaymentPendingStatus() + r = await self.client.get( + url=f"/lntx/{checking_id}", + ) - data = r.json() - paid = {0: None, 1: True, -1: False}.get(data.get("settled")) - return PaymentStatus( - paid, data.get("fee_msat"), data.get("payment_preimage") - ) - except Exception as exc: - logger.warning(exc) + if r.is_error: return PaymentPendingStatus() + data = r.json() + preimage = data["payment_preimage"] + fee_msat = data["fee_msat"] + statuses = {0: None, 1: True, -1: False} + return PaymentStatus(statuses[data["settled"]], fee_msat, preimage) + async def paid_invoices_stream(self) -> AsyncGenerator[str, None]: self.queue: asyncio.Queue = asyncio.Queue(0) while settings.lnbits_running: diff --git a/lnbits/wallets/lntips.py b/lnbits/wallets/lntips.py index 1179f2673..5a15be1a0 100644 --- a/lnbits/wallets/lntips.py +++ b/lnbits/wallets/lntips.py @@ -17,7 +17,6 @@ from .base import ( PaymentStatus, StatusResponse, Wallet, - payment_request_was_rejected, ) @@ -104,43 +103,26 @@ class LnTipsWallet(Wallet): ) async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: - try: - r = await self.client.post( - "/api/v1/payinvoice", - json={"pay_req": bolt11}, - timeout=None, - ) - except Exception as exc: - logger.warning(exc) - return PaymentResponse( - error_message=f"Unable to connect to {self.endpoint}." - ) + r = await self.client.post( + "/api/v1/payinvoice", + json={"pay_req": bolt11}, + timeout=None, + ) if r.is_error: - return PaymentResponse( - ok=False if payment_request_was_rejected(r.status_code) else None, - error_message=r.text, - ) + return PaymentResponse(ok=False, error_message=r.text) - try: - response = r.json() - except json.JSONDecodeError: - return PaymentResponse( - error_message="Server error: 'invalid json response'" - ) + if "error" in r.json(): + try: + data = r.json() + error_message = data["error"] + except Exception: + error_message = r.text + return PaymentResponse(ok=False, error_message=error_message) - if "error" in response: - error_message = response.get("error") or r.text - return PaymentResponse(error_message=error_message) - - try: - data = response["details"] - checking_id = data["payment_hash"] - fee_msat = -data["fee"] - preimage = data["preimage"] - except (KeyError, TypeError): - return PaymentResponse( - error_message="Server error: 'missing required fields'" - ) + data = r.json()["details"] + checking_id = data["payment_hash"] + fee_msat = -data["fee"] + preimage = data["preimage"] return PaymentResponse( ok=True, checking_id=checking_id, fee_msat=fee_msat, preimage=preimage ) diff --git a/lnbits/wallets/nwc.py b/lnbits/wallets/nwc.py index 928ea6518..a6f1f82c1 100644 --- a/lnbits/wallets/nwc.py +++ b/lnbits/wallets/nwc.py @@ -1,19 +1,14 @@ import asyncio -import base64 import hashlib -import hmac import json import random -import secrets import time -from collections.abc import AsyncGenerator, Awaitable, Callable -from typing import Any, cast +from collections.abc import AsyncGenerator +from typing import cast from urllib.parse import parse_qs, unquote, urlparse from bolt11 import decode as bolt11_decode from coincurve import PrivateKey, PublicKey -from Cryptodome.Cipher import ChaCha20 -from Cryptodome.Hash import HMAC, SHA256 from loguru import logger from websockets import connect as ws_connect @@ -49,26 +44,6 @@ class NWCError(Exception): return f"{self.code} {self.message}" -NWC_ENCRYPTION_NIP04 = "nip04" -NWC_ENCRYPTION_NIP44_V2 = "nip44_v2" -NWC_SUPPORTED_ENCRYPTIONS = [NWC_ENCRYPTION_NIP44_V2, NWC_ENCRYPTION_NIP04] -NWC_NOTIFICATION_KIND_NIP04 = 23196 -NWC_NOTIFICATION_KIND_NIP44 = 23197 - - -def _normalize_supported_encryptions(encryptions: list[str]) -> list[str]: - normalized = [enc for enc in encryptions if enc in NWC_SUPPORTED_ENCRYPTIONS] - return normalized or [NWC_ENCRYPTION_NIP04] - - -def _choose_preferred_encryption(encryptions: list[str]) -> str: - supported = set(_normalize_supported_encryptions(encryptions)) - for encryption in NWC_SUPPORTED_ENCRYPTIONS: - if encryption in supported: - return encryption - return NWC_ENCRYPTION_NIP04 - - class NWCWallet(Wallet): """ A funding source that connects to a Nostr Wallet Connect (NWC) service provider. @@ -76,32 +51,22 @@ class NWCWallet(Wallet): """ def __init__(self): - super().__init__() self.shutdown = False nwc_data = parse_nwc(settings.nwc_pairing_url) self.conn = NWCConnection( - nwc_data["pubkey"], - nwc_data["secret"], - nwc_data["relay"], - notification_handler=self._handle_notification, + nwc_data["pubkey"], nwc_data["secret"], nwc_data["relay"] ) - self.pending_invoice_details: dict[str, dict[str, Any]] = {} - self.payment_status_cache: dict[str, dict[str, Any]] = {} - self.payment_status_cache_pending_ttl = 30 - self.payment_status_cache_terminal_ttl = 60 * 60 * 24 - self.transactions_refresh_interval = 30 - self.transactions_refresh_max_age = 60 * 60 * 24 * 15 - self.transactions_refresh_max_pages = 20 - self.transactions_refresh_lock = asyncio.Lock() - self.last_transactions_refresh_at: dict[bool, float] = {} - self.pending_invoices_maintenance_interval = 5 - self.notification_lookup_schedule = [60, 120, 300, 600, 1200, 1800] - self.lookup_only_schedule = [15, 30, 60, 120, 300, 600, 1200, 1800] - self.pending_invoices_lookup_cooldown = 1.0 - self.pending_invoices_reconcile_interval = 180 - self.next_reconcile_at = 0.0 - self.last_connection_generation = -1 + # pending payments for paid_invoices_stream. + # They are tracked until they expire or are settled + self.pending_payments = [] + # interval in seconds between checks for pending payments + self.pending_payments_lookup_interval = 10 + # track paid invoices for paid_invoices_stream self.paid_invoices_queue = asyncio.Queue(0) + # This task periodically checks if pending payments have been settled + self.pending_payments_lookup_task = asyncio.create_task( + self._handle_pending_payments() + ) def _is_shutting_down(self) -> bool: """ @@ -109,412 +74,59 @@ class NWCWallet(Wallet): """ return self.shutdown or not settings.lnbits_running - async def _handle_notification(self, notification: dict[str, Any]): - notification_type = notification.get("notification_type") - notification_payload = notification.get("notification") or {} - if not isinstance(notification_payload, dict): - logger.warning( - "Ignoring malformed NWC notification payload: " - + str(notification_payload) - ) - return - - if notification_type == "payment_received": - checking_id = str(notification_payload.get("payment_hash") or "") - if checking_id: - logger.debug( - "Received NWC payment_received notification for " + checking_id - ) - self._cache_payment_data(checking_id, notification_payload) - self._mark_invoice_settled(checking_id, source="notification") - elif notification_type == "payment_sent": - checking_id = str(notification_payload.get("payment_hash") or "") - if checking_id: - logger.debug( - "Received NWC payment_sent notification for " + checking_id - ) - payment_data = dict(notification_payload) - payment_data.setdefault("state", "settled") - payment_data.setdefault("settled_at", int(time.time())) - self._cache_payment_data(checking_id, payment_data) - elif notification_type == "hold_invoice_accepted": - logger.debug( - "Received NWC hold_invoice_accepted notification for " - + str(notification_payload.get("payment_hash") or "") - ) - elif notification_type: - logger.debug( - "Ignoring unsupported NWC notification type " + notification_type - ) - - def _get_lookup_schedule(self) -> list[int]: - if self.conn.supports_notification_type("payment_received"): - return self.notification_lookup_schedule - return self.lookup_only_schedule - - def _schedule_next_lookup(self, invoice: dict[str, Any], now: float | None = None): - now = now or time.time() - schedule = self._get_lookup_schedule() - attempt = int(invoice.get("lookup_attempts", 0)) - delay = schedule[min(attempt, len(schedule) - 1)] - jitter = random.uniform(0, min(15, max(1, delay * 0.1))) # noqa: S311 - invoice["next_lookup_at"] = now + delay + jitter - - def _track_pending_invoice( - self, checking_id: str, created_at: int, expires_at: int - ) -> None: - invoice = self.pending_invoice_details.get(checking_id, {}) - invoice["checking_id"] = checking_id - invoice["created_at"] = created_at - invoice["expires_at"] = expires_at - invoice.setdefault("lookup_attempts", 0) - invoice.setdefault("last_lookup_at", 0.0) - self.pending_invoice_details[checking_id] = invoice - if checking_id not in self.pending_invoices: - self.pending_invoices.append(checking_id) - if "next_lookup_at" not in invoice: - self._schedule_next_lookup(invoice, created_at) - self.next_reconcile_at = 0.0 - - def _remove_pending_invoice(self, checking_id: str) -> bool: - self.pending_invoice_details.pop(checking_id, None) - if checking_id in self.pending_invoices: - self.pending_invoices.remove(checking_id) - return True - return False - - def _mark_invoice_settled(self, checking_id: str, source: str): - was_pending = self._remove_pending_invoice(checking_id) - if was_pending: - logger.debug("Pending invoice " + checking_id + " settled via " + source) - self.paid_invoices_queue.put_nowait(checking_id) - - def _expire_pending_invoices(self, now: float): - expired_ids: list[str] = [] - for checking_id in list(self.pending_invoices): - invoice = self.pending_invoice_details.get(checking_id, {}) - expires_at = int(invoice.get("expires_at", 0) or 0) - if expires_at and now > expires_at: - logger.warning("Pending invoice " + checking_id + " timed out") - expired_ids.append(checking_id) - for checking_id in expired_ids: - self._remove_pending_invoice(checking_id) - - async def _should_run_reconciliation(self, now: float) -> bool: - if now < self.next_reconcile_at: - return False - await self.conn.get_info() - if not self.conn.supports_method("list_transactions"): - self.next_reconcile_at = now + self.pending_invoices_reconcile_interval - return False - return True - - def _cache_ids(self, *extra_ids: str) -> set[str]: - ids = {checking_id for checking_id in self.pending_invoices if checking_id} - ids.update(checking_id for checking_id in extra_ids if checking_id) - return ids - - async def _fetch_incoming_transactions( - self, - *, - from_ts: int, - now: float | None = None, - cache_ids: set[str] | None = None, - stop_when_found_ids: set[str] | None = None, - unpaid: bool = False, - ) -> list[dict[str, Any]]: - now = now or time.time() - await self.conn.get_info() - if not self.conn.supports_method("list_transactions"): - return [] - - offset = 0 - limit = 20 - transactions: list[dict[str, Any]] = [] - remaining_ids = { - checking_id for checking_id in (stop_when_found_ids or set()) if checking_id - } - - while offset < limit * self.transactions_refresh_max_pages: - result = await self.conn.call( - "list_transactions", - { - "from": from_ts, - "until": int(now), - "limit": limit, - "offset": offset, - "type": "incoming", - "unpaid": unpaid, - }, - ) - page = result.get("transactions", []) - tx_summary = [ - { - "payment_hash": tx.get("payment_hash"), - "state": tx.get("state"), - "settled_at": tx.get("settled_at"), - "expires_at": tx.get("expires_at"), - } - for tx in page - if isinstance(tx, dict) - ] - logger.debug( - "NWC list_transactions response. " - f"from={from_ts} until={int(now)} offset={offset} " - f"limit={limit} unpaid={unpaid} " - f"count={len(page) if isinstance(page, list) else 'malformed'} " - f"transactions={tx_summary} raw={result}" - ) - if not isinstance(page, list) or not page: - break - - for tx in page: - if not isinstance(tx, dict): - continue - checking_id = str(tx.get("payment_hash") or "") - if checking_id and (cache_ids is None or checking_id in cache_ids): - self._cache_payment_data(checking_id, tx, cached_at=now) - if checking_id: - remaining_ids.discard(checking_id) - transactions.append(tx) - - if len(page) < limit: - break - if not remaining_ids and stop_when_found_ids: - break - offset += limit - - return transactions - - async def _reconcile_pending_invoices(self, now: float): - try: - await self.conn.get_info() - if not self.conn.supports_method("list_transactions"): - self.next_reconcile_at = now + self.pending_invoices_reconcile_interval - return - - created_from = min( - int( - self.pending_invoice_details.get(checking_id, {}).get( - "created_at", now - ) - ) - for checking_id in self.pending_invoices - ) - from_ts = max(0, created_from - 60) - matched = 0 - pending_ids = self._cache_ids() - - logger.debug( - "Reconciling pending NWC invoices with list_transactions. " - f"pending_count={len(self.pending_invoices)} from={from_ts}" - ) - - transactions = await self._fetch_incoming_transactions( - from_ts=from_ts, - now=now, - cache_ids=pending_ids, - stop_when_found_ids=pending_ids, - ) - for tx in transactions: - checking_id = str(tx.get("payment_hash") or "") - if checking_id not in self.pending_invoices: - continue - if self._payment_data_is_settled(tx): - self._mark_invoice_settled(checking_id, source="reconciliation") - matched += 1 - - logger.debug( - "NWC reconciliation complete. " - f"matched={matched} remaining_pending={len(self.pending_invoices)}" - ) - except Exception as e: - logger.error("Error reconciling pending NWC invoices: " + str(e)) - finally: - self.next_reconcile_at = now + self.pending_invoices_reconcile_interval - - async def _run_fallback_lookups(self, now: float): - await self.conn.get_info() - if not self.conn.supports_method("lookup_invoice"): - return - - due_invoices = [ - self.pending_invoice_details[checking_id] - for checking_id in self.pending_invoices - if checking_id in self.pending_invoice_details - and float( - self.pending_invoice_details[checking_id].get("next_lookup_at", 0.0) - or 0.0 - ) - <= now - ] - due_invoices.sort(key=lambda invoice: float(invoice.get("next_lookup_at", 0.0))) - - for index, invoice in enumerate(due_invoices): - checking_id = str(invoice["checking_id"]) - if checking_id not in self.pending_invoices: - continue - try: - payment_data = await self.conn.call( - "lookup_invoice", {"payment_hash": checking_id} - ) - self._cache_payment_data(checking_id, payment_data, cached_at=now) - invoice["last_lookup_at"] = now - invoice["lookup_attempts"] = int(invoice.get("lookup_attempts", 0)) + 1 - if self._payment_data_is_settled(payment_data): - self._mark_invoice_settled(checking_id, source="lookup") - continue - self._schedule_next_lookup(invoice, now) - except NWCError as e: - logger.warning( - "Error handling pending invoice via lookup. " - f"checking_id={checking_id} code={e.code} message={e.message}" - ) - invoice["lookup_attempts"] = int(invoice.get("lookup_attempts", 0)) + 1 - if e.code == "RATE_LIMITED": - self.next_reconcile_at = max( - self.next_reconcile_at, - now + self.pending_invoices_reconcile_interval, - ) - self._schedule_next_lookup(invoice, now) - except Exception as e: - logger.error("Error handling pending invoice: " + str(e)) - invoice["lookup_attempts"] = int(invoice.get("lookup_attempts", 0)) + 1 - self._schedule_next_lookup(invoice, now) - if ( - index < len(due_invoices) - 1 - and self.pending_invoices_lookup_cooldown > 0 - and not self._is_shutting_down() - ): - await asyncio.sleep(self.pending_invoices_lookup_cooldown) - - async def _maintain_pending_invoices(self): - if not self.pending_invoices: - return - - now = time.time() - if self.conn.connection_generation != self.last_connection_generation: - self.last_connection_generation = self.conn.connection_generation - self.next_reconcile_at = 0.0 - - self._expire_pending_invoices(now) - if not self.pending_invoices: - return - - if await self._should_run_reconciliation(now): - await self._reconcile_pending_invoices(now) - - await self._run_fallback_lookups(now) - self._prune_payment_status_cache(self._cache_ids()) - - def _payment_data_is_settled(self, payment_data: dict[str, Any]) -> bool: - state = payment_data.get("state") - settled_at = payment_data.get("settled_at") - preimage = payment_data.get("preimage") - if state == "settled": - return True - return bool(settled_at and int(settled_at) > 0 and preimage) - - def _payment_data_is_failed(self, payment_data: dict[str, Any]) -> bool: - state = payment_data.get("state") - if state in {"expired", "failed"}: - return True - created_at = int(payment_data.get("created_at", time.time())) - expires_at = int(payment_data.get("expires_at", created_at + 3600)) - return bool( - expires_at - and time.time() > expires_at - and not self._payment_data_is_settled(payment_data) - ) - - def _payment_data_to_status(self, payment_data: dict[str, Any]) -> PaymentStatus: - fee_msat = payment_data.get("fees_paid", None) - preimage = payment_data.get("preimage", None) - if self._payment_data_is_settled(payment_data): - return PaymentStatus(True, fee_msat=fee_msat, preimage=preimage) - if self._payment_data_is_failed(payment_data): - return PaymentStatus(False, fee_msat=fee_msat, preimage=preimage) - return PaymentStatus(None, fee_msat=fee_msat, preimage=preimage) - - def _cache_payment_data( - self, - checking_id: str, - payment_data: dict[str, Any], - cached_at: float | None = None, - ) -> None: - cached_at = cached_at or time.time() - ttl = ( - self.payment_status_cache_terminal_ttl - if self._payment_data_is_settled(payment_data) - or self._payment_data_is_failed(payment_data) - else self.payment_status_cache_pending_ttl - ) - self.payment_status_cache[checking_id] = { - "payment_data": dict(payment_data), - "expires_at": cached_at + ttl, - } - - def _prune_payment_status_cache(self, keep_ids: set[str] | None = None) -> None: - now = time.time() - for checking_id in list(self.payment_status_cache.keys()): - cached = self.payment_status_cache.get(checking_id) or {} - expires_at = float(cached.get("expires_at", 0.0) or 0.0) - if expires_at <= now or ( - keep_ids is not None and checking_id not in keep_ids - ): - self.payment_status_cache.pop(checking_id, None) - - def _get_cached_payment_data(self, checking_id: str) -> dict[str, Any] | None: - cached = self.payment_status_cache.get(checking_id) - if not cached: - return None - if float(cached.get("expires_at", 0.0) or 0.0) <= time.time(): - self.payment_status_cache.pop(checking_id, None) - return None - payment_data = cached.get("payment_data") - if isinstance(payment_data, dict): - return payment_data - return None - - async def _refresh_recent_incoming_transactions( - self, - *, - now: float | None = None, - from_ts: int | None = None, - cache_ids: set[str] | None = None, - stop_when_found_ids: set[str] | None = None, - unpaid: bool = True, - force: bool = False, - ) -> None: - now = now or time.time() - last_refresh_at = self.last_transactions_refresh_at.get(unpaid, 0.0) - if not force and now - last_refresh_at < self.transactions_refresh_interval: - return - - async with self.transactions_refresh_lock: + async def _handle_pending_payments(self): + """ + Periodically checks if any pending payments have been settled. + """ + while not self._is_shutting_down(): + await asyncio.sleep(self.pending_payments_lookup_interval) + # Check if any pending payments have been settled or timed out now = time.time() - last_refresh_at = self.last_transactions_refresh_at.get(unpaid, 0.0) - if not force and now - last_refresh_at < self.transactions_refresh_interval: - return + for payment in self.pending_payments: + try: + if not payment["settled"]: + payment_data = await self.conn.call( + "lookup_invoice", {"payment_hash": payment["checking_id"]} + ) + if payment_data.get("payment_hash") != payment["checking_id"]: + raise Exception("Mismatched payment hash") + settled = ( + "settled_at" in payment_data + and payment_data["settled_at"] + and int(payment_data["settled_at"]) > 0 + and "preimage" in payment_data + and payment_data["preimage"] + ) + if settled: + logger.debug( + "Pending payment " + payment["checking_id"] + " settled" + ) + payment["settled"] = True + self.paid_invoices_queue.put_nowait(payment["checking_id"]) + except Exception as e: + logger.error("Error handling pending payment: " + str(e)) + try: + if now > payment["expires_at"]: + logger.warning( + "Pending payment " + payment["checking_id"] + " timed out" + ) + payment["expired"] = True + except Exception as e: + logger.error("Error handling pending payment: " + str(e)) - from_ts = from_ts or max(0, int(now - self.transactions_refresh_max_age)) - - logger.debug( - "Refreshing recent NWC incoming transactions cache. " - f"from={from_ts} max_pages={self.transactions_refresh_max_pages}" - ) - - await self._fetch_incoming_transactions( - from_ts=from_ts, - now=now, - cache_ids=cache_ids, - stop_when_found_ids=stop_when_found_ids, - unpaid=unpaid, - ) - self.last_transactions_refresh_at[unpaid] = now + # Remove all settled or expired payments + self.pending_payments = [ + payment + for payment in self.pending_payments + if not payment["settled"] and not payment["expired"] + ] async def cleanup(self): self.shutdown = True + try: + self.pending_payments_lookup_task.cancel() + except Exception as e: + logger.warning("Error cancelling pending payments lookup task: " + str(e)) await self.conn.close() async def create_invoice( @@ -536,8 +148,8 @@ class NWCWallet(Wallet): else: desc = memo or "" try: - await self.conn.get_info() - if not self.conn.supports_method("make_invoice"): + info = await self.conn.get_info() + if "make_invoice" not in info["supported_methods"]: return InvoiceResponse( ok=False, error_message="make_invoice is not supported by this NWC service.", @@ -552,14 +164,18 @@ class NWCWallet(Wallet): ) checking_id = str(resp["payment_hash"]) payment_request = resp.get("invoice", None) - created_at = int(resp.get("created_at", time.time())) - expires_at = int(resp.get("expires_at", created_at + 3600)) - if ( - self.conn.supports_method("lookup_invoice") - or self.conn.supports_method("list_transactions") - or self.conn.supports_notification_type("payment_received") - ): - self._track_pending_invoice(checking_id, created_at, expires_at) + # if lookup_invoice is not supported, we can't track the payment + if "lookup_invoice" in info["supported_methods"]: + created_at = int(resp.get("created_at", time.time())) + expires_at = int(resp.get("expires_at", created_at + 3600)) + self.pending_payments.append( + { # Start tracking + "checking_id": checking_id, + "expires_at": expires_at, + "settled": False, + "expired": False, + } + ) return InvoiceResponse( ok=True, checking_id=checking_id, payment_request=payment_request ) @@ -568,8 +184,8 @@ class NWCWallet(Wallet): async def status(self) -> StatusResponse: try: - await self.conn.get_info() - if not self.conn.supports_method("get_balance"): + info = await self.conn.get_info() + if "get_balance" not in info["supported_methods"]: logger.debug("get_balance is not supported by this NWC service.") return StatusResponse(None, 0) resp = await self.conn.call("get_balance", {}) @@ -586,9 +202,9 @@ class NWCWallet(Wallet): payment_hash = invoice_data.payment_hash # pay_invoice doesn't return payment data, so we need # to call lookup_invoice too (if supported) - await self.conn.get_info() + info = await self.conn.get_info() - if not self.conn.supports_method("lookup_invoice"): + if "lookup_invoice" not in info["supported_methods"]: # if not supported, we assume it succeeded return PaymentResponse( ok=True, checking_id=payment_hash, preimage=preimage, fee_msat=0 @@ -625,6 +241,8 @@ class NWCWallet(Wallet): "QUOTA_EXCEEDED", "RESTRICTED", "UNAUTHORIZED", + "INTERNAL", + "OTHER", "PAYMENT_FAILED", ] failed = e.code in failure_codes @@ -638,64 +256,34 @@ class NWCWallet(Wallet): # assume pending return PaymentResponse(error_message=msg) - async def _get_status_via_transactions( - self, checking_id: str, unpaid_filters: list[bool] - ) -> PaymentStatus | None: - keep_ids = self._cache_ids(checking_id) - self._prune_payment_status_cache() - payment_data = self._get_cached_payment_data(checking_id) - if payment_data: - return self._payment_data_to_status(payment_data) - - if self.conn.supports_method("list_transactions"): - invoice_details = self.pending_invoice_details.get(checking_id, {}) - created_at_hint = int( - invoice_details.get( - "created_at", time.time() - self.transactions_refresh_max_age - ) - ) - from_ts = max(0, created_at_hint - 60) - - for unpaid in unpaid_filters: - await self._refresh_recent_incoming_transactions( - from_ts=from_ts, - cache_ids=None, - stop_when_found_ids=keep_ids, - unpaid=unpaid, - ) - payment_data = self._get_cached_payment_data(checking_id) - if payment_data: - return self._payment_data_to_status(payment_data) - - if self.conn.supports_method("lookup_invoice"): - payment_data = await self.conn.call( - "lookup_invoice", {"payment_hash": checking_id} - ) - self._cache_payment_data(checking_id, payment_data) - return self._payment_data_to_status(payment_data) - - return None - async def get_invoice_status(self, checking_id: str) -> PaymentStatus: - try: - await self.conn.get_info() - status = await self._get_status_via_transactions(checking_id, [True, False]) - return status or PaymentStatus(None, fee_msat=None, preimage=None) - except NWCError as e: - logger.error("Error getting invoice status: " + str(e)) - failed = e.code == "NOT_FOUND" - return PaymentStatus( - None if not failed else False, fee_msat=None, preimage=None - ) - except Exception as e: - logger.error("Error getting invoice status: " + str(e)) - return PaymentStatus(None, fee_msat=None, preimage=None) + return await self.get_payment_status(checking_id) async def get_payment_status(self, checking_id: str) -> PaymentStatus: try: - await self.conn.get_info() - status = await self._get_status_via_transactions(checking_id, [False]) - return status or PaymentStatus(None, fee_msat=None, preimage=None) + info = await self.conn.get_info() + if "lookup_invoice" in info["supported_methods"]: + payment_data = await self.conn.call( + "lookup_invoice", {"payment_hash": checking_id} + ) + if payment_data.get("payment_hash") != checking_id: + raise Exception("Mismatched payment hash") + settled = payment_data.get("settled_at", None) and payment_data.get( + "preimage", None + ) + fee_msat = payment_data.get("fees_paid", None) + preimage = payment_data.get("preimage", None) + created_at = int(payment_data.get("created_at", time.time())) + expires_at = int(payment_data.get("expires_at", created_at + 3600)) + expired = expires_at and time.time() > expires_at + if expired and not settled: + return PaymentStatus(False, fee_msat=fee_msat, preimage=preimage) + else: + return PaymentStatus( + True if settled else None, fee_msat=fee_msat, preimage=preimage + ) + else: + return PaymentStatus(None, fee_msat=None, preimage=None) except NWCError as e: logger.error("Error getting payment status: " + str(e)) failed = e.code == "NOT_FOUND" @@ -709,14 +297,8 @@ class NWCWallet(Wallet): async def paid_invoices_stream(self) -> AsyncGenerator[str, None]: while not self._is_shutting_down(): - try: - value = await asyncio.wait_for( - self.paid_invoices_queue.get(), - timeout=self.pending_invoices_maintenance_interval, - ) - yield value - except asyncio.TimeoutError: - await self._maintain_pending_invoices() + value = await self.paid_invoices_queue.get() + yield value class NWCConnection: @@ -724,13 +306,7 @@ class NWCConnection: A connection to a Nostr Wallet Connect (NWC) service provider. """ - def __init__( - self, - pubkey, - secret, - relay, - notification_handler: Callable[[dict[str, Any]], Awaitable[None]] | None = None, - ): + def __init__(self, pubkey, secret, relay): # Parse pairing url (if invalid an exception is raised) # Extract keys (used to sign nwc events+identify NWC user) @@ -749,7 +325,7 @@ class NWCConnection: self.relay = relay # Create temporary subscriptions, stored until the response is received/expires - self.subscriptions: dict[str, dict[str, Any]] = {} + self.subscriptions = {} # Timeout in seconds after which a subscription is closed # if no response is received self.subscription_timeout = 10 @@ -764,15 +340,7 @@ class NWCConnection: self.shutdown = False # cached info about the service provider - self.info: dict[str, Any] | None = None - self.supported_methods: set[str] = set() - self.notification_types: set[str] = set() - self.supported_encryptions = [NWC_ENCRYPTION_NIP04] - self.selected_encryption = NWC_ENCRYPTION_NIP04 - self.advertises_encryption_tag = False - self.notification_handler = notification_handler - self.notification_subscription_ids: set[str] = set() - self.connection_generation = 0 + self.info = None # This task handles connection and reconnection to the relay self.connection_task = asyncio.create_task(self._connect_to_relay()) @@ -811,7 +379,6 @@ class NWCConnection: return await self._wait_for_connection() # ensure the connection is established tx = json_dumps(data) - logger.debug("Sending raw NWC relay message: " + tx) await self.ws.send(tx) def _get_new_subid(self) -> str: @@ -821,7 +388,7 @@ class NWCConnection: Returns: str: The generated 64 characters long subscription id (eg. lnbits0abc...) """ - subid = str(self.subscriptions_count) + subid = "lnbits" + str(self.subscriptions_count) self.subscriptions_count += 1 max_length = 64 chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -853,7 +420,6 @@ class NWCConnection: # remove the subscription from the list if sub_to_close: self.subscriptions.pop(sub_to_close["event_id"], None) - self.notification_subscription_ids.discard(sub_id) if not sub_to_close["closed"]: sub_to_close["closed"] = True if send_event: @@ -882,7 +448,6 @@ class NWCConnection: if subscription: if not subscription["closed"]: subscription["closed"] = True - self.notification_subscription_ids.discard(subscription["sub_id"]) if send_event: try: await self._send(["CLOSE", subscription["sub_id"]]) @@ -919,8 +484,6 @@ class NWCConnection: now = time.time() subscriptions_to_close = [] for subscription in self.subscriptions.values(): - if subscription["method"] == "notification_sub": - continue t = now - subscription["timestamp"] if t > self.subscription_timeout: logger.warning( @@ -961,10 +524,9 @@ class NWCConnection: """ sub_id = cast(str, msg[1]) event = cast(dict, msg[2]) - # Ensure the event is valid and comes from the configured service - # provider (do not trust relays). + # Ensure the event is valid (do not trust relays) if not verify_event(event) or event.get("pubkey") != self.service_pubkey_hex: - raise Exception("Invalid event signature") + raise Exception("Invalid event") tags = event["tags"] if event["kind"] == 13194: # An info event # info events are handled specially, @@ -982,20 +544,8 @@ class NWCConnection: # methods that is passed to the future content = event["content"] subscription["future"].set_result( - self._normalize_info( - { - "supported_methods": content.split(" "), - "notification_types": self._get_tag_values( - tags, "notifications" - ), - "supported_encryptions": self._get_tag_values( - tags, "encryption" - ), - } - ) + {"supported_methods": content.split(" ")} ) - elif event["kind"] in (23196, 23197): - await self._on_notification_event(event) else: # A response event subscription = None # find the first "e" tag that is handled by @@ -1009,17 +559,10 @@ class NWCConnection: break # if a subscription was found, pass the result to the future if subscription: - try: - content = self._decrypt_event_content(event) - content = json.loads(content) - except Exception as e: - logger.error( - "Failed to decode NWC response event. " - f"kind={event.get('kind')} id={event.get('id')} " - f"tags={event.get('tags', [])} " - f"ciphertext={event.get('content')} error={e}" - ) - raise + content = decrypt_content( + event["content"], self.service_pubkey, self.account_private_key_hex + ) + content = json.loads(content) result_type = content.get("result_type", "") error = content.get("error", None) result = content.get("result", None) @@ -1035,30 +578,6 @@ class NWCConnection: else: subscription["future"].set_result(result) - async def _on_notification_event(self, event: dict[str, Any]): - if event.get("pubkey") != self.service_pubkey_hex: - logger.warning( - "Ignoring NWC notification from unexpected pubkey " - + str(event.get("pubkey")) - ) - return - - if not self.notification_handler: - return - - try: - content = self._decrypt_event_content(event) - notification = json.loads(content) - except Exception as e: - logger.error( - "Failed to decode NWC notification event. " - f"kind={event.get('kind')} id={event.get('id')} " - f"tags={event.get('tags', [])} " - f"ciphertext={event.get('content')} error={e}" - ) - raise - await self.notification_handler(notification) - async def _on_closed_message(self, msg: list[str]): """ Handles CLOSED messages from the relay. @@ -1076,7 +595,6 @@ class NWCConnection: Handle incoming messages from the relay. """ try: - logger.debug("Received raw NWC relay message: " + message) msg = json.loads(message) if msg[0] == "OK": # Event status message await self._on_ok_message(msg) @@ -1109,9 +627,6 @@ class NWCConnection: async with ws_connect(self.relay) as ws: self.ws = ws self.connected = True - self.connection_generation += 1 - self.notification_subscription_ids = set() - await self._subscribe_to_notifications() while ( not self._is_shutting_down() ): # receive messages until the connection is shutting down @@ -1138,133 +653,6 @@ class NWCConnection: logger.debug("Reconnecting to NWC relay in 5 seconds...") await asyncio.sleep(5) - async def _subscribe_to_notifications(self): - for kind in (23197, 23196): - sub_id = self._get_new_subid() - sub_filter = { - "kinds": [kind], - "authors": [self.service_pubkey_hex], - "#p": [self.account_public_key_hex], - "since": int(time.time()), - } - future = asyncio.get_event_loop().create_future() - self.subscriptions[sub_id] = { - "method": "notification_sub", - "future": future, - "sub_id": sub_id, - "event_id": sub_id, - "timestamp": time.time(), - "closed": False, - } - self.notification_subscription_ids.add(sub_id) - await self._send(["REQ", sub_id, sub_filter]) - - def _get_tag_values(self, tags: list[list[str]], tag_name: str) -> list[str]: - for tag in tags: - if tag and tag[0] == tag_name and len(tag) > 1: - return [value for value in tag[1].split(" ") if value] - return [] - - def supports_notification_type(self, notification_type: str) -> bool: - return notification_type in self.notification_types - - def supports_method(self, method: str) -> bool: - return method in self.supported_methods - - def _normalize_info(self, info: dict[str, Any]) -> dict[str, Any]: - methods = info.get("supported_methods", []) or [] - notifications = info.get("notification_types", []) or [] - encryptions = _normalize_supported_encryptions( - info.get("supported_encryptions", []) or [] - ) - normalized = { - "supported_methods": [method for method in methods if method], - "notification_types": [ - notification for notification in notifications if notification - ], - "supported_encryptions": encryptions, - } - return normalized - - def _apply_capabilities(self, info: dict[str, Any]) -> dict[str, Any]: - normalized = self._normalize_info(info) - self.supported_methods = set(normalized["supported_methods"]) - self.notification_types = set(normalized["notification_types"]) - self.supported_encryptions = normalized["supported_encryptions"] - self.advertises_encryption_tag = bool(info.get("supported_encryptions")) - self.selected_encryption = _choose_preferred_encryption( - normalized["supported_encryptions"] - ) - logger.debug( - "Negotiated NWC provider capabilities. " - f"supported_encryptions={self.supported_encryptions} " - f"selected_encryption={self.selected_encryption} " - f"advertises_encryption_tag={self.advertises_encryption_tag} " - f"supported_methods={sorted(self.supported_methods)} " - f"notification_types={sorted(self.notification_types)}" - ) - return normalized - - def _get_event_encryption(self, event: dict[str, Any]) -> str: - encryption_tag = self._get_tag_values(event.get("tags", []), "encryption") - if encryption_tag: - return _choose_preferred_encryption(encryption_tag) - if event.get("kind") == NWC_NOTIFICATION_KIND_NIP44: - return NWC_ENCRYPTION_NIP44_V2 - if event.get("kind") == NWC_NOTIFICATION_KIND_NIP04: - return NWC_ENCRYPTION_NIP04 - return ( - self.selected_encryption - if self.selected_encryption - else NWC_ENCRYPTION_NIP04 - ) - - def _encrypt_payload(self, content: str) -> tuple[str, str]: - encryption = self.selected_encryption or NWC_ENCRYPTION_NIP04 - logger.debug( - "Encrypting NWC payload. " f"encryption={encryption} plaintext={content}" - ) - if encryption == NWC_ENCRYPTION_NIP44_V2: - encrypted = NIP44Encryption.encrypt( - content, self.service_pubkey, self.account_private_key_hex - ) - else: - encrypted = encrypt_content( - content, - self.service_pubkey, - self.account_private_key_hex, - ) - encryption = NWC_ENCRYPTION_NIP04 - logger.debug( - "Encrypted NWC payload. " f"encryption={encryption} ciphertext={encrypted}" - ) - return encrypted, encryption - - def _decrypt_event_content(self, event: dict[str, Any]) -> str: - encryption = self._get_event_encryption(event) - logger.debug( - "Decrypting NWC event. " - f"kind={event.get('kind')} id={event.get('id')} " - f"encryption={encryption} tags={event.get('tags', [])} " - f"ciphertext={event.get('content')}" - ) - if encryption == NWC_ENCRYPTION_NIP44_V2: - plaintext = NIP44Encryption.decrypt( - event["content"], self.service_pubkey, self.account_private_key_hex - ) - else: - plaintext = decrypt_content( - event["content"], - self.service_pubkey, - self.account_private_key_hex, - ) - logger.debug( - "Decrypted NWC event. " - f"kind={event.get('kind')} id={event.get('id')} " - f"encryption={encryption} plaintext={plaintext}" - ) - return plaintext - async def call(self, method: str, params: dict) -> dict: """ Call a NWC method. @@ -1285,45 +673,40 @@ class NWCConnection: "params": params, } ) - content, encryption = self._encrypt_payload(content) - # Prepare the NWC event - tags = [["p", self.service_pubkey_hex]] - if encryption != NWC_ENCRYPTION_NIP04 or self.advertises_encryption_tag: - tags.append(["encryption", encryption]) - logger.debug( - "Using NWC provider encryption for request. " - f"method={method} encryption={encryption} tags={tags}" + # Encrypt + content = encrypt_content( + content, self.service_pubkey, self.account_private_key_hex ) + # Prepare the NWC event event = { "kind": 23194, "content": content, "created_at": int(time.time()), - "tags": tags, + "tags": [["p", self.service_pubkey_hex]], } # Sign sign_event(event, self.account_public_key_hex, self.account_private_key) # Subscribe for a response to this event sub_filter = { "kinds": [23195], - "authors": [self.service_pubkey_hex], "#p": [self.account_public_key_hex], "#e": [event["id"]], "since": event["created_at"], + "authors": [self.service_pubkey_hex], } sub_id = self._get_new_subid() # register a future to receive the response asynchronously future = asyncio.get_event_loop().create_future() - event_id = cast(str, event["id"]) # Check if the subscription already exists # (this means there is a bug somewhere, should not happen) - if event_id in self.subscriptions: + if event["id"] in self.subscriptions: raise Exception("Subscription for this event id already exists?") # Store the subscription in the list - self.subscriptions[event_id] = { + self.subscriptions[event["id"]] = { "method": method, "future": future, "sub_id": sub_id, - "event_id": event_id, + "event_id": event["id"], "timestamp": time.time(), "closed": False, } @@ -1360,32 +743,22 @@ class NWCConnection: await self._send(["REQ", sub_id, sub_filter]) # Wait for the response service_info = await future - service_info = self._apply_capabilities(service_info) # Get account info when possible - if self.supports_method("get_info"): + if "get_info" in service_info["supported_methods"]: try: account_info = await self.call("get_info", {}) # cache - info: dict[str, Any] = dict(service_info) - info["alias"] = account_info.get("alias", "") - info["color"] = account_info.get("color", "") - info["pubkey"] = account_info.get("pubkey", "") - info["network"] = account_info.get("network", "") - info["block_height"] = account_info.get("block_height", 0) - info["block_hash"] = account_info.get("block_hash", "") - info["supported_methods"] = account_info.get( + self.info = service_info + self.info["alias"] = account_info.get("alias", "") + self.info["color"] = account_info.get("color", "") + self.info["pubkey"] = account_info.get("pubkey", "") + self.info["network"] = account_info.get("network", "") + self.info["block_height"] = account_info.get("block_height", 0) + self.info["block_hash"] = account_info.get("block_hash", "") + self.info["supported_methods"] = account_info.get( "methods", service_info.get("supported_methods", ["pay_invoice"]), ) - info["notification_types"] = account_info.get( - "notifications", - service_info.get("notification_types", []), - ) - info["supported_encryptions"] = service_info.get( - "supported_encryptions", - [NWC_ENCRYPTION_NIP04], - ) - self.info = self._apply_capabilities(info) except Exception as e: # If there is an error, fallback to using service info logger.error( @@ -1403,14 +776,10 @@ class NWCConnection: # The error could mean that the service provider does # not provide an info note # So we just assume it supports the bare minimum to be Nip47 compliant - self.info = self._apply_capabilities( - { - "supported_methods": ["pay_invoice"], - "notification_types": [], - "supported_encryptions": [NWC_ENCRYPTION_NIP04], - } - ) - return self.info or {} + self.info = { + "supported_methods": ["pay_invoice"], + } + return self.info async def close(self): logger.debug("Closing NWCConnection") @@ -1424,11 +793,6 @@ class NWCConnection: self.connection_task.cancel() except Exception as e: logger.warning("Error cancelling connection task: " + str(e)) - for sub_id in list(self.notification_subscription_ids): - try: - await self._send(["CLOSE", sub_id]) - except Exception as e: - logger.warning("Error closing notification subscription: " + str(e)) # close the websocket try: if self.ws: @@ -1467,148 +831,3 @@ def parse_nwc(nwc) -> dict: else: raise ValueError("Invalid NWC pairing url") return data - - -class NIP44Encryption: - @staticmethod - def encrypt( - content: str, - service_pubkey: PublicKey, - account_private_key_hex: str, - ) -> str: - conversation_key = NIP44Encryption._get_conversation_key( - service_pubkey, - account_private_key_hex, - ) - nonce = secrets.token_bytes(32) - chacha_key, chacha_nonce, hmac_key = NIP44Encryption._get_message_keys( - conversation_key, - nonce, - ) - padded = NIP44Encryption._pad(content) - ciphertext = ChaCha20.new(key=chacha_key, nonce=chacha_nonce).encrypt(padded) - mac = HMAC.new(hmac_key, digestmod=SHA256) - mac.update(nonce + ciphertext) - payload = bytes([2]) + nonce + ciphertext + mac.digest() - return base64.b64encode(payload).decode("ascii") - - @staticmethod - def decrypt( - content: str, - service_pubkey: PublicKey, - account_private_key_hex: str, - ) -> str: - if not content or content[0] == "#": - raise ValueError("unknown encryption version") - raw = base64.b64decode(content.encode("ascii")) - if len(raw) < 99 or len(raw) > 65603: - raise ValueError("invalid data size") - version = raw[0] - if version != 2: - raise ValueError(f"unknown version {version}") - nonce = raw[1:33] - ciphertext = raw[33:-32] - mac = raw[-32:] - conversation_key = NIP44Encryption._get_conversation_key( - service_pubkey, - account_private_key_hex, - ) - chacha_key, chacha_nonce, hmac_key = NIP44Encryption._get_message_keys( - conversation_key, - nonce, - ) - expected_mac = HMAC.new(hmac_key, digestmod=SHA256) - expected_mac.update(nonce + ciphertext) - if not hmac.compare_digest(expected_mac.digest(), mac): - raise ValueError("invalid MAC") - padded = ChaCha20.new(key=chacha_key, nonce=chacha_nonce).decrypt(ciphertext) - return NIP44Encryption._unpad(padded) - - @staticmethod - def _get_shared_x( - service_pubkey: PublicKey, - account_private_key_hex: str, - ) -> bytes: - return service_pubkey.multiply(bytes.fromhex(account_private_key_hex)).format()[ - 1: - ] - - @staticmethod - def _hkdf_extract(*, ikm: bytes, salt: bytes) -> bytes: - return hmac.new(salt, ikm, hashlib.sha256).digest() - - @staticmethod - def _hkdf_expand(*, prk: bytes, info: bytes, length: int) -> bytes: - output = bytearray() - previous = b"" - counter = 1 - while len(output) < length: - previous = hmac.new( - prk, - previous + info + bytes([counter]), - hashlib.sha256, - ).digest() - output.extend(previous) - counter += 1 - return bytes(output[:length]) - - @staticmethod - def _get_conversation_key( - service_pubkey: PublicKey, - account_private_key_hex: str, - ) -> bytes: - return NIP44Encryption._hkdf_extract( - ikm=NIP44Encryption._get_shared_x(service_pubkey, account_private_key_hex), - salt=b"nip44-v2", - ) - - @staticmethod - def _calc_padded_len(unpadded_len: int) -> int: - if unpadded_len <= 32: - return 32 - next_power = 1 << ((unpadded_len - 1).bit_length()) - chunk = 32 if next_power <= 256 else next_power // 8 - return chunk * (((unpadded_len - 1) // chunk) + 1) - - @staticmethod - def _pad(content: str) -> bytes: - plaintext = content.encode("utf-8") - plaintext_len = len(plaintext) - if plaintext_len < 1 or plaintext_len > 65535: - raise ValueError("invalid plaintext length") - padded_len = NIP44Encryption._calc_padded_len(plaintext_len) - return ( - plaintext_len.to_bytes(2, "big") - + plaintext - + bytes(padded_len - plaintext_len) - ) - - @staticmethod - def _unpad(padded: bytes) -> str: - if len(padded) < 34: - raise ValueError("invalid padded payload size") - plaintext_len = int.from_bytes(padded[:2], "big") - plaintext = padded[2 : 2 + plaintext_len] - expected_len = 2 + NIP44Encryption._calc_padded_len(plaintext_len) - if ( - plaintext_len < 1 - or len(plaintext) != plaintext_len - or len(padded) != expected_len - ): - raise ValueError("invalid padding") - return plaintext.decode("utf-8") - - @staticmethod - def _get_message_keys( - conversation_key: bytes, nonce: bytes - ) -> tuple[bytes, bytes, bytes]: - if len(conversation_key) != 32: - raise ValueError("invalid conversation_key length") - if len(nonce) != 32: - raise ValueError("invalid nonce length") - keys = NIP44Encryption._hkdf_expand( - prk=conversation_key, - info=nonce, - length=76, - ) - return keys[:32], keys[32:44], keys[44:76] diff --git a/lnbits/wallets/opennode.py b/lnbits/wallets/opennode.py index 95506c3c6..f05349746 100644 --- a/lnbits/wallets/opennode.py +++ b/lnbits/wallets/opennode.py @@ -15,7 +15,6 @@ from .base import ( PaymentStatus, StatusResponse, Wallet, - payment_request_was_rejected, ) @@ -101,38 +100,24 @@ class OpenNodeWallet(Wallet): ) async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: - try: - r = await self.client.post( - "/v2/withdrawals", - json={"type": "ln", "address": bolt11}, - timeout=None, - ) + r = await self.client.post( + "/v2/withdrawals", + json={"type": "ln", "address": bolt11}, + timeout=None, + ) - if r.is_error: - error_message = r.json().get("message", r.text) - logger.warning(error_message) - return PaymentResponse( - ok=(False if payment_request_was_rejected(r.status_code) else None), - error_message=error_message, - ) + if r.is_error: + error_message = r.json()["message"] + logger.warning(error_message) + return PaymentResponse(ok=None, error_message=error_message) - data = r.json()["data"] - checking_id = data.get("id") - fee = data.get("fee") - fee_msat = -fee * 1000 if fee is not None else None - status = str(data.get("status", "")).lower() - if status in {"paid", "confirmed"}: - return PaymentResponse( - ok=True, checking_id=checking_id, fee_msat=fee_msat - ) - if status in {"error", "failed"}: - return PaymentResponse( - ok=False, checking_id=checking_id, fee_msat=fee_msat - ) + data = r.json()["data"] + checking_id = data["id"] + fee_msat = -data["fee"] * 1000 + # pending + if data["status"] != "paid": return PaymentResponse(ok=None, checking_id=checking_id, fee_msat=fee_msat) - except Exception as exc: - logger.warning(exc) - return PaymentResponse(error_message="Invalid OpenNode payment response.") + return PaymentResponse(ok=True, checking_id=checking_id, fee_msat=fee_msat) async def get_invoice_status(self, checking_id: str) -> PaymentStatus: r = await self.client.get(f"/v1/charge/{checking_id}") @@ -143,26 +128,22 @@ class OpenNodeWallet(Wallet): return PaymentStatus(statuses[data.get("status")]) async def get_payment_status(self, checking_id: str) -> PaymentStatus: - try: - r = await self.client.get(f"/v1/withdrawal/{checking_id}") - if r.is_error: - return PaymentPendingStatus() + r = await self.client.get(f"/v1/withdrawal/{checking_id}") - data = r.json()["data"] - statuses = { - "initial": None, - "pending": None, - "confirmed": True, - "error": False, - "failed": False, - } - fee = data.get("fee") - fee_msat = -fee * 1000 if fee is not None else None - return PaymentStatus(statuses.get(data.get("status")), fee_msat) - except Exception as exc: - logger.warning(exc) + if r.is_error: return PaymentPendingStatus() + data = r.json()["data"] + statuses = { + "initial": None, + "pending": None, + "confirmed": True, + "error": None, + "failed": False, + } + fee_msat = -data.get("fee") * 1000 + return PaymentStatus(statuses[data.get("status")], fee_msat) + async def paid_invoices_stream(self) -> AsyncGenerator[str, None]: self.queue: asyncio.Queue = asyncio.Queue(0) while settings.lnbits_running: diff --git a/lnbits/wallets/phoenixd.py b/lnbits/wallets/phoenixd.py index e386855a0..e79346228 100644 --- a/lnbits/wallets/phoenixd.py +++ b/lnbits/wallets/phoenixd.py @@ -98,24 +98,6 @@ class PhoenixdWallet(Wallet): logger.warning(exc) return StatusResponse(f"Unable to connect to {self.endpoint}.", 0) - async def _incoming_preimage(self, payment_hash: str) -> str | None: - """Fetch preimage from Phoenixd incoming payment (createinvoice omits it).""" - try: - r = await self.client.get( - f"/payments/incoming/{payment_hash}", - timeout=40, - ) - if r.is_error: - return None - return r.json().get("preimage") or None - except Exception as exc: - logger.warning( - "Phoenixd: could not fetch preimage for %s: %s", - payment_hash, - exc, - ) - return None - async def create_invoice( self, amount: int, @@ -135,12 +117,11 @@ class PhoenixdWallet(Wallet): # PhoenixD description limited to 128 characters if description_hash: data["descriptionHash"] = description_hash.hex() - elif unhashed_description: - data["descriptionHash"] = hashlib.sha256( - unhashed_description - ).hexdigest() else: - desc = memo or "" + desc = memo + if desc is None and unhashed_description: + desc = unhashed_description.decode() + desc = desc or "" if len(desc) > 128: data["descriptionHash"] = hashlib.sha256(desc.encode()).hexdigest() else: @@ -165,10 +146,7 @@ class PhoenixdWallet(Wallet): checking_id = data["paymentHash"] payment_request = data["serialized"] - # Phoenixd createinvoice often omits paymentPreimage. - preimage = data.get("paymentPreimage") or await self._incoming_preimage( - checking_id - ) + preimage = data.get("paymentPreimage", None) # if available return InvoiceResponse( ok=True, checking_id=checking_id, @@ -208,11 +186,11 @@ class PhoenixdWallet(Wallet): logger.warning(msg) return PaymentResponse(ok=None, error_message=msg) except RequestError as exc: - # RequestError can also be raised after the server received the request. + # RequestError is raised when the request never hit the destination server msg = f"Unable to connect to {self.endpoint}." logger.warning(msg) logger.warning(exc) - return PaymentResponse(ok=None, error_message=msg) + return PaymentResponse(ok=False, error_message=msg) except Exception as exc: logger.warning(exc) return PaymentResponse( diff --git a/lnbits/wallets/spark.py b/lnbits/wallets/spark.py index 34b68b077..90dcc05e0 100644 --- a/lnbits/wallets/spark.py +++ b/lnbits/wallets/spark.py @@ -162,16 +162,11 @@ class SparkWallet(Wallet): ) except (SparkError, UnknownError) as exc: - try: - listpays = await self.listpays(bolt11) - except (SparkError, UnknownError): - return PaymentResponse(error_message=str(exc)) + listpays = await self.listpays(bolt11) if not listpays: - return PaymentResponse(error_message=str(exc)) + return PaymentResponse(ok=False, error_message=str(exc)) - pays = listpays.get("pays") - if not isinstance(pays, list): - return PaymentResponse(error_message=str(exc)) + pays = listpays["pays"] if len(pays) == 0: return PaymentResponse(ok=False, error_message=str(exc)) @@ -180,12 +175,10 @@ class SparkWallet(Wallet): payment_hash = pay["payment_hash"] if len(pays) > 1: - return PaymentResponse( - error_message=( - f"listpays({payment_hash}) returned an unexpected response:" - f" {listpays}" - ) - ) + raise SparkError( + f"listpays({payment_hash}) returned an unexpected response:" + f" {listpays}" + ) from exc if pay["status"] == "failed": return PaymentResponse(ok=False, error_message=str(exc)) @@ -210,7 +203,7 @@ class SparkWallet(Wallet): preimage=preimage, ) else: - return PaymentResponse(error_message=str(exc)) + return PaymentResponse(ok=False, error_message=str(exc)) async def get_invoice_status(self, checking_id: str) -> PaymentStatus: try: @@ -221,12 +214,10 @@ class SparkWallet(Wallet): if not r or not r.get("invoices"): return PaymentPendingStatus() - status = r["invoices"][0]["status"] - if status == "paid": + if r["invoices"][0]["status"] == "paid": return PaymentSuccessStatus() - if status == "expired": + else: return PaymentFailedStatus() - return PaymentPendingStatus() async def get_payment_status(self, checking_id: str) -> PaymentStatus: # check if it's 32 bytes hex @@ -258,8 +249,7 @@ class SparkWallet(Wallet): if status == "failed": return PaymentFailedStatus() return PaymentPendingStatus() - logger.warning(f"supplied an invalid checking_id: {checking_id}") - return PaymentPendingStatus() + raise KeyError("supplied an invalid checking_id") async def paid_invoices_stream(self) -> AsyncGenerator[str, None]: url = f"/stream?access-key={self.token}" diff --git a/lnbits/wallets/sparkl2.py b/lnbits/wallets/sparkl2.py index ea1370beb..e565fa884 100644 --- a/lnbits/wallets/sparkl2.py +++ b/lnbits/wallets/sparkl2.py @@ -1,7 +1,6 @@ import asyncio import hashlib import json -import secrets import uuid from collections.abc import AsyncGenerator from pathlib import Path @@ -9,6 +8,7 @@ from typing import Any, cast import httpx from bolt11 import decode as bolt11_decode +from coincurve.keys import PrivateKey from embit.bip39 import mnemonic_from_bytes, mnemonic_is_valid from loguru import logger @@ -159,9 +159,10 @@ class SparkL2Wallet(Wallet): "payment_hash": payment_hash, } res = await self._request("POST", "/v1/payments", payload) - checking_id = res.get("checking_id") + checking_id = payment_hash or res.get("checking_id") if not checking_id: return PaymentResponse( + ok=False, error_message="Spark sidecar payment response missing checking_id.", ) status = res.get("status") @@ -177,7 +178,7 @@ class SparkL2Wallet(Wallet): ) except Exception as e: - return PaymentResponse(error_message=str(e)) + return PaymentResponse(ok=False, error_message=str(e)) async def get_invoice_status(self, checking_id: str) -> PaymentStatus: try: @@ -339,7 +340,7 @@ class SparkL2Wallet(Wallet): return logger.info("SPARK_L2_MNEMONIC is not set, one will be generated for you.") - mnemonic = mnemonic_from_bytes(secrets.token_bytes(16)) + mnemonic = mnemonic_from_bytes(PrivateKey().secret) await self._set_sidecar_mnemonic(mnemonic) async def _set_sidecar_mnemonic(self, mnemonic: str): diff --git a/lnbits/wallets/strike.py b/lnbits/wallets/strike.py index aa2b0170d..8fbbb7e1c 100644 --- a/lnbits/wallets/strike.py +++ b/lnbits/wallets/strike.py @@ -237,59 +237,50 @@ class StrikeWallet(Wallet): ok=False, error_message=f"Invalid invoice: {decode_exc!s}" ) - # Creating a quote cannot make the payment. Any failure before the execute - # request is therefore a definite failure of this payment attempt. try: + # 1) Create a payment quote quote_id, error = await self._create_payment_quote(bolt11) if error or not quote_id: return PaymentResponse(ok=False, error_message=error or "Unknown error") - except Exception as exc: - logger.warning(f"Strike quote creation exception: {exc}", exc_info=True) - return PaymentResponse( - ok=False, - error_message=f"Failed to create payment quote: {exc!s}", - ) - - try: - # Keep the quote id while this process is running. Strike only documents - # payment status lookup by payment id, which an ambiguous execute request - # may not return. - self.pending_payments[payment_hash] = quote_id + # 2) Execute the payment quote data, error = await self._execute_payment_quote(quote_id) if error or not data: - return PaymentResponse(error_message=error or "Unknown error") + return PaymentResponse(ok=False, error_message=error or "Unknown error") state = data.get("state", "").upper() payment_id = data.get("paymentId") - checking_id = payment_id or payment_hash # Parse fee - fee_msat = self._parse_payment_fee(data, checking_id) + fee_msat = self._parse_payment_fee(data, payment_id or "") # Handle successful payment if state in {"SUCCEEDED", "COMPLETED"}: preimage = self._extract_preimage(data) return PaymentResponse( ok=True, - checking_id=checking_id, + checking_id=payment_hash, fee_msat=fee_msat, preimage=preimage, ) # Handle failed payment - if state == "FAILED": + failed_states = {"CANCELED", "FAILED", "TIMED_OUT"} + if state in failed_states: logger.warning( f"Strike payment {payment_id} failed with state: {state}" ) return PaymentResponse( ok=False, - checking_id=checking_id, + checking_id=payment_hash, error_message=f"Payment {state.lower()}", ) + # Store mapping for later polling + self.pending_payments[payment_hash] = quote_id + # Treat all other states as pending - return PaymentResponse(ok=None, checking_id=payment_id) + return PaymentResponse(ok=None, checking_id=payment_hash) except httpx.HTTPStatusError as http_exc: logger.warning(f"Strike HTTP error during payment: {http_exc}") @@ -298,6 +289,7 @@ class StrikeWallet(Wallet): f"body: {http_exc.response.text}" ) return PaymentResponse( + ok=False, error_message=f"Strike API error: {http_exc.response.status_code}", ) except Exception as e: @@ -351,8 +343,7 @@ class StrikeWallet(Wallet): quote_id = self.pending_payments.get(checking_id) try: - # A quote id can only be associated with an invoice hash while this - # process is running. Persisted payment ids are checked below. + # Attempt 1: Use quote_id if available (from in-memory store) if quote_id: status = await self._get_payment_status_by_quote_id( checking_id, quote_id @@ -536,8 +527,10 @@ class StrikeWallet(Wallet): return None, error_msg data = e.json() if e.content else {} - if not data.get("paymentId"): + payment_id = data.get("paymentId") + if not payment_id: logger.warning(f"Strike: missing paymentId in response: {data}") + return None, "Strike: missing paymentId in response" return data, None @@ -636,7 +629,7 @@ class StrikeWallet(Wallet): self.pending_payments.pop(checking_id, None) return PaymentFailedStatus() - return PaymentPendingStatus() + return None async def _get_payment_status_by_checking_id( # noqa: C901 self, checking_id: str @@ -700,28 +693,16 @@ class StrikeWallet(Wallet): continue logger.warning( f"Payment '{checking_id}' not a valid Strike payment. " - "Keeping pending because it may be the invoice payment " - f"hash fallback. Response: {r_payment.text}" + f"Marked as failed. Response: {r_payment.text}" ) - return PaymentPendingStatus() + self.pending_payments.pop(checking_id, None) + return PaymentFailedStatus() except Exception as e: logger.warning(e) return PaymentPendingStatus() if r_payment.status_code == 404: - if len(checking_id) == 64: - try: - bytes.fromhex(checking_id) - logger.warning( - f"Payment '{checking_id}' not found, but the identifier may " - "be a legacy invoice payment hash. Keeping pending." - ) - return PaymentPendingStatus() - except ValueError as exc: - logger.warning( - f"Payment identifier '{checking_id}' is not valid hex: {exc}" - ) logger.warning(f"Payment {checking_id} not found. Marking as failed.") self.pending_payments.pop(checking_id, None) return PaymentFailedStatus() diff --git a/lnbits/wallets/void.py b/lnbits/wallets/void.py index ca38dc215..6d2ac9f4e 100644 --- a/lnbits/wallets/void.py +++ b/lnbits/wallets/void.py @@ -1,3 +1,5 @@ +from collections.abc import AsyncGenerator + from loguru import logger from .base import ( @@ -38,3 +40,6 @@ class VoidWallet(Wallet): async def get_payment_status(self, *_, **__) -> PaymentStatus: return PaymentPendingStatus() + + async def paid_invoices_stream(self) -> AsyncGenerator[str, None]: + yield "" diff --git a/lnbits/wallets/zbd.py b/lnbits/wallets/zbd.py index f6747abb3..1377e0db8 100644 --- a/lnbits/wallets/zbd.py +++ b/lnbits/wallets/zbd.py @@ -3,6 +3,7 @@ import hashlib from collections.abc import AsyncGenerator import httpx +from bolt11 import decode as bolt11_decode from loguru import logger from lnbits.helpers import normalize_endpoint @@ -15,7 +16,6 @@ from .base import ( PaymentStatus, StatusResponse, Wallet, - payment_request_was_rejected, ) @@ -105,62 +105,30 @@ class ZBDWallet(Wallet): async def pay_invoice(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse: # https://api.zebedee.io/v0/payments - try: - r = await self.client.post( - "payments", - json={ - "invoice": bolt11, - "description": "", - "amount": "", - "internalId": "", - "callbackUrl": "", - }, - timeout=40, - ) - except Exception as exc: - logger.warning(exc) - return PaymentResponse(error_message="Unable to query ZBD.") + r = await self.client.post( + "payments", + json={ + "invoice": bolt11, + "description": "", + "amount": "", + "internalId": "", + "callbackUrl": "", + }, + timeout=40, + ) if r.is_error: - try: - error_message = r.json().get("message", r.text) - except Exception: - error_message = r.text - return PaymentResponse( - ok=False if payment_request_was_rejected(r.status_code) else None, - error_message=error_message, - ) + error_message = r.json()["message"] + return PaymentResponse(ok=False, error_message=error_message) - try: - data = r.json()["data"] - checking_id = data.get("id") - fee = data.get("fee") - fee_msat = -int(fee) if fee is not None else None - preimage = data.get("preimage") - status = str(data.get("status", "")).lower() - except Exception as exc: - logger.warning(exc) - return PaymentResponse(error_message="Invalid ZBD payment response.") + data = r.json() + + checking_id = bolt11_decode(bolt11).payment_hash + fee_msat = -int(data["data"]["fee"]) + preimage = data["data"]["preimage"] - if status == "completed": - return PaymentResponse( - ok=True, - checking_id=checking_id, - fee_msat=fee_msat, - preimage=preimage, - ) - if status in {"failed", "expired"}: - return PaymentResponse( - ok=False, - checking_id=checking_id, - fee_msat=fee_msat, - error_message=data.get("errorMessage"), - ) return PaymentResponse( - ok=None, - checking_id=checking_id, - fee_msat=fee_msat, - error_message=data.get("errorMessage"), + ok=True, checking_id=checking_id, fee_msat=fee_msat, preimage=preimage ) async def get_invoice_status(self, checking_id: str) -> PaymentStatus: @@ -179,20 +147,11 @@ class ZBDWallet(Wallet): return PaymentStatus(paid=statuses[data.get("status")]) async def get_payment_status(self, checking_id: str) -> PaymentStatus: - try: - r = await self.client.get(f"payments/{checking_id}") - except Exception as exc: - logger.warning(exc) - return PaymentPendingStatus() - + r = await self.client.get(f"payments/{checking_id}") if r.is_error: return PaymentPendingStatus() - try: - data = r.json()["data"] - except Exception as exc: - logger.warning(exc) - return PaymentPendingStatus() + data = r.json()["data"] statuses = { "initial": None, @@ -202,7 +161,8 @@ class ZBDWallet(Wallet): "expired": False, "failed": False, } - return PaymentStatus(paid=statuses.get(data.get("status"))) + + return PaymentStatus(paid=statuses[data.get("status")]) async def paid_invoices_stream(self) -> AsyncGenerator[str, None]: self.queue: asyncio.Queue = asyncio.Queue(0) diff --git a/package-lock.json b/package-lock.json index c7b03269c..7291a746f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,12 +6,12 @@ "": { "name": "lnbits", "dependencies": { - "axios": "^1.18.0", + "axios": "^1.16.0", "chart.js": "^4.5.1", "moment": "^2.30.1", "nostr-tools": "^2.23.3", "qrcode.vue": "^3.9.0", - "quasar": "2.22.0", + "quasar": "2.19.3", "showdown": "^2.1.0", "underscore": "^1.13.8", "vue": "3.5.34", @@ -21,7 +21,6 @@ "vuex": "4.1.0" }, "devDependencies": { - "@playwright/test": "^1.61.0", "clean-css-cli": "^5.6.3", "concat": "^1.0.3", "prettier": "^3.8.3", @@ -577,22 +576,6 @@ "node": ">=0.10" } }, - "node_modules/@playwright/test": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz", - "integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.61.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@scure/base": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.0.0.tgz", @@ -801,18 +784,6 @@ "node": ">=0.4.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -866,14 +837,13 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz", - "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, @@ -1119,23 +1089,6 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1262,16 +1215,16 @@ } }, "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" @@ -1419,9 +1372,9 @@ } }, "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -1436,23 +1389,10 @@ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", "license": "MIT" }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "dev": true, "license": "MIT" }, @@ -1682,12 +1622,6 @@ "node": "*" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, "node_modules/muggle-string": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", @@ -1695,9 +1629,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -1820,57 +1754,10 @@ "pathe": "^2.0.3" } }, - "node_modules/playwright": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", - "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.61.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", - "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/postcss": { - "version": "8.5.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", - "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", "funding": [ { "type": "opencollective", @@ -1887,7 +1774,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.16", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -1963,9 +1850,9 @@ "license": "MIT" }, "node_modules/quasar": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.22.0.tgz", - "integrity": "sha512-0WAJ0ZnNMWK7QNFnpOVLyUDeEZ6cexkO+f7GjOEEIITIynH2xkfuryWO97Pa/G/+eQJc0ZwX9GohEXXwYTIBew==", + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.19.3.tgz", + "integrity": "sha512-z9uEiZfpkkwUGedgVfARRoF7h30qWSZwUfUTLOo/jXCiGL5KYQt5N39XpKVOW0Y7lGF9kSAZuFHvYoPZoMUpfg==", "license": "MIT", "engines": { "node": ">= 10.18.1", diff --git a/package.json b/package.json index 19a314a46..105e42d78 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,9 @@ "vendor_minify_css": "./node_modules/.bin/cleancss -o ./lnbits/static/bundle.min.css ./lnbits/static/bundle.css", "vendor_minify_js": "./node_modules/.bin/terser ./lnbits/static/bundle.js -o ./lnbits/static/bundle.min.js --compress --mangle", "vendor_minify_components": "./node_modules/.bin/terser ./lnbits/static/bundle-components.js -o ./lnbits/static/bundle-components.min.js --compress --mangle", - "bundle": "npm run sass && npm run vendor_copy && npm run vendor_json && npm run vendor_bundle_css && npm run vendor_bundle_js && npm run vendor_bundle_components && npm run vendor_minify_css && npm run vendor_minify_js && npm run vendor_minify_components", - "test:e2e": "playwright test --config tests/e2e/playwright.config.ts" + "bundle": "npm run sass && npm run vendor_copy && npm run vendor_json && npm run vendor_bundle_css && npm run vendor_bundle_js && npm run vendor_bundle_components && npm run vendor_minify_css && npm run vendor_minify_js && npm run vendor_minify_components" }, "devDependencies": { - "@playwright/test": "^1.61.0", "clean-css-cli": "^5.6.3", "concat": "^1.0.3", "prettier": "^3.8.3", @@ -23,12 +21,12 @@ "terser": "^5.47.1" }, "dependencies": { - "axios": "^1.18.0", + "axios": "^1.16.0", "chart.js": "^4.5.1", "moment": "^2.30.1", "nostr-tools": "^2.23.3", "qrcode.vue": "^3.9.0", - "quasar": "2.22.0", + "quasar": "2.19.3", "showdown": "^2.1.0", "underscore": "^1.13.8", "vue": "3.5.34", @@ -88,7 +86,6 @@ "i18n/sk.js", "i18n/kr.js", "i18n/fi.js", - "i18n/fo.js", "js/utils.js", "js/api.js", "js/globals.js", @@ -114,7 +111,6 @@ "js/pages/users.js", "js/pages/account.js", "js/pages/admin.js", - "js/components/admin/lnbits-admin-funding-seed-backup.js", "js/components/admin/lnbits-admin-funding.js", "js/components/admin/lnbits-admin-funding-sources.js", "js/components/admin/lnbits-admin-fiat-providers.js", @@ -123,14 +119,10 @@ "js/components/admin/lnbits-admin-users.js", "js/components/admin/lnbits-admin-server.js", "js/components/admin/lnbits-admin-extensions.js", - "js/components/admin/lnbits-admin-wasm-runtime.js", - "js/components/admin/lnbits-admin-wasm-limit-config.js", "js/components/admin/lnbits-admin-notifications.js", "js/components/admin/lnbits-admin-site-customisation.js", "js/components/admin/lnbits-admin-assets-config.js", "js/components/admin/lnbits-admin-audit.js", - "js/components/admin/lnbits-admin-blockexplorer.js", - "js/pages/blockexplorer.js", "js/components/lnbits-wallet-charts.js", "js/components/lnbits-wallet-api-docs.js", "js/components/lnbits-wallet-icon.js", @@ -150,7 +142,6 @@ "js/components/lnbits-theme.js", "js/components/lnbits-qrcode-scanner.js", "js/components/lnbits-manage-extension-list.js", - "js/components/lnbits-extension-permissions.js", "js/components/lnbits-manage-wallet-list.js", "js/components/lnbits-language-dropdown.js", "js/components/lnbits-payment-list.js", @@ -158,7 +149,6 @@ "js/components/extension-settings.js", "js/components/data-fields.js", "js/components.js", - "js/wasm-extension-component.js", "js/init-app.js" ], "css": [ diff --git a/poetry.lock b/poetry.lock index 2a9a66ebb..71b386119 100644 --- a/poetry.lock +++ b/poetry.lock @@ -665,19 +665,6 @@ bitstring = "*" click = "*" coincurve = "*" -[[package]] -name = "boltz-client" -version = "0.4.0" -description = "Boltz Swap library" -optional = true -python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"liquid\"" -files = [ - {file = "boltz_client-0.4.0-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:ed0b520209cf1b05a8523002f5d8f26fa29c04d2faecc9cbde3621b4ddc417e6"}, - {file = "boltz_client-0.4.0.tar.gz", hash = "sha256:a3f5a6b637350267856e3ab680cd92158de720fa2d5805fc075e4583d020cb2a"}, -] - [[package]] name = "breez-sdk" version = "0.8.0" @@ -1633,7 +1620,7 @@ version = "3.3.2" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.10" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "greenlet-3.3.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9bc885b89709d901859cf95179ec9f6bb67a3d2bb1f0e88456461bd4b7f8fd0d"}, {file = "greenlet-3.3.2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b568183cf65b94919be4438dc28416b234b678c608cafac8874dfeeb2a9bbe13"}, @@ -2853,99 +2840,103 @@ tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] [[package]] name = "pillow" -version = "12.3.0" +version = "12.1.1" description = "Python Imaging Library (fork)" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pillow-12.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a"}, - {file = "pillow-12.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7"}, - {file = "pillow-12.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f"}, - {file = "pillow-12.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec"}, - {file = "pillow-12.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468"}, - {file = "pillow-12.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed"}, - {file = "pillow-12.3.0-cp310-cp310-win32.whl", hash = "sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1"}, - {file = "pillow-12.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb"}, - {file = "pillow-12.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f"}, - {file = "pillow-12.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756"}, - {file = "pillow-12.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6"}, - {file = "pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd"}, - {file = "pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd"}, - {file = "pillow-12.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c"}, - {file = "pillow-12.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5"}, - {file = "pillow-12.3.0-cp311-cp311-win32.whl", hash = "sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b"}, - {file = "pillow-12.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a"}, - {file = "pillow-12.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26"}, - {file = "pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965"}, - {file = "pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7"}, - {file = "pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9"}, - {file = "pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91"}, - {file = "pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c"}, - {file = "pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df"}, - {file = "pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f"}, - {file = "pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09"}, - {file = "pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510"}, - {file = "pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89"}, - {file = "pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace"}, - {file = "pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec"}, - {file = "pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66"}, - {file = "pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35"}, - {file = "pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65"}, - {file = "pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3"}, - {file = "pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a"}, - {file = "pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e"}, - {file = "pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f"}, - {file = "pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8"}, - {file = "pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b"}, - {file = "pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330"}, - {file = "pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217"}, - {file = "pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930"}, - {file = "pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8"}, - {file = "pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0"}, - {file = "pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321"}, - {file = "pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b"}, - {file = "pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198"}, - {file = "pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130"}, - {file = "pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a"}, - {file = "pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d"}, - {file = "pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838"}, - {file = "pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e"}, - {file = "pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17"}, - {file = "pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385"}, - {file = "pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c"}, - {file = "pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d"}, - {file = "pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931"}, - {file = "pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7"}, - {file = "pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c"}, - {file = "pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45"}, - {file = "pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139"}, - {file = "pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402"}, - {file = "pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c"}, - {file = "pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f"}, - {file = "pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701"}, - {file = "pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace"}, - {file = "pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4"}, - {file = "pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39"}, - {file = "pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71"}, - {file = "pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827"}, - {file = "pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5"}, - {file = "pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658"}, - {file = "pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf"}, - {file = "pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64"}, - {file = "pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e"}, - {file = "pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777"}, - {file = "pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1"}, - {file = "pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9"}, - {file = "pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8"}, - {file = "pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418"}, - {file = "pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59"}, - {file = "pillow-12.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468"}, - {file = "pillow-12.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94"}, - {file = "pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e"}, - {file = "pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3"}, - {file = "pillow-12.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a"}, - {file = "pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce"}, + {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, + {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4"}, + {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e"}, + {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff"}, + {file = "pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40"}, + {file = "pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23"}, + {file = "pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9"}, + {file = "pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32"}, + {file = "pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b"}, + {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5"}, + {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d"}, + {file = "pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c"}, + {file = "pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563"}, + {file = "pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80"}, + {file = "pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052"}, + {file = "pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0"}, + {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3"}, + {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35"}, + {file = "pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a"}, + {file = "pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6"}, + {file = "pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6"}, + {file = "pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60"}, + {file = "pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717"}, + {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a"}, + {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029"}, + {file = "pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b"}, + {file = "pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1"}, + {file = "pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a"}, + {file = "pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da"}, + {file = "pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13"}, + {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf"}, + {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524"}, + {file = "pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986"}, + {file = "pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c"}, + {file = "pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642"}, + {file = "pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd"}, + {file = "pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e"}, + {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0"}, + {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb"}, + {file = "pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f"}, + {file = "pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15"}, + {file = "pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f"}, + {file = "pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8"}, + {file = "pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586"}, + {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce"}, + {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8"}, + {file = "pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36"}, + {file = "pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b"}, + {file = "pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e"}, + {file = "pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4"}, ] [package.extras] @@ -2953,7 +2944,7 @@ docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybut fpx = ["olefile"] mic = ["olefile"] test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] -tests = ["coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "setuptools", "trove-classifiers (>=2024.10.12)"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] xmp = ["defusedxml"] [[package]] @@ -2968,28 +2959,6 @@ files = [ {file = "platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934"}, ] -[[package]] -name = "playwright" -version = "1.61.0" -description = "A high-level API to automate web browsers" -optional = false -python-versions = ">=3.10" -groups = ["dev"] -files = [ - {file = "playwright-1.61.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:ff138c3a604f69911e9d42fd036e55c2a171e5616edf04c1e7f60a2a285540b0"}, - {file = "playwright-1.61.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:009588c2a7e499bc5a8b425b61fa65490968bbda9cd69e0cf2cff10f8304659a"}, - {file = "playwright-1.61.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:9f7de4536088d12037c13a52b7ea34b59270b78926bb56935070597ffac6b1af"}, - {file = "playwright-1.61.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:54f3b39f6eab832e33458c1dd7da0b5682aedab3b09ae731b5c59fa12fd2024e"}, - {file = "playwright-1.61.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93454322ade8c11d5d6c211bfd91bdfb9ffb4810e3e026371bcbc4bec1b7ee4c"}, - {file = "playwright-1.61.0-py3-none-win32.whl", hash = "sha256:372d55a6f1248fa1dd47599686980cb8fb5bbe6fcda59eab793eb657c11d8a9b"}, - {file = "playwright-1.61.0-py3-none-win_amd64.whl", hash = "sha256:35c6cc4589a5d00964a59d7b3e59641e0aac0c02f15479a7af77d20f6bc79597"}, - {file = "playwright-1.61.0-py3-none-win_arm64.whl", hash = "sha256:e9fcbffcf557a8620fdedd92491eb59a32d18e23d6f3b4f6214b952be324fe51"}, -] - -[package.dependencies] -greenlet = ">=3.1.1,<4.0.0" -pyee = ">=13,<14" - [[package]] name = "pluggy" version = "1.6.0" @@ -3404,24 +3373,6 @@ typing-extensions = ">=4.2.0" dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] -[[package]] -name = "pyee" -version = "13.0.1" -description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pyee-13.0.1-py3-none-any.whl", hash = "sha256:af2f8fede4171ef667dfded53f96e2ed0d6e6bd7ee3bb46437f77e3b57689228"}, - {file = "pyee-13.0.1.tar.gz", hash = "sha256:0b931f7c14535667ed4c7e0d531716368715e860b988770fc7eb8578d1f67fc8"}, -] - -[package.dependencies] -typing-extensions = "*" - -[package.extras] -dev = ["black", "build", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "mypy", "pytest", "pytest-asyncio ; python_version >= \"3.4\"", "pytest-trio ; python_version >= \"3.7\"", "sphinx", "toml", "tox", "trio", "trio ; python_version > \"3.6\"", "trio-typing ; python_version > \"3.6\"", "twine", "twisted", "validate-pyproject[all]"] - [[package]] name = "pygments" version = "2.19.2" @@ -3954,18 +3905,6 @@ files = [ {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] -[[package]] -name = "random-username" -version = "1.0.2" -description = "Randomly generate compelling usernames." -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "random-username-1.0.2.tar.gz", hash = "sha256:5fdc0604b5d1bdfe4acf4cd7491a9de1caf41bbdd890f646b434e09ae2a1b7ce"}, - {file = "random_username-1.0.2-py3-none-any.whl", hash = "sha256:2536feb63fecde7e01ede4a541aadb6f0b58794a7ab327ca5369d2a4b7664c06"}, -] - [[package]] name = "referencing" version = "0.36.2" @@ -4381,14 +4320,14 @@ uvicorn = ["uvicorn (>=0.34.0)"] [[package]] name = "starlette" -version = "0.48.0" +version = "0.47.3" description = "The little ASGI library that shines." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659"}, - {file = "starlette-0.48.0.tar.gz", hash = "sha256:7e8cee469a8ab2352911528110ce9088fdc6a37d9876926e73da7ce4aa4c7a46"}, + {file = "starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51"}, + {file = "starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9"}, ] [package.dependencies] @@ -4787,31 +4726,6 @@ files = [ {file = "wallycore-1.5.2.tar.gz", hash = "sha256:352b7b215046d4fd0333a82dc4b3936b749e5b9ae22a078b991a6b10712b3748"}, ] -[[package]] -name = "wasmtime" -version = "46.0.1" -description = "A WebAssembly runtime powered by Wasmtime" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "wasmtime-46.0.1-py3-none-android_26_arm64_v8a.whl", hash = "sha256:cc8d52f9ad3bedc1e4de5002f7b22d7cac400be046711d177f6ce20a11eacb31"}, - {file = "wasmtime-46.0.1-py3-none-android_26_x86_64.whl", hash = "sha256:f8e4b0ec402b84b856d3c6c2f96c6e6889c56e685b5cfed0a4040775c751ca38"}, - {file = "wasmtime-46.0.1-py3-none-any.whl", hash = "sha256:85a092a63c20ccecb965b9aa12a19368d2e06203436d19701068efc390efa678"}, - {file = "wasmtime-46.0.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:9b46c546bf73ece2600403db7dc604c3ef12046ccf2fabe07d7bfaa00453ce8b"}, - {file = "wasmtime-46.0.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:de1a69573a173b5171f9413bcf0b88f4fed2721ed02c842fc25de5358730ccdf"}, - {file = "wasmtime-46.0.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:e53c65abe31aeeb19a3f794b6e53140d401c4c79ad91c89caefdc502ee2b10c1"}, - {file = "wasmtime-46.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:841b53fc17eedabaa6deb1e062a04a0a8953908d540fadb4149bc55c3f6d3e50"}, - {file = "wasmtime-46.0.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f295d10012b6ca6ecffa7757eed70b84ebaa2e33dc39275e7b6bed5eed5130b9"}, - {file = "wasmtime-46.0.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:05fc65164b4825bf1c3c8f007df070b25accc974cb81d0bfc1c5d76fdf6f70e0"}, - {file = "wasmtime-46.0.1-py3-none-win_amd64.whl", hash = "sha256:559b0753e3ea311fd16000fe51c08592a625e61ebb8640601ae7173fc516e430"}, - {file = "wasmtime-46.0.1-py3-none-win_arm64.whl", hash = "sha256:967625406fde8fc3c9d795ffbb7bdde77d0a38de776e8eb7a0416ca6d811a27a"}, - {file = "wasmtime-46.0.1.tar.gz", hash = "sha256:0da0388c21bc0f0e633c7a30f2b7939a657f5019258c9a3a63fd37298a0dbb8b"}, -] - -[package.extras] -testing = ["coverage", "pycparser", "pytest", "pytest-mypy"] - [[package]] name = "websocket-client" version = "1.9.0" @@ -5190,10 +5104,10 @@ propcache = ">=0.2.1" [extras] breez = ["breez-sdk", "breez-sdk-liquid"] -liquid = ["boltz-client", "wallycore"] +liquid = ["wallycore"] migration = ["psycopg2-binary"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "e41fd327115a1614f2e7b5dae7d7077e30f1cb723e1880a88132ec38df2b4b1a" +content-hash = "4050934800e6dfcc5242d1847d3db69eb6e91d634c09368a28255ad3c908b568" diff --git a/pyproject.toml b/pyproject.toml index 8258b8c23..e5db85de8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lnbits" -version = "1.6.0-rc2" +version = "1.5.5-rc2" requires-python = ">=3.10,<3.13" description = "LNbits, free and open-source Lightning wallet and accounts system." authors = [{ name = "Alan Bits", email = "alan@lnbits.com" }] @@ -10,7 +10,7 @@ dependencies = [ "bech32~=1.2.0", "click~=8.3.1", "fastapi~=0.116.1", - "starlette~=0.48.0", + "starlette~=0.47.1", "httpx~=0.27.2", "jinja2~=3.1.6", "lnurl~=0.10.0", @@ -48,13 +48,11 @@ dependencies = [ "nostr-sdk~=0.44.0", "bcrypt~=5.0.0", "jsonpath-ng~=1.7.0", - "pillow~=12.3.0", + "pillow~=12.1.0", "python-dotenv~=1.2.1", "greenlet~=3.3.0", "urllib3>=2.7.0", "pyinstrument>=5.1.2", - "wasmtime>=45.0.0", - "random-username~=1.0.2", ] [project.scripts] @@ -63,7 +61,7 @@ lnbits-cli = "lnbits.commands:main" [project.optional-dependencies] breez = ["breez-sdk~=0.8.0", "breez-sdk-liquid~=0.11.11"] -liquid = ["wallycore~=1.5.1", "boltz-client==0.4.0"] +liquid = ["wallycore~=1.5.1"] migration = ["psycopg2-binary~=2.9.11"] [dependency-groups] @@ -81,7 +79,6 @@ dev = [ "anyio~=4.12.1", "pytest~=9.0.2", "pytest-cov~=7.0.0", - "playwright~=1.61.0", "pytest-md~=0.2.0", "pytest-httpserver~=1.1.3", "pytest-mock~=3.15.1", diff --git a/tests/api/test_admin_api.py b/tests/api/test_admin_api.py index 4ed51ffc6..29de36fc4 100644 --- a/tests/api/test_admin_api.py +++ b/tests/api/test_admin_api.py @@ -3,9 +3,8 @@ from pathlib import Path import pytest from httpx import AsyncClient -from lnbits.core.crud.settings import get_settings_field, set_settings_field from lnbits.server import server_restart -from lnbits.settings import DEFAULT_WASM_MANIFESTS, Settings +from lnbits.settings import Settings @pytest.mark.anyio @@ -23,7 +22,6 @@ async def test_admin_get_settings(client: AsyncClient, superuser_token: str): assert response.status_code == 200 result = response.json() assert "super_user" not in result - assert result["lnbits_wasm_extensions_manifests"] == DEFAULT_WASM_MANIFESTS @pytest.mark.anyio @@ -83,9 +81,7 @@ async def test_admin_audit_monitor_and_test_email( headers={"Authorization": f"Bearer {superuser_token}"}, ) assert monitor.status_code == 200 - task_names = [t["name"] for t in monitor.json()] - assert "core_invoice_listener" in task_names - assert "core_wasm_invoice_listener" in task_names + assert "invoice_listeners" in monitor.json() test_email = await client.get( "/admin/api/v1/testemail", @@ -154,15 +150,6 @@ async def test_admin_partial_reset_restart_and_backup( async def test_admin_delete_settings_requires_superuser( client: AsyncClient, superuser_token: str ): - await set_settings_field("lnbits_site_title", "Reset me") - await set_settings_field("lnbits_backend_wallet_class", "BoltzWallet") - await set_settings_field("boltz_mnemonic", "keep boltz seed") - await set_settings_field("boltz_mnemonic_backup_confirmed", True) - await set_settings_field("phoenixd_mnemonic", "keep phoenixd seed") - await set_settings_field("phoenixd_mnemonic_backup_confirmed", True) - await set_settings_field("spark_l2_mnemonic", "keep spark seed") - await set_settings_field("spark_l2_mnemonic_backup_confirmed", True) - server_restart.clear() response = await client.delete( "/admin/api/v1/settings", @@ -170,21 +157,4 @@ async def test_admin_delete_settings_requires_superuser( ) assert response.status_code == 200 assert server_restart.is_set() is True - assert await get_settings_field("lnbits_site_title") is None - - backend_wallet = await get_settings_field("lnbits_backend_wallet_class") - boltz_seed = await get_settings_field("boltz_mnemonic") - boltz_confirmed = await get_settings_field("boltz_mnemonic_backup_confirmed") - phoenixd_seed = await get_settings_field("phoenixd_mnemonic") - phoenixd_confirmed = await get_settings_field("phoenixd_mnemonic_backup_confirmed") - spark_l2_seed = await get_settings_field("spark_l2_mnemonic") - spark_l2_confirmed = await get_settings_field("spark_l2_mnemonic_backup_confirmed") - assert backend_wallet and backend_wallet.value == "BoltzWallet" - assert boltz_seed and boltz_seed.value == "keep boltz seed" - assert boltz_confirmed and boltz_confirmed.value is True - assert phoenixd_seed and phoenixd_seed.value == "keep phoenixd seed" - assert phoenixd_confirmed and phoenixd_confirmed.value is True - assert spark_l2_seed and spark_l2_seed.value == "keep spark seed" - assert spark_l2_confirmed and spark_l2_confirmed.value is True - server_restart.clear() diff --git a/tests/api/test_api.py b/tests/api/test_api.py index 2401c71fe..2e111360f 100644 --- a/tests/api/test_api.py +++ b/tests/api/test_api.py @@ -233,40 +233,6 @@ async def test_create_fiat_invoice( assert invoice["extra"]["fiat_payment_request"] == fiat_payment_request -@pytest.mark.anyio -async def test_create_fiat_subscription_invoice_rejected( - client, inkey_headers_to, mocker: MockerFixture -): - fiat_mock = mocker.patch( - "lnbits.core.services.payments.create_fiat_invoice", - AsyncMock(), - ) - - response = await client.post( - "/api/v1/payments", - headers=inkey_headers_to, - json={ - "unit": "USD", - "out": False, - "amount": 2100, - "fiat_provider": "stripe", - "extra": { - "fiat_method": "subscription", - "subscription": { - "checking_id": "fiat_stripe_cs_paid_session", - "payment_request": "", - }, - }, - }, - ) - - assert response.status_code == 400 - assert response.json()["detail"] == ( - "Cannot create direct fiat subscription payments." - ) - fiat_mock.assert_not_awaited() - - @pytest.mark.anyio @pytest.mark.parametrize("currency", ("msat", "RRR")) async def test_create_invoice_validates_used_currency( diff --git a/tests/api/test_auth.py b/tests/api/test_auth.py index 82361e6d9..aea787cff 100644 --- a/tests/api/test_auth.py +++ b/tests/api/test_auth.py @@ -1745,14 +1745,10 @@ async def test_api_create_user_api_token_success( ), "Expiration time should be 60 minutes from now." token_id = payload["api_token_id"] - stored_token = next( - token + assert any( + token_id in [token.id for token in acl.token_id_list] for acl in acls.access_control_list - for token in acl.token_id_list - if token.id == token_id - ) - assert stored_token.expires_at is not None - assert abs(stored_token.expires_at - expiration_time) <= 1 + ), "API token should be part of at least one ACL." @pytest.mark.anyio diff --git a/tests/api/test_auth_api.py b/tests/api/test_auth_api.py index 83ea8dc55..8993cd8a9 100644 --- a/tests/api/test_auth_api.py +++ b/tests/api/test_auth_api.py @@ -58,24 +58,6 @@ async def test_auth_api_logout_and_update_ui_customization( assert "cookie_access_token=" in logout.headers["set-cookie"] -@pytest.mark.anyio -async def test_auth_api_keycloak_login_without_user_id_redirects_to_provider( - http_client: AsyncClient, mocker -): - provider = "keycloak" - login_sso = _FakeSSO() - mocker.patch("lnbits.core.views.auth_api._new_sso", return_value=login_sso) - - response = await http_client.get(f"/api/v1/auth/{provider}") - - assert response.status_code == 307 - assert response.headers["location"] == "https://example.com/sso/login" - assert login_sso.redirect_uri == ( - f"{http_client.base_url}/api/v1/auth/{provider}/token" - ) - assert login_sso.state is None - - @pytest.mark.anyio async def test_auth_api_sso_login_and_callback(http_client: AsyncClient, mocker): user = await create_user_account( diff --git a/tests/api/test_extension_api.py b/tests/api/test_extension_api.py index 583a7bb9c..c3d64ffaa 100644 --- a/tests/api/test_extension_api.py +++ b/tests/api/test_extension_api.py @@ -1,6 +1,3 @@ -import json -import zipfile -from pathlib import Path from types import SimpleNamespace from uuid import uuid4 @@ -11,7 +8,6 @@ from starlette.requests import Request from lnbits.core.crud.db_versions import get_db_version, update_migration_version from lnbits.core.crud.extensions import ( create_installed_extension, - delete_installed_extension, get_installed_extension, get_user_extension, ) @@ -21,21 +17,13 @@ from lnbits.core.models import Account, CreateInvoice from lnbits.core.models.extensions import ( CreateExtension, CreateExtensionReview, - ExplicitRelease, Extension, - ExtensionArchiveValidationError, ExtensionConfig, - ExtensionManifestType, - ExtensionPermission, - ExtensionPermissionsUpdate, ExtensionRelease, InstallableExtension, - Manifest, PayToEnableInfo, ReleasePaymentInfo, UserExtensionInfo, - WasmRuntimeLimitsUpdate, - wasm_extension_icon_url, ) from lnbits.core.models.users import AccountId from lnbits.core.services.payments import create_wallet_invoice @@ -47,12 +35,9 @@ from lnbits.core.views.extension_api import ( api_enable_extension, api_extension_details, api_get_user_extensions, - api_get_wasm_runtime_limit_extensions, api_install_extension, api_uninstall_extension, - api_update_extension_permissions, api_update_pay_to_enable, - api_update_wasm_runtime_limits, create_extension_review, delete_extension_db, extensions, @@ -177,393 +162,6 @@ async def test_extension_api_install_details_and_release_endpoints(mocker): assert release_info["is_version_compatible"] is True -@pytest.mark.anyio -async def test_extension_api_archive_validation_failure_only_removes_zip( - tmp_path, - settings, - mocker, -): - ext_id = f"ext_{uuid4().hex[:8]}" - release = make_extension_release(ext_id) - create_data = CreateExtension( - ext_id=ext_id, - archive=release.archive, - source_repo=release.source_repo, - version=release.version, - ) - original_data_folder = settings.lnbits_data_folder - clean_python_mock = mocker.patch.object( - InstallableExtension, "clean_extension_files" - ) - clean_wasm_mock = mocker.patch.object( - InstallableExtension, "clean_wasm_extension_files" - ) - mocker.patch.object( - InstallableExtension, - "get_extension_release", - mocker.AsyncMock(return_value=release), - ) - mocker.patch( - "lnbits.core.views.extension_api.install_extension", - mocker.AsyncMock( - side_effect=ExtensionArchiveValidationError("Invalid extension archive.") - ), - ) - - try: - settings.lnbits_data_folder = str(tmp_path / "data") - zip_path = Path(settings.lnbits_data_folder, "zips", f"{ext_id}.zip") - zip_path.parent.mkdir(parents=True) - zip_path.write_bytes(b"archive") - - with pytest.raises(HTTPException) as exc: - await api_install_extension(create_data) - finally: - settings.lnbits_data_folder = original_data_folder - - assert exc.value.status_code == 400 - assert exc.value.detail == "Invalid extension archive." - assert not zip_path.exists() - clean_python_mock.assert_not_called() - clean_wasm_mock.assert_not_called() - - -@pytest.mark.anyio -async def test_explicit_wasm_release_loads_install_permissions( - settings, - mocker, -): - ext_id = f"wasm_{uuid4().hex[:8]}" - non_wasm_ext_id = f"python_{uuid4().hex[:8]}" - manifest_url = "https://extensions.example/manifest.json" - details_link = f"https://extensions.example/{ext_id}/config.json" - explicit_release = ExplicitRelease( - id=ext_id, - name="Explicit WASM Extension", - version="1.0.0", - archive=f"https://extensions.example/{ext_id}.zip", - hash="archive-hash", - repo=f"https://github.com/example/{ext_id}", - icon=None, - short_description="Explicit WASM release", - min_lnbits_version="0.1.0", - max_lnbits_version=None, - html_url=None, - warning=None, - info_notification=None, - critical_notification=None, - details_link=details_link, - paid_features=None, - pay_link=None, - extension_type="wasm", - ) - non_wasm_release = explicit_release.copy( - update={ - "id": non_wasm_ext_id, - "name": "Explicit Python Extension", - "details_link": f"https://extensions.example/{non_wasm_ext_id}/config.json", - "extension_type": None, - } - ) - config_permissions = [ExtensionPermission(id="wallet.list")] - config = ExtensionConfig( - name=ext_id, - short_description="Explicit WASM release", - min_lnbits_version="0.1.0", - max_lnbits_version=None, - extension_type="wasm", - permissions=config_permissions, - ) - - async def fetch_manifest(url): - if url == manifest_url: - return Manifest(extensions=[explicit_release, non_wasm_release]) - return Manifest() - - mocker.patch.object(settings, "lnbits_extensions_manifests", []) - mocker.patch.object(settings, "lnbits_wasm_extensions_manifests", [manifest_url]) - mocker.patch.object( - settings, - "lnbits_extensions_builder_manifest_url", - "https://extensions.example/builder.json", - ) - mocker.patch.object( - InstallableExtension, - "fetch_manifest", - mocker.AsyncMock(side_effect=fetch_manifest), - ) - fetch_config_mock = mocker.patch.object( - ExtensionConfig, - "fetch_release_config", - mocker.AsyncMock(return_value=config), - ) - - releases = await InstallableExtension.get_extension_releases(ext_id) - - assert len(releases) == 1 - assert releases[0].extension_type == "wasm" - assert releases[0].manifest_type == ExtensionManifestType.WASM - assert releases[0].permissions == config_permissions - fetch_config_mock.assert_awaited_once_with(details_link) - - fetch_config_mock.reset_mock() - non_wasm_releases = await InstallableExtension.get_extension_releases( - non_wasm_ext_id - ) - assert len(non_wasm_releases) == 1 - assert non_wasm_releases[0].extension_type is None - assert non_wasm_releases[0].manifest_type == ExtensionManifestType.WASM - assert non_wasm_releases[0].permissions == [] - fetch_config_mock.assert_not_awaited() - - mocker.patch.object( - InstallableExtension, - "get_extension_releases", - mocker.AsyncMock(return_value=releases), - ) - mocker.patch( - "lnbits.core.views.extension_api.get_installed_extension", - mocker.AsyncMock(return_value=None), - ) - api_releases = await get_extension_releases(ext_id) - assert api_releases[0].permissions == config_permissions - - -@pytest.mark.anyio -async def test_extension_api_installs_wasm_with_granted_permissions( - tmp_path, - settings, - mocker, -): - ext_id = f"wasm_{uuid4().hex[:8]}" - release = make_extension_release(ext_id) - granted_permissions = [ - ExtensionPermission( - id="http.request", - policies=[{"host": "https://api.example.com"}], - ) - ] - create_data = CreateExtension( - ext_id=ext_id, - archive=release.archive, - source_repo=release.source_repo, - version=release.version, - permissions=granted_permissions, - ) - original_data_folder = settings.lnbits_data_folder - original_extensions_path = settings.lnbits_extensions_path - original_wasm_extensions_path = settings.lnbits_wasm_extensions_path - register_wasm_routes_mock = mocker.patch( - "lnbits.core.services.extensions.core_app_extra.register_new_wasm_ext_routes" - ) - mocker.patch.object( - InstallableExtension, - "get_extension_release", - mocker.AsyncMock(return_value=release), - ) - mocker.patch.object( - InstallableExtension, - "download_archive", - mocker.AsyncMock(), - ) - - try: - settings.lnbits_data_folder = str(tmp_path / "data") - settings.lnbits_extensions_path = str(tmp_path / "code") - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - _write_wasm_extension_archive(ext_id, release.version, settings) - - installed = await api_install_extension(create_data) - stored = await get_installed_extension(ext_id) - finally: - await delete_installed_extension(ext_id=ext_id) - settings.lnbits_data_folder = original_data_folder - settings.lnbits_extensions_path = original_extensions_path - settings.lnbits_wasm_extensions_path = original_wasm_extensions_path - - assert installed.code == ext_id - assert installed.is_wasm is True - assert stored is not None - assert stored.permissions == [ - ExtensionPermission( - id="http.request", - description="Call example API.", - policies=[{"host": "https://api.example.com"}], - ) - ] - register_wasm_routes_mock.assert_called_once_with(ext_id) - - -@pytest.mark.anyio -async def test_extension_api_wasm_runtime_limits_and_catalog_use_installed_metadata( - tmp_path, - settings, - mocker, -): - ext_id = f"wasm_{uuid4().hex[:8]}" - py_ext_id = f"py_{uuid4().hex[:8]}" - granted_permissions = [ - ExtensionPermission( - id="http.request", - description="Call example API.", - policies=[{"host": "https://api.example.com"}], - ) - ] - original_extensions_path = settings.lnbits_extensions_path - original_wasm_extensions_path = settings.lnbits_wasm_extensions_path - - try: - settings.lnbits_extensions_path = str(tmp_path) - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - _write_installed_wasm_config(ext_id, settings.wasm_extensions_dir) - await create_installed_extension( - InstallableExtension( - id=ext_id, - name="WASM Demo", - version="1.0.0", - active=True, - permissions=granted_permissions, - wasm_runtime_limits={"wasm_runtime_max_execution_ms": 1234}, - ) - ) - await create_installed_extension(make_installable_extension(py_ext_id)) - - runtime_extensions = await api_get_wasm_runtime_limit_extensions() - wasm_info = next(info for info in runtime_extensions if info.id == ext_id) - - updated_info = await api_update_wasm_runtime_limits( - ext_id, - WasmRuntimeLimitsUpdate( - limits={ - "wasm_runtime_max_execution_ms": "2345", - "wasm_runtime_max_fuel": 0, - } - ), - ) - stored = await get_installed_extension(ext_id) - - mocker.patch.object( - InstallableExtension, - "get_installable_extensions", - mocker.AsyncMock( - return_value=[ - make_installable_extension(ext_id), - make_installable_extension(py_ext_id), - ] - ), - ) - catalog = await extensions(AccountId(id=uuid4().hex)) - finally: - await delete_installed_extension(ext_id=ext_id) - await delete_installed_extension(ext_id=py_ext_id) - settings.lnbits_extensions_path = original_extensions_path - settings.lnbits_wasm_extensions_path = original_wasm_extensions_path - - assert wasm_info.wasm_runtime_limits == {"wasm_runtime_max_execution_ms": 1234} - assert py_ext_id not in {info.id for info in runtime_extensions} - assert updated_info.wasm_runtime_limits == { - "wasm_runtime_max_execution_ms": 2345, - "wasm_runtime_max_fuel": 0, - } - assert stored is not None - assert stored.wasm_runtime_limits == updated_info.wasm_runtime_limits - - catalog_item = next(item for item in catalog if item["id"] == ext_id) - assert catalog_item["isWasm"] is True - assert catalog_item["icon"] == wasm_extension_icon_url(ext_id) - assert catalog_item["permissions"] == [ - dict(permission) for permission in granted_permissions - ] - - -@pytest.mark.anyio -async def test_extension_api_admin_updates_wasm_extension_permission_limits( - tmp_path, - settings, -): - ext_id = f"wasm_{uuid4().hex[:8]}" - original_extensions_path = settings.lnbits_extensions_path - original_wasm_extensions_path = settings.lnbits_wasm_extensions_path - manifest_permissions = [ - { - "id": "ext.storage.append_public", - "description": "Append public messages.", - "policies": [ - { - "table": "messages", - "source_table": "conversations", - "source_id_field": "conversation_id", - "allowed_fields": ["body"], - "max_rows_per_source": 100, - } - ], - } - ] - installed_permissions = [ - ExtensionPermission.parse_obj(permission) for permission in manifest_permissions - ] - updated_permissions = [ - ExtensionPermission( - id="ext.storage.append_public", - policies=[ - { - "table": "messages", - "source_table": "conversations", - "source_id_field": "conversation_id", - "allowed_fields": ["body"], - "max_rows_per_source": 1000, - } - ], - ) - ] - - try: - settings.lnbits_extensions_path = str(tmp_path) - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - _write_installed_wasm_config( - ext_id, - settings.wasm_extensions_dir, - permissions=manifest_permissions, - ) - await create_installed_extension( - InstallableExtension( - id=ext_id, - name="WASM Demo", - version="1.0.0", - active=True, - permissions=installed_permissions, - ) - ) - - response = await api_update_extension_permissions( - ext_id, - ExtensionPermissionsUpdate(permissions=updated_permissions), - ) - stored = await get_installed_extension(ext_id) - finally: - await delete_installed_extension(ext_id=ext_id) - settings.lnbits_extensions_path = original_extensions_path - settings.lnbits_wasm_extensions_path = original_wasm_extensions_path - - assert response.extension_permissions == [ - ExtensionPermission( - id="ext.storage.append_public", - description="Append public messages.", - policies=[ - { - "table": "messages", - "source_table": "conversations", - "source_id_field": "conversation_id", - "allowed_fields": ["body"], - "max_rows_per_source": 1000, - } - ], - ) - ] - assert stored is not None - assert stored.permissions == response.extension_permissions - - @pytest.mark.anyio async def test_extension_api_pay_to_enable_and_catalog_views(mocker, admin_user): regular_user = await create_user_account( @@ -830,50 +428,3 @@ async def test_extension_api_review_endpoints(mocker): CreateExtensionReview(tag=ext_id, name="Alice", rating=900, comment="Great") ) assert payment_request.payment_hash.startswith("hash_") - - -def _write_wasm_extension_archive( - ext_id: str, - version: str, - settings, - permissions: list[dict] | None = None, -) -> None: - zip_path = Path(settings.lnbits_data_folder, "zips", f"{ext_id}.zip") - zip_path.parent.mkdir(parents=True, exist_ok=True) - config = _wasm_config(ext_id, permissions=permissions) - root = f"{ext_id}-{version}" - with zipfile.ZipFile(zip_path, "w") as archive: - archive.writestr(f"{root}/config.json", json.dumps(config)) - archive.writestr(f"{root}/{config['wasm']['module']}", b"\0asm") - - -def _write_installed_wasm_config( - ext_id: str, - wasm_extensions_path, - permissions: list[dict] | None = None, -) -> None: - config_dir = wasm_extensions_path / ext_id - config_dir.mkdir(parents=True) - (config_dir / "config.json").write_text( - json.dumps(_wasm_config(ext_id, permissions=permissions)), - encoding="utf-8", - ) - - -def _wasm_config(ext_id: str, permissions: list[dict] | None = None) -> dict: - return { - "id": ext_id, - "name": "WASM Demo", - "short_description": "WASM extension", - "version": "1.0.0", - "extension_type": "wasm", - "wasm": {"module": "extension.wasm"}, - "permissions": permissions - or [ - { - "id": "http.request", - "description": "Call example API.", - "policies": [{"host": "https://api.example.com"}], - } - ], - } diff --git a/tests/api/test_lnurl_api.py b/tests/api/test_lnurl_api.py index ed3e92452..80dc63500 100644 --- a/tests/api/test_lnurl_api.py +++ b/tests/api/test_lnurl_api.py @@ -1,6 +1,3 @@ -import json -import re -from types import SimpleNamespace from typing import cast from uuid import uuid4 @@ -19,11 +16,9 @@ from lnurl.models import MessageAction from lnurl.types import CallbackUrl, LightningInvoice from pydantic import parse_obj_as -from lnbits.core.crud.wallets import create_wallet, get_wallet from lnbits.core.models import Account, CreateInvoice from lnbits.core.models.lnurl import CreateLnurlPayment, LnurlScan from lnbits.core.models.wallets import KeyType, WalletTypeInfo -from lnbits.core.services.lightning_address import wallet_lightning_address_callback from lnbits.core.services.payments import create_wallet_invoice from lnbits.core.services.users import create_user_account from lnbits.core.views.lnurl_api import ( @@ -43,90 +38,6 @@ TEST_BOLT11 = ( ) -@pytest.mark.anyio -async def test_wallet_lightning_address_lookup_and_callback( - client, to_user, settings, mocker -): - settings.lnbits_ln_address_mode = "core_first" - wallet = await create_wallet(user_id=to_user.id, wallet_name="ln address") - assert wallet.lightning_address - - response = await client.get(f"/.well-known/lnurlp/{wallet.lightning_address}") - assert response.status_code == 200 - data = response.json() - metadata = data["metadata"] - assert data["minSendable"] == 1000 - assert data["maxSendable"] == 2_100_000_000_000_000_000 - assert data["commentAllowed"] == 799 - assert f"{wallet.lightning_address}@" in metadata - assert "text/identifier" in metadata - - tagged_response = await client.get( - f"/.well-known/lnurlp/{wallet.lightning_address}+market" - ) - assert tagged_response.status_code == 200 - tagged_data = tagged_response.json() - tagged_metadata = json.loads(tagged_data["metadata"]) - assert ["text/tag", "market"] in tagged_metadata - assert any( - entry[0] == "text/identifier" - and entry[1].startswith(f"{wallet.lightning_address}+market@") - for entry in tagged_metadata - ) - - create_invoice_mock = mocker.patch( - "lnbits.core.services.lightning_address.create_invoice", - mocker.AsyncMock(return_value=SimpleNamespace(bolt11=TEST_BOLT11)), - ) - callback = tagged_data["callback"].split("testserver")[-1] - callback_response = await client.get(f"{callback}?amount=21000&comment=hello") - assert callback_response.status_code == 200 - assert callback_response.json()["pr"] == TEST_BOLT11 - create_invoice_mock.assert_awaited_once() - kwargs = create_invoice_mock.await_args.kwargs - assert kwargs["wallet_id"] == wallet.id - assert kwargs["amount"] == 21 - assert kwargs["extra"]["tag"] == "wallet_lightning_address" - assert kwargs["extra"]["comment"] == "hello" - assert kwargs["extra"]["lnaddress"].startswith(f"{wallet.lightning_address}+") - assert kwargs["extra"]["lnaddress_tag"] == "market" - - -@pytest.mark.anyio -async def test_wallet_lightning_address_generation_settings(to_user, settings): - settings.lnbits_ln_address_mode = "core_first" - wallet = await create_wallet(user_id=to_user.id) - assert wallet.lightning_address - assert re.fullmatch(r"[a-z]+[a-z]+[0-9]", wallet.lightning_address) - - settings.lnbits_ln_address_mode = "extension_only" - disabled_wallet = await create_wallet(user_id=to_user.id) - assert disabled_wallet.lightning_address is None - - settings.lnbits_ln_address_mode = "core_first" - backfilled = await get_wallet(disabled_wallet.id) - assert backfilled - assert backfilled.lightning_address - - -@pytest.mark.anyio -async def test_wallet_lightning_address_callback_validates_comment( - to_user, settings, mocker -): - settings.lnbits_ln_address_mode = "core_first" - wallet = await create_wallet(user_id=to_user.id) - assert wallet.lightning_address - request = mocker.Mock() - request.url.netloc = "example.com" - request.query_params.get.return_value = "x" * 800 - - result = await wallet_lightning_address_callback( - wallet.lightning_address, request, amount=1000 - ) - assert isinstance(result, LnurlErrorResponse) - assert "can only accept 799" in result.reason - - @pytest.mark.anyio async def test_lnurl_api_scan_routes_validate_and_forward(mocker): pay_response = make_lnurl_pay_response() diff --git a/tests/api/test_payment_api.py b/tests/api/test_payment_api.py index 1a08eaa1a..95339b2d0 100644 --- a/tests/api/test_payment_api.py +++ b/tests/api/test_payment_api.py @@ -6,16 +6,11 @@ import pytest from fastapi import HTTPException from pydantic import ValidationError -from lnbits.core.crud.payments import ( - create_payment, - get_payment, - get_payments, - update_payment, -) +from lnbits.core.crud.payments import create_payment, get_payment, get_payments from lnbits.core.models import Account, CreateInvoice, PaymentFilters, PaymentState from lnbits.core.models.payments import CancelInvoice, CreatePayment, SettleInvoice from lnbits.core.models.users import AccountId -from lnbits.core.models.wallets import BaseWalletTypeInfo, KeyType, WalletTypeInfo +from lnbits.core.models.wallets import KeyType, WalletTypeInfo from lnbits.core.services.payments import create_wallet_invoice from lnbits.core.services.users import create_user_account from lnbits.core.views.payment_api import ( @@ -25,7 +20,6 @@ from lnbits.core.views.payment_api import ( api_payments_daily_stats, api_payments_fee_reserve, api_payments_settle, - api_payments_total_breakdown, api_payments_wallets_stats, ) from lnbits.db import Filter, Filters @@ -152,61 +146,6 @@ async def test_payment_external_id_is_stored_and_validated(): CreateInvoice(out=False, amount=21, external_id="provider payment 123") -@pytest.mark.anyio -async def test_payment_api_total_breakdown_groups_wallet_tags_and_fiat(): - first_user = await create_user_account( - Account( - id=uuid4().hex, - username=f"user_{uuid4().hex[:8]}", - email=f"user_{uuid4().hex[:8]}@lnbits.com", - ) - ) - second_user = await create_user_account( - Account( - id=uuid4().hex, - username=f"user_{uuid4().hex[:8]}", - email=f"user_{uuid4().hex[:8]}@lnbits.com", - ) - ) - first_wallet = first_user.wallets[0] - second_wallet = second_user.wallets[0] - - await _create_payment(first_wallet.id, amount_msat=2_000, tag="coffee") - await _create_payment( - first_wallet.id, - amount_msat=4_000, - tag="coffee", - fiat_provider="stripe", - extra={"fiat_payment_request": "https://stripe.test/session"}, - ) - await _create_payment(first_wallet.id, amount_msat=-1_000) - await _create_payment(second_wallet.id, amount_msat=8_000, tag="books") - - breakdown = await api_payments_total_breakdown( - BaseWalletTypeInfo(key_type=KeyType.invoice, wallet=first_wallet) - ) - - assert any( - item.tag == "coffee" - and item.is_fiat is False - and item.total == 2_000 - and item.payments_count == 1 - for item in breakdown - ) - assert any( - item.tag == "coffee" - and item.is_fiat is True - and item.total == 4_000 - and item.payments_count == 1 - for item in breakdown - ) - assert any( - item.tag is None and item.is_fiat is False and item.total == -1_000 - for item in breakdown - ) - assert all(item.tag != "books" for item in breakdown) - - @pytest.mark.anyio async def test_payment_api_fee_reserve_and_hold_invoice_actions(mocker): user = await create_user_account( @@ -437,62 +376,6 @@ async def test_payment_extra_update_requires_successful_payment( ) -@pytest.mark.anyio -async def test_api_update_payment_labels( - client, - to_wallet, - adminkey_headers_to, -): - payment_hash = uuid4().hex - checking_id = await _create_payment( - to_wallet.id, - amount_msat=1_000, - payment_hash=payment_hash, - status=PaymentState.SUCCESS, - ) - - # 1. Update labels with new valid labels - response = await client.put( - f"/api/v1/payments/{payment_hash}/labels", - headers=adminkey_headers_to, - json={"labels": ["income", "restaurant"]}, - ) - assert response.status_code == 200 - assert response.json()["success"] is True - - # 2. Check that the labels were updated on the payment - payment = await get_payment(checking_id) - assert payment.labels == ["income", "restaurant"] - - # 3. Check that the new labels were auto-created in the user's account config - from lnbits.core.crud.users import get_account - - account = await get_account(to_wallet.user) - assert account is not None - user_labels = {label.name: label.color for label in account.extra.labels} - assert "income" in user_labels - assert "restaurant" in user_labels - assert ( - user_labels["income"] is not None - and user_labels["income"].startswith("#") - and len(user_labels["income"]) == 7 - ) - assert ( - user_labels["restaurant"] is not None - and user_labels["restaurant"].startswith("#") - and len(user_labels["restaurant"]) == 7 - ) - - # 4. Check that invalid labels are rejected - response = await client.put( - f"/api/v1/payments/{payment_hash}/labels", - headers=adminkey_headers_to, - json={"labels": ["invalid!label"]}, - ) - assert response.status_code == 400 - assert "Invalid label name" in response.json()["detail"] - - async def _create_payment( wallet_id: str, *, @@ -500,13 +383,8 @@ async def _create_payment( status: PaymentState = PaymentState.SUCCESS, payment_hash: str | None = None, tag: str | None = None, - fiat_provider: str | None = None, - extra: dict | None = None, ) -> str: checking_id = f"checking_{uuid4().hex[:8]}" - payment_extra = extra or {} - if tag: - payment_extra["tag"] = tag await create_payment( checking_id=checking_id, data=CreatePayment( @@ -515,12 +393,8 @@ async def _create_payment( bolt11=f"bolt11_{checking_id}", amount_msat=amount_msat, memo=f"payment_{checking_id}", - extra=payment_extra, + extra={"tag": tag} if tag else {}, ), status=status, ) - if fiat_provider: - payment = await get_payment(checking_id) - payment.fiat_provider = fiat_provider - await update_payment(payment) return checking_id diff --git a/tests/api/test_user_api.py b/tests/api/test_user_api.py index 68eb10b02..e181b04c3 100644 --- a/tests/api/test_user_api.py +++ b/tests/api/test_user_api.py @@ -83,45 +83,6 @@ async def test_user_api_get_wallets_and_delete_all_wallets( assert active_wallets == [] -@pytest.mark.anyio -async def test_user_api_superuser_sets_wallet_lightning_address( - http_client: AsyncClient, superuser_token: str -): - user = await create_user_account( - Account( - id=uuid4().hex, - username=f"user_{uuid4().hex[:8]}", - email=f"user_{uuid4().hex[:8]}@lnbits.com", - ) - ) - wallet = user.wallets[0] - - settings.lnbits_ln_address_mode = "core_first" - settings.lnbits_wallet_lightning_address_blacklist = ["admin"] - settings.lnbits_charge_wallet_lightning_addresses = True - settings.lnbits_wallet_lightning_address_price_sats = 1_000 - settings.lnbits_service_fee_wallet = None - - unauthorized = await http_client.put( - f"/users/api/v1/user/{user.id}/wallet/{wallet.id}/lightning-address", - json={"lightning_address": "admin"}, - ) - assert unauthorized.status_code == 401 - - response = await http_client.put( - f"/users/api/v1/user/{user.id}/wallet/{wallet.id}/lightning-address", - headers={"Authorization": f"Bearer {superuser_token}"}, - json={"lightning_address": "admin"}, - ) - assert response.status_code == 200 - assert response.json()["lightning_address"] == "admin" - - updated_wallet = await get_wallet(wallet.id) - assert updated_wallet - assert updated_wallet.lightning_address == "admin" - assert updated_wallet.balance == 0 - - @pytest.mark.anyio async def test_user_api_create_wallet_validates_currency(): user = await create_user_account( diff --git a/tests/api/test_wallet_api.py b/tests/api/test_wallet_api.py index 0afeac633..9ec2d560d 100644 --- a/tests/api/test_wallet_api.py +++ b/tests/api/test_wallet_api.py @@ -5,9 +5,7 @@ from httpx import AsyncClient from lnbits.core.crud.wallets import create_wallet, get_wallet from lnbits.core.models.users import Account -from lnbits.core.services import update_wallet_balance from lnbits.core.services.users import create_user_account -from lnbits.settings import settings @pytest.mark.anyio @@ -168,127 +166,6 @@ async def test_wallet_api_paginated_update_reset_and_store_paylinks( assert updated.json()["extra"]["pinned"] is True -@pytest.mark.anyio -async def test_wallet_api_custom_lightning_address_owner_rules( - http_client: AsyncClient, -): - user = await create_user_account( - Account( - id=uuid4().hex, - username=f"user_{uuid4().hex[:8]}", - email=f"user_{uuid4().hex[:8]}@lnbits.com", - ) - ) - wallet = user.wallets[0] - headers = _admin_headers(wallet.adminkey) - - settings.lnbits_ln_address_mode = "core_first" - settings.lnbits_allow_custom_wallet_lightning_addresses = False - disabled = await http_client.patch( - "/api/v1/wallet", - headers=headers, - json={"lightning_address": "custom.name"}, - ) - assert disabled.status_code == 403 - - settings.lnbits_allow_custom_wallet_lightning_addresses = True - settings.lnbits_wallet_lightning_address_blacklist = ["admin"] - blacklisted = await http_client.patch( - "/api/v1/wallet", - headers=headers, - json={"lightning_address": "admin"}, - ) - assert blacklisted.status_code == 400 - - invalid = await http_client.patch( - "/api/v1/wallet", - headers=headers, - json={"lightning_address": "custom+tag"}, - ) - assert invalid.status_code == 400 - - existing_wallet = await create_wallet( - user_id=user.id, - wallet_name="existing lightning address", - ) - existing = await http_client.patch( - "/api/v1/wallet", - headers=_admin_headers(existing_wallet.adminkey), - json={"lightning_address": "pay.link"}, - ) - assert existing.status_code == 200 - - conflict = await http_client.patch( - "/api/v1/wallet", - headers=headers, - json={"lightning_address": "pay.link"}, - ) - assert conflict.status_code == 400 - - updated = await http_client.patch( - "/api/v1/wallet", - headers=headers, - json={"lightning_address": "custom.name"}, - ) - assert updated.status_code == 200 - assert updated.json()["lightning_address"] == "custom.name" - - -@pytest.mark.anyio -async def test_wallet_api_custom_lightning_address_charges_fee( - http_client: AsyncClient, -): - user = await create_user_account( - Account( - id=uuid4().hex, - username=f"user_{uuid4().hex[:8]}", - email=f"user_{uuid4().hex[:8]}@lnbits.com", - ) - ) - fee_user = await create_user_account( - Account( - id=uuid4().hex, - username=f"fees_{uuid4().hex[:8]}", - email=f"fees_{uuid4().hex[:8]}@lnbits.com", - ) - ) - wallet = user.wallets[0] - fee_wallet = fee_user.wallets[0] - await update_wallet_balance(wallet=wallet, amount=2_000) - - settings.lnbits_ln_address_mode = "core_first" - settings.lnbits_allow_custom_wallet_lightning_addresses = True - settings.lnbits_charge_wallet_lightning_addresses = True - settings.lnbits_wallet_lightning_address_price_sats = 1_000 - settings.lnbits_service_fee_wallet = fee_wallet.id - - updated = await http_client.patch( - "/api/v1/wallet", - headers=_admin_headers(wallet.adminkey), - json={"lightning_address": "paid.name"}, - ) - assert updated.status_code == 200 - assert updated.json()["lightning_address"] == "paid.name" - - charged_wallet = await get_wallet(wallet.id) - credited_wallet = await get_wallet(fee_wallet.id) - assert charged_wallet - assert credited_wallet - assert charged_wallet.balance == 1_000 - assert credited_wallet.balance == 1_000 - - settings.lnbits_service_fee_wallet = None - missing_fee_wallet = await http_client.patch( - "/api/v1/wallet", - headers=_admin_headers(wallet.adminkey), - json={"lightning_address": "paid.other"}, - ) - assert missing_fee_wallet.status_code == 400 - assert missing_fee_wallet.json()["detail"] == ( - "Lightning Address fee wallet is not configured." - ) - - @pytest.mark.anyio async def test_wallet_api_shared_wallet_requires_source_id(http_client: AsyncClient): user = await create_user_account( diff --git a/tests/conftest.py b/tests/conftest.py index 0076fafa3..de56fec78 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -70,7 +70,6 @@ def settings(): lnbits_settings.auth_https_only = False lnbits_settings.lnbits_admin_extensions = [] lnbits_settings.lnbits_data_folder = "./tests/data" - lnbits_settings.lnbits_wasm_extensions_path = "./tests/data/wasm_extensions" lnbits_settings.lnbits_admin_ui = True lnbits_settings.lnbits_extensions_default_install = [] lnbits_settings.lnbits_extensions_deactivate_all = True @@ -90,7 +89,7 @@ def run_before_and_after_tests(settings: Settings): @pytest.fixture(scope="session") async def app(settings: Settings): app = create_app() - async with LifespanManager(app, startup_timeout=30) as manager: + async with LifespanManager(app) as manager: settings.first_install = True await first_install( UpdateSuperuserPassword( @@ -364,7 +363,6 @@ def _settings_cleanup(settings: Settings): _restore_pure_settings(settings) settings.auth_https_only = False settings.lnbits_data_folder = "./tests/data" - settings.lnbits_wasm_extensions_path = "./tests/data/wasm_extensions" settings.bundle_assets = True settings.lnbits_admin_ui = True settings.lnbits_extensions_default_install = [] diff --git a/tests/e2e/bigpayment.spec.ts b/tests/e2e/bigpayment.spec.ts deleted file mode 100644 index 6ab31b15c..000000000 --- a/tests/e2e/bigpayment.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import {test, expect, randomHex} from './fixtures' -import { - createInvoice, - createWallet, - extensionApi, - extensionFrame, - fundWalletWithFakeBalance, - installAndEnableExtension, - invoicePaymentRequest, - login, - waitForWalletBalance -} from './extension-helpers' -import {BIGPAYMENT} from './extensions' - -test('install BigPayment and pay large invoice with fake wallet', async ({ - page, - lnbitsServer -}) => { - await login(page, lnbitsServer) - await installAndEnableExtension(page, BIGPAYMENT) - - const collector = await createWallet( - page, - `BigPayment collector ${randomHex()}` - ) - const source = await createWallet(page, `BigPayment source ${randomHex()}`) - const recipient = await createWallet( - page, - `BigPayment recipient ${randomHex()}` - ) - await fundWalletWithFakeBalance(page, source.id, {amountSats: 750}) - - await page.goto('/ext/bigpayment') - const frame = await extensionFrame(page, 'BigPayment') - await expect(frame.getByText('Pay large Lightning invoices')).toBeVisible({ - timeout: 60_000 - }) - - const invoice = await createInvoice(page, recipient, { - amountSats: 500, - memo: 'BigPayment Playwright recipient' - }) - const selection = await extensionApi( - page, - BIGPAYMENT.extId, - 'POST', - '/selection', - { - walletIds: [collector.id, source.id], - collectorWalletId: collector.id - } - ) - expect(selection.collectorWalletId).toBe(collector.id) - - const payment = await extensionApi( - page, - BIGPAYMENT.extId, - 'POST', - '/payments', - { - paymentRequest: invoicePaymentRequest(invoice), - walletIds: [collector.id, source.id], - collectorWalletId: collector.id, - memo: 'BigPayment Playwright payment' - } - ) - expect(payment.paid).toBe(true) - expect(payment.direct).toBe(false) - expect(payment.amountSat).toBe(500) - expect(Array.isArray(payment.transfers)).toBe(true) - expect((payment.transfers as Record[])[0].fromWalletId).toBe( - source.id - ) - await waitForWalletBalance(page, recipient, {expectedSats: 500}) -}) diff --git a/tests/e2e/extension-helpers.ts b/tests/e2e/extension-helpers.ts deleted file mode 100644 index 0508d1eba..000000000 --- a/tests/e2e/extension-helpers.ts +++ /dev/null @@ -1,641 +0,0 @@ -import {expect, type Frame, type Locator, type Page} from '@playwright/test' - -import { - browserJson, - delay, - isRecord, - type LNbitsE2EServer, - waitForResult -} from './fixtures' - -const INSTALLABLE_EXTENSION_REFRESH_TASK = - 'refresh_installable_extensions_cache' - -export type ExtensionUnderTest = { - configUrl?: string - extId: string - name: string - permissionTexts?: string[] -} - -export type E2EWallet = { - adminkey: string - id: string - inkey: string - name: string -} - -export async function login( - page: Page, - server: LNbitsE2EServer -): Promise { - await page.goto('/') - await page.locator('input[name="username"]').fill(server.username) - await page.locator('input[name="password"]').fill(server.password) - await page.getByRole('button', {name: /^login$/i}).click() - await expect(page).toHaveURL(/\/wallet\/[^/]+$/) - await dismissDisclaimer(page) -} - -export async function dismissDisclaimer(page: Page): Promise { - try { - await page - .getByRole('button', {name: 'I understand'}) - .click({timeout: 5_000}) - } catch (_error) {} -} - -export async function superuserWallet(page: Page): Promise { - const wallet = await page.evaluate(() => { - const global = window as typeof window & { - g: { - user: { - wallets: Array<{ - adminkey: string - id: string - inkey: string - name: string - }> - } - } - } - return { - adminkey: global.g.user.wallets[0].adminkey, - id: global.g.user.wallets[0].id, - inkey: global.g.user.wallets[0].inkey, - name: global.g.user.wallets[0].name - } - }) - return walletFromResponse(wallet) -} - -export async function createWallet( - page: Page, - name: string -): Promise { - const wallet = await browserJson(page, 'POST', '/api/v1/wallet', {name}) - return walletFromResponse(wallet) -} - -export async function fundWalletWithFakeBalance( - page: Page, - walletId: string, - {amountSats}: {amountSats: number} -): Promise { - const response = await browserJson(page, 'PUT', '/users/api/v1/balance', { - id: walletId, - amount: amountSats - }) - if (!isRecord(response) || response.success !== true) { - throw new Error(`Fake balance update failed: ${JSON.stringify(response)}`) - } -} - -export async function walletBalanceSat( - page: Page, - wallet: E2EWallet -): Promise { - const response = await browserJson( - page, - 'GET', - '/api/v1/wallet', - undefined, - wallet.inkey - ) - if (!isRecord(response) || typeof response.balance !== 'number') { - throw new Error( - `Wallet response missing balance: ${JSON.stringify(response)}` - ) - } - return Math.trunc(response.balance / 1000) -} - -export async function waitForWalletBalance( - page: Page, - wallet: E2EWallet, - {expectedSats, timeout = 30_000}: {expectedSats: number; timeout?: number} -): Promise { - return waitForResult( - `wallet ${wallet.id} balance to reach ${expectedSats} sats`, - async () => { - const balance = await walletBalanceSat(page, wallet) - return balance >= expectedSats ? balance : null - }, - {timeout} - ) -} - -export async function createInvoice( - page: Page, - wallet: E2EWallet, - { - amountSats, - memo, - extra = {} - }: {amountSats: number; extra?: Record; memo: string} -): Promise> { - const invoice = await browserJson( - page, - 'POST', - '/api/v1/payments', - { - out: false, - amount: amountSats, - unit: 'sat', - memo, - extra - }, - wallet.inkey - ) - if (!isRecord(invoice)) { - throw new Error( - `Invoice response is not an object: ${JSON.stringify(invoice)}` - ) - } - expect(invoicePaymentRequest(invoice).toLowerCase()).toMatch(/^lnbc/) - return invoice -} - -export async function payInvoiceWithWallet( - page: Page, - wallet: E2EWallet, - paymentRequest: string -): Promise> { - const payment = await browserJson( - page, - 'POST', - '/api/v1/payments', - {out: true, bolt11: paymentRequest}, - wallet.adminkey - ) - if (!isRecord(payment)) { - throw new Error( - `Payment response is not an object: ${JSON.stringify(payment)}` - ) - } - return payment -} - -export function invoicePaymentRequest( - invoice: Record -): string { - const paymentRequest = invoice.payment_request ?? invoice.bolt11 - if (typeof paymentRequest !== 'string') { - throw new Error( - `Invoice response missing payment request: ${JSON.stringify(invoice)}` - ) - } - return paymentRequest -} - -export async function installAndEnableExtension( - page: Page, - extension: ExtensionUnderTest -): Promise { - await installExtension(page, extension) - await enableExtension(page, extension) -} - -export async function installExtension( - page: Page, - extension: ExtensionUnderTest -): Promise { - const state = await extensionState(page, extension.extId) - if (state?.isInstalled) { - if (!state.isActive) { - await activateInstalledExtension(page, extension) - await waitForInstalledExtension(page, extension.extId) - } - return - } - - const installable = await waitForInstallableExtension(page, extension) - const release = latestReleaseFor(installable) - - await page.goto('/extensions') - await dismissDisclaimer(page) - await selectExtensionsTab(page, 'All') - await filterExtensions(page, extension.name) - const extensionCard = extensionCardFor(page, extension) - await expect(extensionCard).toBeVisible({timeout: 120_000}) - await extensionCard.getByRole('button', {name: /^manage$/i}).click() - - const manageDialog = manageExtensionDialog(page) - await expect(manageDialog).toBeVisible({timeout: 60_000}) - await expect( - manageDialog.getByRole('tab', {name: /^releases$/i}) - ).toBeVisible({ - timeout: 60_000 - }) - - const version = String(release.version) - const sourceRepo = String(release.source_repo) - const repositoryLabel = manageDialog.getByText(sourceRepo).first() - await expect(repositoryLabel).toBeVisible({timeout: 120_000}) - await repositoryLabel.click() - - const releaseLabel = manageDialog.getByText(version).first() - await expect(releaseLabel).toBeVisible({timeout: 120_000}) - await releaseLabel.click() - - const installButton = manageDialog - .getByRole('button', {name: /^install$/i}) - .first() - await expect(installButton).toBeVisible({timeout: 120_000}) - await installButton.click() - - const permissionsDialog = page - .locator('.q-dialog') - .filter({hasText: 'Grant extension permissions'}) - .last() - let hasPermissionsDialog = false - try { - await expect(permissionsDialog).toBeVisible({ - timeout: 10_000 - }) - hasPermissionsDialog = true - } catch (_error) {} - - if (hasPermissionsDialog) { - for (const permissionText of extension.permissionTexts ?? []) { - await expect( - permissionsDialog.getByText(permissionText).first() - ).toBeVisible({ - timeout: 60_000 - }) - } - const grantButton = permissionsDialog.getByRole('button', { - name: /^grant and install$/i - }) - await expect(grantButton).toBeEnabled({timeout: 60_000}) - await grantButton.click() - } - - await waitForInstalledExtension(page, extension.extId) - const latestConfig = await latestReleaseConfig(release) - const permissions = Array.isArray(latestConfig.permissions) - ? latestConfig.permissions.filter(isRecord) - : [] - let installed = await extensionState(page, extension.extId) - let grantedPermissionIds = installedPermissionIds(installed) - const missingPermissionIds = permissions - .map(permission => permission.id) - .filter(permissionId => !grantedPermissionIds.has(permissionId)) - - if (extension.configUrl && missingPermissionIds.length) { - const response = await page - .context() - .request.put( - `/api/v1/extension/${encodeURIComponent(extension.extId)}/permissions`, - {data: {permissions}} - ) - expect( - response.ok(), - `Could not grant local fixture permissions: ${await response.text()}` - ).toBe(true) - installed = await extensionState(page, extension.extId) - grantedPermissionIds = installedPermissionIds(installed) - } - - for (const permission of permissions) { - expect( - grantedPermissionIds.has(permission.id), - `Missing extension permission: ${String(permission.id)}` - ).toBe(true) - } -} - -export async function enableExtension( - page: Page, - extension: ExtensionUnderTest -): Promise { - if (await userExtensionEnabled(page, extension.extId)) return - - await page.goto(`/extensions#${encodeURIComponent(extension.extId)}`) - await dismissDisclaimer(page) - const extensionCard = extensionCardFor(page, extension) - await expect(extensionCard).toBeVisible({timeout: 120_000}) - const enableButton = extensionCard.getByRole('button', {name: /^enable$/i}) - await expect(enableButton).toBeVisible({timeout: 60_000}) - await enableButton.click() - await expect(page.getByText('Extension enabled!')).toBeVisible({ - timeout: 60_000 - }) - await waitForResult( - `${extension.extId} extension to be enabled for the user`, - async () => - (await userExtensionEnabled(page, extension.extId)) ? true : null, - {timeout: 60_000, interval: 1_000} - ) - await expect(extensionCard.getByRole('link', {name: /^open$/i})).toBeVisible({ - timeout: 60_000 - }) -} - -export async function activateInstalledExtension( - page: Page, - extension: ExtensionUnderTest -): Promise { - await page.goto('/extensions') - await selectExtensionsTab(page, 'Installed') - await filterExtensions(page, extension.name) - const extensionCard = extensionCardFor(page, extension) - await expect(extensionCard).toBeVisible({timeout: 120_000}) - const inactiveToggle = extensionCard.getByText(/^deactivated$/i) - try { - await inactiveToggle.click({timeout: 5_000}) - } catch (_error) { - return - } - await expect( - page.getByText( - new RegExp(`Extension '${escapeRegExp(extension.extId)}' activated!`) - ) - ).toBeVisible({timeout: 60_000}) -} - -export async function waitForInstallableExtension( - page: Page, - extension: ExtensionUnderTest, - {timeout = 360_000}: {timeout?: number} = {} -): Promise> { - let lastResponse: unknown - let lastError: unknown - const deadline = Date.now() + timeout - - while (Date.now() < deadline) { - try { - lastError = undefined - await waitForInstallableExtensionRefresh(page, deadline) - const extensions = await browserJson(page, 'GET', '/api/v1/extension/all') - lastResponse = extensions - const extensionList = Array.isArray(extensions) ? extensions : [] - const installable = extensionList - .filter(isRecord) - .find(item => item.id === extension.extId) - if (installable) return installable - await waitForInstallableExtensionRefresh(page, deadline) - } catch (error) { - lastError = error - } - await delay(2_000) - } - - throw new Error( - `${extension.name} extension did not become installable: ${JSON.stringify(lastResponse)}. Last error: ${String(lastError)}` - ) -} - -export async function waitForInstalledExtension( - page: Page, - extensionId: string, - {timeout = 120_000}: {timeout?: number} = {} -): Promise { - await waitForResult( - `${extensionId} extension to be installed and active`, - async () => { - const state = await extensionState(page, extensionId) - return state?.isInstalled && state.isActive ? true : null - }, - {timeout, interval: 2_000} - ) -} - -export async function extensionState( - page: Page, - extensionId: string -): Promise | null> { - const extensions = await browserJson(page, 'GET', '/api/v1/extension/all') - if (!Array.isArray(extensions)) { - throw new Error( - `Extensions response is not a list: ${JSON.stringify(extensions)}` - ) - } - return ( - extensions - .filter(isRecord) - .find(extension => extension.id === extensionId) ?? null - ) -} - -async function userExtensionEnabled( - page: Page, - extensionId: string -): Promise { - const extensions = await browserJson(page, 'GET', '/api/v1/extension') - if (!Array.isArray(extensions)) { - throw new Error( - `User extensions response is not a list: ${JSON.stringify(extensions)}` - ) - } - return extensions - .filter(isRecord) - .some(extension => extension.code === extensionId) -} - -export async function grantBackgroundPaymentPermission( - page: Page, - extensionId: string, - walletId: string, - { - maxAmountSats, - destinationPolicy = 'external_allowed' - }: {destinationPolicy?: string; maxAmountSats: number} -): Promise> { - const response = await browserJson( - page, - 'POST', - `/api/v1/extension/${extensionId}/permissions/background-payment`, - { - wallet_id: walletId, - max_amount: maxAmountSats, - destination_policy: destinationPolicy - } - ) - if (!isRecord(response)) { - throw new Error( - `Permission response is not an object: ${JSON.stringify(response)}` - ) - } - return response -} - -export async function grantWalletPaymentsWatchPermission( - page: Page, - extensionId: string, - walletId: string -): Promise> { - const response = await browserJson( - page, - 'POST', - `/api/v1/extension/${extensionId}/permissions/wallet-payments-watch`, - {wallet_id: walletId} - ) - if (!isRecord(response)) { - throw new Error( - `Permission response is not an object: ${JSON.stringify(response)}` - ) - } - return response -} - -export async function extensionApi( - page: Page, - extensionId: string, - method: string, - path: string, - data?: Record -): Promise> { - const body = await browserJson( - page, - method, - `/api/v1/ext/${extensionId}${path}`, - data - ) - if (isRecord(body) && body.ok === false) { - throw new Error(`${method} ${path} failed: ${JSON.stringify(body)}`) - } - const responseData = isRecord(body) && isRecord(body.data) ? body.data : body - if (!isRecord(responseData)) { - throw new Error( - `${method} ${path} returned non-object data: ${JSON.stringify(body)}` - ) - } - return responseData -} - -export async function extensionFrame( - page: Page, - title: string -): Promise { - const iframe = page.locator(`iframe[title="${title}"]`) - await expect(iframe).toBeVisible({timeout: 60_000}) - const handle = await iframe.elementHandle() - const frame = await handle?.contentFrame() - if (!frame) throw new Error(`Extension iframe not found: ${title}`) - return frame -} - -function extensionCardFor(page: Page, extension: ExtensionUnderTest): Locator { - return page.locator('.q-card').filter({hasText: extension.name}).first() -} - -async function filterExtensions(page: Page, searchTerm: string): Promise { - await page - .locator('.q-field') - .filter({hasText: 'Search extensions'}) - .locator('input') - .fill(searchTerm) -} - -async function selectExtensionsTab(page: Page, tabName: string): Promise { - const tab = page.getByRole('tab', { - name: new RegExp(`^${escapeRegExp(tabName)}$`, 'i') - }) - await expect(tab).toBeVisible({timeout: 60_000}) - for (let attempt = 0; attempt < 3; attempt += 1) { - await tab.click() - try { - await expect(tab).toHaveAttribute('aria-selected', 'true', { - timeout: 5_000 - }) - return - } catch (_error) { - await page.waitForTimeout(500) - } - } - await expect(tab).toHaveAttribute('aria-selected', 'true', {timeout: 60_000}) -} - -function manageExtensionDialog(page: Page): Locator { - return page.locator('.q-dialog').filter({hasText: 'Releases'}).last() -} - -async function waitForInstallableExtensionRefresh( - page: Page, - deadline: number -): Promise { - while (Date.now() < deadline) { - const tasks = await browserJson(page, 'GET', '/admin/api/v1/monitor') - if (!Array.isArray(tasks)) return - if ( - !tasks - .filter(isRecord) - .some(task => task.name === INSTALLABLE_EXTENSION_REFRESH_TASK) - ) { - return - } - await delay(2_000) - } -} - -function latestReleaseFor( - installable: Record -): Record { - const release = installable.latestRelease - if ( - !isRecord(release) || - typeof release.version !== 'string' || - typeof release.source_repo !== 'string' || - typeof release.details_link !== 'string' - ) { - throw new Error( - `Installable extension is missing release metadata: ${JSON.stringify(installable)}` - ) - } - return release -} - -function installedPermissionIds( - extension: Record | null -): Set { - return new Set( - Array.isArray(extension?.permissions) - ? extension.permissions.filter(isRecord).map(permission => permission.id) - : [] - ) -} - -async function latestReleaseConfig( - release: Record -): Promise> { - const config = await fetchJson(String(release.details_link)) - if (!isRecord(config)) { - throw new Error( - `Invalid extension config response: ${JSON.stringify(config)}` - ) - } - return config -} - -async function fetchJson(url: string): Promise { - const response = await fetch(url, { - headers: { - Accept: 'application/json', - 'User-Agent': 'LNbits Playwright e2e' - } - }) - const text = await response.text() - if (!response.ok) { - throw new Error(`${url} failed with ${response.status}: ${text}`) - } - return text ? JSON.parse(text) : {} -} - -function walletFromResponse(wallet: unknown): E2EWallet { - if (!isRecord(wallet)) { - throw new Error( - `Wallet response is not an object: ${JSON.stringify(wallet)}` - ) - } - return { - adminkey: String(wallet.adminkey), - id: String(wallet.id), - inkey: String(wallet.inkey), - name: String(wallet.name ?? wallet.id) - } -} - -function escapeRegExp(value: string): string { - return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') -} diff --git a/tests/e2e/extensions.ts b/tests/e2e/extensions.ts deleted file mode 100644 index b4063a623..000000000 --- a/tests/e2e/extensions.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type {ExtensionUnderTest} from './extension-helpers' - -const extensionFixtureUrl = - process.env.LNBITS_E2E_EXTENSION_FIXTURE_URL ?? 'http://127.0.0.1:5010' - -export const SUPPORTCHAT: ExtensionUnderTest = { - extId: 'supportchat', - name: 'Support Chat', - configUrl: `${extensionFixtureUrl}/config.json`, - permissionTexts: [ - 'Read public extension storage', - 'Append public extension storage', - 'Use extension websockets' - ] -} - -export const TIPS: ExtensionUnderTest = { - extId: 'tips', - name: 'Tips', - permissionTexts: ['Make background payments'] -} - -export const BIGPAYMENT: ExtensionUnderTest = { - extId: 'bigpayment', - name: 'BigPayment', - permissionTexts: ['Pay invoices'] -} - -export const PINGPONG: ExtensionUnderTest = { - extId: 'pingpong', - name: 'Ping Pong', - permissionTexts: ['Make background payments'] -} - -export const PAYSPLIT: ExtensionUnderTest = { - extId: 'paysplit', - name: 'PaySplit', - permissionTexts: ['Watch wallet payments'] -} diff --git a/tests/e2e/fixtures.ts b/tests/e2e/fixtures.ts deleted file mode 100644 index 13c9b92af..000000000 --- a/tests/e2e/fixtures.ts +++ /dev/null @@ -1,626 +0,0 @@ -import {randomUUID} from 'node:crypto' -import {unlink} from 'node:fs/promises' - -import {test as base, expect, type Page, type TestInfo} from '@playwright/test' - -export type LNbitsE2EServer = { - baseUrl: string - password: string - username: string -} - -const server: LNbitsE2EServer = { - baseUrl: process.env.LNBITS_E2E_BASE_URL ?? 'http://127.0.0.1:5009', - username: 'superadmin', - password: 'secret1234' -} - -const detailedScreenshotStates = new WeakMap< - TestInfo, - DetailedScreenshotState ->() - -const DETAILED_SCREENSHOT_SCRIPT = ` -(() => { - if (window.__lnbitsDetailedScreenshotsInstalled) return - window.__lnbitsDetailedScreenshotsInstalled = true - - let nextSnapshot = 0 - let scanScheduled = false - const visibleElements = new WeakMap() - - const notify = payload => { - setTimeout(() => { - try { - window.__lnbitsDetailedScreenshot({ - ...payload, - snapshotId: payload.snapshotId || (payload.kind + '-' + Date.now() + '-' + ++nextSnapshot), - url: payload.url || window.location.href - }) - } catch (_error) {} - }, 0) - } - - const notifyUrl = () => { - notify({ - kind: 'url', - label: window.location.href, - url: window.location.href - }) - } - - for (const name of ['pushState', 'replaceState']) { - const original = window.history[name] - window.history[name] = function (...args) { - const result = original.apply(this, args) - setTimeout(notifyUrl, 0) - return result - } - } - - window.addEventListener('hashchange', () => setTimeout(notifyUrl, 0)) - window.addEventListener('popstate', () => setTimeout(notifyUrl, 0)) - window.addEventListener('DOMContentLoaded', () => setTimeout(notifyUrl, 0)) - setTimeout(notifyUrl, 0) - - const groups = [ - { kind: 'dialog', selector: '.q-dialog, [role="dialog"]' }, - { kind: 'toast', selector: '.q-notification' } - ] - - const isVisible = element => { - if (!(element instanceof HTMLElement)) return false - if (element.getAttribute('aria-hidden') === 'true') return false - if (element.classList.contains('q-dialog--hidden')) return false - - const style = window.getComputedStyle(element) - if ( - style.display === 'none' || - style.visibility === 'hidden' || - style.opacity === '0' - ) { - return false - } - - const rect = element.getBoundingClientRect() - return rect.width > 0 && rect.height > 0 - } - - const textFor = element => ( - element.getAttribute('aria-label') || - element.innerText || - element.textContent || - '' - ).replace(/\\s+/g, ' ').trim().slice(0, 120) - - const labelFor = element => { - const headings = element.querySelectorAll([ - '[role="heading"]', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - '.text-h1', - '.text-h2', - '.text-h3', - '.text-h4', - '.text-h5', - '.text-h6' - ].join(', ')) - - for (const heading of headings) { - if (isVisible(heading)) { - const headingText = textFor(heading) - if (headingText) return headingText - } - } - - return textFor(element) - } - - const scan = () => { - for (const group of groups) { - for (const element of document.querySelectorAll(group.selector)) { - if (isVisible(element)) { - const label = labelFor(element) - if (visibleElements.get(element) !== label) { - visibleElements.set(element, label) - notify({ - kind: group.kind, - label, - url: window.location.href - }) - } - } else { - visibleElements.delete(element) - } - } - } - } - - const scheduleScan = () => { - if (scanScheduled) return - scanScheduled = true - requestAnimationFrame(() => { - scanScheduled = false - scan() - }) - } - - const installObserver = () => { - if (!document.documentElement) return - new MutationObserver(scheduleScan).observe(document.documentElement, { - attributes: true, - attributeFilter: ['aria-hidden', 'class', 'style'], - childList: true, - subtree: true - }) - scheduleScan() - } - - window.addEventListener('DOMContentLoaded', installObserver) - setTimeout(installObserver, 0) -})() -` - -export const test = base.extend< - {}, - { - lnbitsServer: LNbitsE2EServer - } ->({ - lnbitsServer: [ - async ({}, use) => { - await completeFirstInstall(server) - await use(server) - }, - {scope: 'worker'} - ], - page: async ({page, lnbitsServer}, use, testInfo) => { - void lnbitsServer - await page.addInitScript( - "window.localStorage.setItem('lnbits.disclaimerShown', 'true')" - ) - const recorder = await installDetailedScreenshots(page, testInfo) - page.setDefaultTimeout(60_000) - let failed = false - try { - await use(page) - } catch (error) { - failed = true - throw error - } finally { - await recorder.finish({ - retain: failed || testInfo.status !== testInfo.expectedStatus - }) - } - } -}) - -export {expect} - -async function completeFirstInstall(e2eServer: LNbitsE2EServer): Promise { - const deadline = Date.now() + 90_000 - let lastError = '' - - while (Date.now() < deadline) { - try { - const response = await requestJson( - `${e2eServer.baseUrl}/api/v1/auth/first_install`, - { - method: 'PUT', - data: { - username: e2eServer.username, - password: e2eServer.password, - password_repeat: e2eServer.password, - first_install_token: '' - }, - timeoutMs: 2_000 - } - ) - if (response.status === 200) return - if ( - response.status === 403 && - isRecord(response.body) && - response.body.detail === 'This is not your first install' - ) { - return - } - lastError = `${response.status}: ${JSON.stringify(response.body)}` - } catch (error) { - lastError = String(error) - } - await delay(500) - } - - throw new Error( - `LNbits e2e server did not complete first install. Last error: ${lastError}` - ) -} - -type RequestJsonOptions = { - apiKey?: string - data?: Record - method: string - timeoutMs?: number -} - -export async function apiJson( - baseUrl: string, - method: string, - path: string, - data?: Record, - apiKey?: string, - timeoutMs = 30_000 -): Promise> { - const response = await requestJson(`${baseUrl}${path}`, { - method, - data, - apiKey, - timeoutMs - }) - if (response.status < 200 || response.status >= 300) { - throw new Error( - `${method} ${path} failed with ${response.status}: ${JSON.stringify(response.body)}` - ) - } - if (!isRecord(response.body)) { - throw new Error( - `${method} ${path} returned non-object JSON: ${JSON.stringify(response.body)}` - ) - } - return response.body -} - -async function requestJson( - url: string, - {method, data, apiKey, timeoutMs = 30_000}: RequestJsonOptions -): Promise<{body: unknown; status: number}> { - const controller = new AbortController() - const timeout = setTimeout(() => controller.abort(), timeoutMs) - - try { - const response = await fetch(url, { - method, - headers: { - 'Content-Type': 'application/json', - ...(apiKey ? {'X-Api-Key': apiKey} : {}) - }, - body: data === undefined ? undefined : JSON.stringify(data), - signal: controller.signal - }) - const text = await response.text() - let body: unknown = {} - try { - body = text ? JSON.parse(text) : {} - } catch (_error) { - body = {detail: text} - } - return {status: response.status, body} - } finally { - clearTimeout(timeout) - } -} - -export function isRecord(value: unknown): value is Record { - return typeof value === 'object' && value !== null && !Array.isArray(value) -} - -export async function browserJson( - page: Page, - method: string, - path: string, - data?: Record, - apiKey?: string -): Promise { - const response = await page.evaluate( - async ({method, path, data, apiKey}) => { - const headers: Record = { - 'Content-Type': 'application/json' - } - if (apiKey) headers['X-Api-Key'] = apiKey - const response = await fetch(path, { - method, - headers, - credentials: 'same-origin', - body: data === undefined ? undefined : JSON.stringify(data) - }) - const text = await response.text() - let body: unknown = {} - try { - body = text ? JSON.parse(text) : {} - } catch (_error) { - body = {detail: text} - } - return {status: response.status, body} - }, - {method, path, data, apiKey} - ) - if (response.status < 200 || response.status >= 300) { - throw new Error( - `${method} ${path} failed with ${response.status}: ${JSON.stringify(response.body)}` - ) - } - return response.body -} - -export async function waitForResult( - description: string, - callback: () => Promise, - {timeout = 30_000, interval = 500}: {interval?: number; timeout?: number} = {} -): Promise { - const deadline = Date.now() + timeout - let lastResult: T | null | undefined - let lastError: unknown - - while (Date.now() < deadline) { - try { - lastError = undefined - lastResult = await callback() - if (lastResult !== null && lastResult !== undefined) return lastResult - } catch (error) { - lastError = error - } - await delay(interval) - } - - throw new Error( - `Timed out waiting for ${description}. Last result: ${JSON.stringify(lastResult)}. Last error: ${String(lastError)}` - ) -} - -export function delay(ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)) -} - -export function randomHex(): string { - return randomUUID().replace(/-/g, '').slice(0, 8) -} - -export type DetailedScreenshotHandle = { - finish(options?: {retain?: boolean}): Promise -} - -export async function installDetailedScreenshots( - page: Page, - testInfo: TestInfo -): Promise { - const recorder = new DetailedScreenshotRecorder(page, testInfo) - await recorder.install() - return recorder -} - -type DetailedScreenshotPayload = { - kind?: unknown - label?: unknown - snapshotId?: unknown - url?: unknown -} - -type DetailedScreenshotRequest = { - kind: 'dialog' | 'toast' | 'url' - label: string - snapshotId: string - url: string -} - -type DetailedScreenshotCapture = { - name: string - path: string -} - -type DetailedScreenshotState = { - captures: DetailedScreenshotCapture[] - finalized: boolean - screenshotIndex: number -} - -class DetailedScreenshotRecorder { - private readonly capturedUrlKeys = new Set() - private readonly page: Page - private readonly pending: DetailedScreenshotRequest[] = [] - private readonly testInfo: TestInfo - private flushPromise?: Promise - private flushTimer?: ReturnType - private lastQueuedKey = '' - private readonly state: DetailedScreenshotState - private stopped = false - - constructor(page: Page, testInfo: TestInfo) { - this.page = page - this.testInfo = testInfo - this.state = detailedScreenshotStateFor(testInfo) - } - - async install(): Promise { - await this.page.exposeBinding( - '__lnbitsDetailedScreenshot', - (_source, payload: DetailedScreenshotPayload) => { - this.queue(this.requestFromPayload(payload)) - } - ) - await this.page.addInitScript(DETAILED_SCREENSHOT_SCRIPT) - this.page.on('framenavigated', frame => { - const url = frame.url() - this.queue({ - kind: 'url', - label: url, - snapshotId: `frame-${Date.now()}`, - url - }) - }) - } - - async finish(options: {retain?: boolean} = {}): Promise { - this.queue({ - kind: 'url', - label: this.page.url(), - snapshotId: `final-${Date.now()}`, - url: this.page.url() - }) - this.stopped = true - if (this.flushTimer) { - clearTimeout(this.flushTimer) - this.flushTimer = undefined - } - await this.flush() - if (typeof options.retain === 'boolean') { - await finalizeDetailedScreenshots(this.testInfo, options.retain) - } - } - - private requestFromPayload( - payload: DetailedScreenshotPayload - ): DetailedScreenshotRequest | null { - const kind = typeof payload.kind === 'string' ? payload.kind : '' - if (!['dialog', 'toast', 'url'].includes(kind)) return null - - const url = - typeof payload.url === 'string' && payload.url - ? payload.url - : this.page.url() - const label = - typeof payload.label === 'string' && payload.label ? payload.label : kind - const snapshotId = - typeof payload.snapshotId === 'string' && payload.snapshotId - ? payload.snapshotId - : `${kind}-${Date.now()}` - - return { - kind: kind as DetailedScreenshotRequest['kind'], - label, - snapshotId, - url - } - } - - private queue(request: DetailedScreenshotRequest | null): void { - if (this.stopped || !request) return - if (!request.url || request.url === 'about:blank') return - - const key = - request.kind === 'url' - ? `${request.kind}:${request.url}` - : `${request.kind}:${request.snapshotId}:${request.url}:${request.label}` - if (request.kind === 'url' && this.capturedUrlKeys.has(key)) return - if (key === this.lastQueuedKey) return - - this.lastQueuedKey = key - this.pending.push(request) - this.scheduleFlush() - } - - private scheduleFlush(): void { - if (this.flushTimer) return - this.flushTimer = setTimeout(() => { - this.flushTimer = undefined - void this.flush() - }, 75) - } - - private async flush(): Promise { - if (this.flushPromise) { - await this.flushPromise - return - } - - this.flushPromise = this.flushQueue() - try { - await this.flushPromise - } finally { - this.flushPromise = undefined - } - } - - private async flushQueue(): Promise { - while (this.pending.length) { - const request = this.pending.shift() - if (!request) continue - await this.capture(request) - } - } - - private async capture(request: DetailedScreenshotRequest): Promise { - if (this.page.isClosed()) return - - if (request.kind === 'url') { - const key = `${request.kind}:${request.url}` - if (this.capturedUrlKeys.has(key)) return - this.capturedUrlKeys.add(key) - } - - const name = this.screenshotName(request) - const path = this.testInfo.outputPath(`${name}.png`) - try { - await this.page.waitForLoadState('domcontentloaded', {timeout: 2_000}) - } catch (_error) {} - try { - await this.page.waitForTimeout(250) - await this.page.screenshot({path, fullPage: true, timeout: 5_000}) - this.state.captures.push({name, path}) - } catch (_error) {} - } - - private screenshotName(request: DetailedScreenshotRequest): string { - this.state.screenshotIndex += 1 - return [ - 'screenshot', - this.state.screenshotIndex.toString().padStart(3, '0'), - request.kind, - slugFor(request.kind === 'url' ? request.url : request.label) - ].join('-') - } -} - -async function finalizeDetailedScreenshots( - testInfo: TestInfo, - retain: boolean -): Promise { - const state = detailedScreenshotStateFor(testInfo) - if (state.finalized) return - state.finalized = true - - if (retain) { - for (const capture of state.captures) { - await testInfo.attach(capture.name, { - path: capture.path, - contentType: 'image/png' - }) - } - return - } - - await Promise.all( - state.captures.map(async capture => { - try { - await unlink(capture.path) - } catch (_error) {} - }) - ) -} - -function detailedScreenshotStateFor( - testInfo: TestInfo -): DetailedScreenshotState { - const existing = detailedScreenshotStates.get(testInfo) - if (existing) return existing - const state = { - captures: [], - finalized: false, - screenshotIndex: 0 - } - detailedScreenshotStates.set(testInfo, state) - return state -} - -function slugFor(value: string): string { - const slug = value - .replace(/^[a-z]+:\/\//i, '') - .split(/[?#]/, 1)[0] - .replace(/[^A-Za-z0-9._-]+/g, '-') - .replace(/^[-._]+|[-._]+$/g, '') - .slice(0, 80) - return slug || 'capture' -} diff --git a/tests/e2e/lnurl-helpers.ts b/tests/e2e/lnurl-helpers.ts deleted file mode 100644 index 0ed719f7c..000000000 --- a/tests/e2e/lnurl-helpers.ts +++ /dev/null @@ -1,203 +0,0 @@ -import http from 'node:http' - -import {apiJson} from './fixtures' -import {type E2EWallet, invoicePaymentRequest} from './extension-helpers' - -export class LNURLPayServer { - private readonly baseUrl: string - private readonly targetWallet: E2EWallet - private server?: http.Server - private serverUrl?: string - - private constructor(baseUrl: string, targetWallet: E2EWallet) { - this.baseUrl = baseUrl - this.targetWallet = targetWallet - } - - static async start( - baseUrl: string, - targetWallet: E2EWallet - ): Promise { - const lnurlServer = new LNURLPayServer(baseUrl, targetWallet) - await lnurlServer.listen() - return lnurlServer - } - - get url(): string { - if (!this.serverUrl) throw new Error('LNURL server is not listening') - return this.serverUrl - } - - get lnurl(): string { - return bech32Encode( - 'lnurl', - convertBits([...new TextEncoder().encode(this.url)], 8, 5, true) - ) - } - - async close(): Promise { - const server = this.server - if (!server) return - await new Promise((resolve, reject) => { - server.close(error => { - if (error) reject(error) - else resolve() - }) - }) - } - - private async listen(): Promise { - this.server = http.createServer((request, response) => { - void this.handleRequest(request, response) - }) - await new Promise((resolve, reject) => { - this.server?.once('error', reject) - this.server?.listen(0, '127.0.0.1', () => resolve()) - }) - const address = this.server.address() - if (!address || typeof address === 'string') { - throw new Error('LNURL server did not bind a TCP address') - } - this.serverUrl = `http://127.0.0.1:${address.port}/pay` - } - - private async handleRequest( - request: http.IncomingMessage, - response: http.ServerResponse - ): Promise { - try { - const requestUrl = new URL(request.url ?? '/', this.url) - if (requestUrl.pathname === '/pay') { - sendJson(response, 200, { - tag: 'payRequest', - callback: this.callbackUrl(), - minSendable: 1000, - maxSendable: 1_000_000, - metadata: JSON.stringify([['text/plain', 'LNbits e2e LNURL-pay']]) - }) - return - } - - if (requestUrl.pathname === '/callback') { - const amountMsat = Number(requestUrl.searchParams.get('amount') ?? '0') - const invoice = await apiJson( - this.baseUrl, - 'POST', - '/api/v1/payments', - { - out: false, - amount: Math.trunc(amountMsat / 1000), - unit: 'sat', - memo: 'LNbits e2e LNURL-pay target' - }, - this.targetWallet.inkey - ) - sendJson(response, 200, { - pr: invoicePaymentRequest(invoice), - routes: [] - }) - return - } - - sendJson(response, 404, { - status: 'ERROR', - reason: 'LNURL route not found.' - }) - } catch (error) { - sendJson(response, 500, { - status: 'ERROR', - reason: String(error) - }) - } - } - - private callbackUrl(): string { - const url = new URL(this.url) - url.pathname = '/callback' - return url.toString() - } -} - -function sendJson( - response: http.ServerResponse, - status: number, - body: Record -): void { - const rawBody = JSON.stringify(body) - response.writeHead(status, { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(rawBody) - }) - response.end(rawBody) -} - -const BECH32_CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' - -function bech32Encode(hrp: string, data: number[]): string { - const combined = [...data, ...bech32CreateChecksum(hrp, data)] - return `${hrp}1${combined.map(value => BECH32_CHARSET[value]).join('')}` -} - -function bech32CreateChecksum(hrp: string, data: number[]): number[] { - const values = [...bech32HrpExpand(hrp), ...data, 0, 0, 0, 0, 0, 0] - const polymod = bech32Polymod(values) ^ 1 - const result: number[] = [] - for (let index = 0; index < 6; index += 1) { - result.push((polymod >> (5 * (5 - index))) & 31) - } - return result -} - -function bech32HrpExpand(hrp: string): number[] { - const highBits = [...hrp].map(char => char.charCodeAt(0) >> 5) - const lowBits = [...hrp].map(char => char.charCodeAt(0) & 31) - return [...highBits, 0, ...lowBits] -} - -function bech32Polymod(values: number[]): number { - const generators = [ - 0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3 - ] - let checksum = 1 - for (const value of values) { - const top = checksum >> 25 - checksum = ((checksum & 0x1ffffff) << 5) ^ value - for (let index = 0; index < 5; index += 1) { - if ((top >> index) & 1) checksum ^= generators[index] - } - } - return checksum -} - -function convertBits( - data: number[], - fromBits: number, - toBits: number, - pad: boolean -): number[] { - let acc = 0 - let bits = 0 - const result: number[] = [] - const maxValue = (1 << toBits) - 1 - const maxAcc = (1 << (fromBits + toBits - 1)) - 1 - - for (const value of data) { - if (value < 0 || value >> fromBits) { - throw new Error('Invalid bech32 data value') - } - acc = ((acc << fromBits) | value) & maxAcc - bits += fromBits - while (bits >= toBits) { - bits -= toBits - result.push((acc >> bits) & maxValue) - } - } - - if (pad) { - if (bits > 0) result.push((acc << (toBits - bits)) & maxValue) - } else if (bits >= fromBits || (acc << (toBits - bits)) & maxValue) { - throw new Error('Invalid bech32 padding') - } - - return result -} diff --git a/tests/e2e/paysplit.spec.ts b/tests/e2e/paysplit.spec.ts deleted file mode 100644 index 24591eb0c..000000000 --- a/tests/e2e/paysplit.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import {test, expect, randomHex} from './fixtures' -import { - createInvoice, - createWallet, - extensionApi, - extensionFrame, - fundWalletWithFakeBalance, - grantBackgroundPaymentPermission, - grantWalletPaymentsWatchPermission, - installAndEnableExtension, - invoicePaymentRequest, - login, - payInvoiceWithWallet, - waitForWalletBalance -} from './extension-helpers' -import {LNURLPayServer} from './lnurl-helpers' -import {PAYSPLIT} from './extensions' - -test('install PaySplit and split incoming payment with fake wallet', async ({ - page, - lnbitsServer -}) => { - await login(page, lnbitsServer) - const source = await createWallet(page, `PaySplit source ${randomHex()}`) - const target = await createWallet(page, `PaySplit target ${randomHex()}`) - const payer = await createWallet(page, `PaySplit payer ${randomHex()}`) - await fundWalletWithFakeBalance(page, payer.id, {amountSats: 250}) - - await installAndEnableExtension(page, PAYSPLIT) - await grantWalletPaymentsWatchPermission(page, PAYSPLIT.extId, source.id) - await grantBackgroundPaymentPermission(page, PAYSPLIT.extId, source.id, { - maxAmountSats: 100 - }) - - const lnurlServer = await LNURLPayServer.start(lnbitsServer.baseUrl, target) - try { - const saved = await extensionApi(page, PAYSPLIT.extId, 'POST', '/sources', { - enabled: true, - maxAmount: 100, - targets: [ - { - alias: 'Playwright target', - lnurl: lnurlServer.lnurl, - percent: 25 - } - ], - walletId: source.id, - walletName: source.name - }) - const sourceConfig = saved.source as Record - const targets = saved.targets as Record[] - expect(sourceConfig.wallet_id).toBe(source.id) - expect(targets[0].percent).toBe(25) - - await page.goto('/ext/paysplit') - const frame = await extensionFrame(page, 'PaySplit') - await frame.locator('#walletSelect').selectOption(source.id) - await expect(frame.locator('.target-lnurl').first()).toHaveValue( - lnurlServer.lnurl, - {timeout: 60_000} - ) - - const invoice = await createInvoice(page, source, { - amountSats: 100, - memo: 'PaySplit Playwright source' - }) - await payInvoiceWithWallet(page, payer, invoicePaymentRequest(invoice)) - await waitForWalletBalance(page, target, { - expectedSats: 25, - timeout: 45_000 - }) - } finally { - await lnurlServer.close() - } - - const sourceConfig = await extensionApi( - page, - PAYSPLIT.extId, - 'GET', - `/sources/${source.id}` - ) - const sourceData = sourceConfig.source as Record - const targets = sourceConfig.targets as Record[] - expect(sourceData.enabled).toBe(true) - expect(targets[0].alias).toBe('Playwright target') -}) diff --git a/tests/e2e/pingpong.spec.ts b/tests/e2e/pingpong.spec.ts deleted file mode 100644 index 7b2d98616..000000000 --- a/tests/e2e/pingpong.spec.ts +++ /dev/null @@ -1,380 +0,0 @@ -import type {Page, Response} from '@playwright/test' - -import { - test, - expect, - installDetailedScreenshots, - randomHex, - waitForResult, - isRecord -} from './fixtures' -import { - createWallet, - extensionApi, - extensionFrame, - fundWalletWithFakeBalance, - grantBackgroundPaymentPermission, - installAndEnableExtension, - login, - payInvoiceWithWallet, - superuserWallet, - waitForWalletBalance -} from './extension-helpers' -import {LNURLPayServer} from './lnurl-helpers' -import {PINGPONG} from './extensions' - -type GameInvoice = { - gameId: string - invoice: { - checkingId: string - paymentHash: string - paymentRequest: string - } - playerSlot: 'player1' | 'player2' - playerToken: string -} - -test('install Ping Pong, play public game, and pay winner with fake wallet', async ({ - page, - browser, - lnbitsServer -}, testInfo) => { - await login(page, lnbitsServer) - const escrow = await superuserWallet(page) - const player1EntryWallet = await createWallet( - page, - `PingPong player 1 entry ${randomHex()}` - ) - const player2EntryWallet = await createWallet( - page, - `PingPong player 2 entry ${randomHex()}` - ) - const player1PayoutTarget = await createWallet( - page, - `PingPong player 1 payout ${randomHex()}` - ) - const player2PayoutTarget = await createWallet( - page, - `PingPong player 2 payout ${randomHex()}` - ) - await fundWalletWithFakeBalance(page, player1EntryWallet.id, { - amountSats: 100 - }) - await fundWalletWithFakeBalance(page, player2EntryWallet.id, { - amountSats: 100 - }) - - await installAndEnableExtension(page, PINGPONG) - await grantBackgroundPaymentPermission(page, PINGPONG.extId, escrow.id, { - maxAmountSats: 100 - }) - - await page.goto('/ext/pingpong') - const adminFrame = await extensionFrame(page, 'Ping Pong') - await expect(adminFrame.getByText('Lightning Pong tables')).toBeVisible({ - timeout: 60_000 - }) - - const tableName = `Playwright Pong ${randomHex()}` - const table = await extensionApi(page, PINGPONG.extId, 'POST', '/tables', { - name: tableName, - description: 'Playwright fake wallet table', - walletId: escrow.id, - entrySats: 3, - gamesToWin: 1, - hostPercent: 0 - }) - expect(table.name).toBe(tableName) - - const player1LnurlServer = await LNURLPayServer.start( - lnbitsServer.baseUrl, - player1PayoutTarget - ) - const player2LnurlServer = await LNURLPayServer.start( - lnbitsServer.baseUrl, - player2PayoutTarget - ) - - const player2Context = await browser.newContext({ - baseURL: lnbitsServer.baseUrl, - viewport: {width: 1280, height: 900} - }) - const player2Page = await player2Context.newPage() - player2Page.setDefaultTimeout(60_000) - const player2Recorder = await installDetailedScreenshots( - player2Page, - testInfo - ) - - try { - const player1Game = await createPublicGame( - page, - String(table.id), - tableName, - player1LnurlServer.lnurl - ) - await payInvoiceWithWallet( - page, - player1EntryWallet, - player1Game.invoice.paymentRequest - ) - await waitForResult( - 'Ping Pong player 1 payment to be recorded', - async () => - pingpongGameIfPlayer1Paid( - page, - player1Game.gameId, - player1Game.playerToken - ), - {timeout: 30_000} - ) - await page.goto(publicGamePath(player1Game.gameId)) - const player1WaitingFrame = await extensionFrame(page, 'Ping Pong') - const waitingGame = await publicGame( - page, - player1Game.gameId, - player1Game.playerToken - ) - expect(waitingGame.status).toBe('waiting_opponent') - await expect(player1WaitingFrame.locator('#game-note')).toContainText( - 'Share the game link with player 2.' - ) - - const player2Game = await joinPublicGame( - player2Page, - player1Game.gameId, - tableName, - player2LnurlServer.lnurl - ) - await payInvoiceWithWallet( - player2Page, - player2EntryWallet, - player2Game.invoice.paymentRequest - ) - await waitForResult( - 'Ping Pong game to start playing after both players paid', - async () => { - const game = await publicGame( - page, - player1Game.gameId, - player1Game.playerToken - ) - return game.status === 'playing' && - game.player1Paid === true && - game.player2Paid === true - ? game - : null - }, - {timeout: 60_000} - ) - - await page.goto(publicGamePath(player1Game.gameId)) - await player2Page.goto(publicGamePath(player1Game.gameId)) - const player1PlayingFrame = await extensionFrame(page, 'Ping Pong') - const player2PlayingFrame = await extensionFrame(player2Page, 'Ping Pong') - await expect(player1PlayingFrame.locator('#game-status')).toHaveText( - 'playing', - {timeout: 60_000} - ) - await expect(player2PlayingFrame.locator('#game-status')).toHaveText( - 'playing', - {timeout: 60_000} - ) - await expect(player1PlayingFrame.locator('#game-note')).toContainText( - 'You control the left paddle.' - ) - await expect(player2PlayingFrame.locator('#game-note')).toContainText( - 'You control the right paddle.' - ) - - const finished = await extensionApi( - page, - PINGPONG.extId, - 'POST', - `/games/${player1Game.gameId}/finish`, - { - playerToken: player1Game.playerToken, - winnerSlot: 'player1', - player1Wins: 1, - player2Wins: 0, - currentPlayer1Score: 11, - currentPlayer2Score: 0 - } - ) - expect(finished.winnerSlot).toBe('player1') - - const paidGame = await waitForResult( - 'Ping Pong winner payout to be paid', - async () => { - const game = await publicGame( - page, - player1Game.gameId, - player1Game.playerToken - ) - return game.status === 'paid' && game.payoutStatus === 'paid' - ? game - : null - }, - {timeout: 60_000, interval: 2_000} - ) - expect(paidGame.winnerSlot).toBe('player1') - await waitForWalletBalance(page, player1PayoutTarget, { - expectedSats: Number( - (paidGame.table as Record).winnerPayoutSats - ), - timeout: 60_000 - }) - - await page.goto(publicGamePath(player1Game.gameId)) - await player2Page.goto(publicGamePath(player1Game.gameId)) - const player1PaidFrame = await extensionFrame(page, 'Ping Pong') - const player2PaidFrame = await extensionFrame(player2Page, 'Ping Pong') - await expect(player1PaidFrame.locator('#game-status')).toHaveText( - 'Player 1 won', - {timeout: 60_000} - ) - await expect(player2PaidFrame.locator('#game-status')).toHaveText( - 'Player 1 won', - {timeout: 60_000} - ) - await expect(player1PaidFrame.locator('#game-note')).toContainText( - 'Player 1 won. Payout status: paid.' - ) - } finally { - await player2Recorder.finish() - await player2Context.close() - await player1LnurlServer.close() - await player2LnurlServer.close() - } - - await page.goto('/ext/pingpong') - const updatedFrame = await extensionFrame(page, 'Ping Pong') - await expect(updatedFrame.getByText(tableName)).toBeVisible({timeout: 60_000}) -}) - -async function pingpongGameIfPlayer1Paid( - page: Page, - gameId: string, - playerToken: string -): Promise | null> { - const game = await publicGame(page, gameId, playerToken) - return game.player1Paid === true ? game : null -} - -async function createPublicGame( - page: Page, - tableId: string, - tableName: string, - lnurl: string -): Promise { - await page.goto(publicTablePath(tableId)) - const frame = await extensionFrame(page, 'Ping Pong') - await expect(frame.locator('#table-view')).toBeVisible({timeout: 60_000}) - await expect(frame.locator('#table-name')).toHaveText(tableName) - await frame.locator('#create-lnurl').fill(lnurl) - - const responsePromise = page.waitForResponse( - response => - response.request().method() === 'POST' && - response - .url() - .includes(`/api/v1/ext/${PINGPONG.extId}/tables/${tableId}/games`) - ) - await frame.locator('#create-game').click() - const game = await gameInvoiceFromResponse(await responsePromise) - await expect(frame.locator('#payment-view')).toBeVisible({timeout: 60_000}) - await expect(frame.locator('#invoice-text')).toHaveText( - game.invoice.paymentRequest, - {timeout: 60_000} - ) - return game -} - -async function joinPublicGame( - page: Page, - gameId: string, - tableName: string, - lnurl: string -): Promise { - await page.goto(publicGamePath(gameId)) - const frame = await extensionFrame(page, 'Ping Pong') - await expect(frame.locator('#game-view')).toBeVisible({timeout: 60_000}) - await expect(frame.locator('#game-meta')).toContainText(tableName) - await expect(frame.locator('#join-panel')).toBeVisible({timeout: 60_000}) - await frame.locator('#join-lnurl').fill(lnurl) - - const responsePromise = page.waitForResponse( - response => - response.request().method() === 'POST' && - response - .url() - .includes(`/api/v1/ext/${PINGPONG.extId}/games/${gameId}/join`) - ) - await frame.locator('#join-game').click() - const game = await gameInvoiceFromResponse(await responsePromise) - await expect(frame.locator('#payment-view')).toBeVisible({timeout: 60_000}) - await expect(frame.locator('#invoice-text')).toHaveText( - game.invoice.paymentRequest, - {timeout: 60_000} - ) - return game -} - -async function publicGame( - page: Page, - gameId: string, - playerToken: string -): Promise> { - return extensionApi( - page, - PINGPONG.extId, - 'GET', - `/games/${gameId}/public?playerToken=${playerToken}` - ) -} - -async function gameInvoiceFromResponse( - response: Response -): Promise { - const body = await response.json() - const data = isRecord(body) && isRecord(body.data) ? body.data : body - if (!isRecord(data) || !isRecord(data.invoice)) { - throw new Error( - `Ping Pong game invoice response is invalid: ${JSON.stringify(body)}` - ) - } - const paymentRequest = data.invoice.paymentRequest - const paymentHash = data.invoice.paymentHash - const checkingId = data.invoice.checkingId - if ( - typeof data.gameId !== 'string' || - typeof data.playerSlot !== 'string' || - typeof data.playerToken !== 'string' || - typeof paymentRequest !== 'string' || - typeof paymentHash !== 'string' || - typeof checkingId !== 'string' - ) { - throw new Error( - `Ping Pong game invoice response is incomplete: ${JSON.stringify(body)}` - ) - } - expect(paymentRequest.toLowerCase()).toMatch(/^lnbc/) - return { - gameId: data.gameId, - playerSlot: data.playerSlot as GameInvoice['playerSlot'], - playerToken: data.playerToken, - invoice: { - checkingId, - paymentHash, - paymentRequest - } - } -} - -function publicTablePath(tableId: string): string { - return `/ext/${PINGPONG.extId}/t/${encodeURIComponent(tableId)}` -} - -function publicGamePath(gameId: string): string { - return `/ext/${PINGPONG.extId}/g/${encodeURIComponent(gameId)}` -} diff --git a/tests/e2e/playwright.config.ts b/tests/e2e/playwright.config.ts deleted file mode 100644 index b61b1d023..000000000 --- a/tests/e2e/playwright.config.ts +++ /dev/null @@ -1,69 +0,0 @@ -import {defineConfig} from '@playwright/test' -import {resolve} from 'node:path' - -const appBaseUrl = process.env.LNBITS_E2E_BASE_URL ?? 'http://127.0.0.1:5009' -const e2eDir = __dirname -const isCi = Boolean(process.env.CI) -const projectRoot = resolve(e2eDir, '../..') -const reportRoot = resolve(projectRoot, 'test-reports') -const configuredWorkers = Number.parseInt( - process.env.PLAYWRIGHT_WORKERS ?? '', - 10 -) - -export default defineConfig({ - testDir: e2eDir, - testMatch: '**/*.spec.ts', - outputDir: resolve(reportRoot, 'test-results'), - timeout: 600_000, - fullyParallel: false, - forbidOnly: isCi, - retries: isCi ? 1 : 0, - workers: - Number.isInteger(configuredWorkers) && configuredWorkers > 0 - ? configuredWorkers - : 1, - expect: { - timeout: 15_000 - }, - reporter: isCi - ? [ - ['github'], - [ - 'html', - { - open: 'never', - outputFolder: resolve(reportRoot, 'playwright-report') - } - ] - ] - : [ - ['list'], - [ - 'html', - { - open: 'never', - outputFolder: resolve(reportRoot, 'playwright-report') - } - ] - ], - use: { - baseURL: appBaseUrl, - browserName: 'chromium', - headless: true, - viewport: { - width: 1280, - height: 900 - }, - trace: 'off', - screenshot: 'only-on-failure', - video: 'off' - }, - webServer: { - command: 'node ./tests/e2e/start-lnbits-server.cjs', - cwd: projectRoot, - url: appBaseUrl, - reuseExistingServer: false, - timeout: 180_000 - } -}) diff --git a/tests/e2e/start-lnbits-server.cjs b/tests/e2e/start-lnbits-server.cjs deleted file mode 100644 index c1a66be8c..000000000 --- a/tests/e2e/start-lnbits-server.cjs +++ /dev/null @@ -1,191 +0,0 @@ -const childProcess = require('node:child_process') -const crypto = require('node:crypto') -const fs = require('node:fs') -const http = require('node:http') -const os = require('node:os') -const path = require('node:path') - -const rootDir = path.resolve(__dirname, '../..') -const baseUrl = new URL( - process.env.LNBITS_E2E_BASE_URL ?? 'http://127.0.0.1:5009' -) -const host = baseUrl.hostname -const port = baseUrl.port || (baseUrl.protocol === 'https:' ? '443' : '80') -const dataDir = - process.env.LNBITS_E2E_DATA_FOLDER ?? - fs.mkdtempSync(path.join(os.tmpdir(), 'lnbits-e2e-')) -const logDir = path.join(rootDir, 'test-reports', 'test-results') -const logFile = path.join(logDir, 'lnbits-e2e-server.log') -const extensionFixtureUrl = new URL( - process.env.LNBITS_E2E_EXTENSION_FIXTURE_URL ?? 'http://127.0.0.1:5010' -) - -fs.mkdirSync(dataDir, {recursive: true}) -fs.mkdirSync(logDir, {recursive: true}) - -const supportchatFixture = createSupportchatFixture(extensionFixtureUrl) -const wasmExtensionManifests = [ - ...(supportchatFixture - ? [new URL('/manifest.json', extensionFixtureUrl).toString()] - : []), - 'https://raw.githubusercontent.com/lnbits/lnbits-extensions-wasm/refs/heads/main/extensions.json' -] -const extensionFixtureServer = supportchatFixture - ? http.createServer((request, response) => { - const pathname = new URL(request.url ?? '/', extensionFixtureUrl).pathname - const fixture = supportchatFixture.responses[pathname] - if (!fixture) { - response.writeHead(404, {'Content-Type': 'text/plain; charset=utf-8'}) - response.end('Not found') - return - } - response.writeHead(200, { - 'Cache-Control': 'no-store', - 'Content-Type': fixture.contentType - }) - response.end(fixture.body) - }) - : null -extensionFixtureServer?.listen( - Number(extensionFixtureUrl.port || 80), - extensionFixtureUrl.hostname -) - -const log = fs.openSync(logFile, 'a') -const server = childProcess.spawn( - 'uv', - [ - 'run', - 'uvicorn', - 'lnbits.__main__:app', - '--host', - host, - '--port', - port, - '--log-level', - 'warning' - ], - { - cwd: rootDir, - env: { - ...process.env, - AUTH_HTTPS_ONLY: 'false', - DEBUG: 'true', - HOST: host, - LNBITS_ADMIN_UI: 'true', - LNBITS_BACKEND_WALLET_CLASS: 'FakeWallet', - LNBITS_DATA_FOLDER: dataDir, - LNBITS_ENABLE_LOG_TO_FILE: 'false', - LNBITS_EXTENSIONS_PATH: dataDir, - LNBITS_WASM_EXTENSIONS_MANIFESTS: JSON.stringify(wasmExtensionManifests), - PORT: port, - PYTHONUNBUFFERED: '1' - }, - stdio: ['ignore', log, log] - } -) - -let shuttingDown = false - -const shutdown = signal => { - if (shuttingDown) return - shuttingDown = true - extensionFixtureServer?.close() - - if (server.pid && server.exitCode === null) { - try { - server.kill(signal) - } catch (_error) {} - } - - setTimeout(() => { - if (server.pid && server.exitCode === null) { - try { - server.kill('SIGKILL') - } catch (_error) {} - } - process.exit(0) - }, 15_000).unref() -} - -process.on('SIGTERM', () => shutdown('SIGTERM')) -process.on('SIGINT', () => shutdown('SIGINT')) - -server.on('exit', (code, signal) => { - extensionFixtureServer?.close() - fs.closeSync(log) - if (!shuttingDown) { - process.exit(code ?? (signal ? 1 : 0)) - } -}) - -function createSupportchatFixture(fixtureUrl) { - const sourceDir = - process.env.LNBITS_E2E_SUPPORTCHAT_DIR ?? - path.join(rootDir, 'data', 'extensions', 'supportchat') - if (!fs.existsSync(path.join(sourceDir, 'config.json'))) return null - const config = JSON.parse( - fs.readFileSync(path.join(sourceDir, 'config.json'), 'utf8') - ) - const fixtureRoot = fs.mkdtempSync( - path.join(os.tmpdir(), 'lnbits-supportchat-e2e-') - ) - const archiveRootName = `supportchat-${config.version}` - const archiveRoot = path.join(fixtureRoot, archiveRootName) - fs.mkdirSync(archiveRoot, {recursive: true}) - - for (const name of ['config.json', 'static', 'storage', 'ui', 'wasm']) { - fs.cpSync(path.join(sourceDir, name), path.join(archiveRoot, name), { - recursive: true - }) - } - - const archivePath = path.join(fixtureRoot, 'supportchat.zip') - const zipped = childProcess.spawnSync( - 'zip', - ['-q', '-r', archivePath, archiveRootName], - { - cwd: fixtureRoot, - encoding: 'utf8' - } - ) - if (zipped.status !== 0) { - throw new Error(`Could not create supportchat fixture: ${zipped.stderr}`) - } - const archive = fs.readFileSync(archivePath) - const hash = crypto.createHash('sha256').update(archive).digest('hex') - const archiveUrl = new URL('/supportchat.zip', fixtureUrl).toString() - const configUrl = new URL('/config.json', fixtureUrl).toString() - const manifest = { - extensions: [ - { - id: 'supportchat', - name: config.name, - version: config.version, - archive: archiveUrl, - hash, - repo: 'local-e2e', - short_description: config.short_description, - min_lnbits_version: config.min_lnbits_version, - details_link: configUrl - } - ] - } - - return { - responses: { - '/config.json': { - body: Buffer.from(JSON.stringify(config)), - contentType: 'application/json; charset=utf-8' - }, - '/manifest.json': { - body: Buffer.from(JSON.stringify(manifest)), - contentType: 'application/json; charset=utf-8' - }, - '/supportchat.zip': { - body: archive, - contentType: 'application/zip' - } - } - } -} diff --git a/tests/e2e/supportchat.spec.ts b/tests/e2e/supportchat.spec.ts deleted file mode 100644 index c1f9c0b67..000000000 --- a/tests/e2e/supportchat.spec.ts +++ /dev/null @@ -1,268 +0,0 @@ -import {existsSync} from 'node:fs' -import {join, resolve} from 'node:path' - -import { - expect, - installDetailedScreenshots, - isRecord, - randomHex, - test -} from './fixtures' -import { - extensionApi, - extensionFrame, - installAndEnableExtension, - login -} from './extension-helpers' -import {SUPPORTCHAT} from './extensions' - -const supportchatDir = - process.env.LNBITS_E2E_SUPPORTCHAT_DIR ?? - resolve('data/extensions/supportchat') - -test.skip( - !existsSync(join(supportchatDir, 'config.json')), - 'Support Chat E2E requires LNBITS_E2E_SUPPORTCHAT_DIR or data/extensions/supportchat.' -) - -test('install Support Chat and run the visitor-to-agent support workflow', async ({ - page, - browser, - lnbitsServer -}, testInfo) => { - await login(page, lnbitsServer) - await installAndEnableExtension(page, SUPPORTCHAT) - - await page.goto('/ext/supportchat') - let adminFrame = await extensionFrame(page, 'Support Chat') - await expect( - adminFrame.getByRole('heading', {name: 'Support Chat'}) - ).toBeVisible({timeout: 60_000}) - - const inboxName = `Playwright Support ${randomHex()}` - const inboxForm = adminFrame.locator('#inbox-form') - const createInboxButton = inboxForm.getByRole('button', { - name: 'Create inbox' - }) - await expect(createInboxButton).toBeEnabled() - await inboxForm.locator('[name="name"]').fill(inboxName) - await inboxForm - .locator('[name="welcomeMessage"]') - .fill('How can the Playwright support team help?') - await inboxForm.locator('[name="launcherText"]').fill('Ask Playwright') - await inboxForm - .locator('[name="offlineMessage"]') - .fill('Playwright support is offline; leave a message.') - await inboxForm.locator('[name="officeHoursEnabled"]').check() - await inboxForm.locator('[name="officeHoursStart"]').fill('0') - await inboxForm.locator('[name="officeHoursEnd"]').fill('0') - await createInboxButton.click() - await expect(adminFrame.getByText(inboxName).first()).toBeVisible({ - timeout: 60_000 - }) - - const inbox = await supportInbox(page, inboxName) - const publicPath = `/ext/supportchat/i/${encodeURIComponent(String(inbox.id))}` - const visitorContext = await browser.newContext({ - baseURL: lnbitsServer.baseUrl, - viewport: {width: 430, height: 820} - }) - const visitorPage = await visitorContext.newPage() - visitorPage.setDefaultTimeout(60_000) - const visitorRecorder = await installDetailedScreenshots( - visitorPage, - testInfo - ) - - try { - await visitorPage.goto(publicPath) - let visitorFrame = await extensionFrame(visitorPage, 'Support Chat') - await expect(visitorFrame.getByText(inboxName)).toBeVisible() - await expect( - visitorFrame.getByText('Playwright support is offline; leave a message.') - ).toBeVisible() - - const startForm = visitorFrame.locator('#start-box') - await startForm.locator('[name="name"]').fill('Alice Visitor') - await startForm - .locator('[name="email"]') - .fill('alice.playwright@example.com') - await startForm.locator('[name="subject"]').fill('Checkout is stuck') - await startForm - .locator('[name="body"]') - .fill('The checkout spinner never finishes.') - await startForm.getByTestId('start-conversation').click() - await expect(visitorPage).toHaveURL(/\/ext\/supportchat\/c\/[a-f0-9]+$/i, { - timeout: 60_000 - }) - visitorFrame = await extensionFrame(visitorPage, 'Support Chat') - await expect( - visitorFrame.getByText('The checkout spinner never finishes.') - ).toBeVisible() - - await page.goto('/ext/supportchat') - adminFrame = await extensionFrame(page, 'Support Chat') - await expect(adminFrame.getByText('Checkout is stuck')).toBeVisible({ - timeout: 60_000 - }) - await expect(adminFrame.getByTestId('unread-count')).toHaveText('1') - await adminFrame.getByText('Checkout is stuck').click() - await expect( - adminFrame.getByText('The checkout spinner never finishes.') - ).toBeVisible() - await expect( - adminFrame - .locator('.sc-message--theirs') - .filter({hasText: 'The checkout spinner never finishes.'}) - ).toHaveCSS('justify-content', 'flex-end') - - const cannedForm = adminFrame.locator('#canned-reply-form') - await cannedForm.locator('[name="title"]').fill('Investigating') - await cannedForm - .locator('[name="body"]') - .fill('Thanks — we are investigating this now.') - await cannedForm.getByRole('button', {name: 'Add canned reply'}).click() - await expect( - adminFrame.getByRole('button', {name: 'Investigating', exact: true}) - ).toBeVisible() - - await adminFrame.getByTestId('conversation-status').selectOption('pending') - await adminFrame.getByTestId('conversation-priority').selectOption('urgent') - await adminFrame.getByTestId('conversation-tags').fill('checkout, browser') - const ticketUpdated = page.waitForResponse( - response => - response.request().method() === 'PUT' && - response.url().includes('/api/v1/ext/supportchat/conversations/') - ) - await adminFrame.getByRole('button', {name: 'Save ticket'}).click() - await ticketUpdated - await expect(adminFrame.locator('main.sc-shell')).toHaveAttribute( - 'data-loading', - '' - ) - await expect(adminFrame.getByTestId('conversation-status')).toHaveValue( - 'pending' - ) - await expect(adminFrame.getByTestId('conversation-priority')).toHaveValue( - 'urgent' - ) - await expect(adminFrame.getByTestId('conversation-tags')).toHaveValue( - 'checkout, browser' - ) - - await adminFrame - .getByTestId('internal-note') - .fill('Only agents should see this diagnostic note.') - await adminFrame.getByRole('button', {name: 'Add internal note'}).click() - await expect( - adminFrame.getByText('Only agents should see this diagnostic note.') - ).toBeVisible() - - await adminFrame - .getByRole('button', {name: 'Investigating', exact: true}) - .click() - await expect(adminFrame.getByTestId('agent-reply')).toHaveValue( - 'Thanks — we are investigating this now.' - ) - await adminFrame.getByRole('button', {name: 'Send'}).click() - await expect( - visitorFrame.getByText('Thanks — we are investigating this now.') - ).toBeVisible({timeout: 60_000}) - await expect( - adminFrame - .locator('.sc-message--mine') - .filter({hasText: 'Thanks — we are investigating this now.'}) - ).toHaveCSS('justify-content', 'flex-start') - await expect( - visitorFrame - .locator('.sc-message--theirs') - .filter({hasText: 'Thanks — we are investigating this now.'}) - ).toHaveCSS('justify-content', 'flex-end') - await expect( - visitorFrame.getByText('Only agents should see this diagnostic note.') - ).toHaveCount(0) - - await visitorPage.waitForTimeout(1_100) - await visitorFrame - .locator('#message-box [name="body"]') - .fill('It also happens in a private window.') - await visitorFrame.getByTestId('visitor-send').click() - await expect( - adminFrame.getByText('It also happens in a private window.') - ).toBeVisible({timeout: 60_000}) - await expect(adminFrame.getByTestId('unread-count')).toHaveText('1') - - const ticketResolved = page.waitForResponse( - response => - response.request().method() === 'POST' && - response.url().includes('/api/v1/ext/supportchat/conversations/') && - response.url().endsWith('/resolve') - ) - await adminFrame.getByRole('button', {name: 'Resolve'}).click() - const ticketResolvedResponse = await ticketResolved - expect( - ticketResolvedResponse.ok(), - `Could not resolve ticket: ${await ticketResolvedResponse.text()}` - ).toBe(true) - await expect(visitorFrame.getByText('resolved').first()).toBeVisible({ - timeout: 60_000 - }) - await expect(adminFrame.locator('main.sc-shell')).toHaveAttribute( - 'data-loading', - '' - ) - await expect(adminFrame.getByTestId('conversation-status')).toHaveValue( - 'resolved' - ) - await adminFrame.getByTestId('conversation-status').selectOption('open') - const ticketReopened = page.waitForResponse( - response => - response.request().method() === 'PUT' && - response.url().includes('/api/v1/ext/supportchat/conversations/') - ) - await adminFrame.getByRole('button', {name: 'Save ticket'}).click() - const ticketReopenedResponse = await ticketReopened - expect( - ticketReopenedResponse.ok(), - `Could not reopen ticket: ${await ticketReopenedResponse.text()}` - ).toBe(true) - await expect(adminFrame.locator('main.sc-shell')).toHaveAttribute( - 'data-loading', - '' - ) - await visitorPage.reload() - visitorFrame = await extensionFrame(visitorPage, 'Support Chat') - await expect(visitorFrame.getByText('open').first()).toBeVisible({ - timeout: 60_000 - }) - - await visitorPage.goto(publicPath) - visitorFrame = await extensionFrame(visitorPage, 'Support Chat') - await expect( - visitorFrame.getByText('Thanks — we are investigating this now.') - ).toBeVisible({timeout: 60_000}) - } finally { - await visitorRecorder.finish() - await visitorContext.close() - } -}) - -async function supportInbox( - page: Parameters[0], - inboxName: string -): Promise> { - const response = await extensionApi( - page, - SUPPORTCHAT.extId, - 'GET', - '/inboxes?rowsPerPage=100' - ) - const inboxes = Array.isArray(response.inboxes) - ? response.inboxes.filter(isRecord) - : [] - const inbox = inboxes.find(item => item.name === inboxName) - if (!inbox) { - throw new Error(`Support inbox not found: ${JSON.stringify(response)}`) - } - return inbox -} diff --git a/tests/e2e/tips.spec.ts b/tests/e2e/tips.spec.ts deleted file mode 100644 index b53573ea6..000000000 --- a/tests/e2e/tips.spec.ts +++ /dev/null @@ -1,124 +0,0 @@ -import type {Page} from '@playwright/test' - -import {test, expect, apiJson, randomHex} from './fixtures' -import { - extensionFrame, - fundWalletWithFakeBalance, - installAndEnableExtension, - login, - superuserWallet -} from './extension-helpers' -import {TIPS} from './extensions' - -test('install Tips extension and pay tip with fake wallet', async ({ - page, - lnbitsServer -}) => { - await login(page, lnbitsServer) - const wallet = await superuserWallet(page) - - await installAndEnableExtension(page, TIPS) - await fundWalletWithFakeBalance(page, wallet.id, {amountSats: 10_000}) - - const jarTitle = `Playwright Tips ${randomHex()}` - const tipMessage = `fake wallet tip ${randomHex()}` - const publicUrl = await createTipJar(page, jarTitle) - const paymentRequest = await createPublicTipInvoice( - page, - publicUrl, - tipMessage - ) - - await apiJson( - lnbitsServer.baseUrl, - 'POST', - '/api/v1/payments', - {out: true, bolt11: paymentRequest}, - wallet.adminkey - ) - - const publicFrame = await tipsFrame(page) - await expect(publicFrame.locator('#invoice-status')).toHaveText( - 'Payment received', - {timeout: 30_000} - ) - - await page.goto('/ext/tips') - const adminFrame = await tipsFrame(page) - await expect( - adminFrame.getByRole('cell', {name: jarTitle}).first() - ).toBeVisible({ - timeout: 60_000 - }) - await adminFrame.getByRole('button', {name: 'Refresh'}).click() - await expect( - adminFrame.getByRole('cell', {name: tipMessage}).first() - ).toBeVisible({ - timeout: 60_000 - }) - await expect( - adminFrame.getByRole('cell', {name: 'Paid'}).first() - ).toBeVisible() -}) - -async function createTipJar(page: Page, jarTitle: string): Promise { - await page.goto('/ext/tips') - const frame = await tipsFrame(page) - await expect(frame.getByText('Create Jar')).toBeVisible({timeout: 60_000}) - await frame.getByLabel('Title').fill(jarTitle) - await frame.getByRole('button', {name: /^create$/i}).click() - await expect(frame.getByRole('cell', {name: jarTitle})).toBeVisible({ - timeout: 60_000 - }) - await frame.waitForFunction(() => - [...document.querySelectorAll('input')].some(input => - input.value.includes('/ext/tips/jars/') - ) - ) - const publicUrl = await frame.evaluate(() => - [...document.querySelectorAll('input')] - .map(input => input.value) - .find(value => value.includes('/ext/tips/jars/')) - ) - if (typeof publicUrl !== 'string' || !publicUrl.includes('/ext/tips/jars/')) { - throw new Error(`Tip jar public URL was not found: ${String(publicUrl)}`) - } - return publicUrl -} - -async function createPublicTipInvoice( - page: Page, - publicUrl: string, - tipMessage: string -): Promise { - await page.goto(publicUrl) - const frame = await tipsFrame(page) - await expect(frame.getByRole('heading', {name: 'Leave a Tip'})).toBeVisible({ - timeout: 60_000 - }) - await frame.getByLabel('Name').fill('Playwright') - await frame.getByLabel('Message').fill(tipMessage) - await frame.getByRole('button', {name: 'Create Invoice'}).click() - await expect(frame.getByText('Waiting for payment')).toBeVisible({ - timeout: 60_000 - }) - await frame.waitForFunction(() => - Boolean(document.querySelector('#copy-invoice-button')?.dataset.invoice) - ) - const paymentRequest = await frame - .locator('#copy-invoice-button') - .evaluate(button => button.dataset.invoice) - if ( - typeof paymentRequest !== 'string' || - !paymentRequest.toLowerCase().startsWith('lnbc') - ) { - throw new Error( - `Tip invoice payment request was not found: ${String(paymentRequest)}` - ) - } - return paymentRequest -} - -async function tipsFrame(page: Page) { - return extensionFrame(page, 'Tips') -} diff --git a/tests/regtest/helpers.py b/tests/regtest/helpers.py index ca1327fea..b90a577a5 100644 --- a/tests/regtest/helpers.py +++ b/tests/regtest/helpers.py @@ -26,6 +26,8 @@ docker_bitcoin_cli = [ "exec", "lnbits-bitcoind-1", "bitcoin-cli", + "-rpcuser=lnbits", + "-rpcpassword=lnbits", "-regtest", ] diff --git a/tests/regtest/test_electrum.py b/tests/regtest/test_electrum.py deleted file mode 100644 index 57083a2c2..000000000 --- a/tests/regtest/test_electrum.py +++ /dev/null @@ -1,184 +0,0 @@ -""" -Electrum client integration tests against the regtest electrs container. -Requires the regtest docker-compose stack (docker/regtest/docker-compose.yml). -electrs is exposed on localhost:19001 (plain TCP) and localhost:3002 (HTTP). -""" - -import asyncio - -import httpx -import pytest -from loguru import logger - -from lnbits.utils.electrum import ElectrumClient, scripthash_from_scriptpubkey - -from .helpers import docker_bitcoin_cli, run_cmd, run_cmd_json - -ELECTRS_HOST = "localhost" -ELECTRS_PORT = 19001 -ELECTRS_HTTP = "http://localhost:3002" - - -def bitcoin_height() -> int: - return run_cmd_json([*docker_bitcoin_cli, "getblockchaininfo"])["blocks"] - - -def mine_blocks(n: int = 1) -> int: - """Mine n blocks and return the new chain height.""" - run_cmd([*docker_bitcoin_cli, "-generate", str(n)]) - return bitcoin_height() - - -def new_address() -> str: - return run_cmd([*docker_bitcoin_cli, "getnewaddress", "bech32"]) - - -def get_scriptpubkey(address: str) -> bytes: - info = run_cmd_json([*docker_bitcoin_cli, "getaddressinfo", address]) - return bytes.fromhex(info["scriptPubKey"]) - - -def send_to_address(address: str, sats: int) -> str: - btc = f"{sats * 1e-8:.8f}" - return run_cmd([*docker_bitcoin_cli, "sendtoaddress", address, btc]) - - -async def wait_for_electrs(height: int, timeout: float = 15.0) -> None: - """Poll electrs HTTP until it has indexed up to `height`.""" - loop = asyncio.get_running_loop() - deadline = loop.time() + timeout - async with httpx.AsyncClient() as http: - while loop.time() < deadline: - try: - r = await http.get(f"{ELECTRS_HTTP}/blocks/tip/height", timeout=2) - if int(r.text) >= height: - return - except Exception: - logger.debug("electrs not ready yet") - await asyncio.sleep(0.25) - raise TimeoutError(f"electrs did not reach height {height} within {timeout}s") - - -@pytest.fixture(scope="module", autouse=True) -async def wait_after_electrum_tests(): - yield - await asyncio.sleep(1) - - -@pytest.mark.anyio -async def test_connect_and_height(): - async with ElectrumClient(f"tcp://{ELECTRS_HOST}:{ELECTRS_PORT}") as client: - before = await client.get_height() - - target = mine_blocks(3) - await wait_for_electrs(target) - - async with ElectrumClient(f"tcp://{ELECTRS_HOST}:{ELECTRS_PORT}") as client: - after = await client.get_height() - - assert isinstance(before, int) and before >= 0 - assert after == before + 3 - - -@pytest.mark.anyio -async def test_get_tip(): - async with ElectrumClient(f"tcp://{ELECTRS_HOST}:{ELECTRS_PORT}") as client: - tip = await client.get_tip() - assert isinstance(tip.height, int) - assert isinstance(tip.hex, str) - assert len(tip.hex) == 160 # 80-byte serialised header - - -@pytest.mark.anyio -async def test_server_banner(): - async with ElectrumClient(f"tcp://{ELECTRS_HOST}:{ELECTRS_PORT}") as client: - banner = await client.server_banner() - assert isinstance(banner, str) - - -@pytest.mark.anyio -async def test_balance_after_payment(): - address = new_address() - scripthash = scripthash_from_scriptpubkey(get_scriptpubkey(address)) - - async with ElectrumClient(f"tcp://{ELECTRS_HOST}:{ELECTRS_PORT}") as client: - empty = await client.get_balance(scripthash) - assert empty.confirmed == 0 - assert empty.unconfirmed == 0 - - send_to_address(address, 500_000) - target = mine_blocks(1) - await wait_for_electrs(target) - - async with ElectrumClient(f"tcp://{ELECTRS_HOST}:{ELECTRS_PORT}") as client: - confirmed = await client.get_balance(scripthash) - assert confirmed.confirmed == 500_000 - assert confirmed.unconfirmed == 0 - - -@pytest.mark.anyio -async def test_history_and_utxos(): - address = new_address() - scripthash = scripthash_from_scriptpubkey(get_scriptpubkey(address)) - - send_to_address(address, 250_000) - target = mine_blocks(1) - await wait_for_electrs(target) - - async with ElectrumClient(f"tcp://{ELECTRS_HOST}:{ELECTRS_PORT}") as client: - history = await client.get_history(scripthash) - assert len(history) >= 1 - assert history[0].tx_hash - assert history[0].height > 0 - - utxos = await client.listunspent(scripthash) - assert len(utxos) == 1 - assert utxos[0].value == 250_000 - - raw_tx = await client.get_transaction(utxos[0].tx_hash) - assert isinstance(raw_tx, str) and len(raw_tx) > 0 - - -@pytest.mark.anyio -async def test_subscribe_scripthash_payment(): - address = new_address() - scripthash = scripthash_from_scriptpubkey(get_scriptpubkey(address)) - - received: list = [] - event = asyncio.Event() - - def on_change(params: list) -> None: - received.append(params) - event.set() - - async with ElectrumClient(f"tcp://{ELECTRS_HOST}:{ELECTRS_PORT}") as client: - initial_status = await client.subscribe_scripthash( - scripthash, callback=on_change - ) - assert initial_status is None # fresh address has no history - - send_to_address(address, 777_000) - target = mine_blocks(1) - await wait_for_electrs(target) - - await asyncio.wait_for(event.wait(), timeout=10) - - assert len(received) == 1 - assert received[0][0] == scripthash # first param is the scripthash - assert received[0][1] is not None # second param is the new status hash - - balance = await client.get_balance(scripthash) - assert balance.confirmed == 777_000 - - -@pytest.mark.anyio -async def test_subscribe_headers(): - async with ElectrumClient(f"tcp://{ELECTRS_HOST}:{ELECTRS_PORT}") as client: - notifications: list = [] - tip = await client.subscribe_headers(callback=lambda p: notifications.append(p)) - height_before = tip.height - - target = mine_blocks(1) - await wait_for_electrs(target) - - assert await client.get_height() == height_before + 1 diff --git a/tests/regtest/test_real_invoice.py b/tests/regtest/test_real_invoice.py index 6fbed901a..cb65b9937 100644 --- a/tests/regtest/test_real_invoice.py +++ b/tests/regtest/test_real_invoice.py @@ -13,13 +13,10 @@ from lnbits.core.services import ( fee_reserve_total, get_balance_delta, ) -from lnbits.core.services.payments import ( - pay_invoice, - update_wallet_balance, -) +from lnbits.core.services.payments import pay_invoice, update_wallet_balance from lnbits.core.services.users import create_user_account from lnbits.exceptions import PaymentError -from lnbits.task_manager import task_manager +from lnbits.tasks import create_task, wait_for_paid_invoices from lnbits.wallets import get_funding_source from ..helpers import is_fake, is_regtest @@ -163,11 +160,12 @@ async def test_create_real_invoice( assert not payment_status["paid"] on_paid_mock = mocker.AsyncMock() - task_manager.register_invoice_listener(on_paid_mock, "test_create_invoice") + create_task(wait_for_paid_invoices("test_create_invoice", on_paid_mock)()) pay_real_invoice(invoice["bolt11"]) await asyncio.sleep(1) + assert on_paid_mock.call_count == 1 payment = on_paid_mock.call_args_list[0][0][0] @@ -395,11 +393,12 @@ async def test_receive_real_invoice_set_pending_and_check_state( assert not payment_status["paid"] on_paid_mock = mocker.AsyncMock() - task_manager.register_invoice_listener(on_paid_mock, "test_create_invoice") + create_task(wait_for_paid_invoices("test_create_invoice", on_paid_mock)()) pay_real_invoice(invoice["bolt11"]) await asyncio.sleep(1) + assert on_paid_mock.call_count == 1 payment = on_paid_mock.call_args_list[0][0][0] @@ -413,8 +412,6 @@ async def test_receive_real_invoice_set_pending_and_check_state( payment_status = response.json() assert payment_status["paid"] - assert payment - # set the incoming invoice to pending payment.status = PaymentState.PENDING await update_payment(payment) diff --git a/tests/unit/test_app_extensions.py b/tests/unit/test_app_extensions.py deleted file mode 100644 index 3561a8006..000000000 --- a/tests/unit/test_app_extensions.py +++ /dev/null @@ -1,71 +0,0 @@ -import json -from pathlib import Path - -import pytest -from pytest_mock.plugin import MockerFixture - -from lnbits.app import build_all_installed_extensions_list -from lnbits.settings import Settings - - -@pytest.mark.anyio -async def test_wasm_extension_discovery_uses_configured_directory( - tmp_path: Path, - settings: Settings, - mocker: MockerFixture, -): - discovered_id = "discovered_wasm" - original_extensions_path = settings.lnbits_extensions_path - original_wasm_extensions_path = settings.lnbits_wasm_extensions_path - original_installed_ids = set(settings.lnbits_installed_extensions_ids) - - settings.lnbits_extensions_path = str(tmp_path / "code") - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - Path(settings.lnbits_extensions_path, "extensions").mkdir(parents=True) - _write_wasm_config(settings.wasm_extensions_dir / discovered_id, discovered_id) - - mocker.patch( - "lnbits.app.get_installed_extensions", - mocker.AsyncMock(return_value=[]), - ) - create_mock = mocker.patch( - "lnbits.app.create_installed_extension", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.app.get_db_version", - mocker.AsyncMock(return_value=None), - ) - migrate_mock = mocker.patch( - "lnbits.app.migrate_extension_database", - mocker.AsyncMock(), - ) - - try: - installed = await build_all_installed_extensions_list() - finally: - settings.lnbits_extensions_path = original_extensions_path - settings.lnbits_wasm_extensions_path = original_wasm_extensions_path - settings.lnbits_installed_extensions_ids = original_installed_ids - - assert [extension.id for extension in installed] == [discovered_id] - create_mock.assert_awaited_once() - assert create_mock.await_args is not None - assert create_mock.await_args.args[0].id == discovered_id - migrate_mock.assert_awaited_once() - - -def _write_wasm_config(ext_dir: Path, ext_id: str) -> None: - ext_dir.mkdir(parents=True) - (ext_dir / "config.json").write_text( - json.dumps( - { - "id": ext_id, - "name": ext_id, - "version": "1.0.0", - "extension_type": "wasm", - "wasm": {"module": "extension.wasm"}, - } - ), - encoding="utf-8", - ) diff --git a/tests/unit/test_cache.py b/tests/unit/test_cache.py index d08a1c03d..2f33ffe1d 100644 --- a/tests/unit/test_cache.py +++ b/tests/unit/test_cache.py @@ -5,7 +5,6 @@ import pytest from pytest_mock.plugin import MockerFixture from lnbits.settings import Settings -from lnbits.task_manager import task_manager from lnbits.utils.cache import Cache, Cached key = "foo" @@ -14,10 +13,11 @@ value = "bar" @pytest.fixture async def cache(): - cache = Cache() - task = task_manager.create_permanent_task(cache.invalidate_cache, interval=1) + cache = Cache(interval=0.1) + + task = asyncio.create_task(cache.invalidate_forever()) yield cache - task_manager.cancel_task(task) + task.cancel() @pytest.mark.anyio @@ -31,13 +31,13 @@ async def test_cache_get_set(cache): @pytest.mark.anyio async def test_cache_expiry(cache): # gets expired by `get` call - cache.set(key, value, expiry=1) - await asyncio.sleep(2) + cache.set(key, value, expiry=0.01) + await asyncio.sleep(0.02) assert not cache.get(key) # gets expired by invalidation task - cache.set(key, value, expiry=1) - await asyncio.sleep(2) + cache.set(key, value, expiry=0.1) + await asyncio.sleep(0.2) assert key not in cache._values assert not cache.get(key) @@ -94,33 +94,23 @@ async def test_cache_pop_expired_returns_default(cache): async def test_invalidate_forever_logs_and_recovers_from_errors( settings: Settings, mocker: MockerFixture ): - test_cache = Cache() + test_cache = Cache(interval=0) + logger_error = mocker.patch("lnbits.utils.cache.logger.error") original_running = settings.lnbits_running calls = 0 - original_invalidate = test_cache.invalidate_cache - - async def fake_invalidate(): + async def fake_sleep(_interval): nonlocal calls calls += 1 if calls == 1: raise RuntimeError("boom") settings.lnbits_running = False - await original_invalidate() - mocker.patch.object(test_cache, "invalidate_cache", side_effect=fake_invalidate) - mocker.patch("lnbits.task_manager.asyncio.sleep") - logger_error = mocker.patch("lnbits.task_manager.logger.error") - - bg_task = None try: settings.lnbits_running = True - bg_task = task_manager.create_permanent_task(test_cache.invalidate_cache) - await bg_task.task + mocker.patch("lnbits.utils.cache.asyncio.sleep", side_effect=fake_sleep) + await test_cache.invalidate_forever() finally: settings.lnbits_running = original_running - if bg_task: - task_manager.cancel_task(bg_task) - assert logger_error.called - assert calls == 2 + logger_error.assert_called_once_with("Error invalidating cache") diff --git a/tests/unit/test_db.py b/tests/unit/test_db.py index e0bf10bbf..94b4239f7 100644 --- a/tests/unit/test_db.py +++ b/tests/unit/test_db.py @@ -1,4 +1,4 @@ -from datetime import date, datetime, timezone +from datetime import date, timezone import pytest @@ -9,41 +9,9 @@ from lnbits.core.crud import ( get_wallet_for_key, ) from lnbits.core.crud.payments import get_payment -from lnbits.core.models import CreateInvoice, PaymentFilters +from lnbits.core.models import CreateInvoice from lnbits.core.services.payments import create_wallet_invoice -from lnbits.db import POSTGRES, SQLITE, Filter, Filters - - -@pytest.mark.parametrize( - ("db_type", "lower_statement", "upper_statement"), - [ - ( - POSTGRES, - "(time >= to_timestamp(:time__0_0))", - "(time <= to_timestamp(:time__1_0))", - ), - (SQLITE, "(time >= :time__0_0)", "(time <= :time__1_0)"), - ], -) -def test_datetime_filter_uses_database_timestamp_placeholder( - monkeypatch, db_type, lower_statement, upper_statement -): - monkeypatch.setattr("lnbits.db.DB_TYPE", db_type) - lower_bound = Filter.parse_query( - "time[ge]", ["2026-06-16T00:00:00"], PaymentFilters, 0 - ) - upper_bound = Filter.parse_query( - "time[le]", ["2026-06-23T23:59:59"], PaymentFilters, 1 - ) - filters = Filters(filters=[lower_bound, upper_bound], model=PaymentFilters) - values = filters.values() - - assert isinstance(values["time__0_0"], datetime) - assert values["time__0_0"] == datetime(2026, 6, 16) - assert values["time__1_0"] == datetime(2026, 6, 23, 23, 59, 59) - assert filters.where() == f"WHERE {lower_statement} AND {upper_statement}" - assert lower_bound.statement == lower_statement - assert upper_bound.statement == upper_statement +from lnbits.db import POSTGRES @pytest.mark.anyio diff --git a/tests/unit/test_decorators.py b/tests/unit/test_decorators.py index 7a5da134b..304aebabf 100644 --- a/tests/unit/test_decorators.py +++ b/tests/unit/test_decorators.py @@ -12,7 +12,6 @@ from lnbits.core.crud.users import delete_account from lnbits.core.models import User from lnbits.core.models.users import AccessTokenPayload from lnbits.decorators import ( - _extension_id_from_request_path, access_token_payload, check_access_token, check_admin_ui, @@ -226,12 +225,3 @@ async def test_check_extension_builder_requires_admin_when_disabled_for_users( admin_user = user_alan.copy(deep=True) admin_user.admin = True await check_extension_builder(admin_user) - - -def test_extension_id_from_request_path_handles_wasm_routes(): - assert _extension_id_from_request_path("/ext/wasm_demo") == "wasm_demo" - assert _extension_id_from_request_path("/ext/wasm_demo/page/1") == "wasm_demo" - assert ( - _extension_id_from_request_path("/api/v1/ext/wasm_demo/invoices") == "wasm_demo" - ) - assert _extension_id_from_request_path("/lnurlp/api/v1") == "lnurlp" diff --git a/tests/unit/test_exchange_rates.py b/tests/unit/test_exchange_rates.py index e373fbfa3..a0aeb3b11 100644 --- a/tests/unit/test_exchange_rates.py +++ b/tests/unit/test_exchange_rates.py @@ -275,10 +275,6 @@ async def test_btc_rates_skips_unsupported_and_failing_providers( @pytest.mark.anyio async def test_btc_price_handles_empty_single_and_multiple_rates(mocker: MockerFixture): - mocker.patch( - "lnbits.utils.exchange_rates.btc_price_from_aggregator", - AsyncMock(return_value=None), - ) mocker.patch("lnbits.utils.exchange_rates.btc_rates", AsyncMock(return_value=[])) assert await btc_price("usd") == 0.0 diff --git a/tests/unit/test_fiat_providers.py b/tests/unit/test_fiat_providers.py index baf73000d..babfe254a 100644 --- a/tests/unit/test_fiat_providers.py +++ b/tests/unit/test_fiat_providers.py @@ -8,7 +8,7 @@ from unittest.mock import AsyncMock import pytest from pytest_mock.plugin import MockerFixture -from lnbits.core.crud.payments import get_payment, get_payments +from lnbits.core.crud.payments import get_payments from lnbits.core.crud.users import get_user from lnbits.core.crud.wallets import create_wallet from lnbits.core.models.payments import CreateInvoice, Payment, PaymentState @@ -919,10 +919,8 @@ async def test_revolut_wallet_create_subscription(settings: Settings): "PLAN_VARIATION_123", 1, payment_options ) - subscription_request_id = payment_options.subscription_request_id assert response.ok is True - assert response.subscription_request_id == "SUBSCRIPTION123" - assert subscription_request_id is not None + assert response.subscription_request_id is not None assert ( response.checkout_session_url == "https://checkout.revolut.com/payment-link/sub_123" @@ -935,14 +933,16 @@ async def test_revolut_wallet_create_subscription(settings: Settings): assert payload["plan_variation_id"] == "PLAN_VARIATION_123" assert payload["customer_id"] == "CUSTOMER123" assert client.calls[1][1]["timeout"] == 30 - assert client.calls[1][1]["headers"]["Idempotency-Key"] == (subscription_request_id) + assert client.calls[1][1]["headers"]["Idempotency-Key"] == ( + response.subscription_request_id + ) assert payload["setup_order_redirect_url"] == ( "https://lnbits.example/subscription-success" ) reference = json.loads(payload["external_reference"]) assert reference["wallet_id"] == "wallet_1" assert reference["tag"] == "gold" - assert reference["subscription_request_id"] == subscription_request_id + assert reference["subscription_request_id"] == response.subscription_request_id assert reference["memo"] == "Monthly Gold" assert reference["extra"]["link"] == "link-1" assert client.calls[2][0] == "/api/orders/ORDER123" @@ -1235,55 +1235,13 @@ async def test_revolut_wallet_cancel_subscription(settings: Settings): settings.revolut_api_version = "2026-04-20" wallet = RevolutWallet() - client = MockHTTPClient( - [ - MockHTTPResponse( - json_data={ - "external_reference": json.dumps({"wallet_id": "wallet_1"}), - } - ), - MockHTTPResponse(json_data={}), - ] - ) + client = MockHTTPClient([MockHTTPResponse(json_data={})]) wallet.client = client # type: ignore[assignment] response = await wallet.cancel_subscription("SUBSCRIPTION123", "wallet_1") assert response.ok is True - assert client.calls[0][0] == "/api/subscriptions/SUBSCRIPTION123" - assert client.calls[1][0] == "/api/subscriptions/SUBSCRIPTION123/cancel" - - -@pytest.mark.anyio -async def test_revolut_wallet_cancel_subscription_checks_wallet_id( - settings: Settings, -): - settings.revolut_api_endpoint = "https://sandbox-merchant.revolut.com" - settings.revolut_api_secret_key = "revolut-secret" - settings.revolut_api_version = "2026-04-20" - - wallet = RevolutWallet() - client = MockHTTPClient( - [ - MockHTTPResponse( - json_data={ - "external_reference": json.dumps({"wallet_id": "wallet_2"}), - } - ), - ] - ) - wallet.client = client # type: ignore[assignment] - - response = await wallet.cancel_subscription("SUBSCRIPTION123", "wallet_1") - - assert response.ok is False - assert response.error_message == "Subscription not found." - assert client.calls == [ - ( - "/api/subscriptions/SUBSCRIPTION123", - {"timeout": 30}, - ) - ] + assert client.calls[0][0] == "/api/subscriptions/SUBSCRIPTION123/cancel" @pytest.mark.anyio @@ -1433,7 +1391,7 @@ def test_check_revolut_signature_multiple_v1_headers(): check_revolut_signature(payload, sig_header, timestamp, secret) -def test_check_revolut_signature_docs_vector(mocker: MockerFixture): +def test_check_revolut_signature_docs_vector(): payload = ( b'{"data":{"id":"645a7696-22f3-aa47-9c74-cbae0449cc46",' b'"new_state":"completed","old_state":"pending",' @@ -1445,16 +1403,9 @@ def test_check_revolut_signature_docs_vector(mocker: MockerFixture): secret = "wsk_r59a4HfWVAKycbCaNO1RvgCJec02gRd8" sig = "v1=bca326fb378d0da7f7c490ad584a8106bab9723d8d9cdd0d50b4c5b3be3837c0" - # This is a fixed vector straight from Revolut's docs, so its timestamp is - # necessarily in the past. Freeze time to it instead of growing - # tolerance_seconds indefinitely as real time marches on. - mocker.patch( - "lnbits.core.services.fiat_providers.time.time", - return_value=int(timestamp) / 1000, + check_revolut_signature( + payload, sig, timestamp, secret, tolerance_seconds=100000000 ) - check_revolut_signature(payload, sig, timestamp, secret) - - check_revolut_signature(payload, sig, timestamp, secret) @pytest.mark.anyio @@ -1724,9 +1675,7 @@ async def test_check_fiat_status_handles_internal_states(mocker: MockerFixture): "lnbits.core.services.fiat_providers.get_fiat_provider", AsyncMock(return_value=provider), ) - queue_put = mocker.patch( - "lnbits.task_manager.task_manager.internal_invoice_queue.put_nowait" - ) + queue_put = mocker.patch("lnbits.tasks.internal_invoice_queue.put", AsyncMock()) success_status = await check_fiat_status( Payment( @@ -1743,8 +1692,7 @@ async def test_check_fiat_status_handles_internal_states(mocker: MockerFixture): ) assert success_status.success is True - queue_put.assert_called_once() - assert queue_put.call_args[0][0].checking_id == "fiat_pending" + queue_put.assert_awaited_once_with("fiat_pending") await check_fiat_status( Payment( @@ -1754,59 +1702,13 @@ async def test_check_fiat_status_handles_internal_states(mocker: MockerFixture): amount=1000, fee=0, bolt11="bolt11", - status=PaymentState.SUCCESS, + status=PaymentState.PENDING, fiat_provider="stripe", extra={"fiat_checking_id": "stripe_checking_id"}, - ) + ), + skip_internal_payment_notifications=True, ) - assert queue_put.call_count == 1 - - -@pytest.mark.anyio -async def test_check_fiat_status_persists_successful_payment( - to_wallet: Wallet, settings: Settings, mocker: MockerFixture -): - settings.stripe_enabled = True - settings.stripe_api_secret_key = "mock_sk_test_4eC39HqLyjWDarjtT1zdp7dc" - settings.stripe_limits.service_min_amount_sats = 0 - settings.stripe_limits.service_max_amount_sats = 0 - settings.stripe_limits.service_fee_wallet_id = None - settings.stripe_limits.service_faucet_wallet_id = None - - invoice_data = CreateInvoice( - unit="USD", amount=1.0, memo="Test", fiat_provider="stripe" - ) - fiat_mock_response = FiatInvoiceResponse( - ok=True, - checking_id=f"session_paid_{get_random_string(10)}", - payment_request="https://stripe.com/pay/session_paid", - ) - mocker.patch( - "lnbits.fiat.StripeWallet.create_invoice", - AsyncMock(return_value=fiat_mock_response), - ) - mocker.patch( - "lnbits.utils.exchange_rates.get_fiat_rate_satoshis", - AsyncMock(return_value=1000), - ) - payment = await payments.create_fiat_invoice(to_wallet.id, invoice_data) - assert payment.status == PaymentState.PENDING - - mocker.patch( - "lnbits.fiat.StripeWallet.get_invoice_status", - AsyncMock(return_value=FiatPaymentStatus(paid=True)), - ) - queue_put = mocker.patch( - "lnbits.task_manager.task_manager.internal_invoice_queue.put_nowait" - ) - - status = await check_fiat_status(payment) - - assert status.success is True - assert payment.status == PaymentState.SUCCESS - updated_payment = await get_payment(payment.checking_id) - assert updated_payment.status == PaymentState.SUCCESS - queue_put.assert_called_once_with(payment) + assert queue_put.await_count == 1 @pytest.mark.anyio diff --git a/tests/unit/test_helpers.py b/tests/unit/test_helpers.py index 1d21598d8..499a58d6f 100644 --- a/tests/unit/test_helpers.py +++ b/tests/unit/test_helpers.py @@ -259,7 +259,9 @@ def test_get_api_routes_extracts_v1_paths(): def test_path_and_case_helpers(): assert path_segments("/wallet/path") == ["wallet", "path"] + assert path_segments("/upgrades/ext/assets/app.js") == ["assets", "app.js"] assert normalize_path(None) == "/" + assert normalize_path("/upgrades/ext/assets/app.js") == "/assets/app.js" assert normalize_endpoint("example.com/") == "https://example.com" assert normalize_endpoint("ws://socket.example.com") == "ws://socket.example.com" assert ( diff --git a/tests/unit/test_helpers_query.py b/tests/unit/test_helpers_query.py index da52a29a0..7ca7af334 100644 --- a/tests/unit/test_helpers_query.py +++ b/tests/unit/test_helpers_query.py @@ -2,7 +2,6 @@ import json import pytest -from lnbits.core.models.extensions import ExtensionPermission from lnbits.db import ( dict_to_model, dict_to_submodel, @@ -104,19 +103,3 @@ async def test_helpers_dict_to_model_ignores_unknown_fields(): model = dict_to_model({**test_dict, "ignored": "field"}, DbTestModel3) assert model == test_data - - -@pytest.mark.anyio -async def test_helpers_dict_to_model_handles_list_any_fields(): - model = dict_to_model( - { - "id": "http.request", - "policies": '[{"host": "https://api.example.com"}]', - }, - ExtensionPermission, - ) - - assert model == ExtensionPermission( - id="http.request", - policies=[{"host": "https://api.example.com"}], - ) diff --git a/tests/unit/test_models_extensions.py b/tests/unit/test_models_extensions.py deleted file mode 100644 index cbae15f97..000000000 --- a/tests/unit/test_models_extensions.py +++ /dev/null @@ -1,187 +0,0 @@ -import httpx -import pytest -from pytest_mock.plugin import MockerFixture - -from lnbits.core.models.extensions import ( - ExtensionConfig, - ExtensionManifestType, - InstallableExtension, - Manifest, - github_api_get, -) -from lnbits.settings import Settings - - -def _mock_json_response(mocker: MockerFixture, url: str, payload: dict): - response = httpx.Response( - 200, - json=payload, - request=httpx.Request("GET", url), - ) - client = mocker.AsyncMock() - client.get.return_value = response - client_context = mocker.MagicMock() - client_context.__aenter__ = mocker.AsyncMock(return_value=client) - client_context.__aexit__ = mocker.AsyncMock(return_value=None) - client_factory = mocker.patch( - "lnbits.core.models.extensions.httpx.AsyncClient", - return_value=client_context, - ) - return client_factory, client - - -def _extension_config_payload() -> dict: - return { - "name": "Test Extension", - "short_description": "Test extension metadata", - "min_lnbits_version": None, - "max_lnbits_version": None, - } - - -@pytest.mark.anyio -async def test_get_installable_extensions_loads_wasm_manifests( - settings: Settings, mocker: MockerFixture -): - regular_manifest_url = "https://example.com/extensions.json" - wasm_manifest_url = "https://example.com/wasm-extensions.json" - settings.lnbits_extensions_manifests = [regular_manifest_url] - settings.lnbits_wasm_extensions_manifests = [ - wasm_manifest_url, - regular_manifest_url, - ] - fetch_manifest = mocker.patch.object( - InstallableExtension, - "fetch_manifest", - mocker.AsyncMock( - side_effect=[ - Manifest(), - Manifest.parse_obj( - { - "extensions": [ - { - "id": "tips", - "name": "Tips", - "version": "0.1.4", - "archive": "https://example.com/tips.zip", - "hash": "tips-hash", - } - ] - } - ), - ] - ), - ) - - extensions = await InstallableExtension._get_installable_extensions() - - assert [extension.id for extension in extensions] == ["tips"] - assert extensions[0].meta - assert extensions[0].meta.latest_release - assert extensions[0].meta.latest_release.manifest_type == ExtensionManifestType.WASM - assert [call.args[0] for call in fetch_manifest.await_args_list] == [ - regular_manifest_url, - wasm_manifest_url, - ] - - -@pytest.mark.anyio -@pytest.mark.parametrize( - "url", - [ - "https://api.github.com/repos/example/extension", - "https://raw.githubusercontent.com/example/extension/main/config.json", - ], -) -async def test_release_config_sends_token_only_to_trusted_github_origins( - settings: Settings, - mocker: MockerFixture, - url: str, -): - settings.lnbits_ext_github_token = "github-secret" - client_factory, client = _mock_json_response( - mocker, url, _extension_config_payload() - ) - - await ExtensionConfig.fetch_release_config(url) - - assert client_factory.call_args.kwargs["headers"]["Authorization"] == ( - "Bearer github-secret" - ) - assert client_factory.call_args.kwargs["follow_redirects"] is False - client.get.assert_awaited_once_with(url) - - -@pytest.mark.anyio -@pytest.mark.parametrize( - "url", - [ - "https://extensions.example/config.json", - "https://api.github.com.evil.example/config.json", - "https://api.github.com./config.json", - "https://raw.githubusercontent.com.evil.example/config.json", - "http://api.github.com/config.json", - "https://api.github.com:444/config.json", - ], -) -async def test_release_config_does_not_send_token_to_untrusted_origins( - settings: Settings, - mocker: MockerFixture, - url: str, -): - settings.lnbits_ext_github_token = "github-secret" - client_factory, client = _mock_json_response( - mocker, url, _extension_config_payload() - ) - - await ExtensionConfig.fetch_release_config(url) - - assert "Authorization" not in client_factory.call_args.kwargs["headers"] - assert client_factory.call_args.kwargs["follow_redirects"] is False - client.get.assert_awaited_once_with(url) - - -@pytest.mark.anyio -async def test_manifest_does_not_send_token_to_untrusted_origin( - settings: Settings, - mocker: MockerFixture, -): - url = "https://extensions.example/manifest.json" - settings.lnbits_ext_github_token = "github-secret" - client_factory, client = _mock_json_response(mocker, url, {}) - - await InstallableExtension.fetch_manifest(url) - - assert "Authorization" not in client_factory.call_args.kwargs["headers"] - assert client_factory.call_args.kwargs["follow_redirects"] is False - client.get.assert_awaited_once_with(url) - - -@pytest.mark.anyio -async def test_release_config_rejects_url_credentials( - settings: Settings, - mocker: MockerFixture, -): - settings.lnbits_ext_github_token = "github-secret" - client_factory = mocker.patch("lnbits.core.models.extensions.httpx.AsyncClient") - - with pytest.raises(ValueError, match="must not contain credentials"): - await ExtensionConfig.fetch_release_config( - "https://github-secret@api.github.com/config.json" - ) - - client_factory.assert_not_called() - - -@pytest.mark.anyio -async def test_github_api_get_rejects_untrusted_origin( - settings: Settings, - mocker: MockerFixture, -): - settings.lnbits_ext_github_token = "github-secret" - client_factory = mocker.patch("lnbits.core.models.extensions.httpx.AsyncClient") - - with pytest.raises(ValueError, match="untrusted origin"): - await github_api_get("https://api.github.com.evil.example/", "Cannot fetch") - - client_factory.assert_not_called() diff --git a/tests/unit/test_pay_invoice.py b/tests/unit/test_pay_invoice.py index 5fdcfdf73..8a5b77d0d 100644 --- a/tests/unit/test_pay_invoice.py +++ b/tests/unit/test_pay_invoice.py @@ -12,12 +12,10 @@ from lnbits.core.crud import create_wallet, get_standalone_payment, get_wallet from lnbits.core.crud.payments import get_payment, get_payments_paginated from lnbits.core.models import PaymentState, Wallet from lnbits.core.services import create_invoice, create_user_account, pay_invoice -from lnbits.core.services.payments import ( - update_wallet_balance, -) +from lnbits.core.services.payments import update_wallet_balance from lnbits.exceptions import InvoiceError, PaymentError from lnbits.settings import Settings -from lnbits.task_manager import task_manager +from lnbits.tasks import create_task, wait_for_paid_invoices from lnbits.wallets.base import PaymentResponse from lnbits.wallets.fake import FakeWallet @@ -233,31 +231,17 @@ async def test_notification_for_internal_payment( ): test_name = "test_notification_for_internal_payment" - # Drain stale items left by session-scoped fixtures (e.g. update_wallet_balance) - while not task_manager.internal_invoice_queue.empty(): - try: - task_manager.internal_invoice_queue.get_nowait() - except asyncio.QueueEmpty: - break - on_paid_mock = mocker.AsyncMock() - # create_task(internal_invoice_listener()) - - task_manager.register_invoice_listener(on_paid_mock, test_name) - + create_task(wait_for_paid_invoices(test_name, on_paid_mock)()) payment = await create_invoice( wallet_id=to_wallet.id, amount=123, memo=test_name, webhook="http://test.404.lnbits.com", ) - paid_payment = await pay_invoice( + await pay_invoice( wallet_id=to_wallet.id, payment_request=payment.bolt11, extra={"tag": "lnurlp"} ) - assert paid_payment.status == PaymentState.SUCCESS.value - assert paid_payment.bolt11 == payment.bolt11 - assert paid_payment.amount == -123_000 - await asyncio.sleep(1) assert on_paid_mock.call_count == 1 @@ -267,8 +251,6 @@ async def test_notification_for_internal_payment( assert _payment.status == PaymentState.SUCCESS.value assert _payment.bolt11 == payment.bolt11 assert _payment.amount == 123_000 - assert _payment.checking_id == payment.checking_id - updated_payment = await get_payment(_payment.checking_id) assert ( updated_payment.webhook_status is not None @@ -287,10 +269,6 @@ async def test_pay_failed( "lnbits.wallets.FakeWallet.pay_invoice", AsyncMock(return_value=payment_reponse_failed), ) - mocker.patch( - "lnbits.core.services.payments.get_funding_source", - return_value=external_funding_source, - ) external_invoice = await external_funding_source.create_invoice(2101) assert external_invoice.payment_request @@ -379,33 +357,25 @@ async def test_retry_failed_invoice( @pytest.mark.anyio -@pytest.mark.parametrize("returns_checking_id", [True, False]) async def test_pay_external_invoice_pending( from_wallet: Wallet, mocker: MockerFixture, external_funding_source: FakeWallet, settings: Settings, - returns_checking_id: bool, ): settings.lnbits_reserve_fee_min = 1000 # msats invoice_amount = 2103 external_invoice = await external_funding_source.create_invoice(invoice_amount) assert external_invoice.payment_request assert external_invoice.checking_id - backend_checking_id = ( - f"backend_{external_invoice.checking_id}" if returns_checking_id else None - ) - expected_checking_id = backend_checking_id or external_invoice.checking_id - payment_reponse_pending = PaymentResponse(ok=None, checking_id=backend_checking_id) + payment_reponse_pending = PaymentResponse( + ok=None, checking_id=external_invoice.checking_id + ) mocker.patch( "lnbits.wallets.FakeWallet.pay_invoice", AsyncMock(return_value=payment_reponse_pending), ) - mocker.patch( - "lnbits.core.services.payments.get_funding_source", - return_value=external_funding_source, - ) ws_notification = mocker.patch( "lnbits.core.services.payments.send_payment_notification_in_background", AsyncMock(return_value=None), @@ -421,9 +391,7 @@ async def test_pay_external_invoice_pending( _payment = await get_standalone_payment(payment.payment_hash) assert _payment assert _payment.status == PaymentState.PENDING.value - assert _payment.checking_id == expected_checking_id - assert _payment.payment_hash == external_invoice.checking_id - assert payment.checking_id == expected_checking_id + assert _payment.checking_id == payment.payment_hash assert _payment.amount == -2103_000 assert _payment.bolt11 == external_invoice.payment_request @@ -579,43 +547,36 @@ async def test_retry_pay_success( @pytest.mark.anyio -async def test_pay_external_invoice_success_with_backend_checking_id( +async def test_pay_external_invoice_success_bad_checking_id( from_wallet: Wallet, mocker: MockerFixture, external_funding_source: FakeWallet ): invoice_amount = 2108 external_invoice = await external_funding_source.create_invoice(invoice_amount) assert external_invoice.payment_request assert external_invoice.checking_id - backend_checking_id = f"backend_{external_invoice.checking_id}" + bad_checking_id = f"bad_{external_invoice.checking_id}" preimage = "0000000000000000000000000000000000000000000000000000000000002108" payment_reponse_success = PaymentResponse( - ok=True, checking_id=backend_checking_id, preimage=preimage + ok=True, checking_id=bad_checking_id, preimage=preimage ) mocker.patch( "lnbits.wallets.FakeWallet.pay_invoice", AsyncMock(return_value=payment_reponse_success), ) - mocker.patch( - "lnbits.core.services.payments.get_funding_source", - return_value=external_funding_source, - ) - payment = await pay_invoice( - wallet_id=from_wallet.id, - payment_request=external_invoice.payment_request, - ) + with pytest.raises(PaymentError): + await pay_invoice( + wallet_id=from_wallet.id, + payment_request=external_invoice.payment_request, + ) - stored_payment = await get_standalone_payment(external_invoice.checking_id) - assert stored_payment - assert stored_payment.status == PaymentState.SUCCESS.value - assert stored_payment.checking_id == backend_checking_id - assert stored_payment.payment_hash == external_invoice.checking_id - assert payment.checking_id == backend_checking_id + payment = await get_standalone_payment(bad_checking_id) + assert payment is None, "Payment should not be created with bad checking_id" @pytest.mark.anyio -async def test_pay_external_invoice_success_without_checking_id( +async def test_no_checking_id( from_wallet: Wallet, mocker: MockerFixture, external_funding_source: FakeWallet ): invoice_amount = 2110 @@ -624,33 +585,29 @@ async def test_pay_external_invoice_success_without_checking_id( assert external_invoice.checking_id preimage = "0000000000000000000000000000000000000000000000000000000000002110" - payment_response_success = PaymentResponse( + payment_reponse_pending = PaymentResponse( ok=True, checking_id=None, preimage=preimage ) mocker.patch( "lnbits.wallets.FakeWallet.pay_invoice", - AsyncMock(return_value=payment_response_success), - ) - mocker.patch( - "lnbits.core.services.payments.get_funding_source", - return_value=external_funding_source, + AsyncMock(return_value=payment_reponse_pending), ) - returned_payment = await pay_invoice( - wallet_id=from_wallet.id, - payment_request=external_invoice.payment_request, - ) + with pytest.raises(PaymentError): + await pay_invoice( + wallet_id=from_wallet.id, + payment_request=external_invoice.payment_request, + ) payment = await get_standalone_payment(external_invoice.checking_id) assert payment - assert payment.status == PaymentState.SUCCESS.value + assert payment.status == PaymentState.FAILED.value assert payment.checking_id == external_invoice.checking_id assert payment.payment_hash == external_invoice.checking_id assert payment.amount == -2110_000 - assert payment.preimage == preimage - assert returned_payment.checking_id == external_invoice.checking_id + assert payment.preimage is None @pytest.mark.anyio diff --git a/tests/unit/test_services_extensions.py b/tests/unit/test_services_extensions.py index a9be5a087..df6cb2d6d 100644 --- a/tests/unit/test_services_extensions.py +++ b/tests/unit/test_services_extensions.py @@ -1,6 +1,3 @@ -import json -import zipfile -from datetime import datetime, timedelta, timezone from types import SimpleNamespace from uuid import uuid4 @@ -14,26 +11,17 @@ from lnbits.core.crud import ( ) from lnbits.core.models.extensions import ( Extension, - ExtensionManifestType, - ExtensionPermission, InstallableExtension, ReleasePaymentInfo, ) -from lnbits.core.services import extensions as extension_services from lnbits.core.services.extensions import ( activate_extension, - attach_wasm_invocation_runtime, deactivate_extension, - finish_wasm_invocation, - get_current_wasm_invocations, get_valid_extension, get_valid_extensions, install_extension, - record_wasm_invocation_host_call, start_extension_background_work, - start_wasm_invocation, stop_extension_background_work, - stop_wasm_invocation, uninstall_extension, ) from lnbits.settings import Settings @@ -64,9 +52,6 @@ async def test_install_extension_creates_new_extension_and_starts_background_wor ): ext_id = f"ext_{uuid4().hex[:8]}" ext_info = make_installable_extension(ext_id) - assert ext_info.meta - assert ext_info.meta.installed_release - ext_info.meta.installed_release.manifest_type = ExtensionManifestType.PYTHON original_data_folder = settings.lnbits_data_folder original_extensions_path = settings.lnbits_extensions_path download_mock = mocker.patch.object( @@ -77,9 +62,6 @@ async def test_install_extension_creates_new_extension_and_starts_background_wor "lnbits.core.services.extensions.start_extension_background_work", mocker.AsyncMock(return_value=True), ) - mocker.patch( - "lnbits.core.services.extensions.core_app_extra.register_new_ext_routes" - ) mocker.patch( "lnbits.core.services.extensions.get_db_version", mocker.AsyncMock(return_value=0), @@ -94,7 +76,6 @@ async def test_install_extension_creates_new_extension_and_starts_background_wor settings.lnbits_extensions_path = str(tmp_path / "code") extension = await install_extension(ext_info) - await activate_extension(extension) # starts background task stored = await get_installed_extension(ext_id) finally: await delete_installed_extension(ext_id=ext_id) @@ -130,9 +111,6 @@ async def test_install_extension_updates_existing_upgrade_and_preserves_payments "lnbits.core.services.extensions.stop_extension_background_work", mocker.AsyncMock(return_value=True), ) - mocker.patch( - "lnbits.core.services.extensions.core_app_extra.register_new_ext_routes" - ) mocker.patch( "lnbits.core.services.extensions.get_db_version", mocker.AsyncMock(return_value=1), @@ -146,8 +124,9 @@ async def test_install_extension_updates_existing_upgrade_and_preserves_payments settings.lnbits_data_folder = str(tmp_path / "data") settings.lnbits_extensions_path = str(tmp_path / "code") await create_installed_extension(existing_ext) + updated_ext.ext_upgrade_dir.mkdir(parents=True, exist_ok=True) + extension = await install_extension(updated_ext, skip_download=True) - await activate_extension(extension) # starts background task stored = await get_installed_extension(ext_id) finally: await delete_installed_extension(ext_id=ext_id) @@ -155,6 +134,7 @@ async def test_install_extension_updates_existing_upgrade_and_preserves_payments settings.lnbits_extensions_path = original_extensions_path assert extension.code == ext_id + assert extension.is_upgrade_extension is True assert stored is not None assert stored.meta is not None assert stored.meta.payments == [existing_payment] @@ -163,162 +143,6 @@ async def test_install_extension_updates_existing_upgrade_and_preserves_payments start_mock.assert_awaited_once_with(ext_id) -@pytest.mark.anyio -async def test_install_wasm_extension_requires_permissions_and_skips_background_work( - tmp_path, - settings: Settings, - mocker: MockerFixture, -): - ext_id = f"wasm_{uuid4().hex[:8]}" - ext_info = make_installable_extension(ext_id) - assert ext_info.meta - assert ext_info.meta.installed_release - ext_info.meta.installed_release.manifest_type = ExtensionManifestType.WASM - original_data_folder = settings.lnbits_data_folder - original_extensions_path = settings.lnbits_extensions_path - original_wasm_extensions_path = settings.lnbits_wasm_extensions_path - start_mock = mocker.patch( - "lnbits.core.services.extensions.start_extension_background_work", - mocker.AsyncMock(return_value=True), - ) - - try: - settings.lnbits_data_folder = str(tmp_path / "data") - settings.lnbits_extensions_path = str(tmp_path / "code") - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - _write_wasm_extension_archive(ext_info, _wasm_install_config(ext_id)) - wasm_ext_dir = settings.wasm_extensions_dir / ext_id - py_ext_dir = ext_info.ext_dir - upgrade_dir = ext_info.ext_upgrade_dir - - with pytest.raises(ValueError, match="requires permission approval"): - await install_extension(ext_info, skip_download=True) - - granted_permissions = [ - ExtensionPermission( - id="http.request", - policies=[{"host": "https://api.example.com"}], - ) - ] - extension = await install_extension( - ext_info, - skip_download=True, - granted_permissions=granted_permissions, - ) - stored = await get_installed_extension(ext_id) - finally: - await delete_installed_extension(ext_id=ext_id) - settings.lnbits_data_folder = original_data_folder - settings.lnbits_extensions_path = original_extensions_path - settings.lnbits_wasm_extensions_path = original_wasm_extensions_path - - assert extension.code == ext_id - assert extension.is_wasm is True - assert stored is not None - assert stored.permissions == [ - ExtensionPermission( - id="http.request", - description="Call example API.", - policies=[{"host": "https://api.example.com"}], - ) - ] - start_mock.assert_not_awaited() - assert wasm_ext_dir.is_dir() - assert not py_ext_dir.exists() - assert not upgrade_dir.exists() - - -@pytest.mark.parametrize( - ("manifest_type", "error"), - [ - ( - ExtensionManifestType.PYTHON, - "Python extension manifest cannot install WASM extension", - ), - ( - ExtensionManifestType.WASM, - "WASM extension manifest requires extension_type 'wasm'", - ), - ], -) -@pytest.mark.anyio -async def test_install_extension_rejects_archive_from_wrong_manifest_type( - tmp_path, - settings: Settings, - mocker: MockerFixture, - manifest_type: ExtensionManifestType, - error: str, -): - ext_id = f"ext_{uuid4().hex[:8]}" - ext_info = make_installable_extension(ext_id) - assert ext_info.meta - assert ext_info.meta.installed_release - ext_info.meta.installed_release.manifest_type = manifest_type - original_data_folder = settings.lnbits_data_folder - mocker.patch( - "lnbits.core.services.extensions.get_installed_extension", - mocker.AsyncMock(return_value=None), - ) - mocker.patch( - "lnbits.core.services.extensions.check_extensions_limit", - mocker.AsyncMock(), - ) - - try: - settings.lnbits_data_folder = str(tmp_path / "data") - config = ( - _wasm_install_config(ext_id) - if manifest_type == ExtensionManifestType.PYTHON - else {"id": ext_id, "name": ext_id} - ) - _write_extension_archive(ext_info, config) - - with pytest.raises(ValueError, match=error): - await install_extension(ext_info, skip_download=True) - finally: - settings.lnbits_data_folder = original_data_folder - - -@pytest.mark.parametrize( - "python_file", - ["main.py", "cache.pyc", "legacy.PYO", "native.so", "native.PYD"], -) -@pytest.mark.anyio -async def test_install_wasm_extension_rejects_python_files( - tmp_path, - settings: Settings, - mocker: MockerFixture, - python_file: str, -): - ext_id = f"wasm_{uuid4().hex[:8]}" - ext_info = make_installable_extension(ext_id) - assert ext_info.meta - assert ext_info.meta.installed_release - ext_info.meta.installed_release.manifest_type = ExtensionManifestType.WASM - original_data_folder = settings.lnbits_data_folder - mocker.patch( - "lnbits.core.services.extensions.get_installed_extension", - mocker.AsyncMock(return_value=None), - ) - mocker.patch( - "lnbits.core.services.extensions.check_extensions_limit", - mocker.AsyncMock(), - ) - - try: - settings.lnbits_data_folder = str(tmp_path / "data") - _write_extension_archive( - ext_info, - _wasm_install_config(ext_id), - extra_files=[f"nested/{python_file}"], - ) - - with pytest.raises(ValueError, match="contains forbidden Python file"): - await install_extension(ext_info, skip_download=True) - finally: - settings.lnbits_data_folder = original_data_folder - - @pytest.mark.anyio async def test_uninstall_activate_and_deactivate_extensions( tmp_path, settings: Settings, mocker: MockerFixture @@ -373,77 +197,6 @@ async def test_uninstall_activate_and_deactivate_extensions( assert start_mock.await_count == 1 -@pytest.mark.anyio -async def test_uninstall_wasm_extension_unregisters_live_routes( - tmp_path, settings: Settings, mocker: MockerFixture -): - ext_id = f"wasm_{uuid4().hex[:8]}" - ext_info = make_installable_extension(ext_id) - original_data_folder = settings.lnbits_data_folder - original_extensions_path = settings.lnbits_extensions_path - original_wasm_extensions_path = settings.lnbits_wasm_extensions_path - original_deactivated = set(settings.lnbits_deactivated_extensions) - unregister_routes_mock = mocker.patch( - "lnbits.core.services.extensions.core_app_extra.unregister_wasm_ext_routes" - ) - clean_mock = mocker.patch.object(InstallableExtension, "clean_wasm_extension_files") - - try: - settings.lnbits_data_folder = str(tmp_path / "data") - settings.lnbits_extensions_path = str(tmp_path / "code") - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - ext_dir = settings.wasm_extensions_dir / ext_id - ext_dir.mkdir(parents=True, exist_ok=True) - (ext_dir / "config.json").write_text( - json.dumps(_wasm_install_config(ext_id)), - encoding="utf-8", - ) - await create_installed_extension(ext_info) - - await uninstall_extension(ext_id) - - assert await get_installed_extension(ext_id) is None - assert ext_id in settings.lnbits_deactivated_extensions - finally: - await delete_installed_extension(ext_id=ext_id) - settings.lnbits_data_folder = original_data_folder - settings.lnbits_extensions_path = original_extensions_path - settings.lnbits_wasm_extensions_path = original_wasm_extensions_path - settings.lnbits_deactivated_extensions = original_deactivated - - unregister_routes_mock.assert_called_once_with(ext_id) - clean_mock.assert_called_once() - - -@pytest.mark.anyio -async def test_wasm_invocation_monitoring_marks_stale_once_and_cleans_periodically( - settings: Settings, - mocker: MockerFixture, -): - _reset_wasm_invocation_state() - now = datetime(2026, 1, 1, tzinfo=timezone.utc) - mark_stale_mock = mocker.patch( - "lnbits.core.services.extensions.mark_stale_wasm_invocations", - mocker.AsyncMock(), - ) - cleanup_mock = mocker.patch( - "lnbits.core.services.extensions.delete_old_wasm_invocations", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions._now", - side_effect=[now, now + timedelta(minutes=1), now + timedelta(hours=2)], - ) - - await extension_services.ensure_wasm_invocation_monitoring_ready() - await extension_services.ensure_wasm_invocation_monitoring_ready() - await extension_services.ensure_wasm_invocation_monitoring_ready() - - mark_stale_mock.assert_awaited_once() - assert cleanup_mock.await_count == 2 - cleanup_mock.assert_awaited_with(settings.lnbits_wasm_invocation_retention_days) - - @pytest.mark.anyio async def test_stop_extension_background_work_handles_missing_and_async_stops( mocker: MockerFixture, @@ -466,433 +219,6 @@ async def test_stop_extension_background_work_handles_missing_and_async_stops( assert called["stop"] is True -@pytest.mark.anyio -async def test_wasm_invocation_tracking_counts_and_stops(mocker: MockerFixture): - _reset_wasm_invocation_state() - mocker.patch( - "lnbits.core.services.extensions.create_wasm_invocation", - mocker.AsyncMock(), - ) - update_mock = mocker.patch( - "lnbits.core.services.extensions.update_wasm_invocation", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.get_wasm_invocation", - mocker.AsyncMock(return_value=None), - ) - mocker.patch( - "lnbits.core.services.extensions.mark_stale_wasm_invocations", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.delete_old_wasm_invocations", - mocker.AsyncMock(), - ) - - invocation = await start_wasm_invocation( - extension_id="demoext", - export_name="render", - trigger_type="http", - method="POST", - path="/api/v1/ext/demoext/run", - context={"origin": "https://example.com"}, - ) - store = SimpleNamespace(deadline=None) - store.set_epoch_deadline = lambda deadline: setattr(store, "deadline", deadline) - engine = SimpleNamespace(increments=0) - - def increment_epoch(): - engine.increments += 1 - - engine.increment_epoch = increment_epoch - - attach_wasm_invocation_runtime(invocation.id, engine=engine, store=store) - record_wasm_invocation_host_call(invocation.id, "http.request") - record_wasm_invocation_host_call(invocation.id, "storage.get") - - assert await stop_wasm_invocation(invocation.id, reason="test stop") is True - current = get_current_wasm_invocations() - assert current[0].status == "stopping" - assert store.deadline == 1 - assert engine.increments == 1 - - await finish_wasm_invocation(invocation.id, status="failed") - assert update_mock.await_args is not None - saved = update_mock.await_args.args[0] - assert saved.status == "stopped" - assert saved.stop_reason == "test stop" - assert saved.host_call_count == 2 - assert saved.http_call_count == 1 - assert saved.storage_call_count == 1 - - -@pytest.mark.anyio -async def test_wasm_invocation_context_and_error_message_are_sanitized( - mocker: MockerFixture, -): - _reset_wasm_invocation_state() - create_mock = mocker.patch( - "lnbits.core.services.extensions.create_wasm_invocation", - mocker.AsyncMock(), - ) - update_mock = mocker.patch( - "lnbits.core.services.extensions.update_wasm_invocation", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.get_wasm_invocation", - mocker.AsyncMock(return_value=None), - ) - mocker.patch( - "lnbits.core.services.extensions.mark_stale_wasm_invocations", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.delete_old_wasm_invocations", - mocker.AsyncMock(), - ) - long_key = "k" * 80 - secret_hex = "a" * 64 - - invocation = await start_wasm_invocation( - extension_id="demoext", - export_name="render", - context={ - long_key: "v" * 300, - "attempt": 2, - "enabled": True, - "nested": {"raw": "value"}, - 7: "ignored", - }, - ) - await finish_wasm_invocation( - invocation.id, - status="failed", - error_type="RuntimeError", - error_message=f"api_key=supersecret Bearer abc.def {secret_hex} " + ("x" * 600), - ) - - create_mock.assert_awaited_once() - assert create_mock.await_args is not None - created_invocation = create_mock.await_args.args[0] - assert created_invocation.context == { - "k" * 64: "v" * 256, - "attempt": 2, - "enabled": True, - } - update_mock.assert_awaited_once() - assert update_mock.await_args is not None - saved_invocation = update_mock.await_args.args[0] - assert saved_invocation.error_message is not None - assert "supersecret" not in saved_invocation.error_message - assert "abc.def" not in saved_invocation.error_message - assert secret_hex not in saved_invocation.error_message - assert "api_key=[redacted]" in saved_invocation.error_message - assert "Bearer [redacted]" in saved_invocation.error_message - assert "[redacted-hex]" in saved_invocation.error_message - - -def _reset_wasm_invocation_state(): - with extension_services._wasm_invocation_lock: - extension_services._wasm_invocation_handles.clear() - extension_services._wasm_invocations_marked_stale = False - extension_services._wasm_invocations_last_cleanup_at = None - - -def _write_wasm_extension_archive( - ext_info: InstallableExtension, - config: dict, -) -> None: - _write_extension_archive( - ext_info, - config, - extra_files=[config["wasm"]["module"]], - ) - - -def _write_extension_archive( - ext_info: InstallableExtension, - config: dict, - *, - extra_files: list[str] | None = None, -) -> None: - ext_info.zip_path.parent.mkdir(parents=True, exist_ok=True) - root = f"{ext_info.id}-{ext_info.version}" - with zipfile.ZipFile(ext_info.zip_path, "w") as archive: - archive.writestr(f"{root}/config.json", json.dumps(config)) - for filename in extra_files or []: - archive.writestr(f"{root}/{filename}", b"\0asm") - - -def _wasm_install_config(ext_id: str) -> dict: - return { - "id": ext_id, - "name": f"WASM {ext_id}", - "short_description": "WASM extension", - "version": "1.0.0", - "extension_type": "wasm", - "wasm": {"module": "extension.wasm"}, - "permissions": [ - { - "id": "http.request", - "description": "Call example API.", - "policies": [{"host": "https://api.example.com"}], - } - ], - } - - -def test_wasm_runtime_limits_merge_sparse_extension_overrides(settings: Settings): - original_execution_ms = settings.wasm_runtime_max_execution_ms - original_memory_bytes = settings.wasm_runtime_max_memory_bytes - try: - settings.wasm_runtime_max_execution_ms = 5_000 - settings.wasm_runtime_max_memory_bytes = 64 * 1024 * 1024 - extension = InstallableExtension( - id="wasm_demo", - name="WASM Demo", - version="1.0.0", - wasm_runtime_limits={ - "wasm_runtime_max_execution_ms": 20_000, - "wasm_runtime_max_fuel": 0, - }, - ) - - limits = extension_services.resolve_wasm_runtime_limits(extension) - - assert limits["wasm_runtime_max_execution_ms"] == 20_000 - assert limits["wasm_runtime_max_fuel"] == 0 - assert limits["wasm_runtime_max_memory_bytes"] == 64 * 1024 * 1024 - finally: - settings.wasm_runtime_max_execution_ms = original_execution_ms - settings.wasm_runtime_max_memory_bytes = original_memory_bytes - - -def test_wasm_runtime_limit_override_validation(): - assert extension_services.validate_wasm_runtime_limit_overrides( - { - "wasm_runtime_max_execution_ms": "7000", - "wasm_runtime_max_fuel": 0, - "wasm_runtime_max_memory_bytes": "", - } - ) == { - "wasm_runtime_max_execution_ms": 7000, - "wasm_runtime_max_fuel": 0, - } - - with pytest.raises(ValueError, match="Unknown WASM runtime limit field"): - extension_services.validate_wasm_runtime_limit_overrides({"unknown": 1}) - - with pytest.raises(ValueError, match="cannot be negative"): - extension_services.validate_wasm_runtime_limit_overrides( - {"wasm_runtime_max_execution_ms": -1} - ) - - with pytest.raises(ValueError, match="must be an integer"): - extension_services.validate_wasm_runtime_limit_overrides( - {"wasm_runtime_max_execution_ms": True} - ) - - with pytest.raises(ValueError, match="must be an integer"): - extension_services.validate_wasm_runtime_limit_overrides( - {"wasm_runtime_max_execution_ms": 1.5} - ) - - -@pytest.mark.anyio -async def test_update_wasm_extension_runtime_limits_saves_sparse_overrides( - tmp_path, - settings: Settings, - mocker: MockerFixture, -): - ext_id = "wasm_demo" - original_extensions_path = settings.lnbits_extensions_path - original_wasm_extensions_path = settings.lnbits_wasm_extensions_path - try: - settings.lnbits_extensions_path = str(tmp_path) - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - config_dir = settings.wasm_extensions_dir / ext_id - config_dir.mkdir(parents=True) - (config_dir / "config.json").write_text( - '{"extension_type": "wasm"}', - encoding="utf-8", - ) - installed_extension = InstallableExtension( - id=ext_id, - name="WASM Demo", - version="1.0.0", - ) - mocker.patch( - "lnbits.core.services.extensions.get_installed_extension", - mocker.AsyncMock(return_value=installed_extension), - ) - update_mock = mocker.patch( - "lnbits.core.services.extensions." - "update_installed_extension_wasm_runtime_limits", - mocker.AsyncMock(), - ) - - saved_limits = await extension_services.update_wasm_extension_runtime_limits( - ext_id, - { - "wasm_runtime_max_execution_ms": "15000", - "wasm_runtime_max_fuel": 0, - "wasm_runtime_max_memory_bytes": "", - }, - ) - finally: - settings.lnbits_extensions_path = original_extensions_path - settings.lnbits_wasm_extensions_path = original_wasm_extensions_path - - assert saved_limits == { - "wasm_runtime_max_execution_ms": 15000, - "wasm_runtime_max_fuel": 0, - } - update_mock.assert_awaited_once_with(ext_id=ext_id, limits=saved_limits) - - -@pytest.mark.anyio -async def test_wasm_invocation_concurrency_limits(mocker: MockerFixture): - _reset_wasm_invocation_state() - mocker.patch( - "lnbits.core.services.extensions.create_wasm_invocation", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.update_wasm_invocation", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.get_wasm_invocation", - mocker.AsyncMock(return_value=None), - ) - mocker.patch( - "lnbits.core.services.extensions.mark_stale_wasm_invocations", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.delete_old_wasm_invocations", - mocker.AsyncMock(), - ) - limits = extension_services.wasm_runtime_limit_defaults() - limits.update( - { - "wasm_runtime_max_concurrent_invocations": 1, - "wasm_runtime_max_concurrent_invocations_per_extension": 1, - "wasm_runtime_max_concurrent_invocations_per_user": 1, - } - ) - - invocation = await start_wasm_invocation( - extension_id="demoext", - export_name="render", - user_id="user-id", - runtime_limits=limits, - ) - - with pytest.raises(ValueError, match="too many active invocations"): - await start_wasm_invocation( - extension_id="demoext", - export_name="render", - user_id="user-id", - runtime_limits=limits, - ) - - await finish_wasm_invocation(invocation.id, status="completed") - - -@pytest.mark.anyio -async def test_wasm_invocation_host_call_limits(mocker: MockerFixture): - _reset_wasm_invocation_state() - mocker.patch( - "lnbits.core.services.extensions.create_wasm_invocation", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.update_wasm_invocation", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.get_wasm_invocation", - mocker.AsyncMock(return_value=None), - ) - mocker.patch( - "lnbits.core.services.extensions.mark_stale_wasm_invocations", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.delete_old_wasm_invocations", - mocker.AsyncMock(), - ) - limits = extension_services.wasm_runtime_limit_defaults() - limits["wasm_runtime_max_host_calls"] = 1 - - invocation = await start_wasm_invocation( - extension_id="demoext", - export_name="render", - runtime_limits=limits, - ) - record_wasm_invocation_host_call(invocation.id, "http.request") - - with pytest.raises(ValueError, match="host call limit"): - record_wasm_invocation_host_call(invocation.id, "storage.get") - - await finish_wasm_invocation(invocation.id, status="failed") - - -@pytest.mark.anyio -async def test_wasm_invocation_host_call_category_limits_can_be_disabled( - mocker: MockerFixture, -): - _reset_wasm_invocation_state() - mocker.patch( - "lnbits.core.services.extensions.create_wasm_invocation", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.update_wasm_invocation", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.get_wasm_invocation", - mocker.AsyncMock(return_value=None), - ) - mocker.patch( - "lnbits.core.services.extensions.mark_stale_wasm_invocations", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.services.extensions.delete_old_wasm_invocations", - mocker.AsyncMock(), - ) - limits = extension_services.wasm_runtime_limit_defaults() - limits["wasm_runtime_max_host_calls"] = 10 - limits["wasm_runtime_max_http_calls"] = 1 - - invocation = await start_wasm_invocation( - extension_id="demoext", - export_name="render", - runtime_limits=limits, - ) - record_wasm_invocation_host_call(invocation.id, "http.request") - with pytest.raises(ValueError, match="http host call limit"): - record_wasm_invocation_host_call(invocation.id, "extension.api.request") - await finish_wasm_invocation(invocation.id, status="failed") - - limits["wasm_runtime_max_host_calls"] = 0 - limits["wasm_runtime_max_http_calls"] = 0 - unlimited_invocation = await start_wasm_invocation( - extension_id="demoext", - export_name="render", - runtime_limits=limits, - ) - for _ in range(5): - record_wasm_invocation_host_call(unlimited_invocation.id, "http.request") - - await finish_wasm_invocation(unlimited_invocation.id, status="completed") - - @pytest.mark.anyio async def test_start_extension_background_work_handles_missing_and_sync_starts( mocker: MockerFixture, diff --git a/tests/unit/test_services_notifications.py b/tests/unit/test_services_notifications.py index e3699fb1f..d379f2478 100644 --- a/tests/unit/test_services_notifications.py +++ b/tests/unit/test_services_notifications.py @@ -39,7 +39,6 @@ from lnbits.core.services.notifications import ( send_nostr_notification, send_nostr_notifications, send_notification, - send_notification_in_background, send_payment_notification, send_payment_push_notification, send_push_notification, @@ -118,7 +117,7 @@ async def test_send_admin_and_user_notification_use_expected_targets( settings: Settings, mocker: MockerFixture ): send_mock = mocker.patch( - "lnbits.core.services.notifications.send_notification_in_background", + "lnbits.core.services.notifications.send_notification", mocker.AsyncMock(), ) original_chat_id = settings.lnbits_telegram_notifications_chat_id @@ -160,45 +159,6 @@ async def test_send_admin_and_user_notification_use_expected_targets( ) -@pytest.mark.anyio -async def test_send_notification_in_background_schedules_notification( - mocker: MockerFixture, -): - scheduled = [] - - def create_task(coro): - scheduled.append(coro) - coro.close() - return mocker.Mock() - - create_task_mock = mocker.patch( - "lnbits.core.services.notifications.create_task", - side_effect=create_task, - ) - send_mock = mocker.patch( - "lnbits.core.services.notifications.send_notification", - mocker.AsyncMock(), - ) - - await send_notification_in_background( - "chat-id", - ["alice@example.com"], - ["admin@example.com"], - "hello", - "settings_update", - ) - - create_task_mock.assert_called_once() - send_mock.assert_called_once_with( - "chat-id", - ["alice@example.com"], - ["admin@example.com"], - "hello", - "settings_update", - ) - assert len(scheduled) == 1 - - @pytest.mark.anyio async def test_send_notification_uses_available_channels_and_swallows_exceptions( settings: Settings, mocker: MockerFixture diff --git a/tests/unit/test_services_payments.py b/tests/unit/test_services_payments.py index d2bb8d293..c847363eb 100644 --- a/tests/unit/test_services_payments.py +++ b/tests/unit/test_services_payments.py @@ -27,7 +27,6 @@ from lnbits.core.services.payments import ( check_pending_payments, check_time_limit_between_transactions, check_transaction_status, - check_wallet_daily_withdraw_limit, check_wallet_limits, create_payment_request, get_payments_daily_stats, @@ -43,38 +42,10 @@ from lnbits.wallets.base import ( InvoiceResponse, PaymentFailedStatus, PaymentPendingStatus, - PaymentResponse, - PaymentStatus, PaymentSuccessStatus, ) -@pytest.mark.parametrize( - ("value", "expected"), - [ - (True, (True, False, False)), - (None, (False, True, False)), - (False, (False, False, True)), - ], -) -def test_payment_response_states_are_mutually_exclusive(value, expected): - response = PaymentResponse(ok=value) - assert (response.success, response.pending, response.failed) == expected - - -@pytest.mark.parametrize( - ("value", "expected"), - [ - (True, (True, False, False)), - (None, (False, True, False)), - (False, (False, True, True)), - ], -) -def test_payment_status_properties(value, expected): - status = PaymentStatus(paid=value) - assert (status.success, status.pending, status.failed) == expected - - @pytest.mark.anyio async def test_create_payment_request_routes_by_invoice_type(mocker: MockerFixture): wallet_payment = SimpleNamespace(checking_id="wallet") @@ -103,39 +74,6 @@ async def test_create_payment_request_routes_by_invoice_type(mocker: MockerFixtu fiat_mock.assert_awaited_once() -@pytest.mark.anyio -@pytest.mark.parametrize("fiat_provider", ("stripe", "square", "paypal")) -async def test_create_payment_request_rejects_fiat_subscription( - fiat_provider: str, mocker: MockerFixture -): - fiat_mock = mocker.patch( - "lnbits.core.services.payments.create_fiat_invoice", - mocker.AsyncMock(), - ) - - with pytest.raises( - ValueError, - match="Cannot create direct fiat subscription payments.", - ): - await create_payment_request( - "wallet-1", - CreateInvoice( - unit="USD", - amount=2100, - fiat_provider=fiat_provider, - extra={ - "fiat_method": "subscription", - "subscription": { - "checking_id": "fiat_stripe_cs_paid_session", - "payment_request": "", - }, - }, - ), - ) - - fiat_mock.assert_not_awaited() - - @pytest.mark.anyio async def test_update_pending_payment_and_bulk_pending_updates(mocker: MockerFixture): wallet = await _create_wallet() @@ -172,36 +110,6 @@ async def test_update_pending_payment_and_bulk_pending_updates(mocker: MockerFix assert bulk_statuses == {PaymentState.FAILED, PaymentState.SUCCESS} -@pytest.mark.anyio -async def test_update_pending_payment_marks_expired_incoming_invoice_failed( - app, - mocker: MockerFixture, -): - wallet = await _create_wallet() - checking_id = await _create_payment( - wallet, - expiry=datetime.now(timezone.utc) - timedelta(seconds=1), - labels=["test"], - ) - payment = await get_payment(checking_id) - check_status_mock = mocker.patch( - "lnbits.core.services.payments.check_payment_status", - mocker.AsyncMock( - side_effect=AssertionError("expired invoices should not be checked") - ), - ) - - updated_payment = await update_pending_payment(payment) - - assert updated_payment.status == PaymentState.FAILED - assert updated_payment.labels == ["test", "expired"] - check_status_mock.assert_not_awaited() - - stored_payment = await get_payment(checking_id) - assert stored_payment.status == PaymentState.FAILED - assert stored_payment.labels == ["test", "expired"] - - @pytest.mark.anyio async def test_check_pending_payments_skips_voidwallet_and_updates_recent_items( mocker: MockerFixture, @@ -289,7 +197,8 @@ async def test_update_wallet_balance_validates_credit_and_debit( settings.lnbits_wallet_limit_max_balance = 0 queue_mock = mocker.patch( - "lnbits.task_manager.task_manager.internal_invoice_queue.put_nowait", + "lnbits.tasks.internal_invoice_queue_put", + mocker.AsyncMock(), ) await update_wallet_balance(wallet, 5) @@ -303,8 +212,7 @@ async def test_update_wallet_balance_validates_credit_and_debit( ] assert credit_payments assert credit_payments[0].status == PaymentState.SUCCESS - queue_mock.assert_called_once() - assert queue_mock.call_args[0][0].checking_id == credit_payments[0].checking_id + queue_mock.assert_awaited_once_with(credit_payments[0].checking_id) @pytest.mark.anyio @@ -340,23 +248,6 @@ async def test_check_wallet_limits_and_time_limit( settings.lnbits_wallet_limit_secs_between_trans = original_limit -@pytest.mark.anyio -async def test_check_wallet_daily_limit_counts_all_daily_payments(settings: Settings): - wallet = await _create_wallet() - await _create_payment(wallet, amount_msat=-2_000, status=PaymentState.SUCCESS) - await _create_payment(wallet, amount_msat=-3_000, status=PaymentState.SUCCESS) - - original_limit = settings.lnbits_wallet_limit_daily_max_withdraw - try: - settings.lnbits_wallet_limit_daily_max_withdraw = 5 - with pytest.raises( - ValueError, match="Daily withdrawal limit of 5 sats reached." - ): - await check_wallet_daily_withdraw_limit(wallet.id, 1_000) - finally: - settings.lnbits_wallet_limit_daily_max_withdraw = original_limit - - @pytest.mark.anyio async def test_calculate_fiat_amounts_handles_conversion_and_errors( mocker: MockerFixture, @@ -542,8 +433,6 @@ async def _create_payment( payment_hash: str | None = None, fee: int = 0, time: datetime | None = None, - expiry: datetime | None = None, - labels: list[str] | None = None, ) -> str: checking_id = checking_id or f"checking_{uuid4().hex[:8]}" payment_hash = payment_hash or uuid4().hex @@ -555,9 +444,7 @@ async def _create_payment( bolt11=f"bolt11-{checking_id}", amount_msat=amount_msat, memo="memo", - expiry=expiry, fee=fee, - labels=labels, ), status=status, ) diff --git a/tests/unit/test_settings.py b/tests/unit/test_settings.py index 521bfb538..d1fecc856 100644 --- a/tests/unit/test_settings.py +++ b/tests/unit/test_settings.py @@ -1,11 +1,9 @@ -from pathlib import Path -from typing import Any, Literal +from typing import Any import pytest from pytest_mock.plugin import MockerFixture from lnbits.settings import ( - DEFAULT_WASM_MANIFESTS, AssetSettings, ExchangeRateProvider, InstalledExtensionsSettings, @@ -14,7 +12,6 @@ from lnbits.settings import ( RedirectPath, SecuritySettings, Settings, - UsersSettings, list_parse_fallback, set_cli_settings, ) @@ -41,33 +38,6 @@ nostrrelay_redirect_path: dict[str, Any] = { } -@pytest.mark.parametrize( - ("mode", "creation_allowed"), - [ - ("core_first", True), - ("extension_first", True), - ("extension_only", False), - ], -) -def test_ln_address_mode( - mode: Literal["core_first", "extension_first", "extension_only"], - creation_allowed: bool, -): - users_settings = UsersSettings(lnbits_ln_address_mode=mode) - - assert users_settings.lnbits_ln_address_mode == mode - assert users_settings.ln_address_creation_allowed is creation_allowed - - -def test_ln_address_mode_defaults_to_extension_first(): - assert UsersSettings().lnbits_ln_address_mode == "extension_first" - - -def test_ln_address_mode_rejects_invalid_value(): - with pytest.raises(ValueError): - UsersSettings.parse_obj({"lnbits_ln_address_mode": "invalid"}) - - @pytest.fixture() def lnurlp(): return RedirectPath(ext_id="lnurlp", **lnurlp_redirect_path) @@ -218,65 +188,6 @@ def test_list_parse_fallback(): assert list_parse_fallback("") == [] -def test_settings_keep_wasm_manifests_separate_from_extension_manifests(): - settings = Settings( - lnbits_extensions_manifests=["https://example.com/extensions.json"], - lnbits_wasm_extensions_manifests=[ - *DEFAULT_WASM_MANIFESTS, - "https://example.com/extensions.json", - ], - ) - - assert settings.lnbits_extensions_manifests == [ - "https://example.com/extensions.json" - ] - assert settings.lnbits_wasm_extensions_manifests == [ - *DEFAULT_WASM_MANIFESTS, - "https://example.com/extensions.json", - ] - assert settings.dict()["lnbits_extensions_manifests"] == [ - "https://example.com/extensions.json" - ] - assert settings.dict()["lnbits_wasm_extensions_manifests"] == [ - *DEFAULT_WASM_MANIFESTS, - "https://example.com/extensions.json", - ] - - -def test_wasm_extensions_directory_defaults_to_data_folder_and_is_configurable( - tmp_path: Path, -): - data_folder = tmp_path / "data" - default_settings = Settings( - lnbits_data_folder=str(data_folder), - lnbits_wasm_extensions_path="", - ) - custom_path = tmp_path / "custom-wasm" - custom_settings = Settings( - lnbits_data_folder=str(data_folder), - lnbits_wasm_extensions_path=str(custom_path), - ) - - assert default_settings.wasm_extensions_dir == data_folder / "wasm_extensions" - assert default_settings.lnbits_wasm_extensions_path == str( - data_folder / "wasm_extensions" - ) - assert custom_settings.wasm_extensions_dir == custom_path - - -def test_wasm_extensions_directory_must_not_be_importable(tmp_path: Path): - settings = Settings( - lnbits_data_folder=str(tmp_path / "data"), - lnbits_extensions_path=str(tmp_path / "code"), - lnbits_wasm_extensions_path=str( - tmp_path / "code" / "extensions" / "wasm_extensions" - ), - ) - - with pytest.raises(ValueError, match="outside importable extension directories"): - _ = settings.wasm_extensions_dir - - def test_exchange_rate_provider_convert_ticker(): provider = ExchangeRateProvider( name="Provider", @@ -305,11 +216,16 @@ def test_installed_extensions_settings_activate_and_deactivate_paths(): } ] - installed.activate_extension_paths("lnurlp", ext_redirects=redirects) + installed.activate_extension_paths( + "lnurlp", + upgrade_hash="hash123", + ext_redirects=redirects, + ) redirect = installed.find_extension_redirect("/.well-known/lnurlp", []) assert redirect is not None assert redirect.ext_id == "lnurlp" + assert installed.lnbits_upgraded_extensions["lnurlp"] == "hash123" assert "lnurlp" in installed.lnbits_installed_extensions_ids installed.deactivate_extension_paths("lnurlp") diff --git a/tests/unit/test_wallet_payment_ambiguity.py b/tests/unit/test_wallet_payment_ambiguity.py deleted file mode 100644 index d4c4bc5e9..000000000 --- a/tests/unit/test_wallet_payment_ambiguity.py +++ /dev/null @@ -1,890 +0,0 @@ -from types import SimpleNamespace -from typing import Any, cast - -import grpc -import httpx -import pytest -from pyln.client import RpcError -from pytest_mock.plugin import MockerFixture - -import lnbits.wallets.breez as breez_wallet_module -import lnbits.wallets.breez_liquid as breez_liquid_wallet_module -from lnbits.wallets.alby import AlbyWallet -from lnbits.wallets.base import PaymentPendingStatus -from lnbits.wallets.blink import BlinkWallet -from lnbits.wallets.boltz import BoltzWallet -from lnbits.wallets.boltz_grpc_files import boltzrpc_pb2 -from lnbits.wallets.corelightning import CoreLightningWallet -from lnbits.wallets.eclair import EclairWallet -from lnbits.wallets.lnd_grpc_files.lightning_pb2 import Payment as LndPayment -from lnbits.wallets.lndgrpc import LndWallet -from lnbits.wallets.lndrest import LndRestWallet -from lnbits.wallets.lnpay import LNPayWallet -from lnbits.wallets.lntips import LnTipsWallet -from lnbits.wallets.nwc import NWCError, NWCWallet -from lnbits.wallets.opennode import OpenNodeWallet -from lnbits.wallets.phoenixd import PhoenixdWallet -from lnbits.wallets.spark import SparkWallet -from lnbits.wallets.sparkl2 import SparkL2Wallet -from lnbits.wallets.strike import StrikeWallet -from lnbits.wallets.zbd import ZBDWallet - - -def _response(status_code: int, **kwargs) -> httpx.Response: - request = httpx.Request("POST", "https://wallet.test/pay") - return httpx.Response(status_code, request=request, **kwargs) - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("status_code", "expected"), - [ - (400, None), - (401, False), - (403, False), - (404, False), - (405, False), - (408, None), - (409, None), - (422, None), - (429, None), - (500, None), - ], -) -async def test_alby_only_treats_definite_http_rejection_as_failed( - mocker: MockerFixture, status_code: int, expected: bool | None -): - wallet = object.__new__(AlbyWallet) - wallet.endpoint = "https://wallet.test" - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock( - return_value=_response(status_code, json={"message": "error"}) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - - -@pytest.mark.anyio -async def test_blink_keeps_unconfirmed_payment_pending(mocker: MockerFixture): - wallet = object.__new__(BlinkWallet) - wallet._wallet_id = "wallet-id" - wallet.endpoint = "https://wallet.test" - mocker.patch( - "lnbits.wallets.blink.bolt11_lib.decode", - return_value=SimpleNamespace(payment_hash="payment-hash"), - ) - mocker.patch.object( - wallet, - "_graphql_query", - return_value={"data": {"lnInvoicePaymentSend": {"errors": []}}}, - ) - mocker.patch.object( - wallet, "get_payment_status", return_value=PaymentPendingStatus() - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is None - assert response.checking_id == "payment-hash" - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("status_code", "expected"), - [ - (400, False), - (401, False), - (403, False), - (404, False), - (405, False), - (408, None), - (409, None), - (422, None), - (429, None), - (500, None), - ], -) -async def test_eclair_only_treats_request_rejections_as_failed( - mocker: MockerFixture, status_code: int, expected: bool | None -): - wallet = object.__new__(EclairWallet) - wallet.url = "https://wallet.test" - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock( - return_value=_response(status_code, json={"error": "invoice has expired"}) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - assert response.error_message == "invoice has expired" - - -@pytest.mark.anyio -async def test_lndrest_unknown_payment_state_is_pending( - mocker: MockerFixture, settings -): - settings.lnd_rest_allow_self_payment = False - wallet = object.__new__(LndRestWallet) - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock( - return_value=_response( - 200, - json={ - "result": { - "status": "FUTURE_STATUS", - "payment_hash": "payment-hash", - "payment_preimage": "", - "fee_msat": "0", - } - }, - ) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is None - assert response.checking_id == "payment-hash" - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("error", "expected"), - [ - ( - { - "code": 2, - "message": "invoice not for current active network 'regtest'", - }, - False, - ), - ({"code": 2, "message": "invoice expired"}, False), - ({"code": 3, "message": "invalid payment request"}, False), - ({"code": 2, "message": "payment stream interrupted"}, None), - ({"code": 14, "message": "transport unavailable"}, None), - ], -) -async def test_lndrest_only_pre_dispatch_rpc_errors_are_failed( - mocker: MockerFixture, - settings, - error: dict, - expected: bool | None, -): - settings.lnd_rest_allow_self_payment = False - wallet = object.__new__(LndRestWallet) - wallet.endpoint = "https://wallet.test" - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock( - return_value=_response(500, json={"error": error}), - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - assert response.error_message == error["message"] - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("code", "details", "expected"), - [ - ( - grpc.StatusCode.UNKNOWN, - "invoice not for current active network 'regtest'", - False, - ), - (grpc.StatusCode.UNKNOWN, "invoice expired", False), - (grpc.StatusCode.INVALID_ARGUMENT, "invalid payment request", False), - (grpc.StatusCode.PERMISSION_DENIED, "permission denied", False), - (grpc.StatusCode.UNAUTHENTICATED, "invalid macaroon", False), - (grpc.StatusCode.UNAVAILABLE, "transport is closing", None), - (grpc.StatusCode.DEADLINE_EXCEEDED, "deadline exceeded", None), - (grpc.StatusCode.ALREADY_EXISTS, "payment is in flight", None), - (grpc.StatusCode.UNKNOWN, "payment stream interrupted", None), - ], -) -async def test_lndgrpc_only_pre_dispatch_rpc_errors_are_failed( - mocker: MockerFixture, - settings, - code: grpc.StatusCode, - details: str, - expected: bool | None, -): - settings.lnd_grpc_allow_self_payment = False - metadata = grpc.aio.Metadata() - error = grpc.aio.AioRpcError(code, metadata, metadata, details=details) - wallet = object.__new__(LndWallet) - cast(Any, wallet).router_rpc = SimpleNamespace( - SendPaymentV2=mocker.Mock( - return_value=SimpleNamespace(read=mocker.AsyncMock(side_effect=error)) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - - -@pytest.mark.anyio -async def test_lndgrpc_in_flight_payment_is_pending(mocker: MockerFixture, settings): - settings.lnd_grpc_allow_self_payment = False - wallet = object.__new__(LndWallet) - cast(Any, wallet).router_rpc = SimpleNamespace( - SendPaymentV2=mocker.Mock( - return_value=SimpleNamespace( - read=mocker.AsyncMock( - return_value=SimpleNamespace( - status=LndPayment.PaymentStatus.IN_FLIGHT, - payment_hash="payment-hash", - ) - ) - ) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is None - assert response.checking_id == "payment-hash" - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("error", "expected"), - [ - ( - { - "code": 0, - "message": "destination is not reachable", - "attempts": [{"status": "failed"}], - }, - False, - ), - ( - { - "code": 0, - "message": "payment is still running", - "attempts": [{"status": "pending"}], - }, - None, - ), - ({"code": 0, "message": "unclassified RPC error"}, None), - ({"code": 205, "message": "unable to find a route"}, False), - ], -) -async def test_corelightning_only_terminal_rpc_errors_are_failed( - mocker: MockerFixture, - error: dict, - expected: bool | None, -): - wallet = object.__new__(CoreLightningWallet) - wallet.pay = "pay" - wallet.pay_failure_error_codes = [-32602, 201, 203, 205, 206, 207, 210] - cast(Any, wallet).ln = SimpleNamespace( - call=mocker.Mock(side_effect=RpcError("pay", {}, cast(Any, error))) - ) - mocker.patch( - "lnbits.wallets.corelightning.bolt11_decode", - return_value=SimpleNamespace( - payment_hash="payment-hash", - amount_msat=1_000, - description="", - ), - ) - mocker.patch.object( - wallet, "get_payment_status", return_value=PaymentPendingStatus() - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("status_code", "expected"), - [ - (400, None), - (401, False), - (403, False), - (404, False), - (405, False), - (408, None), - (409, None), - (422, None), - (429, None), - (500, None), - ], -) -async def test_lnpay_only_treats_client_rejection_as_failed( - mocker: MockerFixture, status_code: int, expected: bool | None -): - wallet = object.__new__(LNPayWallet) - wallet.wallet_key = "wallet-key" - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock( - return_value=_response(status_code, json={"message": "error"}) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - - -@pytest.mark.anyio -async def test_lnpay_malformed_payment_response_is_pending(mocker: MockerFixture): - wallet = object.__new__(LNPayWallet) - wallet.wallet_key = "wallet-key" - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock(return_value=_response(200, content=b"not-json")) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is None - - -@pytest.mark.anyio -@pytest.mark.parametrize("wallet_class", [LnTipsWallet, OpenNodeWallet, ZBDWallet]) -@pytest.mark.parametrize( - ("status_code", "expected"), - [(400, None), (401, False), (422, None)], -) -async def test_http_wallets_only_fail_definite_request_rejections( - mocker: MockerFixture, - wallet_class: type[LnTipsWallet | OpenNodeWallet | ZBDWallet], - status_code: int, - expected: bool | None, -): - wallet = object.__new__(wallet_class) - wallet.endpoint = "https://wallet.test" - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock( - return_value=_response(status_code, json={"message": "error"}) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - - -@pytest.mark.anyio -async def test_breez_immediate_failed_state_is_failed(mocker: MockerFixture, settings): - settings.breez_use_trampoline = False - breez_wallet = cast(Any, breez_wallet_module) - wallet = object.__new__(breez_wallet.BreezSdkWallet) - mocker.patch( - "lnbits.wallets.breez.bolt11_decode", - return_value=SimpleNamespace(payment_hash="payment-hash"), - ) - cast(Any, wallet).sdk_services = SimpleNamespace( - send_payment=mocker.Mock( - return_value=SimpleNamespace( - payment=SimpleNamespace(status=breez_wallet.BreezPaymentStatus.FAILED) - ) - ) - ) - - response = await cast(Any, wallet).pay_invoice("bolt11", 1_000) - - assert response.ok is False - assert response.checking_id == "payment-hash" - - -@pytest.mark.anyio -async def test_breez_liquid_timed_out_outgoing_payment_is_failed( - mocker: MockerFixture, -): - breez_liquid_wallet = cast(Any, breez_liquid_wallet_module) - wallet = object.__new__(breez_liquid_wallet.BreezLiquidSdkWallet) - cast(Any, wallet).sdk_services = SimpleNamespace( - get_payment=mocker.Mock( - return_value=SimpleNamespace( - payment_type=breez_liquid_wallet.PaymentType.SEND, - status=breez_liquid_wallet.PaymentState.TIMED_OUT, - ) - ) - ) - - status = await cast(Any, wallet).get_payment_status("payment-hash") - - assert status.paid is False - - -@pytest.mark.anyio -async def test_breez_liquid_prepare_error_is_failed(mocker: MockerFixture): - breez_liquid_wallet = cast(Any, breez_liquid_wallet_module) - wallet = object.__new__(breez_liquid_wallet.BreezLiquidSdkWallet) - mocker.patch( - "lnbits.wallets.breez_liquid.bolt11_decode", - return_value=SimpleNamespace(payment_hash="payment-hash"), - ) - cast(Any, wallet).sdk_services = SimpleNamespace( - prepare_send_payment=mocker.Mock(side_effect=RuntimeError("cannot prepare")) - ) - - response = await cast(Any, wallet).pay_invoice("bolt11", 1_000) - - assert response.ok is False - assert response.checking_id == "payment-hash" - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("code", "expected"), - [("PAYMENT_FAILED", False), ("INTERNAL", None), ("OTHER", None)], -) -async def test_nwc_only_explicit_payment_failure_is_failed( - mocker: MockerFixture, code: str, expected: bool | None -): - wallet = object.__new__(NWCWallet) - cast(Any, wallet).conn = SimpleNamespace( - call=mocker.AsyncMock(side_effect=NWCError(code, "error")) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - - -@pytest.mark.anyio -async def test_phoenix_request_error_is_pending(mocker: MockerFixture): - wallet = object.__new__(PhoenixdWallet) - wallet.endpoint = "https://wallet.test" - request = httpx.Request("POST", "https://wallet.test/payinvoice") - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock( - side_effect=httpx.ReadError("read failed", request=request) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is None - - -@pytest.mark.anyio -async def test_spark_sidecar_missing_checking_id_is_pending(mocker: MockerFixture): - wallet = object.__new__(SparkL2Wallet) - mocker.patch.object(wallet, "_request", return_value={"status": "PENDING"}) - - response = await wallet.pay_invoice("not-a-bolt11", 1_000) - - assert response.ok is None - assert response.checking_id is None - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("provider_status", "expected"), - [("unpaid", None), ("expired", False), ("paid", True)], -) -async def test_spark_invoice_uses_exact_terminal_status( - mocker: MockerFixture, - provider_status: str, - expected: bool | None, -): - wallet = object.__new__(SparkWallet) - mocker.patch.object( - wallet, - "listinvoices", - return_value={"invoices": [{"status": provider_status}]}, - ) - - status = await wallet.get_invoice_status("invoice-id") - - assert status.paid is expected - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("state", "expected"), - [ - (boltzrpc_pb2.SwapState.ERROR, False), - (999, None), - ], -) -async def test_boltz_only_known_terminal_swap_state_is_failed( - mocker: MockerFixture, state: int, expected: bool | None -): - wallet = object.__new__(BoltzWallet) - wallet.metadata = None - cast(Any, wallet).rpc = SimpleNamespace( - GetSwapInfo=mocker.AsyncMock( - return_value=SimpleNamespace(swap=SimpleNamespace(state=state)) - ) - ) - - status = await wallet.get_payment_status("00" * 32) - - assert status.paid is expected - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("code", "details", "expected"), - [ - ( - grpc.StatusCode.INVALID_ARGUMENT, - "invalid invoice or lnurl: invalid HRP", - False, - ), - ( - grpc.StatusCode.UNKNOWN, - "boltz error: could not find route to pay invoice", - False, - ), - (grpc.StatusCode.UNKNOWN, "payment response interrupted", None), - (grpc.StatusCode.ALREADY_EXISTS, "swap already exists", None), - ], -) -async def test_boltz_only_pre_dispatch_create_swap_errors_are_failed( - mocker: MockerFixture, - code: grpc.StatusCode, - details: str, - expected: bool | None, -): - metadata = grpc.aio.Metadata() - error = grpc.aio.AioRpcError(code, metadata, metadata, details=details) - wallet = object.__new__(BoltzWallet) - wallet.metadata = None - wallet.wallet_id = 1 - cast(Any, wallet).rpc = SimpleNamespace( - GetPairInfo=mocker.AsyncMock( - return_value=SimpleNamespace( - fees=SimpleNamespace(percentage=0, miner_fees=0) - ) - ), - CreateSwap=mocker.AsyncMock(side_effect=error), - ) - mocker.patch( - "lnbits.wallets.boltz.decode", - return_value=SimpleNamespace( - amount_msat=1_000, - payment_hash="payment-hash", - ), - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - assert response.checking_id == "payment-hash" - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("state", "expected"), - [ - (boltzrpc_pb2.ERROR, False), - (boltzrpc_pb2.PENDING, None), - (boltzrpc_pb2.SUCCESSFUL, True), - ], -) -async def test_boltz_resolves_ambiguous_create_swap_error_from_backend_state( - mocker: MockerFixture, - state: int, - expected: bool | None, -): - metadata = grpc.aio.Metadata() - error = grpc.aio.AioRpcError( - grpc.StatusCode.UNKNOWN, - metadata, - metadata, - details='sendrawtransaction RPC error: {"message":"txn-mempool-conflict"}', - ) - payment_hash = "00" * 32 - wallet = object.__new__(BoltzWallet) - wallet.metadata = None - wallet.wallet_id = 1 - cast(Any, wallet).rpc = SimpleNamespace( - GetPairInfo=mocker.AsyncMock( - return_value=SimpleNamespace( - fees=SimpleNamespace(percentage=0, miner_fees=0) - ) - ), - CreateSwap=mocker.AsyncMock(side_effect=error), - GetSwapInfo=mocker.AsyncMock( - return_value=SimpleNamespace( - swap=SimpleNamespace( - state=state, - service_fee=1, - onchain_fee=2, - status="swap status", - preimage="preimage", - ) - ) - ), - ) - mocker.patch( - "lnbits.wallets.boltz.decode", - return_value=SimpleNamespace( - amount_msat=1_000, - payment_hash=payment_hash, - ), - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - assert response.checking_id == payment_hash - assert response.fee_msat == (3_000 if expected is True else None) - assert response.preimage == ("preimage" if expected is True else None) - - -@pytest.mark.anyio -async def test_boltz_error_text_without_terminal_state_is_pending( - mocker: MockerFixture, -): - async def swap_updates(): - yield SimpleNamespace( - swap=SimpleNamespace(state=999, error="unrecognized transient error") - ) - - wallet = object.__new__(BoltzWallet) - wallet.metadata = None - wallet.wallet_id = 1 - cast(Any, wallet).rpc = SimpleNamespace( - GetPairInfo=mocker.AsyncMock( - return_value=SimpleNamespace( - fees=SimpleNamespace(percentage=0, miner_fees=0) - ) - ), - CreateSwap=mocker.AsyncMock(return_value=SimpleNamespace(id="swap-id")), - GetSwapInfoStream=mocker.Mock(return_value=swap_updates()), - ) - mocker.patch( - "lnbits.wallets.boltz.decode", - return_value=SimpleNamespace( - amount_msat=1_000, - payment_hash="payment-hash", - ), - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is None - - -@pytest.mark.anyio -async def test_opennode_terminal_error_status_is_failed(mocker: MockerFixture): - wallet = object.__new__(OpenNodeWallet) - cast(Any, wallet).client = SimpleNamespace( - get=mocker.AsyncMock( - return_value=_response( - 200, - json={"data": {"status": "error", "fee": 1}}, - ) - ) - ) - - status = await wallet.get_payment_status("withdrawal-id") - - assert status.paid is False - - -@pytest.mark.anyio -async def test_opennode_terminal_status_does_not_require_provider_id( - mocker: MockerFixture, -): - wallet = object.__new__(OpenNodeWallet) - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock( - return_value=_response( - 200, - json={"data": {"status": "failed"}}, - ) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is False - assert response.checking_id is None - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("provider_status", "expected"), - [("processing", None), ("completed", True), ("failed", False)], -) -async def test_zbd_preserves_provider_id_and_exact_status( - mocker: MockerFixture, - provider_status: str, - expected: bool | None, -): - wallet = object.__new__(ZBDWallet) - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock( - return_value=_response( - 200, - json={ - "data": { - "id": "zbd-payment-id", - "status": provider_status, - "fee": "10", - "preimage": "preimage", - } - }, - ) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is expected - assert response.checking_id == "zbd-payment-id" - - -@pytest.mark.anyio -async def test_zbd_terminal_status_does_not_require_provider_id( - mocker: MockerFixture, -): - wallet = object.__new__(ZBDWallet) - cast(Any, wallet).client = SimpleNamespace( - post=mocker.AsyncMock( - return_value=_response( - 200, - json={"data": {"status": "failed"}}, - ) - ) - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is False - assert response.checking_id is None - - -@pytest.mark.anyio -async def test_strike_invalid_fallback_identifier_is_pending(mocker: MockerFixture): - wallet = object.__new__(StrikeWallet) - wallet.pending_payments = {} - cast(Any, wallet)._get = mocker.AsyncMock( - return_value=_response( - 400, - json={ - "data": { - "code": "INVALID_DATA", - "validationErrors": { - "paymentId": [ - { - "code": "INVALID_DATA", - "message": "paymentId is not valid.", - } - ] - }, - } - }, - ) - ) - - status = await wallet._get_payment_status_by_checking_id("payment-hash") - - assert status.paid is None - - -@pytest.mark.anyio -async def test_strike_ambiguous_execution_uses_payment_hash_fallback( - mocker: MockerFixture, -): - wallet = object.__new__(StrikeWallet) - wallet.pending_payments = {} - mocker.patch( - "lnbits.wallets.strike.bolt11_decode", - return_value=SimpleNamespace(payment_hash="payment-hash"), - ) - mocker.patch.object( - wallet, - "_create_payment_quote", - return_value=("quote-id", None), - ) - mocker.patch.object( - wallet, - "_execute_payment_quote", - return_value=(None, "request timed out"), - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is None - assert response.checking_id is None - - -@pytest.mark.anyio -async def test_strike_terminal_state_does_not_require_payment_id( - mocker: MockerFixture, -): - wallet = object.__new__(StrikeWallet) - wallet.pending_payments = {} - mocker.patch( - "lnbits.wallets.strike.bolt11_decode", - return_value=SimpleNamespace(payment_hash="payment-hash"), - ) - mocker.patch.object( - wallet, - "_create_payment_quote", - return_value=("quote-id", None), - ) - mocker.patch.object( - wallet, - "_execute_payment_quote", - return_value=({"state": "FAILED"}, None), - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is False - assert response.checking_id == "payment-hash" - - -@pytest.mark.anyio -@pytest.mark.parametrize("state", ["CANCELED", "TIMED_OUT", "UNKNOWN"]) -async def test_strike_undocumented_payment_state_is_pending( - mocker: MockerFixture, state: str -): - wallet = object.__new__(StrikeWallet) - wallet.pending_payments = {} - mocker.patch( - "lnbits.wallets.strike.bolt11_decode", - return_value=SimpleNamespace(payment_hash="payment-hash"), - ) - mocker.patch.object( - wallet, - "_create_payment_quote", - return_value=("quote-id", None), - ) - mocker.patch.object( - wallet, - "_execute_payment_quote", - return_value=({"state": state, "paymentId": "payment-id"}, None), - ) - - response = await wallet.pay_invoice("bolt11", 1_000) - - assert response.ok is None - assert response.checking_id == "payment-id" - - -@pytest.mark.anyio -async def test_strike_persisted_payment_hash_not_found_stays_pending( - mocker: MockerFixture, -): - wallet = object.__new__(StrikeWallet) - wallet.pending_payments = {} - cast(Any, wallet)._get = mocker.AsyncMock( - return_value=_response(404, text="Not Found") - ) - - payment_hash = "ab" * 32 - status = await wallet.get_payment_status(payment_hash) - - assert status.paid is None - cast(Any, wallet)._get.assert_awaited_once_with(f"/payments/{payment_hash}") diff --git a/tests/unit/test_wasm_extension_api_client.py b/tests/unit/test_wasm_extension_api_client.py deleted file mode 100644 index 5441d712b..000000000 --- a/tests/unit/test_wasm_extension_api_client.py +++ /dev/null @@ -1,301 +0,0 @@ -from types import SimpleNamespace -from typing import cast - -import httpx -import pytest -from pytest_mock.plugin import MockerFixture - -from lnbits.core.wasm_ext.api.models import ExtensionApiRequest -from lnbits.core.wasm_ext.client import extensions as extension_client -from lnbits.settings import Settings - - -def test_wasm_extension_api_path_validation(): - assert ( - extension_client._extension_api_path("/api/v1/payments?limit=1") - == "/api/v1/payments?limit=1" - ) - - for path, message in [ - ("https://example.com/api/v1/payments", "relative"), - ("/wallet", "start with '/api/'"), - ("/api/v1/payments#frag", "fragment"), - ("/api/v1/../admin", "traverse"), - ("/api/v1/%2e%2e/admin", "traverse"), - ("/api//v1/payments", "invalid"), - ]: - with pytest.raises(PermissionError, match=message): - extension_client._extension_api_path(path) - - -def test_wasm_extension_api_target_and_access_validation(): - assert extension_client._target_extension_id(" target_ext ") == "target_ext" - for extension_id in ["", "../admin", "bad.ext"]: - with pytest.raises(PermissionError, match="invalid target"): - extension_client._target_extension_id(extension_id) - - assert extension_client._target_extension_access(["target"], "target") == {"read"} - assert extension_client._target_extension_access( - [{"id": "target", "access": ["read", "write", "ignored"]}], - "target", - ) == {"read", "write"} - - read_request = ExtensionApiRequest( - extension_id="target", - method="GET", - path="/api/v1/demo", - body=None, - ) - write_request = ExtensionApiRequest( - extension_id="target", - method="POST", - path="/api/v1/demo", - body="{}", - ) - extension_client._require_method_access( - "caller", - "target", - {"read"}, - read_request, - ) - with pytest.raises(PermissionError, match="cannot write"): - extension_client._require_method_access( - "caller", - "target", - {"read"}, - write_request, - ) - - -@pytest.mark.anyio -async def test_wasm_extension_api_request_enforces_auth_policy_and_user_enablement( - settings: Settings, - mocker: MockerFixture, -): - settings.host = "127.0.0.1" - settings.port = 5000 - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.get_installed_extension", - mocker.AsyncMock(return_value=SimpleNamespace(active=True)), - ) - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.get_user_active_extensions_ids", - mocker.AsyncMock(return_value=["target"]), - ) - client = _FakeAsyncClient( - _FakeStreamResponse( - status_code=202, - headers={"set-cookie": "secret", "x-result": "ok"}, - chunks=[b'{"accepted":true}'], - ) - ) - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.httpx.AsyncClient", - client.factory, - ) - - response = await extension_client.send_extension_api_request( - "caller", - [{"id": "target", "access": ["write"]}], - "user-id", - "access-token", - ExtensionApiRequest( - extension_id="target", - method="POST", - path="/api/v1/run?value=1", - body="{}", - ), - timeout_ms=750, - max_response_bytes=100, - ) - - assert response.status_code == 202 - assert response.body == '{"accepted":true}' - assert response.headers == {"x-result": "ok"} - assert client.kwargs["follow_redirects"] is False - assert client.kwargs["trust_env"] is False - assert client.kwargs["timeout"] == 0.75 - assert ( - client.stream_kwargs["url"] == "http://127.0.0.1:5000/target/api/v1/run?value=1" - ) - assert client.stream_kwargs["headers"] == {"Authorization": "Bearer access-token"} - - -@pytest.mark.anyio -async def test_wasm_extension_api_request_rejects_missing_auth_and_disabled_targets( - mocker: MockerFixture, -): - request = ExtensionApiRequest( - extension_id="target", - method="GET", - path="/api/v1/run", - body=None, - ) - with pytest.raises(PermissionError, match="authentication"): - await extension_client.send_extension_api_request( - "caller", - ["target"], - None, - "access-token", - request, - ) - with pytest.raises(PermissionError, match="access token"): - await extension_client.send_extension_api_request( - "caller", - ["target"], - "user-id", - None, - request, - ) - - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.get_installed_extension", - mocker.AsyncMock(return_value=SimpleNamespace(active=False)), - ) - with pytest.raises(PermissionError, match="not installed or enabled"): - await extension_client.send_extension_api_request( - "caller", - ["target"], - "user-id", - "access-token", - request, - ) - - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.get_installed_extension", - mocker.AsyncMock(return_value=SimpleNamespace(active=True)), - ) - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.get_user_active_extensions_ids", - mocker.AsyncMock(return_value=[]), - ) - with pytest.raises(PermissionError, match="not active for this user"): - await extension_client.send_extension_api_request( - "caller", - ["target"], - "user-id", - "access-token", - request, - ) - - -@pytest.mark.anyio -async def test_wasm_extension_api_request_rejects_oversized_body_and_response( - mocker: MockerFixture, -): - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.get_installed_extension", - mocker.AsyncMock(return_value=SimpleNamespace(active=True)), - ) - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.get_user_active_extensions_ids", - mocker.AsyncMock(return_value=["target"]), - ) - with pytest.raises(ValueError, match="body is too large"): - await extension_client.send_extension_api_request( - "caller", - [{"id": "target", "access": ["write"]}], - "user-id", - "access-token", - ExtensionApiRequest.construct( - extension_id="target", - method="POST", - path="/api/v1/run", - body="x" * 65_537, - ), - ) - - with pytest.raises(ValueError, match="response is too large"): - await extension_client._read_limited_response( - cast(httpx.Response, _FakeStreamResponse(chunks=[b"12345", b"67890"])), - max_response_bytes=8, - ) - - -@pytest.mark.anyio -async def test_wasm_extension_api_request_hides_transport_errors( - mocker: MockerFixture, -): - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.get_installed_extension", - mocker.AsyncMock(return_value=SimpleNamespace(active=True)), - ) - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.get_user_active_extensions_ids", - mocker.AsyncMock(return_value=["target"]), - ) - client = _FakeAsyncClient(_FakeStreamError()) - mocker.patch( - "lnbits.core.wasm_ext.client.extensions.httpx.AsyncClient", - client.factory, - ) - - with pytest.raises(ValueError, match="Extension API request failed"): - await extension_client.send_extension_api_request( - "caller", - ["target"], - "user-id", - "access-token", - ExtensionApiRequest( - extension_id="target", - method="GET", - path="/api/v1/run", - body=None, - ), - ) - - -class _FakeAsyncClient: - def __init__(self, response): - self.response = response - self.kwargs = {} - self.stream_kwargs = {} - - def factory(self, **kwargs): - self.kwargs = kwargs - return self - - async def __aenter__(self): - return self - - async def __aexit__(self, *_args): - return False - - def stream(self, method, url, **kwargs): - self.stream_kwargs = {"method": method, "url": url, **kwargs} - return self.response - - -class _FakeStreamResponse: - def __init__( - self, - *, - status_code: int = 200, - headers: dict[str, str] | None = None, - chunks: list[bytes] | None = None, - ): - self.status_code = status_code - self.headers = headers or {} - self.encoding = "utf-8" - self._chunks = chunks or [] - - async def __aenter__(self): - return self - - async def __aexit__(self, *_args): - return False - - async def aiter_bytes(self): - for chunk in self._chunks: - yield chunk - - -class _FakeStreamError: - async def __aenter__(self): - raise httpx.RequestError( - "network failed", - request=httpx.Request("GET", "http://127.0.0.1"), - ) - - async def __aexit__(self, *_args): - return False diff --git a/tests/unit/test_wasm_extension_events.py b/tests/unit/test_wasm_extension_events.py deleted file mode 100644 index 08f2354cf..000000000 --- a/tests/unit/test_wasm_extension_events.py +++ /dev/null @@ -1,295 +0,0 @@ -import json -from pathlib import Path -from types import SimpleNamespace - -import pytest -from pytest_mock.plugin import MockerFixture - -from lnbits.core.db import core_app_extra -from lnbits.core.models.extensions import ExtensionPermission -from lnbits.core.wasm_ext.wasm.config import parse_wasm_extension_config -from lnbits.core.wasm_ext.wasm.events import ( - _payment_extension_id, - _payment_source_id, - _wasm_public_invoice_source_tables_from_permissions, - dispatch_wasm_invoice_paid, -) -from lnbits.core.wasm_ext.wasm.loader import WasmExtension -from lnbits.helpers import sha256s - - -def test_wasm_invoice_paid_helpers_extract_extension_and_source_tables(): - payment = SimpleNamespace( - extension="", - extra={"tag": "demoext", "source_id": "row-1"}, - tag="fallback", - ) - permissions = [ - ExtensionPermission( - id="wallet.create_invoice_public", - policies=[ - {"table": "tip_jars", "wallet_field": "wallet_id"}, - {"table": "", "wallet_field": "wallet_id"}, - ], - ), - ExtensionPermission(id="http.request"), - ] - - assert _payment_extension_id(payment) == "demoext" - assert _payment_source_id(payment) == "row-1" - assert _wasm_public_invoice_source_tables_from_permissions(permissions) == [ - "tip_jars" - ] - - -@pytest.mark.anyio -async def test_dispatch_wasm_invoice_paid_invokes_registered_event_export_with_owner( - mocker: MockerFixture, -): - ext_id = "demo_event_ext" - extension = _wasm_extension(ext_id) - registry = core_app_extra.wasm_extension_registry - registry.register(extension) - installed_extension = SimpleNamespace( - permissions=[ - ExtensionPermission( - id="wallet.create_invoice_public", - policies=[{"table": "tip_jars", "wallet_field": "wallet_id"}], - ) - ] - ) - mocker.patch( - "lnbits.core.wasm_ext.wasm.events.get_installed_extension", - mocker.AsyncMock(return_value=installed_extension), - ) - mocker.patch( - "lnbits.core.wasm_ext.wasm.events.get_wallet", - mocker.AsyncMock(return_value=None), - ) - storage_mock = mocker.patch( - "lnbits.core.wasm_ext.wasm.events.storage_get_row_owner_id", - mocker.AsyncMock(return_value="owner-1"), - ) - invoke_mock = mocker.patch( - "lnbits.core.wasm_ext.wasm.events.invoke_wasm_extension_export", - mocker.AsyncMock(), - ) - payment = _payment(ext_id) - - try: - await dispatch_wasm_invoice_paid(payment) - finally: - registry._extensions.pop(ext_id, None) - - storage_mock.assert_awaited_once_with(ext_id, "tip_jars", "row-1") - invoke_mock.assert_awaited_once() - assert invoke_mock.await_args is not None - args = invoke_mock.await_args.args - kwargs = invoke_mock.await_args.kwargs - assert args[0] == ext_id - assert args[1] == "on_invoice_paid" - assert args[2]["paymentHash"] == "payment-hash" - assert args[2]["payment"] == {"id": "payment-row"} - assert kwargs["context"] == "event" - assert kwargs["owner_id"] == "owner-1" - assert kwargs["trigger_type"] == "event" - assert kwargs["event_type"] == "invoice_paid" - assert kwargs["wallet_id"] == "wallet-1" - assert kwargs["payment_hash"] == "payment-hash" - assert kwargs["checking_id"] == "checking-id" - - -@pytest.mark.anyio -async def test_dispatch_wasm_invoice_paid_skips_invalid_event_export_visibility( - mocker: MockerFixture, -): - ext_id = "demo_public_event_ext" - extension = _wasm_extension(ext_id, visibility="public") - registry = core_app_extra.wasm_extension_registry - registry.register(extension) - invoke_mock = mocker.patch( - "lnbits.core.wasm_ext.wasm.events.invoke_wasm_extension_export", - mocker.AsyncMock(), - ) - mocker.patch( - "lnbits.core.wasm_ext.wasm.events.get_wallet", - mocker.AsyncMock(return_value=None), - ) - - try: - await dispatch_wasm_invoice_paid(_payment(ext_id)) - finally: - registry._extensions.pop(ext_id, None) - - invoke_mock.assert_not_awaited() - - -@pytest.mark.anyio -async def test_dispatch_wasm_invoice_paid_invokes_wallet_watch_grant( - mocker: MockerFixture, -): - ext_id = "demo_wallet_watch_ext" - extension = _wasm_extension(ext_id) - registry = core_app_extra.wasm_extension_registry - registry.register(extension) - mocker.patch( - "lnbits.core.wasm_ext.wasm.events.get_wallet", - mocker.AsyncMock(return_value=SimpleNamespace(id="wallet-1", user="user-1")), - ) - mocker.patch( - "lnbits.core.wasm_ext.wasm.events.get_user_extensions", - mocker.AsyncMock( - return_value=[ - SimpleNamespace( - active=True, - extension=ext_id, - permissions={ - "wallet.payments.watch": [ - { - "id": "grant-1", - "wallet_id": "wallet-1", - "enabled": True, - } - ] - }, - ) - ] - ), - ) - mocker.patch( - "lnbits.core.wasm_ext.wasm.events.get_installed_extension", - mocker.AsyncMock( - return_value=SimpleNamespace( - active=True, - permissions=[ExtensionPermission(id="wallet.payments.watch")], - ) - ), - ) - invoke_mock = mocker.patch( - "lnbits.core.wasm_ext.wasm.events.invoke_wasm_extension_export", - mocker.AsyncMock(), - ) - - try: - await dispatch_wasm_invoice_paid(_payment("")) - finally: - registry._extensions.pop(ext_id, None) - - invoke_mock.assert_awaited_once() - assert invoke_mock.await_args is not None - args = invoke_mock.await_args.args - kwargs = invoke_mock.await_args.kwargs - assert args[0] == ext_id - assert args[1] == "on_invoice_paid" - assert args[2]["paymentHash"] == "payment-hash" - assert kwargs["context"] == "event" - assert kwargs["owner_id"] == sha256s("user-1") - - -@pytest.mark.anyio -async def test_dispatch_wasm_invoice_paid_dedupes_tagged_wallet_watch_grant( - mocker: MockerFixture, -): - ext_id = "demo_dedupe_event_ext" - extension = _wasm_extension(ext_id) - registry = core_app_extra.wasm_extension_registry - registry.register(extension) - mocker.patch( - "lnbits.core.wasm_ext.wasm.events.get_wallet", - mocker.AsyncMock(return_value=SimpleNamespace(id="wallet-1", user="user-1")), - ) - mocker.patch( - "lnbits.core.wasm_ext.wasm.events.get_user_extensions", - mocker.AsyncMock( - return_value=[ - SimpleNamespace( - active=True, - extension=ext_id, - permissions={ - "wallet.payments.watch": [ - { - "id": "grant-1", - "wallet_id": "wallet-1", - "enabled": True, - } - ] - }, - ) - ] - ), - ) - mocker.patch( - "lnbits.core.wasm_ext.wasm.events.get_installed_extension", - mocker.AsyncMock( - return_value=SimpleNamespace( - active=True, - permissions=[ExtensionPermission(id="wallet.payments.watch")], - ) - ), - ) - invoke_mock = mocker.patch( - "lnbits.core.wasm_ext.wasm.events.invoke_wasm_extension_export", - mocker.AsyncMock(), - ) - - try: - await dispatch_wasm_invoice_paid(_payment(ext_id, extra={})) - finally: - registry._extensions.pop(ext_id, None) - - invoke_mock.assert_awaited_once() - assert invoke_mock.await_args is not None - assert invoke_mock.await_args.kwargs["owner_id"] == sha256s("user-1") - - -def _wasm_extension(ext_id: str, *, visibility: str = "event") -> WasmExtension: - config = parse_wasm_extension_config( - ext_id, - { - "id": ext_id, - "name": "Demo event extension", - "short_description": "Demo", - "version": "1.0.0", - "extension_type": "wasm", - "wasm": { - "module": "extension.wasm", - "exports": [ - { - "name": "on_invoice_paid", - "visibility": visibility, - } - ], - }, - "events": {"onInvoicePaid": "on_invoice_paid"}, - }, - ) - root_path = Path(__file__).resolve().parent / ext_id - return WasmExtension( - id=ext_id, - name=config.name, - version=config.version, - root_path=root_path, - module_path=root_path / "extension.wasm", - wit_path=None, - world=config.wasm.world, - exports=config.wasm.exports, - config=config, - ) - - -def _payment(ext_id: str, *, extra: dict | None = None) -> SimpleNamespace: - return SimpleNamespace( - extension=ext_id, - extra={"source_id": "row-1"} if extra is None else extra, - tag=None, - wallet_id="wallet-1", - payment_hash="payment-hash", - checking_id="checking-id", - amount=1000, - fee=0, - bolt11="lnbc1", - memo="memo", - pending=False, - status="success", - json=lambda: json.dumps({"id": "payment-row"}), - ) diff --git a/tests/unit/test_wasm_extension_frontend.py b/tests/unit/test_wasm_extension_frontend.py deleted file mode 100644 index 0626089af..000000000 --- a/tests/unit/test_wasm_extension_frontend.py +++ /dev/null @@ -1,144 +0,0 @@ -import json -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[2] - - -def test_wasm_frontend_assets_are_registered_in_component_bundle(): - package_json = json.loads((ROOT / "package.json").read_text(encoding="utf-8")) - components = package_json["bundle"]["components"] - - assert "js/wasm-extension-component.js" in components - assert "js/components/lnbits-extension-permissions.js" in components - assert "js/components/admin/lnbits-admin-wasm-runtime.js" in components - assert "js/components/admin/lnbits-admin-wasm-limit-config.js" in components - - -def test_wasm_extension_routes_keep_global_wallet_dialog_mounted(): - base_template = (ROOT / "lnbits/templates/base.html").read_text(encoding="utf-8") - wallet_dialog_start = base_template.index("", wallet_dialog_start - ) - wallet_dialog = base_template[wallet_dialog_start:wallet_dialog_end] - - assert 'v-if="g.user && !g.isPublicPage"' in wallet_dialog - assert "!$route.path.startsWith('/ext/')" not in wallet_dialog - - -def test_wasm_frontend_bridge_restricts_api_routes_and_realtime_actions(): - bridge = (ROOT / "lnbits/static/js/wasm-extension-component.js").read_text( - encoding="utf-8" - ) - - assert "allowedApiRoute(method, path)" in bridge - assert "url.origin !== window.location.origin" in bridge - assert "Extension API route is not allowed." in bridge - assert "extensionRoute(path)" in bridge - assert "Extension route must stay inside this extension." in bridge - assert "message.action === 'payment.subscribe'" in bridge - assert "message.action === 'payment.unsubscribe'" in bridge - assert "message.action === 'websocket.subscribe'" in bridge - assert "message.action === 'websocket.unsubscribe'" in bridge - assert "message.action === 'websocket.send'" in bridge - assert "sendWebsocket(message)" in bridge - assert "Unknown websocket subscription." not in bridge - assert "if (!subscription) {\n return\n }" in bridge - assert "message.action === 'navigation.replace'" in bridge - assert "message.action === 'navigation.open_new_tab'" in bridge - assert "openNewTab(message)" in bridge - assert "newTabUrl(rawUrl)" in bridge - assert "copyNewTabLink()" in bridge - assert "navigator.clipboard.writeText(prompt.url)" in bridge - assert 'label="Copy Link"' in bridge - assert "window.open(prompt.url, '_blank', 'noopener,noreferrer')" in bridge - assert "Only HTTP and HTTPS links can be opened." in bridge - assert "This link is not on the same domain as this LNbits page." in bridge - assert "message.action === 'storage.session.get'" in bridge - assert "message.action === 'storage.session.set'" in bridge - assert "bridgeSessionStorageKey(rawKey)" in bridge - assert "lnbits.ext.session.${this.bridge.extensionId}.${key}" in bridge - assert "hasBridgePermission('websocket.subscribe')" in bridge - assert "/api/v1/ext/ws/${encodeURIComponent(" in bridge - assert "/api/v1/ws/${encodeURIComponent(paymentHash)}" in bridge - assert "message.action === 'ui.scan_qr'" in bridge - - -def test_wasm_extension_install_ui_requests_permissions_before_install_paths(): - extensions_page = (ROOT / "lnbits/static/js/pages/extensions.js").read_text( - encoding="utf-8" - ) - permissions_template = ( - ROOT / "lnbits/templates/components/lnbits-extension-permissions.vue" - ).read_text(encoding="utf-8") - wasm_bulk_update_skip_message = ( - "Skipping ${ext.id}; this extension update requires permission approval." - ) - - assert "await this.resolveExtensionPermissionGrant(release)" in extensions_page - assert "permissions: grantedPermissions" in extensions_page - assert "release.extension_type === 'wasm'" in extensions_page - assert "this.selectedExtension?.isWasm === true" in extensions_page - assert "saveManagedExtensionPermissions()" in extensions_page - assert ( - "`/api/v1/extension/${this.selectedExtension.id}/permissions`" - in extensions_page - ) - assert "editableAppendPublicLimits" in permissions_template - assert "max_rows_per_source" in permissions_template - assert "editableWebsocketPublishLimits" in permissions_template - assert "max_messages_per_second" in permissions_template - assert wasm_bulk_update_skip_message in extensions_page - - -def test_extension_install_ui_warns_only_for_python_releases(): - extensions_template = (ROOT / "lnbits/templates/pages/extensions.vue").read_text( - encoding="utf-8" - ) - - assert "release.extension_type !== 'wasm'" in extensions_template - assert ( - "'Python extensions have full server access. Trust the source.'" - in extensions_template - ) - assert ' None: - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - ext_dir = settings.wasm_extensions_dir / ext_id - ext_dir.mkdir(parents=True) - (ext_dir / "extension.wasm").write_bytes(b"\0asm") - config = { - "name": "Demo", - "short_description": "Demo extension", - "version": "1.0.0", - "extension_type": "wasm", - "wasm": {"module": "extension.wasm"}, - } - if config_id is not None: - config["id"] = config_id - (ext_dir / "config.json").write_text(json.dumps(config), encoding="utf-8") - - -def _wasm_extension(ext_id: str, root_path: Path) -> WasmExtension: - config = parse_wasm_extension_config(ext_id, _wasm_config(ext_id)) - return WasmExtension( - id=ext_id, - name=ext_id, - version="1.0.0", - root_path=root_path, - module_path=root_path / "extension.wasm", - wit_path=None, - world="", - exports=[], - config=config, - ) - - -def _wasm_config(ext_id: str) -> dict[str, Any]: - return { - "id": ext_id, - "name": ext_id, - "short_description": "Demo extension", - "version": "1.0.0", - "extension_type": "wasm", - "wasm": {"module": "extension.wasm"}, - } diff --git a/tests/unit/test_wasm_extension_permissions.py b/tests/unit/test_wasm_extension_permissions.py deleted file mode 100644 index 2e4c675b3..000000000 --- a/tests/unit/test_wasm_extension_permissions.py +++ /dev/null @@ -1,815 +0,0 @@ -from types import SimpleNamespace -from typing import Any, cast - -import pytest -from pytest_mock.plugin import MockerFixture - -from lnbits.core.models.extensions import ( - ExtensionBackgroundPaymentDestinationPolicy, - ExtensionPermission, -) -from lnbits.core.views.extension_api import ( - WALLET_PAY_INVOICE_BACKGROUND_PERMISSION, - WALLET_PAYMENTS_WATCH_PERMISSION, - _background_destination_policy_covers, - _check_background_payment_permission, - _check_wallet_payments_watch_permission, - _find_background_payment_grant, - _find_wallet_payments_watch_grant, - _remove_user_permission_grant, - _safe_user_extension_permissions, - _user_permission_grant_id_for_wallet, -) -from lnbits.core.wasm_ext.api.permissions import ( - PUBLIC_APPEND_MAX_ROWS_PER_SOURCE_LIMIT, - validate_wasm_extension_permissions, -) -from lnbits.core.wasm_ext.api.websockets import ( - WEBSOCKET_PUBLISH_MAX_MESSAGES_PER_SECOND_LIMIT, -) -from lnbits.core.wasm_ext.wasm.events import _wasm_invoice_paid_owner_id -from lnbits.core.wasm_ext.wasm.invoke import _active_installed_extension -from tests.helpers import make_installable_extension - - -def test_validate_wasm_permissions_rejects_broader_policy_grant(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "http.request", - "policies": [{"host": "https://api.example.com"}], - } - ], - ) - - with pytest.raises(ValueError, match="broader policies"): - validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="http.request", - policies=[ - {"host": "https://api.example.com"}, - {"host": "https://evil.example.com"}, - ], - ) - ], - extension_config, - ) - - -def test_validate_wasm_permissions_stores_narrower_policy_grant(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "ext.storage.read_public", - "description": "Read public storage.", - "policies": [ - { - "table_name": "tip_jars", - "source_id_field": "wallet_id", - "public_fields": ["id", "title", "description"], - } - ], - } - ], - ) - - permissions = validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="ext.storage.read_public", - policies=[ - { - "table_name": "tip_jars", - "source_id_field": "wallet_id", - "public_fields": ["id", "title"], - } - ], - ) - ], - extension_config, - ) - - assert permissions == [ - ExtensionPermission( - id="ext.storage.read_public", - description="Read public storage.", - policies=[ - { - "table_name": "tip_jars", - "source_id_field": "wallet_id", - "public_fields": ["id", "title"], - } - ], - ) - ] - - -def test_validate_wasm_permissions_rejects_public_read_source_field_omission(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "ext.storage.read_public", - "policies": [ - { - "table_name": "messages", - "source_id_field": "conversation_id", - "public_fields": ["id", "body"], - } - ], - } - ], - ) - - with pytest.raises(ValueError, match="broader policies"): - validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="ext.storage.read_public", - policies=[ - { - "table_name": "messages", - "public_fields": ["id", "body"], - } - ], - ) - ], - extension_config, - ) - - -def test_validate_wasm_permissions_allows_narrower_public_append_grant(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "ext.storage.append_public", - "description": "Append public messages.", - "policies": [ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["name", "message"], - "max_rows_per_source": 100, - } - ], - } - ], - ) - - permissions = validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="ext.storage.append_public", - policies=[ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["message"], - "max_rows_per_source": 50, - } - ], - ) - ], - extension_config, - ) - - assert permissions == [ - ExtensionPermission( - id="ext.storage.append_public", - description="Append public messages.", - policies=[ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["message"], - "max_rows_per_source": 50, - } - ], - ) - ] - - -def test_validate_wasm_permissions_rejects_broader_public_append_grant(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "ext.storage.append_public", - "policies": [ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["message"], - "max_rows_per_source": 100, - } - ], - } - ], - ) - - with pytest.raises(ValueError, match="broader policies"): - validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="ext.storage.append_public", - policies=[ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["message", "admin"], - "max_rows_per_source": 101, - } - ], - ) - ], - extension_config, - ) - - -def test_validate_wasm_permissions_admin_can_raise_public_append_row_limit(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "ext.storage.append_public", - "description": "Append public messages.", - "policies": [ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["message"], - "max_rows_per_source": 100, - } - ], - } - ], - ) - - permissions = validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="ext.storage.append_public", - policies=[ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["message"], - "max_rows_per_source": 500, - } - ], - ) - ], - extension_config, - allow_admin_policy_overrides=True, - ) - - assert permissions == [ - ExtensionPermission( - id="ext.storage.append_public", - description="Append public messages.", - policies=[ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["message"], - "max_rows_per_source": 500, - } - ], - ) - ] - - -def test_validate_wasm_permissions_admin_cannot_raise_public_append_fields_or_cap(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "ext.storage.append_public", - "policies": [ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["message"], - "max_rows_per_source": 100, - } - ], - } - ], - ) - - with pytest.raises(ValueError, match="broader policies"): - validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="ext.storage.append_public", - policies=[ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["message", "admin"], - "max_rows_per_source": 500, - } - ], - ) - ], - extension_config, - allow_admin_policy_overrides=True, - ) - - with pytest.raises(ValueError, match="broader policies"): - validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="ext.storage.append_public", - policies=[ - { - "table": "messages", - "source_table": "threads", - "source_id_field": "thread_id", - "allowed_fields": ["message"], - "max_rows_per_source": ( - PUBLIC_APPEND_MAX_ROWS_PER_SOURCE_LIMIT + 1 - ), - } - ], - ) - ], - extension_config, - allow_admin_policy_overrides=True, - ) - - -def test_validate_wasm_permissions_rejects_broader_extension_api_access(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "extension.api.request", - "policies": [{"id": "targetext", "access": ["read"]}], - } - ], - ) - - with pytest.raises(ValueError, match="broader policies"): - validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="extension.api.request", - policies=[{"id": "targetext", "access": ["read", "write"]}], - ) - ], - extension_config, - ) - - -def test_validate_wasm_permissions_allows_empty_grant(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "wallet.create_invoice_public", - "policies": [{"table": "tip_jars", "wallet_field": "wallet_id"}], - } - ], - ) - - assert validate_wasm_extension_permissions(ext_info, [], extension_config) == [] - - -def test_validate_wasm_permissions_rejects_unrequested_permission_grant(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config("demoext", [{"id": "utils.basic"}]) - - with pytest.raises(ValueError, match="unrequested permissions"): - validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission(id="utils.basic"), - ExtensionPermission(id="wallet.list"), - ], - extension_config, - ) - - -def test_validate_wasm_permissions_allows_wallet_payments_watch_permission(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [{"id": "wallet.payments.watch"}], - ) - - assert validate_wasm_extension_permissions( - ext_info, - [ExtensionPermission(id="wallet.payments.watch")], - extension_config, - ) == [ExtensionPermission(id="wallet.payments.watch")] - - -def test_validate_wasm_permissions_allows_websocket_permissions(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "websocket.publish", - "policies": [{"max_messages_per_second": 10}], - }, - {"id": "websocket.subscribe"}, - ], - ) - - assert validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="websocket.publish", - policies=[{"max_messages_per_second": 5}], - ), - ExtensionPermission(id="websocket.subscribe"), - ], - extension_config, - ) == [ - ExtensionPermission( - id="websocket.publish", - policies=[{"max_messages_per_second": 5}], - ), - ExtensionPermission(id="websocket.subscribe"), - ] - - -def test_validate_wasm_permissions_rejects_websocket_publish_without_policy(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [{"id": "websocket.publish"}], - ) - - with pytest.raises(ValueError, match="invalid policies"): - validate_wasm_extension_permissions( - ext_info, - [ExtensionPermission(id="websocket.publish")], - extension_config, - ) - - -def test_validate_wasm_permissions_rejects_broader_websocket_publish_limit(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "websocket.publish", - "policies": [{"max_messages_per_second": 10}], - } - ], - ) - - with pytest.raises(ValueError, match="broader policies"): - validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="websocket.publish", - policies=[{"max_messages_per_second": 11}], - ) - ], - extension_config, - ) - - -def test_validate_wasm_permissions_admin_can_raise_websocket_publish_limit(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "websocket.publish", - "policies": [{"max_messages_per_second": 10}], - } - ], - ) - - assert validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="websocket.publish", - policies=[{"max_messages_per_second": 20}], - ) - ], - extension_config, - allow_admin_policy_overrides=True, - ) == [ - ExtensionPermission( - id="websocket.publish", - policies=[{"max_messages_per_second": 20}], - ) - ] - - -def test_validate_wasm_permissions_rejects_websocket_publish_limit_over_cap(): - ext_info = make_installable_extension("demoext") - extension_config = _wasm_config( - "demoext", - [ - { - "id": "websocket.publish", - "policies": [ - { - "max_messages_per_second": ( - WEBSOCKET_PUBLISH_MAX_MESSAGES_PER_SECOND_LIMIT + 1 - ) - } - ], - } - ], - ) - - with pytest.raises(ValueError, match="invalid policies"): - validate_wasm_extension_permissions( - ext_info, - [ - ExtensionPermission( - id="websocket.publish", - policies=[ - { - "max_messages_per_second": ( - WEBSOCKET_PUBLISH_MAX_MESSAGES_PER_SECOND_LIMIT + 1 - ) - } - ], - ) - ], - extension_config, - allow_admin_policy_overrides=True, - ) - - -def test_background_payment_grant_lookup_and_policy_coverage(): - permissions = { - WALLET_PAY_INVOICE_BACKGROUND_PERMISSION: [ - { - "id": "grant-1", - "wallet_id": "wallet-1", - "enabled": True, - "max_amount": 5000, - "destination_policy": "external_allowed", - } - ] - } - - grant = _find_background_payment_grant(permissions, "wallet-1") - - assert grant - assert grant.max_amount == 5000 - assert _background_destination_policy_covers( - grant.destination_policy, - ExtensionBackgroundPaymentDestinationPolicy.OWN_WALLETS_ONLY, - ) - assert _background_destination_policy_covers( - grant.destination_policy, - ExtensionBackgroundPaymentDestinationPolicy.EXTERNAL_ALLOWED, - ) - assert not _background_destination_policy_covers( - ExtensionBackgroundPaymentDestinationPolicy.OWN_WALLETS_ONLY, - ExtensionBackgroundPaymentDestinationPolicy.EXTERNAL_ALLOWED, - ) - - -def test_wallet_payments_watch_grant_lookup_ignores_disabled_grant(): - permissions = { - WALLET_PAYMENTS_WATCH_PERMISSION: [ - {"id": "grant-1", "wallet_id": "wallet-1", "enabled": False} - ] - } - - grant = _find_wallet_payments_watch_grant(permissions, "wallet-1") - - assert grant - assert grant.enabled is False - - -def test_safe_user_extension_permissions_keeps_only_grants_with_ids(): - permissions = { - WALLET_PAYMENTS_WATCH_PERMISSION: [ - {"id": "grant-1", "wallet_id": "wallet-1", "enabled": True}, - {"wallet_id": "wallet-2", "enabled": True}, - "broken", - ], - "broken": "not-a-list", - } - - safe_permissions = _safe_user_extension_permissions(permissions) - - assert safe_permissions == { - WALLET_PAYMENTS_WATCH_PERMISSION: [ - {"id": "grant-1", "wallet_id": "wallet-1", "enabled": True} - ] - } - - -def test_user_permission_grant_id_for_wallet_returns_existing_grant_id(): - permissions = { - WALLET_PAY_INVOICE_BACKGROUND_PERMISSION: [ - {"id": "grant-1", "wallet_id": "wallet-1", "enabled": True} - ] - } - - grant_id = _user_permission_grant_id_for_wallet( - permissions, WALLET_PAY_INVOICE_BACKGROUND_PERMISSION, "wallet-1" - ) - - assert grant_id == "grant-1" - - -def test_remove_user_permission_grant_removes_only_matching_grant_id(): - permissions = { - WALLET_PAY_INVOICE_BACKGROUND_PERMISSION: [ - {"id": "grant-1", "wallet_id": "wallet-1", "enabled": True}, - {"id": "grant-2", "wallet_id": "wallet-2", "enabled": True}, - ], - WALLET_PAYMENTS_WATCH_PERMISSION: [{"id": "grant-3", "wallet_id": "wallet-1"}], - } - - updated_permissions = _remove_user_permission_grant(permissions, "grant-1") - - assert updated_permissions == { - WALLET_PAY_INVOICE_BACKGROUND_PERMISSION: [ - {"id": "grant-2", "wallet_id": "wallet-2", "enabled": True} - ], - WALLET_PAYMENTS_WATCH_PERMISSION: [{"id": "grant-3", "wallet_id": "wallet-1"}], - } - - -def test_remove_user_permission_grant_drops_empty_permission(): - permissions = { - WALLET_PAYMENTS_WATCH_PERMISSION: [{"id": "grant-1", "wallet_id": "wallet-1"}] - } - - updated_permissions = _remove_user_permission_grant(permissions, "grant-1") - - assert updated_permissions == {} - - -@pytest.mark.anyio -async def test_background_payment_check_reports_approved_grant( - mocker: MockerFixture, -): - permissions = { - WALLET_PAY_INVOICE_BACKGROUND_PERMISSION: [ - { - "id": "grant-1", - "wallet_id": "wallet-1", - "enabled": True, - "max_amount": 5000, - "destination_policy": "external_allowed", - } - ] - } - mocker.patch( - "lnbits.core.views.extension_api.get_wallet", - mocker.AsyncMock( - return_value=SimpleNamespace( - user="user-1", - is_lightning_shared_wallet=False, - can_send_payments=True, - ) - ), - ) - - result = await _check_background_payment_permission( - "user-1", - permissions, - { - "wallet_id": "wallet-1", - "max_amount": 1000, - "destination_policy": "own_wallets_only", - }, - ) - - assert result.id == WALLET_PAY_INVOICE_BACKGROUND_PERMISSION - assert result.approved is True - assert result.grant["id"] == "grant-1" - assert result.grant["max_amount"] == 5000 - - -@pytest.mark.anyio -async def test_wallet_payment_watch_check_returns_requested_unapproved_grant( - mocker: MockerFixture, -): - mocker.patch( - "lnbits.core.views.extension_api.get_wallet", - mocker.AsyncMock(return_value=SimpleNamespace(user="user-1")), - ) - - result = await _check_wallet_payments_watch_permission( - "user-1", - {}, - {"wallet_id": "wallet-1"}, - ) - - assert result.id == WALLET_PAYMENTS_WATCH_PERMISSION - assert result.approved is False - assert result.grant["wallet_id"] == "wallet-1" - assert result.grant["enabled"] is True - assert isinstance(result.grant["id"], str) - - -@pytest.mark.anyio -async def test_invoice_paid_owner_lookup_uses_stored_granted_policies( - mocker: MockerFixture, -): - extension = SimpleNamespace( - id="demoext", - config=_wasm_config( - "demoext", - [ - { - "id": "wallet.create_invoice_public", - "policies": [ - {"table": "requested_table", "wallet_field": "wallet_id"} - ], - } - ], - ), - ) - payment = SimpleNamespace(extra={"source_id": "source-1"}) - installed_extension = SimpleNamespace( - permissions=[ - ExtensionPermission( - id="wallet.create_invoice_public", - policies=[{"table": "granted_table", "wallet_field": "wallet_id"}], - ) - ] - ) - mocker.patch( - "lnbits.core.wasm_ext.wasm.events.get_installed_extension", - mocker.AsyncMock(return_value=installed_extension), - ) - storage_mock = mocker.patch( - "lnbits.core.wasm_ext.wasm.events.storage_get_row_owner_id", - mocker.AsyncMock(return_value="owner-1"), - ) - - owner_id = await _wasm_invoice_paid_owner_id(extension, payment) - - assert owner_id == "owner-1" - storage_mock.assert_awaited_once_with("demoext", "granted_table", "source-1") - - -@pytest.mark.anyio -async def test_wasm_invocation_requires_installed_active_extension( - mocker: MockerFixture, -): - extension = SimpleNamespace(id="demoext") - mocker.patch( - "lnbits.core.wasm_ext.wasm.invoke.get_installed_extension", - mocker.AsyncMock(return_value=None), - ) - - with pytest.raises(PermissionError, match="deactivated"): - await _active_installed_extension(cast(Any, extension)) - - -def _wasm_config(ext_id: str, permissions: list[dict]) -> dict: - return { - "id": ext_id, - "name": ext_id, - "short_description": "Demo extension", - "version": "1.0.0", - "extension_type": "wasm", - "wasm": {"module": "extension.wasm"}, - "permissions": permissions, - } diff --git a/tests/unit/test_wasm_extension_routes.py b/tests/unit/test_wasm_extension_routes.py deleted file mode 100644 index 9b0cf39ca..000000000 --- a/tests/unit/test_wasm_extension_routes.py +++ /dev/null @@ -1,697 +0,0 @@ -from __future__ import annotations - -import json -from collections.abc import AsyncIterator -from pathlib import Path -from typing import cast - -import pytest -from fastapi import FastAPI, HTTPException, Request - -from lnbits.core.wasm_ext.routes.api import ( - WasmRequestBodyTooLargeError, - WasmRoutePayload, - _read_api_payload, - _read_json_object_with_size, - _wasm_extension_api_export, - _wasm_route_owner_id, - register_wasm_extension_api_routes, - unregister_wasm_extension_api_routes, -) -from lnbits.core.wasm_ext.routes.assets import ( - WASM_EXTENSION_STATIC_MIME_TYPES, - _reject_html_like_wasm_static_asset, - _wasm_extension_core_asset_response, -) -from lnbits.core.wasm_ext.routes.register import _format_wasm_extension_size -from lnbits.core.wasm_ext.routes.security import ( - consume_wasm_extension_frame_token, - wasm_extension_frame_csp, - wasm_extension_frame_url, -) -from lnbits.core.wasm_ext.routes.ui import ( - _match_wasm_extension_ui_route, - _wasm_extension_bridge_api_routes, - _wasm_extension_entrypoint, - register_wasm_extension_ui_routes, -) -from lnbits.core.wasm_ext.wasm.config import parse_wasm_extension_config -from lnbits.core.wasm_ext.wasm.loader import WasmExtension - - -@pytest.mark.parametrize( - ("size_bytes", "formatted_size"), - [ - (128_235, "128.24 KB"), - (1_000_000, "1.00 MB"), - (12_823_598, "12.82 MB"), - ], -) -def test_format_wasm_extension_size(size_bytes: int, formatted_size: str): - assert _format_wasm_extension_size(size_bytes) == formatted_size - - -@pytest.mark.anyio -async def test_wasm_json_reader_rejects_large_content_length_without_reading(): - request = _FakeRequest([b"{}"], content_length="11") - - with pytest.raises(WasmRequestBodyTooLargeError, match="11 bytes"): - await _read_json_object_with_size(cast(Request, request), max_body_bytes=10) - - assert request.stream_started is False - - -@pytest.mark.anyio -async def test_wasm_json_reader_rejects_large_stream_without_content_length(): - request = _FakeRequest([b'{"value":"', b"x" * 20, b'"}']) - - with pytest.raises(WasmRequestBodyTooLargeError): - await _read_json_object_with_size(cast(Request, request), max_body_bytes=16) - - assert request.stream_started is True - - -@pytest.mark.anyio -async def test_wasm_api_payload_records_actual_body_bytes(): - body = b'{"amount":21}' - request = _FakeRequest( - [body], - path_params={"invoice_id": "abc"}, - query_params={"include_paid": "true"}, - ) - - payload = await _read_api_payload( - cast(Request, request), - {"invoice_id": "invoiceId"}, - max_body_bytes=100, - ) - - assert payload.data == { - "invoiceId": "abc", - "includePaid": "true", - "amount": 21, - } - assert payload.request_bytes == len(body) - - -def test_wasm_api_export_visibility_is_enforced(tmp_path: Path): - extension = _wasm_extension(tmp_path) - - assert _wasm_extension_api_export(extension, "render") == "render" - assert _wasm_extension_api_export(extension, "private_render") == "private_render" - with pytest.raises(PermissionError, match="not callable over HTTP"): - _wasm_extension_api_export(extension, "on_invoice_paid") - with pytest.raises(KeyError, match="has no export"): - _wasm_extension_api_export(extension, "missing") - - -def test_wasm_ui_entrypoint_rejects_escape_static_and_non_html(tmp_path: Path): - extension = _wasm_extension(tmp_path) - (tmp_path / "index.html").write_text("", encoding="utf-8") - (tmp_path / "index.txt").write_text("text", encoding="utf-8") - (tmp_path / "static").mkdir() - (tmp_path / "static" / "index.html").write_text("", encoding="utf-8") - - assert ( - _wasm_extension_entrypoint(extension, "index.html") - == (tmp_path / "index.html").resolve() - ) - with pytest.raises(ValueError, match="escapes extension root"): - _wasm_extension_entrypoint(extension, "../outside.html") - with pytest.raises(ValueError, match="must not be inside the static"): - _wasm_extension_entrypoint(extension, "static/index.html") - with pytest.raises(ValueError, match="must be an HTML file"): - _wasm_extension_entrypoint(extension, "index.txt") - - -def test_wasm_frame_token_is_one_time_and_user_bound(tmp_path: Path): - extension = _wasm_extension(tmp_path) - frame_path = "/ext-frame/demoext/0" - frame_url = wasm_extension_frame_url(extension, frame_path, "user-1") - token = frame_url.split("frame_token=", 1)[1] - - with pytest.raises(HTTPException) as wrong_user: - consume_wasm_extension_frame_token( - _request_with_query(token), - extension, - frame_path, - "user-2", - ) - assert wrong_user.value.status_code == 404 - - consume_wasm_extension_frame_token( - _request_with_query(token), - extension, - frame_path, - "user-1", - ) - with pytest.raises(HTTPException) as reused: - consume_wasm_extension_frame_token( - _request_with_query(token), - extension, - frame_path, - "user-1", - ) - assert reused.value.status_code == 404 - - -def test_wasm_frame_csp_is_locked_to_extension_assets(tmp_path: Path): - csp = wasm_extension_frame_csp( - _request_with_query("token"), - _wasm_extension(tmp_path), - ) - - assert "sandbox allow-scripts" in csp - assert "default-src 'none'" in csp - assert "connect-src 'none'" in csp - assert "frame-ancestors 'self'" in csp - assert "http://testserver/ext-assets/demoext/" in csp - - -def test_wasm_ui_route_matching_and_bridge_public_api_filtering(tmp_path: Path): - extension = _wasm_extension(tmp_path) - - matched = _match_wasm_extension_ui_route(extension, "/ext/demo/abc") - public_routes = _wasm_extension_bridge_api_routes(extension, public=True) - private_routes = _wasm_extension_bridge_api_routes(extension, public=False) - - assert matched["auth"] == "user" - assert matched["route_params"] == {"item_id": "abc"} - assert public_routes == [ - { - "method": "GET", - "path": "/api/v1/ext/demoext/public/{item_id}", - "pattern": "^/api/v1/ext/demoext/public/[^/]+$", - } - ] - assert {route["path"] for route in private_routes} == { - "/api/v1/ext/demoext/public/{item_id}", - "/api/v1/ext/demoext/private/{item_id}", - } - - -def test_wasm_api_routes_are_included_in_openapi(tmp_path: Path): - app = FastAPI() - app.openapi_schema = {"stale": True} - - register_wasm_extension_api_routes(app, _wasm_extension(tmp_path)) - - assert app.openapi_schema is None - schema = app.openapi() - assert "/api/v1/ext/demoext/public/{item_id}" in schema["paths"] - assert "/api/v1/ext/demoext/private/{item_id}" in schema["paths"] - assert schema["paths"]["/api/v1/ext/demoext/public/{item_id}"]["get"]["tags"] == [ - "Demo" - ] - assert schema["paths"]["/api/v1/ext/demoext/private/{item_id}"]["post"]["tags"] == [ - "Demo" - ] - - -def test_wasm_api_routes_load_openapi_operation_fragment(tmp_path: Path): - app = FastAPI() - openapi_dir = tmp_path / "wasm" - openapi_dir.mkdir() - (openapi_dir / "openapi.json").write_text( - json.dumps( - { - "schemas": { - "DemoItem": { - "type": "object", - "required": ["id", "name"], - "properties": { - "id": {"type": "string"}, - "name": {"type": "string"}, - }, - } - }, - "routes": { - "list_demo_items": { - "summary": "List demo items", - "description": "Returns demo items.", - "operationId": "demoext_list_demo_items", - "tags": ["Ignored"], - "responses": { - "200": { - "description": "Demo item list", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/schemas/DemoItem" - }, - } - }, - } - } - }, - } - }, - } - }, - } - ), - encoding="utf-8", - ) - - register_wasm_extension_api_routes( - app, - _wasm_extension( - tmp_path, - openapi="wasm/openapi.json", - extra_exports=[{"name": "list-demo-items", "visibility": "public"}], - api_routes=[ - { - "method": "GET", - "path": "/public/{item_id}", - "export": "list-demo-items", - "auth": "public", - } - ], - ), - ) - - operation = app.openapi()["paths"]["/api/v1/ext/demoext/public/{item_id}"]["get"] - item_schema = operation["responses"]["200"]["content"]["application/json"][ - "schema" - ]["properties"]["items"]["items"] - assert operation["summary"] == "List demo items" - assert operation["description"] == "Returns demo items." - assert operation["operationId"] == "demoext_list_demo_items" - assert operation["tags"] == ["Demo"] - assert item_schema["properties"]["name"] == {"type": "string"} - - -def test_wasm_api_routes_allow_route_openapi_fragment_override(tmp_path: Path): - app = FastAPI() - openapi_dir = tmp_path / "wasm" - openapi_dir.mkdir() - (openapi_dir / "openapi.json").write_text( - json.dumps( - { - "routes": { - "render": { - "summary": "Default render docs", - "operationId": "demoext_render", - }, - "custom-render": { - "summary": "Custom render docs", - "operationId": "demoext_custom_render", - }, - } - } - ), - encoding="utf-8", - ) - - register_wasm_extension_api_routes( - app, - _wasm_extension( - tmp_path, - openapi="wasm/openapi.json", - api_routes=[ - { - "method": "GET", - "path": "/public/{item_id}", - "export": "render", - "auth": "public", - "openapi": "#/routes/custom-render", - } - ], - ), - ) - - operation = app.openapi()["paths"]["/api/v1/ext/demoext/public/{item_id}"]["get"] - assert operation["summary"] == "Custom render docs" - assert operation["operationId"] == "demoext_custom_render" - - -def test_wasm_api_routes_add_success_response_example_for_redoc(tmp_path: Path): - app = FastAPI() - openapi_dir = tmp_path / "wasm" - openapi_dir.mkdir() - (openapi_dir / "openapi.json").write_text( - json.dumps( - { - "schemas": { - "DemoItem": { - "type": "object", - "properties": { - "id": {"type": "string"}, - "count": {"type": "integer"}, - }, - }, - "DemoResponse": { - "type": "object", - "required": ["ok", "data"], - "properties": { - "ok": {"type": "boolean", "enum": [True]}, - "data": { - "type": "object", - "properties": { - "items": { - "type": "array", - "items": {"$ref": "#/schemas/DemoItem"}, - } - }, - }, - }, - }, - "ErrorResponse": { - "type": "object", - "required": ["ok", "error"], - "properties": { - "ok": {"type": "boolean", "enum": [False]}, - "error": {"type": "string"}, - }, - }, - }, - "routes": { - "render": { - "summary": "Render", - "responses": { - "200": { - "description": "Success or extension-level error.", - "content": { - "application/json": { - "schema": { - "oneOf": [ - {"$ref": "#/schemas/DemoResponse"}, - {"$ref": "#/schemas/ErrorResponse"}, - ] - } - } - }, - } - }, - } - }, - } - ), - encoding="utf-8", - ) - - register_wasm_extension_api_routes( - app, - _wasm_extension( - tmp_path, - openapi="wasm/openapi.json", - api_routes=[ - { - "method": "GET", - "path": "/public/{item_id}", - "export": "render", - "auth": "public", - } - ], - ), - ) - - json_content = app.openapi()["paths"]["/api/v1/ext/demoext/public/{item_id}"][ - "get" - ]["responses"]["200"]["content"]["application/json"] - assert json_content["example"] == { - "ok": True, - "data": {"items": [{"id": "string", "count": 0}]}, - } - - -def test_wasm_api_routes_ignore_missing_openapi_fragment(tmp_path: Path): - app = FastAPI() - - register_wasm_extension_api_routes( - app, - _wasm_extension( - tmp_path, - api_routes=[ - { - "method": "GET", - "path": "/public/{item_id}", - "export": "render", - "auth": "public", - "openapi": "wasm/missing.json#/routes/list_demo_items", - } - ], - ), - ) - - operation = app.openapi()["paths"]["/api/v1/ext/demoext/public/{item_id}"]["get"] - assert operation["summary"] == "GET /public/{item_id}" - assert operation["operationId"] == "demoext_get_public_item_id" - - -def test_wasm_api_routes_replace_same_extension_routes_on_upgrade(tmp_path: Path): - app = FastAPI() - route_path = "/api/v1/ext/demoext/public/{item_id}" - - async def legacy_handler() -> dict[str, bool]: - return {"legacy": True} - - app.add_api_route( - route_path, - legacy_handler, - methods=["GET"], - name=f"demoext:GET:{route_path}", - include_in_schema=False, - ) - app.openapi_schema = {"stale": True} - - register_wasm_extension_api_routes(app, _wasm_extension(tmp_path)) - - routes = _matching_routes(app, route_path, "GET") - assert len(routes) == 1 - assert routes[0].endpoint != legacy_handler - assert routes[0].include_in_schema is True - assert app.openapi_schema is None - assert route_path in app.openapi()["paths"] - - -def test_wasm_api_routes_remove_obsolete_routes_on_upgrade(tmp_path: Path): - app = FastAPI() - route_path = "/api/v1/ext/demoext/removed" - - async def removed_handler() -> dict[str, bool]: - return {"removed": True} - - app.add_api_route( - route_path, - removed_handler, - methods=["GET"], - name=f"demoext:GET:{route_path}", - ) - app.openapi_schema = {"stale": True} - - register_wasm_extension_api_routes(app, _wasm_extension(tmp_path)) - - assert _matching_routes(app, route_path, "GET") == [] - assert app.openapi_schema is None - assert route_path not in app.openapi()["paths"] - - -def test_wasm_api_route_cleanup_preserves_ui_frame_config_route(tmp_path: Path): - app = FastAPI() - (tmp_path / "index.html").write_text("", encoding="utf-8") - extension = _wasm_extension(tmp_path) - frame_config_path = "/api/v1/ext/demoext/_ui/frame" - api_route_path = "/api/v1/ext/demoext/public/{item_id}" - - register_wasm_extension_ui_routes(app, extension) - assert _matching_routes(app, frame_config_path, "POST") != [] - - register_wasm_extension_api_routes(app, extension) - - assert _matching_routes(app, frame_config_path, "POST") != [] - assert _matching_routes(app, api_route_path, "GET") != [] - - assert unregister_wasm_extension_api_routes(app, "demoext") is True - assert _matching_routes(app, api_route_path, "GET") == [] - assert _matching_routes(app, frame_config_path, "POST") != [] - - -def test_wasm_api_routes_are_removed_from_openapi_on_uninstall(tmp_path: Path): - app = FastAPI() - route_path = "/api/v1/ext/demoext/public/{item_id}" - - register_wasm_extension_api_routes(app, _wasm_extension(tmp_path)) - assert route_path in app.openapi()["paths"] - - assert unregister_wasm_extension_api_routes(app, "demoext") is True - - assert app.openapi_schema is None - assert _matching_routes(app, route_path, "GET") == [] - assert route_path not in app.openapi()["paths"] - - -@pytest.mark.anyio -async def test_wasm_api_route_owner_context_uses_configured_storage_row( - tmp_path: Path, mocker -): - extension = _wasm_extension(tmp_path) - route_config = parse_wasm_extension_config( - "demoext", - { - "id": "demoext", - "name": "Demo", - "short_description": "Demo extension", - "version": "1.0.0", - "extension_type": "wasm", - "wasm": { - "module": "extension.wasm", - "exports": [{"name": "finish", "visibility": "public"}], - }, - "api_routes": [ - { - "method": "POST", - "path": "/games/{game_id}/finish", - "export": "finish", - "auth": "public", - "path_params": {"game_id": "gameId"}, - "ownerContext": {"table": "games", "idParam": "gameId"}, - } - ], - }, - ).api_routes[0] - owner_lookup = mocker.patch( - "lnbits.core.wasm_ext.routes.api.storage_get_row_owner_id", - mocker.AsyncMock(return_value="owner-1"), - ) - - owner_id = await _wasm_route_owner_id( - extension, - route_config, - WasmRoutePayload({"gameId": "game-1"}, request_bytes=10), - ) - - assert owner_id == "owner-1" - owner_lookup.assert_awaited_once_with("demoext", "games", "game-1") - - -def test_wasm_static_core_assets_and_html_like_text_assets_are_guarded(tmp_path: Path): - response = _wasm_extension_core_asset_response("_lnbits/material-icons.css") - assert response.headers["X-Content-Type-Options"] == "nosniff" - assert response.headers["Cache-Control"] == "no-store" - assert WASM_EXTENSION_STATIC_MIME_TYPES[".ogg"] == "audio/ogg" - - for path in ["_lnbits/../bundle.min.css", "_lnbits/missing.css"]: - with pytest.raises(HTTPException) as exc_info: - _wasm_extension_core_asset_response(path) - assert exc_info.value.status_code == 404 - - script_path = tmp_path / "app.js" - script_path.write_text("", encoding="utf-8") - with pytest.raises(HTTPException) as html_like: - _reject_html_like_wasm_static_asset(script_path) - assert html_like.value.status_code == 404 - - -class _FakeRequest: - method = "POST" - - def __init__( - self, - chunks: list[bytes], - *, - content_length: str | None = None, - path_params: dict[str, str] | None = None, - query_params: dict[str, str] | None = None, - ) -> None: - self._chunks = chunks - self.headers: dict[str, str] = {} - if content_length is not None: - self.headers["content-length"] = content_length - self.path_params = path_params or {} - self.query_params = query_params or {} - self.stream_started = False - - async def stream(self) -> AsyncIterator[bytes]: - self.stream_started = True - for chunk in self._chunks: - yield chunk - - -def _wasm_extension( - root_path: Path, - *, - api_routes: list[dict] | None = None, - openapi: str | None = None, - extra_exports: list[dict] | None = None, -) -> WasmExtension: - extension_config = { - "id": "demoext", - "name": "Demo", - "short_description": "Demo extension", - "version": "1.0.0", - "extension_type": "wasm", - "wasm": { - "module": "extension.wasm", - "exports": [ - {"name": "render", "visibility": "public"}, - {"name": "private_render", "visibility": "authenticated"}, - {"name": "on_invoice_paid", "visibility": "event"}, - *(extra_exports or []), - ], - }, - "ui_routes": [ - { - "path": "/demo/{item_id}", - "entrypoint": "index.html", - "auth": "user", - } - ], - "api_routes": api_routes - or [ - { - "method": "GET", - "path": "/public/{item_id}", - "export": "render", - "auth": "public", - }, - { - "method": "POST", - "path": "/private/{item_id}", - "export": "private_render", - "auth": "user", - }, - ], - } - if openapi: - extension_config["openapi"] = openapi - config = parse_wasm_extension_config("demoext", extension_config) - return WasmExtension( - id="demoext", - name="Demo", - version="1.0.0", - root_path=root_path, - module_path=root_path / "extension.wasm", - wit_path=None, - world="", - exports=config.wasm.exports, - config=config, - ) - - -def _request_with_query(token: str) -> Request: - return Request( - { - "type": "http", - "method": "GET", - "scheme": "http", - "server": ("testserver", 80), - "path": "/ext-frame/demoext/0", - "query_string": f"frame_token={token}".encode(), - "headers": [], - } - ) - - -def _matching_routes(app: FastAPI, route_path: str, method: str) -> list: - return [ - route - for route in app.router.routes - if getattr(route, "path", None) == route_path - and method in (getattr(route, "methods", set()) or set()) - ] diff --git a/tests/unit/test_wasm_extension_storage.py b/tests/unit/test_wasm_extension_storage.py deleted file mode 100644 index 572c33149..000000000 --- a/tests/unit/test_wasm_extension_storage.py +++ /dev/null @@ -1,490 +0,0 @@ -import json -from datetime import datetime, timedelta, timezone -from pathlib import Path -from types import SimpleNamespace -from typing import Any, cast -from uuid import uuid4 - -import pytest -from pytest_mock.plugin import MockerFixture - -from lnbits.core.crud import extensions as extension_crud -from lnbits.core.crud import update_migration_version -from lnbits.core.db import db as core_db -from lnbits.core.migrations import ( - m010_create_installed_extensions_table, - m046_add_permissions_to_installed_extensions, - m047_create_wasm_invocations_table, - m048_add_wasm_runtime_limits_to_installed_extensions, -) -from lnbits.core.models.extensions import ExtensionPermission, WasmInvocation -from lnbits.core.wasm_ext.storage import crud as storage_crud -from lnbits.core.wasm_ext.storage.crud import ( - OWNER_ID_FIELD, - migrate_wasm_extension_database, - storage_append_public_row, - storage_count_rows, - storage_delete_row, - storage_get_paginated_rows, - storage_get_public_row, - storage_get_row, - storage_set_row, -) -from lnbits.db import DB_TYPE, SQLITE, Compat, Connection, Database -from lnbits.settings import Settings -from tests.helpers import make_installable_extension - - -@pytest.mark.anyio -async def test_core_wasm_migrations_create_persistent_columns( - tmp_path: Path, settings: Settings -): - if DB_TYPE != SQLITE: - pytest.skip("temporary core databases are SQLite-only") - - db = _temporary_database(tmp_path, settings, "wasm_core_migrations") - - async with db.connect() as conn: - await m010_create_installed_extensions_table(conn) - await m046_add_permissions_to_installed_extensions(conn) - await m047_create_wasm_invocations_table(conn) - await m048_add_wasm_runtime_limits_to_installed_extensions(conn) - - installed_columns = { - row["name"] - for row in await conn.fetchall("PRAGMA table_info(installed_extensions)") - } - invocation_columns = { - row["name"] - for row in await conn.fetchall("PRAGMA table_info(wasm_invocations)") - } - - assert {"permissions", "wasm_runtime_limits"}.issubset(installed_columns) - assert { - "extension_id", - "status", - "request_bytes", - "response_bytes", - "host_call_count", - "http_call_count", - "storage_call_count", - "wallet_call_count", - "context", - }.issubset(invocation_columns) - - -@pytest.mark.anyio -async def test_installed_extension_permissions_and_wasm_limits_round_trip( - app, - tmp_path: Path, - settings: Settings, - mocker: MockerFixture, -): - db = await _temporary_core_crud_database(tmp_path, settings) - mocker.patch.object(extension_crud, "db", db) - - ext_id = f"wasmlimits_{uuid4().hex[:8]}" - extension = make_installable_extension(ext_id) - extension.permissions = [ExtensionPermission(id="utils.basic")] - extension.wasm_runtime_limits = {"wasm_runtime_max_execution_ms": 1234} - - await extension_crud.create_installed_extension(extension) - stored = await extension_crud.get_installed_extension(ext_id) - - assert stored is not None - assert stored.permissions == [ExtensionPermission(id="utils.basic")] - assert stored.wasm_runtime_limits == {"wasm_runtime_max_execution_ms": 1234} - - stored.wasm_runtime_limits = {"wasm_runtime_max_fuel": 0} - await extension_crud.update_installed_extension(stored) - updated = await extension_crud.get_installed_extension(ext_id) - - assert updated is not None - assert updated.wasm_runtime_limits == {"wasm_runtime_max_fuel": 0} - - -@pytest.mark.anyio -async def test_wasm_invocation_crud_stats_and_cleanup_are_isolated( - app, - tmp_path: Path, - settings: Settings, - mocker: MockerFixture, -): - db = await _temporary_core_crud_database(tmp_path, settings) - mocker.patch.object(extension_crud, "db", db) - - now = datetime.now(timezone.utc) - old = now - timedelta(days=10) - ext_id = f"wasminv_{uuid4().hex[:8]}" - other_ext_id = f"wasminv_{uuid4().hex[:8]}" - invocations = [ - WasmInvocation( - id=f"inv_{uuid4().hex}", - extension_id=ext_id, - export_name="render", - status="completed", - started_at=old, - finished_at=old + timedelta(milliseconds=20), - duration_ms=20, - host_call_count=2, - http_call_count=1, - ), - WasmInvocation( - id=f"inv_{uuid4().hex}", - extension_id=ext_id, - export_name="render", - status="failed", - started_at=now, - finished_at=now, - duration_ms=40, - host_call_count=3, - storage_call_count=2, - ), - WasmInvocation( - id=f"inv_{uuid4().hex}", - extension_id=ext_id, - export_name="render", - status="running", - started_at=old, - ), - WasmInvocation( - id=f"inv_{uuid4().hex}", - extension_id=other_ext_id, - export_name="render", - status="completed", - started_at=now, - duration_ms=100, - ), - ] - for invocation in invocations: - await extension_crud.create_wasm_invocation(invocation) - - failed = await extension_crud.get_wasm_invocations( - extension_id=ext_id, - status="failed", - ) - stats = await extension_crud.get_wasm_invocation_stats( - extension_id=ext_id, - since=now - timedelta(days=30), - ) - deleted = await extension_crud.delete_old_wasm_invocations(retention_days=7) - remaining_running = await extension_crud.get_wasm_invocations( - extension_id=ext_id, - status="running", - ) - - assert [invocation.id for invocation in failed] == [invocations[1].id] - assert stats.total == 3 - assert stats.completed == 1 - assert stats.failed == 1 - assert stats.running == 1 - assert stats.host_call_count == 5 - assert stats.http_call_count == 1 - assert stats.storage_call_count == 2 - assert deleted == 1 - assert [invocation.id for invocation in remaining_running] == [invocations[2].id] - - -@pytest.mark.anyio -async def test_wasm_datetime_queries_use_postgres_placeholders( - mocker: MockerFixture, -): - db = mocker.Mock() - db.timestamp_placeholder.side_effect = lambda key: f"to_timestamp(:{key})" - db.fetchone = mocker.AsyncMock(return_value=None) - db.execute = mocker.AsyncMock(return_value=SimpleNamespace(rowcount=0)) - - field = {"name": "created_at", "type": "datetime"} - assert ( - storage_crud._value_placeholder(cast(Compat, db), field, "created_at") - == "to_timestamp(:created_at)" - ) - where_sql, _ = storage_crud._where_sql( - cast(Compat, db), {"fields": [field]}, {"created_at": 0}, None, [] - ) - assert "created_at = to_timestamp(:filter_created_at)" in where_sql - - conn = cast(Connection, db) - await extension_crud.get_wasm_invocation_stats( - since=datetime.now(timezone.utc), conn=conn - ) - await extension_crud.delete_old_wasm_invocations(1, conn=conn) - await extension_crud.mark_stale_wasm_invocations(conn=conn) - - queries = [ - db.fetchone.call_args.args[0], - *[c.args[0] for c in db.execute.call_args_list], - ] - assert all("to_timestamp(:" in query for query in queries) - - -@pytest.mark.anyio -async def test_wasm_storage_migration_and_owner_scoped_crud( - tmp_path: Path, - settings: Settings, -): - ext_id = f"wasmstore_{uuid4().hex[:8]}" - original_extensions_path = settings.lnbits_extensions_path - original_wasm_extensions_path = settings.lnbits_wasm_extensions_path - original_data_folder = settings.lnbits_data_folder - try: - settings.lnbits_data_folder = str(tmp_path / "data") - settings.lnbits_extensions_path = str(tmp_path / "code") - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - Path(settings.lnbits_data_folder).mkdir(parents=True) - ext_dir = _write_storage_extension(settings, ext_id) - - await migrate_wasm_extension_database(make_installable_extension(ext_id)) - await storage_set_row( - ext_id, - "notes", - { - "id": "note-1", - "title": "First", - "count": 1, - "published": True, - "tags": ["alpha", "beta"], - "created_at": 1_700_000_000, - }, - "owner-1", - ) - await storage_set_row( - ext_id, - "notes", - { - "id": "note-1", - "title": "Other owner attempt", - "count": 2, - "published": False, - "tags": ["gamma"], - "created_at": 1_700_000_001, - }, - "owner-2", - ) - - owner_row = await storage_get_row(ext_id, "notes", "note-1", "owner-1") - other_owner_row = await storage_get_row(ext_id, "notes", "note-1", "owner-2") - public_row = await storage_get_public_row(ext_id, "notes", "note-1") - page = await storage_get_paginated_rows( - ext_id, - "notes", - {"published": True}, - owner_id="owner-1", - search="fir", - search_fields=["title"], - sort_by="count", - descending=True, - limit=50, - offset=0, - ) - await storage_delete_row(ext_id, "notes", "note-1", "owner-2") - still_owned = await storage_get_row(ext_id, "notes", "note-1", "owner-1") - await storage_delete_row(ext_id, "notes", "note-1", "owner-1") - deleted = await storage_get_row(ext_id, "notes", "note-1", "owner-1") - finally: - settings.lnbits_extensions_path = original_extensions_path - settings.lnbits_wasm_extensions_path = original_wasm_extensions_path - settings.lnbits_data_folder = original_data_folder - - assert ext_dir.is_dir() - assert owner_row is not None - assert owner_row["title"] == "First" - assert owner_row["tags"] == ["alpha", "beta"] - assert owner_row["created_at"] == 1_700_000_000 - assert other_owner_row is None - assert public_row is not None - assert public_row["title"] == "First" - assert page["total"] == 1 - assert page["data"][0]["id"] == "note-1" - assert still_owned is not None - assert deleted is None - - -@pytest.mark.anyio -async def test_wasm_storage_public_append_generates_id_and_counts_by_owner( - tmp_path: Path, - settings: Settings, -): - ext_id = f"wasmstore_{uuid4().hex[:8]}" - original_extensions_path = settings.lnbits_extensions_path - original_wasm_extensions_path = settings.lnbits_wasm_extensions_path - original_data_folder = settings.lnbits_data_folder - try: - settings.lnbits_data_folder = str(tmp_path / "data") - settings.lnbits_extensions_path = str(tmp_path / "code") - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - Path(settings.lnbits_data_folder).mkdir(parents=True) - _write_storage_extension(settings, ext_id) - - await migrate_wasm_extension_database(make_installable_extension(ext_id)) - await storage_set_row( - ext_id, - "threads", - {"id": "thread-1", "title": "Support"}, - "owner-1", - ) - message_id = await storage_append_public_row( - ext_id, - "messages", - {"thread_id": "thread-1", "message": "Hello"}, - "owner-1", - ) - owner_count = await storage_count_rows( - ext_id, - "messages", - {"thread_id": "thread-1"}, - owner_id="owner-1", - ) - other_owner_count = await storage_count_rows( - ext_id, - "messages", - {"thread_id": "thread-1"}, - owner_id="owner-2", - ) - message = await storage_get_row(ext_id, "messages", message_id, "owner-1") - finally: - settings.lnbits_extensions_path = original_extensions_path - settings.lnbits_wasm_extensions_path = original_wasm_extensions_path - settings.lnbits_data_folder = original_data_folder - - assert message_id - assert owner_count == 1 - assert other_owner_count == 0 - assert message is not None - assert message["id"] == message_id - assert message["thread_id"] == "thread-1" - assert message["message"] == "Hello" - - -@pytest.mark.anyio -async def test_wasm_storage_rejects_reserved_fields_and_invalid_identifiers( - tmp_path: Path, - settings: Settings, -): - ext_id = f"wasmstore_{uuid4().hex[:8]}" - original_extensions_path = settings.lnbits_extensions_path - original_wasm_extensions_path = settings.lnbits_wasm_extensions_path - original_data_folder = settings.lnbits_data_folder - try: - settings.lnbits_data_folder = str(tmp_path / "data") - settings.lnbits_extensions_path = str(tmp_path / "code") - settings.lnbits_wasm_extensions_path = str(tmp_path / "wasm_extensions") - Path(settings.lnbits_data_folder).mkdir(parents=True) - _write_storage_extension(settings, ext_id) - - with pytest.raises(ValueError, match="Invalid WASM storage SQL identifier"): - await storage_get_row(ext_id, "notes;DROP", "note-1", "owner-1") - - with pytest.raises(ValueError, match="reserved owner field"): - await storage_set_row( - ext_id, - "notes", - {"id": "note-1", OWNER_ID_FIELD: "owner-2"}, - "owner-1", - ) - - schema_path = settings.wasm_extensions_dir / ext_id / "storage" / "schema.json" - schema = json.loads(schema_path.read_text(encoding="utf-8")) - schema["tables"]["notes"]["fields"].append( - {"name": OWNER_ID_FIELD, "type": "string"} - ) - schema_path.write_text(json.dumps(schema), encoding="utf-8") - - with pytest.raises(ValueError, match="reserved field"): - await storage_get_row(ext_id, "notes", "note-1", "owner-1") - finally: - settings.lnbits_extensions_path = original_extensions_path - settings.lnbits_wasm_extensions_path = original_wasm_extensions_path - settings.lnbits_data_folder = original_data_folder - - -def _temporary_database( - tmp_path: Path, - settings: Settings, - name: str, -) -> Database: - settings.lnbits_data_folder = str(tmp_path / "data") - Path(settings.lnbits_data_folder).mkdir(parents=True, exist_ok=True) - return Database(name) - - -async def _temporary_core_crud_database( - tmp_path: Path, - settings: Settings, -) -> Database: - if DB_TYPE != SQLITE: - return core_db - - db = _temporary_database(tmp_path, settings, f"core_{uuid4().hex[:8]}") - async with db.connect() as conn: - await conn.execute(""" - CREATE TABLE dbversions ( - db TEXT PRIMARY KEY, - version INT NOT NULL - ) - """) - await update_migration_version(conn, "core", 48) - await m010_create_installed_extensions_table(conn) - await m046_add_permissions_to_installed_extensions(conn) - await m047_create_wasm_invocations_table(conn) - await m048_add_wasm_runtime_limits_to_installed_extensions(conn) - return db - - -def _write_storage_extension(settings: Settings, ext_id: str) -> Path: - ext_dir = settings.wasm_extensions_dir / ext_id - storage_dir = ext_dir / "storage" - migrations_dir = storage_dir / "migrations" - migrations_dir.mkdir(parents=True) - schema: dict[str, Any] = { - "tables": { - "notes": { - "fields": [ - {"name": "id", "type": "string"}, - {"name": "title", "type": "string"}, - {"name": "count", "type": "integer", "default": 0}, - {"name": "published", "type": "boolean", "default": False}, - {"name": "tags", "type": "string", "list": True}, - {"name": "created_at", "type": "datetime"}, - ] - }, - "threads": { - "fields": [ - {"name": "id", "type": "string"}, - {"name": "title", "type": "string"}, - ] - }, - "messages": { - "fields": [ - {"name": "id", "type": "string"}, - {"name": "thread_id", "type": "string"}, - {"name": "message", "type": "string"}, - ] - }, - } - } - migration = { - "operations": [ - { - "op": "create_table", - "table": "notes", - "fields": schema["tables"]["notes"]["fields"], - }, - { - "op": "create_table", - "table": "threads", - "fields": schema["tables"]["threads"]["fields"], - }, - { - "op": "create_table", - "table": "messages", - "fields": schema["tables"]["messages"]["fields"], - }, - ] - } - (storage_dir / "schema.json").write_text(json.dumps(schema), encoding="utf-8") - (migrations_dir / "001_init.json").write_text( - json.dumps(migration), - encoding="utf-8", - ) - return ext_dir diff --git a/tests/unit/test_wasm_extension_websocket_api.py b/tests/unit/test_wasm_extension_websocket_api.py deleted file mode 100644 index 781762265..000000000 --- a/tests/unit/test_wasm_extension_websocket_api.py +++ /dev/null @@ -1,50 +0,0 @@ -from types import SimpleNamespace -from unittest.mock import AsyncMock - -import pytest - -from lnbits.core.models.extensions import ExtensionPermission -from lnbits.core.views.websocket_api import extension_websocket_connect - - -@pytest.mark.anyio -async def test_wasm_extension_websocket_delegates_installed_wasm_subscription(mocker): - websocket = AsyncMock() - conn = SimpleNamespace() - installed_ext = SimpleNamespace( - active=True, - is_wasm=True, - permissions=[ExtensionPermission(id="websocket.subscribe")], - ) - mocker.patch( - "lnbits.core.views.websocket_api.get_installed_extension", - AsyncMock(return_value=installed_ext), - ) - connect = mocker.patch( - "lnbits.core.views.websocket_api.wasm_extension_websocket_hub.connect", - AsyncMock(return_value=conn), - ) - listen = mocker.patch( - "lnbits.core.views.websocket_api.wasm_extension_websocket_hub.listen", - AsyncMock(), - ) - - await extension_websocket_connect(websocket, "demoext", "room-1") - - websocket.close.assert_not_awaited() - connect.assert_awaited_once_with("demoext", "room-1", websocket) - listen.assert_awaited_once_with(conn) - - -@pytest.mark.anyio -async def test_wasm_extension_websocket_rejects_missing_subscribe_permission(mocker): - websocket = AsyncMock() - installed_ext = SimpleNamespace(active=True, is_wasm=True, permissions=[]) - mocker.patch( - "lnbits.core.views.websocket_api.get_installed_extension", - AsyncMock(return_value=installed_ext), - ) - - await extension_websocket_connect(websocket, "demoext", "room-1") - - websocket.close.assert_awaited_once() diff --git a/tests/unit/test_wasm_extension_websockets.py b/tests/unit/test_wasm_extension_websockets.py deleted file mode 100644 index 94449839a..000000000 --- a/tests/unit/test_wasm_extension_websockets.py +++ /dev/null @@ -1,131 +0,0 @@ -from typing import cast - -import pytest -from fastapi import WebSocket, WebSocketDisconnect - -from lnbits.core.wasm_ext.api.websockets import ( - WasmExtensionWebsocketHub, - WasmExtensionWebsocketRateLimitError, -) - - -class FakeWebSocket: - def __init__( - self, - received: list[str] | None = None, - send_error: Exception | None = None, - ): - self.accepted = False - self.sent: list[str] = [] - self.closed: int | None = None - self.received = list(received or []) - self.send_error = send_error - - async def accept(self): - self.accepted = True - - async def send_text(self, data: str): - if self.send_error: - raise self.send_error - self.sent.append(data) - - async def receive_text(self): - if self.received: - return self.received.pop(0) - raise WebSocketDisconnect() - - async def close(self, code: int = 1000): - self.closed = code - - -@pytest.mark.anyio -async def test_wasm_extension_websocket_hub_publishes_to_matching_channel(): - hub = WasmExtensionWebsocketHub() - matching = FakeWebSocket() - other_item = FakeWebSocket() - other_extension = FakeWebSocket() - - await hub.connect("demoext", "room-1", cast(WebSocket, matching)) - await hub.connect("demoext", "room-2", cast(WebSocket, other_item)) - await hub.connect("otherext", "room-1", cast(WebSocket, other_extension)) - - await hub.publish( - "demoext", - "room-1", - '{"message":"Hello"}', - max_messages_per_second=10, - ) - - assert matching.accepted is True - assert matching.sent == ['{"message":"Hello"}'] - assert other_item.sent == [] - assert other_extension.sent == [] - - -@pytest.mark.anyio -async def test_wasm_extension_websocket_hub_prunes_stale_publish_connections(): - hub = WasmExtensionWebsocketHub() - stale = FakeWebSocket(send_error=RuntimeError("websocket closed")) - active = FakeWebSocket() - - await hub.connect("demoext", "room-1", cast(WebSocket, stale)) - await hub.connect("demoext", "room-1", cast(WebSocket, active)) - - await hub.publish( - "demoext", - "room-1", - '{"message":"Hello"}', - max_messages_per_second=10, - ) - - assert active.sent == ['{"message":"Hello"}'] - assert hub.get_connections("demoext", "room-1")[0].websocket == active - - -@pytest.mark.anyio -async def test_wasm_extension_websocket_hub_rate_limits_per_channel(): - hub = WasmExtensionWebsocketHub() - websocket = FakeWebSocket() - other_websocket = FakeWebSocket() - - await hub.connect("demoext", "room-1", cast(WebSocket, websocket)) - await hub.connect("demoext", "room-2", cast(WebSocket, other_websocket)) - - await hub.publish( - "demoext", - "room-1", - '{"message":1}', - max_messages_per_second=1, - ) - with pytest.raises(WasmExtensionWebsocketRateLimitError): - await hub.publish( - "demoext", - "room-1", - '{"message":2}', - max_messages_per_second=1, - ) - - await hub.publish( - "demoext", - "room-2", - '{"message":3}', - max_messages_per_second=1, - ) - - assert websocket.sent == ['{"message":1}'] - assert other_websocket.sent == ['{"message":3}'] - - -@pytest.mark.anyio -async def test_wasm_extension_websocket_hub_rebroadcasts_client_messages_to_peers(): - hub = WasmExtensionWebsocketHub() - sender = FakeWebSocket(received=['{"type":"input","paddle":0.5}']) - peer = FakeWebSocket() - - conn = await hub.connect("demoext", "game-1", cast(WebSocket, sender)) - await hub.connect("demoext", "game-1", cast(WebSocket, peer)) - - await hub.listen(conn) - - assert sender.sent == [] - assert peer.sent == ['{"type":"input","paddle":0.5}'] diff --git a/tests/wallets/fixtures/json/fixtures_rest.json b/tests/wallets/fixtures/json/fixtures_rest.json index 54a1e0f43..3206b0e5b 100644 --- a/tests/wallets/fixtures/json/fixtures_rest.json +++ b/tests/wallets/fixtures/json/fixtures_rest.json @@ -38,9 +38,7 @@ "wallet_class": "LNbitsWallet", "settings": { "lnbits_endpoint": "http://127.0.0.1:8555", - "lnbits_key": null, "lnbits_admin_key": "f171ba022a764e679eef950b21fb1c04", - "lnbits_invoice_key": null, "user_agent": "LNbits/Tests" } }, @@ -1833,26 +1831,6 @@ "fee_msat": null, "preimage": null }, - "expect_by_funding_source": { - "alby": { - "error_message": "Not Found", - "success": false, - "pending": false, - "failed": true, - "checking_id": null, - "fee_msat": null, - "preimage": null - }, - "eclair": { - "error_message": "Unable to connect to http://127.0.0.1:8555.", - "success": false, - "pending": false, - "failed": true, - "checking_id": null, - "fee_msat": null, - "preimage": null - } - }, "mocks": { "corelightningrest": { "pay_invoice_endpoint": [ @@ -2095,7 +2073,7 @@ { "response_type": "json", "response": { - "state": "SETTLED" + "settled": true } } ] @@ -2177,15 +2155,8 @@ ] }, "lndrest": { - "get_invoice_status_endpoint": [ - { - "description": "error status", - "response_type": "json", - "response": { - "state": "CANCELED" - } - } - ] + "description": "lndrest.py doesn't handle the 'failed' status for `get_invoice_status`", + "get_invoice_status_endpoint": [] }, "alby": { "description": "alby.py doesn't handle the 'failed' status for `get_invoice_status`", @@ -2272,6 +2243,13 @@ "response_type": "json", "response": {} }, + { + "description": "error status", + "response_type": "json", + "response": { + "seetled": false + } + }, { "description": "bad json", "response_type": "data", diff --git a/tests/wallets/fixtures/models.py b/tests/wallets/fixtures/models.py index 023a2bb3c..7f5ecf5b1 100644 --- a/tests/wallets/fixtures/models.py +++ b/tests/wallets/fixtures/models.py @@ -46,7 +46,6 @@ class FunctionTest(BaseModel): description: str call_params: dict expect: dict - expect_by_funding_source: dict[str, dict] = {} mocks: dict[str, list[dict[str, TestMock]]] @@ -77,20 +76,11 @@ class WalletTest(BaseModel): fn, test, ) -> list["WalletTest"]: - test_data = { - key: value - for key, value in test.items() - if key != "expect_by_funding_source" - } - expect_by_funding_source = test.get("expect_by_funding_source", {}) - if fs.name in expect_by_funding_source: - test_data["expect"] = expect_by_funding_source[fs.name] - t = WalletTest( **{ "funding_source": fs, "function": fn_name, - **test_data, + **test, "mocks": [], "skip": fs.skip, } diff --git a/tests/wallets/test_bark.py b/tests/wallets/test_bark.py deleted file mode 100644 index 38a2d4f4c..000000000 --- a/tests/wallets/test_bark.py +++ /dev/null @@ -1,301 +0,0 @@ -import asyncio -import json - -import httpx -import pytest -from bolt11 import decode as bolt11_decode - -from lnbits.wallets.bark import BarkWallet -from lnbits.wallets.base import PaymentResponse - -BOLT11 = ( - "lnbc1u1pjl0uhypp5yxvdqq923atm9ywkpgtu3yxv9w2n44ensrkwfyagvmzqhml2x9gq" - "dpv2phhwetjv4jzqcneypqyc6t8dp6xu6twva2xjuzzda6qcqzzsxqrrsssp5h3qlnnlfq" - "ekquacwwj9yu7fhujyzxhzqegpxenscw45pgv6xakfq9qyyssqqjruygw0jrcg3365jksxn" - "6yhsxx7c5pdjrjdlyvuhs7xh8r409h4e3kucc54kgh34pscaq3mg7hn55l8a0qszgzex80" - "amwrp4gkdgqcpkse88y" -) - - -class FakeWebSocket: - def __init__(self, messages: list[dict]): - self.messages = messages - - async def recv(self): - return json.dumps(self.messages.pop(0)) - - -class FakeConnection: - def __init__(self, websocket: FakeWebSocket): - self.websocket = websocket - - async def __aenter__(self): - return self.websocket - - async def __aexit__(self, *_): - return None - - -@pytest.fixture -def bark_wallet(settings): - settings.bark_api_endpoint = "http://localhost:3000" - settings.bark_api_token = "test-token" - return BarkWallet() - - -def payment_response(status_code: int, **kwargs) -> httpx.Response: - request = httpx.Request("POST", "http://localhost:3000/api/v1/lightning/pay") - return httpx.Response(status_code, request=request, **kwargs) - - -@pytest.mark.anyio -async def test_paid_invoices_stream_yields_successful_receive( - bark_wallet: BarkWallet, mocker -): - checking_id = bolt11_decode(BOLT11).payment_hash - notification = { - "type": "movement-updated", - "movement": { - "status": "successful", - "received_on": [ - { - "destination": {"type": "invoice", "value": BOLT11}, - "amount_sat": 100, - } - ], - }, - } - websocket = FakeWebSocket([notification]) - connect = mocker.patch( - "lnbits.wallets.bark.connect", return_value=FakeConnection(websocket) - ) - request = mocker.patch.object( - bark_wallet, - "_request_json", - side_effect=[ - "websocket-ticket", - {"state": "preimage-revealed", "payment_preimage": "preimage"}, - ], - ) - - stream = bark_wallet.paid_invoices_stream() - try: - assert await anext(stream) == checking_id - status = await bark_wallet.get_invoice_status(checking_id) - assert status.success - assert status.preimage == "preimage" - finally: - await stream.aclose() - await bark_wallet.cleanup() - - assert request.await_args_list == [ - mocker.call("GET", "/api/v1/notifications/ws/ticket", timeout=10), - mocker.call("GET", f"/api/v1/lightning/receives/{checking_id}"), - ] - connect.assert_called_once_with( - "ws://localhost:3000/api/v1/notifications/ws?ticket=websocket-ticket" - ) - - -def test_incoming_payment_hash_ignores_non_receive_movements(bark_wallet: BarkWallet): - notification = { - "type": "movement-updated", - "movement": { - "status": "successful", - "received_on": [], - "sent_to": [{"destination": {"type": "invoice", "value": BOLT11}}], - }, - } - - assert bark_wallet._incoming_payment_hash(notification) is None - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("data", "expected_paid"), - [ - ( - { - "state": "settled", - "settled_at": "2026-07-16T12:00:00Z", - "payment_preimage": "preimage", - }, - True, - ), - ( - { - "finished_at": "2026-07-16T12:00:00Z", - "preimage_revealed_at": "2026-07-16T12:00:00Z", - "payment_preimage": "preimage", - }, - True, - ), - ({"state": "awaiting-payment"}, None), - ({"finished_at": "2026-07-16T12:00:00Z"}, False), - ], - ids=["settled", "legacy-settled", "pending", "failed"], -) -async def test_get_invoice_status_maps_receive_state( - bark_wallet: BarkWallet, mocker, data: dict, expected_paid: bool | None -): - checking_id = bolt11_decode(BOLT11).payment_hash - request = mocker.patch.object(bark_wallet, "_request_json", return_value=data) - - status = await bark_wallet.get_invoice_status(checking_id) - - assert status.paid is expected_paid - assert status.preimage == ("preimage" if expected_paid else None) - request.assert_awaited_once_with("GET", f"/api/v1/lightning/receives/{checking_id}") - - -@pytest.mark.anyio -@pytest.mark.parametrize("ok", [True, None], ids=["settled", "pending"]) -async def test_send_payment_checks_status_after_payment_is_initiated( - bark_wallet: BarkWallet, mocker, settings, ok: bool | None -): - settings.lnbits_funding_source_pay_invoice_wait_seconds = 0 - checking_id = bolt11_decode(BOLT11).payment_hash - expected = PaymentResponse(ok=ok, checking_id=checking_id) - mocker.patch.object( - bark_wallet.client, - "post", - return_value=payment_response( - 200, json={"message": "Payment initiated successfully"} - ), - ) - get_status = mocker.patch.object( - bark_wallet, "_payment_response_from_status", return_value=expected - ) - - response = await bark_wallet._send_payment(BOLT11, checking_id) - - assert response == expected - assert bark_wallet.pending_payments[checking_id] == BOLT11 - get_status.assert_awaited_once_with(checking_id) - - -@pytest.mark.anyio -async def test_send_payment_waits_for_successful_movement_notification( - bark_wallet: BarkWallet, mocker, settings -): - settings.lnbits_funding_source_pay_invoice_wait_seconds = 5 - checking_id = bolt11_decode(BOLT11).payment_hash - mocker.patch.object( - bark_wallet.client, - "post", - return_value=payment_response( - 200, json={"message": "Payment initiated successfully"} - ), - ) - mocker.patch.object( - bark_wallet, - "_payment_response_from_status", - return_value=PaymentResponse(ok=None, checking_id=checking_id), - ) - - payment_task = asyncio.create_task(bark_wallet._send_payment(BOLT11, checking_id)) - await asyncio.sleep(0) - bark_wallet._notify_outgoing_payment( - { - "type": "movement-updated", - "movement": { - "status": "successful", - "offchain_fee_sat": 2, - "metadata": {"payment_preimage": "preimage"}, - "sent_to": [ - { - "destination": {"type": "invoice", "value": BOLT11}, - "amount_sat": 100, - } - ], - }, - } - ) - - response = await payment_task - - assert response.ok is True - assert response.checking_id == checking_id - assert response.fee_msat == 2000 - assert response.preimage == "preimage" - assert checking_id not in bark_wallet.outgoing_payment_waiters - - -@pytest.mark.anyio -@pytest.mark.parametrize( - "error", - [ - httpx.TimeoutException("timeout"), - httpx.ReadError("connection lost"), - ], - ids=["timeout", "read-error"], -) -async def test_send_payment_keeps_transport_errors_pending( - bark_wallet: BarkWallet, mocker, error: httpx.RequestError -): - checking_id = bolt11_decode(BOLT11).payment_hash - mocker.patch.object(bark_wallet.client, "post", side_effect=error) - - response = await bark_wallet._send_payment(BOLT11, checking_id) - - assert response.pending - assert response.checking_id == checking_id - assert bark_wallet.pending_payments[checking_id] == BOLT11 - - -@pytest.mark.anyio -@pytest.mark.parametrize( - ("status_code", "expected_ok"), - [ - (400, None), - (401, False), - (403, False), - (404, False), - (405, False), - (408, None), - (409, None), - (422, None), - (429, None), - (500, None), - ], -) -async def test_send_payment_maps_http_errors( - bark_wallet: BarkWallet, - mocker, - status_code: int, - expected_ok: bool | None, -): - checking_id = bolt11_decode(BOLT11).payment_hash - mocker.patch.object( - bark_wallet.client, - "post", - return_value=payment_response(status_code, json={"message": "payment error"}), - ) - - response = await bark_wallet._send_payment(BOLT11, checking_id) - - assert response.ok is expected_ok - assert response.checking_id == checking_id - assert (checking_id in bark_wallet.pending_payments) is (expected_ok is None) - - -@pytest.mark.anyio -@pytest.mark.parametrize( - "response", - [ - payment_response(200, content=b"not json"), - payment_response(200, json={"unexpected": "response"}), - ], - ids=["invalid-json", "missing-message"], -) -async def test_send_payment_keeps_invalid_responses_pending( - bark_wallet: BarkWallet, mocker, response: httpx.Response -): - checking_id = bolt11_decode(BOLT11).payment_hash - mocker.patch.object(bark_wallet.client, "post", return_value=response) - - payment = await bark_wallet._send_payment(BOLT11, checking_id) - - assert payment.pending - assert payment.checking_id == checking_id - assert bark_wallet.pending_payments[checking_id] == BOLT11 diff --git a/tests/wallets/test_blink.py b/tests/wallets/test_blink.py index f9ba016e5..8a6ae65ba 100644 --- a/tests/wallets/test_blink.py +++ b/tests/wallets/test_blink.py @@ -1,13 +1,11 @@ import os from typing import cast -from unittest.mock import AsyncMock import pytest from loguru import logger from lnbits.settings import settings from lnbits.wallets import BlinkWallet, get_funding_source, set_funding_source -from lnbits.wallets.base import PaymentStatus settings.lnbits_backend_wallet_class = "BlinkWallet" settings.blink_token = "mock" @@ -149,153 +147,3 @@ async def test_get_payment_status(payhash): logger.info(f"test_get_payment_status: payment_status: {payment_status.paid}") else: assert True, "BLINK_TOKEN is not set. Skipping test using mock api" - - -# Reproducible bolt11 invoices (fixed timestamp, long expiry) used to test the -# fee probing logic in pay_invoice without hitting the live Blink API. -# amount invoice: 1000 sat (1_000_000 msat) -AMOUNT_BOLT11 = ( - "lnbc10u1pj48ugqpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqsp5" - "zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygsdq8w3jhxaqxq8zals8squ" - "qsakyemlpj9guae3a9havssjcjewgr24hedxkq6t978jk99srrxx9azy6k0cs66a757cfdc43" - "vkfhmlexyzdqtytzzteh2n4qngapgpesavte" -) -# zero-amount (amountless) invoice -ZERO_BOLT11 = ( - "lnbc1pj48ugqpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqsp5zyg" - "3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygsdq8w3jhxaqxq8zals8sq3c00" - "hc6end9u8pafqge29y690e2x0kztq0l9z4dfd2yg8au9xuwxz9a2hy2hn2jqzq2mpy43tx9td" - "wxcy6yuc9ghuqkzj3kruh4tpcgp7n84qu" -) - - -def _make_blink_wallet_with_mock(graphql_side_effect): - """Build a BlinkWallet with a mocked GraphQL layer for pay_invoice tests.""" - settings.blink_api_endpoint = "https://api.blink.sv/graphql" - settings.blink_ws_endpoint = "wss://ws.blink.sv/graphql" - settings.blink_token = settings.blink_token or "mock" - wallet = BlinkWallet() - wallet._wallet_id = "mock_wallet_id" - wallet._graphql_query = graphql_side_effect # type: ignore[method-assign] - wallet.get_payment_status = AsyncMock( # type: ignore[method-assign] - return_value=PaymentStatus(paid=True, fee_msat=1000, preimage="preimage") - ) - return wallet - - -@pytest.mark.anyio -async def test_pay_invoice_amount_invoice_probes_and_sends(): - """Amount invoices are probed via lnInvoiceFeeProbe then sent.""" - calls = {"probe": 0, "send": 0} - - async def graphql(payload): - query = payload["query"] - if "lnInvoiceFeeProbe" in query: - calls["probe"] += 1 - return {"data": {"lnInvoiceFeeProbe": {"amount": 1, "errors": []}}} - if "lnNoAmountInvoiceFeeProbe" in query: - raise AssertionError("must not probe amount invoice as no-amount") - if "lnInvoicePaymentSend" in query: - calls["send"] += 1 - return { - "data": {"lnInvoicePaymentSend": {"status": "SUCCESS", "errors": []}} - } - return {"data": {}} - - wallet = _make_blink_wallet_with_mock(graphql) - response = await wallet.pay_invoice(AMOUNT_BOLT11, fee_limit_msat=5000) - - assert calls["probe"] == 1 - assert calls["send"] == 1 - assert response.ok is True - assert response.fee_msat == 1000 - - -@pytest.mark.anyio -async def test_pay_invoice_rejects_when_probed_fee_exceeds_limit(): - """A probed fee above the fee limit rejects the payment before sending.""" - calls = {"send": 0} - - async def graphql(payload): - query = payload["query"] - if "lnInvoiceFeeProbe" in query: - # 1 sat = 1000 msat, above the 500 msat limit below - return {"data": {"lnInvoiceFeeProbe": {"amount": 1, "errors": []}}} - if "lnInvoicePaymentSend" in query: - calls["send"] += 1 - return { - "data": {"lnInvoicePaymentSend": {"status": "SUCCESS", "errors": []}} - } - return {"data": {}} - - wallet = _make_blink_wallet_with_mock(graphql) - response = await wallet.pay_invoice(AMOUNT_BOLT11, fee_limit_msat=500) - - assert calls["send"] == 0 - assert response.ok is False - assert response.error_message is not None - assert "exceeds" in response.error_message - - -@pytest.mark.parametrize( - ("probe_response", "expected_error"), - [ - ({"errors": [{"message": "probe unavailable"}]}, "probe unavailable"), - ( - {"data": {"lnInvoiceFeeProbe": {"errors": []}}}, - "missing fee probe amount", - ), - ], -) -@pytest.mark.anyio -async def test_pay_invoice_strict_probe_failure_rejects_without_sending( - probe_response, expected_error -): - """Strict mode rejects malformed probe responses before sending.""" - settings.blink_send_without_probe = False - calls = {"send": 0} - - async def graphql(payload): - query = payload["query"] - if "lnInvoiceFeeProbe" in query: - return probe_response - if "lnInvoicePaymentSend" in query: - calls["send"] += 1 - return { - "data": {"lnInvoicePaymentSend": {"status": "SUCCESS", "errors": []}} - } - return {"data": {}} - - wallet = _make_blink_wallet_with_mock(graphql) - response = await wallet.pay_invoice(AMOUNT_BOLT11, fee_limit_msat=5000) - - assert calls["send"] == 0 - assert response.ok is False - assert response.error_message is not None - assert expected_error in response.error_message - - -@pytest.mark.anyio -async def test_pay_invoice_zero_amount_skips_probe_and_sends(): - """Zero-amount invoices cannot be probed and fall back to sending.""" - settings.blink_send_without_probe = True - calls = {"probe": 0, "send": 0} - - async def graphql(payload): - query = payload["query"] - if "FeeProbe" in query: - calls["probe"] += 1 - raise AssertionError("zero-amount invoices must not be probed") - if "lnInvoicePaymentSend" in query: - calls["send"] += 1 - return { - "data": {"lnInvoicePaymentSend": {"status": "SUCCESS", "errors": []}} - } - return {"data": {}} - - wallet = _make_blink_wallet_with_mock(graphql) - response = await wallet.pay_invoice(ZERO_BOLT11, fee_limit_msat=5000) - - assert calls["probe"] == 0 - assert calls["send"] == 1 - assert response.ok is True diff --git a/tests/wallets/test_nwc_wallets.py b/tests/wallets/test_nwc_wallets.py index 35fc36bba..cf4f3dc15 100644 --- a/tests/wallets/test_nwc_wallets.py +++ b/tests/wallets/test_nwc_wallets.py @@ -1,4 +1,3 @@ -import asyncio import base64 import hashlib import json @@ -13,7 +12,7 @@ from Cryptodome.Util.Padding import pad, unpad from websockets import ServerConnection from websockets import serve as ws_serve -from lnbits.wallets.nwc import NWCConnection, NWCWallet +from lnbits.wallets.nwc import NWCWallet from tests.wallets.helpers import ( WalletTest, build_test_id, @@ -100,8 +99,6 @@ async def handle( # noqa: C901 event, ) await websocket.send(json.dumps(["EVENT", sub_id, event])) - elif 23195 in kinds: - assert sub_filter["authors"] == [mock_settings["service_public_key"]] elif msg[0] == "EVENT": event = msg[1] decrypted_content = decrypt_content( @@ -180,129 +177,6 @@ async def run(data: WalletTest): await nwcwallet.cleanup() -@pytest.mark.anyio -async def test_nwc_rejects_event_from_unexpected_pubkey(mocker): - async def _noop(*args, **kwargs): - return None - - mocker.patch("lnbits.wallets.nwc.NWCConnection._connect_to_relay", new=_noop) - mocker.patch("lnbits.wallets.nwc.NWCConnection._handle_timeouts", new=_noop) - - service_private_key = PrivateKey() - service_public_key = service_private_key.public_key.format().hex()[2:] - attacker_private_key = PrivateKey() - attacker_public_key = attacker_private_key.public_key.format().hex()[2:] - account_private_key = PrivateKey() - - conn = NWCConnection( - service_public_key, - account_private_key.secret.hex(), - "ws://127.0.0.1:8555", - ) - try: - event = { - "kind": 23195, - "content": "{}", - "created_at": int(time.time()), - "tags": [["e", "request-event-id"]], - } - sign_event(attacker_public_key, attacker_private_key.secret.hex(), event) - - with pytest.raises(Exception, match="Invalid event signature"): - await conn._on_event_message(["EVENT", "subid", event]) - finally: - await conn.close() - - -@pytest.mark.anyio -async def test_nwc_marks_pending_invoice_settled_only_once(): - wallet = NWCWallet.__new__(NWCWallet) - wallet.pending_invoice_details = {"checking-id": {"checking_id": "checking-id"}} - wallet.pending_invoices = ["checking-id"] - wallet.paid_invoices_queue = asyncio.Queue(0) - - wallet._mark_invoice_settled("checking-id", source="notification") - wallet._mark_invoice_settled("checking-id", source="notification") - - assert wallet.paid_invoices_queue.qsize() == 1 - assert await wallet.paid_invoices_queue.get() == "checking-id" - - -@pytest.mark.anyio -async def test_nwc_registers_notification_subscriptions(mocker): - async def _noop(*args, **kwargs): - return None - - mocker.patch("lnbits.wallets.nwc.NWCConnection._connect_to_relay", new=_noop) - mocker.patch("lnbits.wallets.nwc.NWCConnection._handle_timeouts", new=_noop) - - service_private_key = PrivateKey() - service_public_key = service_private_key.public_key.format().hex()[2:] - account_private_key = PrivateKey() - - conn = NWCConnection( - service_public_key, - account_private_key.secret.hex(), - "ws://127.0.0.1:8555", - ) - send_mock = mocker.patch.object(conn, "_send", mocker.AsyncMock()) - - try: - await conn._subscribe_to_notifications() - - assert len(conn.notification_subscription_ids) == 2 - assert len(conn.subscriptions) == 2 - assert set(conn.subscriptions.keys()) == conn.notification_subscription_ids - assert all( - subscription["method"] == "notification_sub" - and subscription["event_id"] == subscription["sub_id"] - for subscription in conn.subscriptions.values() - ) - assert send_mock.await_count == 2 - finally: - await conn.close() - - -@pytest.mark.anyio -async def test_nwc_spreads_fallback_lookups_with_cooldown(mocker): - def _schedule_next_lookup( - invoice: dict[str, object], now: float | None = None - ) -> None: - assert now is not None - invoice["next_lookup_at"] = now + 1 - - wallet = NWCWallet.__new__(NWCWallet) - wallet.shutdown = False - wallet.pending_invoices = ["checking-1", "checking-2"] - wallet.pending_invoice_details = { - "checking-1": { - "checking_id": "checking-1", - "next_lookup_at": 0.0, - "lookup_attempts": 0, - }, - "checking-2": { - "checking_id": "checking-2", - "next_lookup_at": 0.0, - "lookup_attempts": 0, - }, - } - wallet.pending_invoices_lookup_cooldown = 1.0 - wallet._is_shutting_down = lambda: False - wallet._payment_data_is_settled = lambda payment_data: False - wallet._cache_payment_data = lambda *args, **kwargs: None - wallet._schedule_next_lookup = _schedule_next_lookup - wallet.conn = mocker.Mock() - wallet.conn.get_info = mocker.AsyncMock() - wallet.conn.supports_method = mocker.Mock(return_value=True) - wallet.conn.call = mocker.AsyncMock(return_value={"settled_at": None}) - sleep_mock = mocker.patch("lnbits.wallets.nwc.asyncio.sleep", mocker.AsyncMock()) - - await wallet._run_fallback_lookups(100.0) - - assert wallet.conn.call.await_count == 2 - sleep_mock.assert_awaited_once_with(1.0) - - @pytest.mark.anyio @pytest.mark.parametrize( "test_data", diff --git a/tools/codegen/extension_sdk_typescript.py b/tools/codegen/extension_sdk_typescript.py deleted file mode 100644 index b1dfac0f9..000000000 --- a/tools/codegen/extension_sdk_typescript.py +++ /dev/null @@ -1,368 +0,0 @@ -from __future__ import annotations - -import argparse -import re -from collections import defaultdict -from collections.abc import Sequence -from pathlib import Path -from types import UnionType -from typing import Any, Literal, Union, get_args, get_origin - -from pydantic import BaseModel - -from lnbits.core.wasm_ext import ( - ExtensionAPIMethod, - ExtensionHostAPI, - get_extension_api_method, - list_extension_api_methods, -) - - -def generate_typescript_sdk( - api_cls: type[ExtensionHostAPI] | None = None, - method_ids: Sequence[str] | None = None, -) -> str: - api_cls = api_cls or ExtensionHostAPI - methods = _select_methods(api_cls, method_ids) - models = _collect_models(methods) - - lines = [ - "/* Generated by LNbits ExtensionHostAPI codegen. */", - "/* Do not edit by hand. */", - "", - "export type MaybePromise = T | Promise", - "", - ] - - for model in models: - lines.extend(_render_model_type(model)) - lines.append("") - - lines.extend(_render_method_metadata(methods)) - lines.append("") - lines.extend(_render_host_type(methods)) - lines.append("") - lines.extend(_render_sdk_type(methods)) - lines.append("") - - lines.extend(_render_create_sdk(methods)) - - return "\n".join(lines).rstrip() + "\n" - - -def write_typescript_sdk( - path: str | Path, - api_cls: type[ExtensionHostAPI] | None = None, - method_ids: Sequence[str] | None = None, -) -> None: - Path(path).write_text( - generate_typescript_sdk(api_cls, method_ids), encoding="utf-8" - ) - - -def _select_methods( - api_cls: type[ExtensionHostAPI], method_ids: Sequence[str] | None -) -> list[ExtensionAPIMethod]: - if not method_ids: - return list_extension_api_methods(api_cls) - return [get_extension_api_method(method_id, api_cls) for method_id in method_ids] - - -def _collect_models(methods: Sequence[ExtensionAPIMethod]) -> list[type[BaseModel]]: - models: dict[str, type[BaseModel]] = {} - pending = [ - model - for method in methods - for model in (method.request_model, method.response_model) - ] - - while pending: - model = pending.pop() - if model.__name__ in models: - continue - models[model.__name__] = model - for field in model.__fields__.values(): - pending.extend(_nested_model_types(field.outer_type_)) - return [models[name] for name in sorted(models)] - - -def _nested_model_types(type_: Any) -> list[type[BaseModel]]: - models: list[type[BaseModel]] = [] - if _is_model_type(type_): - models.append(type_) - for arg in get_args(type_): - models.extend(_nested_model_types(arg)) - return models - - -def _render_model_type(model: type[BaseModel]) -> list[str]: - name = _model_name(model) - fields = model.__fields__ - if not fields: - return [f"export type {name} = Record"] - - lines = [f"export type {name} = {{"] - for field_name, field in fields.items(): - optional = "?" if not field.required else "" - ts_type = _python_type_to_ts(field.outer_type_, field.allow_none) - lines.append(f" {_camel(field_name)}{optional}: {ts_type}") - lines.append("}") - return lines - - -def _python_type_to_ts(type_: Any, allow_none: bool = False) -> str: - origin = get_origin(type_) - args = get_args(type_) - - if origin in (UnionType, Union): - ts = " | ".join( - _python_type_to_ts(arg) for arg in args if arg is not type(None) - ) - if type(None) in args: - ts = f"{ts} | null" - return ts - - if origin is Literal: - return " | ".join(_literal_to_ts(arg) for arg in args) - - if _is_model_type(type_): - ts = _model_name(type_) - elif origin in (list, Sequence): - item_type = _python_type_to_ts(args[0]) if args else "unknown" - ts = f"{item_type}[]" - elif origin is dict: - key_type = _python_type_to_ts(args[0]) if args else "string" - value_type = _python_type_to_ts(args[1]) if len(args) > 1 else "unknown" - ts = ( - f"Record<{key_type}, {value_type}>" - if key_type == "string" - else f"{{ [key: string]: {value_type} }}" - ) - elif _is_subclass(type_, str): - ts = "string" - elif _is_subclass(type_, bool): - ts = "boolean" - elif _is_subclass(type_, int) or _is_subclass(type_, float): - ts = "number" - else: - ts = "unknown" - - return f"{ts} | null" if allow_none else ts - - -def _literal_to_ts(value: Any) -> str: - if isinstance(value, str): - return f'"{value}"' - if isinstance(value, bool): - return "true" if value else "false" - if value is None: - return "null" - return str(value) - - -def _is_subclass(type_: Any, class_: type) -> bool: - try: - return isinstance(type_, type) and issubclass(type_, class_) - except TypeError: - return False - - -def _is_model_type(type_: Any) -> bool: - return _is_subclass(type_, BaseModel) - - -def _render_method_metadata( - methods: Sequence[ExtensionAPIMethod], -) -> list[str]: - lines = ["export const extensionApiMethods = ["] - for method in methods: - permission = ( - f'"{method.required_permission}"' if method.required_permission else "null" - ) - lines.extend( - [ - " {", - f' id: "{method.method_id}",', - f' namespace: "{method.namespace}",', - f' sdkName: "{method.sdk_name}",', - f' pythonName: "{method.python_name}",', - f' hostInterface: "{method.host_interface}",', - f' hostName: "{method.host_name}",', - f' hostJsName: "{_camel(method.host_name)}",', - f" requiredPermission: {permission},", - " },", - ] - ) - lines.append("] as const") - return lines - - -def _render_host_type(methods: Sequence[ExtensionAPIMethod]) -> list[str]: - lines = ["export type ExtensionHost = {"] - for host_interface, interface_methods in _methods_by_host_interface( - methods - ).items(): - lines.append(f" {_ts_property(host_interface)}: {{") - for method in sorted(interface_methods, key=lambda item: item.host_name): - request = _model_name(method.request_model) - response = _model_name(method.response_model) - if _is_empty_model(method.request_model): - lines.append( - f" {_camel(method.host_name)}(): MaybePromise<{response}>" - ) - else: - lines.append( - f" {_camel(method.host_name)}" - f"(input: {request}): MaybePromise<{response}>" - ) - lines.append(" }") - lines.append("}") - return lines - - -def _render_sdk_type(methods: Sequence[ExtensionAPIMethod]) -> list[str]: - lines = ["export type ExtensionSdk = {"] - _render_sdk_type_node(lines, _namespace_tree(methods), 1) - lines.append("}") - return lines - - -def _render_create_sdk(methods: Sequence[ExtensionAPIMethod]) -> list[str]: - lines = [ - "export function createExtensionSdk(", - " host: ExtensionHost", - "): ExtensionSdk {", - " return {", - ] - _render_create_sdk_node(lines, _namespace_tree(methods), 2) - lines.extend([" }", "}"]) - return lines - - -def _render_sdk_type_node(lines: list[str], node: dict[str, Any], level: int) -> None: - indent = " " * level - for namespace, child in _iter_child_namespaces(node): - lines.append(f"{indent}{namespace}: {{") - _render_sdk_type_node(lines, child, level + 1) - lines.append(f"{indent}}}") - - for method in node.get("__methods__", []): - request = _model_name(method.request_model) - response = _model_name(method.response_model) - if _is_empty_model(method.request_model): - lines.append(f"{indent}{method.sdk_name}(): Promise<{response}>") - else: - lines.append( - f"{indent}{method.sdk_name}(input: {request}): Promise<{response}>" - ) - - -def _render_create_sdk_node(lines: list[str], node: dict[str, Any], level: int) -> None: - indent = " " * level - for namespace, child in _iter_child_namespaces(node): - lines.append(f"{indent}{namespace}: {{") - _render_create_sdk_node(lines, child, level + 1) - lines.append(f"{indent}}},") - - for method in node.get("__methods__", []): - host_call_target = ( - f"host{_ts_access(method.host_interface)}" - f"{_ts_access(_camel(method.host_name))}" - ) - if _is_empty_model(method.request_model): - signature = f"{method.sdk_name}()" - host_call = f"{host_call_target}()" - else: - signature = f"{method.sdk_name}(input)" - host_call = f"{host_call_target}(input)" - lines.extend( - [ - f"{indent}async {signature} {{", - f"{indent} return {host_call}", - f"{indent}}},", - ] - ) - - -def _methods_by_host_interface( - methods: Sequence[ExtensionAPIMethod], -) -> dict[str, list[ExtensionAPIMethod]]: - interfaces: dict[str, list[ExtensionAPIMethod]] = defaultdict(list) - for method in sorted( - methods, key=lambda item: (item.host_interface, item.host_name) - ): - interfaces[method.host_interface].append(method) - return dict(sorted(interfaces.items())) - - -def _namespace_tree(methods: Sequence[ExtensionAPIMethod]) -> dict[str, Any]: - tree: dict[str, Any] = {} - for method in sorted(methods, key=lambda item: (item.namespace, item.sdk_name)): - node = tree - for part in method.namespace.split("."): - node = node.setdefault(part, {}) - node.setdefault("__methods__", []).append(method) - return tree - - -def _iter_child_namespaces( - node: dict[str, Any], -) -> list[tuple[str, dict[str, Any]]]: - return [ - (key, value) - for key, value in sorted(node.items()) - if key != "__methods__" and isinstance(value, dict) - ] - - -def _model_name(model: type[BaseModel]) -> str: - return model.__name__ - - -def _camel(value: str) -> str: - head, *tail = value.split("_") - return head + "".join(part.capitalize() for part in tail) - - -def _ts_property(value: str) -> str: - if re.match(r"^[A-Za-z_$][A-Za-z0-9_$]*$", value): - return value - return f'"{value}"' - - -def _ts_access(value: str) -> str: - if re.match(r"^[A-Za-z_$][A-Za-z0-9_$]*$", value): - return f".{value}" - return f'["{value}"]' - - -def _is_empty_model(model: type[BaseModel]) -> bool: - return not model.__fields__ - - -def main(argv: Sequence[str] | None = None) -> int: - parser = argparse.ArgumentParser( - description="Generate a TypeScript SDK from the LNbits ExtensionHostAPI." - ) - parser.add_argument( - "--method", - action="append", - dest="method_ids", - help="ExtensionHostAPI method id to include. Can be passed multiple times.", - ) - parser.add_argument( - "--out", - help="Output file. If omitted, the generated SDK is printed to stdout.", - ) - args = parser.parse_args(argv) - - sdk = generate_typescript_sdk(method_ids=args.method_ids) - if args.out: - Path(args.out).write_text(sdk, encoding="utf-8") - else: - print(sdk, end="") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/uv.lock b/uv.lock index 87ecf55c7..504dc9202 100644 --- a/uv.lock +++ b/uv.lock @@ -8,16 +8,16 @@ exclude-newer-span = "P1W" [[package]] name = "aiohappyeyeballs" -version = "2.6.2" +version = "2.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/33/c6/61a2d7b7572279226bb2e7f61d7a19ca7c90da0329c93fa0d560cbf288d8/aiohappyeyeballs-2.6.2.tar.gz", hash = "sha256:e202810ee718bd01fc6ef49e8ea53d023d5cb6b581076d7925aa499fa55dbe64", size = 22591, upload-time = "2026-05-20T15:12:24.631Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/fc/a7bf5b6e4e617b45f90f2d9d2a68519c249c81dd4fc2658c7a2a61c4f4b7/aiohappyeyeballs-2.6.2-py3-none-any.whl", hash = "sha256:4708045e2d7a6c6bdf8aafa8ed39649eaf926a4543b54560659129e3365953c4", size = 15062, upload-time = "2026-05-20T15:12:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, ] [[package]] name = "aiohttp" -version = "3.14.3" +version = "3.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -27,65 +27,61 @@ dependencies = [ { name = "frozenlist" }, { name = "multidict" }, { name = "propcache" }, - { name = "typing-extensions" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/d9/22ce5786ac0c1653ae8b6c23bded02c1686d11f0dbb45b31ce128e0df985/aiohttp-3.14.3.tar.gz", hash = "sha256:9491196535a88924a60afd5b5f434b5b203b6cc616250878dbdb223a8f7844bc", size = 7971213, upload-time = "2026-07-23T01:57:27.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/9a/152096d4808df8e4268befa55fba462f440f14beab85e8ad9bf990516918/aiohttp-3.13.5.tar.gz", hash = "sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1", size = 7858271, upload-time = "2026-03-31T22:01:03.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/4d/4a99fb425c5e0cad715eea7bd190aff46f38b959a0a2dadb993705d34b26/aiohttp-3.14.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eb0495d778817619273c108784292be161a924b9f5ae5cbbc70a2caa6838250b", size = 765848, upload-time = "2026-07-23T01:52:08.217Z" }, - { url = "https://files.pythonhosted.org/packages/74/e8/43b85dc55b8e950dc644babe762add781319ea881b57b33d2cce12017d12/aiohttp-3.14.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c3c200cf9757edd785051dc699c7ecbec22110dbfcb3fefc7a9f9695eda8ea7a", size = 517476, upload-time = "2026-07-23T01:52:10.846Z" }, - { url = "https://files.pythonhosted.org/packages/7f/9e/73b582c4dbbc3c12ef4473822475effaabf1f934b56f14f5b03fe5d3a2af/aiohttp-3.14.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd51ebf9d3a00c074df4ede271023f4d2dba289bcc740b88191872716014e3c5", size = 515334, upload-time = "2026-07-23T01:52:12.636Z" }, - { url = "https://files.pythonhosted.org/packages/79/03/e98c3c9e05a5bdf97defe5ff9169baba4f0ec9a901f2d60e0f060c2f051e/aiohttp-3.14.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:134ac5ddcf61c6fad984b9a5727d83492ada43d63471db20fb73042c13fca62f", size = 1708830, upload-time = "2026-07-23T01:52:14.538Z" }, - { url = "https://files.pythonhosted.org/packages/d7/2c/26e60b694844dfd2176c57f913a22d0cd6a16f9ff202cbda7580d0328b98/aiohttp-3.14.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:70c987b27534f9ae1a723f47ae921571d616da21d3208282bf4c52af5164ac43", size = 1674012, upload-time = "2026-07-23T01:52:16.486Z" }, - { url = "https://files.pythonhosted.org/packages/38/65/672df92e3172cd876aacfa97a952ac560877eb169384b2991ac5b273de4c/aiohttp-3.14.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1b59533861b70a2185c8f4f350f791f39d64358ef6944ce71c5240c9ec0982c9", size = 1767015, upload-time = "2026-07-23T01:52:18.28Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c5/228dec7bfec1c373cc2217cdeb47d6456dcd7a13a4c55144930a75ae3851/aiohttp-3.14.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1c5281acc88b92396f88c7e1e2748f8466689df22b80170e4f51efa712fb47a8", size = 1858700, upload-time = "2026-07-23T01:52:20.08Z" }, - { url = "https://files.pythonhosted.org/packages/bd/ff/cb36724e8c8d17f90ada567a9ff3efe1d6e9b549fba697a242aece180f21/aiohttp-3.14.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48d67b87db6279c044760787eb01f6413032c2e6f3ba1cafaa492b1c8e578479", size = 1714075, upload-time = "2026-07-23T01:52:22.071Z" }, - { url = "https://files.pythonhosted.org/packages/9f/3a/296a4135c6366376263aeef54b15caca1f07676c2ae0c525d7832f2f808a/aiohttp-3.14.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f53bcd52f585e1ac3e590d61434eb61f9a88c38df041b4ea126d97144344a77b", size = 1588234, upload-time = "2026-07-23T01:52:23.757Z" }, - { url = "https://files.pythonhosted.org/packages/7d/81/9d5d853ef892dc066d1eb6db0e87a47348b920c1c879aa554612fdbd9d79/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0fdea2281997af69da84c77ffa6f5938a0285f21fb3887c249d67419ca865b3d", size = 1677300, upload-time = "2026-07-23T01:52:25.861Z" }, - { url = "https://files.pythonhosted.org/packages/68/96/021d386ae32d9b26d4b88df2e794546232ff56bb6be952bf6be227c0bbc7/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cda5fd5c95ad7a125a2e8464acc78b98b94c475a3780d6aa0aa157c93f470f4d", size = 1691501, upload-time = "2026-07-23T01:52:28Z" }, - { url = "https://files.pythonhosted.org/packages/29/9f/af66adce26a14af135c003cbd0f44ccaa68cebd30ff8ac99ca47fb4958f7/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6debfa7312ff9d4c124dc71d72e9a0a4b9e0879e48ba6fcb42bef5c3300289e2", size = 1735113, upload-time = "2026-07-23T01:52:29.995Z" }, - { url = "https://files.pythonhosted.org/packages/2f/90/28c390d4c9851effe52ac25b5a2e1d92246acd00728b4fc7975dafb67484/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:f4e05329faa0ea1a404b37de4f034fd2c2defcca06a68dc6745e4e56c88e8a48", size = 1577486, upload-time = "2026-07-23T01:52:31.937Z" }, - { url = "https://files.pythonhosted.org/packages/db/c2/00e23a1bf2abb70dd353f6987db7e7f2491d0261f7363997738c71c98f95/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a3a8296e7ab5c295f53f1041487cb088e1480775aafbf7fe545d93b770a0f96f", size = 1751353, upload-time = "2026-07-23T01:52:33.688Z" }, - { url = "https://files.pythonhosted.org/packages/6e/7d/d51a706a8cbfa57f0611127daf61ab3ae02ab8420b0407412079227d1c65/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5373dc80ad1aa2fb9ad95c83f24eef418bbda3a61375f128e5b0192e4f3f9b32", size = 1698681, upload-time = "2026-07-23T01:52:38.167Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b0/90bd5cd9fdd9787cb4211d284d1fb8401339a933cb0227a15b71e789232f/aiohttp-3.14.3-cp310-cp310-win32.whl", hash = "sha256:a3e22975f905b89a55a488c2a08f2fdb2186175349e917d48985cc468a3d4c6e", size = 456733, upload-time = "2026-07-23T01:52:41.823Z" }, - { url = "https://files.pythonhosted.org/packages/d8/15/fe5b8f6a71ae112bc677163d0b0701bda5dc15005249582258ede0eb88c7/aiohttp-3.14.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdd0e2834dce1a26c1bbe26464861e16bbe217042cbff619247c11594472518c", size = 480460, upload-time = "2026-07-23T01:52:43.905Z" }, - { url = "https://files.pythonhosted.org/packages/54/00/45e98b6645cd7f00a4b78b749ebd309094b0eaeb2d2e96157eadbc0d0050/aiohttp-3.14.3-cp310-cp310-win_arm64.whl", hash = "sha256:eac645b09bcfdf73df7536331f0678c1086ea250981118ddb5199e17ccef72bb", size = 453479, upload-time = "2026-07-23T01:52:46.075Z" }, - { url = "https://files.pythonhosted.org/packages/f8/5c/b3e4ff8ad43a8afef9602c5e90285936da1beaea8b029016b793891f03c3/aiohttp-3.14.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e568e14940c09955aa51f4e645b6daa18a581c5dcfcd73744dcc86a856e3ced3", size = 764250, upload-time = "2026-07-23T01:52:48.525Z" }, - { url = "https://files.pythonhosted.org/packages/0e/da/f1b384465e51449d844056b75070461da03a9a23e6c1747003695bf4172a/aiohttp-3.14.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54cfcdee2770dac994417cbb0ee1f3eb0e7cb6b30c79bf44f2c02ff79ec5124a", size = 516281, upload-time = "2026-07-23T01:52:51.047Z" }, - { url = "https://files.pythonhosted.org/packages/b9/3f/01264f820ee2e3712a827892b1cd6ff80f3300c1fcbffbb45714a915d47a/aiohttp-3.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:21c016079415ed3fd676963e9793700a566d85dbbd6bfc564b9b2d209147dcc8", size = 514742, upload-time = "2026-07-23T01:52:53.779Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8d/a71c6f2db52ac1ed142b133f7feddaa6b70539c3f4de24d7e226c95b794c/aiohttp-3.14.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6088ec9894113802bddb3c09e974929aed2c7b3a8c456219b8aab4481f1a239", size = 1780613, upload-time = "2026-07-23T01:52:56.948Z" }, - { url = "https://files.pythonhosted.org/packages/a5/11/3dd9b3fb3a170f6ec9011b5291d876a6fab4086714c9e158600edf01b4fd/aiohttp-3.14.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:16ea7e24c309fb7c0bbd505d149abe4fe4dccfb8db911db7dbec0921bc889a6f", size = 1737688, upload-time = "2026-07-23T01:52:59.294Z" }, - { url = "https://files.pythonhosted.org/packages/6d/3e/834c26918be7d88068822b40e0db30fca50b5f4fe79104aa16a93f1d74e6/aiohttp-3.14.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56f355e79f71aef2a85c80305cc915f894b170dba76de5fe84f6351939b83c06", size = 1845742, upload-time = "2026-07-23T01:53:01.641Z" }, - { url = "https://files.pythonhosted.org/packages/cc/c9/49ab8572df7d66bc13d11e31f781292badb04180dd87ba98733066c6aed7/aiohttp-3.14.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:18c441d0a8fca6de8d1f546849b9f0ab20d435993e2c5b59562b2fae6be2f929", size = 1928412, upload-time = "2026-07-23T01:53:04.018Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b9/2b8f0c0ce09c87a1daf80fd483431b56b1435d3f62789bc86f572e1245de/aiohttp-3.14.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:53e7b4ce82b54a8bcc71b3b67a5cbd177ca1d7f592cbc92cd38b7349f73482db", size = 1786220, upload-time = "2026-07-23T01:53:06.481Z" }, - { url = "https://files.pythonhosted.org/packages/85/00/9c45f81de11710460edfa1dc81317b6e882703b160926c879a9d20da9fcc/aiohttp-3.14.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f55119f7bf25f49ed210f6096090715da24f2943c62102448915fde3c62877ce", size = 1637231, upload-time = "2026-07-23T01:53:10.258Z" }, - { url = "https://files.pythonhosted.org/packages/19/ce/967d628e910756f3539c6107cb7844a1b69440dcb3029a5ee7871b09ab63/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9aa6e61fdf20105c4144e755bd586008ff450791d67b1c8146fdc15959c4d51c", size = 1753161, upload-time = "2026-07-23T01:53:13.817Z" }, - { url = "https://files.pythonhosted.org/packages/11/b2/0c3d4114f0aee4f580f5b3b4eb71b24d7a23b834ea506a4dfebe76513f35/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ccd4893707b3e2a13e39c90d43cf80edf2e4d0457935bcc103bf2346214c3f15", size = 1756356, upload-time = "2026-07-23T01:53:16.211Z" }, - { url = "https://files.pythonhosted.org/packages/63/5d/99e7d91c82f1399d1ae2a854e080bd1493fbc31e5e959dbc4ec33dac3bec/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2466434105a4e03113c36ec775cc2ebe6676b62eae326fa670bb607ef788c1c", size = 1819846, upload-time = "2026-07-23T01:53:18.289Z" }, - { url = "https://files.pythonhosted.org/packages/ad/05/d5e1cb6480eeffd3f901d40a2c5e2d1e7effdc797837da3b490272699f13/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ba59d59aba08ac02fc03b0c8983ccd5ee39a199d0552ce9e6d2b4845b34d59ae", size = 1628531, upload-time = "2026-07-23T01:53:23.86Z" }, - { url = "https://files.pythonhosted.org/packages/c9/90/b934682bcaefae18a9e04f3dff5b68522ba810906358ae5029b68110ea3b/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ed099d105449c4f9e84f24af203cd131349d4761d8813fa7e02c32e7128cd910", size = 1832712, upload-time = "2026-07-23T01:53:27.551Z" }, - { url = "https://files.pythonhosted.org/packages/21/df/6061679faaf81fac746e7307c7adb71e858071a5d34c27583afefc64f543/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:152516815ef926786a0b6ae2b8f1fd2e0c71582dee0b435636865316fd4891b7", size = 1775014, upload-time = "2026-07-23T01:53:30.223Z" }, - { url = "https://files.pythonhosted.org/packages/8a/1d/f854878bbc69b88faefe924b619a34a6f59ec05fd387c77690667eaa75eb/aiohttp-3.14.3-cp311-cp311-win32.whl", hash = "sha256:a4af35c443e0b1a1bd6a8af3f3485d7fda15c142751a00f3ff8090f0b93346fa", size = 456006, upload-time = "2026-07-23T01:53:34.97Z" }, - { url = "https://files.pythonhosted.org/packages/73/0c/2af9d1674baccd1dbd47282a93d660a22e57ef6167c856deb24b4214fbab/aiohttp-3.14.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1e74298bab6ee0d6e749ed4fd1901c7e604bdda32c03d787a2cc71c46d0433d", size = 481069, upload-time = "2026-07-23T01:53:39.673Z" }, - { url = "https://files.pythonhosted.org/packages/8e/76/88401ff3fc95e85c5fc38d588f36f55e61ecb64343b2bc8d69326f453cc0/aiohttp-3.14.3-cp311-cp311-win_arm64.whl", hash = "sha256:03cd2bde3d7f085b64e549c985f4bb928cad7e8ecf5323bfca320db548d81b39", size = 453021, upload-time = "2026-07-23T01:53:43.749Z" }, - { url = "https://files.pythonhosted.org/packages/18/d4/eb96299230e20acf2efae207cb8d69051f1f68e357e5ea5e479bf6fb097a/aiohttp-3.14.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:39aded8c7f3b935b54aab1d8d73c70ec0ee2d3ec3b943e0e86611bc150ba47f5", size = 754690, upload-time = "2026-07-23T01:53:47.332Z" }, - { url = "https://files.pythonhosted.org/packages/88/11/e7a70a209eb9a067c0d3212b518a0134e3484f5178c7533878b6b514d469/aiohttp-3.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5bcb6ff3fdab1258a192679ff1a05d44f59626430aa05cd1a9d2447423599228", size = 509484, upload-time = "2026-07-23T01:53:51.159Z" }, - { url = "https://files.pythonhosted.org/packages/30/07/4bbc222cc8dbe31d4c3e8a5baad2286e4d42026ac0c570027b89afce6344/aiohttp-3.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:617105e2c3018ee38d0c8ce5ee3c84f621a6d8b9f723202aacaff28449ca91ee", size = 511949, upload-time = "2026-07-23T01:53:55.083Z" }, - { url = "https://files.pythonhosted.org/packages/54/b9/42e74c46b7b7c794b995bbc1f573fb48950c38b19d8600c62a6804ee2d67/aiohttp-3.14.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f631fe87a6f30df5fbe6d79640b25e4cffb38c31c7fb6f10871517b84b0f8c1a", size = 1765282, upload-time = "2026-07-23T01:53:59.662Z" }, - { url = "https://files.pythonhosted.org/packages/6b/ed/62bc4d74363ad346d518e0720363a949f63e2e23439a79eb5813d4d29bb3/aiohttp-3.14.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a94dbaae5ae27bd849c93570669bff91e0510f33a80805738e3de72a7be0447b", size = 1741511, upload-time = "2026-07-23T01:54:04.063Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9f/181e8a8bc79e47d13c7fc4540bd7a3b729d9505609c61f392a8dd2fbfe55/aiohttp-3.14.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8f2f1c4c032c7cedd7d8da6f54c97b70266c6570c3108d3fdffee7188bb70529", size = 1810680, upload-time = "2026-07-23T01:54:09.882Z" }, - { url = "https://files.pythonhosted.org/packages/5c/9a/dec94d6ad694552fe3424e3f1928d7a606a5d9d9433a04e7ecdd9d38ae7f/aiohttp-3.14.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea05e1f97ceea523942d9b2a7d7c0359d781d683d6b043f5943a602b14da4787", size = 1905646, upload-time = "2026-07-23T01:54:13.475Z" }, - { url = "https://files.pythonhosted.org/packages/52/b7/7cd31f29d6055bd711ae6e669367fba6f5ae9de463910a793e30556a8db7/aiohttp-3.14.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:543906c127fb1d929b95076db19b83fa2d46751006ff1e23b093aa5ac4d8db42", size = 1792122, upload-time = "2026-07-23T01:54:15.752Z" }, - { url = "https://files.pythonhosted.org/packages/66/73/10b1ef93afa61f4963c746257b70ced619cf31a4798671de5fdb2608501d/aiohttp-3.14.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0a5ff2dfbb9ce645fa5b8ef3e02c6c0b9cc3f6030ff863d0c51fffc50cb5541b", size = 1591127, upload-time = "2026-07-23T01:54:19.489Z" }, - { url = "https://files.pythonhosted.org/packages/49/ed/3b203fa6de1b338c14acdc06bf6ca9b043b7944f005966958c2ced932cde/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:041badb8f84396357c4d3ad26de6afd7a32b112f43d3c63045c0c8278cfd2043", size = 1725210, upload-time = "2026-07-23T01:54:24.129Z" }, - { url = "https://files.pythonhosted.org/packages/28/b7/1c2aab8c706436dcc28598452488ac9cd7c409da815237c28c27d58993e6/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:530125ee1163c4219af35dc3aa1206e541e7b31b6efc1a3f93b70a136f65d427", size = 1764848, upload-time = "2026-07-23T01:54:27.973Z" }, - { url = "https://files.pythonhosted.org/packages/54/50/94c28f08b131c4bf10984ea2c7a536c9920608bb2d6e7f95642c30cc87b7/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8653fd547c93a61aadc612007790f5555cdd18946fa48cf45e26d8ea4ea473d", size = 1777102, upload-time = "2026-07-23T01:54:31.775Z" }, - { url = "https://files.pythonhosted.org/packages/13/d4/e7d09ba7d345fb2d74440fd2fa033c5e079fac05552927705986f41a364f/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:89176250f686cb9853c0fb7ead90e639e915b84a6f43eedc2a4e7ec21f1037f0", size = 1580205, upload-time = "2026-07-23T01:54:34.518Z" }, - { url = "https://files.pythonhosted.org/packages/a3/84/072a91d68e1e1eb587985b54baab94221277f877e8ef274fc213a0ceae28/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3a26434dafe408229ff3403458ca58de24fb51936504decac49ce6755f77e59d", size = 1797219, upload-time = "2026-07-23T01:54:36.995Z" }, - { url = "https://files.pythonhosted.org/packages/e0/eb/aad34e897e668424d6e995da5dff8a4a09af93363d3392488772957a63aa/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d1558173930a5a8d3069cee5c92fc91c87c4dbcb099debbb3622053717145a19", size = 1768629, upload-time = "2026-07-23T01:54:40.103Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2b/6bb88ddba0fecd9122aa3ebcad25996cf6c083a4a7040dbb3a4f97972af6/aiohttp-3.14.3-cp312-cp312-win32.whl", hash = "sha256:16100ad3ab8d649fdfbee87602d9d2dcdca9df0b9eda8a1b5fdc0d41f96da559", size = 451481, upload-time = "2026-07-23T01:54:42.547Z" }, - { url = "https://files.pythonhosted.org/packages/76/9b/f2f8f108da17ecef2cc3efc424e8b7ad3782b1a8360f7b8eae8ced84f6ea/aiohttp-3.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:33a2d7c28d33797a2e99923dffa63f83d908a19b6bf26cfe80fa790aa5e1a75a", size = 476845, upload-time = "2026-07-23T01:54:44.853Z" }, - { url = "https://files.pythonhosted.org/packages/3e/44/28dac80a8941b604f4da10ce21097614ca1bf905ce93dca28d8d7de9c1e7/aiohttp-3.14.3-cp312-cp312-win_arm64.whl", hash = "sha256:362a3fd481769cac1a824514bcd86fda51c65e8fe6e051099e008fddde6db17c", size = 448050, upload-time = "2026-07-23T01:54:47.087Z" }, + { url = "https://files.pythonhosted.org/packages/bd/85/cebc47ee74d8b408749073a1a46c6fcba13d170dc8af7e61996c6c9394ac/aiohttp-3.13.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:02222e7e233295f40e011c1b00e3b0bd451f22cf853a0304c3595633ee47da4b", size = 750547, upload-time = "2026-03-31T21:56:30.024Z" }, + { url = "https://files.pythonhosted.org/packages/05/98/afd308e35b9d3d8c9ec54c0918f1d722c86dc17ddfec272fcdbcce5a3124/aiohttp-3.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bace460460ed20614fa6bc8cb09966c0b8517b8c58ad8046828c6078d25333b5", size = 503535, upload-time = "2026-03-31T21:56:31.935Z" }, + { url = "https://files.pythonhosted.org/packages/6f/4d/926c183e06b09d5270a309eb50fbde7b09782bfd305dec1e800f329834fb/aiohttp-3.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f546a4dc1e6a5edbb9fd1fd6ad18134550e096a5a43f4ad74acfbd834fc6670", size = 497830, upload-time = "2026-03-31T21:56:33.654Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d6/f47d1c690f115a5c2a5e8938cce4a232a5be9aac5c5fb2647efcbbbda333/aiohttp-3.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c86969d012e51b8e415a8c6ce96f7857d6a87d6207303ab02d5d11ef0cad2274", size = 1682474, upload-time = "2026-03-31T21:56:35.513Z" }, + { url = "https://files.pythonhosted.org/packages/01/44/056fd37b1bb52eac760303e5196acc74d9d546631b035704ae5927f7b4ac/aiohttp-3.13.5-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b6f6cd1560c5fa427e3b6074bb24d2c64e225afbb7165008903bd42e4e33e28a", size = 1655259, upload-time = "2026-03-31T21:56:37.843Z" }, + { url = "https://files.pythonhosted.org/packages/91/9f/78eb1a20c1c28ae02f6a3c0f4d7b0dcc66abce5290cadd53d78ce3084175/aiohttp-3.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:636bc362f0c5bbc7372bc3ae49737f9e3030dbce469f0f422c8f38079780363d", size = 1736204, upload-time = "2026-03-31T21:56:39.822Z" }, + { url = "https://files.pythonhosted.org/packages/de/6c/d20d7de23f0b52b8c1d9e2033b2db1ac4dacbb470bb74c56de0f5f86bb4f/aiohttp-3.13.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6a7cbeb06d1070f1d14895eeeed4dac5913b22d7b456f2eb969f11f4b3993796", size = 1826198, upload-time = "2026-03-31T21:56:41.378Z" }, + { url = "https://files.pythonhosted.org/packages/2f/86/a6f3ff1fd795f49545a7c74b2c92f62729135d73e7e4055bf74da5a26c82/aiohttp-3.13.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca9ef7517fd7874a1a08970ae88f497bf5c984610caa0bf40bd7e8450852b95", size = 1681329, upload-time = "2026-03-31T21:56:43.374Z" }, + { url = "https://files.pythonhosted.org/packages/fb/68/84cd3dab6b7b4f3e6fe9459a961acb142aaab846417f6e8905110d7027e5/aiohttp-3.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:019a67772e034a0e6b9b17c13d0a8fe56ad9fb150fc724b7f3ffd3724288d9e5", size = 1560023, upload-time = "2026-03-31T21:56:45.031Z" }, + { url = "https://files.pythonhosted.org/packages/41/2c/db61b64b0249e30f954a65ab4cb4970ced57544b1de2e3c98ee5dc24165f/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f34ecee82858e41dd217734f0c41a532bd066bcaab636ad830f03a30b2a96f2a", size = 1652372, upload-time = "2026-03-31T21:56:47.075Z" }, + { url = "https://files.pythonhosted.org/packages/25/6f/e96988a6c982d047810c772e28c43c64c300c943b0ed5c1c0c4ce1e1027c/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4eac02d9af4813ee289cd63a361576da36dba57f5a1ab36377bc2600db0cbb73", size = 1662031, upload-time = "2026-03-31T21:56:48.835Z" }, + { url = "https://files.pythonhosted.org/packages/b7/26/a56feace81f3d347b4052403a9d03754a0ab23f7940780dada0849a38c92/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4beac52e9fe46d6abf98b0176a88154b742e878fdf209d2248e99fcdf73cd297", size = 1708118, upload-time = "2026-03-31T21:56:50.833Z" }, + { url = "https://files.pythonhosted.org/packages/78/6e/b6173a8ff03d01d5e1a694bc06764b5dad1df2d4ed8f0ceec12bb3277936/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c180f480207a9b2475f2b8d8bd7204e47aec952d084b2a2be58a782ffcf96074", size = 1548667, upload-time = "2026-03-31T21:56:52.81Z" }, + { url = "https://files.pythonhosted.org/packages/16/13/13296ffe2c132d888b3fe2c195c8b9c0c24c89c3fa5cc2c44464dc23b22e/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2837fb92951564d6339cedae4a7231692aa9f73cbc4fb2e04263b96844e03b4e", size = 1724490, upload-time = "2026-03-31T21:56:54.541Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1f1c287f4a79782ef36e5a6e62954c85343bc30470d862d30bd5f26c9fa2/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9010032a0b9710f58012a1e9c222528763d860ba2ee1422c03473eab47703e7", size = 1667109, upload-time = "2026-03-31T21:56:56.21Z" }, + { url = "https://files.pythonhosted.org/packages/ef/42/8461a2aaf60a8f4ea4549a4056be36b904b0eb03d97ca9a8a2604681a500/aiohttp-3.13.5-cp310-cp310-win32.whl", hash = "sha256:7c4b6668b2b2b9027f209ddf647f2a4407784b5d88b8be4efcc72036f365baf9", size = 439478, upload-time = "2026-03-31T21:56:58.292Z" }, + { url = "https://files.pythonhosted.org/packages/e5/71/06956304cb5ee439dfe8d86e1b2e70088bd88ed1ced1f42fb29e5d855f0e/aiohttp-3.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:cd3db5927bf9167d5a6157ddb2f036f6b6b0ad001ac82355d43e97a4bde76d76", size = 462047, upload-time = "2026-03-31T21:57:00.257Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/a20c4ac64aeaef1679e25c9983573618ff765d7aa829fa2b84ae7573169e/aiohttp-3.13.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ab7229b6f9b5c1ba4910d6c41a9eb11f543eadb3f384df1b4c293f4e73d44d6", size = 757513, upload-time = "2026-03-31T21:57:02.146Z" }, + { url = "https://files.pythonhosted.org/packages/75/0a/39fa6c6b179b53fcb3e4b3d2b6d6cad0180854eda17060c7218540102bef/aiohttp-3.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f14c50708bb156b3a3ca7230b3d820199d56a48e3af76fa21c2d6087190fe3d", size = 506748, upload-time = "2026-03-31T21:57:04.275Z" }, + { url = "https://files.pythonhosted.org/packages/87/ec/e38ce072e724fd7add6243613f8d1810da084f54175353d25ccf9f9c7e5a/aiohttp-3.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7d2f8616f0ff60bd332022279011776c3ac0faa0f1b463f7bb12326fbc97a1c", size = 501673, upload-time = "2026-03-31T21:57:06.208Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ba/3bc7525d7e2beaa11b309a70d48b0d3cfc3c2089ec6a7d0820d59c657053/aiohttp-3.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2567b72e1ffc3ab25510db43f355b29eeada56c0a622e58dcdb19530eb0a3cb", size = 1763757, upload-time = "2026-03-31T21:57:07.882Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ab/e87744cf18f1bd78263aba24924d4953b41086bd3a31d22452378e9028a0/aiohttp-3.13.5-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fb0540c854ac9c0c5ad495908fdfd3e332d553ec731698c0e29b1877ba0d2ec6", size = 1720152, upload-time = "2026-03-31T21:57:09.946Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f3/ed17a6f2d742af17b50bae2d152315ed1b164b07a5fd5cc1754d99e4dfa5/aiohttp-3.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9883051c6972f58bfc4ebb2116345ee2aa151178e99c3f2b2bbe2af712abd13", size = 1818010, upload-time = "2026-03-31T21:57:12.157Z" }, + { url = "https://files.pythonhosted.org/packages/53/06/ecbc63dc937192e2a5cb46df4d3edb21deb8225535818802f210a6ea5816/aiohttp-3.13.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2294172ce08a82fb7c7273485895de1fa1186cc8294cfeb6aef4af42ad261174", size = 1907251, upload-time = "2026-03-31T21:57:14.023Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a5/0521aa32c1ddf3aa1e71dcc466be0b7db2771907a13f18cddaa45967d97b/aiohttp-3.13.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a807cabd5115fb55af198b98178997a5e0e57dead43eb74a93d9c07d6d4a7dc", size = 1759969, upload-time = "2026-03-31T21:57:16.146Z" }, + { url = "https://files.pythonhosted.org/packages/f6/78/a38f8c9105199dd3b9706745865a8a59d0041b6be0ca0cc4b2ccf1bab374/aiohttp-3.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa6d0d932e0f39c02b80744273cd5c388a2d9bc07760a03164f229c8e02662f6", size = 1616871, upload-time = "2026-03-31T21:57:17.856Z" }, + { url = "https://files.pythonhosted.org/packages/6f/41/27392a61ead8ab38072105c71aa44ff891e71653fe53d576a7067da2b4e8/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60869c7ac4aaabe7110f26499f3e6e5696eae98144735b12a9c3d9eae2b51a49", size = 1739844, upload-time = "2026-03-31T21:57:19.679Z" }, + { url = "https://files.pythonhosted.org/packages/6e/55/5564e7ae26d94f3214250009a0b1c65a0c6af4bf88924ccb6fdab901de28/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:26d2f8546f1dfa75efa50c3488215a903c0168d253b75fba4210f57ab77a0fb8", size = 1731969, upload-time = "2026-03-31T21:57:22.006Z" }, + { url = "https://files.pythonhosted.org/packages/6d/c5/705a3929149865fc941bcbdd1047b238e4a72bcb215a9b16b9d7a2e8d992/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1162a1492032c82f14271e831c8f4b49f2b6078f4f5fc74de2c912fa225d51d", size = 1795193, upload-time = "2026-03-31T21:57:24.256Z" }, + { url = "https://files.pythonhosted.org/packages/a6/19/edabed62f718d02cff7231ca0db4ef1c72504235bc467f7b67adb1679f48/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8b14eb3262fad0dc2f89c1a43b13727e709504972186ff6a99a3ecaa77102b6c", size = 1606477, upload-time = "2026-03-31T21:57:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/de/fc/76f80ef008675637d88d0b21584596dc27410a990b0918cb1e5776545b5b/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ca9ac61ac6db4eb6c2a0cd1d0f7e1357647b638ccc92f7e9d8d133e71ed3c6ac", size = 1813198, upload-time = "2026-03-31T21:57:28.316Z" }, + { url = "https://files.pythonhosted.org/packages/e5/67/5b3ac26b80adb20ea541c487f73730dc8fa107d632c998f25bbbab98fcda/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7996023b2ed59489ae4762256c8516df9820f751cf2c5da8ed2fb20ee50abab3", size = 1752321, upload-time = "2026-03-31T21:57:30.549Z" }, + { url = "https://files.pythonhosted.org/packages/88/06/e4a2e49255ea23fa4feeb5ab092d90240d927c15e47b5b5c48dff5a9ce29/aiohttp-3.13.5-cp311-cp311-win32.whl", hash = "sha256:77dfa48c9f8013271011e51c00f8ada19851f013cde2c48fca1ba5e0caf5bb06", size = 439069, upload-time = "2026-03-31T21:57:32.388Z" }, + { url = "https://files.pythonhosted.org/packages/c0/43/8c7163a596dab4f8be12c190cf467a1e07e4734cf90eebb39f7f5d53fc6a/aiohttp-3.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:d3a4834f221061624b8887090637db9ad4f61752001eae37d56c52fddade2dc8", size = 462859, upload-time = "2026-03-31T21:57:34.455Z" }, + { url = "https://files.pythonhosted.org/packages/be/6f/353954c29e7dcce7cf00280a02c75f30e133c00793c7a2ed3776d7b2f426/aiohttp-3.13.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:023ecba036ddd840b0b19bf195bfae970083fd7024ce1ac22e9bba90464620e9", size = 748876, upload-time = "2026-03-31T21:57:36.319Z" }, + { url = "https://files.pythonhosted.org/packages/f5/1b/428a7c64687b3b2e9cd293186695affc0e1e54a445d0361743b231f11066/aiohttp-3.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15c933ad7920b7d9a20de151efcd05a6e38302cbf0e10c9b2acb9a42210a2416", size = 499557, upload-time = "2026-03-31T21:57:38.236Z" }, + { url = "https://files.pythonhosted.org/packages/29/47/7be41556bfbb6917069d6a6634bb7dd5e163ba445b783a90d40f5ac7e3a7/aiohttp-3.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab2899f9fa2f9f741896ebb6fa07c4c883bfa5c7f2ddd8cf2aafa86fa981b2d2", size = 500258, upload-time = "2026-03-31T21:57:39.923Z" }, + { url = "https://files.pythonhosted.org/packages/67/84/c9ecc5828cb0b3695856c07c0a6817a99d51e2473400f705275a2b3d9239/aiohttp-3.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60eaa2d440cd4707696b52e40ed3e2b0f73f65be07fd0ef23b6b539c9c0b0b4", size = 1749199, upload-time = "2026-03-31T21:57:41.938Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d3/3c6d610e66b495657622edb6ae7c7fd31b2e9086b4ec50b47897ad6042a9/aiohttp-3.13.5-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:55b3bdd3292283295774ab585160c4004f4f2f203946997f49aac032c84649e9", size = 1721013, upload-time = "2026-03-31T21:57:43.904Z" }, + { url = "https://files.pythonhosted.org/packages/49/a0/24409c12217456df0bae7babe3b014e460b0b38a8e60753d6cb339f6556d/aiohttp-3.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2b2355dc094e5f7d45a7bb262fe7207aa0460b37a0d87027dcf21b5d890e7d5", size = 1781501, upload-time = "2026-03-31T21:57:46.285Z" }, + { url = "https://files.pythonhosted.org/packages/98/9d/b65ec649adc5bccc008b0957a9a9c691070aeac4e41cea18559fef49958b/aiohttp-3.13.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b38765950832f7d728297689ad78f5f2cf79ff82487131c4d26fe6ceecdc5f8e", size = 1878981, upload-time = "2026-03-31T21:57:48.734Z" }, + { url = "https://files.pythonhosted.org/packages/57/d8/8d44036d7eb7b6a8ec4c5494ea0c8c8b94fbc0ed3991c1a7adf230df03bf/aiohttp-3.13.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b18f31b80d5a33661e08c89e202edabf1986e9b49c42b4504371daeaa11b47c1", size = 1767934, upload-time = "2026-03-31T21:57:51.171Z" }, + { url = "https://files.pythonhosted.org/packages/31/04/d3f8211f273356f158e3464e9e45484d3fb8c4ce5eb2f6fe9405c3273983/aiohttp-3.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:33add2463dde55c4f2d9635c6ab33ce154e5ecf322bd26d09af95c5f81cfa286", size = 1566671, upload-time = "2026-03-31T21:57:53.326Z" }, + { url = "https://files.pythonhosted.org/packages/41/db/073e4ebe00b78e2dfcacff734291651729a62953b48933d765dc513bf798/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:327cc432fdf1356fb4fbc6fe833ad4e9f6aacb71a8acaa5f1855e4b25910e4a9", size = 1705219, upload-time = "2026-03-31T21:57:55.385Z" }, + { url = "https://files.pythonhosted.org/packages/48/45/7dfba71a2f9fd97b15c95c06819de7eb38113d2cdb6319669195a7d64270/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7c35b0bf0b48a70b4cb4fc5d7bed9b932532728e124874355de1a0af8ec4bc88", size = 1743049, upload-time = "2026-03-31T21:57:57.341Z" }, + { url = "https://files.pythonhosted.org/packages/18/71/901db0061e0f717d226386a7f471bb59b19566f2cae5f0d93874b017271f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:df23d57718f24badef8656c49743e11a89fd6f5358fa8a7b96e728fda2abf7d3", size = 1749557, upload-time = "2026-03-31T21:57:59.626Z" }, + { url = "https://files.pythonhosted.org/packages/08/d5/41eebd16066e59cd43728fe74bce953d7402f2b4ddfdfef2c0e9f17ca274/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:02e048037a6501a5ec1f6fc9736135aec6eb8a004ce48838cb951c515f32c80b", size = 1558931, upload-time = "2026-03-31T21:58:01.972Z" }, + { url = "https://files.pythonhosted.org/packages/30/e6/4a799798bf05740e66c3a1161079bda7a3dd8e22ca392481d7a7f9af82a6/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31cebae8b26f8a615d2b546fee45d5ffb76852ae6450e2a03f42c9102260d6fe", size = 1774125, upload-time = "2026-03-31T21:58:04.007Z" }, + { url = "https://files.pythonhosted.org/packages/84/63/7749337c90f92bc2cb18f9560d67aa6258c7060d1397d21529b8004fcf6f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:888e78eb5ca55a615d285c3c09a7a91b42e9dd6fc699b166ebd5dee87c9ccf14", size = 1732427, upload-time = "2026-03-31T21:58:06.337Z" }, + { url = "https://files.pythonhosted.org/packages/98/de/cf2f44ff98d307e72fb97d5f5bbae3bfcb442f0ea9790c0bf5c5c2331404/aiohttp-3.13.5-cp312-cp312-win32.whl", hash = "sha256:8bd3ec6376e68a41f9f95f5ed170e2fcf22d4eb27a1f8cb361d0508f6e0557f3", size = 433534, upload-time = "2026-03-31T21:58:08.712Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ca/eadf6f9c8fa5e31d40993e3db153fb5ed0b11008ad5d9de98a95045bed84/aiohttp-3.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:110e448e02c729bcebb18c60b9214a87ba33bac4a9fa5e9a5f139938b56c6cb1", size = 460446, upload-time = "2026-03-31T21:58:10.945Z" }, ] [[package]] @@ -389,15 +385,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9d/9e/78e59887cbf94116bdc890af7726ae264d55df14f1c777724c656e8a35fe/bolt11-2.1.1-py3-none-any.whl", hash = "sha256:fd4edb9e73e27bf5e017f47c97f7c6827b523fcf9cab152b123961ca78323e2d", size = 17102, upload-time = "2025-03-12T13:33:08.142Z" }, ] -[[package]] -name = "boltz-client" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/97/c0d3d0cb5a6f70511fc22549d661406fa41859971b3d8e807c9122525d8c/boltz_client-0.4.0.tar.gz", hash = "sha256:a3f5a6b637350267856e3ab680cd92158de720fa2d5805fc075e4583d020cb2a", size = 5305287, upload-time = "2026-05-18T11:29:50.38Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/2a/c99448f0e9789a6d4b6d25392c0eb17b1dedef7c16bafae9a91b2a92e592/boltz_client-0.4.0-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:ed0b520209cf1b05a8523002f5d8f26fa29c04d2faecc9cbde3621b4ddc417e6", size = 5310491, upload-time = "2026-05-18T11:29:48.187Z" }, -] - [[package]] name = "breez-sdk" version = "0.8.0" @@ -444,11 +431,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.5.20" +version = "2026.4.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, + { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, ] [[package]] @@ -630,55 +617,55 @@ wheels = [ [[package]] name = "coverage" -version = "7.14.1" +version = "7.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/7f/d0720730a397a999ffc0fd3f5bebef347338e3a47b727da66fbb228e2ff2/coverage-7.14.0.tar.gz", hash = "sha256:057a6af2f160a85384cde4ab36f0d2777bae1057bae255f95413cdd382aa5c74", size = 919489, upload-time = "2026-05-10T18:02:31.397Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/69/0d2ef01ff4b8fcecd4cba920d11e92fa4f96ae412441d3b56a90a258e69b/coverage-7.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e3680291c4a1d0dadfa84a2c459576a4af5133abb617905714339a0c73138cf", size = 219722, upload-time = "2026-05-26T20:38:14.002Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ae/9afdeaa31b9d9ce98124b6abf8bb49119bf71aecae04f8567c189d91299f/coverage-7.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5274669f37f2343635a347b91a60777621341ab3378e9c6ac9335eee704bddf", size = 220240, upload-time = "2026-05-26T20:38:17.424Z" }, - { url = "https://files.pythonhosted.org/packages/51/69/c998589871df7ea7dba865cc5ee32b5a3e1d47ba6c68ef91104c7c46fa5e/coverage-7.14.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfe5a5fec635799ef33428f1e5e61bafa45a92a96190ba731561ba558ccc214d", size = 246981, upload-time = "2026-05-26T20:38:19.266Z" }, - { url = "https://files.pythonhosted.org/packages/fc/10/1c7d04c13040dac531d21b712bbe08f902e6dd9b58f5d77875c4d030f8f2/coverage-7.14.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:62a9f70b52e0b5a95cfef4a5c5641b06983cadc5e538a3feeb5c00211f523ac2", size = 248812, upload-time = "2026-05-26T20:38:20.75Z" }, - { url = "https://files.pythonhosted.org/packages/c1/65/2a38a4607ef27cadcfbcee034dba5830ae2569f90144a0f4c7dbf47d30b0/coverage-7.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c18ebc343e15be53049b3a2dce38fe82d58f37e20ab9094b3a39c0aa4f6bb47", size = 250675, upload-time = "2026-05-26T20:38:22.159Z" }, - { url = "https://files.pythonhosted.org/packages/c9/a2/a446ed9752a4a59b79e0fb6cbb319f6facb2183045c0725462625e66f87e/coverage-7.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b84ffdf877644e7096aa936991efeed873f7f3df57b9cd001312b7668ab08550", size = 252590, upload-time = "2026-05-26T20:38:23.63Z" }, - { url = "https://files.pythonhosted.org/packages/9e/fd/e81fbd7ba752365546e9842b1cbdaad3d6919d2a522c590aef16a281ec5e/coverage-7.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e854312c4103f2ad4c0dc023b69b77ebfd2c89db5f86c4c94dc2353f9a92167e", size = 247691, upload-time = "2026-05-26T20:38:25.057Z" }, - { url = "https://files.pythonhosted.org/packages/53/35/f3c26fdaae9ea937d154ca4d372e5ea0a4167ff70d36c6074ac2eacb2f83/coverage-7.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c643734307300234fafa36bf2a040a7235f8f177ea1fd6ec1423aea6fb7b929f", size = 248716, upload-time = "2026-05-26T20:38:26.406Z" }, - { url = "https://files.pythonhosted.org/packages/2e/14/940b6c49551fd343e8507ee2b0ba7af5d0aa04ed5bf768285cb7c72a9884/coverage-7.14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84ac9499e48700399a5dd0ea7085b5091961fec52c68d66b4ec0d3cf7f4441b1", size = 246721, upload-time = "2026-05-26T20:38:28.282Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2c/40fc0634186c28292a662dff578866b3913983d6c375a3c2a74020938719/coverage-7.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7f02d09f70776579b926d889a4c9c235070a1f47c40458aeaca563fae5acfdb5", size = 250533, upload-time = "2026-05-26T20:38:29.753Z" }, - { url = "https://files.pythonhosted.org/packages/de/e3/2c26bf1e811f9df991ff2a9bdddebdd13ee0665d564df7d05979f9146297/coverage-7.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ce66d8e46da2bb5ee313a745cbd2e391d319176c1f7a9451bfcd3a2fb920859b", size = 246990, upload-time = "2026-05-26T20:38:31.516Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b0/060260ef56bd92363ebdce0c7095ce422b06e69aae71828efeca473ab1ca/coverage-7.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c912c259304cfb5ee584481cfb7ce1ff932b4d61e6c9140b8f19cb7b5ed82332", size = 247593, upload-time = "2026-05-26T20:38:33.065Z" }, - { url = "https://files.pythonhosted.org/packages/63/f3/501502046efeb0d6d94b5ca54941d95f1184183dd6bdb7f283985783bb4a/coverage-7.14.1-cp310-cp310-win32.whl", hash = "sha256:1238cb94638e610e972c60dac68e813f868dc7d6e982535270558443058d9d59", size = 222330, upload-time = "2026-05-26T20:38:35.36Z" }, - { url = "https://files.pythonhosted.org/packages/a0/5d/1bf99f2c558f128faf7906817ccbdb576ba815d3b41ce2ac1719b70a3663/coverage-7.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:fc459e5d73be2d6332fcfe8dbf3d8994671fe33c700f4565988ecfa511547253", size = 223261, upload-time = "2026-05-26T20:38:37.196Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d7/477ad149490e6cb849f28abea1dabb9c823cea72e7500c81b4240ce619c0/coverage-7.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:478b5bcd63c2e1357c5c7e16c070690df7b07f676b1c114d7b93e533c664309f", size = 219848, upload-time = "2026-05-26T20:38:38.715Z" }, - { url = "https://files.pythonhosted.org/packages/91/82/a5eb47257c50601bb7b9a9d2857c67b7a3a85ad74180eb2c98bb1fbe0ce5/coverage-7.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a24a81f9715ee42ef59a316cc11611c98fe23920f7c81861315c9f3ff4a230f4", size = 220354, upload-time = "2026-05-26T20:38:40.232Z" }, - { url = "https://files.pythonhosted.org/packages/43/8b/78419b5391a5cb706b6544390507e469d83ffc9a8248b02c4011aceb9365/coverage-7.14.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:196a13319ad88d6d8ef5ab489ec4f44ddde2143c0c7d5b27786f6c3ffd56a7e1", size = 250771, upload-time = "2026-05-26T20:38:41.782Z" }, - { url = "https://files.pythonhosted.org/packages/77/63/e77aaacd491182210d639636b7a8bba23ffffa9b82aa3762da9431855fa9/coverage-7.14.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d452fd08b5c72c5167c93e6867b5c08500bd40f2a21e1e854a500550b6cc36f", size = 252683, upload-time = "2026-05-26T20:38:43.305Z" }, - { url = "https://files.pythonhosted.org/packages/65/1c/a022e3cfbec2ac241640003cb3a817e161d9c7f5aa9b49173756cdc03204/coverage-7.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23bf7fa51ac02e07fc7c96849b82946da47ae862dc8f86d183b2a4864fc38129", size = 254791, upload-time = "2026-05-26T20:38:45.361Z" }, - { url = "https://files.pythonhosted.org/packages/61/d6/967e408aca4c1ceb88cb0cc677169110ae7f5995fb5eaf5fb1f5a1bb8f5d/coverage-7.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcaa50684dcaadfa599ac48f81103c756d791cfd85c97203d2217c593d48b860", size = 256748, upload-time = "2026-05-26T20:38:46.91Z" }, - { url = "https://files.pythonhosted.org/packages/b8/be/869188f7fe28638078ec479331ace6dc5f7b40b7153eb616f47ab79404d8/coverage-7.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ea1c034f95c9b056e856b794630b17f9fa3d57e4800ff1e503d3be0f9c9078c", size = 250907, upload-time = "2026-05-26T20:38:48.493Z" }, - { url = "https://files.pythonhosted.org/packages/07/aa/adb7d3b4278d690e68703abcd76ab1b948242e3668d921711551b78f9ddb/coverage-7.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e057326434e441306226fbeb5d1aaf14a2637efe97ba668306635835f32ad7", size = 252483, upload-time = "2026-05-26T20:38:50.074Z" }, - { url = "https://files.pythonhosted.org/packages/43/61/331c74103c62dcb0c4b9b3a0de9a61aca016208b0a90f109592a9f9ecc28/coverage-7.14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59baf88468dbc8d63b1887afd92bda52e40bb1561696e5819670601403810cec", size = 250545, upload-time = "2026-05-26T20:38:51.613Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b6/c5dae3c104d89be04828f61810e6b3473825482e4c288cc4ed04553e08ae/coverage-7.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d75f892b3ab73ba11cab5442cce7b3e168fd64162b16f0e1e0d09c508edef", size = 254310, upload-time = "2026-05-26T20:38:53.503Z" }, - { url = "https://files.pythonhosted.org/packages/ad/a1/2b9d5863e3b83c01ad8199e3c597802fbb3a9dc90b058885804c20296d31/coverage-7.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3a56abc20a472baf0304c455721bc601477440d28ecfde8a03dde79ede07e0df", size = 250266, upload-time = "2026-05-26T20:38:55.414Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5e/0e511fbdb269359be26fe678a1c3fa1f2aa2a01573cc3f54268c8d6d4797/coverage-7.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a3cb83d1552c0cd1b4906655b6a33fd4a8473229633a901c6b73bf86914dee9", size = 251174, upload-time = "2026-05-26T20:38:57.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/10/e55307b622b3dd9671cb321824502dc10f93e72f2802b9946159a8edadeb/coverage-7.14.1-cp311-cp311-win32.whl", hash = "sha256:10274a1fbeb8ec5d72966e17bb198a3104257aca4ac09d98667c5f8aca8c8548", size = 222354, upload-time = "2026-05-26T20:38:58.727Z" }, - { url = "https://files.pythonhosted.org/packages/71/cf/107421693cfb71e4f1ca5bf70443f64d4161878068d07a3e51c7ad21d17b/coverage-7.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:87ebdf787d4888e3f3f2d523eadc6e18c6d18c6d0eb173801a189641627fb37e", size = 223290, upload-time = "2026-05-26T20:39:00.413Z" }, - { url = "https://files.pythonhosted.org/packages/b8/1d/3e3644585eb29e9dafefb19555078529a4d7cce12bd21929664eea989277/coverage-7.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:dd34767fa19848d35659ffc0a75314f58c7af3f1cd87ec521e8292a1238398a3", size = 221953, upload-time = "2026-05-26T20:39:02.159Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b7/bdbb725ba02c5b42825b200c940f38b7a54fcad24627b7192f78f8110d76/coverage-7.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a06c76364a9360e33d6d23769aefdf7f66f38e2ffb60ceb1baaa4989d83b695c", size = 220022, upload-time = "2026-05-26T20:39:03.702Z" }, - { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, - { url = "https://files.pythonhosted.org/packages/de/72/de048c4a25e13bce59ac6a339351c10bdf2515e07459afcdaf04dc3143a2/coverage-7.14.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:84b535f00655ecafe1d929d1fb00ed5d6fa3051ea643ab2c161a3887b86f294b", size = 251888, upload-time = "2026-05-26T20:39:07.367Z" }, - { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, - { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, - { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, - { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, - { url = "https://files.pythonhosted.org/packages/99/6f/ca6ad067364b337ef997802115e7ecad2abd2248b05471464b0dea02b4d4/coverage-7.14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e471bc5769ff073b058cfadb0d736b56ce067c8560eabeb0da88462df98c23e7", size = 251803, upload-time = "2026-05-26T20:39:17.537Z" }, - { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, - { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, - { url = "https://files.pythonhosted.org/packages/34/62/70a9024672a5f6910517d9628c52c9afbdd3cf8f46426af52bb148a56fff/coverage-7.14.1-cp312-cp312-win32.whl", hash = "sha256:4a28fd227808366b196a75476dced2eb35b351d6766ba9c858dc93319e87f4f1", size = 222567, upload-time = "2026-05-26T20:39:24.868Z" }, - { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e", size = 223372, upload-time = "2026-05-26T20:39:26.603Z" }, - { url = "https://files.pythonhosted.org/packages/ae/ba/b44d472022f620d289d95fa830143235c0c36461c6f2437ea8d51e5481ed/coverage-7.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:99cd41ff91afd94896fea3bc002706b6ae4ce95727d06e4a0f39c0a8d8bd8b1a", size = 221989, upload-time = "2026-05-26T20:39:28.242Z" }, - { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, + { url = "https://files.pythonhosted.org/packages/59/9d/7c83ef51c3eb495f10010094e661833588b7709946da634c8b66520b97c7/coverage-7.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84c32d90bf4537f0e7b4dec9aaa9a938fb8205136b9d2ecf4d7629d5262dc075", size = 219668, upload-time = "2026-05-10T17:59:23.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/34/898546aefbd28f0af131201d0dc852c9e976f817bd7d5bfb8dc4e02863bb/coverage-7.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7c843572c605ab51cfdb5c6b5f2586e2a8467c0d28eca4bdef4ec70c5fecbd82", size = 220192, upload-time = "2026-05-10T17:59:26.095Z" }, + { url = "https://files.pythonhosted.org/packages/df/4a/b457c88aca72b0df13a98167ebd5d947135ccd9881ea88ce6a570e13aa9b/coverage-7.14.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0c451757d3fa2603354fdc789b5e58a0e327a117c370a40e3476ba4eabab228c", size = 246932, upload-time = "2026-05-10T17:59:27.806Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d9/92600e89486fd074c50f0117422b2c9592c3e144e2f25bd5ac0bc62bc7a0/coverage-7.14.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3fd43f0616e765ab78d069cf8358def7363957a45cee446d65c502dcfeea7893", size = 248762, upload-time = "2026-05-10T17:59:29.479Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e1/9ea1eb9c311da7f15853559dc1d9d82bef88ecd3e59fbeb51f16bc2ffa91/coverage-7.14.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:731e535b1498b27d13594a0527a79b0510867b0ad891532be41cb883f2128e20", size = 250625, upload-time = "2026-05-10T17:59:31.33Z" }, + { url = "https://files.pythonhosted.org/packages/a5/03/57afca1b8106f8549a5329139315041fe166d6099bd9381346b9430dfbd1/coverage-7.14.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c7492f2d493b976941c7ca050f273cbda2f43c381124f7586a3e3c16d1804fec", size = 252539, upload-time = "2026-05-10T17:59:32.692Z" }, + { url = "https://files.pythonhosted.org/packages/57/5e/2e9fc63c9928119c1dbae02222be51407d3e7ebac5811ebbda4af3557795/coverage-7.14.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc38367eaa2abb1b766ac333142bce7655335a73537f5c8b75aaa89c2b987757", size = 247636, upload-time = "2026-05-10T17:59:34.599Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e2/0b7898cda21041cc67546e19b80ba66cbbb47cbece52a76a5904de6a3aaf/coverage-7.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0a951308cde22cf77f953955a754d04dccb57fe3bb8e345d685778ed9fc1632a", size = 248666, upload-time = "2026-05-10T17:59:36.232Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/d33662a2fdaef23229c15921f39c84ec38441f3069ba26e134ed402c833b/coverage-7.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fab3877e4ebb06bd9d4d4d00ee53309ee5478e66873c66a382272e3ee33eb7ea", size = 246670, upload-time = "2026-05-10T17:59:38.029Z" }, + { url = "https://files.pythonhosted.org/packages/99/b2/533942c3bfbf6770b5c32d7f2ff029fe013dba31f3fe8b45cabbb250365e/coverage-7.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b812eb847b19876ebf33fb6c4f11819af05ab6050b0bfa1bc53412ae81779adb", size = 250484, upload-time = "2026-05-10T17:59:39.974Z" }, + { url = "https://files.pythonhosted.org/packages/d8/00/15acbad83a96de13c73831486c7627bfed73dfaec53b04e4a6315edf3fd8/coverage-7.14.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d9c8ef6ed820c433de075657d72dda1f89a2984955e58b8a75feb3f184250218", size = 246942, upload-time = "2026-05-10T17:59:41.659Z" }, + { url = "https://files.pythonhosted.org/packages/70/db/cef0228de493f2c740c760a9057a61d00c6849480073b70a75b87c7d4bab/coverage-7.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d128b1bba9361fbaaf6a19e179e6cfd6a9103ce0c0555876f72780acc93efd85", size = 247544, upload-time = "2026-05-10T17:59:43.471Z" }, + { url = "https://files.pythonhosted.org/packages/77/a0/d9ef8e148f3025c2ae8401d77cda1502b6d2a4d8102603a8af31460aedb6/coverage-7.14.0-cp310-cp310-win32.whl", hash = "sha256:65f267ca1370726ec2c1aa38bbe4df9a71a740f22878d2d4bf59d71a4cd8d323", size = 222285, upload-time = "2026-05-10T17:59:44.908Z" }, + { url = "https://files.pythonhosted.org/packages/85/c0/30c454c7d3cf47b2805d4e06f12443f5eece8a5d030d3b0350e7b74ecb49/coverage-7.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:b34ece8065914f938ed7f2c5872bb865336977a52919149846eac3744327267a", size = 223215, upload-time = "2026-05-10T17:59:46.779Z" }, + { url = "https://files.pythonhosted.org/packages/fc/e4/649c8d4f7f1709b6dbfc474358aa1bba02f67bcd52e2fec291a5014006cd/coverage-7.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a78e2a9d9c5e3b8d4ab9b9d28c985ea66fced0a7d7c2aec1f216e03a2011480", size = 219795, upload-time = "2026-05-10T17:59:48.198Z" }, + { url = "https://files.pythonhosted.org/packages/7f/8d/46692d24b3f395d4cbf17bfcc57136b4f2f9c0c0df864b0bddfc1d71a014/coverage-7.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1816c505187592dcd1c5a5f226601a549f70365fbd00930ac88b0c225b76bb4", size = 220299, upload-time = "2026-05-10T17:59:49.683Z" }, + { url = "https://files.pythonhosted.org/packages/12/c2/a40f5cb295bbcbb697a76947a56081c494c61950366294ee426ffe261099/coverage-7.14.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d8e1762f0e9cbc26ec315471e7b47855218e833cd5a032d706fbf43845d878c7", size = 250721, upload-time = "2026-05-10T17:59:51.494Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/202235eb5c3c14c212462cd91d61b7386bf8fc44bc7a77f4742d2a69174b/coverage-7.14.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9336e23e8bb3a3925398261385e2a1533957d3e760e91070dcb0e98bfa514eed", size = 252633, upload-time = "2026-05-10T17:59:53.244Z" }, + { url = "https://files.pythonhosted.org/packages/bb/80/5f596e8995785124ee191c42535664c5e62c65995b66f4ca21e28ae04c81/coverage-7.14.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd1169b2230f9cbe9c638ba38022ed7a2b1e641cc07f7cea0365e4be2a74980", size = 254743, upload-time = "2026-05-10T17:59:55.021Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6d/0d178825be2350f0adb27984d0aa7cf84bbdab201f6fb926b535d23a8f5f/coverage-7.14.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1bb3543b58fea74d2cd1abc4054cc927e4724687cb4560cd2ed88d2c7d820c0", size = 256700, upload-time = "2026-05-10T17:59:56.511Z" }, + { url = "https://files.pythonhosted.org/packages/19/5b/9e549c2f6e9dfea472adadba06c294e64735dabc2dd19015fac082095013/coverage-7.14.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a93bac2cb577ef60074999ed56d8a1535894398e2ed920d4185c3ec0c8864742", size = 250854, upload-time = "2026-05-10T17:59:57.94Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1c/b94f9f5f36396021ee2f62c5834b12e6a3d31f0bed5d6fc6d1c3caec087c/coverage-7.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5904abf7e18cddc463219b17552229650c6b79e061d31a1059283051169cf7d5", size = 252433, upload-time = "2026-05-10T17:59:59.688Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cb/d192cd8e1345eccabc32016f2d39072ecd10cb4f4b983ed8d0ebdeaf00dc/coverage-7.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:741f57cddc9004a8c81b084660215f33a6b597dbe62c31386b983ee26310e327", size = 250494, upload-time = "2026-05-10T18:00:01.953Z" }, + { url = "https://files.pythonhosted.org/packages/53/c5/aac9f460a41d835dbddef1d377f105f6ac2311d0f3c1588e9f51046d8813/coverage-7.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:664123feb0929d7affc135717dbd70d61d98688a08ab1e5ba464739620c6252d", size = 254261, upload-time = "2026-05-10T18:00:03.779Z" }, + { url = "https://files.pythonhosted.org/packages/23/aa/7af7c0081980a9cb3d289c5a435a4b7657dcecbd128e25c580e6a50389b5/coverage-7.14.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c83d2399a51bbec8429266905d33616f04bc5726b1138c35844d5fcd896b2e20", size = 250216, upload-time = "2026-05-10T18:00:05.262Z" }, + { url = "https://files.pythonhosted.org/packages/35/60/a4257538ce2f6b978aeb51870d6c4208c510928a03db7e0339bb625dccb7/coverage-7.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb2e855b87321259a037429288ae85216d191c74de3e79bf57cd2bc0761992c", size = 251125, upload-time = "2026-05-10T18:00:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ab/f91af47642ec1aa53490e835a95847168d9c77fc39aa58527604c051e145/coverage-7.14.0-cp311-cp311-win32.whl", hash = "sha256:731dc15b385ac52289743d476245b61e1a2927e803bef655b52bc3b2a75a21f3", size = 222300, upload-time = "2026-05-10T18:00:08.608Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f0/a71ddbd874431e7a7cd96071f0c331cfbbad07704833c765d24ffbab8a67/coverage-7.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:bfb0ed8ec5d25e93face268115d7964db9df8b9aae8edcde9ec6b16c726a7cc1", size = 223241, upload-time = "2026-05-10T18:00:10.746Z" }, + { url = "https://files.pythonhosted.org/packages/d8/6e/d9d312a5151a96cd110efee32efc3fc97b01ebd86203fe618ccb29cf4c92/coverage-7.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:7ebb1c6df9f78046a1b1e0a89674cd4bf73b7c648914eebcf976a57fd99a5627", size = 221908, upload-time = "2026-05-10T18:00:12.242Z" }, + { url = "https://files.pythonhosted.org/packages/09/1e/2f996b2c8415cbb6f54b0f5ec1ee850c96d7911961afb4fc05f4a89d8c58/coverage-7.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7ffd19fc8aed057fd686a17a4935eef5f9859d69208f96310e893e64b9b6ccf5", size = 219967, upload-time = "2026-05-10T18:00:13.756Z" }, + { url = "https://files.pythonhosted.org/packages/34/23/35c7aea1274aef7525bdd2dc92f710bdde6d11652239d71d1ec450067939/coverage-7.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:829994cfe1aeb773ca27bf246d4badc1e764893e3bfb98fff820fcecd1ca4662", size = 220329, upload-time = "2026-05-10T18:00:15.264Z" }, + { url = "https://files.pythonhosted.org/packages/75/cf/a8f4b43a16e194b0261257ad28ded5853ec052570afef4a84e1d81189f3b/coverage-7.14.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b4f07cf7edcb7ec39431a5074d7ea83b29a9f71fcfc494f0f40af4e65180420f", size = 251839, upload-time = "2026-05-10T18:00:17.16Z" }, + { url = "https://files.pythonhosted.org/packages/69/ff/6699e7b71e60d3049eb2bdcbc95ee3f35707b2b0e48f32e9e63d3ce30c08/coverage-7.14.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca3d9cf2c32b521bd9518385608787fa86f38daf993695307531822c3430ed67", size = 254576, upload-time = "2026-05-10T18:00:18.829Z" }, + { url = "https://files.pythonhosted.org/packages/22/ec/c936d495fcd67f48f03a9c4ad3297ff80d1f222a5df3980f15b34c186c21/coverage-7.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92af52828e7f29d827346b0294e5a0853fa206db77db0395b282918d41e28db9", size = 255690, upload-time = "2026-05-10T18:00:20.648Z" }, + { url = "https://files.pythonhosted.org/packages/5c/42/5af63f636cc62a4a2b1b3ba9146f6ee6f53a35a50d5cefc54d5670f60999/coverage-7.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b2bb6c9d7e769360d0f20a0f219603fd64f0c8f97de17ab25853261602be0fb", size = 257949, upload-time = "2026-05-10T18:00:22.28Z" }, + { url = "https://files.pythonhosted.org/packages/26/d3/a225317bd2012132a27e1176d51660b826f99bb975876463c44ea0d7ee5a/coverage-7.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c9ed6ef99f88fb8c14aa8e2bf8eb0fe55fa2edfea68f8675d78741df1a5ac0e", size = 252242, upload-time = "2026-05-10T18:00:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7f/9e65495298c3ea414742998539c37d048b5e81cc818fb1828cc6b51d10bf/coverage-7.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8231ade007f37959fbf58acc677f26b922c02eda6f0428ea307da0fd39681bf3", size = 253608, upload-time = "2026-05-10T18:00:25.588Z" }, + { url = "https://files.pythonhosted.org/packages/94/46/1522b524a35bdad22b2b8c4f9d32d0a104b524726ec380b2db68db1746f5/coverage-7.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d8b013632cc1ce1d09dbe4f32667b4d320ec2f54fc326ebeffcd0b0bcc2bb6c4", size = 251753, upload-time = "2026-05-10T18:00:27.104Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e9/cdf00d38817742c541ade405e115a3f7bf36e6f2a8b99d4f209861b85a2d/coverage-7.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1733198802d71ec4c524f322e2867ee05c62e9e75df86bdca545407a221827d1", size = 255823, upload-time = "2026-05-10T18:00:29.038Z" }, + { url = "https://files.pythonhosted.org/packages/38/fc/5e7877cf5f902d08a17ff1c532511476d87e1bea355bd5028cb97f902e79/coverage-7.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:72a305291fa8ee01332f1aaf38b348ca34097f6aa0b0ef627eef2837e57bbba5", size = 251323, upload-time = "2026-05-10T18:00:30.647Z" }, + { url = "https://files.pythonhosted.org/packages/18/9d/50f05a72dff8487464fdd4178dda5daed642a060e60afb644e3d45123559/coverage-7.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcaba850dd317c65423a9d63d88f9573c53b00354d6dd95724576cc98a131595", size = 253197, upload-time = "2026-05-10T18:00:32.211Z" }, + { url = "https://files.pythonhosted.org/packages/00/3f/6f61ffe6439df266c3cf60f5c99cfaa21103d0210d706a42fc6c30683ff8/coverage-7.14.0-cp312-cp312-win32.whl", hash = "sha256:5ac83957a80d0701310e96d8bec68cdcf4f90a7674b7d13f15a344315b41ab27", size = 222515, upload-time = "2026-05-10T18:00:33.717Z" }, + { url = "https://files.pythonhosted.org/packages/85/19/93853133df2cb371083285ef6a93982a0173e7a233b0f61373ba9fd30eb2/coverage-7.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:70390b0da32cb90b501953716302906e8bcce087cb283e70d8c97729f22e92b2", size = 223324, upload-time = "2026-05-10T18:00:35.172Z" }, + { url = "https://files.pythonhosted.org/packages/74/18/9f7fe62f659f24b7a82a0be56bf94c1bd0a89e0ae7ab4c668f6e82404294/coverage-7.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:91b993743d959b8be85b4abf9d5478216a69329c321efe5be0433c1a841d691d", size = 221944, upload-time = "2026-05-10T18:00:37.014Z" }, + { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" }, ] [package.optional-dependencies] @@ -688,48 +675,48 @@ toml = [ [[package]] name = "cryptography" -version = "48.0.1" +version = "48.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/12/45/870e7f4bef50e5f53b9f51d4428aee5290eedf58ba443f16b1ebb7ab8e66/cryptography-48.0.1.tar.gz", hash = "sha256:266f4ee051abb2f725b74ef8072b521ce1feacf685a3364fa6a6b45548db791a", size = 832989, upload-time = "2026-06-09T22:32:31.8Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/bc/ee4137cbbe105652c0ee4252792b78fc8e7afa4b8e61d9d5dc05a7f45731/cryptography-48.0.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3e4a1a3232eef2e6c732827d5722db29a0cc8b27af2a4d865b094cf954be9ca1", size = 8008324, upload-time = "2026-06-09T22:31:00.702Z" }, - { url = "https://files.pythonhosted.org/packages/d5/85/6379d42181bfc713094f081360fc5784d6c816b599d45e7f082502d173ce/cryptography-48.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:32143b24adb918f078134e1e230f1eb8cc04886b92c28b5f0041aaf3e5699225", size = 4696243, upload-time = "2026-06-09T22:32:33.446Z" }, - { url = "https://files.pythonhosted.org/packages/9c/87/c85d147b53323c7eb4d850920c8901377323c2a0ff8d79c262d4fee89aa2/cryptography-48.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0d27a5696721ef7a672b8c810f6aded391058e0b9486e63e6d93baf765da691", size = 4713235, upload-time = "2026-06-09T22:31:40.141Z" }, - { url = "https://files.pythonhosted.org/packages/79/58/67cbf8cf1ee7c54b439ca07bbecf8362c07afc11a3724fea70f745784add/cryptography-48.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eb86ce1af36fe65041b6db9a8bb064ee621a7e5fded0f80d475ec243477cd242", size = 4702323, upload-time = "2026-06-09T22:31:42.191Z" }, - { url = "https://files.pythonhosted.org/packages/89/c6/24266ac10c47f6cd2a865f4446062b466da1d1f10b27189eac00e61bf0c9/cryptography-48.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:b024e784ad6c077ee0147b35ea9cbfc1e34e1fd4c1dcca214c2794d73a12df08", size = 5300085, upload-time = "2026-06-09T22:31:58.703Z" }, - { url = "https://files.pythonhosted.org/packages/d2/bb/cc4b78784f97efc8c5874c2a9743708d172be6663024b34a0467885ae0c8/cryptography-48.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3752f2dbc8f07a30aad2932c986cea495b03bb554887828225da104f732852b6", size = 4746137, upload-time = "2026-06-09T22:31:31.01Z" }, - { url = "https://files.pythonhosted.org/packages/1f/52/0c44de3f5267f8fbe8e835138017522a333436166e406f0db9b9e6e3033f/cryptography-48.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:bd81490cd5801d755cf97bb68ac191f14b708470b1c7cf4580f669b9c9264cd8", size = 4333867, upload-time = "2026-06-09T22:32:28.096Z" }, - { url = "https://files.pythonhosted.org/packages/9a/2e/772d7adbfa931537bc401640b7cac9976bff689bda187833e5d63b428e49/cryptography-48.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:66fd0771e7b9c6dcd44cf1120690d2338d16d72795cf40cae2786a39eba65429", size = 4701805, upload-time = "2026-06-09T22:31:38.284Z" }, - { url = "https://files.pythonhosted.org/packages/f8/a3/b06844f303873493c963caf581c04df31c7035e0c1b0f02c4814d319ec80/cryptography-48.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:3fd2ca57062b241c856670b073487d2e86c4637937ca5601e48f97bf8e11fc8f", size = 5258461, upload-time = "2026-06-09T22:31:04.187Z" }, - { url = "https://files.pythonhosted.org/packages/9f/13/8b765e2e12b07c74941caadb9d1c8fdc006c4dfbf2b8f2d610519758954d/cryptography-48.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:0ee6ea481db1ab889cba043ec1eda17bb9c1ea79db6722f779c3667f9f70322f", size = 4745488, upload-time = "2026-06-09T22:32:30.07Z" }, - { url = "https://files.pythonhosted.org/packages/2e/aa/48972bce55049b32a94f4907eda4d75fa385aad8a39506cc2fc72196ecf0/cryptography-48.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f2ceef93cb096aa3c4cc4b5c94ca6131f9196d28c64d6111533402a9b2054d41", size = 4830256, upload-time = "2026-06-09T22:31:43.868Z" }, - { url = "https://files.pythonhosted.org/packages/47/a2/e5079a032fb85cf6005046ca92bbd78b0c82dad2b5751ab8c311659da06f/cryptography-48.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9bd3f92d76217892b15df84ca256c2c113d386fdda7a7d8691aeeced976507c6", size = 4979117, upload-time = "2026-06-09T22:31:05.845Z" }, - { url = "https://files.pythonhosted.org/packages/b7/a0/8f50cae9c74e718ed769d63ed5c74bd0ea830c9550a74629cebd1b9c7bc7/cryptography-48.0.1-cp311-abi3-win32.whl", hash = "sha256:b9a32b876490d66c8bcc9963ef220199569748434ab01a9d6aaeabf88e7f5158", size = 3304154, upload-time = "2026-06-09T22:32:16.845Z" }, - { url = "https://files.pythonhosted.org/packages/c5/69/0572c77dbace6fef72f33755bd52ea399c71367250d366237f8691826b9e/cryptography-48.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:39489bfca54c7a1f6b297efcd8bc608ab92d16c4ca631b0cad4da46724588b24", size = 3817138, upload-time = "2026-06-09T22:32:00.388Z" }, - { url = "https://files.pythonhosted.org/packages/ca/6c/00fa2a95997164c8b2072ce327c23d4ab20809ccc323ea5fab91e53a4bba/cryptography-48.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:4fdc69f8e4316bcf0c8c8ec1f26f285d12e8142d88d96c876a59a03be3f6ae67", size = 7987408, upload-time = "2026-06-09T22:32:20.777Z" }, - { url = "https://files.pythonhosted.org/packages/b0/d9/45f309a7e4e5f3f8f121d6d3be9e94024a7726ec598d6e08ae04edb2f04d/cryptography-48.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48fe40804d4caa2288f24e70ca8c64c42dd826da0ad7e4f1b41b2128d679e6c8", size = 4690196, upload-time = "2026-06-09T22:31:54.74Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9f/a1bc8bcc798811b8527eb374bbccf30a3f3e806829d967118222bf1125eb/cryptography-48.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:86be3b1b0b6bf09482fb50a979c508d2950ed95f5621ec77f4e385962006b83a", size = 4696782, upload-time = "2026-06-09T22:31:45.615Z" }, - { url = "https://files.pythonhosted.org/packages/66/c2/81a4fb4e4373c500bb526bc337ac5719dd31dd15b970b84a238168c6aa08/cryptography-48.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4ab0a343c807bbcd90c971cd1ecf072937cd01847a9e002bef88fb47ac6be577", size = 4696618, upload-time = "2026-06-09T22:31:11.564Z" }, - { url = "https://files.pythonhosted.org/packages/e5/0b/aa68b221dde92d09cb29a024ede17550ee21e77a404e59fc093c82bb51e1/cryptography-48.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9621de99d2da096006b629979efd8ae7eb2d8b822488d0c89ee4000c306c59b1", size = 5289970, upload-time = "2026-06-09T22:31:20.368Z" }, - { url = "https://files.pythonhosted.org/packages/78/13/fba657f958d2af66ea959a4ba01212632089249d34af1ae48054136344d7/cryptography-48.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:88c852a0ae366e262e5a1744b685e6a433dc8788dd2a277e418bf4904203609d", size = 4731873, upload-time = "2026-06-09T22:31:22.253Z" }, - { url = "https://files.pythonhosted.org/packages/4c/4c/9a964756d24a26b3e34dfcb16f961b89838786e6700b635b0d1e3adff4b6/cryptography-48.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:43c5835e2cb98c8733d86f57d6fc879b613f5c3478607281c3e36daffc6dd8a6", size = 4330804, upload-time = "2026-06-09T22:31:36.56Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0f/a10f3a6eb12950a10e3a874070283aa2dd5875b2bfd15fad8a3e17b3f13e/cryptography-48.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:fe0180af5bf9236518a087e35bf2d9a347d5f5f51e63c579d683ddff424e3d46", size = 4696217, upload-time = "2026-06-09T22:31:13.351Z" }, - { url = "https://files.pythonhosted.org/packages/f3/6f/5cd12f951165ea73ef85266775d97e4c763b2474ccfd816dd69d3a18d6f8/cryptography-48.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:b7a2d1a937a738a881737cec135a38bb61470589b17515b9f73f571d0ae10401", size = 5245252, upload-time = "2026-06-09T22:32:02.193Z" }, - { url = "https://files.pythonhosted.org/packages/68/ab/8aaa12e4516ec4464033ab79b6f3b592bd5a92102467c4ace8a0d970203f/cryptography-48.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b74ca3b8e5ecdd833bf6a002ca41b4793bb27fb8f1c06ffaf2643c9e9140e31b", size = 4731388, upload-time = "2026-06-09T22:32:04.019Z" }, - { url = "https://files.pythonhosted.org/packages/1b/24/50027ea4dca85ec1f40688f3c24fb32ccacd520583c9592c3cc95628e6fb/cryptography-48.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2c37f2461406063b417837f5f3daab668652acd82423efcd7f0a9f04be972de1", size = 4824186, upload-time = "2026-06-09T22:32:18.707Z" }, - { url = "https://files.pythonhosted.org/packages/52/41/04cb5eb17085ade6f50cc611fb657df6a0f5885350de8764ece89c050197/cryptography-48.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:86fe77abb1bd87afb251d4d02ada7ecf53a32cee9b67d976abb2e45a13297475", size = 4964539, upload-time = "2026-06-09T22:31:18.793Z" }, - { url = "https://files.pythonhosted.org/packages/36/bf/ed70785c496e89d7e73b7cda2d21f2447fd6d4e821714b8d04ff217fed92/cryptography-48.0.1-cp39-abi3-win32.whl", hash = "sha256:6b2c0c3e6ccf3ade7750f836ef3ee36eea250cc467d45c256895573ac08cc6f1", size = 3282307, upload-time = "2026-06-09T22:30:53.162Z" }, - { url = "https://files.pythonhosted.org/packages/b3/ff/371ea7d252656ee1eb6d83eeeef3d1d0c6baf1d6497687d081ea03814670/cryptography-48.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:9a49ca6c81417f6a5edb50375a60cccdd70fa0a91a5211829dbea74eba94d2ac", size = 3793408, upload-time = "2026-06-09T22:32:15.191Z" }, - { url = "https://files.pythonhosted.org/packages/a9/d3/eb4e394e587341fdad09a09101fa76478ead3a78b0ad63e55c22f0d75c02/cryptography-48.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:08a597acce1ff37f347400087776599e2348a3a8bc53b44120e463cd274efe4a", size = 3951747, upload-time = "2026-06-09T22:31:23.871Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4a/3f43451b4f858bfceaaaffc649e6e787e8d4fb332a1d443af39ab02cc8f1/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:735824ec41b7f74a7c45fb1591349333e4c696cb6c044e5f46356e560143e4cd", size = 4641226, upload-time = "2026-06-09T22:31:02.532Z" }, - { url = "https://files.pythonhosted.org/packages/73/4e/855584c2c23b09e4ce2d3b9c30e983e679cd60b068c513c6bbdb91e11782/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:92a46e1d638daa264ba2971c0b0489c9409787943efae4d60ffda3d091ef832c", size = 4668958, upload-time = "2026-06-09T22:32:06.213Z" }, - { url = "https://files.pythonhosted.org/packages/42/3b/d35750e41d803d1e516fd6d6011f065424924da7af1748cef4cc9cb3ede1/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:7e234ac052af99f2700826a5c29ea99d9c1b1f80341cde62d11c8154dc8e0bd9", size = 4640793, upload-time = "2026-06-09T22:32:26.331Z" }, - { url = "https://files.pythonhosted.org/packages/ca/aa/cdb7181fe865285e87e96825aaab239400f1de0c3bfba9bd9769b79f1a92/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:33842cf0888951cef5bc7ac724ab844a42044c1727b967b7f8997289a0464f92", size = 4668505, upload-time = "2026-06-09T22:31:27.534Z" }, - { url = "https://files.pythonhosted.org/packages/5d/8c/ce3823c06c2804f194f9e64f0d67fa3f4094a39f2bb1a990cd03603af8fc/cryptography-48.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6184ca7b174f28d7c703f1290d4b297217c45355f77a98f67e9b7f14549ac54a", size = 3742204, upload-time = "2026-06-09T22:31:34.773Z" }, + { url = "https://files.pythonhosted.org/packages/df/3d/01f6dd9190170a5a241e0e98c2d04be3664a9e6f5b9b872cde63aff1c3dd/cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6", size = 8001587, upload-time = "2026-05-04T22:57:36.803Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" }, + { url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" }, + { url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" }, + { url = "https://files.pythonhosted.org/packages/04/70/e5a1b41d325f797f39427aa44ef8baf0be500065ab6d8e10369d850d4a4f/cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4", size = 3294868, upload-time = "2026-05-04T22:58:06.467Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ac/8ac51b4a5fc5932eb7ee5c517ba7dc8cd834f0048962b6b352f00f41ebf9/cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7", size = 3817107, upload-time = "2026-05-04T22:58:08.845Z" }, + { url = "https://files.pythonhosted.org/packages/f2/63/61d4a4e1c6b6bab6ce1e213cd36a24c415d90e76d78c5eb8577c5541d2e8/cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86", size = 7983482, upload-time = "2026-05-04T22:58:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" }, + { url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" }, + { url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" }, + { url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" }, + { url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" }, + { url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" }, + { url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" }, + { url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/b8/23/6e6f32143ab5d8b36ca848a502c4bcd477ae75b9e1677e3530d669062578/cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd", size = 3279117, upload-time = "2026-05-04T22:59:12.019Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9a/0fea98a70cf1749d41d738836f6349d97945f7c89433a259a6c2642eefeb/cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8", size = 3792100, upload-time = "2026-05-04T22:59:14.884Z" }, + { url = "https://files.pythonhosted.org/packages/be/d2/024b5e06be9d44cb021fb0e1a03d34d63989cf56a0fe62f3dfbab695b9b4/cryptography-48.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:84cf79f0dc8b36ac5da873481716e87aef31fcfa0444f9e1d8b4b2cece142855", size = 3950391, upload-time = "2026-05-04T22:59:17.415Z" }, + { url = "https://files.pythonhosted.org/packages/bc/17/3861e17c56fa0fd37491a14a8673fdb77c57fc5693cafe745ea8b06dba75/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:fdfef35d751d510fcef5252703621574364fec16418c4a1e5e1055248401054b", size = 4637126, upload-time = "2026-05-04T22:59:20.197Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0a/7e226dbff530f21480727eb764973a7bff2b912f8e15cd4f129e71b56d1d/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0890f502ddf7d9c6426129c3f49f5c0a39278ed7cd6322c8755ffca6ee675a13", size = 4667270, upload-time = "2026-05-04T22:59:22.647Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f2/5a72274ca9f1b2a8b44a662ee0bf1b435909deb473d6f97bcd035bcdbc71/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:ecde28a596bead48b0cfd2a1b4416c3d43074c2d785e3a398d7ec1fc4d0f7fbb", size = 4636797, upload-time = "2026-05-04T22:59:24.912Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e1/48cedb2fe63626e91ded1edad159e2a4fb8b6906c4425eb7749673077ce7/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:4defde8685ae324a9eb9d818717e93b4638ef67070ac9bc15b8ca85f63048355", size = 4666800, upload-time = "2026-05-04T22:59:27.474Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ca/7e8365deec19afb2b2c7be7c1c0aa8f99633b54e90c570999acda93260fc/cryptography-48.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:db63bf618e5dea46c07de12e900fe1cdd2541e6dc9dbae772a70b7d4d4765f6a", size = 3739536, upload-time = "2026-05-04T22:59:29.61Z" }, ] [[package]] @@ -1088,11 +1075,11 @@ wheels = [ [[package]] name = "idna" -version = "3.16" +version = "3.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1a/88/bcf9709822fe69d02c2a6a77956c98ce6ea8ca8767a9aadcedc7eb6a2390/idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d", size = 203770, upload-time = "2026-05-22T00:16:18.781Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5", size = 74165, upload-time = "2026-05-22T00:16:16.698Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, ] [[package]] @@ -1127,59 +1114,59 @@ wheels = [ [[package]] name = "jiter" -version = "0.15.0" +version = "0.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/b5/55f06bb281d92fb3cc86d14e1def2bd908bb77693183e7cb1f5a3c388b0c/jiter-0.15.0.tar.gz", hash = "sha256:4251acc80e2b7c9b7b8823456ea0fceeb0734dac2df7636d3c711b38476b5a76", size = 166640, upload-time = "2026-05-19T10:09:48.361Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/c1/0cddc6eb17d4c53a99840953f95dd3accdc5cfc7a337b0e9b26476276be9/jiter-0.14.0.tar.gz", hash = "sha256:e8a39e66dac7153cf3f964a12aad515afa8d74938ec5cc0018adcdae5367c79e", size = 165725, upload-time = "2026-04-10T14:28:42.01Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/da/76a2c7e510ba15fe323d9509c223ab272da79ea59f54488f4a78da6426db/jiter-0.15.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:edebcf7d1f601199084bb6e844d7dc67e03e04f6ac786b0332d616635c4ff7a4", size = 310849, upload-time = "2026-05-19T10:06:51.944Z" }, - { url = "https://files.pythonhosted.org/packages/5d/8e/827be942883a4dc0862c48626ff41af3320b1902d136a0bf4b9041f2c567/jiter-0.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f924585cdacf631cd382b657966847bb537bf9ed0a6f9b991da5f05a631480f", size = 314991, upload-time = "2026-05-19T10:06:53.522Z" }, - { url = "https://files.pythonhosted.org/packages/6d/38/be2832be361ba1b9517c76f46d30b64e985be1dd43c974f4c3a4b1844436/jiter-0.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abbf258599526ad0326fe51e252e24f2bd6f24f1852681b4b78feda3808f1d18", size = 340843, upload-time = "2026-05-19T10:06:55.071Z" }, - { url = "https://files.pythonhosted.org/packages/6d/d8/90f01fb83c0c7ba509303ec93e32a308fbfa167d264860b01c0fd0dbbd06/jiter-0.15.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c468136b8bd6bb18c8786e4236a1fa27362f24cb23450ba0cb204ab379b8e6f", size = 365116, upload-time = "2026-05-19T10:06:56.893Z" }, - { url = "https://files.pythonhosted.org/packages/91/38/94593d34f8c67a0b6f6cbc027f016ffa9780b3a858a7a86f6fd7a15bcc1e/jiter-0.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05906b93d72f03339e6bb7cf8dc10ebda64a0266126eed6beba79e20abcf5fd4", size = 457970, upload-time = "2026-05-19T10:06:58.707Z" }, - { url = "https://files.pythonhosted.org/packages/df/04/d79962dd49d00c97e2a9b4cacea1947904d02135936960351f9a96d4c1a6/jiter-0.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30ce785d2adb8e32c3f7741442370a74834ec4c01f3c48f0750227a0b4ef27d6", size = 375744, upload-time = "2026-05-19T10:07:00.471Z" }, - { url = "https://files.pythonhosted.org/packages/c3/2e/5d37abe2be0e819c21e2338bebd410e481763ce526a9138c8c3652fa0123/jiter-0.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fd73e3da91a0a722d67165e849ce2cdc10de0e0d48738c142be8c6c5f310f4c", size = 349609, upload-time = "2026-05-19T10:07:01.829Z" }, - { url = "https://files.pythonhosted.org/packages/7a/90/98768ad2ed90c1fda15d64157de2dfbf73c1c074d4b1bfaca915480bc7cf/jiter-0.15.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:ceb8fc27d38793f9c97149be8302720c5b22e5c195a37bf2c45dc36c4600a512", size = 354366, upload-time = "2026-05-19T10:07:03.587Z" }, - { url = "https://files.pythonhosted.org/packages/d6/c4/fbfb806209f1fe4b7dccdfb07bc62bb044300734a945b06fd64db446ef6a/jiter-0.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d726e3ceeb337191324b49de298142f27c3ad10886341555d1d5315b5f252c6a", size = 393519, upload-time = "2026-05-19T10:07:05.08Z" }, - { url = "https://files.pythonhosted.org/packages/37/1c/b9c257cd70cb453b6d10f3ebf0402cdb11669ab455389096f09839670290/jiter-0.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2c8aea7781d2a372227871de4e1a1332aa96f5a89fd76c5e835dafdbad102887", size = 519952, upload-time = "2026-05-19T10:07:06.589Z" }, - { url = "https://files.pythonhosted.org/packages/a9/1a/aa85027db7ab15829c12feebbc33b404f53fc399bd559d85fd0d6365ff0d/jiter-0.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cf4bd113a69c0a740e27cb962ce10630c36d2b8f59d759a651b955ee9d18a823", size = 550770, upload-time = "2026-05-19T10:07:08.228Z" }, - { url = "https://files.pythonhosted.org/packages/d4/54/8c3f65c8a5687925e84708f19d63f7f37d28e2b86a48d951702ad94424d8/jiter-0.15.0-cp310-cp310-win32.whl", hash = "sha256:d92a5cd21fdb083931d546c207aa29633787c5dc5b02daab2d32b843f88a2c53", size = 209303, upload-time = "2026-05-19T10:07:10.006Z" }, - { url = "https://files.pythonhosted.org/packages/d5/72/0528a1eb9f42dd2d8228a0711458628f35924d131f623eaebc35fd23d3d4/jiter-0.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:e58585a58209d72691ce2d62a9147445f5a87beb0bde97fde284c96ae392a3d1", size = 200404, upload-time = "2026-05-19T10:07:11.426Z" }, - { url = "https://files.pythonhosted.org/packages/e4/13/daa722f5765c393576f466378f9dfd29d77c9bed939e0688f96afa3601ea/jiter-0.15.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0f862193b8696249d22ec433e85fd2ab0ad9596bc3e45e6c0bc55e8aeba97be2", size = 310899, upload-time = "2026-05-19T10:07:12.89Z" }, - { url = "https://files.pythonhosted.org/packages/7f/82/2d2551829b082f4b6d82b9f939b031fb808a10aab1ec0664f82e150bb9a2/jiter-0.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1303d4d68a9b051ea90502402063ecf3807da00ad2affa19ca1ae3b90b3c5f67", size = 314963, upload-time = "2026-05-19T10:07:14.539Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0a/8b1a51466f7fe9f31dbe4bc7e0ca848674f9825e0f737b929b97e8c60aa7/jiter-0.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:392b8ab019e5502d08aff85c6272209c24bc2cbe706ea82a56368f524236614a", size = 341730, upload-time = "2026-05-19T10:07:15.869Z" }, - { url = "https://files.pythonhosted.org/packages/f6/2a/e71dea19822e2e404e83992a08c1d6b9b617bb944f28c9c2fbd85d02c91e/jiter-0.15.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:773b6eb282ce11ee19f05f6b2d4404fa308e5bbd353b0b80a0262caad6db2cd7", size = 366214, upload-time = "2026-05-19T10:07:17.259Z" }, - { url = "https://files.pythonhosted.org/packages/c4/59/97e1fa539d124a509a00ab7f669289d1c1d236ecabf12948a18f16c91082/jiter-0.15.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2c0c44d569ce0f2850f5c926f8caeb5f245fbc84475aeb36efccc2103e6dbd", size = 459527, upload-time = "2026-05-19T10:07:18.741Z" }, - { url = "https://files.pythonhosted.org/packages/d1/7a/4a68d331aef8cf2e2393c14a3aacb635c62aa86071b0229899fb5baaa907/jiter-0.15.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:032396229564bca02440396bd327710719f724f5e7b7e9f7a8eb3faa4a2c2281", size = 375451, upload-time = "2026-05-19T10:07:20.208Z" }, - { url = "https://files.pythonhosted.org/packages/7b/7e/1c445c2b6f0e30a274dc8082e0c3c7825411cce80d726bccd697c98cc8d3/jiter-0.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d37768fce7f88dd2a8c6091f2325dea27d30d30d5c6e7a1c0f0af77723b708", size = 349428, upload-time = "2026-05-19T10:07:22.372Z" }, - { url = "https://files.pythonhosted.org/packages/00/94/e20d38984fc17a636371bffd2ae0f698124fdc8e75ef969cd2da6ba7cea7/jiter-0.15.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:2c9cb907439d20bd0c7d7565ca01ee52234203208433749bae5b516907526928", size = 355405, upload-time = "2026-05-19T10:07:23.916Z" }, - { url = "https://files.pythonhosted.org/packages/94/fa/4d09f814779d0ea80a28ed8e4c6662ec9a4a8ecef0ac52190ebac6262d14/jiter-0.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9100ddbec09741cc66feb0fc6773f8bdbd0e3c345689368f260082ff85dcc0cd", size = 393688, upload-time = "2026-05-19T10:07:25.854Z" }, - { url = "https://files.pythonhosted.org/packages/54/9d/8eb5d4fb8bf7e93a75964a5da71a75c67c864baf7fa3f98598187b3c7e57/jiter-0.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ae1b0d82ac2d987f9ea512b1c9adfcc71a28de3dea3a6039b54d76cffda9901e", size = 520853, upload-time = "2026-05-19T10:07:27.303Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2c/5e07874e59e623a943a0acf1552a80d05b70f31b402287a8fc6d7ec634c7/jiter-0.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8020c99ec13a7db2b6f96cbe82ef4721c88b426a4892f27478044af0284615ef", size = 551016, upload-time = "2026-05-19T10:07:28.846Z" }, - { url = "https://files.pythonhosted.org/packages/22/ed/d2d34422143474cadc15b60d482b1c35683dbc5c63c24346ddd0df09bcaf/jiter-0.15.0-cp311-cp311-win32.whl", hash = "sha256:42bfb257930800cf43e7c62c832402c704ab60797c992faf88d20e903eac8f32", size = 209518, upload-time = "2026-05-19T10:07:30.431Z" }, - { url = "https://files.pythonhosted.org/packages/1d/7d/52778b930e5cc3e52a37d950b1c10494244308b4329b25a0ff0d88303a81/jiter-0.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:860a74063284a2ae9bfedd694f299cc2c68e2696c5f3d440cc9d18bb81b9dd04", size = 200565, upload-time = "2026-05-19T10:07:32.125Z" }, - { url = "https://files.pythonhosted.org/packages/3b/4f/d9b4067feb69b3fa6eb0488e1b59e2ad5b463fe39f59e527eab2aca00bb0/jiter-0.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:37a10c377ce3a4a85f4a67f28b7afe093154cde77eaf248a72e856aa08b4d865", size = 195488, upload-time = "2026-05-19T10:07:33.846Z" }, - { url = "https://files.pythonhosted.org/packages/44/53/4f6bddbcde3c71e56d0aa1337ec95950f3d27dd4153e25aadf0feac71751/jiter-0.15.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0e90a1c315a0226ec822d973817967f9223b7701546c8c2a7913e7ab0926294d", size = 308793, upload-time = "2026-05-19T10:07:35.25Z" }, - { url = "https://files.pythonhosted.org/packages/01/84/c01099b59a285a1ebba64ae93f62bfa036675340fd1b0045ae65890a0442/jiter-0.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8c9004af7c8d67cce7f1aae1026fb55607f4aa600710d08ede3a3ce4aeefe7e0", size = 309570, upload-time = "2026-05-19T10:07:36.919Z" }, - { url = "https://files.pythonhosted.org/packages/58/64/8fb7f9d45bb98190355454cd04dad8d8f27223d6bd52f83af07f637168a6/jiter-0.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c210f8b35dc6f30aafd4b4365ca89b9d1189f21ab49b8e68fa6322a847aef138", size = 336783, upload-time = "2026-05-19T10:07:38.694Z" }, - { url = "https://files.pythonhosted.org/packages/c3/b6/f5739011d009b3a30f6a53c5240979030ba29ae46a8c67e3a15759f7c37d/jiter-0.15.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f30bae8bc1c2d613e28e5af3e8cceb09b742f1c8a8a5f839fb67afaffc03b61", size = 363555, upload-time = "2026-05-19T10:07:40.832Z" }, - { url = "https://files.pythonhosted.org/packages/e5/12/98a9d9f766665e8a3b6252454e17cb0c464606a28cf2fa09399b003345fa/jiter-0.15.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c60e71b6d10cfc284c9bf36bd885e8d44c46f688ce50aa91b5edd90181dea687", size = 452255, upload-time = "2026-05-19T10:07:42.62Z" }, - { url = "https://files.pythonhosted.org/packages/e8/d5/60f972840f79c5e7544fce567c56f1e4e50468f996baba3e78d823dd62a6/jiter-0.15.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ab068bce62a45aa3e7367eceaffb5dde60b7eb853be8dece45132e3d0ff4879", size = 373559, upload-time = "2026-05-19T10:07:44.201Z" }, - { url = "https://files.pythonhosted.org/packages/ee/cf/d46ef1234ba335aabc2f013210db8e0821a22f5e644a2e9449df199ecc23/jiter-0.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa248c9eb220197d363f688818dac2fd4b2f0cd7d843ca7105d652034823427d", size = 346055, upload-time = "2026-05-19T10:07:46.005Z" }, - { url = "https://files.pythonhosted.org/packages/f0/63/4d2749d8d54d230bad9b3a6b0d00cc28c6ff6b2fdffc26a8ccf76cc5a974/jiter-0.15.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2a77aadd57cac1682e4401a72724d2796d89a4ba129b1a5812aa94ee480826eb", size = 351406, upload-time = "2026-05-19T10:07:47.855Z" }, - { url = "https://files.pythonhosted.org/packages/d9/b9/9965b990035d8773328e0a8c8b457a87bf2b19f6c4126d9d99296be5d16a/jiter-0.15.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ae901f3a55bfafdde31d289590fa25e3245735a2b1e8c7cc15871710a002871", size = 389357, upload-time = "2026-05-19T10:07:49.665Z" }, - { url = "https://files.pythonhosted.org/packages/2d/55/9ddf903deda1413e87fed792f416b7123daee5b8efbad6a202a7421c36a5/jiter-0.15.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f0b271b462769543716f92d3a4f90527df6ef5ed05ee95ec4137f513e21e1b77", size = 517263, upload-time = "2026-05-19T10:07:51.537Z" }, - { url = "https://files.pythonhosted.org/packages/e8/76/a0c40ad064d3a20a4fde231e35d56e9a01ce82164278180e82d5daf85469/jiter-0.15.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2fb6a5d26af81fc0f00f9360a891e05cf755e149bba391c4d563adc54812973d", size = 548646, upload-time = "2026-05-19T10:07:53.196Z" }, - { url = "https://files.pythonhosted.org/packages/23/4f/eca9b954942916ba2f453891b8593ab444cd872396fe66a3936616f236f3/jiter-0.15.0-cp312-cp312-win32.whl", hash = "sha256:c2f6bb8b5216ab9e7873bc08b5d7bef2b8abbb578a3069bf1cd14a45d71d771d", size = 206427, upload-time = "2026-05-19T10:07:55.307Z" }, - { url = "https://files.pythonhosted.org/packages/95/bf/8ead82a87495149542748e828d153fd232a512a22c83b02c4815c1a9c7d8/jiter-0.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:40b2c7e92c44a84d748d21706c68dc6ff8161d80b59c99d774721a0d2317d7c7", size = 197300, upload-time = "2026-05-19T10:07:56.651Z" }, - { url = "https://files.pythonhosted.org/packages/f4/e4/9b8a78fb2d894471bc344e37f1949bdd784bd914d031dba0ba3a40c71dd7/jiter-0.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:cc0bc345cf2df9d1c00ac443f50d543c1ccfa8b0422cb85b1ab70d681c0b255b", size = 192702, upload-time = "2026-05-19T10:07:58.307Z" }, - { url = "https://files.pythonhosted.org/packages/65/43/1fc62172aa98b50a7de9a25554060db510f85c89cfbed0dfe13e1907a139/jiter-0.15.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:411fa4dfa5a7ae3d11491027ffb9beadec3996010a986862db70d91abba1c750", size = 305585, upload-time = "2026-05-19T10:09:35.995Z" }, - { url = "https://files.pythonhosted.org/packages/e8/c4/dd58fcd9e2df83666e5c1c1347bef58ce919cd8efc3ffa38aeea62ce493b/jiter-0.15.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:2b0074e2f56eb2dacca1689760fd2852a068f85a0547a157b82cb4cafeb6768b", size = 306936, upload-time = "2026-05-19T10:09:37.435Z" }, - { url = "https://files.pythonhosted.org/packages/39/86/b695e16f1180c07f43ea98e73ecd21cf63fa2e1b0c1103739013784d11ae/jiter-0.15.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:913d02d29c9606643418d9ccfc3b72492ab25a6bf7889934e09a3490f8d3438b", size = 342453, upload-time = "2026-05-19T10:09:39.294Z" }, - { url = "https://files.pythonhosted.org/packages/34/56/55d76614af37fe3f22a3347d1e410d2a15da581997cb2da499a625000bb5/jiter-0.15.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b15d3ec9b0449c40e85319bdb4caa8b77ab526e74f5532ed94bec15e2f66822c", size = 345606, upload-time = "2026-05-19T10:09:40.727Z" }, - { url = "https://files.pythonhosted.org/packages/73/38/505941b2b092fd5bbbd60a52a880db1173f1690ae6751bed3af1c9ddcb4e/jiter-0.15.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:631f13a3d04e97d4e083993b10f4b99530e3a10d953e2eb5e196b7dc7f812ce0", size = 303769, upload-time = "2026-05-19T10:09:42.203Z" }, - { url = "https://files.pythonhosted.org/packages/e7/95/a06692b29e77473f286e1ec1f426d3ca44d7b5843be8ad21d7a5f3fcdcc0/jiter-0.15.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:b6c0ffae686c39bf3737be60793783267628783ea42545632c10b291105aee45", size = 305128, upload-time = "2026-05-19T10:09:43.657Z" }, - { url = "https://files.pythonhosted.org/packages/23/85/7270d7ad41d6061a25b950c6bf91d638bd9aacb113200a8c8d57a055fd67/jiter-0.15.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d54fb5b31dea401a41af3f8a7d2512e9b6a6a005491e6166c7e4ffab9639a9c", size = 340459, upload-time = "2026-05-19T10:09:45.452Z" }, - { url = "https://files.pythonhosted.org/packages/c8/8d/302cb2057b7513327b4d575cff6b1d066ee6431a5357fc3f8867cd684406/jiter-0.15.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d5d6090cdc1b7c9e780dfb04949a990adb1e301a2fc0bbcee7de4638d33f9a", size = 344469, upload-time = "2026-05-19T10:09:46.864Z" }, + { url = "https://files.pythonhosted.org/packages/64/2e/a9959997739c403378d0a4a3a1c4ed80b60aeace216c4d37b303a9fc60a4/jiter-0.14.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:02f36a5c700f105ac04a6556fe664a59037a2c200db3b7e88784fac2ddf02531", size = 316927, upload-time = "2026-04-10T14:25:40.753Z" }, + { url = "https://files.pythonhosted.org/packages/27/72/b6de8a531e0adbadd839bec301165feb1fccf00e9ff55073ba2dd20f0043/jiter-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41eab6c09ceffb6f0fe25e214b3068146edb1eda3649ca2aee2a061029c7ba2e", size = 321181, upload-time = "2026-04-10T14:25:42.621Z" }, + { url = "https://files.pythonhosted.org/packages/db/d8/2040b9efa13c917f855c40890ae4119fe02c25b7c7677d5b4fa820a851fc/jiter-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cf4d4c109641f9cfaf4a7b6aebd51654e405cd00fa9ebbf87163b8b97b325aa", size = 347387, upload-time = "2026-04-10T14:25:44.212Z" }, + { url = "https://files.pythonhosted.org/packages/49/62/655c0ad5ce6a8e90f9068c175b8a236877d753e460762b3183c136db1c5b/jiter-0.14.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80c7b41a628e6be2213ad0ece763c5f88aa5ee003fa394d58acaaee1f4b8342", size = 373083, upload-time = "2026-04-10T14:25:45.55Z" }, + { url = "https://files.pythonhosted.org/packages/f1/66/549c40fa068f08710b7570869c306a051eb67a29758bd64f4114f730554c/jiter-0.14.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb3dbf7cc0d4dbe73cce307ebe7eefa7f73a7d3d854dd119ea0c243f03e40927", size = 463639, upload-time = "2026-04-10T14:25:47.452Z" }, + { url = "https://files.pythonhosted.org/packages/25/2f/97a32a05fed14ed58a18e181fdfb619e05163f3726b54ee6080ec0539c09/jiter-0.14.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7054adcdeb06b46efd17b5734f75817a44a2d06d3748e36c3a023a1bb52af9ec", size = 380735, upload-time = "2026-04-10T14:25:49.305Z" }, + { url = "https://files.pythonhosted.org/packages/2a/3b/4347e1d6c2a973d653bbb7a2d671a2d2426e54b52ba735b8ff0d0a29b75c/jiter-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d597cd1bf6790376f3fffc7c708766e57301d99a19314824ea0ccc9c3c70e1e2", size = 358632, upload-time = "2026-04-10T14:25:50.931Z" }, + { url = "https://files.pythonhosted.org/packages/ef/24/ca452fbf2ea33548ed30ce68a39a50442d3f7c9bf0704a7af958a930c057/jiter-0.14.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:df63a14878da754427926281626fd3ee249424a186e25a274e78176d42945264", size = 359969, upload-time = "2026-04-10T14:25:52.381Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a3/94470a0d199287caabeb4da2bb2ae5f6d17f3cf05dfc975d7cb064d58e0f/jiter-0.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ea73187627bcc5810e085df715e8a99da8bdfd96a7eb36b4b4df700ba6d4c9c", size = 397529, upload-time = "2026-04-10T14:25:53.801Z" }, + { url = "https://files.pythonhosted.org/packages/cf/71/6768edc09d7c45c39f093feb3de105fa718a3e982b5208b8a2ed6382b44b/jiter-0.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9f541eaf7bb8382367a1a23d6fc3d6aad57f8dd8c18c3c17f838bee20f217220", size = 522342, upload-time = "2026-04-10T14:25:55.396Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6b/5c2e17559a0f4e96e934479f7137df46c939e983fa05244e674815befb73/jiter-0.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:107465250de4fce00fdb47166bcd51df8e634e049541174fe3c71848e44f52ce", size = 556784, upload-time = "2026-04-10T14:25:56.927Z" }, + { url = "https://files.pythonhosted.org/packages/b1/83/c25f3556a60fc74d11199100f1b6cc0c006b815c8494dea8ca16fe398732/jiter-0.14.0-cp310-cp310-win32.whl", hash = "sha256:ffb2a08a406465bb076b7cc1df41d833106d3cf7905076cc73f0cb90078c7d10", size = 208439, upload-time = "2026-04-10T14:25:58.796Z" }, + { url = "https://files.pythonhosted.org/packages/2e/99/781a1b413f0989b7f2ea203b094b331685f1a35e52e0a45e5d000ecaab27/jiter-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb8b682d10cb0cce7ff4c1af7244af7022c9b01ae16d46c357bdd0df13afb25d", size = 204558, upload-time = "2026-04-10T14:26:00.208Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/198ae537fccb7080a0ed655eb56abf64a92f79489dfbf79f40fa34225bcd/jiter-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7e791e247b8044512e070bd1f3633dc08350d32776d2d6e7473309d0edf256a2", size = 316896, upload-time = "2026-04-10T14:26:01.986Z" }, + { url = "https://files.pythonhosted.org/packages/cf/34/da67cff3fce964a36d03c3e365fb0f8726ade2a6cfd4d3c70107e216ead6/jiter-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71527ce13fd5a0c4e40ad37331f8c547177dbb2dd0a93e5278b6a5eecf748804", size = 321085, upload-time = "2026-04-10T14:26:03.364Z" }, + { url = "https://files.pythonhosted.org/packages/ed/36/4c72e67180d4e71a4f5dcf7886d0840e83c49ab11788172177a77570326e/jiter-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c4a7ab56f746014874f2c525584c0daca1dec37f66fd707ecef3b7e5c2228c", size = 347393, upload-time = "2026-04-10T14:26:05.314Z" }, + { url = "https://files.pythonhosted.org/packages/bc/db/9b39e09ceafa9878235c0fc29e3e3f9b12a4c6a98ea3085b998cadf3accc/jiter-0.14.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:376e9dafff914253bb9d46cdc5f7965607fbe7feb0a491c34e35f92b2770702e", size = 372937, upload-time = "2026-04-10T14:26:06.884Z" }, + { url = "https://files.pythonhosted.org/packages/b0/96/0dcba1d7a82c1b720774b48ef239376addbaf30df24c34742ac4a57b67b2/jiter-0.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23ad2a7a9da1935575c820428dd8d2490ce4d23189691ce33da1fc0a58e14e1c", size = 463646, upload-time = "2026-04-10T14:26:08.345Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e3/f61b71543e746e6b8b805e7755814fc242715c16f1dba58e1cbccb8032c2/jiter-0.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54b3ddf5786bc7732d293bba3411ac637ecfa200a39983166d1df86a59a43c9f", size = 380225, upload-time = "2026-04-10T14:26:10.161Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5e/0ddeb7096aca099114abe36c4921016e8d251e6f35f5890240b31f1f60ae/jiter-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c001d5a646c2a50dc055dd526dad5d5245969e8234d2b1131d0451e81f3a373", size = 358682, upload-time = "2026-04-10T14:26:11.574Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d1/fe0c46cd7fda9cad8f1ff9ad217dc61f1e4280b21052ec6dfe88c1446ef2/jiter-0.14.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:834bb5bdabca2e91592a03d373838a8d0a1b8bbde7077ae6913fd2fc51812d00", size = 359973, upload-time = "2026-04-10T14:26:13.316Z" }, + { url = "https://files.pythonhosted.org/packages/ac/21/f5317f91729b501019184771c80d60abd89907009e7bfa6c7e348c5bdd44/jiter-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4e9178be60e229b1b2b0710f61b9e24d1f4f8556985a83ff4c4f95920eea7314", size = 397568, upload-time = "2026-04-10T14:26:15.212Z" }, + { url = "https://files.pythonhosted.org/packages/e9/05/79d8f33fb2bf168db0df5c9cd16fe440a8ada57e929d3677b22712c2568f/jiter-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7e4ccff04ec03614e62c613e976a3a5860dc9714ce8266f44328bdc8b1cab2c", size = 522535, upload-time = "2026-04-10T14:26:16.956Z" }, + { url = "https://files.pythonhosted.org/packages/5c/00/d1e3ff3d2a465e67f08507d74bafb2dcd29eba91dc939820e39e8dea38b8/jiter-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69539d936fb5d55caf6ecd33e2e884de083ff0ea28579780d56c4403094bb8d9", size = 556709, upload-time = "2026-04-10T14:26:18.5Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/bbb2189f62ace8d95e869aa4c84c9946616f301e2d02895a6f20dcc3bba3/jiter-0.14.0-cp311-cp311-win32.whl", hash = "sha256:4927d09b3e572787cc5e0a5318601448e1ab9391bcef95677f5840c2d00eaa6d", size = 208660, upload-time = "2026-04-10T14:26:20.511Z" }, + { url = "https://files.pythonhosted.org/packages/b8/86/c500b53dcbf08575f5963e536ebd757a1f7c568272ba5d180b212c9a87fb/jiter-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:42d6ed359ac49eb922fdd565f209c57340aa06d589c84c8413e42a0f9ae1b842", size = 204659, upload-time = "2026-04-10T14:26:22.152Z" }, + { url = "https://files.pythonhosted.org/packages/75/4a/a676249049d42cb29bef82233e4fe0524d414cbe3606c7a4b311193c2f77/jiter-0.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:6dd689f5f4a5a33747b28686e051095beb214fe28cfda5e9fe58a295a788f593", size = 194772, upload-time = "2026-04-10T14:26:23.458Z" }, + { url = "https://files.pythonhosted.org/packages/5a/68/7390a418f10897da93b158f2d5a8bd0bcd73a0f9ec3bb36917085bb759ef/jiter-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:2fb2ce3a7bc331256dfb14cefc34832366bb28a9aca81deaf43bbf2a5659e607", size = 316295, upload-time = "2026-04-10T14:26:24.887Z" }, + { url = "https://files.pythonhosted.org/packages/60/a0/5854ac00ff63551c52c6c89534ec6aba4b93474e7924d64e860b1c94165b/jiter-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5252a7ca23785cef5d02d4ece6077a1b556a410c591b379f82091c3001e14844", size = 315898, upload-time = "2026-04-10T14:26:26.601Z" }, + { url = "https://files.pythonhosted.org/packages/41/a1/4f44832650a16b18e8391f1bf1d6ca4909bc738351826bcc198bba4357f4/jiter-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409578cbd77c338975670ada777add4efd53379667edf0aceea730cabede6fb", size = 343730, upload-time = "2026-04-10T14:26:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/48/64/a329e9d469f86307203594b1707e11ae51c3348d03bfd514a5f997870012/jiter-0.14.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ede4331a1899d604463369c730dbb961ffdc5312bc7f16c41c2896415b1304a", size = 370102, upload-time = "2026-04-10T14:26:30.089Z" }, + { url = "https://files.pythonhosted.org/packages/94/c1/5e3dfc59635aa4d4c7bd20a820ac1d09b8ed851568356802cf1c08edb3cf/jiter-0.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92cd8b6025981a041f5310430310b55b25ca593972c16407af8837d3d7d2ca01", size = 461335, upload-time = "2026-04-10T14:26:31.911Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1b/dd157009dbc058f7b00108f545ccb72a2d56461395c4fc7b9cfdccb00af4/jiter-0.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:351bf6eda4e3a7ceb876377840c702e9a3e4ecc4624dbfb2d6463c67ae52637d", size = 378536, upload-time = "2026-04-10T14:26:33.595Z" }, + { url = "https://files.pythonhosted.org/packages/91/78/256013667b7c10b8834f8e6e54cd3e562d4c6e34227a1596addccc05e38c/jiter-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dcfbeb93d9ecd9ca128bbf8910120367777973fa193fb9a39c31237d8df165", size = 353859, upload-time = "2026-04-10T14:26:35.098Z" }, + { url = "https://files.pythonhosted.org/packages/de/d9/137d65ade9093a409fe80955ce60b12bb753722c986467aeda47faf450ad/jiter-0.14.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ae039aaef8de3f8157ecc1fdd4d85043ac4f57538c245a0afaecb8321ec951c3", size = 357626, upload-time = "2026-04-10T14:26:36.685Z" }, + { url = "https://files.pythonhosted.org/packages/2e/48/76750835b87029342727c1a268bea8878ab988caf81ee4e7b880900eeb5a/jiter-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7d9d51eb96c82a9652933bd769fe6de66877d6eb2b2440e281f2938c51b5643e", size = 393172, upload-time = "2026-04-10T14:26:38.097Z" }, + { url = "https://files.pythonhosted.org/packages/a6/60/456c4e81d5c8045279aefe60e9e483be08793828800a4e64add8fdde7f2a/jiter-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d824ca4148b705970bf4e120924a212fdfca9859a73e42bd7889a63a4ea6bb98", size = 520300, upload-time = "2026-04-10T14:26:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9f/2020e0984c235f678dced38fe4eec3058cf528e6af36ebf969b410305941/jiter-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff3a6465b3a0f54b1a430f45c3c0ba7d61ceb45cbc3e33f9e1a7f638d690baf3", size = 553059, upload-time = "2026-04-10T14:26:40.991Z" }, + { url = "https://files.pythonhosted.org/packages/ef/32/e2d298e1a22a4bbe6062136d1c7192db7dba003a6975e51d9a9eecabc4c2/jiter-0.14.0-cp312-cp312-win32.whl", hash = "sha256:5dec7c0a3e98d2a3f8a2e67382d0d7c3ac60c69103a4b271da889b4e8bb1e129", size = 206030, upload-time = "2026-04-10T14:26:42.517Z" }, + { url = "https://files.pythonhosted.org/packages/36/ac/96369141b3d8a4a8e4590e983085efe1c436f35c0cda940dd76d942e3e40/jiter-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:fc7e37b4b8bc7e80a63ad6cfa5fc11fab27dbfea4cc4ae644b1ab3f273dc348f", size = 201603, upload-time = "2026-04-10T14:26:44.328Z" }, + { url = "https://files.pythonhosted.org/packages/01/c3/75d847f264647017d7e3052bbcc8b1e24b95fa139c320c5f5066fa7a0bdd/jiter-0.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:ee4a72f12847ef29b072aee9ad5474041ab2924106bdca9fcf5d7d965853e057", size = 191525, upload-time = "2026-04-10T14:26:46Z" }, + { url = "https://files.pythonhosted.org/packages/32/a1/ef34ca2cab2962598591636a1804b93645821201cc0095d4a93a9a329c9d/jiter-0.14.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:a25ffa2dbbdf8721855612f6dca15c108224b12d0c4024d0ac3d7902132b4211", size = 311366, upload-time = "2026-04-10T14:28:27.943Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/520576a532a6b8a6f42747afed289c8448c879a34d7802fe2c832d4fd38f/jiter-0.14.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ac9cbaa86c10996b92bd12c91659b60f939f8e28fcfa6bc11a0e90a774ce95b", size = 309873, upload-time = "2026-04-10T14:28:29.688Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7c/c16db114ea1f2f532f198aa8dc39585026af45af362c69a0492f31bc4821/jiter-0.14.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:844e73b6c56b505e9e169234ea3bdea2ea43f769f847f47ac559ba1d2361ebea", size = 344816, upload-time = "2026-04-10T14:28:31.348Z" }, + { url = "https://files.pythonhosted.org/packages/99/8f/15e7741ff19e9bcd4d753f7ff22f988fd54592f134ca13701c13ea8c20e0/jiter-0.14.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52c076f187405fc21523c746c04399c9af8ece566077ed147b2126f2bcba577", size = 351445, upload-time = "2026-04-10T14:28:33.093Z" }, + { url = "https://files.pythonhosted.org/packages/21/42/9042c3f3019de4adcb8c16591c325ec7255beea9fcd33a42a43f3b0b1000/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:fbd9e482663ca9d005d051330e4d2d8150bb208a209409c10f7e7dfdf7c49da9", size = 308810, upload-time = "2026-04-10T14:28:34.673Z" }, + { url = "https://files.pythonhosted.org/packages/60/cf/a7e19b308bd86bb04776803b1f01a5f9a287a4c55205f4708827ee487fbf/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:33a20d838b91ef376b3a56896d5b04e725c7df5bc4864cc6569cf046a8d73b6d", size = 308443, upload-time = "2026-04-10T14:28:36.658Z" }, + { url = "https://files.pythonhosted.org/packages/ca/44/e26ede3f0caeff93f222559cb0cc4ca68579f07d009d7b6010c5b586f9b1/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:432c4db5255d86a259efde91e55cb4c8d18c0521d844c9e2e7efcce3899fb016", size = 343039, upload-time = "2026-04-10T14:28:38.356Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/1f9ada30cef7b05e74bb06f52127e7a724976c225f46adb65c37b1dadfb6/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f00d94b281174144d6532a04b66a12cb866cbdc47c3af3bfe2973677f9861a", size = 349613, upload-time = "2026-04-10T14:28:40.066Z" }, ] [[package]] @@ -1288,7 +1275,7 @@ wheels = [ [[package]] name = "lnbits" -version = "1.6.0rc2" +version = "1.5.5rc2" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, @@ -1324,7 +1311,6 @@ dependencies = [ { name = "python-dotenv" }, { name = "python-multipart" }, { name = "pywebpush" }, - { name = "random-username" }, { name = "shortuuid" }, { name = "slowapi" }, { name = "sqlalchemy" }, @@ -1334,7 +1320,6 @@ dependencies = [ { name = "urllib3" }, { name = "uvicorn" }, { name = "uvloop" }, - { name = "wasmtime" }, { name = "websocket-client" }, { name = "websockets" }, ] @@ -1345,7 +1330,6 @@ breez = [ { name = "breez-sdk-liquid" }, ] liquid = [ - { name = "boltz-client" }, { name = "wallycore" }, ] migration = [ @@ -1363,7 +1347,6 @@ dev = [ { name = "mypy" }, { name = "openai" }, { name = "openapi-spec-validator" }, - { name = "playwright" }, { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-cov" }, @@ -1383,7 +1366,6 @@ requires-dist = [ { name = "bcrypt", specifier = "~=5.0.0" }, { name = "bech32", specifier = "~=1.2.0" }, { name = "bolt11", specifier = "~=2.1.1" }, - { name = "boltz-client", marker = "extra == 'liquid'", specifier = "==0.4.0" }, { name = "breez-sdk", marker = "extra == 'breez'", specifier = "~=0.8.0" }, { name = "breez-sdk-liquid", marker = "extra == 'breez'", specifier = "~=0.11.11" }, { name = "click", specifier = "~=8.3.1" }, @@ -1401,7 +1383,7 @@ requires-dist = [ { name = "loguru", specifier = "~=0.7.3" }, { name = "nostr-sdk", specifier = "~=0.44.0" }, { name = "packaging", specifier = "~=25.0.0" }, - { name = "pillow", specifier = "~=12.3.0" }, + { name = "pillow", specifier = "~=12.1.0" }, { name = "protobuf", specifier = "~=6.33.5" }, { name = "psycopg2-binary", marker = "extra == 'migration'", specifier = "~=2.9.11" }, { name = "pycryptodomex", specifier = "~=3.23.0" }, @@ -1415,18 +1397,16 @@ requires-dist = [ { name = "python-dotenv", specifier = "~=1.2.1" }, { name = "python-multipart", specifier = "~=0.0.22" }, { name = "pywebpush", specifier = "~=2.2.0" }, - { name = "random-username", specifier = "~=1.0.2" }, { name = "shortuuid", specifier = "~=1.0.13" }, { name = "slowapi", specifier = "~=0.1.9" }, { name = "sqlalchemy", specifier = "~=1.4.54" }, { name = "sse-starlette", specifier = "~=2.3.6" }, - { name = "starlette", specifier = "~=0.48.0" }, + { name = "starlette", specifier = "~=0.47.1" }, { name = "typing-extensions", specifier = "~=4.15.0" }, { name = "urllib3", specifier = ">=2.7.0" }, { name = "uvicorn", specifier = "~=0.40.0" }, { name = "uvloop", specifier = "~=0.22.1" }, { name = "wallycore", marker = "extra == 'liquid'", specifier = "~=1.5.1" }, - { name = "wasmtime", specifier = ">=45.0.0" }, { name = "websocket-client", specifier = "~=1.9.0" }, { name = "websockets", specifier = "~=15.0.1" }, ] @@ -1443,7 +1423,6 @@ dev = [ { name = "mypy", specifier = "~=1.17.1" }, { name = "openai", specifier = "~=2.14.0" }, { name = "openapi-spec-validator", specifier = "~=0.7.2" }, - { name = "playwright", specifier = "~=1.61.0" }, { name = "pre-commit", specifier = "~=4.5.1" }, { name = "pytest", specifier = "~=9.0.2" }, { name = "pytest-cov", specifier = "~=7.0.0" }, @@ -1781,42 +1760,50 @@ wheels = [ [[package]] name = "pillow" -version = "12.3.0" +version = "12.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/c2/669d88644cddb1485bd9534e63e8cf476c8e51cb3c3a1297677023505c0e/pillow-12.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a", size = 5392418, upload-time = "2026-07-01T11:53:27.808Z" }, - { url = "https://files.pythonhosted.org/packages/6b/ba/3762f376a2948e3036488d773a146e0ae6ecc2ca03ac20e2615bd0b2ba02/pillow-12.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7", size = 4785287, upload-time = "2026-07-01T11:53:29.761Z" }, - { url = "https://files.pythonhosted.org/packages/07/50/b5d688cc9c52d4482f3d5bcab6ce20bc2a74a85d2343841c907444a3be2c/pillow-12.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f", size = 6253754, upload-time = "2026-07-01T11:53:32.298Z" }, - { url = "https://files.pythonhosted.org/packages/4e/89/36f4cd76cf4baf05c50ababb976249153f18c959171c7f6ba09a6f217260/pillow-12.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec", size = 6925605, upload-time = "2026-07-01T11:53:34.487Z" }, - { url = "https://files.pythonhosted.org/packages/eb/c0/4de58cf6633b9e3a6061ef4be6fb91fc3c90b812ece886f531e3c523d777/pillow-12.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468", size = 6327788, upload-time = "2026-07-01T11:53:36.433Z" }, - { url = "https://files.pythonhosted.org/packages/87/3c/14d53682a19550dbbaf3b598f807d5457646c510805a44c7d7891cd1cd1a/pillow-12.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed", size = 7036288, upload-time = "2026-07-01T11:53:38.712Z" }, - { url = "https://files.pythonhosted.org/packages/38/1d/36279e3c77efe034e4cc2b0393ee74ffdb5a62391dacbf9b916154f5f0b8/pillow-12.3.0-cp310-cp310-win32.whl", hash = "sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1", size = 6472396, upload-time = "2026-07-01T11:53:40.781Z" }, - { url = "https://files.pythonhosted.org/packages/48/7c/8fa0039574c476d7c6fa57dd7c32a130436877c6ec1e5ce1cc8ec44878c1/pillow-12.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb", size = 7226887, upload-time = "2026-07-01T11:53:42.764Z" }, - { url = "https://files.pythonhosted.org/packages/fa/17/e324be141d173c1c919428066c3259f21c1b8982e564e01a4a81e96dbdcf/pillow-12.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f", size = 2568039, upload-time = "2026-07-01T11:53:45.372Z" }, - { url = "https://files.pythonhosted.org/packages/fb/c8/0a78b0e02d7ac54bc03e5321c9220da52f0c2ea83b21f7c40e7f3169c502/pillow-12.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756", size = 5392415, upload-time = "2026-07-01T11:53:47.162Z" }, - { url = "https://files.pythonhosted.org/packages/b2/5b/a02d30018abd97ced9f5a6c63d28597694a00d066516b9c1c6de45859fc9/pillow-12.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6", size = 4785266, upload-time = "2026-07-01T11:53:49.079Z" }, - { url = "https://files.pythonhosted.org/packages/c8/98/766667a4be768150a202836acd9fad19c06824ca86c4286d3cf6b274964e/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd", size = 6263814, upload-time = "2026-07-01T11:53:51.32Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2d/ede717bc1144f63886c21fd349bb95860b0d1a21149ff16f2bb362b612b6/pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd", size = 6934408, upload-time = "2026-07-01T11:53:53.487Z" }, - { url = "https://files.pythonhosted.org/packages/a3/48/9c58b685e69d49c31af6c8eb9012055fab7e665785165c84796e2c73ce72/pillow-12.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c", size = 6337160, upload-time = "2026-07-01T11:53:55.457Z" }, - { url = "https://files.pythonhosted.org/packages/ff/fa/dc2a5c0ba6df93f67c31d34b808b7ce440b40cdbf96f0b81cde1d1e6fa93/pillow-12.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5", size = 7045172, upload-time = "2026-07-01T11:53:57.736Z" }, - { url = "https://files.pythonhosted.org/packages/86/a5/444817a4d4c4c2417df00513086ca196f388d8f9ef40c2e4ccd1ad1af54b/pillow-12.3.0-cp311-cp311-win32.whl", hash = "sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b", size = 6472232, upload-time = "2026-07-01T11:53:59.767Z" }, - { url = "https://files.pythonhosted.org/packages/63/c6/4bad1b18d132a50b27e1365e1ab163616f7a5bb56d330f66f9d1d9d4f9d4/pillow-12.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a", size = 7233653, upload-time = "2026-07-01T11:54:02.066Z" }, - { url = "https://files.pythonhosted.org/packages/fd/16/00f91ab7760dc842f5aad55217e80fc4a7067a0604535249bc8a2d6d9870/pillow-12.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26", size = 2568195, upload-time = "2026-07-01T11:54:04.622Z" }, - { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, - { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, - { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, - { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, - { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, - { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, - { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, - { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, - { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, - { url = "https://files.pythonhosted.org/packages/75/18/2e8b40223153ccbc60df07f9e8928dc0c76202aa4e55ae9f53962b6510d6/pillow-12.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468", size = 5302510, upload-time = "2026-07-01T11:56:25.736Z" }, - { url = "https://files.pythonhosted.org/packages/46/3e/51fabf59d5ab801ceab709453d3ab6b180083496579549de4c45ced6528a/pillow-12.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94", size = 4736058, upload-time = "2026-07-01T11:56:28.041Z" }, - { url = "https://files.pythonhosted.org/packages/bf/20/22fe9384b7949e25fb1293bcfc84fb82590ff4ea6b37c95b24d26d793d86/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e", size = 5237776, upload-time = "2026-07-01T11:56:30.263Z" }, - { url = "https://files.pythonhosted.org/packages/08/14/f6ba68107680ffa74b39985f3f30884e41318fbc4250caa423c79b4788bb/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3", size = 5860358, upload-time = "2026-07-01T11:56:32.68Z" }, - { url = "https://files.pythonhosted.org/packages/36/54/0169bc772ec491108b62f644f8ecf1fe5d8ae5ebafde2ee2142210166903/pillow-12.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a", size = 7231786, upload-time = "2026-07-01T11:56:35.046Z" }, + { url = "https://files.pythonhosted.org/packages/1d/30/5bd3d794762481f8c8ae9c80e7b76ecea73b916959eb587521358ef0b2f9/pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0", size = 5304099, upload-time = "2026-02-11T04:20:06.13Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c1/aab9e8f3eeb4490180e357955e15c2ef74b31f64790ff356c06fb6cf6d84/pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713", size = 4657880, upload-time = "2026-02-11T04:20:09.291Z" }, + { url = "https://files.pythonhosted.org/packages/f1/0a/9879e30d56815ad529d3985aeff5af4964202425c27261a6ada10f7cbf53/pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b", size = 6222587, upload-time = "2026-02-11T04:20:10.82Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5f/a1b72ff7139e4f89014e8d451442c74a774d5c43cd938fb0a9f878576b37/pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b", size = 8027678, upload-time = "2026-02-11T04:20:12.455Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c2/c7cb187dac79a3d22c3ebeae727abee01e077c8c7d930791dc592f335153/pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4", size = 6335777, upload-time = "2026-02-11T04:20:14.441Z" }, + { url = "https://files.pythonhosted.org/packages/0c/7b/f9b09a7804ec7336effb96c26d37c29d27225783dc1501b7d62dcef6ae25/pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4", size = 7027140, upload-time = "2026-02-11T04:20:16.387Z" }, + { url = "https://files.pythonhosted.org/packages/98/b2/2fa3c391550bd421b10849d1a2144c44abcd966daadd2f7c12e19ea988c4/pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e", size = 6449855, upload-time = "2026-02-11T04:20:18.554Z" }, + { url = "https://files.pythonhosted.org/packages/96/ff/9caf4b5b950c669263c39e96c78c0d74a342c71c4f43fd031bb5cb7ceac9/pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff", size = 7151329, upload-time = "2026-02-11T04:20:20.646Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f8/4b24841f582704da675ca535935bccb32b00a6da1226820845fac4a71136/pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40", size = 6325574, upload-time = "2026-02-11T04:20:22.43Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f9/9f6b01c0881d7036063aa6612ef04c0e2cad96be21325a1e92d0203f8e91/pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23", size = 7032347, upload-time = "2026-02-11T04:20:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/79/13/c7922edded3dcdaf10c59297540b72785620abc0538872c819915746757d/pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9", size = 2453457, upload-time = "2026-02-11T04:20:25.392Z" }, + { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, + { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, + { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" }, + { url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5a/24bc8eb526a22f957d0cec6243146744966d40857e3d8deb68f7902ca6c1/pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c", size = 6328663, upload-time = "2026-02-11T04:20:43.184Z" }, + { url = "https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563", size = 7031448, upload-time = "2026-02-11T04:20:44.696Z" }, + { url = "https://files.pythonhosted.org/packages/49/70/f76296f53610bd17b2e7d31728b8b7825e3ac3b5b3688b51f52eab7c0818/pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80", size = 2453651, upload-time = "2026-02-11T04:20:46.243Z" }, + { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" }, + { url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" }, + { url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" }, + { url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" }, + { url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/c56ce33ca856e358d27fda9676c055395abddb82c35ac0f593877ed4562e/pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e", size = 7029880, upload-time = "2026-02-11T04:23:04.783Z" }, ] [[package]] @@ -1828,25 +1815,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, ] -[[package]] -name = "playwright" -version = "1.61.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "greenlet" }, - { name = "pyee" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/ee/31e4e0db36588b817a10b299a0285082545fde7d36543c2abe498bb3d61a/playwright-1.61.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:ff138c3a604f69911e9d42fd036e55c2a171e5616edf04c1e7f60a2a285540b0", size = 43421877, upload-time = "2026-06-29T10:32:48.428Z" }, - { url = "https://files.pythonhosted.org/packages/42/35/71395dd3ecc798965be4a3ef8c443217d4abca168e7cb34536304f9489e6/playwright-1.61.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:009588c2a7e499bc5a8b425b61fa65490968bbda9cd69e0cf2cff10f8304659a", size = 42205016, upload-time = "2026-06-29T10:32:52.104Z" }, - { url = "https://files.pythonhosted.org/packages/f4/44/323164cf5cd1647bdefce76ffce27651aadb959d089b48f53ea40918276e/playwright-1.61.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:9f7de4536088d12037c13a52b7ea34b59270b78926bb56935070597ffac6b1af", size = 43421884, upload-time = "2026-06-29T10:32:55.773Z" }, - { url = "https://files.pythonhosted.org/packages/ab/f8/a35bf179e4ba2522c1893635094a64e407572547bd61528820fc0abc87fe/playwright-1.61.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:54f3b39f6eab832e33458c1dd7da0b5682aedab3b09ae731b5c59fa12fd2024e", size = 47421381, upload-time = "2026-06-29T10:32:59.903Z" }, - { url = "https://files.pythonhosted.org/packages/b7/eb/e3f922348ec17c315f98c463f72faa1181a1c3de0bfe31a8d2edf6561723/playwright-1.61.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93454322ade8c11d5d6c211bfd91bdfb9ffb4810e3e026371bcbc4bec1b7ee4c", size = 47120545, upload-time = "2026-06-29T10:33:03.574Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a6/5be4e52b40a9c0c8a073e7c5b0785c05cf5a9ea8f8a7b5b260e32d970342/playwright-1.61.0-py3-none-win32.whl", hash = "sha256:372d55a6f1248fa1dd47599686980cb8fb5bbe6fcda59eab793eb657c11d8a9b", size = 37844841, upload-time = "2026-06-29T10:33:07.361Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fd/2b78036e5fbe9d5f5645bbe08a1eac7160c51243c0093963edbcf67c35d9/playwright-1.61.0-py3-none-win_amd64.whl", hash = "sha256:35c6cc4589a5d00964a59d7b3e59641e0aac0c02f15479a7af77d20f6bc79597", size = 37844846, upload-time = "2026-06-29T10:33:10.637Z" }, - { url = "https://files.pythonhosted.org/packages/27/0d/1b0f3c4ee4eb0514bc805b5c2f9a223e5b6de4f11a926f5235d51d0fc81b/playwright-1.61.0-py3-none-win_arm64.whl", hash = "sha256:e9fcbffcf557a8620fdedd92491eb59a32d18e23d6f3b4f6214b952be324fe51", size = 33955127, upload-time = "2026-06-29T10:33:14.008Z" }, -] - [[package]] name = "pluggy" version = "1.6.0" @@ -2074,18 +2042,6 @@ email = [ { name = "email-validator" }, ] -[[package]] -name = "pyee" -version = "13.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8b/04/e7c1fe4dc78a6fdbfd6c337b1c3732ff543b8a397683ab38378447baa331/pyee-13.0.1.tar.gz", hash = "sha256:0b931f7c14535667ed4c7e0d531716368715e860b988770fc7eb8578d1f67fc8", size = 31655, upload-time = "2026-02-14T21:12:28.044Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl", hash = "sha256:af2f8fede4171ef667dfded53f96e2ed0d6e6bd7ee3bb46437f77e3b57689228", size = 15659, upload-time = "2026-02-14T21:12:26.263Z" }, -] - [[package]] name = "pygments" version = "2.20.0" @@ -2289,15 +2245,15 @@ wheels = [ [[package]] name = "python-discovery" -version = "1.3.1" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/60/e88788207d81e46362cfbef0d4aaf4c0f49efc3c12d4c3fa3f542c34ebec/python_discovery-1.3.1.tar.gz", hash = "sha256:62f6db28064c9613e7ca76cb3f00c38c839a07c31c00dfe7ed0986493d2150a6", size = 68011, upload-time = "2026-05-12T20:53:36.336Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/e0/cc5a8653e9a24f6cf84768f05064aa8ed5a83dcefd5e2a043db14a1c5f44/python_discovery-1.3.0.tar.gz", hash = "sha256:d098f1e86be5d45fe4d14bf1029294aabbd332f4321179dec85e76cddce834b0", size = 63925, upload-time = "2026-05-05T14:38:39.769Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/6f/a05a317a66fee0aad270011461f1a63a453ed12471249f172f7d2e2bc7b4/python_discovery-1.3.1-py3-none-any.whl", hash = "sha256:ed188687ebb3b82c01a17cd5ac62fc94d9f6487a7f1a0f9dfe89753fec91039c", size = 33185, upload-time = "2026-05-12T20:53:34.969Z" }, + { url = "https://files.pythonhosted.org/packages/30/d4/24d543ab8b8158b7f5a97113c831205f5c900c92c8762b1e7f44b7ea0405/python_discovery-1.3.0-py3-none-any.whl", hash = "sha256:441d9ced3dfce36e113beb35ca302c71c7ef06f3c0f9c227a0b9bb3bd49b9e9f", size = 33124, upload-time = "2026-05-05T14:38:38.539Z" }, ] [[package]] @@ -2311,11 +2267,11 @@ wheels = [ [[package]] name = "python-multipart" -version = "0.0.31" +version = "0.0.28" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/7e/9b35ad8f3d9ca680f7c87a88f19612fdd8da9796c4d3b46e560ac79dcc4a/python_multipart-0.0.31.tar.gz", hash = "sha256:fc631183bb13e56db3158a4909908dfb2e23565286744e798241e63750e5d680", size = 46689, upload-time = "2026-06-04T08:27:49.014Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/54/a85eb421fbdd5007bc5af39d0f4ed9fa609e0fedbfdc2adcf0b34526870e/python_multipart-0.0.28.tar.gz", hash = "sha256:8550da197eac0f7ab748961fc9509b999fa2662ea25cef857f05249f6893c0f8", size = 45314, upload-time = "2026-05-10T11:05:16.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/1e/7f7f299527a5a8ad90acd5f2f78dfa6c8495c6301a3205106ea68a84de96/python_multipart-0.0.31-py3-none-any.whl", hash = "sha256:8408153d68a9773291fc1da39a8b85a50044bddbabd2dd72e9229776b7b15e28", size = 29996, upload-time = "2026-06-04T08:27:47.804Z" }, + { url = "https://files.pythonhosted.org/packages/f3/a2/43bbc5860b5034e2af4ef99a0e04d726ff329c43e192ef3abaa8d7ecfce5/python_multipart-0.0.28-py3-none-any.whl", hash = "sha256:10faac07eb966c3f48dc415f9dee46c04cb10d58d30a35677db8027c825ed9b6", size = 29438, upload-time = "2026-05-10T11:05:15.052Z" }, ] [[package]] @@ -2394,15 +2350,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, ] -[[package]] -name = "random-username" -version = "1.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/be/84/7004e0038707827e7ebe91a09e0f46483e36134de3b20bc0d5cf864a4caa/random-username-1.0.2.tar.gz", hash = "sha256:5fdc0604b5d1bdfe4acf4cd7491a9de1caf41bbdd890f646b434e09ae2a1b7ce", size = 3805, upload-time = "2019-01-11T22:57:45.038Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/d8/0f96b9bdea0683884b0ff2d8663b2580e2bad4418848540d1a12e1fd1d7b/random_username-1.0.2-py3-none-any.whl", hash = "sha256:2536feb63fecde7e01ede4a541aadb6f0b58794a7ab327ca5369d2a4b7664c06", size = 6673, upload-time = "2019-01-11T22:57:43.656Z" }, -] - [[package]] name = "referencing" version = "0.36.2" @@ -2419,7 +2366,7 @@ wheels = [ [[package]] name = "requests" -version = "2.34.2" +version = "2.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -2427,9 +2374,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/b8/7a707d60fea4c49094e40262cc0e2ca6c768cca21587e34d3f705afec47e/requests-2.34.0.tar.gz", hash = "sha256:7d62fe92f50eb82c529b0916bb445afa1531a566fc8f35ffdc64446e771b856a", size = 142436, upload-time = "2026-05-11T19:29:51.717Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e6/e300fce5fe83c30520607a015dabd985df3251e188d234bfe9492e17a389/requests-2.34.0-py3-none-any.whl", hash = "sha256:917520a21b767485ce7c588f4ebb917c436b24a31231b44228715eaeb5a52c60", size = 73021, upload-time = "2026-05-11T19:29:49.923Z" }, ] [[package]] @@ -2549,11 +2496,11 @@ wheels = [ [[package]] name = "setuptools" -version = "83.0.0" +version = "82.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" }, ] [[package]] @@ -2655,15 +2602,15 @@ wheels = [ [[package]] name = "starlette" -version = "0.48.0" +version = "0.47.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/a5/d6f429d43394057b67a6b5bbe6eae2f77a6bf7459d961fdb224bf206eee6/starlette-0.48.0.tar.gz", hash = "sha256:7e8cee469a8ab2352911528110ce9088fdc6a37d9876926e73da7ce4aa4c7a46", size = 2652949, upload-time = "2025-09-13T08:41:05.699Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/b9/cc3017f9a9c9b6e27c5106cc10cc7904653c3eec0729793aec10479dd669/starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9", size = 2584144, upload-time = "2025-08-24T13:36:42.122Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, + { url = "https://files.pythonhosted.org/packages/ce/fd/901cfa59aaa5b30a99e16876f11abe38b59a1a2c51ffb3d7142bb6089069/starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51", size = 72991, upload-time = "2025-08-24T13:36:40.887Z" }, ] [[package]] @@ -2724,19 +2671,19 @@ wheels = [ [[package]] name = "tornado" -version = "6.5.7" +version = "6.5.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/24/95ec527ad67b76d59299e5465b3935d05e4294b7e0290a3924b7487df30b/tornado-6.5.7.tar.gz", hash = "sha256:66c513a76cda70d53907bc27cf1447557699c2e95aa48ba27a442ff61c3ddfc2", size = 519252, upload-time = "2026-06-08T17:34:51.232Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/dc/c7043cab6fed8ae159fc1923ce829ada35c4dbd797d408a43858ffaf9639/tornado-6.5.7-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:148b2eb15c2c765a50796172c1e499649b35f30d2e3c3d3e15913cfa56bfb163", size = 448543, upload-time = "2026-06-08T17:34:38.052Z" }, - { url = "https://files.pythonhosted.org/packages/92/4f/090b1431e5a43df696feceffc268c5383cc079ecb5f08ce58f917109aafe/tornado-6.5.7-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9da38de27f1da3b78a966f0dae12b5a1ea9afe72ca805d84ff06508272ddf100", size = 446707, upload-time = "2026-06-08T17:34:39.594Z" }, - { url = "https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972", size = 449774, upload-time = "2026-06-08T17:34:41.204Z" }, - { url = "https://files.pythonhosted.org/packages/35/37/d434c73f4c6e014b745b9b37085f34f40c022f007efff3d7fe65991899f3/tornado-6.5.7-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b", size = 450745, upload-time = "2026-06-08T17:34:42.531Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2b/56b9aff361d7f1ab728a805ec7d7ea835f8807afa9f5cc690ea0e630efb9/tornado-6.5.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92", size = 450578, upload-time = "2026-06-08T17:34:43.787Z" }, - { url = "https://files.pythonhosted.org/packages/02/30/a7444fb23aa76860a14198fab96ac79f1866b0a6e19e26c4381b0938e50f/tornado-6.5.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5", size = 449985, upload-time = "2026-06-08T17:34:45.326Z" }, - { url = "https://files.pythonhosted.org/packages/5c/42/5f0e56c01e8d9d36f4e23f367b85ae6cae0c1ecddd5e6977d8388ad27488/tornado-6.5.7-cp39-abi3-win32.whl", hash = "sha256:f8de3bf12d3efdd0cbe7c8887868198f8a91415e3f29fcf258d9b8eb7b1d9ae4", size = 451047, upload-time = "2026-06-08T17:34:46.784Z" }, - { url = "https://files.pythonhosted.org/packages/c9/a4/b393076ffb21b469eec5b328a0534cf03a3b90bfc6b1f09507cdd075d938/tornado-6.5.7-cp39-abi3-win_amd64.whl", hash = "sha256:de942f843533a039ef9fa3d9c88c7cd8a7c94553fb5ad0154270989b3d99a2c4", size = 451485, upload-time = "2026-06-08T17:34:48.248Z" }, - { url = "https://files.pythonhosted.org/packages/71/2e/7b1c769803121b809112cf9a00681c472eae1d80e32d7ec0e0bd61d0d0e1/tornado-6.5.7-cp39-abi3-win_arm64.whl", hash = "sha256:ff934fce95643af5f11efdae618eaa73d469dc588641e5c8d19295a0c65c4796", size = 450506, upload-time = "2026-06-08T17:34:49.702Z" }, + { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" }, + { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, + { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, + { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, + { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, + { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" }, + { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" }, ] [[package]] @@ -2753,26 +2700,26 @@ wheels = [ [[package]] name = "typer" -version = "0.26.2" +version = "0.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "click" }, { name = "rich" }, { name = "shellingham" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/a5/756f2e6bc81a7dd79aa3c625dd01b74cabc4516628cace2caaec09ca6ff2/typer-0.26.2.tar.gz", hash = "sha256:9b4f19e08fcc9427a822d1ef467b1fe76737a2f65c7926bdeba2337d73569b68", size = 198991, upload-time = "2026-05-27T10:41:39.166Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/51/9aed62104cea109b820bbd6c14245af756112017d309da813ef107d42e7e/typer-0.25.1.tar.gz", hash = "sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc", size = 122276, upload-time = "2026-04-30T19:32:16.964Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/a5/6ffd702beda8798b2b82ff70805ed4a66d963557e43a5d1823ab456251a4/typer-0.26.2-py3-none-any.whl", hash = "sha256:39beff72ffbb31978a5b545f677d57edb97c6f980f433b38556deb0af25f094d", size = 123123, upload-time = "2026-05-27T10:41:40.504Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl", hash = "sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89", size = 58409, upload-time = "2026-04-30T19:32:18.271Z" }, ] [[package]] name = "types-mock" -version = "5.2.0.20260518" +version = "5.2.0.20260508" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/a4/26595e2a9407752c2e3cd5b17d7884db847e39834a2575cf15b5c3b19a27/types_mock-5.2.0.20260518.tar.gz", hash = "sha256:49af9c18aac4caa90e0e1e8437e2160cd8b3f126053dae6453d65b393590fcf9", size = 11577, upload-time = "2026-05-18T06:02:42.607Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/54/cefdd866e8b69be4ce93288710a55506bf3f8c5eba8c0b0b8322131bd25d/types_mock-5.2.0.20260508.tar.gz", hash = "sha256:2049474a82a678e1979d7a1273891daccab4c19bbf1b28df5594836d675873d3", size = 11535, upload-time = "2026-05-08T04:49:03.87Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/d6/da3bf7cc26ebe587e8c50a505d302f5755840fc24fbbd704b770c43b764b/types_mock-5.2.0.20260518-py3-none-any.whl", hash = "sha256:3c511875b6f37d30c70add3e72265d1c21202b8544751361e3ca94f7a757a03d", size = 10459, upload-time = "2026-05-18T06:02:41.224Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/080b185263af2fc0c25ddf26163f9c59d24caa0edc8c885ba93725fd1ad6/types_mock-5.2.0.20260508-py3-none-any.whl", hash = "sha256:eb90adc8527fba4d800b0d65268f141978789a0398a78ba6bda453cd62de4862", size = 10455, upload-time = "2026-05-08T04:49:03.045Z" }, ] [[package]] @@ -2853,7 +2800,7 @@ wheels = [ [[package]] name = "virtualenv" -version = "21.3.3" +version = "21.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, @@ -2862,9 +2809,9 @@ dependencies = [ { name = "python-discovery" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/15/ba/1f6e8c957e4932be060dcdc482d339c12e0216351478add3645cdaa53c05/virtualenv-21.3.3.tar.gz", hash = "sha256:f5bda277e553b1c2b3c1a8debfc30496e1288cc93ce6b7b71b3280047e317328", size = 7613784, upload-time = "2026-05-13T18:01:30.19Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/0d/915c02c94d207b85580eb09bffab54438a709e7288524094fe781da526c2/virtualenv-21.3.1.tar.gz", hash = "sha256:c2305bc1fddeec40699b8370d13f8d431b0701f00ce895061ce493aeded4426b", size = 7613791, upload-time = "2026-05-05T01:34:31.402Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/34/a9dbe051de88a63eb7408ea66630bac38e72f7f6077d4be58737106860d9/virtualenv-21.3.3-py3-none-any.whl", hash = "sha256:7d5987d8369e098e41406efb780a3d4ca79280097293899e351a6407ee153ab3", size = 7594554, upload-time = "2026-05-13T18:01:27.815Z" }, + { url = "https://files.pythonhosted.org/packages/b1/4f/f71e641e504111a5a74e3a20bc52d01bd86788b22699dd3fee1c63253cf6/virtualenv-21.3.1-py3-none-any.whl", hash = "sha256:d1a71cf58f2f9228fff23a1f6ec15d39785c6b32e03658d104974247145edd35", size = 7594539, upload-time = "2026-05-05T01:34:28.98Z" }, ] [[package]] @@ -2896,25 +2843,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/e5/1c1d2979d074cba4f0a1516f2bf4c3ee66067b6ba3b96e5cb4460555d474/wallycore-1.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3343a1df11a7ef4572521e002f4550a0157aea2c749dcfd9be62fb5babe0d03", size = 1728038, upload-time = "2026-04-15T22:04:36.434Z" }, ] -[[package]] -name = "wasmtime" -version = "45.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b1/ff/db9cfc61d988bc15303134bb174176a29839976876dfd18c3a12548ad291/wasmtime-45.0.0.tar.gz", hash = "sha256:2ad4bf7ca286ceea35c1e420d10b368d7f83faf9a5ffde87b4ee334a9b7f55f3", size = 128297, upload-time = "2026-05-26T17:57:39.131Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/75/56/7d941adba273210dcf4198266a47f472a5eeca20172005b443af71a9a3e7/wasmtime-45.0.0-py3-none-android_26_arm64_v8a.whl", hash = "sha256:4e843795b53e66c71313f2254731467372e5e1549227cf14accb9e2d57701c10", size = 8659052, upload-time = "2026-05-26T17:57:12.338Z" }, - { url = "https://files.pythonhosted.org/packages/3f/81/c4d81ebf3db8aa28f789a9569640f30790d5234c509a0234cd502aa2638b/wasmtime-45.0.0-py3-none-android_26_x86_64.whl", hash = "sha256:35e713f907264e470f3bc9b592b81b8ed0f8f5651725d9f07a5d52beb0642e38", size = 9619373, upload-time = "2026-05-26T17:57:14.979Z" }, - { url = "https://files.pythonhosted.org/packages/e1/c7/7594da7fa8a3bc5e765733ad57aac9b7b27262c4afa47521bd500e4a4574/wasmtime-45.0.0-py3-none-any.whl", hash = "sha256:6251ee5074a8b8bfaa98e6e99cb5d49d6d0f2320b3265d5aa6c2ee5df5fb4519", size = 8019034, upload-time = "2026-05-26T17:57:20.138Z" }, - { url = "https://files.pythonhosted.org/packages/75/76/7d0e440ca03a717a97889dbb7b68f952c20ed4ffd3f59addf9553579e1d5/wasmtime-45.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:3579b0ec6d001750d66ec7089aaeee2c048f88328c82743e15f099af01b0cf84", size = 9401625, upload-time = "2026-05-26T17:57:22.149Z" }, - { url = "https://files.pythonhosted.org/packages/5b/0b/a81b5daf5adea482ecb68d9615f6a348486ab4d8e980a915d4420e57ee4d/wasmtime-45.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:31d10f25c330cebcfb364e9a357123deeec96c41725ff2bba91b705587f38a93", size = 8255954, upload-time = "2026-05-26T17:57:24.769Z" }, - { url = "https://files.pythonhosted.org/packages/d7/8c/e9019a28e908214031310aefd78e4755221d02303190b54b2c85cb69573e/wasmtime-45.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:5d1416ec6da8cd87c29e2e9eb074358c91839c2fff971fe428c8921eaae68e73", size = 9681185, upload-time = "2026-05-26T17:57:26.641Z" }, - { url = "https://files.pythonhosted.org/packages/42/56/ed5f492bd553a31c8e28d621f8256f2c7b1a133b28f73525d96ca355891a/wasmtime-45.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:a499f6ab0eebb70dca83d6a4904b743cd122f322af3abe86af08ad753533d946", size = 8582001, upload-time = "2026-05-26T17:57:28.883Z" }, - { url = "https://files.pythonhosted.org/packages/62/12/9b41740da83f51014b88181c9086de0ed75d736a5329baff7323c4fb6eff/wasmtime-45.0.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:bef65282b7de744106a91da43e4d06ba19d2d587bc54abb83b3e757f0c4fc030", size = 8633462, upload-time = "2026-05-26T17:57:31.423Z" }, - { url = "https://files.pythonhosted.org/packages/ea/63/49d8317706a108d9ed1d4166d0fc710796da1b20e591a98a96575dec367a/wasmtime-45.0.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a0b6ca14b4628a5d1ffa91ccf2c0f2c58fa171f126ec085d564b09d5795395dd", size = 9712524, upload-time = "2026-05-26T17:57:33.839Z" }, - { url = "https://files.pythonhosted.org/packages/20/71/8e31ea472ceb934e7261ac59a786e82cd82b4d4dcb7c870d498aa9c3c21e/wasmtime-45.0.0-py3-none-win_amd64.whl", hash = "sha256:1736a70a48f713aaf1a878514d29cc6f554213b5431e04447813a3b9b4320381", size = 8019039, upload-time = "2026-05-26T17:57:36.04Z" }, - { url = "https://files.pythonhosted.org/packages/9c/d1/ac536e92ac95a02e137be5b6829f15b87d5eef93ace32e5ee8035155b839/wasmtime-45.0.0-py3-none-win_arm64.whl", hash = "sha256:ae9726590e6d90c6305b8b507c93468b145204d4390aa9a2e29e26babcae110e", size = 6845659, upload-time = "2026-05-26T17:57:37.696Z" }, -] - [[package]] name = "websocket-client" version = "1.9.0" @@ -2995,107 +2923,110 @@ wheels = [ [[package]] name = "wrapt" -version = "2.2.1" +version = "2.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/9f/06263fcd8ad6c405f05a3905fd7a84dd3176eb5ad46e44bccc0cd16348bb/wrapt-2.2.1.tar.gz", hash = "sha256:6744f504375775d7609c82c8d3d94af1c9a6f05586984536905908ba905277b9", size = 127620, upload-time = "2026-05-22T14:49:43.056Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/64/925f213fdcbb9baeb1530449ac71a4d57fc361c053d06bf78d0c5c7cd80c/wrapt-2.1.2.tar.gz", hash = "sha256:3996a67eecc2c68fd47b4e3c564405a5777367adfd9b8abb58387b63ee83b21e", size = 81678, upload-time = "2026-03-06T02:53:25.134Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/8b/84bc1ea68b620fe0e2696a8cff07e82f4b962d952ab14efee8955997bb70/wrapt-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0f68f478004475d97906686e702ddbddeaf717c0b68ad2794384308f2dc713ae", size = 80093, upload-time = "2026-05-22T14:47:27.074Z" }, - { url = "https://files.pythonhosted.org/packages/f3/8f/64ec81194a0bc708d9720174c998c8a32116e82b5b32c04e20a7fe01176c/wrapt-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e422b2d647a65d6b080cad5accd09055d3809bdff00c76fba8dca00ca935572a", size = 81183, upload-time = "2026-05-22T14:47:29.062Z" }, - { url = "https://files.pythonhosted.org/packages/94/c2/3d186944aae923631d1def58f4c4ff8f0b6309906afc0b6978de3e69b3e0/wrapt-2.2.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:036dfb40128819a751c6f451c6b9c10172c49e4c401aebcdb8ecf2aec1683598", size = 152494, upload-time = "2026-05-22T14:47:30.583Z" }, - { url = "https://files.pythonhosted.org/packages/01/d1/6b3d0ea995b867d2862aad5619bd5e17de09a9d64a821f46832dcd272d40/wrapt-2.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09ac16c081bebfd15d8e4dfa5bdc805990bbd52249ecff22530da7a129d6120b", size = 154310, upload-time = "2026-05-22T14:47:32.175Z" }, - { url = "https://files.pythonhosted.org/packages/f9/4b/37ecb90a8c3753e580327fb40731a984b754e3df65d2ef932bf359fe4adc/wrapt-2.2.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:07be671fa8875971222b0ba9059ed8b4dc738631122feba17c93aa36b4213e9a", size = 149002, upload-time = "2026-05-22T14:47:34.021Z" }, - { url = "https://files.pythonhosted.org/packages/e7/d0/918884d9dfa84d0d135b42a51c00910f5c5447fe7a5e211a8e16ac324dd4/wrapt-2.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93fc2bf40cd7f4a0256010dce073d44eeb4a351b9bca94d0477ce2b6e62532b3", size = 153185, upload-time = "2026-05-22T14:47:35.722Z" }, - { url = "https://files.pythonhosted.org/packages/4c/00/382299d8ced610b29b59b099a89eda821e8c489aa152b7183748ac83f32a/wrapt-2.2.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ba519b2d765df9871a25879e6f7fa78948ea59a2a31f9c1a257e34b651994afc", size = 148040, upload-time = "2026-05-22T14:47:37.052Z" }, - { url = "https://files.pythonhosted.org/packages/6c/46/62a79b79e35bbebb1207ca5d15b81192f37f20cc5659cf4e3ce955b7fcc8/wrapt-2.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9011395be8db1827d106c6449b4bb6dd17e331ff6ec521f227e4588f1c78e46f", size = 151773, upload-time = "2026-05-22T14:47:38.713Z" }, - { url = "https://files.pythonhosted.org/packages/a1/db/95c152151d206d4b430516c89725306e92484072f38e65492afde63f6d19/wrapt-2.2.1-cp310-cp310-win32.whl", hash = "sha256:a8f7176b83664af44567e9cc06e0d3827823fcc1a5e52307ebb8ac3aa95860b9", size = 77393, upload-time = "2026-05-22T14:47:40.061Z" }, - { url = "https://files.pythonhosted.org/packages/13/d3/882d50452c6fbd13f24fe5d2644b97cdad2565a7e1522cbb6312de8a52cf/wrapt-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:d7f513d3185e6fec82d0c3518f2e6365d8b4e49f5f45f29640d5162d56a23b54", size = 80350, upload-time = "2026-05-22T14:47:41.194Z" }, - { url = "https://files.pythonhosted.org/packages/58/0f/148376523b4e370692286a9ba14d5715cf3c5b86da3bd3630926367b6b73/wrapt-2.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:44255c84bc57554fed822e83e70036b51afa9edb56fc7ca56c54410ece7898c9", size = 79149, upload-time = "2026-05-22T14:47:42.835Z" }, - { url = "https://files.pythonhosted.org/packages/5f/ac/4370bde262c0e633e6c4f0e56d55095710024cf9a5cecc20c59a10de483c/wrapt-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd57607acc85678925940bd5df0385ff8332083a32fa8d7a43f8767f4997263c", size = 80321, upload-time = "2026-05-22T14:47:43.996Z" }, - { url = "https://files.pythonhosted.org/packages/eb/79/b8ff3a61e71babf58a8cf4c0d63358e8bad383e15bf7f35e62d2f6b6e4a4/wrapt-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ae574d65c9fa8e86f64f6a7c2668f9fcd507b183e0e577619f504b883cb0a6c", size = 81216, upload-time = "2026-05-22T14:47:45.243Z" }, - { url = "https://files.pythonhosted.org/packages/6e/fd/c0cac1f77c9c4f6fe58a920ca632ce379bb8be928720e11e8d73de28a5e9/wrapt-2.2.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9a04c28c10ba7fd12842b109d2edb0678872a2fe65277ca4ff06a0d61edee245", size = 159208, upload-time = "2026-05-22T14:47:47.176Z" }, - { url = "https://files.pythonhosted.org/packages/d9/4f/744132a7b2fbefa6b81118ec5942eca5fc2e9a129f9055a0c5e46885a549/wrapt-2.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e2f02472a1cbbf3884b365714a810b5947134a95ad6952b554cb8cce9d492b0", size = 160322, upload-time = "2026-05-22T14:47:49.04Z" }, - { url = "https://files.pythonhosted.org/packages/d6/95/b7cd9a22a06cf93e6482904ee6afc956248983553593fd1009296d1b3b31/wrapt-2.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac2745950b2bff80219c15ebf2fa9d8427eba7e249739f97e55c9d169e47e9e1", size = 153243, upload-time = "2026-05-22T14:47:50.386Z" }, - { url = "https://files.pythonhosted.org/packages/4c/4a/eb79423192015f46f0db2872e7e04a3dde8d359b83411e8959e7c9287eaa/wrapt-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67a97e5b6c457f0cd3cfc19ebb2d84463e60c3ece754cc831e4281a3ca29bb18", size = 159231, upload-time = "2026-05-22T14:47:51.753Z" }, - { url = "https://files.pythonhosted.org/packages/ec/dc/435015b58ce33c6fc4104158fa91ddb0e809ab03a5751fb7465d1d461456/wrapt-2.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c803a3d331796255af51ba2c79ed0ac8275865b516c09e61f248d1e7aff31ce9", size = 152351, upload-time = "2026-05-22T14:47:53.214Z" }, - { url = "https://files.pythonhosted.org/packages/77/ac/5d203f98df8fd136b95c5227139aea02d34505e18baf812d0c005df61963/wrapt-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9b984d1eb252145d6302c1dbd5e87fc6d404d45531447c84eadec04bf1fcb027", size = 158347, upload-time = "2026-05-22T14:47:54.982Z" }, - { url = "https://files.pythonhosted.org/packages/52/2f/a92427dbdc74e54c1674abbed27e61b2cb5e7a94441b8c1270c70671d928/wrapt-2.2.1-cp311-cp311-win32.whl", hash = "sha256:8a983a603a18c8708f024f7f6991b2e66159219abbf894634c5056243c55f3cd", size = 77562, upload-time = "2026-05-22T14:47:56.275Z" }, - { url = "https://files.pythonhosted.org/packages/c8/56/987b9c13b3e1c1a3c6de71284076f996b79caec90e75a87c044a40c23db9/wrapt-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:9c210a6994b21aa9b29e81c8d11560e8fdab54c117e9cff37870d0a27bde1343", size = 80616, upload-time = "2026-05-22T14:47:57.854Z" }, - { url = "https://files.pythonhosted.org/packages/7e/25/d01f560888d99d94a959c85533de349ce68d71ace3f2591d6ea8f632cfed/wrapt-2.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:401229e9d63ca09f9b8891ecf83798d26c11bbb445d11ed9f1836b6d4585b38a", size = 79025, upload-time = "2026-05-22T14:47:59.089Z" }, - { url = "https://files.pythonhosted.org/packages/89/0c/bfae7b9401583b6d05938cd16dedc43857d96da2f8a3d50d78cc515bf6ff/wrapt-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ffad790d9d11d8ecf9f17c4bb671a5b4089e4d8b575c46c5129597f41f836b0", size = 81021, upload-time = "2026-05-22T14:48:00.313Z" }, - { url = "https://files.pythonhosted.org/packages/26/58/80f6a6599f933f4caecc1cb3ee88a04faf81e8b9bddbd6109c688dd63e0f/wrapt-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:628f5220c7a904d5fc78f7075c8d7871433eb6d035c94728a22fdf85f193d2a8", size = 81692, upload-time = "2026-05-22T14:48:01.49Z" }, - { url = "https://files.pythonhosted.org/packages/17/93/fb357cc7847c58a8ae790be718903afa81a28d23e642c843dc4129e8a0b2/wrapt-2.2.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:61acce4257a9883669703c525447c5b4c392edf0f987ae77ec32668440158f0e", size = 169364, upload-time = "2026-05-22T14:48:02.791Z" }, - { url = "https://files.pythonhosted.org/packages/aa/0b/76b601ee309a8bd556af0eecb184394c20b3c49aa9c8e085aa1ffacc2568/wrapt-2.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727ab4244622cd6ad2390f322642090c877d2e83a608d2653a7643ae5368d926", size = 171079, upload-time = "2026-05-22T14:48:04.22Z" }, - { url = "https://files.pythonhosted.org/packages/cd/87/ee3f32d5658e3e26d3e0e457922b47a36dd3bfbdfee7f97bb3e802344a66/wrapt-2.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03df9ebed4c73ab93fa8c07e3d41d818dfca1852b15731a3de59457b27814624", size = 160205, upload-time = "2026-05-22T14:48:05.553Z" }, - { url = "https://files.pythonhosted.org/packages/b1/d0/ae2fd64277a67f5d7bffcf2d05eea1e476263fb2a072baf0b0129ab85984/wrapt-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0d9ff006f420b2ec8296aa56ade43ea7da3e997e85769f0aafc5e0661aacb710", size = 168922, upload-time = "2026-05-22T14:48:07.132Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f3/2d541a060c5bbafb9400bca4917e4d78bfd1f239f404782c86831a8f6b29/wrapt-2.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:844c858fc3bb7eacc0ba8efa904935d16aac6a4470948ad1e7e55c9f5a2a665f", size = 158388, upload-time = "2026-05-22T14:48:08.629Z" }, - { url = "https://files.pythonhosted.org/packages/1d/68/8d92c8800c57e93cb116ae9e9d6cbafc34fade5ee9f9107b6f203fb4dc35/wrapt-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87bacdaf225117a342a20d9c03438d701c02112f6e3f351ce9b7f32354f14797", size = 167682, upload-time = "2026-05-22T14:48:10.042Z" }, - { url = "https://files.pythonhosted.org/packages/30/72/83ea3790ea352439442349388e29ff07b76e0686265f9088bbb505d1608d/wrapt-2.2.1-cp312-cp312-win32.whl", hash = "sha256:2f8c90c8afde51969487be4e1343ae049b268854877d415c2510baf833775052", size = 77857, upload-time = "2026-05-22T14:48:11.782Z" }, - { url = "https://files.pythonhosted.org/packages/ef/cb/99450668dd3502d62a54a1c8aa56e44f34cb8c1261b381cfe2e7926c3b75/wrapt-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ce32763ac31ce94fe9aada947e479b1975012bff166da409b4b9e4e376cf7e5", size = 80825, upload-time = "2026-05-22T14:48:13.046Z" }, - { url = "https://files.pythonhosted.org/packages/e6/3a/87512881be64e743f9ee4c66f4cbe8e884974bef2a5989af71f999653ac7/wrapt-2.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d1b4d0e0c2119587a31f5c029abd547e0c81d93b89d394566fe1588659eb579", size = 79087, upload-time = "2026-05-22T14:48:14.323Z" }, - { url = "https://files.pythonhosted.org/packages/53/46/29ac9daf11a86c22a8c38cd9236c62928ccae83f7ceb06bd3b0467cf9d05/wrapt-2.2.1-py3-none-any.whl", hash = "sha256:3aafea2975caef8ca49400640dde02cc7426e798f24870ed01f490bc3cffd32f", size = 61000, upload-time = "2026-05-22T14:49:41.593Z" }, + { url = "https://files.pythonhosted.org/packages/da/d2/387594fb592d027366645f3d7cc9b4d7ca7be93845fbaba6d835a912ef3c/wrapt-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a86d99a14f76facb269dc148590c01aaf47584071809a70da30555228158c", size = 60669, upload-time = "2026-03-06T02:52:40.671Z" }, + { url = "https://files.pythonhosted.org/packages/c9/18/3f373935bc5509e7ac444c8026a56762e50c1183e7061797437ca96c12ce/wrapt-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a819e39017f95bf7aede768f75915635aa8f671f2993c036991b8d3bfe8dbb6f", size = 61603, upload-time = "2026-03-06T02:54:21.032Z" }, + { url = "https://files.pythonhosted.org/packages/c2/7a/32758ca2853b07a887a4574b74e28843919103194bb47001a304e24af62f/wrapt-2.1.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5681123e60aed0e64c7d44f72bbf8b4ce45f79d81467e2c4c728629f5baf06eb", size = 113632, upload-time = "2026-03-06T02:53:54.121Z" }, + { url = "https://files.pythonhosted.org/packages/1d/d5/eeaa38f670d462e97d978b3b0d9ce06d5b91e54bebac6fbed867809216e7/wrapt-2.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b8b28e97a44d21836259739ae76284e180b18abbb4dcfdff07a415cf1016c3e", size = 115644, upload-time = "2026-03-06T02:54:53.33Z" }, + { url = "https://files.pythonhosted.org/packages/e3/09/2a41506cb17affb0bdf9d5e2129c8c19e192b388c4c01d05e1b14db23c00/wrapt-2.1.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cef91c95a50596fcdc31397eb6955476f82ae8a3f5a8eabdc13611b60ee380ba", size = 112016, upload-time = "2026-03-06T02:54:43.274Z" }, + { url = "https://files.pythonhosted.org/packages/64/15/0e6c3f5e87caadc43db279724ee36979246d5194fa32fed489c73643ba59/wrapt-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dad63212b168de8569b1c512f4eac4b57f2c6934b30df32d6ee9534a79f1493f", size = 114823, upload-time = "2026-03-06T02:54:29.392Z" }, + { url = "https://files.pythonhosted.org/packages/56/b2/0ad17c8248f4e57bedf44938c26ec3ee194715f812d2dbbd9d7ff4be6c06/wrapt-2.1.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d307aa6888d5efab2c1cde09843d48c843990be13069003184b67d426d145394", size = 111244, upload-time = "2026-03-06T02:54:02.149Z" }, + { url = "https://files.pythonhosted.org/packages/ff/04/bcdba98c26f2c6522c7c09a726d5d9229120163493620205b2f76bd13c01/wrapt-2.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c87cf3f0c85e27b3ac7d9ad95da166bf8739ca215a8b171e8404a2d739897a45", size = 113307, upload-time = "2026-03-06T02:54:12.428Z" }, + { url = "https://files.pythonhosted.org/packages/0e/1b/5e2883c6bc14143924e465a6fc5a92d09eeabe35310842a481fb0581f832/wrapt-2.1.2-cp310-cp310-win32.whl", hash = "sha256:d1c5fea4f9fe3762e2b905fdd67df51e4be7a73b7674957af2d2ade71a5c075d", size = 57986, upload-time = "2026-03-06T02:54:26.823Z" }, + { url = "https://files.pythonhosted.org/packages/42/5a/4efc997bccadd3af5749c250b49412793bc41e13a83a486b2b54a33e240c/wrapt-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:d8f7740e1af13dff2684e4d56fe604a7e04d6c94e737a60568d8d4238b9a0c71", size = 60336, upload-time = "2026-03-06T02:54:18Z" }, + { url = "https://files.pythonhosted.org/packages/c1/f5/a2bb833e20181b937e87c242645ed5d5aa9c373006b0467bfe1a35c727d0/wrapt-2.1.2-cp310-cp310-win_arm64.whl", hash = "sha256:1c6cc827c00dc839350155f316f1f8b4b0c370f52b6a19e782e2bda89600c7dc", size = 58757, upload-time = "2026-03-06T02:53:51.545Z" }, + { url = "https://files.pythonhosted.org/packages/c7/81/60c4471fce95afa5922ca09b88a25f03c93343f759aae0f31fb4412a85c7/wrapt-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96159a0ee2b0277d44201c3b5be479a9979cf154e8c82fa5df49586a8e7679bb", size = 60666, upload-time = "2026-03-06T02:52:58.934Z" }, + { url = "https://files.pythonhosted.org/packages/6b/be/80e80e39e7cb90b006a0eaf11c73ac3a62bbfb3068469aec15cc0bc795de/wrapt-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98ba61833a77b747901e9012072f038795de7fc77849f1faa965464f3f87ff2d", size = 61601, upload-time = "2026-03-06T02:53:00.487Z" }, + { url = "https://files.pythonhosted.org/packages/b0/be/d7c88cd9293c859fc74b232abdc65a229bb953997995d6912fc85af18323/wrapt-2.1.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:767c0dbbe76cae2a60dd2b235ac0c87c9cccf4898aef8062e57bead46b5f6894", size = 114057, upload-time = "2026-03-06T02:52:44.08Z" }, + { url = "https://files.pythonhosted.org/packages/ea/25/36c04602831a4d685d45a93b3abea61eca7fe35dab6c842d6f5d570ef94a/wrapt-2.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c691a6bc752c0cc4711cc0c00896fcd0f116abc253609ef64ef930032821842", size = 116099, upload-time = "2026-03-06T02:54:56.74Z" }, + { url = "https://files.pythonhosted.org/packages/5c/4e/98a6eb417ef551dc277bec1253d5246b25003cf36fdf3913b65cb7657a56/wrapt-2.1.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f3b7d73012ea75aee5844de58c88f44cf62d0d62711e39da5a82824a7c4626a8", size = 112457, upload-time = "2026-03-06T02:53:52.842Z" }, + { url = "https://files.pythonhosted.org/packages/cb/a6/a6f7186a5297cad8ec53fd7578533b28f795fdf5372368c74bd7e6e9841c/wrapt-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:577dff354e7acd9d411eaf4bfe76b724c89c89c8fc9b7e127ee28c5f7bcb25b6", size = 115351, upload-time = "2026-03-06T02:53:32.684Z" }, + { url = "https://files.pythonhosted.org/packages/97/6f/06e66189e721dbebd5cf20e138acc4d1150288ce118462f2fcbff92d38db/wrapt-2.1.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3d7b6fd105f8b24e5bd23ccf41cb1d1099796524bcc6f7fbb8fe576c44befbc9", size = 111748, upload-time = "2026-03-06T02:53:08.455Z" }, + { url = "https://files.pythonhosted.org/packages/ef/43/4808b86f499a51370fbdbdfa6cb91e9b9169e762716456471b619fca7a70/wrapt-2.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:866abdbf4612e0b34764922ef8b1c5668867610a718d3053d59e24a5e5fcfc15", size = 113783, upload-time = "2026-03-06T02:53:02.02Z" }, + { url = "https://files.pythonhosted.org/packages/91/2c/a3f28b8fa7ac2cefa01cfcaca3471f9b0460608d012b693998cd61ef43df/wrapt-2.1.2-cp311-cp311-win32.whl", hash = "sha256:5a0a0a3a882393095573344075189eb2d566e0fd205a2b6414e9997b1b800a8b", size = 57977, upload-time = "2026-03-06T02:53:27.844Z" }, + { url = "https://files.pythonhosted.org/packages/3f/c3/2b1c7bd07a27b1db885a2fab469b707bdd35bddf30a113b4917a7e2139d2/wrapt-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:64a07a71d2730ba56f11d1a4b91f7817dc79bc134c11516b75d1921a7c6fcda1", size = 60336, upload-time = "2026-03-06T02:54:28.104Z" }, + { url = "https://files.pythonhosted.org/packages/ec/5c/76ece7b401b088daa6503d6264dd80f9a727df3e6042802de9a223084ea2/wrapt-2.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:b89f095fe98bc12107f82a9f7d570dc83a0870291aeb6b1d7a7d35575f55d98a", size = 58756, upload-time = "2026-03-06T02:53:16.319Z" }, + { url = "https://files.pythonhosted.org/packages/4c/b6/1db817582c49c7fcbb7df6809d0f515af29d7c2fbf57eb44c36e98fb1492/wrapt-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ff2aad9c4cda28a8f0653fc2d487596458c2a3f475e56ba02909e950a9efa6a9", size = 61255, upload-time = "2026-03-06T02:52:45.663Z" }, + { url = "https://files.pythonhosted.org/packages/a2/16/9b02a6b99c09227c93cd4b73acc3678114154ec38da53043c0ddc1fba0dc/wrapt-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6433ea84e1cfacf32021d2a4ee909554ade7fd392caa6f7c13f1f4bf7b8e8748", size = 61848, upload-time = "2026-03-06T02:53:48.728Z" }, + { url = "https://files.pythonhosted.org/packages/af/aa/ead46a88f9ec3a432a4832dfedb84092fc35af2d0ba40cd04aea3889f247/wrapt-2.1.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c20b757c268d30d6215916a5fa8461048d023865d888e437fab451139cad6c8e", size = 121433, upload-time = "2026-03-06T02:54:40.328Z" }, + { url = "https://files.pythonhosted.org/packages/3a/9f/742c7c7cdf58b59085a1ee4b6c37b013f66ac33673a7ef4aaed5e992bc33/wrapt-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79847b83eb38e70d93dc392c7c5b587efe65b3e7afcc167aa8abd5d60e8761c8", size = 123013, upload-time = "2026-03-06T02:53:26.58Z" }, + { url = "https://files.pythonhosted.org/packages/e8/44/2c3dd45d53236b7ed7c646fcf212251dc19e48e599debd3926b52310fafb/wrapt-2.1.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f8fba1bae256186a83d1875b2b1f4e2d1242e8fac0f58ec0d7e41b26967b965c", size = 117326, upload-time = "2026-03-06T02:53:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/74/e2/b17d66abc26bd96f89dec0ecd0ef03da4a1286e6ff793839ec431b9fae57/wrapt-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e3d3b35eedcf5f7d022291ecd7533321c4775f7b9cd0050a31a68499ba45757c", size = 121444, upload-time = "2026-03-06T02:54:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/3c/62/e2977843fdf9f03daf1586a0ff49060b1b2fc7ff85a7ea82b6217c1ae36e/wrapt-2.1.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6f2c5390460de57fa9582bc8a1b7a6c86e1a41dfad74c5225fc07044c15cc8d1", size = 116237, upload-time = "2026-03-06T02:54:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/27fc67914e68d740bce512f11734aec08696e6b17641fef8867c00c949fc/wrapt-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7dfa9f2cf65d027b951d05c662cc99ee3bd01f6e4691ed39848a7a5fffc902b2", size = 120563, upload-time = "2026-03-06T02:53:20.412Z" }, + { url = "https://files.pythonhosted.org/packages/ec/9f/b750b3692ed2ef4705cb305bd68858e73010492b80e43d2a4faa5573cbe7/wrapt-2.1.2-cp312-cp312-win32.whl", hash = "sha256:eba8155747eb2cae4a0b913d9ebd12a1db4d860fc4c829d7578c7b989bd3f2f0", size = 58198, upload-time = "2026-03-06T02:53:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b2/feecfe29f28483d888d76a48f03c4c4d8afea944dbee2b0cd3380f9df032/wrapt-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1c51c738d7d9faa0b3601708e7e2eda9bf779e1b601dce6c77411f2a1b324a63", size = 60441, upload-time = "2026-03-06T02:52:47.138Z" }, + { url = "https://files.pythonhosted.org/packages/44/e1/e328f605d6e208547ea9fd120804fcdec68536ac748987a68c47c606eea8/wrapt-2.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:c8e46ae8e4032792eb2f677dbd0d557170a8e5524d22acc55199f43efedd39bf", size = 58836, upload-time = "2026-03-06T02:53:22.053Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c7/8528ac2dfa2c1e6708f647df7ae144ead13f0a31146f43c7264b4942bf12/wrapt-2.1.2-py3-none-any.whl", hash = "sha256:b8fd6fa2b2c4e7621808f8c62e8317f4aae56e59721ad933bac5239d913cf0e8", size = 43993, upload-time = "2026-03-06T02:53:12.905Z" }, ] [[package]] name = "yarl" -version = "1.24.2" +version = "1.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/79/12/1e8f37460ea0f7eb59c221fdaf0ed75e7ac43e97f8093b9c6f411df50a78/yarl-1.24.2.tar.gz", hash = "sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8", size = 210798, upload-time = "2026-05-19T21:31:05.599Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/df/f1c7a3de0831cd83194f1a85c5bb431b13f81e6b45079314c86d1c4ef3f2/yarl-1.24.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5249a113065c2b7a958bc699759e359cd61cfc81e3069662208f48f191b7ed12", size = 129057, upload-time = "2026-05-19T21:27:47.564Z" }, - { url = "https://files.pythonhosted.org/packages/48/41/7daafb32dd7562bf45b1ce56562e7e1a9146f6479b6456873eb8a3413c40/yarl-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4425fa244fbf530b006d0c5f79ce920114cfff5b4f5f6056e669f8e160fdc0", size = 91545, upload-time = "2026-05-19T21:27:50.089Z" }, - { url = "https://files.pythonhosted.org/packages/a8/8f/7b3ec212f1ea0683f55f978e3246bc313c38818664edfc97a9f349a4901e/yarl-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15c0b5e49d3c44e2a0b93e6a49476c5edad0a7686b92c395765a7ea775572a75", size = 91380, upload-time = "2026-05-19T21:27:51.953Z" }, - { url = "https://files.pythonhosted.org/packages/8a/1b/8bafab7db23b0567ae9db749099b329d91e3b82bc6028b2050ba583e116c/yarl-1.24.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:246d32a53a947c8f0189f5d699cbd4c7036de45d9359e13ba238d1239678c727", size = 105957, upload-time = "2026-05-19T21:27:53.98Z" }, - { url = "https://files.pythonhosted.org/packages/7f/77/21030c2f8d21d21559719beafc772ada2014be933418ed1eaed9cc800e42/yarl-1.24.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:64480fb3e4d4ed9ed71c48a91a477384fc342a50ca30071d2f8a88d51d9c9413", size = 97242, upload-time = "2026-05-19T21:27:55.981Z" }, - { url = "https://files.pythonhosted.org/packages/50/d8/f9ea63d1b6aa910a866e089d871fff6cbd49caab29b86b35221a62dfa0d5/yarl-1.24.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:349de4701dc3760b6e876628423a8f147ef4f5599d10aba1e10702075d424ed9", size = 114719, upload-time = "2026-05-19T21:27:58.037Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a3/04e0ee98ac58a249ea7ed75223f5f901ba81a834f0b4921b58e5cec11757/yarl-1.24.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d162677af8d5d3d6ebab8394b021f4d041ac107a4b705873148a77a49dc9e1b2", size = 112140, upload-time = "2026-05-19T21:27:59.618Z" }, - { url = "https://files.pythonhosted.org/packages/02/ad/0b9cc9f38a7324a7eb1d80f834eaa5283d17e9271bbda3186e598dddaeac/yarl-1.24.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5f5c6ec23a9043f2d139cc072f53dd23168d202a334b9b2fda8de4c3e890d90", size = 106721, upload-time = "2026-05-19T21:28:02.586Z" }, - { url = "https://files.pythonhosted.org/packages/65/e7/a52478ebfc66ec989e085c6ae038b9f1bfa4190baa193b133b669c709e2f/yarl-1.24.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:60de6742447fbbf697f16f070b8a443f1b5fe6ca3826fbef9fe70ecd5328e643", size = 106478, upload-time = "2026-05-19T21:28:04.523Z" }, - { url = "https://files.pythonhosted.org/packages/04/d8/5508530fea8472542de00013ae280765fc938ee196fc4030c43a498afb36/yarl-1.24.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acf93187c3710e422368eb768aee98db551ec7c85adc250207a95c16548ab7ac", size = 105423, upload-time = "2026-05-19T21:28:06.515Z" }, - { url = "https://files.pythonhosted.org/packages/84/f1/ece28505e9628e8b756e11bb4f28864a17cc33b6b44db4d2aaf0622bf630/yarl-1.24.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f4b0352fd41fd34b6651934606268816afd6914d09626f9bcbbf018edb0afb3f", size = 99878, upload-time = "2026-05-19T21:28:08.637Z" }, - { url = "https://files.pythonhosted.org/packages/3f/52/fb5d34529b46dd84013afcfb30b8d2bc2832ed03d412736f577d604fa393/yarl-1.24.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6b208bb939099b4b297438da4e9b25357f0b1c791888669b963e45b203ea9f36", size = 114025, upload-time = "2026-05-19T21:28:10.64Z" }, - { url = "https://files.pythonhosted.org/packages/43/f0/ff9d31aaab024f7a251c0ed308a98ae29bf9f7dc344e78f28b1322431ca2/yarl-1.24.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4b85b8825e631295ff4bc8943f7471d54c533a9360bbe15ebb38e018b555bb8a", size = 105613, upload-time = "2026-05-19T21:28:12.784Z" }, - { url = "https://files.pythonhosted.org/packages/31/7d/3296fb3f3ecd52bf9ae6c16b0895c1cda7e9170a2083861552b683f70264/yarl-1.24.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e26acf20c26cb4fefc631fdb75aca2a6b8fa8b7b5d7f204fb6a8f1e63c706f53", size = 111665, upload-time = "2026-05-19T21:28:14.393Z" }, - { url = "https://files.pythonhosted.org/packages/1a/74/77aa6ddaca4fbf42e45e675a465c43956dd40702281049975a2aa04eae59/yarl-1.24.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:819ca24f8eafcfb683c1bd5f44f2f488cea1274eb8944731ffd2e1f10f619342", size = 106914, upload-time = "2026-05-19T21:28:15.893Z" }, - { url = "https://files.pythonhosted.org/packages/d8/02/7611f22cd1d4ed7373eb7f9ee21fde1046edba2e7c0e514880d760352f48/yarl-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:5cb0f995a901c36be096ccbf4c673591c2faabbe96279598ffaec8c030f85bf4", size = 92658, upload-time = "2026-05-19T21:28:17.471Z" }, - { url = "https://files.pythonhosted.org/packages/91/00/671d0add79938127292839ae44506ce2f7fe8909c72d5a931864f128fd0b/yarl-1.24.2-cp310-cp310-win_arm64.whl", hash = "sha256:f408eace7e22a68b467a0562e0d27d322f91fe3eaaa6f466b962c6cfaea9fa39", size = 87887, upload-time = "2026-05-19T21:28:19.021Z" }, - { url = "https://files.pythonhosted.org/packages/c5/c5/1ce244152ff2839645e7cae92f90e7bafcb2c52bea7ff586ac714f14f5df/yarl-1.24.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:36348bebb147b83818b9d7e673ea4debc75970afc6ffdc7e3975ad05ce5a58c1", size = 128971, upload-time = "2026-05-19T21:28:20.543Z" }, - { url = "https://files.pythonhosted.org/packages/87/5a/00f36967203ed89cb3acd2c8ed526cc3fed9418eb70ce128160a911c8499/yarl-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a97e42c8a2233f2f279ecadd9e4a037bcb5d813b78435e8eedd4db5a9e9708c", size = 91507, upload-time = "2026-05-19T21:28:22.556Z" }, - { url = "https://files.pythonhosted.org/packages/31/d0/1fb0c1cd27288f39f6974da4318c32768d72c9890984541fdf1e2e32a51d/yarl-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d027d56f1035e339d1001ac33eceab5b2ec8e42e449787bb75e289fb9a5cd1d", size = 91343, upload-time = "2026-05-19T21:28:24.092Z" }, - { url = "https://files.pythonhosted.org/packages/03/ce/d4a646508bed2f8dec6435b40166fe9308dd191262033d3f307b2bbcaecd/yarl-1.24.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a6377060e7927187a42b7eb202090cbe2b34933a4eeaf90e3bd9e33432e5cae", size = 105704, upload-time = "2026-05-19T21:28:25.872Z" }, - { url = "https://files.pythonhosted.org/packages/4b/07/b3278e82d8bc41485bcf6d856cd0433262593de615b1d3dc43bd3f5bead4/yarl-1.24.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:17076578bce0049a5ce57d14ad1bded391b68a3b213e9b81b0097b090244999a", size = 97281, upload-time = "2026-05-19T21:28:27.352Z" }, - { url = "https://files.pythonhosted.org/packages/17/5b/4cee6e7c92e487bebe7afc797da0aa54a248ab4e776a68fe369ec29665a5/yarl-1.24.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:50713f1d4d6be6375bb178bb43d140ee1acb8abe589cd723320b7925a275be1e", size = 114020, upload-time = "2026-05-19T21:28:29.458Z" }, - { url = "https://files.pythonhosted.org/packages/5c/82/111076571545a7d4f9cca3fbd5c6f40615af58642be09f12328f48022468/yarl-1.24.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:34263e2fa8fb5bb63a0d97706cda38edbad62fddb58c7f12d6acbc092812aa50", size = 111450, upload-time = "2026-05-19T21:28:31.262Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ec/08f671f69a444d704aeecebf92af659b67b97a869942411d0a578b08c334/yarl-1.24.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49016d82f032b1bd1e10b01078a7d29ae71bf468eeae0ea22df8bab691e60003", size = 106384, upload-time = "2026-05-19T21:28:32.856Z" }, - { url = "https://files.pythonhosted.org/packages/e5/86/ce41e7a7a199340b2330d52b60f25c4074b6636dd0e60b1a80d31a9db042/yarl-1.24.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f6d2c216318f8f32038ca3f72501ba08536f0fd18a36e858836b121b2deed9f", size = 106153, upload-time = "2026-05-19T21:28:35.222Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5d/31be8a729531ab3e55ac3e7e5c800be8c89ea98947f418b2f6ea259fb6ee/yarl-1.24.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:08d3a33218e0c64393e7610284e770409a9c31c429b078bcb24096ed0a783b8f", size = 105322, upload-time = "2026-05-19T21:28:36.642Z" }, - { url = "https://files.pythonhosted.org/packages/47/9b/b57afb22b386ae87ac9940f09878b98d8c333f89113e6fc96fcf4ca9eb64/yarl-1.24.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5d699376c4ca3cba49bbfae3a05b5b70ded572937171ce1e0b8d87118e2ba294", size = 99057, upload-time = "2026-05-19T21:28:38.386Z" }, - { url = "https://files.pythonhosted.org/packages/a3/4f/06348c27c8389256c313e8a57d796808fc0264c915dd5e7cfd3c0e314dc7/yarl-1.24.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a1cab588b4fa14bea2e55ebea27478adfb05372f47573738e1acc4a36c0b05d2", size = 113502, upload-time = "2026-05-19T21:28:40.091Z" }, - { url = "https://files.pythonhosted.org/packages/5f/1c/284f307b298e4a17b7943b07d9d7ecc4151537f8d137ba51f3bb6c31ca20/yarl-1.24.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ec87ccc31bd21db7ad009d8572c127c1000f268517618a4cc09adba3c2a7f21c", size = 105253, upload-time = "2026-05-19T21:28:41.987Z" }, - { url = "https://files.pythonhosted.org/packages/c8/bf/0de123bec8619e45c80cbded9085f61b5b4a9eddb8abe6d25d28ee1ec866/yarl-1.24.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d1dd47a22843b212baa8d74f37796815d43bd046b42a0f41e9da433386c3136b", size = 111345, upload-time = "2026-05-19T21:28:43.93Z" }, - { url = "https://files.pythonhosted.org/packages/90/af/0248eb065e51129d2a9b2436cd1b5c772c19a6b04e5b6a186955671e3319/yarl-1.24.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7b54b9c67c2b06bd7b9a77253d242124b9c95d2c02def5a1144001ee547dd9d5", size = 106558, upload-time = "2026-05-19T21:28:45.806Z" }, - { url = "https://files.pythonhosted.org/packages/21/3c/f960d7a65ef97d8ba9b424fb5128796a4bc710fc6df2ddbbd7dfdc3bbd20/yarl-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:f8fdbcff8b2c7c9284e60c196f693588598ddcee31e11c18e14949ce44519d45", size = 92808, upload-time = "2026-05-19T21:28:48.465Z" }, - { url = "https://files.pythonhosted.org/packages/03/1a/49fb03750e4de4d2284cd5b885a383133c34eef45bd59631b2bb8b7e81e8/yarl-1.24.2-cp311-cp311-win_arm64.whl", hash = "sha256:b32c37a7a337e90822c45797bf3d79d60875cfcccd3ecc80e9f453d87026c122", size = 87610, upload-time = "2026-05-19T21:28:50.07Z" }, - { url = "https://files.pythonhosted.org/packages/f0/da/866bcb01076ba49d2b42b309867bed3826421f1c479655eb7a607b44f20b/yarl-1.24.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b975866c184564c827e0877380f0dae57dcca7e52782128381b72feff6dfceb8", size = 129957, upload-time = "2026-05-19T21:28:51.695Z" }, - { url = "https://files.pythonhosted.org/packages/bf/1d/fcefb70922ea2268a8971d8e5874d9a8218644200fb8465f1dcad55e6851/yarl-1.24.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3b075301a2836a0e297b1b658cb6d6135df535d62efefdd60366bd589c2c82f2", size = 92164, upload-time = "2026-05-19T21:28:53.242Z" }, - { url = "https://files.pythonhosted.org/packages/29/b6/170e2b8d4e3bc30e6bfdcca53556537f5bf595e938632dfcb059311f3ff6/yarl-1.24.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ae44649b00947634ab0dab2a374a638f52923a6e67083f2c156cd5cbd1a881d", size = 91688, upload-time = "2026-05-19T21:28:54.865Z" }, - { url = "https://files.pythonhosted.org/packages/fe/a5/c9f655d5553ea0b99fdac9d6a99ad3f9b3e73b8e5758bb46f58c9831f74c/yarl-1.24.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507cc19f0b45454e2d6dcd62ff7d062b9f77a2812404e62dbdaec05b50faa035", size = 102902, upload-time = "2026-05-19T21:28:56.963Z" }, - { url = "https://files.pythonhosted.org/packages/5d/bc/6b9664d815d79af4ee553337f9d606c56bbf269186ada9172de45f1b5f60/yarl-1.24.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4c17bad5a530912d2111825d3f05e89bab2dd376aaa8cbc77e449e6db63e576", size = 97931, upload-time = "2026-05-19T21:28:58.56Z" }, - { url = "https://files.pythonhosted.org/packages/98/ec/32ba48acae30fecd60928f5791188b80a9d6ee3840507ffda29fecd37b71/yarl-1.24.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5f0cbb112838a4a293985b6ed73948a547dadcc1ba6d2089938e7abdedceef8", size = 111030, upload-time = "2026-05-19T21:29:00.148Z" }, - { url = "https://files.pythonhosted.org/packages/82/5a/6f4cd081e5f4934d2ae3a8ef4abe3afacc010d26f0035ee91b35cd7d7c37/yarl-1.24.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ec8356b8a6afcf81fc7aeeef13b1ff7a49dec00f313394bbb9e83830d32ccd7", size = 110392, upload-time = "2026-05-19T21:29:02.155Z" }, - { url = "https://files.pythonhosted.org/packages/7a/da/323a01c349bd5fb01bb6652e314d9bb218cee630a736bdb810ad50e4013f/yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c", size = 105612, upload-time = "2026-05-19T21:29:04.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/80/264ab684f181e1a876389374519ff05d10248725535ae2ac4e8ac4e563d6/yarl-1.24.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:47a55d6cf6db2f401017a9e96e5288844e5051911fb4e0c8311a3980f5e59a7d", size = 104487, upload-time = "2026-05-19T21:29:06.491Z" }, - { url = "https://files.pythonhosted.org/packages/41/07/efabe5df87e96d7ad5959760b888344be48cd6884db127b407c6b5503adc/yarl-1.24.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3065657c80a2321225e804048597ad55658a7e76b32d6f5ee4074d04c50401db", size = 102333, upload-time = "2026-05-19T21:29:08.267Z" }, - { url = "https://files.pythonhosted.org/packages/44/0c/bcf7c42603e1009295f586d8890f2ba032c8b53310e815adf0a202c73d9f/yarl-1.24.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cb84b80d88e19ede158619b80813968713d8d008b0e2497a576e6a0557d50712", size = 99025, upload-time = "2026-05-19T21:29:10.682Z" }, - { url = "https://files.pythonhosted.org/packages/4f/82/84482ab1a57a0f21a08afe6a7004c61d741f8f2ecc3b05c321577c612164/yarl-1.24.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:990de4f680b1c217e77ff0d6aa0029f9eb79889c11fb3e9a3942c7eba29c1996", size = 110507, upload-time = "2026-05-19T21:29:12.954Z" }, - { url = "https://files.pythonhosted.org/packages/c4/8d/a546ba1dfe1b0f290e05fef145cd07614c0f15df1a707195e512d1e39d1d/yarl-1.24.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:abb8ec0323b80161e3802da3150ef660b41d0e9be2048b76a363d93eee992c2b", size = 103719, upload-time = "2026-05-19T21:29:14.893Z" }, - { url = "https://files.pythonhosted.org/packages/1a/b6/267f2a09213138473adfce6b8a6e17791d7fee70bd4d9003218e4dec58b0/yarl-1.24.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e7977781f83638a4c73e0f88425563d70173e0dfd90ac006a45c65036293ee3c", size = 110438, upload-time = "2026-05-19T21:29:16.485Z" }, - { url = "https://files.pythonhosted.org/packages/48/2d/1c8d89c7c5f9cad9fb2902445d94e2ab1d7aa35de029afbb8ae95c42d00f/yarl-1.24.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e30dd55825dc554ec5b66a94953b8eda8745926514c5089dfcacecb9c99b5bd1", size = 105719, upload-time = "2026-05-19T21:29:18.367Z" }, - { url = "https://files.pythonhosted.org/packages/a7/25/722e3b93bd687009afb2d59a35e13d30ddd8f80571445bb0c4e4ce26ec66/yarl-1.24.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dafe10c12ddd4d120d528c4b5599c953bd7b12845347d507b95451195bb6cad", size = 92901, upload-time = "2026-05-19T21:29:20.014Z" }, - { url = "https://files.pythonhosted.org/packages/39/47/4486ccfb674c04854a1ef8aa77868b6a6f765feaf69633409d7ca4f02cb8/yarl-1.24.2-cp312-cp312-win_arm64.whl", hash = "sha256:044a09d8401fcf8681977faef6d286b8ade1e2d2e9dceda175d1cfa5ca496f30", size = 87229, upload-time = "2026-05-19T21:29:22.1Z" }, - { url = "https://files.pythonhosted.org/packages/fd/4d/4b880086bd0d3e034d25647be1d830afc3e3f610e98c4ab3490af6b1b6d5/yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9", size = 53576, upload-time = "2026-05-19T21:31:03.909Z" }, + { url = "https://files.pythonhosted.org/packages/8b/0d/9cc638702f6fc3c7a3685bcc8cf2a9ed7d6206e932a49f5242658047ef51/yarl-1.23.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cff6d44cb13d39db2663a22b22305d10855efa0fa8015ddeacc40bc59b9d8107", size = 123764, upload-time = "2026-03-01T22:04:09.7Z" }, + { url = "https://files.pythonhosted.org/packages/7a/35/5a553687c5793df5429cd1db45909d4f3af7eee90014888c208d086a44f0/yarl-1.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c53f8347cd4200f0d70a48ad059cabaf24f5adc6ba08622a23423bc7efa10d", size = 86282, upload-time = "2026-03-01T22:04:11.892Z" }, + { url = "https://files.pythonhosted.org/packages/68/2e/c5a2234238f8ce37a8312b52801ee74117f576b1539eec8404a480434acc/yarl-1.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a6940a074fb3c48356ed0158a3ca5699c955ee4185b4d7d619be3c327143e05", size = 86053, upload-time = "2026-03-01T22:04:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/74/3f/bbd8ff36fb038622797ffbaf7db314918bb4d76f1cc8a4f9ca7a55fe5195/yarl-1.23.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed5f69ce7be7902e5c70ea19eb72d20abf7d725ab5d49777d696e32d4fc1811d", size = 99395, upload-time = "2026-03-01T22:04:15.133Z" }, + { url = "https://files.pythonhosted.org/packages/77/04/9516bc4e269d2a3ec9c6779fcdeac51ce5b3a9b0156f06ac7152e5bba864/yarl-1.23.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:389871e65468400d6283c0308e791a640b5ab5c83bcee02a2f51295f95e09748", size = 92143, upload-time = "2026-03-01T22:04:16.829Z" }, + { url = "https://files.pythonhosted.org/packages/c7/63/88802d1f6b1cb1fc67d67a58cd0cf8a1790de4ce7946e434240f1d60ab4a/yarl-1.23.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dda608c88cf709b1d406bdfcd84d8d63cff7c9e577a403c6108ce8ce9dcc8764", size = 107643, upload-time = "2026-03-01T22:04:18.519Z" }, + { url = "https://files.pythonhosted.org/packages/8e/db/4f9b838f4d8bdd6f0f385aed8bbf21c71ed11a0b9983305c302cbd557815/yarl-1.23.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c4fe09e0780c6c3bf2b7d4af02ee2394439d11a523bbcf095cf4747c2932007", size = 108700, upload-time = "2026-03-01T22:04:20.373Z" }, + { url = "https://files.pythonhosted.org/packages/50/12/95a1d33f04a79c402664070d43b8b9f72dc18914e135b345b611b0b1f8cc/yarl-1.23.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c9921eb8bd12633b41ad27686bbb0b1a2a9b8452bfdf221e34f311e9942ed4", size = 102769, upload-time = "2026-03-01T22:04:23.055Z" }, + { url = "https://files.pythonhosted.org/packages/86/65/91a0285f51321369fd1a8308aa19207520c5f0587772cfc2e03fc2467e90/yarl-1.23.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5f10fd85e4b75967468af655228fbfd212bdf66db1c0d135065ce288982eda26", size = 101114, upload-time = "2026-03-01T22:04:25.031Z" }, + { url = "https://files.pythonhosted.org/packages/58/80/c7c8244fc3e5bc483dc71a09560f43b619fab29301a0f0a8f936e42865c7/yarl-1.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dbf507e9ef5688bada447a24d68b4b58dd389ba93b7afc065a2ba892bea54769", size = 98883, upload-time = "2026-03-01T22:04:27.281Z" }, + { url = "https://files.pythonhosted.org/packages/86/e7/71ca9cc9ca79c0b7d491216177d1aed559d632947b8ffb0ee60f7d8b23e3/yarl-1.23.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:85e9beda1f591bc73e77ea1c51965c68e98dafd0fec72cdd745f77d727466716", size = 94172, upload-time = "2026-03-01T22:04:28.554Z" }, + { url = "https://files.pythonhosted.org/packages/6a/3f/6c6c8a0fe29c26fb2db2e8d32195bb84ec1bfb8f1d32e7f73b787fcf349b/yarl-1.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1fdaa14ef51366d7757b45bde294e95f6c8c049194e793eedb8387c86d5993", size = 107010, upload-time = "2026-03-01T22:04:30.385Z" }, + { url = "https://files.pythonhosted.org/packages/56/38/12730c05e5ad40a76374d440ed8b0899729a96c250516d91c620a6e38fc2/yarl-1.23.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:75e3026ab649bf48f9a10c0134512638725b521340293f202a69b567518d94e0", size = 100285, upload-time = "2026-03-01T22:04:31.752Z" }, + { url = "https://files.pythonhosted.org/packages/34/92/6a7be9239f2347234e027284e7a5f74b1140cc86575e7b469d13fba1ebfe/yarl-1.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:80e6d33a3d42a7549b409f199857b4fb54e2103fc44fb87605b6663b7a7ff750", size = 108230, upload-time = "2026-03-01T22:04:33.844Z" }, + { url = "https://files.pythonhosted.org/packages/5e/81/4aebccfa9376bd98b9d8bfad20621a57d3e8cfc5b8631c1fa5f62cdd03f4/yarl-1.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ec2f42d41ccbd5df0270d7df31618a8ee267bfa50997f5d720ddba86c4a83a6", size = 103008, upload-time = "2026-03-01T22:04:35.856Z" }, + { url = "https://files.pythonhosted.org/packages/38/0f/0b4e3edcec794a86b853b0c6396c0a888d72dfce19b2d88c02ac289fb6c1/yarl-1.23.0-cp310-cp310-win32.whl", hash = "sha256:debe9c4f41c32990771be5c22b56f810659f9ddf3d63f67abfdcaa2c6c9c5c1d", size = 83073, upload-time = "2026-03-01T22:04:38.268Z" }, + { url = "https://files.pythonhosted.org/packages/a0/71/ad95c33da18897e4c636528bbc24a1dd23fe16797de8bc4ec667b8db0ba4/yarl-1.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f043cb8a2d71c981c09c510da013bc79fd661f5c60139f00dd3c3cc4f2ffb", size = 87328, upload-time = "2026-03-01T22:04:39.558Z" }, + { url = "https://files.pythonhosted.org/packages/e2/14/dfa369523c79bccf9c9c746b0a63eb31f65db9418ac01275f7950962e504/yarl-1.23.0-cp310-cp310-win_arm64.whl", hash = "sha256:263cd4f47159c09b8b685890af949195b51d1aa82ba451c5847ca9bc6413c220", size = 82463, upload-time = "2026-03-01T22:04:41.454Z" }, + { url = "https://files.pythonhosted.org/packages/a2/aa/60da938b8f0997ba3a911263c40d82b6f645a67902a490b46f3355e10fae/yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99", size = 123641, upload-time = "2026-03-01T22:04:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c", size = 86248, upload-time = "2026-03-01T22:04:44.757Z" }, + { url = "https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432", size = 85988, upload-time = "2026-03-01T22:04:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6c/4a90d59c572e46b270ca132aca66954f1175abd691f74c1ef4c6711828e2/yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a", size = 100566, upload-time = "2026-03-01T22:04:47.639Z" }, + { url = "https://files.pythonhosted.org/packages/49/fb/c438fb5108047e629f6282a371e6e91cf3f97ee087c4fb748a1f32ceef55/yarl-1.23.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aafe5dcfda86c8af00386d7781d4c2181b5011b7be3f2add5e99899ea925df05", size = 92079, upload-time = "2026-03-01T22:04:48.925Z" }, + { url = "https://files.pythonhosted.org/packages/d9/13/d269aa1aed3e4f50a5a103f96327210cc5fa5dd2d50882778f13c7a14606/yarl-1.23.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ee33b875f0b390564c1fb7bc528abf18c8ee6073b201c6ae8524aca778e2d83", size = 108741, upload-time = "2026-03-01T22:04:50.838Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/115b16f22c37ea4437d323e472945bea97301c8ec6089868fa560abab590/yarl-1.23.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c41e021bc6d7affb3364dc1e1e5fa9582b470f283748784bd6ea0558f87f42c", size = 108099, upload-time = "2026-03-01T22:04:52.499Z" }, + { url = "https://files.pythonhosted.org/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598", size = 102678, upload-time = "2026-03-01T22:04:55.176Z" }, + { url = "https://files.pythonhosted.org/packages/85/59/cd98e556fbb2bf8fab29c1a722f67ad45c5f3447cac798ab85620d1e70af/yarl-1.23.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2af5c81a1f124609d5f33507082fc3f739959d4719b56877ab1ee7e7b3d602b", size = 100803, upload-time = "2026-03-01T22:04:56.588Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c0/b39770b56d4a9f0bb5f77e2f1763cd2d75cc2f6c0131e3b4c360348fcd65/yarl-1.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c", size = 100163, upload-time = "2026-03-01T22:04:58.492Z" }, + { url = "https://files.pythonhosted.org/packages/e7/64/6980f99ab00e1f0ff67cb84766c93d595b067eed07439cfccfc8fb28c1a6/yarl-1.23.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1dc702e42d0684f42d6519c8d581e49c96cefaaab16691f03566d30658ee8788", size = 93859, upload-time = "2026-03-01T22:05:00.268Z" }, + { url = "https://files.pythonhosted.org/packages/38/69/912e6c5e146793e5d4b5fe39ff5b00f4d22463dfd5a162bec565ac757673/yarl-1.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0e40111274f340d32ebcc0a5668d54d2b552a6cca84c9475859d364b380e3222", size = 108202, upload-time = "2026-03-01T22:05:02.273Z" }, + { url = "https://files.pythonhosted.org/packages/59/97/35ca6767524687ad64e5f5c31ad54bc76d585585a9fcb40f649e7e82ffed/yarl-1.23.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4764a6a7588561a9aef92f65bda2c4fb58fe7c675c0883862e6df97559de0bfb", size = 99866, upload-time = "2026-03-01T22:05:03.597Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1c/1a3387ee6d73589f6f2a220ae06f2984f6c20b40c734989b0a44f5987308/yarl-1.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:03214408cfa590df47728b84c679ae4ef00be2428e11630277be0727eba2d7cc", size = 107852, upload-time = "2026-03-01T22:05:04.986Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b8/35c0750fcd5a3f781058bfd954515dd4b1eab45e218cbb85cf11132215f1/yarl-1.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2", size = 102919, upload-time = "2026-03-01T22:05:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1c/9a1979aec4a81896d597bcb2177827f2dbee3f5b7cc48b2d0dadb644b41d/yarl-1.23.0-cp311-cp311-win32.whl", hash = "sha256:51430653db848d258336cfa0244427b17d12db63d42603a55f0d4546f50f25b5", size = 82602, upload-time = "2026-03-01T22:05:08.444Z" }, + { url = "https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf49a3ae946a87083ef3a34c8f677ae4243f5b824bfc4c69672e72b3d6719d46", size = 87461, upload-time = "2026-03-01T22:05:10.145Z" }, + { url = "https://files.pythonhosted.org/packages/93/95/07e3553fe6f113e6864a20bdc53a78113cda3b9ced8784ee52a52c9f80d8/yarl-1.23.0-cp311-cp311-win_arm64.whl", hash = "sha256:b39cb32a6582750b6cc77bfb3c49c0f8760dc18dc96ec9fb55fbb0f04e08b928", size = 82336, upload-time = "2026-03-01T22:05:11.554Z" }, + { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, + { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, + { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, + { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" }, + { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" }, + { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, + { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" }, + { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, + { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" }, + { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" }, + { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" }, + { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, ]