From d66fd8f58e81e2b1d532399ce69bdbd74c18393e Mon Sep 17 00:00:00 2001 From: Nathan Woodburn Date: Sat, 4 Apr 2026 11:36:30 +1100 Subject: [PATCH] feat: Add new status page --- .pre-commit-config.yaml | 16 + Dockerfile | 17 - README.md | 52 +- hnsdoh_status/__init__.py | 29 + hnsdoh_status/checks.py | 250 +++ hnsdoh_status/config.py | 25 + hnsdoh_status/models.py | 40 + hnsdoh_status/routes.py | 105 ++ hnsdoh_status/scheduler.py | 34 + hnsdoh_status/static/app.js | 75 + .../static/icons}/HNS.png | Bin .../static/icons}/HNSW.png | Bin hnsdoh_status/static/style.css | 189 +++ hnsdoh_status/store.py | 30 + hnsdoh_status/templates/index.html | 56 + main.py | 90 +- pyproject.toml | 1 + requirements.txt | 310 +++- server.py | 1484 ----------------- templates/404.html | 67 - templates/api.html | 104 -- .../assets/bootstrap/css/bootstrap.min.css | 5 - .../assets/bootstrap/js/bootstrap.min.js | 6 - templates/assets/css/404.css | 19 - .../css/Navbar-Right-Links-Dark-icons.css | 57 - templates/assets/css/Team-images.css | 4 - templates/assets/css/api.css | 66 - templates/assets/css/bs-theme-overrides.css | 39 - templates/assets/css/index.css | 30 - templates/assets/img/favicon.png | Bin 29113 -> 0 bytes templates/assets/img/overview.webp | Bin 23812 -> 0 bytes templates/assets/img/people/HNSCA.webp | Bin 11234 -> 0 bytes templates/assets/img/people/easy-hns.jpg | Bin 40050 -> 0 bytes templates/assets/img/people/ezdomains.jpg | Bin 25289 -> 0 bytes templates/assets/img/people/ezdomains.png | Bin 28810 -> 0 bytes .../assets/img/people/nathanwoodburn.webp | Bin 12134 -> 0 bytes .../assets/img/people/profile - small.webp | Bin 12134 -> 0 bytes templates/assets/js/bs-init.js | 7 - templates/assets/style.css | 133 -- templates/index.html | 128 -- templates/index_fast.html | 146 -- templates/manifest.json | 15 - uv.lock | 140 +- 43 files changed, 1342 insertions(+), 2427 deletions(-) create mode 100644 .pre-commit-config.yaml delete mode 100644 Dockerfile create mode 100644 hnsdoh_status/__init__.py create mode 100644 hnsdoh_status/checks.py create mode 100644 hnsdoh_status/config.py create mode 100644 hnsdoh_status/models.py create mode 100644 hnsdoh_status/routes.py create mode 100644 hnsdoh_status/scheduler.py create mode 100644 hnsdoh_status/static/app.js rename {templates/assets/img => hnsdoh_status/static/icons}/HNS.png (100%) rename {templates/assets/img => hnsdoh_status/static/icons}/HNSW.png (100%) create mode 100644 hnsdoh_status/static/style.css create mode 100644 hnsdoh_status/store.py create mode 100644 hnsdoh_status/templates/index.html delete mode 100644 server.py delete mode 100644 templates/404.html delete mode 100644 templates/api.html delete mode 100644 templates/assets/bootstrap/css/bootstrap.min.css delete mode 100644 templates/assets/bootstrap/js/bootstrap.min.js delete mode 100644 templates/assets/css/404.css delete mode 100644 templates/assets/css/Navbar-Right-Links-Dark-icons.css delete mode 100644 templates/assets/css/Team-images.css delete mode 100644 templates/assets/css/api.css delete mode 100644 templates/assets/css/bs-theme-overrides.css delete mode 100644 templates/assets/css/index.css delete mode 100644 templates/assets/img/favicon.png delete mode 100644 templates/assets/img/overview.webp delete mode 100644 templates/assets/img/people/HNSCA.webp delete mode 100644 templates/assets/img/people/easy-hns.jpg delete mode 100644 templates/assets/img/people/ezdomains.jpg delete mode 100644 templates/assets/img/people/ezdomains.png delete mode 100644 templates/assets/img/people/nathanwoodburn.webp delete mode 100644 templates/assets/img/people/profile - small.webp delete mode 100644 templates/assets/js/bs-init.js delete mode 100644 templates/assets/style.css delete mode 100644 templates/index.html delete mode 100644 templates/index_fast.html delete mode 100644 templates/manifest.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..5ffb9d5 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,16 @@ +repos: + - repo: https://github.com/astral-sh/uv-pre-commit + # uv version. + rev: 0.9.8 + hooks: + - id: uv-lock + - id: uv-export + + - repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: v0.14.4 + hooks: + # Run the linter. + - id: ruff-check + # Run the formatter. + - id: ruff-format diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 6562eee..0000000 --- a/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM --platform=$BUILDPLATFORM python:3.10-alpine AS builder - -WORKDIR /app - -COPY requirements.txt /app -RUN --mount=type=cache,target=/root/.cache/pip \ - python3 -m pip install -r requirements.txt - -COPY . /app - -# Mount /data to store the data -VOLUME /data - -ENTRYPOINT ["python3"] -CMD ["main.py"] - -FROM builder as dev-envs \ No newline at end of file diff --git a/README.md b/README.md index 0354129..b591bb4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,52 @@ # HNSDoH Status -This is a simple webserver to check the status of the Handshake DoH server. -It will check every 5 minutes to see if each node is up and running. It checks the node for plain dns, DNS over HTTPS, and DNS over TLS. For DNS over HTTPS and DNS over TLS, it will check the certificate to make sure it is valid. +HNSDoH Status is a Flask service that discovers HNSDoH nodes from DNS A records for `hnsdoh.com` and continuously checks each node for: + +- DNS over UDP on port 53 +- DNS over TCP on port 53 +- DNS over HTTPS (DoH) on port 443 at `/dns-query` +- DNS over TLS (DoT) on port 853 + +For DoH and DoT, TLS certificates are validated with hostname `hnsdoh.com`. + +## How It Works + +1. Resolve `hnsdoh.com` A records to discover active node IP addresses. +2. Probe each discovered node for all four protocols. +3. Keep current status and short in-memory history. +4. Expose results through a web dashboard and JSON API. + +## Run + +```bash +uv sync +uv run python main.py +``` + +The app runs on `0.0.0.0:8000` by default. + +## API Endpoints + +- `GET /`: HTML status page +- `GET /api/status`: current snapshot and history +- `GET /api/health`: service health (503 if stale or no checks yet) + +## Configuration + +Environment variables: + +- `HNSDOH_DOMAIN` (default: `hnsdoh.com`) +- `HNSDOH_DOH_PATH` (default: `/dns-query`) +- `HNSDOH_CHECK_INTERVAL_SECONDS` (default: `300`) +- `HNSDOH_UI_REFRESH_SECONDS` (default: `30`) +- `HNSDOH_HISTORY_SIZE` (default: `12`) +- `HNSDOH_STALE_AFTER_SECONDS` (default: `900`) +- `HNSDOH_DNS_TIMEOUT_SECONDS` (default: `5`) +- `HNSDOH_DOH_TIMEOUT_SECONDS` (default: `10`) +- `HNSDOH_DOT_TIMEOUT_SECONDS` (default: `10`) + +## Notes + +- Discovery uses DNS A records only. +- DoH check uses RFC8484 DNS wireformat (`application/dns-message`) to each node IP while sending SNI/Host as `hnsdoh.com` for strict certificate hostname verification. +- History is in-memory and resets on process restart. diff --git a/hnsdoh_status/__init__.py b/hnsdoh_status/__init__.py new file mode 100644 index 0000000..1bd7cf4 --- /dev/null +++ b/hnsdoh_status/__init__.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +from flask import Flask + +from hnsdoh_status.config import Settings +from hnsdoh_status.routes import create_routes +from hnsdoh_status.scheduler import create_scheduler +from hnsdoh_status.store import StatusStore + + +scheduler = None + + +def create_app() -> Flask: + app = Flask(__name__) + settings = Settings() + store = StatusStore(history_size=settings.history_size) + + app.config["SETTINGS"] = settings + app.config["STORE"] = store + + create_routes(app, settings, store) + + global scheduler + if scheduler is None: + scheduler = create_scheduler(settings, store) + scheduler.start() + + return app diff --git a/hnsdoh_status/checks.py b/hnsdoh_status/checks.py new file mode 100644 index 0000000..77919f2 --- /dev/null +++ b/hnsdoh_status/checks.py @@ -0,0 +1,250 @@ +from __future__ import annotations + +import socket +import ssl +import time +from datetime import datetime, timezone + +import dns.message +import dns.query +import dns.rcode +import dns.rdatatype +import dns.resolver + +from hnsdoh_status.models import CheckResult, NodeSnapshot, ProtocolName, Snapshot + + +def utcnow() -> datetime: + return datetime.now(timezone.utc) + + +def discover_nodes(domain: str) -> tuple[list[str], str]: + resolver = dns.resolver.Resolver() + try: + answer = resolver.resolve(domain, "A") + return sorted({record.address for record in answer}), "" + except Exception as exc: # noqa: BLE001 + return [], str(exc) + + +def _check_dns_udp(ip: str, timeout: float) -> CheckResult: + started = time.perf_counter() + checked_at = utcnow() + query = dns.message.make_query("hnsdoh.com", dns.rdatatype.A) + try: + response = dns.query.udp(query, ip, timeout=timeout, port=53) + latency = (time.perf_counter() - started) * 1000 + return CheckResult( + protocol="dns_udp", + ok=bool(response.answer), + latency_ms=latency, + checked_at=checked_at, + reason="ok" if response.answer else "empty answer", + ) + except Exception as exc: # noqa: BLE001 + return CheckResult("dns_udp", False, None, checked_at, str(exc)) + + +def _check_dns_tcp(ip: str, timeout: float) -> CheckResult: + started = time.perf_counter() + checked_at = utcnow() + query = dns.message.make_query("hnsdoh.com", dns.rdatatype.A) + try: + response = dns.query.tcp(query, ip, timeout=timeout, port=53) + latency = (time.perf_counter() - started) * 1000 + return CheckResult( + protocol="dns_tcp", + ok=bool(response.answer), + latency_ms=latency, + checked_at=checked_at, + reason="ok" if response.answer else "empty answer", + ) + except Exception as exc: # noqa: BLE001 + return CheckResult("dns_tcp", False, None, checked_at, str(exc)) + + +def _tls_connection(ip: str, port: int, hostname: str, timeout: float) -> ssl.SSLSocket: + context = ssl.create_default_context() + raw = socket.create_connection((ip, port), timeout=timeout) + try: + tls_socket = context.wrap_socket(raw, server_hostname=hostname) + return tls_socket + except Exception: + raw.close() + raise + + +def _decode_chunked_body(data: bytes) -> bytes: + output = bytearray() + cursor = 0 + + while True: + line_end = data.find(b"\r\n", cursor) + if line_end < 0: + raise ValueError("invalid chunk framing") + + size_token = data[cursor:line_end].split(b";", maxsplit=1)[0].strip() + size = int(size_token or b"0", 16) + cursor = line_end + 2 + + if size == 0: + break + + next_cursor = cursor + size + if next_cursor + 2 > len(data): + raise ValueError("truncated chunk payload") + output.extend(data[cursor:next_cursor]) + + if data[next_cursor : next_cursor + 2] != b"\r\n": + raise ValueError("invalid chunk terminator") + cursor = next_cursor + 2 + + return bytes(output) + + +def _parse_http_response(response: bytes) -> tuple[str, dict[str, str], bytes]: + head, separator, body = response.partition(b"\r\n\r\n") + if not separator: + raise ValueError("invalid HTTP response") + + lines = head.split(b"\r\n") + status_line = lines[0].decode("latin-1", errors="replace") + headers: dict[str, str] = {} + + for line in lines[1:]: + if b":" not in line: + continue + key, value = line.split(b":", maxsplit=1) + headers[key.decode("latin-1", errors="replace").lower()] = value.decode( + "latin-1", errors="replace" + ).strip() + + transfer_encoding = headers.get("transfer-encoding", "").lower() + if "chunked" in transfer_encoding: + body = _decode_chunked_body(body) + + return status_line, headers, body + + +def _check_doh(ip: str, hostname: str, path: str, timeout: float) -> CheckResult: + started = time.perf_counter() + checked_at = utcnow() + query = dns.message.make_query(hostname, dns.rdatatype.A) + query_wire = query.to_wire() + request = ( + f"POST {path} HTTP/1.1\r\n" + f"Host: {hostname}\r\n" + "Accept: application/dns-message\r\n" + "Content-Type: application/dns-message\r\n" + f"Content-Length: {len(query_wire)}\r\n" + "Connection: close\r\n\r\n" + ).encode("ascii") + query_wire + + try: + with _tls_connection(ip, 443, hostname, timeout) as conn: + conn.settimeout(timeout) + conn.sendall(request) + response = b"" + while True: + chunk = conn.recv(4096) + if not chunk: + break + response += chunk + + latency = (time.perf_counter() - started) * 1000 + status_line, _, body = _parse_http_response(response) + status_ok = " 200 " in status_line + + payload_ok = False + reason = "" + if status_ok and body: + try: + parsed_dns = dns.message.from_wire(body) + payload_ok = parsed_dns.rcode() == dns.rcode.NOERROR and bool( + parsed_dns.answer + ) + if payload_ok: + reason = "ok" + elif parsed_dns.rcode() != dns.rcode.NOERROR: + reason = f"dns rcode {dns.rcode.to_text(parsed_dns.rcode())}" + else: + reason = "empty answer" + except Exception: # noqa: BLE001 + reason = "invalid dns wireformat payload" + + ok = status_ok and payload_ok + if not reason: + reason = f"http status failed: {status_line}" + + return CheckResult("doh", ok, latency, checked_at, reason) + except ssl.SSLCertVerificationError as exc: + return CheckResult("doh", False, None, checked_at, f"tls verify failed: {exc}") + except Exception as exc: # noqa: BLE001 + return CheckResult("doh", False, None, checked_at, str(exc)) + + +def _check_dot(ip: str, hostname: str, timeout: float) -> CheckResult: + started = time.perf_counter() + checked_at = utcnow() + query = dns.message.make_query("hnsdoh.com", dns.rdatatype.A) + context = ssl.create_default_context() + try: + response = dns.query.tls( + query, + where=ip, + timeout=timeout, + port=853, + ssl_context=context, + server_hostname=hostname, + ) + latency = (time.perf_counter() - started) * 1000 + return CheckResult( + protocol="dot", + ok=bool(response.answer), + latency_ms=latency, + checked_at=checked_at, + reason="ok" if response.answer else "empty answer", + ) + except ssl.SSLCertVerificationError as exc: + return CheckResult("dot", False, None, checked_at, f"tls verify failed: {exc}") + except Exception as exc: # noqa: BLE001 + return CheckResult("dot", False, None, checked_at, str(exc)) + + +def check_node( + ip: str, + hostname: str, + doh_path: str, + dns_timeout: float, + doh_timeout: float, + dot_timeout: float, +) -> NodeSnapshot: + results: dict[ProtocolName, CheckResult] = { + "dns_udp": _check_dns_udp(ip, dns_timeout), + "dns_tcp": _check_dns_tcp(ip, dns_timeout), + "doh": _check_doh(ip, hostname, doh_path, doh_timeout), + "dot": _check_dot(ip, hostname, dot_timeout), + } + return NodeSnapshot(ip=ip, results=results) + + +def run_full_check( + domain: str, + doh_path: str, + dns_timeout: float, + doh_timeout: float, + dot_timeout: float, +) -> Snapshot: + checked_at = utcnow() + nodes, discovery_error = discover_nodes(domain) + snapshots = [ + check_node(ip, domain, doh_path, dns_timeout, doh_timeout, dot_timeout) + for ip in nodes + ] + return Snapshot( + domain=domain, + checked_at=checked_at, + node_count=len(snapshots), + nodes=snapshots, + discovery_error=discovery_error, + ) diff --git a/hnsdoh_status/config.py b/hnsdoh_status/config.py new file mode 100644 index 0000000..dc61cbf --- /dev/null +++ b/hnsdoh_status/config.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +import os +from dataclasses import dataclass + +from dotenv import load_dotenv + + +load_dotenv() + + +@dataclass(frozen=True) +class Settings: + domain: str = os.getenv("HNSDOH_DOMAIN", "hnsdoh.com") + doh_path: str = os.getenv("HNSDOH_DOH_PATH", "/dns-query") + check_interval_seconds: int = int(os.getenv("HNSDOH_CHECK_INTERVAL_SECONDS", "300")) + ui_refresh_seconds: int = int(os.getenv("HNSDOH_UI_REFRESH_SECONDS", "30")) + history_size: int = int(os.getenv("HNSDOH_HISTORY_SIZE", "12")) + stale_after_seconds: int = int(os.getenv("HNSDOH_STALE_AFTER_SECONDS", "900")) + + dns_timeout_seconds: float = float(os.getenv("HNSDOH_DNS_TIMEOUT_SECONDS", "5")) + doh_timeout_seconds: float = float(os.getenv("HNSDOH_DOH_TIMEOUT_SECONDS", "10")) + dot_timeout_seconds: float = float(os.getenv("HNSDOH_DOT_TIMEOUT_SECONDS", "10")) + + webhook_url: str = os.getenv("TMP_DISCORD_HOOK", "") diff --git a/hnsdoh_status/models.py b/hnsdoh_status/models.py new file mode 100644 index 0000000..6e47d7e --- /dev/null +++ b/hnsdoh_status/models.py @@ -0,0 +1,40 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from datetime import datetime +from typing import Literal + +ProtocolName = Literal["dns_udp", "dns_tcp", "doh", "dot"] + + +@dataclass +class CheckResult: + protocol: ProtocolName + ok: bool + latency_ms: float | None + checked_at: datetime + reason: str = "" + + +@dataclass +class NodeSnapshot: + ip: str + results: dict[ProtocolName, CheckResult] = field(default_factory=dict) + + +@dataclass +class Snapshot: + domain: str + checked_at: datetime + node_count: int + nodes: list[NodeSnapshot] + discovery_error: str = "" + + +@dataclass +class StatusPayload: + generated_at: datetime + interval_seconds: int + stale_after_seconds: int + current: Snapshot | None + history: dict[str, list[dict[ProtocolName, CheckResult]]] diff --git a/hnsdoh_status/routes.py b/hnsdoh_status/routes.py new file mode 100644 index 0000000..0ebe5fe --- /dev/null +++ b/hnsdoh_status/routes.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +from datetime import datetime, timezone +from typing import Any + +from flask import Blueprint, Flask, Response, jsonify, render_template + +from hnsdoh_status.config import Settings +from hnsdoh_status.models import CheckResult, ProtocolName, Snapshot +from hnsdoh_status.store import StatusStore + + +def _result_to_dict(result: CheckResult) -> dict[str, Any]: + return { + "protocol": result.protocol, + "ok": result.ok, + "latency_ms": round(result.latency_ms, 2) + if result.latency_ms is not None + else None, + "checked_at": result.checked_at.isoformat(), + "reason": result.reason, + } + + +def _snapshot_to_dict(snapshot: Snapshot | None) -> dict | None: + if snapshot is None: + return None + + return { + "domain": snapshot.domain, + "checked_at": snapshot.checked_at.isoformat(), + "node_count": snapshot.node_count, + "discovery_error": snapshot.discovery_error, + "nodes": [ + { + "ip": node.ip, + "results": { + protocol: _result_to_dict(result) + for protocol, result in node.results.items() + }, + } + for node in snapshot.nodes + ], + } + + +def _history_to_dict( + history: dict[str, list[dict[ProtocolName, CheckResult]]], +) -> dict[str, list[dict[str, dict]]]: + rendered: dict[str, list[dict[str, dict]]] = {} + for ip, entries in history.items(): + rendered[ip] = [] + for entry in entries: + rendered[ip].append( + { + protocol: _result_to_dict(result) + for protocol, result in entry.items() + } + ) + return rendered + + +def create_routes(app: Flask, settings: Settings, store: StatusStore) -> Blueprint: + bp = Blueprint("status", __name__) + + @bp.get("/") + def index() -> str: + return render_template( + "index.html", + domain=settings.domain, + ui_refresh_seconds=settings.ui_refresh_seconds, + ) + + @bp.get("/api/health") + def health() -> tuple[dict, int]: + now = datetime.now(timezone.utc) + current = store.current() + + if current is None: + return {"ok": False, "reason": "No checks completed yet."}, 503 + + age_seconds = (now - current.checked_at).total_seconds() + stale = age_seconds > settings.stale_after_seconds + status_code = 200 if not stale else 503 + return { + "ok": not stale, + "stale": stale, + "age_seconds": age_seconds, + "checked_at": current.checked_at.isoformat(), + }, status_code + + @bp.get("/api/status") + def status() -> Response: + return jsonify( + { + "generated_at": store.generated_at().isoformat(), + "interval_seconds": settings.check_interval_seconds, + "stale_after_seconds": settings.stale_after_seconds, + "current": _snapshot_to_dict(store.current()), + "history": _history_to_dict(store.history()), + } + ) + + app.register_blueprint(bp) + return bp diff --git a/hnsdoh_status/scheduler.py b/hnsdoh_status/scheduler.py new file mode 100644 index 0000000..34df43e --- /dev/null +++ b/hnsdoh_status/scheduler.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +from apscheduler.schedulers.background import BackgroundScheduler + +from hnsdoh_status.checks import run_full_check +from hnsdoh_status.config import Settings +from hnsdoh_status.store import StatusStore + + +def create_scheduler(settings: Settings, store: StatusStore) -> BackgroundScheduler: + scheduler = BackgroundScheduler(daemon=True) + + def run_checks() -> None: + snapshot = run_full_check( + domain=settings.domain, + doh_path=settings.doh_path, + dns_timeout=settings.dns_timeout_seconds, + doh_timeout=settings.doh_timeout_seconds, + dot_timeout=settings.dot_timeout_seconds, + ) + store.update(snapshot) + + # Run once on startup so the UI/API is populated immediately. + run_checks() + + scheduler.add_job( + run_checks, + "interval", + seconds=settings.check_interval_seconds, + id="node-health-check", + max_instances=1, + coalesce=True, + ) + return scheduler diff --git a/hnsdoh_status/static/app.js b/hnsdoh_status/static/app.js new file mode 100644 index 0000000..868edc2 --- /dev/null +++ b/hnsdoh_status/static/app.js @@ -0,0 +1,75 @@ +const refreshSeconds = window.HNSDOH_UI_REFRESH_SECONDS || 30; + +function badgeFor(result) { + const badgeClass = result.ok ? "badge badge-ok" : "badge badge-bad"; + const label = result.ok ? "UP" : "DOWN"; + const latency = result.latency_ms === null ? "" : ` (${result.latency_ms} ms)`; + const reason = result.reason || ""; + + return ` + ${label}${latency} + ${reason} + `; +} + +function historyDots(history, protocol) { + if (!history || history.length === 0) { + return ""; + } + + const recent = history.slice(-10); + const dots = recent + .map((entry) => { + const r = entry[protocol]; + if (!r) return ''; + return ``; + }) + .join(""); + + return `
${dots}
`; +} + +function rowForNode(node, history) { + const udp = node.results.dns_udp; + const tcp = node.results.dns_tcp; + const doh = node.results.doh; + const dot = node.results.dot; + + return ` + + ${node.ip} + ${badgeFor(udp)}${historyDots(history, "dns_udp")} + ${badgeFor(tcp)}${historyDots(history, "dns_tcp")} + ${badgeFor(doh)}${historyDots(history, "doh")} + ${badgeFor(dot)}${historyDots(history, "dot")} + + `; +} + +async function refreshStatus() { + try { + const response = await fetch("/api/status", { cache: "no-store" }); + const data = await response.json(); + const tableBody = document.getElementById("status-table-body"); + const lastUpdated = document.getElementById("last-updated"); + + if (!data.current) { + tableBody.innerHTML = 'No data yet. Waiting for first check.'; + return; + } + + lastUpdated.textContent = `Last updated: ${data.current.checked_at}`; + + const rows = data.current.nodes + .map((node) => rowForNode(node, data.history[node.ip] || [])) + .join(""); + + tableBody.innerHTML = rows || 'No nodes discovered.'; + } catch (error) { + const tableBody = document.getElementById("status-table-body"); + tableBody.innerHTML = `Failed to load status: ${error}`; + } +} + +refreshStatus(); +setInterval(refreshStatus, refreshSeconds * 1000); diff --git a/templates/assets/img/HNS.png b/hnsdoh_status/static/icons/HNS.png similarity index 100% rename from templates/assets/img/HNS.png rename to hnsdoh_status/static/icons/HNS.png diff --git a/templates/assets/img/HNSW.png b/hnsdoh_status/static/icons/HNSW.png similarity index 100% rename from templates/assets/img/HNSW.png rename to hnsdoh_status/static/icons/HNSW.png diff --git a/hnsdoh_status/static/style.css b/hnsdoh_status/static/style.css new file mode 100644 index 0000000..0818fc8 --- /dev/null +++ b/hnsdoh_status/static/style.css @@ -0,0 +1,189 @@ +:root { + --bg: #f0f7f4; + --paper: #ffffff; + --ink: #16302b; + --muted: #4b635d; + --accent: #1f7a8c; + --ok: #12824c; + --bad: #ba2d0b; + --border: #d6e8e1; +} + +@media (prefers-color-scheme: dark) { + :root { + --bg: #09131a; + --paper: #10222c; + --ink: #e3f2f6; + --muted: #93acb6; + --accent: #69bfd6; + --ok: #62d387; + --bad: #ff8c73; + --border: #214250; + } +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "IBM Plex Sans", "Segoe UI", sans-serif; + color: var(--ink); + background: + radial-gradient(circle at 10% 10%, #cfeadf 0, transparent 32%), + radial-gradient(circle at 90% 0%, #b4d6e3 0, transparent 28%), + var(--bg); +} + +@media (prefers-color-scheme: dark) { + body { + background: + radial-gradient(circle at 10% 10%, #143342 0, transparent 35%), + radial-gradient(circle at 90% 0%, #233a46 0, transparent 30%), + var(--bg); + } +} + +.layout { + max-width: 1100px; + margin: 2rem auto; + padding: 0 1rem 2rem; +} + +.hero { + background: linear-gradient(130deg, #e2f4eb 0%, #e7f0ff 100%); + border: 1px solid var(--border); + border-radius: 14px; + padding: 1rem 1.25rem; +} + +@media (prefers-color-scheme: dark) { + .hero { + background: linear-gradient(135deg, #123342 0%, #182f3c 100%); + } +} + +.hero h1 { + margin: 0; + font-size: 1.8rem; +} + +.hero p { + margin-top: 0.3rem; + color: var(--muted); +} + +.meta { + display: flex; + gap: 1rem; + font-size: 0.9rem; + color: var(--muted); +} + +.panel { + margin-top: 1rem; + background: var(--paper); + border: 1px solid var(--border); + border-radius: 14px; + overflow: hidden; +} + +table { + width: 100%; + border-collapse: collapse; +} + +th, +td { + text-align: left; + padding: 0.75rem; + border-bottom: 1px solid var(--border); +} + +th { + font-size: 0.9rem; + color: var(--muted); + letter-spacing: 0.02em; +} + +.badge { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.3rem 0.55rem; + border-radius: 999px; + font-size: 0.8rem; + border: 1px solid transparent; +} + +.badge-ok { + color: var(--ok); + background: #e7f7ef; + border-color: #b6e3ca; +} + +@media (prefers-color-scheme: dark) { + .badge-ok { + background: #173b2a; + border-color: #2f6c4f; + } +} + +.badge-bad { + color: var(--bad); + background: #fdece7; + border-color: #f3b9aa; +} + +@media (prefers-color-scheme: dark) { + .badge-bad { + background: #472118; + border-color: #855040; + } +} + +.hint { + display: block; + margin-top: 0.15rem; + color: var(--muted); + font-size: 0.75rem; +} + +.history { + margin-top: 0.35rem; + display: flex; + gap: 0.2rem; +} + +.dot { + width: 7px; + height: 7px; + border-radius: 50%; + background: #adbcb6; +} + +.dot.ok { + background: var(--ok); +} + +.dot.bad { + background: var(--bad); +} + +@media (prefers-color-scheme: dark) { + th, + td { + border-bottom-color: #1f3f4c; + } +} + +@media (max-width: 880px) { + .panel { + overflow-x: auto; + } + + table { + min-width: 760px; + } +} diff --git a/hnsdoh_status/store.py b/hnsdoh_status/store.py new file mode 100644 index 0000000..be5b6d7 --- /dev/null +++ b/hnsdoh_status/store.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +from collections import defaultdict, deque +from datetime import datetime, timezone + +from hnsdoh_status.models import CheckResult, ProtocolName, Snapshot + + +class StatusStore: + def __init__(self, history_size: int): + self._history_size = history_size + self._current: Snapshot | None = None + self._history: dict[str, deque[dict[ProtocolName, CheckResult]]] = defaultdict( + lambda: deque(maxlen=self._history_size) + ) + + def update(self, snapshot: Snapshot) -> None: + self._current = snapshot + for node in snapshot.nodes: + # Each history entry stores one full protocol result set for the node. + self._history[node.ip].append(dict(node.results)) + + def current(self) -> Snapshot | None: + return self._current + + def history(self) -> dict[str, list[dict[ProtocolName, CheckResult]]]: + return {ip: list(entries) for ip, entries in self._history.items()} + + def generated_at(self) -> datetime: + return datetime.now(timezone.utc) diff --git a/hnsdoh_status/templates/index.html b/hnsdoh_status/templates/index.html new file mode 100644 index 0000000..000f9d4 --- /dev/null +++ b/hnsdoh_status/templates/index.html @@ -0,0 +1,56 @@ + + + + + + HNSDoH Status + + + + + + +
+
+

HNSDoH Status

+

Live checks for {{ domain }} nodes discovered from DNS A records.

+
+ Last updated: pending + Refresh: {{ ui_refresh_seconds }}s +
+
+ +
+ + + + + + + + + + + +
Node IPDNS UDP :53DNS TCP :53DoH :443DoT :853
+
+
+ + + + + diff --git a/main.py b/main.py index 0611500..4b0a139 100644 --- a/main.py +++ b/main.py @@ -1,90 +1,8 @@ -import sys -import signal -import threading -import server -from gunicorn.app.base import BaseApplication -import os -import dotenv +from hnsdoh_status import create_app -class GunicornApp(BaseApplication): - def __init__(self, app, options=None): - self.options = options or {} - self.application = app - super().__init__() - - def load_config(self): - for key, value in self.options.items(): - if key in self.cfg.settings and value is not None: - self.cfg.set(key.lower(), value) - - def load(self): - return self.application +app = create_app() -def run_gunicorn(): - workers = os.getenv('WORKERS', 1) - threads = os.getenv('THREADS', 2) - - try: - workers = int(workers) - except (ValueError, TypeError): - workers = 1 - - try: - threads = int(threads) - except (ValueError, TypeError): - threads = 2 - - options = { - 'bind': '0.0.0.0:5000', - 'workers': workers, - 'threads': threads, - 'timeout': 120, - } - - gunicorn_app = GunicornApp(server.app, options) - print(f'Starting server with {workers} workers and {threads} threads', flush=True) - gunicorn_app.run() - - -def signal_handler(sig, frame): - print("Shutting down gracefully...", flush=True) - - # Shutdown the scheduler - if server.scheduler.running: - print("Stopping scheduler...", flush=True) - server.scheduler.shutdown() - - # Shutdown the node check executors - print("Shutting down thread pools...", flush=True) - server.node_check_executor.shutdown(wait=False) - server.sub_check_executor.shutdown(wait=False) - - sys.exit(0) - - -if __name__ == '__main__': - dotenv.load_dotenv() - - # Register signal handlers - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) - - # Start the scheduler from server.py - # This ensures we use the robust APScheduler defined there instead of the custom loop - print("Starting background scheduler...", flush=True) - with server.app.app_context(): - server.start_scheduler() - - # Run an immediate check in a background thread so we don't block startup - startup_thread = threading.Thread(target=server.scheduled_node_check) - startup_thread.daemon = True - startup_thread.start() - - try: - # Run the Gunicorn server - run_gunicorn() - except KeyboardInterrupt: - print("Shutting down server...", flush=True) - signal_handler(signal.SIGINT, None) +if __name__ == "__main__": + app.run(host="0.0.0.0", port=8000, debug=False) diff --git a/pyproject.toml b/pyproject.toml index cdea727..971fc58 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,5 +20,6 @@ dependencies = [ [dependency-groups] dev = [ + "pre-commit>=4.5.1", "ruff>=0.14.5", ] diff --git a/requirements.txt b/requirements.txt index d7e0dc5..5b497ff 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,299 @@ -flask -gunicorn -requests -dnspython -dnslib -python-dateutil -python-dotenv -schedule -apscheduler>=3.9.1 -flask-caching -brotli \ No newline at end of file +# This file was autogenerated by uv via the following command: +# uv export --frozen --output-file=requirements.txt +apscheduler==3.11.1 \ + --hash=sha256:0db77af6400c84d1747fe98a04b8b58f0080c77d11d338c4f507a9752880f221 \ + --hash=sha256:6162cb5683cb09923654fa9bdd3130c4be4bfda6ad8990971c9597ecd52965d2 + # via hnsdoh-status +blinker==1.9.0 \ + --hash=sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf \ + --hash=sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc + # via flask +brotli==1.2.0 \ + --hash=sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c \ + --hash=sha256:1b1d6a4efedd53671c793be6dd760fcf2107da3a52331ad9ea429edf0902f27a \ + --hash=sha256:26e8d3ecb0ee458a9804f47f21b74845cc823fd1bb19f02272be70774f56e2a6 \ + --hash=sha256:3219bd9e69868e57183316ee19c84e03e8f8b5a1d1f2667e1aa8c2f91cb061ac \ + --hash=sha256:3e1b35d56856f3ed326b140d3c6d9db91740f22e14b06e840fe4bb1923439a18 \ + --hash=sha256:4ecdb3b6dc36e6d6e14d3a1bdc6c1057c8cbf80db04031d566eb6080ce283a48 \ + --hash=sha256:54a50a9dad16b32136b2241ddea9e4df159b41247b2ce6aac0b3276a66a8f1e5 \ + --hash=sha256:67a91c5187e1eec76a61625c77a6c8c785650f5b576ca732bd33ef58b0dff49c \ + --hash=sha256:6c12dad5cd04530323e723787ff762bac749a7b256a5bece32b2243dd5c27b21 \ + --hash=sha256:7547369c4392b47d30a3467fe8c3330b4f2e0f7730e45e3103d7d636678a808b \ + --hash=sha256:832c115a020e463c2f67664560449a7bea26b0c1fdd690352addad6d0a08714d \ + --hash=sha256:9322b9f8656782414b37e6af884146869d46ab85158201d82bab9abbcb971dc7 \ + --hash=sha256:963a08f3bebd8b75ac57661045402da15991468a621f014be54e50f53a58d19e \ + --hash=sha256:9e5825ba2c9998375530504578fd4d5d1059d09621a02065d1b6bfc41a8e05ab \ + --hash=sha256:b63daa43d82f0cdabf98dee215b375b4058cce72871fd07934f179885aad16e8 \ + --hash=sha256:c8565e3cdc1808b1a34714b553b262c5de5fbda202285782173ec137fd13709f \ + --hash=sha256:cf9cba6f5b78a2071ec6fb1e7bd39acf35071d90a81231d67e92d637776a6a63 \ + --hash=sha256:d2d085ded05278d1c7f65560aae97b3160aeb2ea2c0b3e26204856beccb60888 \ + --hash=sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a \ + --hash=sha256:e7c0af964e0b4e3412a0ebf341ea26ec767fa0b4cf81abb5e897c9338b5ad6a3 \ + --hash=sha256:fc1530af5c3c275b8524f2e24841cbe2599d74462455e9bae5109e9ff42e9361 + # via hnsdoh-status +cachelib==0.13.0 \ + --hash=sha256:209d8996e3c57595bee274ff97116d1d73c4980b2fd9a34c7846cd07fd2e1a48 \ + --hash=sha256:8c8019e53b6302967d4e8329a504acf75e7bc46130291d30188a6e4e58162516 + # via flask-caching +certifi==2025.11.12 \ + --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b \ + --hash=sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316 + # via requests +cfgv==3.5.0 \ + --hash=sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0 \ + --hash=sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132 + # via pre-commit +charset-normalizer==3.4.4 \ + --hash=sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152 \ + --hash=sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72 \ + --hash=sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e \ + --hash=sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c \ + --hash=sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2 \ + --hash=sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44 \ + --hash=sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede \ + --hash=sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed \ + --hash=sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133 \ + --hash=sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e \ + --hash=sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14 \ + --hash=sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828 \ + --hash=sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f \ + --hash=sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328 \ + --hash=sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090 \ + --hash=sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c \ + --hash=sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb \ + --hash=sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a \ + --hash=sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec \ + --hash=sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc \ + --hash=sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac \ + --hash=sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894 \ + --hash=sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14 \ + --hash=sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1 \ + --hash=sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3 \ + --hash=sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e \ + --hash=sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6 \ + --hash=sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191 \ + --hash=sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd \ + --hash=sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2 \ + --hash=sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794 \ + --hash=sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838 \ + --hash=sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490 \ + --hash=sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9 + # via requests +click==8.3.1 \ + --hash=sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a \ + --hash=sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 + # via flask +colorama==0.4.6 ; sys_platform == 'win32' \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via click +distlib==0.4.0 \ + --hash=sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16 \ + --hash=sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d + # via virtualenv +dnslib==0.9.26 \ + --hash=sha256:be56857534390b2fbd02935270019bacc5e6b411d156cb3921ac55a7fb51f1a8 \ + --hash=sha256:e68719e633d761747c7e91bd241019ef5a2b61a63f56025939e144c841a70e0d + # via hnsdoh-status +dnspython==2.8.0 \ + --hash=sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af \ + --hash=sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f + # via hnsdoh-status +filelock==3.25.2 \ + --hash=sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694 \ + --hash=sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70 + # via + # python-discovery + # virtualenv +flask==3.1.2 \ + --hash=sha256:bf656c15c80190ed628ad08cdfd3aaa35beb087855e2f494910aa3774cc4fd87 \ + --hash=sha256:ca1d8112ec8a6158cc29ea4858963350011b5c846a414cdb7a954aa9e967d03c + # via + # flask-caching + # hnsdoh-status +flask-caching==2.3.1 \ + --hash=sha256:65d7fd1b4eebf810f844de7de6258254b3248296ee429bdcb3f741bcbf7b98c9 \ + --hash=sha256:d3efcf600e5925ea5a2fcb810f13b341ae984f5b52c00e9d9070392f3ca10761 + # via hnsdoh-status +gunicorn==23.0.0 \ + --hash=sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d \ + --hash=sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec + # via hnsdoh-status +identify==2.6.18 \ + --hash=sha256:873ac56a5e3fd63e7438a7ecbc4d91aca692eb3fefa4534db2b7913f3fc352fd \ + --hash=sha256:8db9d3c8ea9079db92cafb0ebf97abdc09d52e97f4dcf773a2e694048b7cd737 + # via pre-commit +idna==3.11 \ + --hash=sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea \ + --hash=sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902 + # via requests +itsdangerous==2.2.0 \ + --hash=sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef \ + --hash=sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173 + # via flask +jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + # via flask +markupsafe==3.0.3 \ + --hash=sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf \ + --hash=sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175 \ + --hash=sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 \ + --hash=sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb \ + --hash=sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 \ + --hash=sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab \ + --hash=sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218 \ + --hash=sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634 \ + --hash=sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73 \ + --hash=sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe \ + --hash=sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa \ + --hash=sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37 \ + --hash=sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97 \ + --hash=sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19 \ + --hash=sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9 \ + --hash=sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9 \ + --hash=sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc \ + --hash=sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4 \ + --hash=sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354 \ + --hash=sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698 \ + --hash=sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9 \ + --hash=sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc \ + --hash=sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485 \ + --hash=sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12 \ + --hash=sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025 \ + --hash=sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009 \ + --hash=sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d \ + --hash=sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 \ + --hash=sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f \ + --hash=sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1 \ + --hash=sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287 \ + --hash=sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6 \ + --hash=sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581 \ + --hash=sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed \ + --hash=sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 \ + --hash=sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 \ + --hash=sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 \ + --hash=sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5 \ + --hash=sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d \ + --hash=sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe \ + --hash=sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda \ + --hash=sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e \ + --hash=sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737 \ + --hash=sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523 \ + --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 + # via + # flask + # jinja2 + # werkzeug +nodeenv==1.10.0 \ + --hash=sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827 \ + --hash=sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb + # via pre-commit +packaging==25.0 \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ + --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f + # via gunicorn +platformdirs==4.9.4 \ + --hash=sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934 \ + --hash=sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868 + # via + # python-discovery + # virtualenv +pre-commit==4.5.1 \ + --hash=sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77 \ + --hash=sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61 +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via hnsdoh-status +python-discovery==1.2.1 \ + --hash=sha256:180c4d114bff1c32462537eac5d6a332b768242b76b69c0259c7d14b1b680c9e \ + --hash=sha256:b6a957b24c1cd79252484d3566d1b49527581d46e789aaf43181005e56201502 + # via virtualenv +python-dotenv==1.2.1 \ + --hash=sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6 \ + --hash=sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61 + # via hnsdoh-status +pyyaml==6.0.3 \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 + # via pre-commit +requests==2.32.5 \ + --hash=sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6 \ + --hash=sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf + # via hnsdoh-status +ruff==0.14.5 \ + --hash=sha256:2d1fa985a42b1f075a098fa1ab9d472b712bdb17ad87a8ec86e45e7fa6273e68 \ + --hash=sha256:3676cb02b9061fee7294661071c4709fa21419ea9176087cb77e64410926eb78 \ + --hash=sha256:410e781f1122d6be4f446981dd479470af86537fb0b8857f27a6e872f65a38e4 \ + --hash=sha256:4b700459d4649e2594b31f20a9de33bc7c19976d4746d8d0798ad959621d64a4 \ + --hash=sha256:6d146132d1ee115f8802356a2dc9a634dbf58184c51bff21f313e8cd1c74899a \ + --hash=sha256:7497d19dce23976bdaca24345ae131a1d38dcfe1b0850ad8e9e6e4fa321a6e19 \ + --hash=sha256:88f0770d42b7fa02bbefddde15d235ca3aa24e2f0137388cc15b2dcbb1f7c7a7 \ + --hash=sha256:8d3b48d7d8aad423d3137af7ab6c8b1e38e4de104800f0d596990f6ada1a9fc1 \ + --hash=sha256:9d55d7af7166f143c94eae1db3312f9ea8f95a4defef1979ed516dbb38c27621 \ + --hash=sha256:b595bedf6bc9cab647c4a173a61acf4f1ac5f2b545203ba82f30fcb10b0318fb \ + --hash=sha256:c01be527ef4c91a6d55e53b337bfe2c0f82af024cc1a33c44792d6844e2331e1 \ + --hash=sha256:c135d4b681f7401fe0e7312017e41aba9b3160861105726b76cfa14bc25aa367 \ + --hash=sha256:c83642e6fccfb6dea8b785eb9f456800dcd6a63f362238af5fc0c83d027dd08b \ + --hash=sha256:d93be8f1fa01022337f1f8f3bcaa7ffee2d0b03f00922c45c2207954f351f465 \ + --hash=sha256:e2380596653dcd20b057794d55681571a257a42327da8894b93bbd6111aa801f \ + --hash=sha256:f3b8248123b586de44a8018bcc9fefe31d23dda57a34e6f0e1e53bd51fd63594 \ + --hash=sha256:f55382725ad0bdb2e8ee2babcbbfb16f124f5a59496a2f6a46f1d9d99d93e6e2 \ + --hash=sha256:f66e9bb762e68d66e48550b59c74314168ebb46199886c5c5aa0b0fbcc81b151 \ + --hash=sha256:f7a75236570318c7a30edd7f5491945f0169de738d945ca8784500b517163a72 +schedule==1.2.2 \ + --hash=sha256:15fe9c75fe5fd9b9627f3f19cc0ef1420508f9f9a46f45cd0769ef75ede5f0b7 \ + --hash=sha256:5bef4a2a0183abf44046ae0d164cadcac21b1db011bdd8102e4a0c1e91e06a7d + # via hnsdoh-status +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 + # via python-dateutil +tzdata==2025.2 ; sys_platform == 'win32' \ + --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ + --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 + # via tzlocal +tzlocal==5.3.1 \ + --hash=sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd \ + --hash=sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d + # via apscheduler +urllib3==2.5.0 \ + --hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \ + --hash=sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc + # via requests +virtualenv==21.2.0 \ + --hash=sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098 \ + --hash=sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f + # via pre-commit +werkzeug==3.1.3 \ + --hash=sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e \ + --hash=sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746 + # via flask diff --git a/server.py b/server.py deleted file mode 100644 index 8e616a5..0000000 --- a/server.py +++ /dev/null @@ -1,1484 +0,0 @@ -from collections import defaultdict -from functools import wraps -import json -from flask import ( - Flask, - make_response, - request, - jsonify, - render_template, - send_from_directory, - send_file, -) -import os -import requests -import dns.resolver -import dns.message -import dns.query -import dns.name -import dns.rdatatype -import ssl -import dnslib -import socket -from datetime import datetime -from dateutil import relativedelta -import dotenv -import time -import logging -import sys -import signal -from apscheduler.schedulers.background import BackgroundScheduler -from apscheduler.triggers.interval import IntervalTrigger -from apscheduler.events import EVENT_JOB_ERROR, EVENT_JOB_EXECUTED -from flask_caching import Cache -import functools -import brotli -import concurrent.futures -from threading import Lock -import gc - -# Set up logging BEFORE attempting imports that might fail -logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') -logger = logging.getLogger(__name__) - -# Set up ThreadPoolExecutor for parallel node checking -# Use a reasonable number of workers based on CPU cores -node_check_executor = concurrent.futures.ThreadPoolExecutor( - max_workers=min(32, (os.cpu_count() or 1) * 4) # Max 32 workers or 4x CPU cores -) - -# Shared executor for sub-checks (DNS, DoH, DoT, Certs) to prevent thread churn -# Increased to 200 to accommodate all sub-tasks when max_workers (32) are active in the main pool -sub_check_executor = concurrent.futures.ThreadPoolExecutor(max_workers=200) - -# Create a lock for thread safety when updating cache -cache_lock = Lock() - -dotenv.load_dotenv() - -# Configure caching -cache_config = { - 'CACHE_TYPE': 'SimpleCache', # In-memory cache - 'CACHE_DEFAULT_TIMEOUT': 300, # 5 minutes default - 'CACHE_THRESHOLD': 500 # Maximum number of items the cache will store -} - -app = Flask(__name__) -app.config.from_mapping(cache_config) -cache = Cache(app) - -# Configure scheduler - use coalescing to prevent missed jobs piling up -scheduler = BackgroundScheduler(daemon=True, job_defaults={'coalesce': True, 'max_instances': 1}) - -node_names = { - "194.50.5.27": "Nathan.Woodburn/", - "18.169.98.42": "Easy HNS", - "172.233.46.92": "Marioo", - "139.177.195.185": "HNSCanada", - "172.105.120.203": "NameGuardian/", - "173.233.72.88": "Zorro" -} -node_locations = { - "194.50.5.27": "Australia", - "18.169.98.42": "England", - "172.233.46.92": "Netherlands", - "139.177.195.185": "Canada", - "172.105.120.203": "Singapore", - "173.233.72.88": "United States" -} -nodes = [] -manual_nodes = [] -last_log = datetime.now() - relativedelta.relativedelta(years=1) - -sent_notifications = {} - -log_dir = "/data" -if not os.path.exists(log_dir): - if not os.path.exists("./logs"): - os.mkdir("./logs") - log_dir = "./logs" - -if not os.path.exists(f"{log_dir}/node_status.json"): - with open(f"{log_dir}/node_status.json", "w") as file: - json.dump([], file) - -if not os.path.exists(f"{log_dir}/sent_notifications.json"): - with open(f"{log_dir}/sent_notifications.json", "w") as file: - json.dump({}, file) -else: - with open(f"{log_dir}/sent_notifications.json", "r") as file: - sent_notifications = json.load(file) - -if (os.getenv("NODES")): - manual_nodes = os.getenv("NODES","").split(",") - -print(f"Log directory: {log_dir}", flush=True) - -# In-memory cache for node status to reduce file I/O -_node_status_cache = None -_node_status_cache_time = None - -def find(name, path): - for root, dirs, files in os.walk(path): - if name in files: - return os.path.join(root, name) - - -# Add a cache control decorator for static assets -def add_cache_headers(max_age=3600): - def decorator(view_func): - @functools.wraps(view_func) - def wrapper(*args, **kwargs): - response = view_func(*args, **kwargs) - if isinstance(response, tuple): - response_obj = response[0] - else: - response_obj = response - - if hasattr(response_obj, 'cache_control'): - response_obj.cache_control.max_age = max_age - response_obj.cache_control.public = True - # Also set Expires header - response_obj.expires = int(time.time() + max_age) - - return response - return wrapper - return decorator - -# Assets routes with caching -@app.route("/assets/") -@add_cache_headers(max_age=86400) # Cache static assets for 1 day -def send_report(path): - if path.endswith(".json"): - return send_from_directory( - "templates/assets", path, mimetype="application/json" - ) - - if os.path.isfile("templates/assets/" + path): - return send_from_directory("templates/assets", path) - - # Try looking in one of the directories - filename: str = path.split("/")[-1] - if ( - filename.endswith(".png") - or filename.endswith(".jpg") - or filename.endswith(".jpeg") - or filename.endswith(".svg") - ): - if os.path.isfile("templates/assets/img/" + filename): - return send_from_directory("templates/assets/img", filename) - - return render_template("404.html"), 404 - - -# region Special routes -@app.route("/favicon.png") -def faviconPNG(): - return send_from_directory("templates/assets/img", "favicon.png") - - -@app.route("/.well-known/") -def wellknown(path): - try: - req = requests.get(f"https://nathan.woodburn.au/.well-known/{path}", timeout=10) - return make_response( - req.content, 200, {"Content-Type": req.headers["Content-Type"]} - ) - except Exception as e: - logger.error(f"Error fetching well-known path {path}: {e}") - return make_response("Error fetching resource", 500) - - -# endregion - - -# region Helper functions -def get_node_list() -> list: - ips = [] - # Do a DNS lookup - result: dns.resolver.Answer = dns.resolver.resolve("hnsdoh.com", "A") - - # Print the IP addresses - for ipval in result: - ips.append(ipval.to_text()) - - # Add manual nodes - for node in manual_nodes: - if node not in ips: - print(f"Adding manual node: {node}", flush=True) - ips.append(node) - else: - print(f"Skipping manual node: {node}", flush=True) - return ips - - -# Add retry decorator for network operations -def retry(max_attempts=3, delay_seconds=1): - def decorator(func): - @wraps(func) - def wrapper(*args, **kwargs): - attempts = 0 - last_error = None - while attempts < max_attempts: - try: - return func(*args, **kwargs) - except (socket.timeout, socket.error, dns.exception.Timeout, - requests.exceptions.RequestException, ConnectionRefusedError, - ConnectionResetError, OSError, ssl.SSLError) as e: - attempts += 1 - last_error = e - logger.warning(f"Attempt {attempts} failed with error: {e} - retrying in {delay_seconds} seconds") - if attempts < max_attempts: - time.sleep(delay_seconds) - logger.error(f"All {max_attempts} attempts failed. Last error: {last_error}") - return False # Return False as a fallback for checks - return wrapper - return decorator - - -# Optimize socket timeout settings -@retry(max_attempts=3, delay_seconds=2) -def check_plain_dns(ip: str) -> bool: - resolver = dns.resolver.Resolver() - resolver.nameservers = [ip] - resolver.timeout = 3 # Reduced from 5 seconds to 3 seconds - resolver.lifetime = 3 # Reduced from 5 seconds to 3 seconds - - try: - result = resolver.resolve("1.wdbrn", "TXT") - for txt in result: - if "Test 1" in txt.to_text(): - return True - return False - except dns.resolver.NXDOMAIN: - logger.info(f"Domain not found for plain DNS check on {ip}") - return False - except dns.resolver.NoAnswer: - logger.info(f"No answer received for plain DNS check on {ip}") - return False - except (dns.exception.Timeout, socket.timeout): - logger.warning(f"Timeout during plain DNS check on {ip}") - raise # Re-raise for retry decorator - except Exception as e: - logger.error(f"Error during plain DNS check on {ip}: {e}") - return False - - -def build_dns_query(domain: str, qtype: str = "A"): - """ - Constructs a DNS query in binary wire format using dnslib. - """ - q = dnslib.DNSRecord.question(domain, qtype) - return q.pack() - - -def send_down_notification(node): - """ - Send a notification that a node is down. - This is a stub implementation to prevent crashes if the function is missing. - """ - try: - # Implement your notification logic here (e.g. email, discord, slack) - # For now, we just log it to avoid crashing - logger.warning(f"Node DOWN: {node.get('name')} ({node.get('ip')})") - except Exception as e: - logger.error(f"Error sending notification: {e}") - - -@retry(max_attempts=3, delay_seconds=2) -def check_doh(ip: str) -> dict: - status = False - server_name = [] - sock = None - ssock = None - - try: - dns_query = build_dns_query("2.wdbrn", "TXT") - request = ( - f"POST /dns-query HTTP/1.1\r\n" - f"Host: hnsdoh.com\r\n" - "Content-Type: application/dns-message\r\n" - f"Content-Length: {len(dns_query)}\r\n" - "Connection: close\r\n" - "\r\n" - ) - wireframe_request = request.encode() + dns_query - - # Create socket with reduced timeout - sock = socket.create_connection((ip, 443), timeout=5) # Reduced from 10 to 5 seconds - context = ssl.create_default_context() - context.check_hostname = False # Skip hostname verification for IP-based connection - ssock = context.wrap_socket(sock, server_hostname="hnsdoh.com") - - ssock.settimeout(5) # Reduced from 10 to 5 seconds - ssock.sendall(wireframe_request) - - response_data = b"" - while True: - try: - data = ssock.recv(4096) - if not data: - break - response_data += data - except socket.timeout: - logger.warning(f"Socket timeout while receiving data from {ip}") - if response_data: # We might have partial data - break - else: - raise - - if not response_data: - logger.warning(f"No data received from {ip}") - return {"status": status, "server": server_name} - - response_str = response_data.decode("latin-1", errors="replace") - - # Check if we have a complete HTTP response with headers and body - if "\r\n\r\n" not in response_str: - logger.warning(f"Incomplete HTTP response from {ip}") - return {"status": status, "server": server_name} - - headers, body = response_str.split("\r\n\r\n", 1) - - # Try to get server from headers - for header in headers.split("\r\n"): - if header.lower().startswith("server:"): - server_name.append(header.split(":", 1)[1].strip()) - - try: - dns_response = dnslib.DNSRecord.parse(body.encode("latin-1")) - for rr in dns_response.rr: - if "Test 2" in str(rr): - status = True - break - except Exception as e: - logger.error(f"Error parsing DNS response from {ip}: {e}") - - except (socket.timeout, socket.error) as e: - logger.warning(f"Socket error during DoH check on {ip}: {e}") - raise # Re-raise for retry decorator - except ssl.SSLError as e: - logger.error(f"SSL error during DoH check on {ip}: {e}") - return {"status": False, "server": server_name} - except Exception as e: - logger.error(f"Unexpected error during DoH check on {ip}: {e}") - return {"status": False, "server": server_name} - finally: - # Ensure sockets are always closed - if ssock: - try: - ssock.close() - except Exception: - pass - if sock and sock != ssock: - try: - sock.close() - except Exception: - pass - - return {"status": status, "server": server_name} - - -@retry(max_attempts=3, delay_seconds=2) -def check_dot(ip: str) -> bool: - qname = dns.name.from_text("3.wdbrn") - q = dns.message.make_query(qname, dns.rdatatype.TXT) - try: - response = dns.query.tls( - q, ip, timeout=3, port=853, server_hostname="hnsdoh.com" # Reduced from 5 to 3 seconds - ) - if response.rcode() == dns.rcode.NOERROR: - for rrset in response.answer: - for rr in rrset: - if "Test 3" in rr.to_text(): - return True - return False - except dns.exception.Timeout: - logger.warning(f"Timeout during DoT check on {ip}") - raise # Re-raise for retry decorator - except ssl.SSLError as e: - logger.error(f"SSL error during DoT check on {ip}: {e}") - return False - except Exception as e: - logger.error(f"Error during DoT check on {ip}: {e}") - return False - - -@retry(max_attempts=3, delay_seconds=2) -def verify_cert(ip: str, port: int) -> dict: - expires = "ERROR" - valid = False - expiry_date_str = (datetime.now() - relativedelta.relativedelta(years=1)).strftime("%b %d %H:%M:%S %Y GMT") - sock = None - ssock = None - - try: - sock = socket.create_connection((ip, port), timeout=5) # Reduced from 10 to 5 seconds - # Wrap the socket in SSL/TLS - context = ssl.create_default_context() - context.check_hostname = False # Skip hostname verification for IP-based connection - ssock = context.wrap_socket(sock, server_hostname="hnsdoh.com") - ssock.settimeout(5) # Reduced from 10 to 5 seconds - - # Retrieve the server's certificate - cert = ssock.getpeercert() - if not cert: - logger.error(f"No certificate returned from {ip}:{port}") - return {"valid": False, "expires": "ERROR", "expiry_date": expiry_date_str} - - # Extract the expiry date from the certificate - if "notAfter" not in cert: - logger.error(f"Certificate from {ip}:{port} missing notAfter field") - return {"valid": False, "expires": "ERROR", "expiry_date": expiry_date_str} - - expiry_date_str = cert["notAfter"] - - # Convert the expiry date string to a datetime object - expiry_date = datetime.strptime(expiry_date_str, "%b %d %H:%M:%S %Y GMT") - expires = format_relative_time(expiry_date) - valid = expiry_date > datetime.now() - - except (socket.timeout, socket.error) as e: - logger.warning(f"Socket error during certificate check on {ip}:{port}: {e}") - raise # Re-raise for retry decorator - except ssl.SSLError as e: - logger.error(f"SSL error during certificate check on {ip}:{port}: {e}") - return {"valid": False, "expires": "ERROR", "expiry_date": expiry_date_str} - except Exception as e: - logger.error(f"Error during certificate check on {ip}:{port}: {e}") - return {"valid": False, "expires": "ERROR", "expiry_date": expiry_date_str} - finally: - # Ensure sockets are always closed - if ssock: - try: - ssock.close() - except Exception: - pass - if sock and sock != ssock: - try: - sock.close() - except Exception: - pass - - return {"valid": valid, "expires": expires, "expiry_date": expiry_date_str} - - -def format_relative_time(expiry_date: datetime) -> str: - now = datetime.now() - delta = expiry_date - now - - if delta.days > 0: - return f"in {delta.days} days" if delta.days > 1 else "in 1 day" - elif delta.days < 0: - return f"{-delta.days} days ago" if -delta.days > 1 else "1 day ago" - elif delta.seconds >= 3600: - hours = delta.seconds // 3600 - return f"in {hours} hours" if hours > 1 else "in 1 hour" - elif delta.seconds >= 60: - minutes = delta.seconds // 60 - return f"in {minutes} minutes" if minutes > 1 else "in 1 minute" - else: - return f"in {delta.seconds} seconds" if delta.seconds > 1 else "in 1 second" - - -def format_last_check(last_log: datetime) -> str: - now = datetime.now() - delta = now - last_log - - if delta.days > 0: - return f"{delta.days} days ago" if delta.days > 1 else "1 day ago" - elif delta.days < 0: - return f"in {-delta.days} days" if -delta.days > 1 else "in 1 day" - elif delta.seconds >= 3600: - hours = delta.seconds // 3600 - return f"{hours} hours ago" if hours > 1 else "1 hour ago" - elif delta.seconds >= 60: - minutes = delta.seconds // 60 - return f"{minutes} minutes ago" if minutes > 1 else "1 minute ago" - else: - return "less than a minute ago" - - -def check_nodes(force=False) -> list: - global nodes, _node_status_cache, _node_status_cache_time - - # Skip check if done recently, unless forced - if not force and last_log > datetime.now() - relativedelta.relativedelta(minutes=1): - # Load the last log - try: - with open(f"{log_dir}/node_status.json", "r") as file: - data = json.load(file) - except (json.JSONDecodeError, FileNotFoundError) as e: - logger.error(f"Error reading node_status.json: {e}") - data = [] - - newest = { - "date": datetime.now() - relativedelta.relativedelta(years=1), - "nodes": [], - } - for entry in data: - if datetime.strptime(entry["date"], "%Y-%m-%d %H:%M:%S") > newest["date"]: - newest = entry - newest["date"] = datetime.strptime(newest["date"], "%Y-%m-%d %H:%M:%S") - node_status = newest["nodes"] - else: - if len(nodes) == 0: - nodes = get_node_list() - - # Use ThreadPoolExecutor to check nodes in parallel - futures = {} - node_status = [] - - # Submit all node checks to the executor - for ip in nodes: - futures[node_check_executor.submit(check_single_node, ip)] = ip - - # Collect results as they complete - for future in concurrent.futures.as_completed(futures): - ip = futures[future] - try: - node_result = future.result() - node_status.append(node_result) - except Exception as e: - logger.error(f"Error processing results for node {ip}: {e}") - # Ensure a failed node entry is still included - node_status.append({ - "ip": ip, - "name": node_names[ip] if ip in node_names else ip, - "location": (node_locations[ip] if ip in node_locations else "Unknown"), - "plain_dns": False, - "doh": False, - "doh_server": [], - "dot": False, - "cert": {"valid": False, "expires": "ERROR", "expiry_date": "ERROR"}, - "cert_853": {"valid": False, "expires": "ERROR", "expiry_date": "ERROR"}, - }) - - # Save the node status to a file - log_status(node_status) - - # Update the in-memory cache with thread safety - with cache_lock: - _node_status_cache = node_status - _node_status_cache_time = datetime.now() - - logger.info("Finished checking nodes") - - # Send notifications if any nodes are down - for node in node_status: - try: - if ( - not node["plain_dns"] - or not node["doh"] - or not node["dot"] - or not node["cert"]["valid"] - or not node["cert_853"]["valid"] - ): - send_down_notification(node) - continue - # Check if cert is expiring in 7 days - try: - cert_expiry = datetime.strptime( - node["cert"]["expiry_date"], "%b %d %H:%M:%S %Y GMT" - ) - if cert_expiry < datetime.now() + relativedelta.relativedelta(days=7): - send_down_notification(node) - continue - - cert_853_expiry = datetime.strptime( - node["cert_853"]["expiry_date"], "%b %d %H:%M:%S %Y GMT" - ) - if cert_853_expiry < datetime.now() + relativedelta.relativedelta(days=7): - send_down_notification(node) - except Exception as e: - logger.error(f"Error processing certificate expiry for {node['ip']}: {e}") - except Exception as e: - logger.error(f"Error in notification loop for {node.get('ip')}: {e}") - - return node_status - - -def check_single_node(ip): - """Check a single node and return its status.""" - logger.info(f"Checking node {ip}") - try: - # Add timeout handling for individual checks - plain_dns_result = False - doh_result = {"status": False, "server": []} - dot_result = False - cert_result = {"valid": False, "expires": "ERROR", "expiry_date": "ERROR"} - cert_853_result = {"valid": False, "expires": "ERROR", "expiry_date": "ERROR"} - - # Use shared executor to avoid creating/destroying thread pools constantly - future_plain_dns = sub_check_executor.submit(check_plain_dns, ip) - future_doh = sub_check_executor.submit(check_doh, ip) - future_dot = sub_check_executor.submit(check_dot, ip) - future_cert = sub_check_executor.submit(verify_cert, ip, 443) - future_cert_853 = sub_check_executor.submit(verify_cert, ip, 853) - - # Collect results with timeout - try: - plain_dns_result = future_plain_dns.result(timeout=5) - except (concurrent.futures.TimeoutError, Exception) as e: - logger.warning(f"Plain DNS check timed out for {ip}: {str(e)}") - - try: - doh_result = future_doh.result(timeout=5) - except (concurrent.futures.TimeoutError, Exception) as e: - logger.warning(f"DoH check timed out for {ip}: {str(e)}") - - try: - dot_result = future_dot.result(timeout=5) - except (concurrent.futures.TimeoutError, Exception) as e: - logger.warning(f"DoT check timed out for {ip}: {str(e)}") - - try: - cert_result = future_cert.result(timeout=5) - except (concurrent.futures.TimeoutError, Exception) as e: - logger.warning(f"Cert check timed out for {ip}: {str(e)}") - - try: - cert_853_result = future_cert_853.result(timeout=5) - except (concurrent.futures.TimeoutError, Exception) as e: - logger.warning(f"Cert 853 check timed out for {ip}: {str(e)}") - - node_status = { - "ip": ip, - "name": node_names[ip] if ip in node_names else ip, - "location": ( - node_locations[ip] if ip in node_locations else "Unknown" - ), - "plain_dns": plain_dns_result, - "doh": doh_result["status"], - "doh_server": doh_result["server"], - "dot": dot_result, - "cert": cert_result, - "cert_853": cert_853_result, - } - logger.info(f"Node {ip} check complete") - return node_status - except Exception as e: - logger.error(f"Error checking node {ip}: {e}") - # Add a failed entry for this node to ensure it's still included - return { - "ip": ip, - "name": node_names[ip] if ip in node_names else ip, - "location": ( - node_locations[ip] if ip in node_locations else "Unknown" - ), - "plain_dns": False, - "doh": False, - "doh_server": [], - "dot": False, - "cert": {"valid": False, "expires": "ERROR", "expiry_date": "ERROR"}, - "cert_853": {"valid": False, "expires": "ERROR", "expiry_date": "ERROR"}, - } - - -# region File logs - - -def log_status(node_status: list): - global last_log - last_log = datetime.now() - # Check if the file exists - filename = f"{log_dir}/node_status.json" - if os.path.isfile(filename): - try: - with open(filename, "r") as file: - data = json.load(file) - except json.JSONDecodeError: - logger.error(f"Corrupted JSON in {filename}, starting fresh") - data = [] - else: - data = [] - - # Get oldest date - oldest = datetime.now() - newest = datetime.now() - relativedelta.relativedelta(years=1) - for entry in data: - date = datetime.strptime(entry["date"], "%Y-%m-%d %H:%M:%S") - if date < oldest: - oldest = date - if date > newest: - newest = date - - # If the oldest date is more than 7 days ago, save the file and create a new one - if (datetime.now() - oldest).days > 7: - # Copy the file to a new one - new_filename = f"{log_dir}/node_status_{newest.strftime('%Y-%m-%d')}.json" - os.rename(filename, new_filename) - data = [] - - # Add the new entry - data.append( - {"date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "nodes": node_status} - ) - - with open(filename, "w") as file: - json.dump(data, file, indent=4) - print("Logged status", flush=True) - - -# endregion -# region History functions -@cache.memoize(timeout=300) # Cache for 5 minutes -def get_history(days: int) -> list: - log_files = [ - f - for f in os.listdir(log_dir) - if f.endswith(".json") and f.startswith("node_status") - ] - history = [] - - for log_file in log_files: - file_path = os.path.join(log_dir, log_file) - with open(file_path, "r") as file: - data = json.load(file) - for entry in data: - entry_date = datetime.strptime(entry["date"], "%Y-%m-%d %H:%M:%S") - if datetime.now() - relativedelta.relativedelta(days=days) < entry_date: - history.append(entry) - return history - - -# Create factory functions to replace lambdas that can't be pickled -def create_default_node_dict(): - return { - "name": "", - "location": "", - "ip": "", - "plain_dns": {"last_down": "never", "percentage": 0}, - "doh": {"last_down": "never", "percentage": 0}, - "dot": {"last_down": "never", "percentage": 0}, - } - -def create_default_counts_dict(): - return { - "plain_dns": {"down": 0, "total": 0}, - "doh": {"down": 0, "total": 0}, - "dot": {"down": 0, "total": 0}, - } - -@cache.memoize(timeout=600) # Cache for 10 minutes -def summarize_history(history: list) -> dict: - # Replace lambda with named function - nodes_status = defaultdict(create_default_node_dict) - - overall_status = { - "plain_dns": {"last_down": "never", "percentage": 0}, - "doh": {"last_down": "never", "percentage": 0}, - "dot": {"last_down": "never", "percentage": 0}, - } - - # Collect data - # Replace lambda with named function - total_counts = defaultdict(create_default_counts_dict) - - for entry in history: - date = datetime.strptime(entry["date"], "%Y-%m-%d %H:%M:%S") - for node in entry["nodes"]: - ip = node["ip"] - # Update node details if not already present - if nodes_status[ip]["name"] == "": - nodes_status[ip]["name"] = node.get("name", "") - nodes_status[ip]["location"] = node.get("location", "") - nodes_status[ip]["ip"] = ip - - # Update counts and last downtime - for key in ["plain_dns", "doh", "dot"]: - status = node.get(key, "up") - if not status: - total_counts[ip][key]["down"] += 1 - total_counts[ip][key]["total"] += 1 - - # Update last downtime for each key - for key in ["plain_dns", "doh", "dot"]: - if not node.get(key): - # Check if the last downtime is more recent - if nodes_status[ip][key]["last_down"] == "never": - nodes_status[ip][key]["last_down"] = date.strftime("%Y-%m-%d %H:%M:%S") - elif date > datetime.strptime(nodes_status[ip][key]["last_down"], "%Y-%m-%d %H:%M:%S"): - nodes_status[ip][key]["last_down"] = date.strftime("%Y-%m-%d %H:%M:%S") - - # Calculate percentages and prepare final summary - node_list = [] - for ip, status in nodes_status.items(): - node_data = status.copy() - for key in ["plain_dns", "doh", "dot"]: - total = total_counts[ip][key]["total"] - down = total_counts[ip][key]["down"] - if total > 0: - node_data[key]["percentage"] = ((total - down) / total) * 100 - # Round to 2 decimal places - node_data[key]["percentage"] = round(node_data[key]["percentage"], 2) - else: - node_data[key]["percentage"] = 100 - node_list.append(node_data) - - # Aggregate overall status - overall_counts = { - "plain_dns": {"down": 0, "total": 0}, - "doh": {"down": 0, "total": 0}, - "dot": {"down": 0, "total": 0}, - } - for ip, counts in total_counts.items(): - for key in ["plain_dns", "doh", "dot"]: - overall_counts[key]["total"] += counts[key]["total"] - overall_counts[key]["down"] += counts[key]["down"] - - for key in ["plain_dns", "doh", "dot"]: - total = overall_counts[key]["total"] - down = overall_counts[key]["down"] - if total > 0: - overall_status[key]["percentage"] = ((total - down) / total) * 100 - # Round to 2 decimal places - overall_status[key]["percentage"] = round(overall_status[key]["percentage"], 2) - last_downs = [ - nodes_status[ip][key]["last_down"] - for ip in nodes_status - if nodes_status[ip][key]["last_down"] != "never" - ] - if last_downs: - overall_status[key]["last_down"] = max(last_downs) - else: - overall_status[key]["percentage"] = 100 - - return {"nodes": node_list, "overall": overall_status, "check_counts": total_counts} - - -def convert_nodes_to_dict(nodes): - nodes_dict = {} - for node in nodes: - ip = node.get("ip") - if ip: - nodes_dict[ip] = node - return nodes_dict - - -# endregion - - -# region API routes -@app.route("/api") -def api_index(): - agent = request.headers.get("User-Agent") - # Check if the request is not from a browser - nonBrowser = ["curl", "Postman", "Insomnia", "httpie", "wget", "python-requests"] - - endpoints = [ - {"route": "/api/nodes", "description": "Get the current status of all nodes"}, - { - "route": "/api/history", - "description": "Get a summary of the last x days of node status", - "parameters": [ - { - "name": "days", - "type": "int", - "description": "Number of days to get the history for", - } - ], - }, - { - "route": "/api/history/", - "description": "Get a summary of the last x days of node status", - }, - { - "route": "/api/full", - "description": "Get the full history of node status for the last x days", - "parameters": [ - { - "name": "days", - "type": "int", - "description": "Number of days to get the history for", - } - ], - }, - {"route": "/api/refresh", "description": "Force a status check of all nodes"}, - { - "route": "/api/latest", - "description": "Get the latest status of all nodes", - }, - { - "route": "/api/check/", - "description": "Check the status of a specific node", - "parameters": [ - { - "name": "ip", - "type": "string", - "description": "IP address of the node to check", - } - ], - } - ] - - if any(agent.lower().find(x) != -1 for x in nonBrowser): - print("API request", flush=True) - return jsonify({"status": "ok", "endpoints": endpoints}) - - else: - # Redirect to the main page - return render_template("api.html",endpoints=endpoints) - - -# Cache node status for API requests -@app.route("/api/nodes") -@cache.cached(timeout=300) # Increased from 60s to 5 minutes -def api_nodes(): - node_status = check_nodes_from_log() - return jsonify(node_status) - - -# Cache history API responses -@app.route("/api/history") -@cache.cached(timeout=300, query_string=True) # Cache for 5 minutes, respect query params -def api_history(): - history_days = 7 - if "days" in request.args: - try: - history_days = int(request.args["days"]) - except Exception: - pass - history = get_history(history_days) - history_summary = summarize_history(history) - return jsonify(history_summary) - - -@app.route("/api/history/") -@cache.memoize(timeout=300) # Cache for 5 minutes -def api_history_days(days: int): - history = get_history(days) - history_summary = summarize_history(history) - return jsonify(history_summary) - - -@app.route("/api/full") -@cache.cached(timeout=300, query_string=True) # Cache for 5 minutes, respect query params -def api_all(): - history_days = 7 - if "history" in request.args: - try: - history_days = int(request.args["history"]) - except Exception: - pass - if "days" in request.args: - try: - history_days = int(request.args["days"]) - except Exception: - pass - history = get_history(history_days) - return jsonify(history) - - -@app.route("/api/refresh") -def api_refresh(): - node_status = check_nodes(force=True) - return jsonify(node_status) - -@app.route("/api/latest") -@cache.cached(timeout=60) # Cache for 1 minute -def api_errors(): - node_status = check_nodes_from_log() - - alerts = [] - warnings = [] - for node in node_status: - node["class"] = "normal" - if not node["plain_dns"]: - node["class"] = "error" - alerts.append(f"{node['name']} does not support plain DNS") - - if not node["doh"]: - node["class"] = "error" - alerts.append(f"{node['name']} does not support DoH") - - if not node["dot"]: - node["class"] = "error" - alerts.append(f"{node['name']} does not support DoT") - - if not node["cert"]["valid"]: - node["class"] = "error" - alerts.append(f"{node['name']} has an invalid certificate") - - if not node["cert_853"]["valid"]: - node["class"] = "error" - alerts.append(f"{node['name']} has an invalid certificate on port 853") - - cert_expiry = datetime.strptime( - node["cert"]["expiry_date"], "%b %d %H:%M:%S %Y GMT" - ) - if cert_expiry < datetime.now(): - node["class"] = "error" - alerts.append(f"The {node['name']} node's certificate has expired") - continue - elif cert_expiry < datetime.now() + relativedelta.relativedelta(days=7): - node["class"] = "warning" - warnings.append( - f"The {node['name']} node's certificate is expiring {format_relative_time(cert_expiry)}" - ) - continue - cert_853_expiry = datetime.strptime( - node["cert_853"]["expiry_date"], "%b %d %H:%M:%S %Y GMT" - ) - if cert_853_expiry < datetime.now(): - node["class"] = "error" - alerts.append( - f"The {node['name']} node's certificate has expired for DNS over TLS (port 853)" - ) - continue - elif cert_853_expiry < datetime.now() + relativedelta.relativedelta(days=7): - node["class"] = "warning" - warnings.append( - f"The {node['name']} node's certificate is expiring {format_relative_time(cert_853_expiry)} for DNS over TLS (port 853)" - ) - - last_check = format_last_check(last_log) - - # Convert alerts and warnings to a string - alert_string = "" - for alert in alerts: - alert_string += f"{alert}\n" - warning_string = "" - for warning in warnings: - warning_string += f"{warning}\n" - - status_string = f"Warnings: {len(warnings)} | Alerts: {len(alerts)}" - if (len(alerts) == 0) and (len(warnings) == 0): - status_string = "HNSDoH is up and running!" - - # Get nodes down - nodes = len(node_status) - down_nodes = 0 - for node in node_status: - if not node["plain_dns"]: - down_nodes += 1 - continue - if not node["doh"]: - down_nodes += 1 - continue - if not node["dot"]: - down_nodes += 1 - continue - if not node["cert"]["valid"]: - down_nodes += 1 - continue - if not node["cert_853"]["valid"]: - down_nodes += 1 - - return jsonify({ - "warnings": warnings, - "warnings_string": warning_string, - "alerts": alerts, - "alerts_string": alert_string, - "last_check": last_check, - "status_string": status_string, - "up": nodes - down_nodes, - "down": down_nodes, - "total": nodes, - }) - -@app.route("/api/check/") -@cache.cached(timeout=30) # Cache for 30 seconds -def api_check(ip: str): - # Verify IP is one of the nodes - global nodes - if not nodes: - return jsonify({"error": "No nodes available"}), 404 - if ip not in nodes: - return jsonify({"error": f"Node {ip} not found"}), 404 - - - logger.info(f"Checking node {ip}") - data = { - "ip": ip, - "name": node_names[ip] if ip in node_names else ip, - "location": node_locations[ip] if ip in node_locations else "Unknown", - "plain_dns": False, - "doh": False, - "doh_server": [], - "dot": False, - "cert": {"valid": False, "expires": "ERROR", "expiry_date": "ERROR"}, - "cert_853": {"valid": False, "expires": "ERROR", "expiry_date": "ERROR"}, - } - try: - data["plain_dns"] = check_plain_dns(ip) - doh = check_doh(ip) - data["doh"] = doh["status"] - data["doh_server"] = doh["server"] - data["dot"] = check_dot(ip) - data["cert"] = verify_cert(ip, 443) - data["cert_853"] = verify_cert(ip, 853) - logger.info(f"Node {ip} check complete") - except Exception as e: - logger.error(f"Error checking node {ip}: {e}") - - logger.info("Finished checking nodes") - return jsonify(data) -# endregion - - -# region Main routes -# Cache the main page rendering -@app.route("/") -@cache.cached(timeout=120, query_string=True) # Increased from 60s to 2 minutes -def index(): - # Check for fast_load parameter to provide a quicker initial page load - fast_load = request.args.get('fast_load', 'false').lower() == 'true' - - if fast_load: - # Return a minimal template that will load data via JavaScript - return render_template( - "index_fast.html", - api_url=request.url_root + "api" - ) - - # Original slower but complete load - node_status = check_nodes_from_log() - - alerts = [] - warnings = [] - for node in node_status: - node["class"] = "normal" - if not node["plain_dns"]: - node["class"] = "error" - alerts.append(f"{node['name']} does not support plain DNS") - - if not node["doh"]: - node["class"] = "error" - alerts.append(f"{node['name']} does not support DoH") - - if not node["dot"]: - node["class"] = "error" - alerts.append(f"{node['name']} does not support DoT") - - if not node["cert"]["valid"]: - node["class"] = "error" - alerts.append(f"{node['name']} has an invalid certificate") - - if not node["cert_853"]["valid"]: - node["class"] = "error" - alerts.append(f"{node['name']} has an invalid certificate on port 853") - - cert_expiry = datetime.strptime( - node["cert"]["expiry_date"], "%b %d %H:%M:%S %Y GMT" - ) - if cert_expiry < datetime.now(): - node["class"] = "error" - alerts.append(f"The {node['name']} node's certificate has expired") - continue - elif cert_expiry < datetime.now() + relativedelta.relativedelta(days=7): - node["class"] = "warning" - warnings.append( - f"The {node['name']} node's certificate is expiring {format_relative_time(cert_expiry)}" - ) - continue - cert_853_expiry = datetime.strptime( - node["cert_853"]["expiry_date"], "%b %d %H:%M:%S %Y GMT" - ) - if cert_853_expiry < datetime.now(): - node["class"] = "error" - alerts.append( - f"The {node['name']} node's certificate has expired for DNS over TLS (port 853)" - ) - continue - elif cert_853_expiry < datetime.now() + relativedelta.relativedelta(days=7): - node["class"] = "warning" - warnings.append( - f"The {node['name']} node's certificate is expiring {format_relative_time(cert_853_expiry)} for DNS over TLS (port 853)" - ) - - history_days = 30 - if "history" in request.args: - try: - history_days = int(request.args["history"]) - except Exception: - pass - history = get_history(history_days) - history_summary = summarize_history(history) - - # Convert time to relative time - for node in history_summary["nodes"]: - for key in ["plain_dns", "doh", "dot"]: - if node[key]["last_down"] == "never": - node[key]["last_down"] = "over 30 days ago" - else: - node[key]["last_down"] = format_last_check( - datetime.strptime(node[key]["last_down"], "%Y-%m-%d %H:%M:%S") - ) - - for key in ["plain_dns", "doh", "dot"]: - if history_summary["overall"][key]["last_down"] == "never": - continue - history_summary["overall"][key]["last_down"] = format_last_check( - datetime.strptime(history_summary["overall"][key]["last_down"], "%Y-%m-%d %H:%M:%S") - ) - - last_check = format_last_check(last_log) - - return render_template( - "index.html", - nodes=node_status, - warnings=warnings, - alerts=alerts, - history=history_summary, - last_check=last_check, - ) - - -# Add cache headers to manifest.json -@app.route("/manifest.json") -@add_cache_headers(max_age=86400) # Cache for 1 day -def manifest(): - with open("templates/manifest.json", "r") as file: - manifest = json.load(file) - manifest["start_url"] = request.url_root - return jsonify(manifest) - - -@app.route("/") -def catch_all(path: str): - if os.path.isfile("templates/" + path): - return render_template(path) - - # Try with .html - if os.path.isfile("templates/" + path + ".html"): - return render_template(path + ".html") - - if os.path.isfile("templates/" + path.strip("/") + ".html"): - return render_template(path.strip("/") + ".html") - - # Try to find a file matching - if path.count("/") < 1: - # Try to find a file matching - filename = find(path, "templates") - if filename: - return send_file(filename) - - return render_template("404.html"), 404 - - -# endregion - - -# region Error Catching -# 404 catch all -@app.errorhandler(404) -def not_found(e): - return render_template("404.html"), 404 - - -# endregion - -# After defining check_nodes() function -def scheduled_node_check(): - """Function to be called by the scheduler to check all nodes""" - try: - logger.info("Running scheduled node check") - # Get fresh node list on each check to pick up DNS changes - global nodes, _node_status_cache, _node_status_cache_time - nodes = [] # Reset node list to force refresh - - # Run the check (which now uses ThreadPoolExecutor) - # Force the check to bypass the 1-minute debounce - node_status = check_nodes(force=True) - # Clear relevant caches - cache.delete_memoized(api_nodes) - cache.delete_memoized(api_errors) - cache.delete_memoized(index) - - # Force garbage collection to prevent memory leaks over long periods - gc.collect() - - logger.info("Completed scheduled node check and updated caches") - except Exception as e: - logger.error(f"Error in scheduled node check: {e}") - -def scheduler_listener(event): - """Listener for scheduler events""" - if event.exception: - logger.error(f"Error in scheduled job: {event.exception}") - else: - logger.debug("Scheduled job completed successfully") - -# Function to start the scheduler -def start_scheduler(): - # Get check interval from environment variable or use default (5 minutes) - check_interval_str = os.getenv("CHECK_INTERVAL_MINUTES", "5") - try: - check_interval = int(check_interval_str) - except ValueError: - logger.warning(f"Invalid CHECK_INTERVAL_MINUTES value: {check_interval_str}, using default of 5") - check_interval = 5 - - logger.info(f"Setting up scheduler to run every {check_interval} minutes") - # Add the job to the scheduler - scheduler.add_job( - scheduled_node_check, - IntervalTrigger(minutes=check_interval), - id='node_check_job', - replace_existing=True - ) - logger.info(f"Setting up scheduler to run every {check_interval} minutes") - # Add listener for job events - scheduler.add_listener(scheduler_listener, EVENT_JOB_ERROR | EVENT_JOB_EXECUTED) - # Start the scheduler if it's not already running - if not scheduler.running: - scheduler.start() - logger.info("Scheduler started") - -# Register signal handlers for graceful shutdown in Docker -def signal_handler(sig, frame): - logger.info(f"Received signal {sig}, shutting down...") - if scheduler.running: - scheduler.shutdown() - logger.info("Scheduler shut down") - - # Shutdown thread pools - logger.info("Shutting down thread pools...") - node_check_executor.shutdown(wait=False) - sub_check_executor.shutdown(wait=False) - - sys.exit(0) - -# Register the signal handlers -signal.signal(signal.SIGINT, signal_handler) -signal.signal(signal.SIGTERM, signal_handler) - -# Initialize the scheduler when the app starts without relying on @before_first_request -# which is deprecated in newer Flask versions -# Only start scheduler if we are the main process or not in debug mode reloader -if os.environ.get("WERKZEUG_RUN_MAIN") == "true" or __name__ == "__main__": - with app.app_context(): - start_scheduler() - # Run an immediate check in a separate thread to not block startup - import threading - startup_thread = threading.Thread(target=scheduled_node_check) - startup_thread.daemon = True - startup_thread.start() - -# Custom Brotli compression for responses -@app.after_request -def add_compression(response): - # Skip compression for responses that are: - # 1. Already compressed - # 2. Too small (< 500 bytes) - # 3. In direct passthrough mode (like static files) - # 4. Not a compressible MIME type - if (response.content_length is None or - response.content_length < 500 or - 'Content-Encoding' in response.headers or - response.direct_passthrough): - return response - # Only compress specific MIME types - content_type = response.headers.get('Content-Type', '') - compressible_types = [ - 'text/html', - 'text/css', - 'text/plain', - 'application/javascript', - 'application/json', - 'application/xml', - 'text/xml' - ] - if not any(t in content_type for t in compressible_types): - return response - accept_encoding = request.headers.get('Accept-Encoding', '') - if 'br' in accept_encoding: - try: - # Get the response content - response_data = response.get_data() - # Compress with Brotli - compressed_data = brotli.compress(response_data, quality=6) - # Only apply Brotli if it results in smaller size - if len(compressed_data) < len(response_data): - response.set_data(compressed_data) - response.headers['Content-Encoding'] = 'br' - response.headers['Content-Length'] = len(compressed_data) - except Exception as e: - logger.warning(f"Brotli compression failed: {e}") - # If compression fails, we just return the uncompressed response - - return response - -def check_nodes_from_log(): - """Read the most recent node status from the log file.""" - global _node_status_cache, _node_status_cache_time, last_log - - # Return cached result if it's less than 2 minutes old (increased from 60s) - with cache_lock: - if _node_status_cache is not None and _node_status_cache_time is not None: - if (datetime.now() - _node_status_cache_time).total_seconds() < 120: - logger.debug("Using cached node status") - return _node_status_cache - - try: - # Load the last log - with open(f"{log_dir}/node_status.json", "r") as file: - data = json.load(file) - - newest = { - "date": datetime.now() - relativedelta.relativedelta(years=1), - "nodes": [], - } - - for entry in data: - entry_date = datetime.strptime(entry["date"], "%Y-%m-%d %H:%M:%S") - if entry_date > newest["date"]: - newest = entry - newest["date"] = entry_date - - # Update global last_log from the file data so the UI shows the correct time - if isinstance(newest["date"], datetime) and newest["date"] > last_log: - last_log = newest["date"] - - # Update the cache - with cache_lock: - _node_status_cache = newest["nodes"] - _node_status_cache_time = datetime.now() - - return newest["nodes"] - except (json.JSONDecodeError, FileNotFoundError, Exception) as e: - logger.error(f"Error reading node status from log: {e}") - # If we can't read from the log, run a fresh check - return check_nodes() - -# Add a lightweight status function for quick status checks -@app.route("/api/quick-status") -@cache.cached(timeout=30) # Cache for 30 seconds -def quick_status(): - """Return a minimal status without expensive node checks""" - try: - # Load the last log - with open(f"{log_dir}/node_status.json", "r") as file: - data = json.load(file) - - if not data: - return jsonify({"status": "unknown", "last_check": "never"}) - - newest_entry = max(data, key=lambda x: datetime.strptime(x["date"], "%Y-%m-%d %H:%M:%S")) - last_check_time = format_last_check(datetime.strptime(newest_entry["date"], "%Y-%m-%d %H:%M:%S")) - - # Count nodes with issues - node_status = newest_entry["nodes"] - total_nodes = len(node_status) - nodes_with_issues = 0 - - for node in node_status: - if (not node["plain_dns"] or not node["doh"] or not node["dot"] or - not node["cert"]["valid"] or not node["cert_853"]["valid"]): - nodes_with_issues += 1 - - return jsonify({ - "status": "ok" if nodes_with_issues == 0 else "issues", - "last_check": last_check_time, - "total_nodes": total_nodes, - "nodes_with_issues": nodes_with_issues - }) - except Exception as e: - logger.error(f"Error getting quick status: {e}") - return jsonify({"status": "error", "message": str(e)}) - -# Run the app with threading enabled -if __name__ == "__main__": - # Disable debug mode for production reliability to prevent double execution of scheduler - app.run(debug=False, port=5000, host="0.0.0.0", threaded=True) diff --git a/templates/404.html b/templates/404.html deleted file mode 100644 index 7c3c403..0000000 --- a/templates/404.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - Page Not Found - HNSDoH Status - - - - - - -
-
-
404
-
Page Not Found
-
The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.
- Return Home -
- - -
- - - \ No newline at end of file diff --git a/templates/api.html b/templates/api.html deleted file mode 100644 index fd7b89d..0000000 --- a/templates/api.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - API Documentation - HNSDoH Status - - - - - - -
-
-
-

API Documentation

-
Programmatic access to status data
-
- -
- -
- {% for endpoint in endpoints %} -
- -
{{ endpoint.description }}
- - {% if endpoint.parameters %} -
- - - - - - - - - - {% for param in endpoint.parameters %} - - - - - - {% endfor %} - -
ParameterTypeDescription
{{ param.name }}{{ param.type }}{{ param.description }}
-
- {% endif %} -
- {% endfor %} -
- - -
- - - \ No newline at end of file diff --git a/templates/assets/bootstrap/css/bootstrap.min.css b/templates/assets/bootstrap/css/bootstrap.min.css deleted file mode 100644 index c794db6..0000000 --- a/templates/assets/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,5 +0,0 @@ -@charset "UTF-8";/*! - * Bootstrap v5.3.3 (https://getbootstrap.com/) - * Copyright 2011-2024 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin:calc(-.5 * var(--bs-offcanvas-padding-y)) calc(-.5 * var(--bs-offcanvas-padding-x)) calc(-.5 * var(--bs-offcanvas-padding-y)) auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} diff --git a/templates/assets/bootstrap/js/bootstrap.min.js b/templates/assets/bootstrap/js/bootstrap.min.js deleted file mode 100644 index bbd9b5e..0000000 --- a/templates/assets/bootstrap/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v5.3.3 (https://getbootstrap.com/) - * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function j(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function M(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${M(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${M(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=j(t.dataset[n])}return e},getDataAttribute:(t,e)=>j(t.getAttribute(`data-bs-${M(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>n(t))).join(","):null},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",jt="collapsing",Mt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(jt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(jt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(jt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(jt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(Mt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function je(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const Me={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:je(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:je(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},j=p?3:1;j>0&&"break"!==P(j);j--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],j=f?-T[$]/2:0,M=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-j-q-z-O.mainAxis:M-q-z-O.mainAxis,K=v?-E[$]/2+j+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,jn=`hide${xn}`,Mn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,jn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,Mn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,Mn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",js="Home",Ms="End",Fs="active",Hs="fade",Ws="show",Bs=".dropdown-toggle",zs=`:not(${Bs})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ks extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,js,Ms].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([js,Ms].includes(t.key))i=e[t.key===js?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ks.getOrCreateInstance(i).show())}_getChildren(){return z.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(Bs,Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:z.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ks.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Ks.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(Vs))Ks.getOrCreateInstance(t)})),m(Ks);const Qs=".bs.toast",Xs=`mouseover${Qs}`,Ys=`mouseout${Qs}`,Us=`focusin${Qs}`,Gs=`focusout${Qs}`,Js=`hide${Qs}`,Zs=`hidden${Qs}`,to=`show${Qs}`,eo=`shown${Qs}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){N.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),d(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),N.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),N.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Xs,(t=>this._onInteraction(t,!0))),N.on(this._element,Ys,(t=>this._onInteraction(t,!1))),N.on(this._element,Us,(t=>this._onInteraction(t,!0))),N.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ao),m(ao),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Ks,Toast:ao,Tooltip:cs}})); diff --git a/templates/assets/css/404.css b/templates/assets/css/404.css deleted file mode 100644 index 704b59c..0000000 --- a/templates/assets/css/404.css +++ /dev/null @@ -1,19 +0,0 @@ -body { - background-color: #000000; - color: #ffffff; -} -.centre { - text-align: center; - margin-top: 20%; -} -a { - color: #ffffff; -} -a:hover { - color: #ff0000; -} -h1 { - font-size: 100px; - margin: 0; - padding: 0; -} \ No newline at end of file diff --git a/templates/assets/css/Navbar-Right-Links-Dark-icons.css b/templates/assets/css/Navbar-Right-Links-Dark-icons.css deleted file mode 100644 index b6e79a3..0000000 --- a/templates/assets/css/Navbar-Right-Links-Dark-icons.css +++ /dev/null @@ -1,57 +0,0 @@ -.bs-icon { - --bs-icon-size: .75rem; - display: flex; - flex-shrink: 0; - justify-content: center; - align-items: center; - font-size: var(--bs-icon-size); - width: calc(var(--bs-icon-size) * 2); - height: calc(var(--bs-icon-size) * 2); - color: var(--bs-primary); -} - -.bs-icon-xs { - --bs-icon-size: 1rem; - width: calc(var(--bs-icon-size) * 1.5); - height: calc(var(--bs-icon-size) * 1.5); -} - -.bs-icon-sm { - --bs-icon-size: 1rem; -} - -.bs-icon-md { - --bs-icon-size: 1.5rem; -} - -.bs-icon-lg { - --bs-icon-size: 2rem; -} - -.bs-icon-xl { - --bs-icon-size: 2.5rem; -} - -.bs-icon.bs-icon-primary { - color: var(--bs-white); - background: var(--bs-primary); -} - -.bs-icon.bs-icon-primary-light { - color: var(--bs-primary); - background: rgba(var(--bs-primary-rgb), .2); -} - -.bs-icon.bs-icon-semi-white { - color: var(--bs-primary); - background: rgba(255, 255, 255, .5); -} - -.bs-icon.bs-icon-rounded { - border-radius: .5rem; -} - -.bs-icon.bs-icon-circle { - border-radius: 50%; -} - diff --git a/templates/assets/css/Team-images.css b/templates/assets/css/Team-images.css deleted file mode 100644 index f84d7bd..0000000 --- a/templates/assets/css/Team-images.css +++ /dev/null @@ -1,4 +0,0 @@ -.fit-cover { - object-fit: cover; -} - diff --git a/templates/assets/css/api.css b/templates/assets/css/api.css deleted file mode 100644 index c84fd0f..0000000 --- a/templates/assets/css/api.css +++ /dev/null @@ -1,66 +0,0 @@ -body { - background-color: #000000; - color: #ffffff; -} -.centre { - text-align: center; - margin-top: 10px; -} -h1 { - font-size: 100px; - margin: 0; - padding: 0; -} -p { - font-size: 18px; - font-weight: bold; - color: #ffffff; -} - -ul { - list-style-type: none; /* Remove bullet points */ - padding: 0; - margin: 0; -} - -li { - margin-bottom: 15px; -} - -/* Style for the route names */ -li strong { - color: #9ccdff; /* Darker shade for route names */ - font-size: 16px; -} - -/* Style for descriptions */ -li em { - font-size: 14px; - color: #ffa44f; /* Lighter shade for parameter labels */ -} - -/* Nested parameter list */ -li ul { - margin-left: 20px; - margin-top: 8px; -} - -li ul li { - font-size: 14px; - color: #cfcfcf; /* Parameter details */ -} - -/* Styling parameter names */ -li ul li strong { - color: #3498db; /* Light blue for parameter names */ -} - -/* Add a subtle hover effect */ -li.top:hover { - /* Invert colours */ - filter: invert(1); - background-color: #000000; - border-left: 4px solid #3498db; - padding-left: 10px; - transition: all 0.3s ease; -} diff --git a/templates/assets/css/bs-theme-overrides.css b/templates/assets/css/bs-theme-overrides.css deleted file mode 100644 index db833dc..0000000 --- a/templates/assets/css/bs-theme-overrides.css +++ /dev/null @@ -1,39 +0,0 @@ -[data-bs-theme=dark] { - --bs-primary: #002459; - --bs-primary-rgb: 0,36,89; - --bs-primary-text-emphasis: #667C9B; - --bs-primary-bg-subtle: #000712; - --bs-primary-border-subtle: #001635; -} - -[data-bs-theme=dark] .btn-primary, .btn-primary[data-bs-theme=dark] { - --bs-btn-color: #fff; - --bs-btn-bg: #002459; - --bs-btn-border-color: #002459; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #001F4C; - --bs-btn-hover-border-color: #001D47; - --bs-btn-focus-shadow-rgb: 217,222,230; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #001D47; - --bs-btn-active-border-color: #001B43; - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #002459; - --bs-btn-disabled-border-color: #002459; -} - -[data-bs-theme=dark] .btn-outline-primary, .btn-outline-primary[data-bs-theme=dark] { - --bs-btn-color: #002459; - --bs-btn-border-color: #002459; - --bs-btn-focus-shadow-rgb: 0,36,89; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #002459; - --bs-btn-hover-border-color: #002459; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #002459; - --bs-btn-active-border-color: #002459; - --bs-btn-disabled-color: #002459; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #002459; -} - diff --git a/templates/assets/css/index.css b/templates/assets/css/index.css deleted file mode 100644 index 6203a8e..0000000 --- a/templates/assets/css/index.css +++ /dev/null @@ -1,30 +0,0 @@ -.node { - margin: 25px; - border: solid; - border-radius: 20px; - padding: 20px; -} - -.spacer { - margin: 25px; - display: block; -} -.warnings,.errors { - margin: auto; - width: 1000px; - max-width: 95%; - margin-top: 20px; -} -.node-info { - margin-top: 5px; - margin-bottom: 5px; -} -.node-info > p{ - margin: 0; -} -.node.warning { - border-color: #FFA500; -} -.node.error { - border-color: #FF0000; -} diff --git a/templates/assets/img/favicon.png b/templates/assets/img/favicon.png deleted file mode 100644 index dd8950d98d319a7753b0af17201b8229ea4e71ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29113 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 diff --git a/templates/assets/img/people/HNSCA.webp b/templates/assets/img/people/HNSCA.webp deleted file mode 100644 index bf8fdca7fd3f17f69603622f3351c0659935b8c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11234 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 EAK52zga7~l diff --git a/templates/assets/img/people/easy-hns.jpg b/templates/assets/img/people/easy-hns.jpg deleted file mode 100644 index 9acf54a4b519fc042bd642d2fa242b96af35818e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40050 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

==eP2M|ep|amv9WbOGIlApq(} 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 p`HhlW18T5r3d#kA?QjD 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 D$3k?q diff --git a/templates/assets/img/people/nathanwoodburn.webp b/templates/assets/img/people/nathanwoodburn.webp deleted file mode 100644 index bf2f65792395f3c750809d366b0ca23c687d4fe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12134 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 diff --git a/templates/assets/img/people/profile - small.webp b/templates/assets/img/people/profile - small.webp deleted file mode 100644 index bf2f65792395f3c750809d366b0ca23c687d4fe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12134 zcmaKxQ=BG2lds>lZQGu+Gl~CP=8R zp-Bj_3jq4p{>u!Eob3Ob{;%<$>UsIUwF`9rSH=H731w{JWb{vR`_D-o|4sg{Ce(k7 zYWCku`5!j?Z|3WUT|2Zze37`lN0|@?S{r~#^%&rgs;CKQ6K;r)=XP5y1w1ofwnCt(O zBh3c@5P|`K)|vmw{m-7*8#o&L*XKb0MPO4?0N}n10D#i~08nND0BEiM8v7UiAGHzw z8^Zlpm)*Z+2CxR000;pR09$|&fc_u-0x$xY0BrwGn9%;;?#I6Za)7A)f&78^kvtof zX(?D5sM)I4eA4Ds5&WH z@-{z3ehIbC0=wmYr)BNTc>3Gtf88wdzlpueY23VfmwfNcjsN^?j@@AV{J7q12;;We zG3Y#`?T;sl=YVy2e*L<_xuNTW&tN(}wAOf_8^%oo7pO1#&Zwl)I+e0U(5zk@T{U*4 zT2VK^Cg)qYB9OIM4~V=rXb5KaU%OO3w=?>~egnN0#~17dZY0O=fdQI*A^pYPWy9p0 z-mXOR$H_c)GT-r#Tl$;QmyXwa%FyBO{kN7lO%LOp<(b2M%=d+;5*RRd2T@BuNUmt= zd$(Pn$6lC^pq1DN*7Dg{{Ewy*crnHxeqp_qX3;n9U%t`CWXU2o_8i&0-!_-m+Jtj4 zXMYkl_<=1Cd8DUJeX%NAtV#maAMBAmPCIIwaJ<2OdsbiE7`*?q5WxC zL5YrUi=Xikei}Z^n(~rP&0opji<*3lGAVX3rB{)R`!a6Xth@RFrho<>*CX_VL{zaH zQ>nm7lF|H`GGskLAL@KTWWQried@UEYr@JC{K#~GN8Nmxu&lNZ!Z^tEL?l@S+YvOUpg?4U)Iu3e$SiY#3?XdPyQ$v zAU$oEb#Fum0{M3b?n}jdJ$$Ta!AIa*L@6^{ueAwx@A^5;^~$~Qwl%fEf)V|0G=}Eb zv-FC~^5ZY8C2|L5Z@v04Lm!CdUx0mTB;mj~e*R9|VDs$F?{bEVud$9ILfvr()1U|k zJt0iC&f%r0Id(VIY8y``xK>X(OpRG|7-PN^o>r;!F5l^D$URkjk(4|QUSZ4lit$v< zOFyBdMlkpsmOtXgNw_>+^GgfuCf6Y$2-4dbeO)lA=j%C0^M#Ac#}m&MpCJ&xX4s&jM-nNGZ)AQ2`(aJc&35MP zc2u~n7!%Z#C%ADCj1v3v;p=!c#U{En(9#weinoZ{n$K}@7dU3zz8i}yFnm(1YM9|?TTDXhfaDo%`3k5}z#{}&JmYsMx@a=MI7%6Cv*7-aMj_#6>e}2T z1TqU2?}bFp94ewBKKUs4J`M%1m*9+kWaiF1f)#F)g6;qDxUk}F<@o{-SHkJHf*muE zIwIQosVr5m&BddGN8Tbg@`z356yp_|?$xgt2ztCM&nP7WaX1>4h>p2zhKGTB1q7aO z$s9Q6jJ;l``-o&uHakK}su$9D#Z}V1i!kQf&piaQB9hiBuLSp43a@xzWJE@BOozDl zbvpCwVh^H}-yYf{0)kVSBRsxY1(vR@r z3C$)eC#==MRVEN<4*dand23_CY=n(cr8@cnsn*-H&{)GBSNd`f^Rf*gOi82p+IVwY zZCjd}IG6r9)`!%oQtSScg|T9nb_NxaX<{{PBE={*DZ{fhvm&@x%{(WM0k4{Cnf@Z{ z>aZ%(G@3HJe^t0WM8pL%Lk}?gR*TTS?vNXAzK@);kbEKQbqrv5n>DIIHgE))UA|1S zk6~&YN3rRGONee(hNj=(L!u*)uRqGN)-Kim@t|A>M(!q1_pmR38?#3-ymtHu((`D7 zE*S@5zpV_qO7|GGeig(E6e3axo1wT0YbU+JH^cj&T-Da@dA#l@H&yK3p!%@0h`@c{ zy1SIgfka;^P^1FVs9+4RmFEaQsV}h@GKxK=<;*VRMzaU@$o_a;Ob$V0wb@B7U;9Zv zd+$a?6OG8G7|yrO1pgUQ(s)Ng+L)n6Mrg<4byp^s}{vV0|u5eNZ1@q ztbRV98xSWgAWlK(`xzU3e;;M-34Q!B5W-3b?V`DOF12XnwiIN-hKjY{zEzU;ZmMwR zwfpo^;gao(t9p6v2}-A-zf+f1LQ!4y@>>2kor{W2{V4)7^?Z#W=%X5X1Jd2i^G~a; z=UovInH*WXV&pT+a!QqmeV?7WW;$5p&7eaJE3u1FhH=heN%Af7?<-R8{N@<+kl@p_&+xE6BN*fNIOWU*P<-U9$>Xy^&3&=UEoYd(YJ2VER$BvVe z^U?u&ID15ye#=X>gi%o9gI{xFUmx!&p@$yR5F7K8TIPJx@*%#%TM3Rh`)Ji(NhCOP zqKpzi(62-Q!1oPqS*8u>eXv-kF)oGo3;#EFwruEQO;ke_k82JeMJ*ViFQr;N=C1>k zMkWr#f@+V7l3@3-1wX1-tDMHTThV#^%mNwgA(GNWS&!d**kt7wE$~^L=@_UC{E4)j zO1wQ8GoCNt1o)v4^&yc`Ci90=EXn@l?=Cjepwj}~4blcsDa0}iOg9dHlS1d075LDz z71o{1=c8}-z+xkG774qyIEP~Yrnjj1v5p6vH$@!F_km4>-39)kwGjod;syQ;g#ho9 zpHjAu!#KS)INR*c>LyM@pDO4)IPoWluv_4Usg#Ter2aZsd}g{7tR}{0ZFeNx%HWC4 zpn<@jU}gl;rP@5aQAbVqB|?_l3*XNac?+ctMI$EnhltYDvwbP}yiL3&rLwP%P+pSN zzJ)Q4jT6KgBYB7r3d$CM!;LzY= zDn;{`A5rC32msHaF zh~68)GA0|`k?n7Ocesb8zcmxnOMI|uGX%!45Sp*6NLV53UN@?)U7)R#^piZN78u6r z!*$e;-_W#>^I=x>4E_~z4XQncUtHuy0X52_^kjh0tP;=s9cK!YY-YP$C{8R;hUsrY z^e`So;19Ii7&qx@m)cF;5AjgsKLEn1`p|5#$n>~ zC8I?i@mz_v?pQK5oMjeK{Xh7?@`1B$hMe?uZI+OQ^QZ4fg2+|CRV9I zoa@Be&`PYA5SCOC)Q5UPSF&pl3VlTBi38ko2blVX?8Jeju+rR?KxCr!SF~Sm%v#1{ zT4;51hTL;EG*0_{vQepIrT(s7TCSXmG7Z**1EE#$AE{I&Wvutq@^d;9Iqm2g|8L=GGApt_H+eg>Qg1te1;xZ*~k8B4%O-R}$ zGfdL*&kWiRYJ*Bsm~5f@`tZ{(gH4i3oGjT%G4&A;sZQX+P<$}IYF^t!0&qycXsNHA&b|bruaBueFPne6JekfqR4pa}Z;(1I1Q4zi<(RxC43Lm-s^`MFEd_JQB z5GnWTtww-x?=4^QvEn^JP_AER*0ak$-_{>Hh9EYt{h&B{bOrC{LWoYpdX55fn{vbH4{E>L-;Xz)1*c4C9@v@_R^ z@Un|^45?q2Wk`Cocw{MZ1#8+$T*D;}Ni9x>!Jy{4LZM0E8)UeU=_953W1YYBve;Uf zXM;%#0FM}MfZX(StOC}E!~-PAKs&bm3#f6;X$!` zG#Y0tOBV}wS|htqr(FC7@<}s^{5FU7p&nN|n1{Uy9IzL}*&2;A*-2+2HJx#L%I^|i zu}sP1Pd+7)5;z@O(7qCwF&b|m>Yo3-R|uFwmTU#I`f{(Ba8Ni_+F=%1T6y#CI1eMQbVVO?x&?e&?nqm4MM_p>DPBI{=G#lgKr|j+(l?)7*n-!kOS4 zK$og_+pZ`RDs4;DjZUQWChHhbVtFU>dVLH@RWEzQki(KWFKP0vNqdZ^P9YHQGG8B8i41t3}utBLJ-ALLv4GfCDhX15kF{W%1FhE z8w}^O3(b1XK_<>ywfpB4gC(?x!sRH1YXF~I2aUp~LZE$}UNy=xPp`p}tBY(wfR^0v z2)w@Y(>nwQ)B%!QD6g&@JC&p{Yd_yj@RAN$ z6nR}h@s3DkP^tpE;}*m4x%7>uWcK`%c=u@x#=J34Z}Gg+a{y{UmH2ZJ#xd5r**S2) z1{d$B8tCw&rn`VWjpT5EEY}TOZp6UNvM1({0^p{S#Ia3p0?Lc$ldH!?{{do=wc<25)8C))bHxG2M?c+_xnWzu~kr`{=Gt;%uJPnEJ<&TG~#`azE;AK_alO5%ae^%pXWg zYW;v(CqEaX5~J7a;jm4ziBmZW82wYsvrKaiOJ|fF@bQ7LJSUxZ(dn_^1d`iE(=GEw zPo-vwAqF3N4SpPx4B zgvb$$siWrmEuwBSM8O9?VXVVPR=2Y>W%i3s72pWx%I#mq#Kd=eDwBDc-R1(_3ciC((vEPsH5Y2e__JRXT# z=-3;|;$25fgtGCHGP5u6*LWS_f!U1dGH){+mm;`86`oqzT%luxB@X8{x#s7RF`9fz zu)=Sin>UMvFA;&rU1uE71ieV6a3#Y6QVk}uYbL5D!9t71?fbX9pjGwVyfT0zigSaP zC=ZB47^SEwPO8BCWKf~ek${S-WX@|Ah`yF zz`Y$LG{zfGs&x%sf}@`w4ESn{5BD)+QST3;O~5dP>(os?QA952)&vmDT??DJu{NhVfzBm)^$DRGVl$WDww?0~fM!n93BQT;3#pyUwhWtRB9w$!wyEqTyiWfVBis zyElNg>V3x0YlYahvj?(9f3=^|DjmcV$rVM^SFAQ*adeY4+3ld^CixrB0jn~J2ix7k z2j$&6YOkIEBu*=un-dV{MA?I#rdNC_*fw~a30X^MFR@E4=gFpbUcxDMrTzv|POoSX1yAdK{Nq!!}~;a`6#xi@4+~MHXwAAv+Xq6(bO$C zB$>jg%(|_M!^G(XlTv@~Iw^oskRxhvfUU|LBsqz_42>v^H%Z#D^s15y`sL55fs-NOU?cxrcz+EY2#Q=mlXZ)vsyvFgbJioDpROC7TV%<6F z9d*ic=KSy9f=|9I6`zk1fD-VzQyX{-x5^9uf}oTBCJo~)t_9F9CiHURCedr-{e&Y& zwlZZ9rfWoQ#BIWK1O+196X5M0&}0OCBhR9V{wBnOT?S2Ow?LLr?md7gd?f-Zh{^q0 zhST(VVQHAWiM0YlnnSu~^HJ;Qw808S7VoNW`lY0m^RaG3A>I4qobsM~62sHAhU=>S~r_!{Bn#N{Zp ziW}+B8Brd}SG))Xjb=J9OUH*R$!|n7tO~tQx@)50>&$Za3t!dA+p`_S5oZLtNZ4w@ z+Y}bAr--W3Qx^X9oYccG_piU6m$2=)n(awZE9%ohKH*a?tDPR-vDV>FLman}zF=zb zigz~2VEIN9d823Nj_f{}=VCG{I+$d`%qxqkVQGbI~6a2*^ zFZx3$lqBUFah=n{u#2h`RmXZC-^B{P`HqU9fV{G1QgP4ukdZbGVr=kf|j31E{J9y_D!7ur(p`}B*rR#nhn$ZZsVI6dpY zVaUxRuYqMli(dGVT zLy!AFstn2|hnN;_(q(^cxM2Pq8$^UgG%lw<6TC0Y+|>Ly^eq54SHb9+ZAjXlf_AL@ z#a=M4bW$+GM65o9%X^F3egS@>*G|>cGvW1()MC=>5>nH{$1O?-o9tQ+qiI0d9nf8rE)W z?I@A@BEJL{?k70Br^JJ1wE5}_YY`yHI}^(yQwFQ{bV4buTr*1VXi&vvwn%G4REy*K z$i3)!;zV)UejTib2{gz&tTd6rUWPyWmR5-{GRz%5gLls(Fk-A~|$$!6&9&WWyB5flK0K%v{B3C$?Gt zeN(^CXNh*_C4I2`9j08d_a_YF$*LJz`d31Kj8n>5pZpkwq!BwO7u~{Vxfd6#49)A~ z1#lbO^9FF1iq?ll}OXPGFVw9?1?XL_+$MaLmx>@N6D&SMyJUyEjW6^8G8HzPKr>svpUiFeyy z1am?~lg#tco@1?8Cm@Gf5FA!q%qmEY#`>J4g->pYAKuL>*r_o<$8-yUC+t~Z)01#3 znjj4kGbWw;zxH)0_A&ju*S__m9t+HLmI%=hL=Yk-^J!*gbIq3gAyVii%Y~lm8^&)t zrOMYvGHK^n7oae5&@?ZRhr`uh?&Og~L zaqK4CWI^~h4v|?uvGzDM2;^GOHaf$xmr#9baxP$2!6Oy@(q^Y%#G{pA>+NFRg*{J4 zE2Lk`k5+%Xdk!1>+Q=XjO!(zl3{Kb7A)SDl_;W^JqZhTi2p7iLsfGih@cK|Ex@tz$ z(2qf&JVI-4iz@lOVyj35E@>`AB5pH*y`)^gUJ%iJY9o@38&O(qtdgN_5Z5ta`tq78 zL(~@o(=5rwrw+*=rHhDIN1_PGvrb-iFf4a)AS*e;$NFO%_r`|~ zuTXHvkhzXYcGw7cgKu5fJ4|lRElo?@AvX|av&N$Mm-jI3`eTnKHt!JkJ_^L#a;Xdi zC^p6L*p)mP|E^jF3;@gNkvR+!UDe0tZP`VEh2m5to@DdfpycT;J^7J7Jg%%#$$5aJ zd%(~#8%L2v#j!@iwOe!ras>jGoU%GnvhzK2xR81%!^z+g$ddboQ>$p`Z-GRC?xNV%hYE zy1ZdXV(P1j;!0&VIBqBpuKN2S9{>ButeMas8#_3hriLB0zgN5Y%uVfn?pj>de(yxc zNat`x#@9q3gf>CNIgAEsMQMoOVdsi7zn7>H1+ozuMD1-Q)}%@-MiZ$_N|EH)gdt{h z7(&ifXMgE}s`mnA%PE9n+Q$2=Yy^sq(g$;xh^(RQo%ni_DMH1ybEg-&nnR4I${xe) zZ#%d^ityKwEinF_;(I^UQDs6Iy=4E!ZusJzBVy{mY?mQ`nZPUWSN z4m4@}u*?Yh$t3WIU+SFMlOHtj{%!|eBdI9s2VkiR@C__gv87|g%~hZ|P^K{Aek&U7 z7oz3x^IL=Hj*`m+DL_JLyX+AvMDn78l(i#mE5L(>!EFU_)DWJ(m2 zuv@JN(yCt<%37&!Jka9Ag6wEQ#ZL_Z<{dy0S;T|LP~JrmcA!)EuhvKjQNy{qF6y<~ zzi?)i6(ZYzmWw*{>e`)$8n|d*Qw@nPeS-`AZ%jpR#@&~hYzugOpj683ZJ5=Q6K!D$ z(k?@s3U1L(9p4t(9G+cLZJNe_N}O@AK2|5tz@0{q&P5wFGnoRcPqo}uB4Y-=0$N)H zz{v(2F=^0zTmSueR6Qq^=+VdM0|_VT@iu9)wCntgHoH#;pZw`M44xl1bYMdOV{JZr zN7$tpJt7Euggj=0zReFj6Azu{Sw^RFms!dbm75511a)N`0nSU*JV}gEKSu(hPf8oc zbp(au>=Fc`$=G{^U%uzEwAUg^U9xrwNKxR?)wX= zcEp}QUEL#az69UKhk}n;l5125NWOZwcDwa-q=&=oK^-GVkhT^>5X2lXh+zziIY8_% z&gJpdguBn*DhhDgi`fXD_5UW<>PIRnruMe7>K<3RTGP-i%eXKf;#Yh=mYM}f$y_cV z%T#dZX%hB+l9x?41zFQr{_Ps<34>fn!7?m!w)NRp^uB)+{TAoXe)8zhV}~)nvlrY{}d!T-U%;K)fb|%DvBM3s?_q`kT_;^^7^g%Gt%ISFXwMkTGEF zU*Mh`E&Q~Y#lDd0u|)VHob+<36Ov&tQPB^Nj)x1A2(2|wz$QW0eUGhj1N()Gfj6H9 zzCh8z-FQczddes762yF+q^bb|&OwayAtLczppAxBsCqJBHz_G4b#E5D=n@~(m{xVAh&H*#VyA@1)PS zjeggb&|$^{)C~(kUuPN2epU#a+DEHOIT?SgR7-gSwVv+Q>h?0?xh_w5NG}1pOKgCs z$BIQ+lfnW$>@&yw{o<8<3!~6WQi0)iCGuOR`tCHGHcv}P;iS>wW7gov$3B3V_!Rt7 zm~eP_#qJnRQV|f(X#3^%G@%Q{*~9}cp*SK2+$cDY*@z^ATgyHhMDbYoZh2Y(SEYEQ z>5lzKM+*9DH1fCjVk?_A<0EqexuZs7tLN@xYM)9uQjpQkQ|0w#Mh`f8-|6ft@*g-R zR3G#%ya}Fw1#C^a%^7f8?G9WK(e24Kuh-&Qt(d}obPEqr(+p*?gln+e99J`bs(2@_ zTd5d{(m^X1-WRL%KZa|hJ02##0cmt}7-pLSYoz8Vie{Lm7T5S4BZ~4V(3kQ*r!Tj9 zE(j>={vkNe!x;r#j?r$(ZGnskZEdVRFc~sXG);-*rR`HN7Ho4qj}u6i0t4^ZM0om9 z+wNc1c_by7YqHA4VZVefX*=>l*w1dhi2^n@e?>puq+Kh887~(i>lP=FW0MHpJ zOL-NXyXxG?^P9b&$D)JT*2M(rbo5Tgl_*1c?sQ2#dR1@TIGalBKGCBLh6Hm)22D#+ z4E~6E4pd353$y)1W=X@cj|z~)AB1Ihg^Iz;MZ>GqhuY5BKV_4Fodzp2G2f? zKhjW$LTcw2sx*CZbgj5;=2d!1ui7%y#h7SB#0K6lWaXv%ee+Wd79Xo8s$mje;G)i6 ziZ);#%6d>d3+fvJt$31&BAqz5!{5GNbtT?XV$ON)OqIOY2MpjU0EN}a0D-goI|vA$ zYpw*TCqZfK@nq0Um*j{CyqKUu1f$qH&vdt$Ez*q;&NbLcj2pb<)=r0?3r72^a&2)Z z$KbtAYbvY0|eq~kA z@eq|$W4jYiqNJN;of1UFwkMRCo`TxMp4FK{ep%MPJ$VL-lu$+oo@cG_p4 z&huRl8L-e6Y~ju+_qZt4lP4f8el5FDW|QF zVa|=do2hzoprjd@r*ZrC3T*50Ij-iML)w@E2=kD{-gGLEbF!Fj1HCJb{-6OZ<*@^;A}zwpoeI zMTeQFme9i;QUlWWXWLuTgJGnEL4% zdyMZ5EEf*CSU6g0MDVil54qOV^=Q93ok2pf{)UwjlZhbMlF9M&l*L=0G;v+yI0R=4)h`L6<~f&BL*voN&a7-Jek3|Pm)d*@ z#;e<>SUZkoamN=|w{?{y+wSo8Q&pOZfi-P-$Jw9%Y-2(@F@%Pa>lj^tuLRfexw+w1 z9;OkpWm=eW=fans;zd+y@!-sCM7e8nLgKBTc}&n3say=K!(skDx5O-p;q;+2`7r8G z{Sgi-8)Kc!!9-#CN%iU$3PM5zG+_j;Nu+I^ZJ|ACi3OsjdgRj9*hjztk!sW6Tp^0*AyAXB$`Qzx3`yMDt-xC?aJx2Ds*^8NEyAm7=Sk)qAFqb&so$7zy=%fX*NZ zL)W`hY*EsK+F%G|!V)HE>FO9X4q|SeXKcmN`f$&P2&EJ;9CWf}`TT`GFaO(ABC#!Y z{>NGLneEmiY_MS~Ob`~fBALDl_s;p{ae8R3hNmv8s8hsY&P1~%S33;X%ub@5fFPIa zC}sv?1O|m0k$e}ayM5ydIFyfol-N-R8pkF3Z{5z-E~!l~o(IyEnwybQLujKFO_IRV zY)FF~%<$I6Y<$N<_;01!7N!+-$-1g~#@9R`-Il|@)}MNxX&v#DkgU>{-XzQxsX)^k zsoyn5R@t3EhVM0u!wgJ6ic(%k2#S9wiTQPpeWs=k*6hRzuPYmV@)TYy42@YBL&Kql@K)zY*A4Ws!^KRm~yMC5XDcmYX;vl{VFT{hT*2jU( z$0Oo+ln;`YOx#tC815XBdFq6Q)Sz`Bv~BitW(qjk!(nI;?}{!OaEW)YPmpuYd+*-N z4PVn?b7Q3w`uh^@HoRX!2$tqM^3VG}O|~1#u1*-XVU2sHFAY8NJGwH_Ar)8EtbPn4 j+hwm$fNxd$Um9{*m9uDk^#|7#T|$wwn=9?|`GEfepg`Cs diff --git a/templates/assets/js/bs-init.js b/templates/assets/js/bs-init.js deleted file mode 100644 index 3c1498d..0000000 --- a/templates/assets/js/bs-init.js +++ /dev/null @@ -1,7 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - - var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bss-tooltip]')); - var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { - return new bootstrap.Tooltip(tooltipTriggerEl); - }) -}, false); \ No newline at end of file diff --git a/templates/assets/style.css b/templates/assets/style.css deleted file mode 100644 index 59ed4d3..0000000 --- a/templates/assets/style.css +++ /dev/null @@ -1,133 +0,0 @@ -:root { - --bg-body: #0f172a; - --bg-card: #1e293b; - --bg-card-hover: #334155; - --text-main: #f1f5f9; - --text-muted: #94a3b8; - --border: #334155; - --accent: #3b82f6; - --success: #22c55e; - --error: #ef4444; - --warning: #f59e0b; - --shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); -} - -* { box-sizing: border-box; margin: 0; padding: 0; } - -body { - font-family: system-ui, -apple-system, sans-serif; - background-color: var(--bg-body); - color: var(--text-main); - line-height: 1.5; - padding: 2rem; -} - -.container { - max-width: 1200px; - margin: 0 auto; -} - -header { - margin-bottom: 2rem; - display: flex; - justify-content: space-between; - align-items: center; - border-bottom: 1px solid var(--border); - padding-bottom: 1rem; -} - -h1 { font-size: 1.5rem; font-weight: 700; } -h2 { font-size: 1.25rem; margin-bottom: 1rem; color: var(--text-main); } - -.meta { color: var(--text-muted); font-size: 0.875rem; } - -/* Alerts */ -.alerts-section { margin-bottom: 2rem; } -.alert-box { - padding: 1rem; - border-radius: 0.5rem; - margin-bottom: 0.5rem; - font-weight: 500; -} -.alert-box.error { background-color: rgba(239, 68, 68, 0.1); border: 1px solid var(--error); color: #fca5a5; } -.alert-box.warning { background-color: rgba(245, 158, 11, 0.1); border: 1px solid var(--warning); color: #fcd34d; } - -/* Grid */ -.node-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - gap: 1.5rem; - margin-bottom: 3rem; -} - -.card { - background-color: var(--bg-card); - border: 1px solid var(--border); - border-radius: 0.75rem; - padding: 1.5rem; - box-shadow: var(--shadow); - transition: transform 0.2s, border-color 0.2s; -} - -.card:hover { - transform: translateY(-2px); - border-color: var(--text-muted); -} - -.card-header { - display: flex; - justify-content: space-between; - align-items: flex-start; - margin-bottom: 1rem; - padding-bottom: 0.75rem; - border-bottom: 1px solid var(--border); -} - -.node-name { font-weight: 600; font-size: 1.125rem; } -.node-location { font-size: 0.875rem; color: var(--text-muted); } -.node-ip { font-family: monospace; font-size: 0.75rem; color: var(--text-muted); background: rgba(0,0,0,0.2); padding: 2px 6px; border-radius: 4px; } - -.status-list { display: flex; flex-direction: column; gap: 0.75rem; } -.status-item { display: flex; justify-content: space-between; align-items: center; font-size: 0.875rem; } - -.badge { - padding: 0.25rem 0.75rem; - border-radius: 9999px; - font-size: 0.75rem; - font-weight: 600; - text-transform: uppercase; -} -.badge.up { background-color: rgba(34, 197, 94, 0.15); color: var(--success); } -.badge.down { background-color: rgba(239, 68, 68, 0.15); color: var(--error); } - -.cert-info { font-size: 0.75rem; color: var(--text-muted); margin-top: 0.25rem; text-align: right; } - -/* History Table */ -.table-container { - background-color: var(--bg-card); - border-radius: 0.75rem; - border: 1px solid var(--border); - overflow-x: auto; -} - -table { width: 100%; border-collapse: collapse; font-size: 0.875rem; } -th, td { padding: 1rem; text-align: left; border-bottom: 1px solid var(--border); } -th { background-color: rgba(0,0,0,0.2); font-weight: 600; color: var(--text-muted); } -tr:last-child td { border-bottom: none; } -tr:hover td { background-color: var(--bg-card-hover); } - -.uptime-bar { - height: 6px; - background-color: var(--bg-body); - border-radius: 3px; - overflow: hidden; - width: 100px; - margin-top: 4px; -} -.uptime-fill { height: 100%; background-color: var(--success); } -.uptime-fill.warn { background-color: var(--warning); } -.uptime-fill.bad { background-color: var(--error); } - -.footer { margin-top: 4rem; text-align: center; color: var(--text-muted); font-size: 0.875rem; } -a { color: var(--accent); text-decoration: none; } -a:hover { text-decoration: underline; } diff --git a/templates/index.html b/templates/index.html deleted file mode 100644 index 6efab65..0000000 --- a/templates/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - HNSDoH Status - - - - - -

-
-
-

HNSDoH Status

-
Handshake DNS over HTTPS/TLS
-
-
- Last checked: {{ last_check }} -
-
- - {% if alerts or warnings %} -
- {% for alert in alerts %} -
{{ alert }}
- {% endfor %} - {% for warning in warnings %} -
{{ warning }}
- {% endfor %} -
- {% endif %} - -

Node Status

-
- {% for node in nodes %} -
-
-
-
{{ node.name }}
-
{{ node.location }}
-
-
{{ node.ip }}
-
- -
-
- Plain DNS - - {{ 'UP' if node.plain_dns else 'DOWN' }} - -
- -
- DoH (443) - - {{ 'UP' if node.doh else 'DOWN' }} - -
- -
- DoT (853) - - {{ 'UP' if node.dot else 'DOWN' }} - -
- -
- Certificate -
- - {{ 'VALID' if node.cert.valid else 'INVALID' }} - - {% if node.cert.valid %} -
Exp: {{ node.cert.expires }}
- {% endif %} -
-
-
-
- {% endfor %} -
- -

30-Day History

-
- - - - - - - - - - - {% for node in history.nodes %} - - - {% for type in ['plain_dns', 'doh', 'dot'] %} - - {% endfor %} - - {% endfor %} - -
NodePlain DNSDoHDoT
-
{{ node.name }}
-
{{ node.location }}
-
-
{{ node[type].percentage }}%
-
-
-
- {% if node[type].last_down != 'never' %} -
Last outage: {{ node[type].last_down }}
- {% endif %} -
-
- - -
- - - \ No newline at end of file diff --git a/templates/index_fast.html b/templates/index_fast.html deleted file mode 100644 index 563bb95..0000000 --- a/templates/index_fast.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - HNSDoH Status - - - - - - - -
-

HNSDoH Status

-

Monitoring the status of HNSDoH resolvers

-
- -
-

Current Status

-
Loading...
-
-
- -
-
-
-

Loading full status data...

-

This may take a few moments as we check all resolver nodes.

-
-
- - - - - - diff --git a/templates/manifest.json b/templates/manifest.json deleted file mode 100644 index dfe2b6e..0000000 --- a/templates/manifest.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "HNSDoH Status", - "short_name": "HNSDoH Status", - "start_url": "https://{{host}}/", - "display": "standalone", - "background_color": "#212529", - "theme_color": "#212529", - "orientation": "portrait-primary", - "icons": [ - { - "src": "/favicon.png", - "sizes": "500x500" - } - ] - } \ No newline at end of file diff --git a/uv.lock b/uv.lock index 7ac64a4..b557139 100644 --- a/uv.lock +++ b/uv.lock @@ -69,6 +69,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" }, ] +[[package]] +name = "cfgv" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.4" @@ -131,6 +140,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "distlib" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, +] + [[package]] name = "dnslib" version = "0.9.26" @@ -149,6 +167,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, ] +[[package]] +name = "filelock" +version = "3.25.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/b8/00651a0f559862f3bb7d6f7477b192afe3f583cc5e26403b44e59a55ab34/filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694", size = 40480, upload-time = "2026-03-11T20:45:38.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70", size = 26759, upload-time = "2026-03-11T20:45:37.437Z" }, +] + [[package]] name = "flask" version = "3.1.2" @@ -211,6 +238,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "pre-commit" }, { name = "ruff" }, ] @@ -230,7 +258,19 @@ requires-dist = [ ] [package.metadata.requires-dev] -dev = [{ name = "ruff", specifier = ">=0.14.5" }] +dev = [ + { name = "pre-commit", specifier = ">=4.5.1" }, + { name = "ruff", specifier = ">=0.14.5" }, +] + +[[package]] +name = "identify" +version = "2.6.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/46/c4/7fb4db12296cdb11893d61c92048fe617ee853f8523b9b296ac03b43757e/identify-2.6.18.tar.gz", hash = "sha256:873ac56a5e3fd63e7438a7ecbc4d91aca692eb3fefa4534db2b7913f3fc352fd", size = 99580, upload-time = "2026-03-15T18:39:50.319Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl", hash = "sha256:8db9d3c8ea9079db92cafb0ebf97abdc09d52e97f4dcf773a2e694048b7cd737", size = 99394, upload-time = "2026-03-15T18:39:48.915Z" }, +] [[package]] name = "idna" @@ -314,6 +354,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] +[[package]] +name = "nodeenv" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -323,6 +372,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] +[[package]] +name = "platformdirs" +version = "4.9.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/56/8d4c30c8a1d07013911a8fdbd8f89440ef9f08d07a1b50ab8ca8be5a20f9/platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934", size = 28737, upload-time = "2026-03-05T18:34:13.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -335,6 +409,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] +[[package]] +name = "python-discovery" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/88/815e53084c5079a59df912825a279f41dd2e0df82281770eadc732f5352c/python_discovery-1.2.1.tar.gz", hash = "sha256:180c4d114bff1c32462537eac5d6a332b768242b76b69c0259c7d14b1b680c9e", size = 58457, upload-time = "2026-03-26T22:30:44.496Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/0f/019d3949a40280f6193b62bc010177d4ce702d0fce424322286488569cd3/python_discovery-1.2.1-py3-none-any.whl", hash = "sha256:b6a957b24c1cd79252484d3566d1b49527581d46e789aaf43181005e56201502", size = 31674, upload-time = "2026-03-26T22:30:43.396Z" }, +] + [[package]] name = "python-dotenv" version = "1.2.1" @@ -344,6 +431,42 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, ] +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + [[package]] name = "requests" version = "2.32.5" @@ -433,6 +556,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] +[[package]] +name = "virtualenv" +version = "21.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, + { name = "python-discovery" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/92/58199fe10049f9703c2666e809c4f686c54ef0a68b0f6afccf518c0b1eb9/virtualenv-21.2.0.tar.gz", hash = "sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098", size = 5840618, upload-time = "2026-03-09T17:24:38.013Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl", hash = "sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f", size = 5825084, upload-time = "2026-03-09T17:24:35.378Z" }, +] + [[package]] name = "werkzeug" version = "3.1.3"